tsgrid-ui 2.7.0 → 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.
- package/CHANGELOG.md +229 -0
- package/dist/base.d.ts +148 -0
- package/dist/base.es6.js +11 -0
- package/dist/base.es6.js.map +1 -0
- package/dist/chunks/chunk-26XP2XU3.js +1795 -0
- package/dist/chunks/chunk-26XP2XU3.js.map +1 -0
- package/dist/chunks/chunk-3NYH6545.js +2423 -0
- package/dist/chunks/chunk-3NYH6545.js.map +1 -0
- package/dist/chunks/chunk-BIB3X2TW.js +1638 -0
- package/dist/chunks/chunk-BIB3X2TW.js.map +1 -0
- package/dist/chunks/chunk-DXZJHS4M.js +1283 -0
- package/dist/chunks/chunk-DXZJHS4M.js.map +1 -0
- package/dist/chunks/chunk-EVZMMVXO.js +1212 -0
- package/dist/chunks/chunk-EVZMMVXO.js.map +1 -0
- package/dist/chunks/chunk-GJD5NFWQ.js +2305 -0
- package/dist/chunks/chunk-GJD5NFWQ.js.map +1 -0
- package/dist/chunks/chunk-IYF3Q7GX.js +127 -0
- package/dist/chunks/chunk-IYF3Q7GX.js.map +1 -0
- package/dist/chunks/chunk-OFASTA2A.js +2980 -0
- package/dist/chunks/chunk-OFASTA2A.js.map +1 -0
- package/dist/chunks/chunk-OMLGN735.js +677 -0
- package/dist/chunks/chunk-OMLGN735.js.map +1 -0
- package/dist/chunks/chunk-WKSLGUB3.js +1127 -0
- package/dist/chunks/chunk-WKSLGUB3.js.map +1 -0
- package/dist/chunks/chunk-YBY52G2U.js +849 -0
- package/dist/chunks/chunk-YBY52G2U.js.map +1 -0
- package/dist/field.d.ts +329 -0
- package/dist/field.es6.js +11 -0
- package/dist/field.es6.js.map +1 -0
- package/dist/form.d.ts +162 -0
- package/dist/form.es6.js +14 -0
- package/dist/form.es6.js.map +1 -0
- package/dist/layout.d.ts +108 -0
- package/dist/layout.es6.js +13 -0
- package/dist/layout.es6.js.map +1 -0
- package/dist/locale.d.ts +30 -0
- package/dist/locale.es6.js +7 -0
- package/dist/locale.es6.js.map +1 -0
- package/dist/metafile-esm.json +1 -0
- package/dist/popup.d.ts +92 -0
- package/dist/popup.es6.js +18 -0
- package/dist/popup.es6.js.map +1 -0
- package/dist/query-CKGg5Ugv.d.ts +81 -0
- package/dist/sidebar.d.ts +138 -0
- package/dist/sidebar.es6.js +11 -0
- package/dist/sidebar.es6.js.map +1 -0
- package/dist/tabs.d.ts +63 -0
- package/dist/tabs.es6.js +11 -0
- package/dist/tabs.es6.js.map +1 -0
- package/dist/toolbar.d.ts +97 -0
- package/dist/toolbar.es6.js +11 -0
- package/dist/toolbar.es6.js.map +1 -0
- package/dist/tooltip.d.ts +322 -0
- package/dist/tooltip.es6.js +18 -0
- package/dist/tooltip.es6.js.map +1 -0
- package/dist/tsgrid-ui.css +2 -2
- package/dist/tsgrid-ui.d.ts +16 -2004
- package/dist/tsgrid-ui.es6.js +7750 -23831
- package/dist/tsgrid-ui.es6.js.map +1 -1
- package/dist/tsgrid-ui.es6.min.js +28 -28
- package/dist/tsgrid-ui.js +103 -25
- package/dist/tsgrid-ui.min.css +2 -2
- package/dist/tsgrid-ui.min.js +24 -24
- package/dist/tsutils-message-CogFtVtO.d.ts +82 -0
- package/dist/utils.d.ts +418 -0
- package/dist/utils.es6.js +14 -0
- package/dist/utils.es6.js.map +1 -0
- package/package.json +26 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/tsform.ts"],"sourcesContent":["/**\n * Part of TsUi 2.0 library\n * - Dependencies: mQuery, TsUtils, TsBase, TsTabs, TsToolbar, TsTooltip, TsField\n *\n * T4.2: Ported to TypeScript with aggressive typing per typing_policy.\n * No @ts-nocheck. Targeted `any` sites documented with // any: comments.\n * Bug fix: line 1317 (original) `?? response.statusText` was unreachable\n * because string concat always produces non-null; fixed to `|| response.statusText`.\n *\n * == TODO ==\n * - include delta on save\n * - tabs below some fields (could already be implemented)\n * - form with toolbar & tabs\n * - promise for load, save, etc.\n *\n * == 2.0 changes\n * - CSP - fixed inline events\n * - removed jQuery dependency\n * - better groups support tabs now\n * - form.confirm - refactored\n * - form.message - refactored\n * - observeResize for the box\n * - removed msgNotJSON, msgAJAXerror\n * - applyFocus -> setFocus\n * - getFieldValue(fieldName) = returns { curent, previous, original }\n * - setFieldVallue(fieldName, value)\n * - getValue(..., original) -- return original if any\n * - added .hideErrors()\n * - reuqest, save, submit - return promises\n * - this.recid = null if no record needs to be pulled\n * - remove form.multiplart\n * - this.method - for saving only\n * - added field.html.class\n * - setValue(..., noRefresh)\n * - rememberOriginal()\n * - saveCleanRecord\n * - added options.itemMap = { id: 'id', text: 'text' } - to map id, text fields if needed\n * - hideGroup/showGroup - new methods\n * - getAction/actionHide/actionShow/actionDisable/actionEnable - new methods\n */\n\nimport { TsBase, TsEventPayload } from './tsbase.js'\nimport { TsUi, TsUtils } from './tsutils.js'\nimport { query as _queryRaw, Query } from './query.js'\nimport { TsTabs } from './tstabs.js'\nimport { TsToolbar } from './tstoolbar.js'\nimport { TsTooltip as _w2tooltip } from './tstooltip.js'\nimport { TsField } from './tsfield.js'\n\n// any: TsTooltip has complex show/hide overloads; cast once for clean call sites\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst TsTooltip = _w2tooltip as any\n// query() always returns Query at runtime; cast to remove void from union\nconst query = _queryRaw as (selector: unknown, context?: unknown) => Query\n\nclass TsForm extends TsBase {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any // any: dynamic properties added via TsUtils.extend and field access\n\n declare name: string\n header: string\n declare box: HTMLElement | null\n url: string | { get?: string; save?: string }\n method: string | null\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n routeData: Record<string, any> // any: route params are user-supplied\n formURL: string\n formHTML: string\n page: number\n pageStyle: string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n recid: any // any: recid can be string, number, or null\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fields: any[] // any: field definitions vary by type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n actions: Record<string, any> // any: action can be function or object\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n record: Record<string, any> // any: record values depend on field definitions\n // any: Record<string, any> — dynamic property bag; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n original: Record<string, any> | null\n dataType: string | null\n saveCleanRecord: boolean\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n postData: Record<string, any> // any: user-defined post data\n httpHeaders: Record<string, string>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n toolbar: any // any: TsToolbar instance or config object\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n tabs: any // any: TsTabs instance or config object\n style: string\n focus: number | string\n autosize: boolean\n nestedFields: boolean\n tabindexBase: number\n isGenerated: boolean\n last: {\n fetchCtrl: AbortController | null\n fetchOptions: RequestInit | null\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n errors: any[] // any: error objects vary by validation type\n errorsShown?: boolean\n observeResize?: ResizeObserver\n }\n onRequest: ((event: TsEventPayload) => void) | null\n onLoad: ((event: TsEventPayload) => void) | null\n onValidate: ((event: TsEventPayload) => void) | null\n onSubmit: ((event: TsEventPayload) => void) | null\n onProgress: ((event: TsEventPayload) => void) | null\n onSave: ((event: TsEventPayload) => void) | null\n onChange: ((event: TsEventPayload) => void) | null\n onInput: ((event: TsEventPayload) => void) | null\n onRender: ((event: TsEventPayload) => void) | null\n onRefresh: ((event: TsEventPayload) => void) | null\n onResize: ((event: TsEventPayload) => void) | null\n onDestroy: ((event: TsEventPayload) => void) | null\n onAction: ((event: TsEventPayload) => void) | null\n onToolbar: ((event: TsEventPayload) => void) | null\n onError: ((event: TsEventPayload) => void) | null\n msgRefresh: string\n msgSaving: string\n msgServerError: string\n ALL_TYPES: string[]\n LIST_TYPES: string[]\n TsFIELD_TYPES: string[]\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n constructor(options: Record<string, any>) { // any: options bag is user-supplied\n super(options['name'])\n this.name = ''\n this.header = ''\n this.box = null // HTML element that hold this element\n this.url = ''\n this.method = null // if defined, it will be http method when saving\n this.routeData = {} // data for dynamic routes\n this.formURL = '' // url where to get form HTML\n this.formHTML = '' // form HTML (might be loaded from the url)\n this.page = 0 // current page\n this.pageStyle = ''\n this.recid = null // if not null, then load record\n this.fields = []\n this.actions = {}\n this.record = {}\n this.original = null\n this.dataType = null // only used when not null, otherwise from TsUtils.settings.dataType\n this.saveCleanRecord = true // if true, it will submit clean record when saving\n this.postData = {}\n this.httpHeaders = {}\n this['toolbar'] = {} // if not empty, then it is toolbar\n this['tabs'] = {} // if not empty, then it is tabs object\n this.style = ''\n this.focus = 0 // focus first or other element\n this.autosize = true // autosize, if false the container must have a height set\n this.nestedFields = true // use field name containing dots as separator to look into object\n this.tabindexBase = 0 // this will be added to the auto numbering\n this.isGenerated = false\n this.last = {\n fetchCtrl: null, // last fetch AbortController\n fetchOptions: null, // last fetch options\n errors: []\n }\n this.onRequest = null\n this.onLoad = null\n this.onValidate = null\n this.onSubmit = null\n this.onProgress = null\n this.onSave = null\n this.onChange = null\n this.onInput = null\n this.onRender = null\n this.onRefresh = null\n this.onResize = null\n this.onDestroy = null\n this.onAction = null\n this.onToolbar = null\n this.onError = null\n this.msgRefresh = 'Loading...'\n this.msgSaving = 'Saving...'\n this.msgServerError = 'Server error'\n this.ALL_TYPES = [ 'text', 'textarea', 'email', 'pass', 'password', 'int', 'float', 'money', 'currency',\n 'percent', 'hex', 'alphanumeric', 'color', 'date', 'time', 'datetime', 'toggle', 'checkbox', 'radio',\n 'check', 'checks', 'list', 'combo', 'enum', 'file', 'select', 'switch', 'map', 'array', 'div', 'custom', 'html',\n 'empty', 'columns']\n this.LIST_TYPES = ['select', 'radio', 'check', 'checks', 'list', 'combo', 'enum', 'switch']\n this.TsFIELD_TYPES = ['int', 'float', 'money', 'currency', 'percent', 'hex', 'alphanumeric', 'color',\n 'date', 'time', 'datetime', 'list', 'combo', 'enum', 'file']\n // mix in options\n TsUtils.extend(this, options)\n\n // remember items\n const record = options['record']\n const original = options['original']\n const fields = options['fields']\n const toolbar = options['toolbar']\n let tabs = options['tabs']\n // extend items\n Object.assign(this, { record: {}, original: null, fields: [], tabs: {}, toolbar: {}, handlers: [] })\n // preprocess fields\n if (fields) {\n const sub = _processFields(fields)\n this.fields = sub.fields\n if (!tabs && sub.tabs.length > 0) {\n tabs = sub.tabs\n }\n }\n // prepare tabs\n if (Array.isArray(tabs)) {\n TsUtils.extend(this.tabs, { tabs: [] })\n for (let t = 0; t < tabs.length; t++) {\n const tmp = tabs[t]\n if (typeof tmp === 'object') {\n this.tabs.tabs.push(tmp)\n if (tmp.active === true) {\n this.tabs.active = tmp.id\n }\n } else {\n this.tabs.tabs.push({ id: tmp, text: tmp })\n }\n }\n } else {\n TsUtils.extend(this.tabs, tabs)\n }\n TsUtils.extend(this.toolbar, toolbar)\n for (const p in record) { // it is an object\n if (TsUtils.isPlainObject(record[p])) {\n this.record[p] = TsUtils.clone(record[p])\n } else {\n this.record[p] = record[p]\n }\n }\n for (const p in original) { // it is an object\n if (this.original == null) this.original = {}\n if (TsUtils.isPlainObject(original[p])) {\n this.original[p] = TsUtils.clone(original[p])\n } else {\n this.original[p] = original[p]\n }\n }\n // generate html if necessary\n if (this.formURL !== '') {\n fetch(this.formURL)\n .then(resp => resp.text())\n .then(text => {\n this.formHTML = text\n this.isGenerated = true\n if (this.box) this.render(this.box)\n })\n } else if (!this.formURL && !this.formHTML) {\n this.formHTML = this.generateHTML() as string\n this.isGenerated = true\n } else if (this.formHTML) {\n this.isGenerated = true\n }\n\n // render if box specified\n if (typeof this.box == 'string') this.box = query(this.box).get(0) as HTMLElement\n if (this.box) this.render(this.box)\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function _processFields(fields: any): { fields: any[]; tabs: any[] } { // any: field definitions vary widely\n // any: array of heterogeneous runtime values; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const newFields: any[] = []\n // any: array of heterogeneous runtime values; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tabs: any[] = []\n // if it is an object\n if (TsUtils.isPlainObject(fields)) {\n const tmp = fields\n fields = []\n Object.keys(tmp).forEach((key) => {\n const fld = tmp[key]\n if (fld.type == 'group') {\n fld.text = key\n if (TsUtils.isPlainObject(fld.fields)) {\n const tmp2 = fld.fields\n fld.fields = []\n Object.keys(tmp2).forEach((key2) => {\n const fld2 = tmp2[key2]\n fld2.field = key2\n fld.fields.push(_process(fld2))\n\n })\n }\n fields.push(fld)\n } else if (fld.type == 'tab') {\n // add tab\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tab: any = { id: key, text: key } // any: tab shape is dynamic\n if (fld.style) {\n tab.style = fld.style\n }\n tabs.push(tab)\n // add page to fields\n const sub = _processFields(fld.fields).fields\n // any: callback parameter — caller signature varies; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n sub.forEach((fld2: any) => {\n fld2.html = fld2.html || {}\n fld2.html.page = tabs.length -1\n _process2(fld, fld2)\n })\n fields.push(...sub)\n } else {\n fld.field = key\n fields.push(_process(fld))\n }\n })\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function _process(fld: any): any { // any: field shapes vary\n const ignore = ['html']\n if (fld.html == null) fld.html = {}\n Object.keys(fld).forEach((key => {\n if (ignore.includes(key)) return\n if (['label', 'attr', 'style', 'text', 'span', 'page', 'column', 'anchor',\n 'group', 'groupStyle', 'groupTitleStyle', 'groupCollapsible'].includes(key)) {\n fld.html[key] = fld[key]\n delete fld[key]\n }\n }))\n return fld\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function _process2(fld: any, fld2: any): void { // any: field shapes vary\n const ignore = ['style', 'html']\n Object.keys(fld).forEach((key => {\n if (ignore.includes(key)) return\n if (['span', 'column', 'attr', 'text', 'label'].includes(key)) {\n if (fld[key] && !fld2.html[key]) {\n fld2.html[key] = fld[key]\n }\n }\n }))\n }\n }\n // process groups\n // any: callback parameter — caller signature varies; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fields.forEach((field: any) => {\n if (field.type == 'group') {\n // group properties\n const group = {\n group: field.text || '',\n groupStyle: field.style || '',\n groupTitleStyle: field.titleStyle || '',\n groupCollapsible: field.collapsible === true ? true : false,\n }\n // loop through fields\n if (Array.isArray(field.fields)) {\n // any: callback parameter — caller signature varies; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n field.fields.forEach((gfield: any) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const fld = TsUtils.clone(gfield) as any // any: clone returns unknown; field defs are dynamic\n if (fld.html == null) fld.html = {}\n TsUtils.extend(fld.html, group)\n ;['span', 'column', 'attr', 'label', 'page'].forEach((key: string) => {\n if (fld.html[key] == null && field[key] != null) {\n fld.html[key] = field[key]\n }\n })\n if (fld.field == null && fld.name != null) {\n console.log('NOTICE: form field.name property is deprecated, please use field.field. Field ->', field)\n fld.field = fld.name\n }\n newFields.push(fld)\n })\n }\n } else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const fld = TsUtils.clone(field) as any // any: clone returns unknown; field defs are dynamic\n if (fld.field == null && fld.name != null) {\n console.log('NOTICE: form field.name property is deprecated, please use field.field. Field ->', field)\n fld.field = fld.name\n }\n newFields.push(fld)\n }\n })\n return { fields: newFields, tabs }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n get(field?: string, returnIndex?: boolean): any { // any: returns field object or index or array of names\n if (arguments.length === 0) {\n const all: string[] = []\n for (let f1 = 0; f1 < this.fields.length; f1++) {\n if (this.fields[f1].field != null) all.push(this.fields[f1].field)\n }\n return all\n } else {\n for (let f2 = 0; f2 < this.fields.length; f2++) {\n if (this.fields[f2].field == field) {\n if (returnIndex === true) return f2; else return this.fields[f2]\n }\n }\n return null\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n set(field: string, obj: Record<string, any>): boolean { // any: obj extends field definition\n for (let f = 0; f < this.fields.length; f++) {\n if (this.fields[f].field == field) {\n TsUtils.extend(this.fields[f] , obj)\n delete this.fields[f].TsField // otherwise options are not updates\n this.refresh(field)\n return true\n }\n }\n return false\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getValue(field: string, original?: boolean): any { // any: record values vary by field type\n if (this.nestedFields) {\n let val = undefined\n try { // need this to make sure no error in fields\n const rec = original === true ? this.original : this.record\n // any: parameter typed any — runtime dispatch by call site; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n val = String(field).split('.').reduce((rec: any, i: string) => { return rec[i] }, rec)\n } catch (_event) {\n }\n return val\n } else {\n return this.record[field]\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n setValue(field: string, value: any, noRefresh?: boolean): boolean { // any: value varies by field type\n // will not refresh the form!\n if (value === '' || value == null\n || (Array.isArray(value) && value.length === 0)\n || (TsUtils.isPlainObject(value) && Object.keys(value).length == 0)) {\n value = null\n }\n if (this.nestedFields) {\n try { // need this to make sure no error in fields\n let rec = this.record\n String(field).split('.').map((fld: string, i: number, arr: string[]) => {\n if (arr.length - 1 !== i) {\n if (rec[fld]) rec = rec[fld]; else { rec[fld] = {}; rec = rec[fld] }\n } else {\n rec[fld] = value\n }\n })\n if (!noRefresh) this.setFieldValue(field, value)\n return true\n } catch (_event) {\n return false\n }\n } else {\n this.record[field] = value\n if (!noRefresh) this.setFieldValue(field, value)\n return true\n }\n }\n\n rememberOriginal(): void {\n // remember original\n if (this.original == null) {\n if (Object.keys(this.record).length > 0) {\n this.original = TsUtils.clone(this.record)\n } else {\n this.original = {}\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getFieldValue(name: string): { current: any; previous: any; original: any } | undefined { // any: values vary by field type\n const field = this.get(name)\n if (field == null) return undefined\n const el = field.el\n let previous = this.getValue(name)\n const original = this.getValue(name, true)\n // ordinary input control\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let current: any = el.value // any: current value type depends on field type\n // should not be set to '', incosistent logic\n // if (previous == null) previous = ''\n\n // clean extra chars\n if (['int', 'float', 'percent', 'money', 'currency'].includes(field.type)) {\n current = field.TsField.clean(current)\n }\n // radio list\n if (['radio'].includes(field.type)) {\n const selected = query(el).closest('.tsg-field-group').find('input:checked').get(0)\n if (selected) {\n const item = field.options.items[query(selected).data('index') as number]\n current = item.id\n } else {\n current = null\n }\n }\n // single checkbox\n if (['toggle', 'checkbox'].includes(field.type)) {\n current = (el as HTMLInputElement).checked\n }\n // check list\n if (['check', 'checks'].includes(field.type)) {\n current = []\n const selected = query(el).closest('.tsg-field-group').find('input:checked')\n if (selected.length > 0) {\n selected.each((node: Node) => {\n const el = node as HTMLElement\n const item = field.options.items[query(el).data('index') as number]\n current.push(item.id)\n })\n }\n if (!Array.isArray(previous)) previous = []\n }\n // lists\n const selected = field.TsField?.selected // drop downs and other TsField objects\n if (['list', 'enum', 'file'].includes(field.type) && selected) {\n const nv = selected\n const cv = previous\n if (Array.isArray(nv)) {\n current = []\n for (let i = 0; i < nv.length; i++) current[i] = TsUtils.clone(nv[i]) // clone array\n }\n if (Array.isArray(cv)) {\n previous = []\n for (let i = 0; i < cv.length; i++) previous[i] = TsUtils.clone(cv[i]) // clone array\n }\n if (TsUtils.isPlainObject(nv)) {\n current = TsUtils.clone(nv) // clone object\n }\n if (TsUtils.isPlainObject(cv)) {\n previous = TsUtils.clone(cv) // clone object\n }\n }\n // map, array\n if (['map', 'array'].includes(field.type)) {\n current = (field.type == 'map' ? {} : [])\n field.$el.parent().find('.tsg-map-field').each((div: HTMLElement, _ind: number) => {\n const key = query(div).find('.tsg-map.key').val() as string\n const value = query(div).find('.tsg-map.value').val()\n if (typeof field.html?.render == 'function') {\n current[_ind] ??= {}\n query(div).find('input, textarea').each((node: Node) => {\n const inp = node as HTMLInputElement\n const name = inp.dataset['name'] ?? inp['name']\n if (name != null && name != '') {\n current[_ind][name] = ['checkbox', 'radio'].includes(inp.type) ? inp.checked : inp.value\n }\n })\n } else if (field.type == 'map') {\n current[key] = value\n } else {\n current.push(value)\n }\n })\n }\n return { current, previous, original } // current - in input, previous - in form.record, original - before form change\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n findItem(item: any, items: any[]): any { // any: item and items shapes vary by field type\n return items.find(it => (it.id === item || it.id === item?.id))\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n setFieldValue(name: string, value: any): void { // any: value varies by field type\n const field = this.get(name)\n if (field == null) return\n const el = field.el\n switch (field.type) {\n case 'toggle':\n case 'checkbox': {\n (el as HTMLInputElement).checked = value ? true : false\n break\n }\n case 'radio': {\n value = value?.id ?? value\n const inputs = query(el).closest('.tsg-field-group').find('input')\n const items = field.options.items\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n items.forEach((it: any, ind: number) => { // any: item shapes vary by field\n const input = inputs.filter(`[data-index=\"${ind}\"]`)\n if (it.id === value) { // need exact match so to match empty string and 0\n input.prop('checked', true)\n } else {\n input.prop('checked', false)\n }\n // show or hide the whole line\n if (it.hidden === true) {\n input.closest('.tsg-field-item').hide()\n } else {\n input.closest('.tsg-field-item').show()\n }\n })\n break\n }\n case 'check':\n case 'checks': {\n if (!Array.isArray(value)) {\n if (value != null) {\n value = [value]\n } else {\n value = []\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value = value.map((val: any) => val?.id ?? val) // any: val can be object or primitive\n const inputs = query(el).closest('div.tsg-field-group').find('input')\n const items = field.options.items\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n items.forEach((it: any, ind: number) => { // any: item shapes vary\n const input = inputs.filter(`[data-index=\"${ind}\"]`)\n input.prop('checked', value.includes(it.id) ? true : false)\n // show or hide the whole line\n if (it.hidden === true) {\n input.closest('.tsg-field-item').hide()\n } else {\n input.closest('.tsg-field-item').show()\n }\n })\n break\n }\n case 'list':\n case 'combo': {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let item: any = value // any: list item is { id, text, ... }\n const map = field.options?.itemMap\n /**\n * if it is a \"simple\" value, then find item in options.items\n */\n if (item?.id == null && Array.isArray(field.options?.items)) {\n // any: callback parameter — caller signature varies; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n field.options.items.forEach((it: any) => {\n const val = TsUtils.getNested(it, map?.id ?? 'id')\n if (val === value) item = it\n })\n }\n /**\n * If item.id is there, but item.text is not there, then look up item.text in options.items\n */\n if (item?.id != null && item?.text == null && Array.isArray(field.options?.items)) {\n // any: callback parameter — caller signature varies; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n field.options.items.forEach((it: any) => {\n const id = TsUtils.getNested(it, map?.id ?? 'id')\n if (id === item.id) {\n item.text = TsUtils.getNested(it, map.text ?? 'text')\n }\n })\n }\n // if item is found in field.options, update it in the this.records\n if (item != value) {\n this.setValue(field.name, item, true)\n }\n if (field.type == 'list') {\n field.TsField.selected = item\n field.TsField.refresh()\n } else {\n el.value = item?.text ?? value\n }\n break\n }\n case 'switch': {\n el.value = value\n field.toolbar.uncheck(...field.toolbar.get())\n field.toolbar.check(value)\n break\n }\n case 'enum':\n case 'file': {\n if (!Array.isArray(value)) {\n value = value != null ? [value] : []\n }\n const items = [...value]\n // find item in options.items, if any\n let updated = false\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n items.forEach((item: any, ind: number) => { // any: item can be primitive or object\n if (item?.id == null && Array.isArray(field.options.items)) {\n // any: callback parameter — caller signature varies; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n field.options.items.forEach((it: any) => {\n if (it.id == item) {\n items[ind] = it\n updated = true\n }\n })\n }\n })\n if (updated) {\n this.setValue(field.name, items, true)\n }\n field.TsField.selected = items\n field.TsField.refresh()\n break\n }\n case 'map':\n case 'array': {\n // init map\n if (field.type == 'map' && (value == null || !TsUtils.isPlainObject(value))) {\n this.setValue(field.field, {}, true)\n value = this.getValue(field.field)\n }\n if (field.type == 'array' && (value == null || !Array.isArray(value))) {\n this.setValue(field.field, [], true)\n value = this.getValue(field.field)\n }\n const container = query(field.el).parent().find('.tsg-map-container')\n field.el.mapRefresh(value, container)\n break\n }\n case 'div':\n case 'custom': {\n query(el).html(value)\n break\n }\n case 'color': {\n el.value = value ?? ''\n field.TsField.refresh()\n break\n }\n case 'html':\n case 'empty':\n break\n default:\n // all other fields, text, int, float\n if (value != null && el._w2field?.format) {\n const obj = el._w2field\n value = obj.format(obj.clean(value))\n }\n el.value = value ?? ''\n break\n }\n // now go through all fields and see if there is a dependent field\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.fields.forEach((fld: any) => { // any: field definition shape\n if (fld?.options?.parentList != null) {\n let updated: boolean | undefined\n let values = this.getValue(fld.options.parentList)\n if (Array.isArray(values)) {\n // any: callback parameter — caller signature varies; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n values = values.map((vv: any) => vv.id)\n } else {\n values = values?.id != null ? [values.id] : []\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fld.options?.items?.forEach?.((item: any) => { // any: item shape varies\n const parent = TsUtils.getNested(item, fld.options.parentField ?? 'parentId')\n if (parent == null) {\n return\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const possible = TsUtils.clone(Array.isArray(parent) ? parent : [parent]) as any[] // any: clone returns unknown; items are dynamic\n possible.unshift('')\n // any: callback parameter — caller signature varies; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const includes = values.some((item: any) => possible.includes(item))\n if (includes && item.hidden === true) {\n item.hidden = false\n updated = true\n } else if (!includes && item.hidden !== true) {\n item.hidden = true\n updated = true\n }\n })\n if (updated) {\n let value = this.getValue(fld.field)\n if (value?.id != null) value = value.id\n // if item is not visible, then clear its field\n if (fld.type == 'enum') {\n // any: callback parameter — caller signature varies; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const valid = fld.options.items.filter((it: any) => !it.hidden).map((it: any) => it.id)\n let values = this.getValue(fld.field)\n if (!Array.isArray(values)) values = [values]\n // make sure they are objects\n // any: callback parameter — caller signature varies; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n values = values.map((it: any) => {\n if (typeof it == 'string' || typeof it == 'number') {\n // any: callback parameter — caller signature varies; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n it = fld.options.items.find((ii: any) => ii.id == it)\n }\n return it\n })\n // any: callback parameter — caller signature varies; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const new_values = values.filter((it: any) => valid.includes(it.id))\n this.setValue(fld.field, new_values, true)\n } else {\n // any: callback parameter — caller signature varies; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fld.options.items.forEach((it: any) => {\n if (it.id == value && it.hidden) {\n this.setValue(fld.field, null, true)\n }\n })\n }\n // set new items\n this.set(fld.field, { items: fld.options.items })\n }\n }\n })\n }\n\n show(...args: string[]): string[] {\n const effected: string[] = []\n for (let a = 0; a < args.length; a++) {\n const fld = this.get(args[a])\n if (fld && fld.hidden) {\n fld.hidden = false\n effected.push(fld.field)\n }\n }\n if (effected.length > 0) this.refresh(...effected)\n this.updateEmptyGroups()\n return effected\n }\n\n hide(...args: string[]): string[] {\n const effected: string[] = []\n for (let a = 0; a < args.length; a++) {\n const fld = this.get(args[a])\n if (fld && !fld.hidden) {\n fld.hidden = true\n effected.push(fld.field)\n }\n }\n if (effected.length > 0) this.refresh(...effected)\n this.updateEmptyGroups()\n return effected\n }\n\n enable(...args: string[]): string[] {\n const effected: string[] = []\n for (let a = 0; a < args.length; a++) {\n const fld = this.get(args[a])\n if (fld && fld.disabled) {\n fld.disabled = false\n effected.push(fld.field)\n }\n }\n if (effected.length > 0) this.refresh(...effected)\n return effected\n }\n\n disable(...args: string[]): string[] {\n const effected: string[] = []\n for (let a = 0; a < args.length; a++) {\n const fld = this.get(args[a])\n if (fld && !fld.disabled) {\n fld.disabled = true\n effected.push(fld.field)\n }\n }\n if (effected.length > 0) this.refresh(...effected)\n return effected\n }\n\n updateEmptyGroups(): void {\n // hide empty groups\n query(this.box).find('.tsg-group').each((node: Node) =>{\n const group = node as HTMLElement\n if (isHidden(query(group).find('.tsg-field'))) {\n query(group).hide()\n } else {\n query(group).show()\n }\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function isHidden($els: any): boolean { // any: $els is a Query object\n let flag = true\n $els.each((node: Node) => {\n const el = node as HTMLElement\n if (el.style.display != 'none') flag = false\n })\n return flag\n }\n }\n\n hideGroup(groupName: string): void {\n const fields: string[] = []\n let current = ''\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.fields.forEach((fld: any) => { // any: field definition\n if (fld.html.group != null && fld.html.group !== '') {\n current = String(fld.html.group).toLowerCase()\n }\n if (groupName.toLowerCase() == current) {\n fields.push(fld.field)\n }\n })\n this.hide(...fields)\n this.resize()\n }\n\n showGroup(groupName: string): void {\n const fields: string[] = []\n let current = ''\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.fields.forEach((fld: any) => { // any: field definition\n if (fld.html.group != null && fld.html.group !== '') {\n current = String(fld.html.group).toLowerCase()\n }\n if (groupName.toLowerCase() == current) {\n fields.push(fld.field)\n }\n })\n this.show(...fields)\n this.resize()\n }\n\n /**\n * When user clicks on group title, it will toggle the group (collapse or expand it).\n */\n toggleGroup(groupName: string, show?: boolean): void {\n const el = query(this.box).find('.tsg-group-title[data-group=\"' + TsUtils.base64encode(groupName) + '\"]')\n if (el.length === 0) return\n const el_next = query(el.prop('nextElementSibling'))\n if (typeof show === 'undefined') {\n show = (el_next.css('display') == 'none')\n }\n if (show) {\n el_next.show()\n el.find('span').addClass('tsg-icon-collapse').removeClass('tsg-icon-expand')\n } else {\n el_next.hide()\n el.find('span').addClass('tsg-icon-expand').removeClass('tsg-icon-collapse')\n }\n }\n\n change(...args: string[]): void {\n args.forEach((field) => {\n const tmp = this.get(field)\n if (tmp.$el) tmp.$el.change()\n })\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n reload(callBack?: (() => void)): Promise<any> { // any: promise resolves with server data\n const url = (typeof this.url !== 'object' ? this.url : this.url.get)\n if (url && this.recid != null) {\n // this.clear();\n // any: generic any — runtime polymorphic; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this.request(callBack) as Promise<any> // request() is void | Promise; url+recid guarantee it returns Promise\n } else {\n // this.refresh(); // no need to refresh\n if (typeof callBack === 'function') callBack()\n return new Promise(resolve => { resolve(undefined) }) // resolved promise\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n clear(...args: any[]): void { // any: args are field names or nothing\n if (args.length != 0) {\n args.forEach((field) => {\n let rec = this.record\n String(field).split('.').map((fld: string, i: number, arr: string[]) => {\n if (arr.length - 1 !== i) rec = rec[fld]; else delete rec[fld]\n })\n this.refresh(field)\n })\n } else {\n this.recid = null\n this.record = {}\n this.original = null\n this.refresh()\n this.hideErrors()\n }\n }\n\n error(msg: string): void {\n // let the management of the error outside of the form\n const edata = this.trigger('error', {\n target: this.name,\n message: msg,\n fetchCtrl: this.last.fetchCtrl,\n fetchOptions: this.last.fetchOptions\n })\n if (edata.isCancelled === true) return\n // need a time out because message might be already up)\n setTimeout(() => { this.message(msg) }, 1)\n // event after\n edata.finish()\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n message(options: any): any { // any: options is a TsUtils.message config object\n return TsUtils.message({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n owner: this as any, // any: TsForm has [key:string]:any but TS can't verify lock/unlock signature match\n box : this.box,\n after: '.tsg-form-header'\n }, options)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n confirm(options: any): any { // any: options is a TsUtils.confirm config object\n return TsUtils.confirm({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n owner: this as any, // any: same as message() above\n box : this.box,\n after: '.tsg-form-header'\n }, options)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n validate(showErrors?: boolean): any[] | undefined { // any: error objects vary by field type\n if (showErrors == null) showErrors = true\n // validate before saving\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const errors: any[] = [] // any: error shape varies by validation\n for (let f = 0; f < this.fields.length; f++) {\n const field = this.fields[f]\n if (field.type == 'columns' || field.field == null) {\n continue\n }\n if (this.getValue(field.field) == null) this.setValue(field.field, '')\n if (['int', 'float', 'currency', 'money'].includes(field.type)) {\n const val = this.getValue(field.field)\n const min = field.options.min\n const max = field.options.max\n if (min != null && val != null && val < min) {\n errors.push({ field: field, error: TsUtils.lang('Should be more than ${min}', { min }) })\n }\n if (max != null && val != null && val > max) {\n errors.push({ field: field, error: TsUtils.lang('Should be less than ${max}', { max }) })\n }\n }\n switch (field.type) {\n case 'alphanumeric':\n if (this.getValue(field.field) && !TsUtils.isAlphaNumeric(this.getValue(field.field))) {\n errors.push({ field: field, error: TsUtils.lang('Not alpha-numeric') })\n }\n break\n case 'int':\n if (this.getValue(field.field) && !TsUtils.isInt(this.getValue(field.field))) {\n errors.push({ field: field, error: TsUtils.lang('Not an integer') })\n }\n break\n case 'percent':\n case 'float':\n if (this.getValue(field.field) && !TsUtils.isFloat(this.getValue(field.field))) {\n errors.push({ field: field, error: TsUtils.lang('Not a float') })\n }\n break\n case 'currency':\n case 'money':\n if (this.getValue(field.field) && !TsUtils.isMoney(this.getValue(field.field))) {\n errors.push({ field: field, error: TsUtils.lang('Not in money format') })\n }\n break\n case 'color':\n case 'hex':\n if (this.getValue(field.field) && !TsUtils.isHex(this.getValue(field.field))) {\n errors.push({ field: field, error: TsUtils.lang('Not a hex number') })\n }\n break\n case 'email':\n if (this.getValue(field.field) && !TsUtils.isEmail(this.getValue(field.field))) {\n errors.push({ field: field, error: TsUtils.lang('Not a valid email') })\n }\n break\n case 'checkbox':\n // convert true/false\n if (this.getValue(field.field) == true) {\n this.setValue(field.field, true)\n } else {\n this.setValue(field.field, false)\n }\n break\n case 'date':\n // format date before submit\n if (!field.options.format) field.options.format = TsUtils.settings.dateFormat\n if (this.getValue(field.field) && !TsUtils.isDate(this.getValue(field.field), field.options.format)) {\n errors.push({ field: field, error: TsUtils.lang('Not a valid date') + ': ' + field.options.format })\n }\n break\n case 'list':\n case 'combo':\n case 'switch':\n break\n case 'enum':\n break\n }\n // === check required - if field is '0' it should be considered not empty\n const val = this.getValue(field.field)\n if (field.hidden !== true && field.required\n && !['div', 'custom', 'html', 'empty'].includes(field.type)\n && (val == null || val === '' || (Array.isArray(val) && val.length === 0)\n || (TsUtils.isPlainObject(val) && Object.keys(val).length == 0))) {\n errors.push({ field: field, error: TsUtils.lang('Required field') })\n }\n if (field.hidden !== true && field.options?.minLength > 0\n && !['enum', 'list', 'combo'].includes(field.type) // since minLength is used there for other purpose\n && (val == null || val.length < field.options.minLength)) {\n errors.push({ field: field, error: TsUtils.lang('Field should be at least ${count} characters.',\n { count: field.options.minLength })})\n }\n }\n // event before\n const edata = this.trigger('validate', { target: this.name, errors: errors })\n if (edata.isCancelled === true) return\n // show error\n this.last.errors = errors\n if (showErrors) this.showErrors()\n // event after\n edata.finish()\n return errors\n }\n\n showErrors(): void {\n // TODO: check edge cases\n // -- invisible pages\n // -- form refresh\n const errors = this.last.errors\n if (errors.length <= 0) return\n // show errors\n this.goto(errors[0].field.page)\n ;(query(errors[0].field.$el).parents('.tsg-field').get(0) as Element).scrollIntoView({ block: 'nearest', inline: 'nearest' })\n // show errors\n // show only for visible controls\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n errors.forEach((error: any) => { // any: error shape varies\n const opt = TsUtils.extend({\n anchorClass: 'tsg-error',\n class: 'tsg-light',\n position: 'right|left',\n hideOn: ['input', 'tooltip-click']\n }, error.options)\n if (error.field == null) return\n let anchor = error.field.el\n if (error.field.type === 'radio') { // for radio and checkboxes\n anchor = query(error.field.el).closest('div').get(0)\n } else if (['enum', 'file'].includes(error.field.type)) {\n // TODO: check\n // anchor = (error.field.el).data('TsField').helpers.multi\n // $(fld).addClass('tsg-error')\n }\n TsTooltip.show(TsUtils.extend({\n anchor,\n name: `${this.name}-${error.field.field}-error`,\n html: error.error\n }, opt))\n })\n // on scroll update errors so they will appear in correct places\n this.last.errorsShown = true\n query(errors[0].field.$el).parents('.tsg-page')\n .off('.hideErrors')\n .on('scroll.hideErrors', (_evt: Event) => {\n if (this.last.errorsShown) {\n this.showErrors()\n }\n })\n }\n\n hideErrors(): void {\n this.last.errorsShown = false\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.fields.forEach((field: any) => { // any: field definition\n TsTooltip.hide(`${this.name}-${field.field}-error`)\n })\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getChanges(): Record<string, any> | null { // any: diff values vary by field type\n // TODO: not working on nested structures\n // any: Record<string, any> — dynamic property bag; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let diff: Record<string, any> = {}\n if (this.original != null && typeof this.original == 'object' && Object.keys(this.record).length !== 0) {\n diff = doDiff(this.record, this.original, {})\n }\n return diff\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function doDiff(record: any, original: any, result: any): any { // any: record/original/result shapes vary\n if (Array.isArray(record) && Array.isArray(original)) {\n while (record.length < original.length) {\n record.push(null)\n }\n }\n for (const i in record) {\n if (record[i] != null && typeof record[i] === 'object') {\n result[i] = doDiff(record[i], original[i] || {}, {})\n if (!result[i] || (Object.keys(result[i]).length == 0 && Object.keys(original[i].length == 0))) delete result[i]\n } else if (record[i] != original[i] || (record[i] == null && original[i] != null)) { // also catch field clear\n result[i] = record[i]\n }\n }\n return Object.keys(result).length != 0 ? result : null\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getCleanRecord(strict?: boolean): Record<string, any> { // any: record values vary by field type\n const data = TsUtils.clone(this.record)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.fields.forEach((fld: any) => { // any: field definition\n if (fld.type == 'columns' || fld.field == null) {\n return\n }\n if (['list', 'combo', 'enum'].includes(fld.type)) {\n const tmp = { nestedFields: true, record: data }\n const val = this.getValue.call(tmp, fld.field)\n if (TsUtils.isPlainObject(val) && val.id != null) { // should be true if val.id === ''\n this.setValue.call(tmp, fld.field, val.id)\n }\n if (Array.isArray(val)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n val.forEach((item: any, ind: number) => { // any: item shape varies\n if (TsUtils.isPlainObject(item) && item.id) {\n val[ind] = item.id\n }\n })\n }\n }\n if (fld.type == 'map') {\n const tmp = { nestedFields: true, record: data }\n const val = this.getValue.call(tmp, fld.field)\n if (val._order) delete val._order\n }\n if (fld.type == 'file') {\n const tmp = { nestedFields: true, record: data }\n const val = this.getValue.call(tmp, fld.field) ?? []\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n val.forEach((v: any) => { // any: file item shape\n delete v.file\n delete v.modified\n })\n this.setValue.call(tmp, fld.field, val)\n }\n })\n // return only records present in fields\n if (strict === true) {\n Object.keys(data).forEach((key) => {\n if (!this.get(key)) delete data[key]\n })\n }\n return data\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n request(postData?: any, callBack?: (data: any) => void): Promise<any> | void { // any: postData/data shapes vary by server API\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this // no-this-alias: used in nested function processError() which is a regular function declaration (rebinds `this`)\n // any: callback parameter — caller signature varies; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let resolve: (value: any) => void, reject: (reason?: any) => void\n const responseProm = new Promise((res, rej) => { resolve = res; reject = rej })\n // check for multiple params\n if (typeof postData === 'function') {\n callBack = postData\n postData = null\n }\n if (postData == null) postData = {}\n if (!this.url || (typeof this.url === 'object' && !this.url.get)) return\n // build parameters list\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const params: any = {} // any: params bag is built dynamically\n // add list params\n params.action = 'get'\n params.recid = this.recid\n params.name = this.name\n // append other params\n TsUtils.extend(params, this.postData)\n TsUtils.extend(params, postData)\n // event before\n const edata = this.trigger('request', { target: this.name, url: this.url, httpMethod: 'GET',\n postData: params, httpHeaders: this.httpHeaders })\n if (edata.isCancelled === true) return\n // default action\n this.record = {}\n this.original = null\n // call server to get data\n this.lock(TsUtils.lang(this.msgRefresh))\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let url: any = edata.detail['url'] // any: url can be string or object with .get/.save\n if (typeof url === 'object' && url.get) url = url.get\n if (this.last.fetchCtrl) try { this.last.fetchCtrl.abort() } catch (_e) {}\n // process url with routeData\n if (Object.keys(this.routeData).length != 0) {\n const info = TsUtils.parseRoute(url)\n if (info.keys.length > 0) {\n for (let k = 0; k < info.keys.length; k++) {\n const routeKey = info.keys[k]\n if (routeKey == null || this.routeData[routeKey.name] == null) continue\n url = url.replace((new RegExp(':'+ routeKey.name, 'g')), this.routeData[routeKey.name])\n }\n }\n }\n url = new URL(url, location.href)\n const fetchOptions = TsUtils.prepareParams(url, {\n method: edata.detail['httpMethod'],\n headers: edata.detail['httpHeaders'],\n body: edata.detail['postData']\n }, { dataType: this.dataType, caller: this, action: 'request' })\n this.last.fetchCtrl = new AbortController()\n fetchOptions['signal'] = this.last.fetchCtrl.signal\n this.last.fetchOptions = fetchOptions\n fetch(url, fetchOptions)\n .catch(processError)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .then((resp: any) => { // any: after .catch(), type is void|Response; cast to any to access status/json safely\n if (resp?.status != 200) {\n // if resp is undefined, it means request was aborted\n if (resp) processError(resp)\n return\n }\n resp.json()\n .catch(processError)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .then((data: any) => { // any: server response shape varies by API\n // event before\n const edata = self.trigger('load', {\n target: self.name,\n fetchCtrl: self.last.fetchCtrl,\n fetchOptions: self.last.fetchOptions,\n data\n })\n if (edata.isCancelled === true) return\n // for backward compatibility\n if (data.error == null && data.status === 'error') {\n data.error = true\n }\n // if data.record is not present, then assume that entire response is the record\n if (!data.record) {\n Object.assign(data, { record: TsUtils.clone(data) })\n }\n // server response error, not due to network issues\n if (data.error === true) {\n self.error(TsUtils.lang(data.message ?? self.msgServerError))\n } else {\n self.record = TsUtils.clone(data.record)\n }\n // event after\n self.unlock()\n edata.finish()\n self.refresh()\n self.setFocus()\n // call back\n if (typeof callBack === 'function') callBack(data)\n resolve(data)\n })\n })\n // event after\n edata.finish()\n return responseProm\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function processError(response: any): void { // any: response is Response or Error depending on failure mode\n if (response.name === 'AbortError') {\n // request was aborted by the form\n return\n }\n self.unlock()\n // trigger event\n const edata2 = self.trigger('error', { response, fetchCtrl: self.last.fetchCtrl, fetchOptions: self.last.fetchOptions })\n if (edata2.isCancelled === true) return\n // default behavior\n if (response.status && response.status != 200) {\n self.error(response.status + ': ' + response.statusText)\n } else {\n console.log('ERROR: Server request failed.', response, '. ',\n 'Expected Response:', { error: false, record: { field1: 1, field2: 'item' }},\n 'OR:', { error: true, message: 'Error description' })\n self.error(String(response))\n }\n // event after\n edata2.finish()\n reject(response)\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n submit(postData?: any, callBack?: (data: any) => void): Promise<any> | void { // any: matches save()\n return this.save(postData, callBack)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n save(postData?: any, callBack?: (data: any) => void): Promise<any> | void { // any: postData/data shapes vary\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this // no-this-alias: used in nested function processError() which is a regular function declaration (rebinds `this`)\n // any: callback parameter — caller signature varies; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let resolve: (value: any) => void, reject: (reason?: any) => void\n const saveProm = new Promise((res, rej) => { resolve = res; reject = rej })\n // check for multiple params\n if (typeof postData === 'function') {\n callBack = postData\n postData = null\n }\n // validation\n const errors = self.validate(true)\n if ((errors?.length ?? 0) !== 0) return\n // submit save\n if (postData == null) postData = {}\n if (!self.url || (typeof self.url === 'object' && !self.url.save)) {\n console.log('ERROR: Form cannot be saved because no url is defined.')\n return\n }\n self.lock(TsUtils.lang(self.msgSaving) + ' <span id=\"'+ self.name +'_progress\"></span>')\n // build parameters list\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const params: any = {} // any: params bag built dynamically\n // add list params\n params.action = 'save'\n params.recid = self.recid\n params.name = self.name\n // append other params\n TsUtils.extend(params, self.postData)\n TsUtils.extend(params, postData)\n params.record = TsUtils.clone(self.saveCleanRecord ? self.getCleanRecord() : self.record)\n // event before\n const edata = self.trigger('submit', { target: self.name, url: self.url, httpMethod: this.method ?? 'POST',\n postData: params, httpHeaders: self.httpHeaders })\n if (edata.isCancelled === true) return\n // default action\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let url: any = edata.detail['url'] // any: url can be string or object\n if (typeof url === 'object' && url.save) url = url.save\n if (self.last.fetchCtrl) self.last.fetchCtrl.abort()\n // process url with routeData\n if (Object.keys(self.routeData).length > 0) {\n const info = TsUtils.parseRoute(url)\n if (info.keys.length > 0) {\n for (let k = 0; k < info.keys.length; k++) {\n const routeKey = info.keys[k]\n if (routeKey == null || self.routeData[routeKey.name] == null) continue\n url = url.replace((new RegExp(':'+ routeKey.name, 'g')), self.routeData[routeKey.name])\n }\n }\n }\n url = new URL(url, location.href)\n const fetchOptions = TsUtils.prepareParams(url, {\n method: edata.detail['httpMethod'],\n headers: edata.detail['httpHeaders'],\n body: edata.detail['postData']\n }, { dataType: this.dataType, caller: this, action: 'save' })\n this.last.fetchCtrl = new AbortController()\n fetchOptions['signal'] = this.last.fetchCtrl.signal\n this.last.fetchOptions = fetchOptions\n fetch(url, fetchOptions)\n .catch(processError)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .then((resp: any) => { // any: after .catch(), type is void|Response; cast to any for safe access\n self.unlock()\n if (resp?.status != 200) {\n processError(resp ?? {})\n return\n }\n // parse server response\n resp.json()\n .catch(processError)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .then((data: any) => { // any: server response shape varies\n // event before\n const edata = self.trigger('save', {\n target: self.name,\n fetchCtrl: self.last.fetchCtrl,\n fetchOptions: self.last.fetchOptions,\n data\n })\n if (edata.isCancelled === true) return\n // server error, not due to network issues\n if (data.error === true) {\n self.error(TsUtils.lang(data.message ?? self.msgServerError))\n } else {\n self.original = null\n }\n // event after\n edata.finish()\n self.refresh()\n // call back\n if (typeof callBack === 'function') callBack(data)\n resolve(data)\n })\n })\n // event after\n edata.finish()\n return saveProm\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function processError(response: any): void { // any: response is Response or Error\n if (response?.name === 'AbortError') {\n // request was aborted by the form\n return\n }\n self.unlock()\n // trigger event\n const edata2 = self.trigger('error', { response, fetchCtrl: self.last.fetchCtrl, fetchOptions: self.last.fetchOptions })\n if (edata2.isCancelled === true) return\n // default behavior\n if (response.status && response.status != 200) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n response.json().then((data: any) => { // any: error response body\n // BUG FIX: original code used `?? response.statusText` which was unreachable\n // because string concatenation (response.status + ': ' + data.message) always\n // produces a non-null string even when data.message is undefined/null.\n // Fixed: use `|| response.statusText` to fall back when data.message is falsy.\n self.error(response.status + ': ' + (data.message || response.statusText))\n }).catch(() => {\n self.error(response.status + ': ' + response.statusText)\n })\n } else {\n console.log('ERROR: Server request failed.', response, '. ',\n 'Expected Response:', { error: false, record: { field1: 1, field2: 'item' }},\n 'OR:', { error: true, message: 'Error description' })\n self.error(String(response))\n }\n // event after\n edata2.finish()\n reject()\n }\n }\n\n lock(msg: string, showSpinner?: boolean): void {\n TsUtils.lock(this.box, msg, showSpinner)\n }\n\n unlock(speed?: number): void {\n const box = this.box\n TsUtils.unlock(box, speed)\n }\n\n lockPage(page: number, msg?: string, spinner?: boolean): boolean {\n const $page = query(this.box).find('.page-' + page)\n if ($page.length){\n // page found\n TsUtils.lock($page, msg, spinner)\n return true\n }\n // page with this id not found!\n return false\n }\n\n unlockPage(page: number, speed?: number): boolean {\n const $page = query(this.box).find('.page-' + page)\n if ($page.length) {\n // page found\n TsUtils.unlock($page, speed)\n return true\n }\n // page with this id not found!\n return false\n }\n\n goto(page: number): void {\n if (this.page === page) return // already on this page\n if (page != null) this.page = page\n // if it was auto size, resize it\n if (query(this.box).data('autoSize') === true) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (query(this.box).get(0) as any).clientHeight = 0 // any: clientHeight is read-only but set for autosize\n }\n this.refresh()\n }\n\n generateHTML(): string | false {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const pages: any[] = [] // any: page structure is built dynamically\n let group = ''\n let page: number | undefined\n let column: number | undefined\n let tabindex: number\n let tabindex_str: string\n for (let f = 0; f < this.fields.length; f++) {\n let html = ''\n tabindex = this.tabindexBase + f + 1\n tabindex_str = ' tabindex=\"'+ tabindex +'\"'\n const field = this.fields[f]\n if (field.html == null) field.html = {}\n if (typeof field.html == 'string') {\n field.html = {\n html: field.html,\n span: 0,\n attr: 'tabindex'\n }\n tabindex_str = ''\n }\n if (field.options == null) field.options = {}\n if (field.html.caption != null && field.html.label == null) {\n console.log('NOTICE: form field.html.caption property is deprecated, please use field.html.label. Field ->', field)\n field.html.label = field.html.caption\n }\n if (field.html.label == null) field.html.label = field.field\n if (field.html.anchor != null && field.html.span == null) {\n field.html.span = ''\n }\n field.html = TsUtils.extend({ label: '', span: 6, attr: '', text: '', style: '', page: 0, column: 0 }, field.html)\n if (page == null) page = field.html.page\n if (column == null) column = field.html.column\n // input control\n let input = `<input id=\"${field.field}\" name=\"${field.field}\" class=\"tsg-input ${field.html.class ?? ''}\" type=\"text\" ${field.html.attr + tabindex_str}>`\n switch (field.type) {\n case 'pass':\n case 'password':\n input = input.replace('type=\"text\"', 'type=\"password\"')\n break\n case 'checkbox': {\n input = `\n <label class=\"tsg-box-label\">\n <input id=\"${field.field}\" name=\"${field.field}\" class=\"tsg-input ${field.html.class ?? ''}\" type=\"checkbox\" ${field.html.attr + tabindex_str}>\n <span>${field.html.label}</span>\n </label>`\n break\n }\n case 'check':\n case 'checks': {\n if (field.options.items == null && field.html.items != null) field.options.items = field.html.items\n let items = field.options.items\n input = `<div class=\"tsg-field-group\" ${field.html.attr}>`\n // normalized options\n if (!Array.isArray(items)) items = []\n if (items.length > 0) {\n items = TsUtils.normMenu.call(this, items, field.options)\n }\n // generate\n for (let i = 0; i < items.length; i++) {\n input += `\n <div class=\"tsg-field-item\">\n <label class=\"tsg-box-label\">\n <input id=\"${field.field + i}\" name=\"${field.field}\" class=\"tsg-input ${field.html.class ?? ''}\" type=\"checkbox\"\n ${tabindex_str} data-value=\"${items[i].id}\" data-index=\"${i}\">\n <span> ${items[i].text}</span>\n </label>\n </div>`\n }\n input += '</div>'\n break\n }\n case 'radio': {\n input = `<div class=\"tsg-field-group\"${field.html.attr}>`\n // normalized options\n if (field.options.items == null && field.html.items != null) field.options.items = field.html.items\n let items = field.options.items\n if (!Array.isArray(items)) items = []\n if (items.length > 0) {\n items = TsUtils.normMenu.call(this, items, field.options)\n }\n // generate\n for (let i = 0; i < items.length; i++) {\n input += `\n <div class=\"tsg-field-item\">\n <label class=\"tsg-box-label\">\n <input id=\"${field.field + i}\" name=\"${field.field}\" class=\"tsg-input ${field.html.class ?? ''}\" type=\"radio\"\n ${(i === 0 ? tabindex_str : '')}\n data-value=\"${items[i].id}\" data-index=\"${i}\">\n <span> ${items[i].text}</span>\n </label>\n </div>`\n }\n input += '</div>'\n break\n }\n case 'select': {\n input = `<select id=\"${field.field}\" name=\"${field.field}\" class=\"tsg-input ${field.html.class ?? ''}\" ${field.html.attr + tabindex_str}>`\n // normalized options\n if (field.options.items == null && field.html.items != null) field.options.items = field.html.items\n let items = field.options.items\n if (!Array.isArray(items)) items = []\n if (items.length > 0) {\n items = TsUtils.normMenu.call(this, items, field.options)\n }\n // generate\n for (let i = 0; i < items.length; i++) {\n input += `<option value=\"${items[i].id}\">${items[i].text}</option>`\n }\n input += '</select>'\n break\n }\n case 'switch': {\n input = `\n <div>\n <div id=\"${field.field}-tb\" class=\"tsg-form-switch ${field.html.class ?? ''}\" ${field.html.attr}></div>\n <input id=\"${field.field}\" name=\"${field.field}\" ${tabindex_str} class=\"tsg-input\"\n style=\"position: absolute; right: 0px; margin-top: -30px; width: 1px; padding: 0; opacity: 0\">\n <span style=\"position: absolute; margin-top: -2px;\">${field.html.text ?? ''}</span>\n </div>\n `\n break\n }\n case 'textarea':\n input = `<textarea id=\"${field.field}\" name=\"${field.field}\" class=\"tsg-input ${field.html.class ?? ''}\" ${field.html.attr + tabindex_str}></textarea>`\n break\n case 'toggle':\n input = `<input id=\"${field.field}\" name=\"${field.field}\" class=\"tsg-input tsg-toggle ${field.html.class ?? ''}\"\n type=\"checkbox\" ${field.html.attr + tabindex_str}>\n <div><div></div></div>`\n break\n case 'map':\n case 'array':\n field.html.key = field.html.key || {}\n field.html.value = field.html.value || {}\n field.html.tabindex = tabindex\n field.html.tabindex_str = tabindex_str\n input = '<span style=\"float: right\">' + (field.html.text || '') + '</span>' +\n '<input id=\"'+ field.field +'\" name=\"'+ field.field +'\" type=\"hidden\" '+ field.html.attr + tabindex_str + '>'+\n '<div class=\"tsg-map-container\"></div>'\n break\n case 'div':\n case 'custom':\n input = `<div id=\"${field.field}\" name=\"${field.field}\" ${field.html.attr + tabindex_str} class=\"tsg-input ${field.html.class ?? ''}\">`+\n (field && field.html && field.html.html ? field.html.html : '') +\n '</div>'\n break\n case 'html':\n case 'empty':\n input = `<div id=\"${field.field}\" name=\"${field.field}\" ${field.html.attr + tabindex_str} class=\"tsg-input ${field.html.class ?? ''}\">`+\n (field && field.html ? (field.html.html || '') + (field.html.text || '') : '') +\n '</div>'\n break\n }\n if (group !== '') {\n if (page != field.html.page || column != field.html.column || (field.html.group && (group != field.html.group))) {\n pages[page!][column!] += '\\n </div>\\n </div>'\n group = ''\n }\n }\n if (field.html.group && (group != field.html.group)) {\n let collapsible = ''\n if (field.html.groupCollapsible) {\n collapsible = '<span class=\"tsg-icon-collapse\" style=\"width: 15px; display: inline-block; position: relative; top: -2px;\"></span>'\n }\n html += '\\n <div class=\"tsg-group\">'\n + '\\n <div class=\"tsg-group-title tsg-eaction\" style=\"'+ (field.html.groupTitleStyle || '') + '; '\n + (collapsible != '' ? 'cursor: pointer; user-select: none' : '') + '\"'\n + (collapsible != '' ? 'data-group=\"' + TsUtils.base64encode(field.html.group) + '\"' : '')\n + (collapsible != ''\n ? 'data-click=\"toggleGroup|' + field.html.group + '\"'\n : '')\n + '>'\n + collapsible + TsUtils.lang(field.html.group) + '</div>\\n'\n + ' <div class=\"tsg-group-fields\" style=\"'+ (field.html.groupStyle || '') +'\">'\n group = field.html.group\n }\n if (field.type == 'columns') {\n html += `<div class=\"tsg-field-columns\" style=\"${field.style ?? ''}\">`\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n field.columns.forEach((col: any) => { // any: column definition varies\n html += `<div style=\"${col.style}\"> ${col.content} </div>`\n })\n html += '</div>'\n } else if (field.html.col_anchor != null) {\n let span = (field.html.span != null ? 'tsg-span'+ field.html.span : '')\n if (field.html.span == -1) span = 'tsg-span-none'\n let label = `\n <label ${span == 'none' ? ' style=\"display: none\"' : ''}>\n ${TsUtils.lang(field.type != 'checkbox' ? field.html.label : field.html.text)}\n </label>`\n if (!field.html.label) label = ''\n const text = (field.type != 'array' && field.type != 'map' ? TsUtils.lang(field.type != 'checkbox' ? field.html.text : '') : '')\n pages[field.html.page].anchors ??= {}\n pages[field.html.page].anchors[field.html.col_anchor] =`\n <div class=\"tsg-field ${span}\" style=\"${(field.hidden ? 'display: none;' : '') + field.html.style}\">\n ${label}\n ${['empty', 'switch', 'radio', 'check', 'checks'].includes(field.type)\n ? input\n : `<div>${input + text}</div>`\n }\n </div>`\n } else if (field.html.anchor != null) {\n const span = (field.html.span != null ? 'tsg-span'+ field.html.span : 'tsg-span0')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let label = TsUtils.lang(field.type != 'checkbox' ? field.html.label : field.html.text, true as any) // any: second arg is suppress-warning flag in runtime JS but typed as Record\n const text = TsUtils.lang(field.type != 'checkbox' ? field.html.text : '')\n if (field.html.span == -1) {\n label = `<span style=\"position: absolute\"> <span class=\"tsg-anchor-span-none tsg-inline-label\"> ${label} </span> </span>`\n } else {\n label = `<span class=\"tsg-inline-label\"> ${label} </span>`\n }\n pages[field.html.page].anchors ??= {}\n pages[field.html.page].anchors[field.html.anchor] = `\n <div class=\"tsg-field tsg-field-inline ${span}\" style=\"${(field.hidden ? 'display: none;' : '') + field.html.style}\">\n ${((field.type === 'empty' || field.type == 'switch')\n ? input\n : ` <div>\n ${label} ${input} ${text}\n </div>`\n )}\n </div>`\n } else {\n let span = (field.html.span != null ? 'tsg-span'+ field.html.span : '')\n if (field.html.span == -1) span = 'tsg-span-none'\n let label = `\n <label ${span == 'none' ? ' style=\"display: none\"' : ''}>\n ${TsUtils.lang(field.type != 'checkbox' ? field.html.label : field.html.text)}\n </label>`\n if (!field.html.label) label = ''\n const text = (field.type != 'array' && field.type != 'map' ? TsUtils.lang(field.type != 'checkbox' ? field.html.text : '') : '')\n html += `\n <div class=\"tsg-field ${span}\" style=\"${(field.hidden ? 'display: none;' : '') + field.html.style}\">\n ${label}\n ${['empty', 'switch', 'radio', 'check', 'checks'].includes(field.type)\n ? input\n : `<div>${input + text}</div>`\n }\n </div>`\n }\n if (pages[field.html.page] == null) pages[field.html.page] = {}\n if (pages[field.html.page][field.html.column] == null) pages[field.html.page][field.html.column] = ''\n pages[field.html.page][field.html.column] += html\n page = field.html.page\n column = field.html.column\n }\n if (group !== '') pages[page!][column!] += '\\n </div>\\n </div>'\n if (this.tabs.tabs) {\n for (let i = 0; i < this.tabs.tabs.length; i++) if (pages[i] == null) pages[i] = []\n }\n // buttons if any\n let buttons = ''\n if (Object.keys(this.actions).length > 0) {\n buttons += '\\n<div class=\"tsg-buttons\">'\n tabindex = this.tabindexBase + this.fields.length + 1\n\n for (const a in this.actions) { // it is an object\n const act = this.actions[a]\n const info: { text: string; style: string; class: string } = { text: '', style: '', 'class': '' }\n if (TsUtils.isPlainObject(act)) {\n if (act.text == null && act.caption != null) {\n console.log('NOTICE: form action.caption property is deprecated, please use action.text. Action ->', act)\n act.text = act.caption\n }\n if (act.text) info.text = act.text\n if (act.style) info.style = act.style\n if (act.class) info.class = act.class\n } else {\n info.text = a\n if (['save', 'update', 'create'].includes(a.toLowerCase())) info.class = 'tsg-btn-blue'; else info.class = ''\n }\n buttons += '\\n <button name=\"'+ a +'\" class=\"tsg-btn '+ info.class +'\" style=\"'+ info.style +'\" tabindex=\"'+ tabindex +'\">'+\n TsUtils.lang(info.text) +'</button>'\n tabindex++\n }\n buttons += '\\n</div>'\n }\n let html = ''\n for (let p = 0; p < pages.length; p++){\n html += '<div class=\"tsg-page page-'+ p +'\" style=\"' + (p !== 0 ? 'display: none;' : '') + this.pageStyle + '\">'\n if (!pages[p]) {\n console.log(`ERROR: Page ${p} does not exist`)\n return false\n }\n if (pages[p].before) {\n html += pages[p].before\n }\n html += '<div class=\"tsg-column-container\">'\n Object.keys(pages[p]).sort().forEach((c: string, _ind: number) => {\n if (c == String(parseInt(c))) {\n html += '<div class=\"tsg-column col-'+ c +'\">' + (pages[p][c] || '') + '\\n</div>'\n }\n })\n html += '\\n</div>'\n if (pages[p].after) {\n html += pages[p].after\n }\n html += '\\n</div>'\n // process page anchors\n if (pages[p].anchors) {\n Object.keys(pages[p].anchors).forEach((key: string, _ind: number) => {\n html = html.replace(key, pages[p].anchors[key])\n })\n }\n }\n html += buttons\n return html\n }\n\n action(action: string, event: Event): void {\n const act = this.actions[action]\n let click = act\n if (TsUtils.isPlainObject(act) && act.onClick) click = act.onClick\n // event before\n const edata = this.trigger('action', { target: action, action: act, originalEvent: event })\n if (edata.isCancelled === true) return\n // default actions\n if (typeof click === 'function') click.call(this, event)\n // event after\n edata.finish()\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getAction(action: string): any { // any: returns Query object\n const ret = query(this.box).find('.tsg-buttons button[name=\"' + action + '\"]')\n if (ret.length === 0) {\n console.log('ERROR: Action \"' + action + '\" not found. Valid actions are: ' + Object.keys(this.actions).join(', '))\n }\n return ret\n }\n\n actionHide(action: string): void {\n this.getAction(action).hide()\n }\n\n actionShow(action: string): void {\n this.getAction(action).show()\n }\n\n actionDisable(action: string): void {\n this.getAction(action).prop('disabled', true)\n }\n\n actionEnable(action: string): void {\n this.getAction(action).prop('disabled', false)\n }\n\n resize(): void {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this // no-this-alias: used in nested function resizeElements() which is a regular function declaration (rebinds `this`)\n // event before\n const edata = this.trigger('resize', { target: this.name })\n if (edata.isCancelled === true) return\n // default behaviour\n if (this.box != null) {\n const header = query(this.box).find(':scope > div .tsg-form-header')\n const toolbar = query(this.box).find(':scope > div .tsg-form-toolbar')\n const tabs = query(this.box).find(':scope > div .tsg-form-tabs')\n const page = query(this.box).find(':scope > div .tsg-page')\n const dpage = query(this.box).find(':scope > div .tsg-page.page-'+ this.page + ' > div')\n const buttons = query(this.box).find(':scope > div .tsg-buttons')\n // if no height, calculate it\n const { headerHeight, tbHeight, tabsHeight } = resizeElements()\n if (this.autosize) { // we don't need autosize every time\n const cHeight = (query(this.box).get(0) as HTMLElement).clientHeight\n if (cHeight === 0 || query(this.box).data('autosize') == 'yes') {\n query(this.box).css({\n height: headerHeight + tbHeight + tabsHeight + 15 // 15 is extra height\n + (page.length > 0 ? TsUtils.getSize(dpage, 'height') : 0)\n + (buttons.length > 0 ? TsUtils.getSize(buttons, 'height') : 0)\n + 'px'\n })\n query(this.box).data('autosize', 'yes')\n }\n resizeElements()\n }\n // resize tabs and toolbar if any\n this.tabs?.resize?.()\n this.toolbar?.resize?.()\n // resize switch fields\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.fields.forEach((field: any) => { // any: field definition\n if (field.type == 'switch') {\n field.toolbar?.resize?.()\n }\n })\n\n function resizeElements(): { headerHeight: number; tbHeight: number; tabsHeight: number } {\n const headerHeight = (self.header !== '' ? TsUtils.getSize(header, 'height') : 0)\n const tbHeight = (Array.isArray(self.toolbar?.items) && self.toolbar?.items?.length > 0)\n ? TsUtils.getSize(toolbar, 'height')\n : 0\n const tabsHeight = (Array.isArray(self.tabs?.tabs) && self.tabs?.tabs?.length > 0)\n ? TsUtils.getSize(tabs, 'height')\n : 0\n // resize elements\n toolbar.css({ top: headerHeight + 'px' })\n tabs.css({ top: headerHeight + tbHeight + 'px' })\n page.css({\n top: headerHeight + tbHeight + tabsHeight + 'px',\n bottom: (buttons.length > 0 ? TsUtils.getSize(buttons, 'height') : 0) + 'px'\n })\n // return some params\n return { headerHeight, tbHeight, tabsHeight }\n }\n }\n // event after\n edata.finish()\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n refresh(...args: any[]): number { // any: args are optional field names\n const time = Date.now()\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this // no-this-alias: needed for nested function declarations (resizeElements, event handlers) that rebind `this`\n if (!this.box) return 0\n if (!this.isGenerated || !query(this.box).html()) return 0\n // event before\n const edata = this.trigger('refresh', { target: this.name, page: this.page, field: args[0], fields: args })\n if (edata.isCancelled === true) return 0\n let fields = Array.from(this.fields.keys())\n if (args.length > 0) {\n fields = args\n // any: parameter typed any — runtime dispatch by call site; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .map((fld: any, _ind: number) => {\n if (typeof fld != 'string') console.log('ERROR: Arguments in refresh functions should be field names')\n return this.get(fld, true) // get index of field\n })\n // any: parameter typed any — runtime dispatch by call site; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .filter((fld: any, _ind: number) => {\n if (fld != null) return true; else return false\n })\n } else {\n // update field.page with page it belongs too\n query(this.box).find('input, textarea, select').each((node: Node) => {\n const el = node as HTMLElement\n const name = (query(el).attr('name') != null ? query(el).attr('name') : query(el).attr('id'))\n const field = this.get(name)\n if (field) {\n // find page\n const div = query(el).closest('.tsg-page')\n if (div.length > 0) {\n for (let i = 0; i < 100; i++) {\n if (div.hasClass('page-'+i)) { field.page = i; break }\n }\n }\n }\n })\n // default action\n query(this.box).find('.tsg-page').hide()\n query(this.box).find('.tsg-page.page-' + this.page).show()\n query(this.box).find('.tsg-form-header').html(TsUtils.lang(this.header))\n // refresh tabs if needed\n if (typeof this.tabs === 'object' && Array.isArray(this.tabs.tabs) && this.tabs.tabs.length > 0) {\n query(this.box).find('#form_'+ this.name +'_tabs').show()\n this.tabs.active = this.tabs.tabs[this.page].id\n this.tabs.refresh()\n } else {\n query(this.box).find('#form_'+ this.name +'_tabs').hide()\n }\n // refresh tabs if needed\n if (typeof this.toolbar === 'object' && Array.isArray(this.toolbar.items) && this.toolbar.items.length > 0) {\n query(this.box).find('#form_'+ this.name +'_toolbar').show()\n this.toolbar.refresh()\n } else {\n query(this.box).find('#form_'+ this.name +'_toolbar').hide()\n }\n }\n // refresh values of fields\n for (let f = 0; f < fields.length; f++) {\n const fieldIdx = fields[f]\n if (fieldIdx == null) continue\n const field = this.fields[fieldIdx]\n if (field == null) continue\n if (field.name == null && field.field != null) field.name = field.field\n if (field.field == null && field.name != null) field.field = field.name\n field.$el = query(this.box).find(`[name='${String(field.name).replace(/\\\\/g, '\\\\\\\\')}']`)\n field.el = field.$el.get(0)\n if (field.el) field.el.id = field.name\n if (field.TsField) {\n field.TsField.reset()\n }\n field.$el\n .off('.TsForm')\n // any: targeted-any per typing_policy; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('change.TsForm', function(this: HTMLInputElement & { _previous?: any }, event: Event) {\n const value = self.getFieldValue(field.field)\n if (value == null) return\n // clear error class\n if (['enum', 'file'].includes(field.type)) {\n const helper = field.TsField?.helpers?.multi\n query(helper).removeClass('tsg-error')\n }\n if (this._previous != null) {\n value.previous = this._previous\n delete this._previous\n }\n // event before\n const edata2 = self.trigger('change', { target: this.name, field: this.name, value, originalEvent: event })\n if (edata2.isCancelled === true) return\n // default behavior\n self.setValue(this.name, value.current)\n // event after\n edata2.finish()\n })\n // any: targeted-any per typing_policy; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('input.TsForm', function(this: HTMLInputElement & { _previous?: any }, event: Event) {\n self.rememberOriginal()\n const value = self.getFieldValue(field.field)\n if (value == null) return\n // save previous for change event\n if (this._previous == null) {\n this._previous = value.previous\n }\n // event before\n const edata2 = self.trigger('input', { target: self.name, field, value, originalEvent: event })\n if (edata2.isCancelled === true) return\n // default action\n self.setValue(this.name, value.current, true)\n // event after\n edata2.finish()\n })\n // required\n if (field.required) {\n field.$el.closest('.tsg-field').addClass('tsg-required')\n } else {\n field.$el.closest('.tsg-field').removeClass('tsg-required')\n }\n // disabled\n if (field.disabled != null) {\n if (field.disabled) {\n if (field.$el.data('tabIndex') == null) {\n field.$el.data('tabIndex', field.$el.prop('tabIndex'))\n }\n field.$el\n .prop('disabled', true)\n .prop('tabIndex', -1)\n .closest('.tsg-field')\n .addClass('tsg-disabled')\n } else {\n field.$el\n .prop('disabled', false)\n .prop('tabIndex', field.$el.data('tabIndex') ?? field.$el.prop('tabIndex') ?? 0)\n .closest('.tsg-field')\n .removeClass('tsg-disabled')\n }\n }\n // hidden\n let tmp = field.el\n if (!tmp) tmp = query(this.box).find('#' + field.field)\n if (field.hidden) {\n query(tmp).closest('.tsg-field').hide()\n } else {\n query(tmp).closest('.tsg-field').show()\n }\n }\n // attach actions on buttons\n query(this.box).find('button, input[type=button]').each((node: Node) => {\n const el = node as HTMLElement\n query(el).off('click').on('click', function(this: HTMLElement & { value: string; id: string; name: string }, event: Event) {\n let action = this.value\n if (this.id) action = this.id\n if (this['name']) action = this['name']\n self.action(action, event)\n })\n })\n // init controls with record\n for (let f = 0; f < fields.length; f++) {\n const fieldIdx2 = fields[f]\n if (fieldIdx2 == null) continue\n const field = this.fields[fieldIdx2]\n if (field == null) continue\n if (!field.el) continue\n if (!field.$el.hasClass('tsg-input')) field.$el.addClass('tsg-input')\n field.type = String(field.type).toLowerCase()\n if (!field.options) field.options = {}\n // list type\n if (this.LIST_TYPES.includes(field.type)) {\n const items = field.options.items\n if (items == null) field.options.items = []\n if (field.type == 'switch') {\n // should not have .text if it is not explicitly set, or toolbar will have text\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n items.forEach((item: any, ind: number) => { // any: item varies\n return items[ind] = typeof item != 'object'\n ? { id: item, text: item }\n : item\n })\n } else {\n field.options.items = TsUtils.normMenu.call(this, items ?? [], field.options)\n }\n }\n // switch\n if (field.type == 'switch') {\n if (field.toolbar) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ;(TsUi[this.name + '_' + field.name + '_tb'] as any).destroy() // any: TsUi registry returns unknown\n }\n // any: callback parameter — caller signature varies; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n field.options?.items?.forEach?.((it: any) => it.text == null ? it.text = '' : '')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const items: any[] = TsUtils.normMenu.call(this, field.options.items, field.options) ?? [] // any: toolbar item shape varies\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n items.forEach((item: any) => item.type ??= 'radio') // any: toolbar item shape\n field.toolbar = new TsToolbar({\n box: field.$el.prev().get(0),\n name: this.name + '_' + field.name + '_tb',\n items,\n onClick(event: CustomEvent) {\n self.rememberOriginal()\n const value = self.getFieldValue(field.name)\n if (value == null) return\n value.current = event.detail['item'].id\n const edata = self.trigger('change', { target: field.name, field: field.name, value, originalEvent: event })\n if (edata.isCancelled === true) {\n return\n }\n self.record[field.name] = value.current\n self.setFieldValue(field.name, value.current)\n edata.finish()\n }\n })\n field.$el.prev().addClass('tsg-form-switch') // need to add this class, as toolbar render will remove all tsg-* classes\n field.toolbar.resize()\n field.$el\n .off('.form-input')\n .on('focus.form-input', (event: FocusEvent) => {\n const ind = field.toolbar.get(field.$el.val(), true)\n query(event.target).prop('_index', ind)\n query(field.toolbar.box).addClass('tsg-tb-focus')\n })\n .on('blur.form-input', (event: FocusEvent) => {\n query(event.target).removeProp('_index')\n query(`#${field.name}-tb .tsg-tb-button`).removeClass('over')\n query(field.toolbar.box).removeClass('tsg-tb-focus')\n })\n .on('keydown.form-input', (event: KeyboardEvent) => {\n let ind = query(event.target).prop('_index') as number // prop returns unknown; index is always number\n switch (event.key) {\n case 'ArrowLeft': {\n if (ind > 0) ind--\n query(`#${field.name}-tb .tsg-tb-button`)\n .removeClass('over')\n .eq(ind)\n .addClass('over')\n query(event.target).prop('_index', ind)\n break\n }\n case 'ArrowRight': {\n if (ind < field.toolbar.items.length -1) ind++\n query(`#${field.name}-tb .tsg-tb-button`)\n .removeClass('over')\n .eq(ind)\n .addClass('over')\n query(event.target).prop('_index', ind)\n break\n }\n }\n if (event.keyCode == 32 || event.keyCode == 13) {\n // space or enter - apply selected\n self.rememberOriginal()\n const value = self.getFieldValue(field.name)\n if (value == null) return\n // any: cast-then-index for dynamic property access; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tbItem = (field.toolbar.items as any[])[ind]\n value.current = tbItem?.id\n const edata = self.trigger('change', { target: field.name, field: field.name, value, originalEvent: event })\n if (edata.isCancelled === true) {\n return\n }\n self.record[field.name] = value.current\n self.setFieldValue(field.name, value.current)\n edata.finish()\n query(`#${field.name}-tb .tsg-tb-button`).removeClass('over')\n }\n // do not allow any input, besides a tab\n if (!event.metaKey && !event.ctrlKey && event.keyCode != 9) {\n event.preventDefault()\n }\n })\n }\n\n // HTML select\n if (field.type == 'select') {\n // generate options\n const items = field.options.items\n let options = ''\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n items.forEach((item: any) => { // any: select item shape\n options += `<option value=\"${item.id}\">${item.text}</option>`\n })\n field.$el.html(options)\n }\n // w2fields\n if (this.TsFIELD_TYPES.includes(field.type)) {\n field.TsField = field.TsField\n ?? new TsField(TsUtils.extend({}, field.options, { type: field.type }))\n field.TsField.render(field.el)\n }\n // map and arrays\n if (['map', 'array'].includes(field.type)) {\n // need closure\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (function (obj: TsForm, field: any) { // any: field definition\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n field.el.mapAdd = function(field: any, div: any, cnt: number, empty?: boolean) { // any: field/div shapes\n const attr = (field.disabled ? ' readOnly ' : '') + (field.html.tabindex_str || '')\n let html = `<input type=\"text\" ${(field.html.value.attr ?? '') + attr} class=\"tsg-input ${field.html.class ?? ''} tsg-map value\">`\n + `${field.html.value.text || ''}`\n\n if (typeof field.html.render == 'function') {\n html = field.html.render.call(self, { empty: empty === true, ind: cnt, field, div })\n // make sure all inputs have names as it is important for array objects\n if (!field.el._errorDisplayed) {\n // any: cast-to-any for dynamic dispatch; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_queryRaw as any).html(html).filter('input, textarea').each((node: Node) => {\n const inp = node as HTMLInputElement\n const name = inp.dataset['name'] ?? inp['name']\n if (name == null || name == '') {\n console.log(`ERROR: All inputs of the field %c\"${field.name}\"%c must have name attribute defined. No name for %c${inp.outerHTML}`,\n 'color: blue', '', 'color: red')\n }\n })\n field.el._errorDisplayed = true\n }\n } else if (field.type == 'map') {\n // has key input in front\n html = `<input type=\"text\" ${(field.html.key.attr ?? '') + attr} class=\"tsg-input ${field.html.class ?? ''} tsg-map key\">\n ${field.html.key.text || ''}\n ` + html\n }\n div.append(`<div class=\"tsg-map-field\" style=\"margin-bottom: 5px\" data-index=\"${cnt}\">${html}</div>`)\n if (typeof field.html.render == 'function') {\n const box = div.find(`[data-index=\"${cnt}\"]`)\n box.find('input, textarea').each((el: HTMLElement) => {\n // set only if it is not defined in the HTML\n if (query(el).attr('tabindex') == null) {\n query(el).attr('tabindex', field.html.tabindex)\n }\n })\n if (typeof field.html.onRefresh == 'function') {\n field.html.onRefresh.call(self, { index: cnt, empty, box: box.get(0) })\n }\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n field.el.mapRefresh = function(map: any, div: any): void { // any: map can be object or array\n // generate options\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let keys: any[] = [], $k: any, $v: any // any: query objects for key/value inputs\n if (field.type == 'map') {\n if (!TsUtils.isPlainObject(map)) map = {}\n if (map._order == null) map._order = Object.keys(map)\n keys = map._order\n }\n if (field.type == 'array') {\n if (!Array.isArray(map)) map = []\n // any: parameter typed any — runtime dispatch by call site; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n keys = map.map((item: any, ind: number) => { return ind })\n }\n // delete fields (including empty one)\n div.find('.tsg-map-field').remove()\n for (let ind = 0; ind < keys.length; ind++) {\n const key = keys[ind]\n let fld = div.find(`div[data-index='${ind}']`)\n // add if does not exists\n if (fld.length == 0) {\n field.el.mapAdd(field, div, ind)\n fld = div.find(`div[data-index='${ind}']`)\n }\n fld.attr('data-key', key)\n if (typeof field.html?.render == 'function') {\n const val = map[key]\n fld.find('input, textarea').each((node: Node) => {\n const inp = node as HTMLInputElement\n const name = inp.dataset['name'] ?? inp['name'] // <input data-name=\"higher priority\" name=\"then\">\n if (inp.type == 'checkbox') {\n inp.checked = val[name] ?? false\n } else if (inp.type == 'radio') {\n inp.checked = val[name] ?? false\n } else {\n inp.value = val[name] ?? ''\n }\n })\n } else {\n $k = fld.find('.tsg-map.key')\n $v = fld.find('.tsg-map.value')\n let val = map[key]\n if (field.type == 'array') {\n // any: callback parameter — caller signature varies; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tmp = map.filter((it: any) => { return it?.key == key ? true : false})\n if (tmp.length > 0) val = tmp[0].value\n }\n $k.val(key)\n $v.val(val)\n if (field.disabled === true || field.disabled === false) {\n $k.prop('readOnly', field.disabled ? true : false)\n $v.prop('readOnly', field.disabled ? true : false)\n }\n }\n // call refresh\n if (typeof field.html.onRefresh == 'function') {\n field.html.onRefresh.call(self, { index: ind, box: div.find(`[data-index=\"${ind}\"]`).get(0) })\n }\n }\n if (typeof field.html.render == 'function') {\n $v = div.find('.tsg-map-field:last-child input:first-child')\n }\n const cnt = keys.length\n const curr = div.find(`div[data-index='${cnt}']`)\n // if not disabled - add next if needed\n if (curr.length === 0 && (!$k || $k.val() != '' || $v.val() != '')\n && !($k && ($k.prop('readOnly') === true || $k.prop('disabled') === true))\n ) {\n field.el.mapAdd(field, div, cnt, true)\n }\n if (field.disabled === true || field.disabled === false) {\n curr.find('.key').prop('readOnly', field.disabled ? true : false)\n curr.find('.value').prop('readOnly', field.disabled ? true : false)\n }\n // attach events\n let lastKey: string | null = null\n const container = (query(field.el).get(0) as Node)?.nextSibling // should be div\n query(container)\n .off('.mapChange')\n .on('mouseup.mapChange', { delegate: 'input, textarea' }, function (this: HTMLElement, event: Event) {\n /***\n * This hack is needed for the cases when this field is refreshed and focus in bettween of mousedown and mouse up.\n * In such a case, the field will not get focused, but should be as there was mouse click.\n */\n if (document.activeElement != event.target) {\n (event.target as HTMLElement).focus()\n }\n })\n .on('keyup.mapChange', { delegate: 'input, textarea' }, function(this: HTMLElement, event: Event) {\n const kbdEvent = event as KeyboardEvent\n const $div = query(kbdEvent.target).closest('.tsg-map-field')\n const next = ($div.get(0) as Element).nextElementSibling\n const prev = ($div.get(0) as Element).previousElementSibling\n const className = query(kbdEvent.target).hasClass('key') ? 'key' : 'value'\n if (kbdEvent.keyCode == 38 && prev) { // up key\n (query(prev).find(`input.${className}, textarea.${className}, input[name=\"${(kbdEvent.target as HTMLInputElement)['name']}\"] textarea[name=\"${(kbdEvent.target as HTMLInputElement)['name']}\"]`).get(0) as HTMLInputElement | undefined)?.select()\n kbdEvent.preventDefault()\n }\n if (kbdEvent.keyCode == 40 && next) { // down key\n ;(kbdEvent.target as HTMLElement).blur() // blur is needed because it will trigger change which will re-render fields\n const next = ($div.get(0) as Element).nextElementSibling // need to query it again because it was re-rendered\n ;(query(next).find(`input.${className}, textarea.${className}, input[name=\"${(kbdEvent.target as HTMLInputElement)['name']}\"] textarea[name=\"${(kbdEvent.target as HTMLInputElement)['name']}\"]`).get(0) as HTMLInputElement | undefined)?.select()\n kbdEvent.preventDefault()\n }\n })\n .on('keydown.mapChange', { delegate: 'input, textarea' }, function(this: HTMLElement, _event: Event) {\n const event = _event as KeyboardEvent\n lastKey = null\n if (event.keyCode == 9) { // tab\n lastKey = 'tab'\n }\n if (event.keyCode == 13) { // enter\n lastKey = 'enter'\n }\n if (event.keyCode == 38 || event.keyCode == 40) {\n lastKey = event.keyCode == 38 ? 'up' : 'down'\n event.preventDefault()\n }\n })\n .on('input.mapChange', { delegate: 'input, textarea' }, function(this: HTMLElement, event: Event) {\n const fld = query(event.target).closest('div.tsg-map-field')\n const cnt = fld.data('index')\n const next = (fld.get(0) as Element).nextElementSibling\n // if last one, add new empty\n let isEmpty = true\n query(fld).find('input, textarea').each((node: Node) => {\n const el = node as HTMLInputElement\n if (!['checkbox', 'button'].includes(el.type) && el.value != '') isEmpty = false\n })\n let isNextEmpty = true\n query(next).find('input, textarea').each((node: Node) => {\n const el = node as HTMLInputElement\n if (!['checkbox', 'button'].includes(el.type) && el.value != '') isNextEmpty = false\n })\n if (!isEmpty && !next) {\n field.el.mapAdd(field, div, parseInt(cnt as string) + 1, true)\n } else if (isEmpty && next && isNextEmpty) {\n query(next).remove()\n }\n })\n .on('change.mapChange', { delegate: 'input, textarea' }, function(this: HTMLElement, _event: Event) {\n const event = _event as KeyboardEvent\n self.rememberOriginal()\n // event before\n const _fieldValue = self.getFieldValue(field.field)\n if (_fieldValue == null) return\n // eslint-disable-next-line prefer-const\n let { current, previous, original } = _fieldValue\n const $cnt = query(event.target).closest('.tsg-map-container')\n // delete empty\n if (typeof field.html?.render == 'function') {\n // any: callback parameter — caller signature varies; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n current = current.filter((kk: any) => {\n // any: callback parameter — caller signature varies; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const val = [...(new Set(Object.values(kk).filter((vv: any) => typeof vv != 'boolean')))]\n return !(val.length == 0 || (val.length == 1 && val[0] === ''))\n })\n } else if (field.type == 'map') {\n current._order = []\n $cnt.find('.tsg-map.key').each((node: Node) => { current._order.push((node as HTMLInputElement).value) })\n current._order = current._order.filter((k: string) => k !== '')\n delete current['']\n } else if (field.type == 'array') {\n // any: callback parameter — caller signature varies; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n current = current.filter((k: any) => k !== '')\n }\n const edata = self.trigger('change', { target: field.field, field: field.field, originalEvent: event,\n value: { current, previous, original }\n })\n if (edata.isCancelled === true) {\n return\n }\n\n /**\n * Finds what input had focus so that it can focus next element, as entire map of fields will be\n * re-created and focus will be lost. It will also take care of up/down keys.\n */\n let index: number | undefined\n let className = ''\n const cnt = query(event.target).closest('.tsg-map-container')\n if (field.type == 'array' || lastKey == 'tab') {\n cnt.find('input, textarea').each((node: Node, ind: number) => { if (node == event.target) index = ind })\n } else {\n className = query(event.target).hasClass('key') ? '.key' : '.value'\n cnt.find('input'+ className + ', textarea'+ className).each((node: Node, ind: number) => { if (node == event.target) index = ind })\n }\n\n // set value to the field\n self.setValue(field.field, current) // will call field.el.mapRefresh\n\n // set focus to the next input\n let el: HTMLElement | undefined\n const safeIdx = index ?? 0\n if (lastKey == 'tab') {\n el = cnt.find('input, textarea').get(safeIdx + 1) as HTMLElement\n } else if (lastKey == 'enter' && cnt.find('input.value, textarea.value').length > 0) {\n if (className == '.key') {\n el = cnt.find('input.key, textarea.key').get(safeIdx + 1) as HTMLElement\n } else {\n el = cnt.find('input.value, textarea.value').get(safeIdx + 1) as HTMLElement\n }\n if (el == null) {\n el = cnt.find('input, textarea').get(safeIdx + (event.shiftKey ? -1 : 1)) as HTMLElement\n }\n } else {\n el = cnt.find('input'+ className + ', textarea'+ className).eq(safeIdx + (lastKey == 'up' ? -1 : 1)).get(0) as HTMLElement\n }\n if (el) {\n el.focus()\n ;(el as HTMLInputElement).select()\n }\n // event after\n edata.finish()\n })\n }\n })(this, field)\n }\n // set value to HTML input field\n this.setFieldValue(field.field, this.getValue(field.name))\n }\n // event after\n edata.finish()\n this.resize()\n return Date.now() - time\n }\n\n override render(box?: HTMLElement | string): number | void {\n const time = Date.now()\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this // no-this-alias: used in nested function callbacks where `this` is rebound (toolbar, tabs click handlers)\n if (typeof box == 'string') box = query(box).get(0) as HTMLElement\n // event before\n const edata = this.trigger('render', { target: this.name, box: box ?? this.box })\n if (edata.isCancelled === true) return\n // default action\n if (box != null) {\n this.unmount() // clean previous control\n this.box = box\n }\n if (!this.isGenerated && !this.formHTML) return\n if (!this.box) return\n // render form\n const html = '<div class=\"tsg-form-box\">' +\n (this.header !== '' ? '<div class=\"tsg-form-header\">' + TsUtils.lang(this.header) + '</div>' : '') +\n ' <div id=\"form_'+ this.name +'_toolbar\" class=\"tsg-form-toolbar\" style=\"display: none\"></div>' +\n ' <div id=\"form_'+ this.name +'_tabs\" class=\"tsg-form-tabs\" style=\"display: none\"></div>' +\n this.formHTML +\n '</div>'\n query(this.box).attr('name', this.name)\n .addClass('tsg-reset tsg-form')\n .html(html)\n if (query(this.box).length > 0) (query(this.box).get(0) as HTMLElement).style.cssText += this.style\n TsUtils.bindEvents(query(this.box).find('.tsg-eaction'), this)\n\n // init toolbar regardless it is defined or not\n if (typeof this.toolbar.render !== 'function') {\n this.toolbar = new TsToolbar(TsUtils.extend({}, this.toolbar, { name: this.name +'_toolbar', owner: this }))\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.toolbar.on('click', function(this: any, event: CustomEvent) { // any: toolbar context\n const edata = self.trigger('toolbar', { target: event.target, originalEvent: event })\n if (edata.isCancelled === true) return\n // no default action\n edata.finish()\n })\n }\n if (typeof this.toolbar === 'object' && typeof this.toolbar.render === 'function') {\n this.toolbar.render(query(this.box).find('#form_'+ this.name +'_toolbar').get(0))\n }\n // init tabs regardless it is defined or not\n if (typeof this.tabs.render !== 'function') {\n this.tabs = new TsTabs(TsUtils.extend({}, this.tabs, { name: this.name +'_tabs', owner: this, active: this.tabs.active }))\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.tabs.on('click', function(this: any, event: CustomEvent) { // any: tabs context\n self.goto(this.get(event.target, true))\n })\n }\n if (typeof this.tabs === 'object' && typeof this.tabs.render === 'function') {\n this.tabs.render(query(this.box).find('#form_'+ this.name +'_tabs').get(0))\n if (this.tabs.active) this.tabs.click(this.tabs.active)\n }\n // event after\n edata.finish()\n // after render actions\n this.resize()\n const url = (typeof this.url !== 'object' ? this.url : this.url.get)\n if (url && this.recid != null) {\n // any: callback parameter — caller signature varies; TsForm field schema is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ;(this.request() as Promise<any>).catch((_error: any) => this.refresh()) // request() is void|Promise; url+recid guarantee it returns Promise\n } else {\n this.refresh()\n }\n // observe div resize\n this.last.observeResize = new ResizeObserver(() => { this.resize() })\n this.last.observeResize.observe(this.box)\n // focus on load\n if (this.focus != -1) {\n let setCount = 0\n const setFocus = () => {\n if (query(self.box).find('input, select, textarea').length > 0) {\n self.setFocus()\n } else {\n setCount++\n if (setCount < 20) setTimeout(setFocus, 50) // 1 sec max\n }\n }\n setFocus()\n }\n return Date.now() - time\n }\n\n override unmount(): void {\n super.unmount()\n this.tabs?.unmount?.()\n this.toolbar?.unmount?.()\n this.last.observeResize?.disconnect()\n }\n\n destroy(): void {\n // event before\n const edata = this.trigger('destroy', { target: this.name })\n if (edata.isCancelled === true) return\n // clean up\n this.tabs?.destroy?.()\n this.toolbar?.destroy?.()\n if (query(this.box).find('#form_'+ this.name +'_tabs').length > 0) {\n this.unmount()\n }\n this.last.observeResize?.disconnect()\n delete TsUi[this.name]\n // event after\n edata.finish()\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n setFocus(focus?: number | string): any { // any: returns Query object with focused element\n if (typeof focus === 'undefined'){\n // no argument - use form's focus property\n focus = this.focus\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let $input: any // any: Query object or undefined\n // focus field by index\n if (TsUtils.isInt(focus)){\n if ((focus as number) < 0) {\n return\n }\n const inputs = query(this.box)\n .find('div:not(.tsg-field-helper) > input, select, textarea, div > label:nth-child(1) > [type=radio]')\n .filter(':not(.file-input)')\n // find visible (offsetParent == null for any element is not visible)\n while ((inputs.get(focus as number) as HTMLElement)?.offsetParent == null && inputs.length > (focus as number)) {\n (focus as number)++\n }\n if (inputs.get(focus as number)) {\n $input = query(inputs.get(focus as number))\n }\n } else if (typeof focus === 'string') {\n // focus field by name\n $input = query(this.box).find(`[name='${focus}']`)\n }\n if ($input?.length > 0){\n ($input.get(0) as HTMLElement).focus()\n }\n return $input\n }\n}\nexport { TsForm }\n"],"mappings":"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","names":["TsTooltip","query","fields","tabs","_process","_process2","rec","selected","el","name","item","value","values","val","edata","html","resizeElements","headerHeight","tbHeight","tabsHeight","field","next","cnt"]}
|