x4js 1.6.0 → 1.6.1

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/x4js.ts", "../../src/x4dom.ts", "../../src/x4events.ts", "../../src/base_component.ts", "../../src/i18n.ts", "../../src/tools.ts", "../../src/styles.ts", "../../src/component.ts", "../../src/settings.ts", "../../src/router.ts", "../../src/application.ts", "../../src/layout.ts", "../../src/popup.ts", "../../src/action.ts", "../../src/icon.ts", "../../src/label.ts", "../../src/menu.ts", "../../src/listview.ts", "../../src/tooltips.ts", "../../src/input.ts", "../../src/button.ts", "../../src/calendar.ts", "../../src/textedit.ts", "../../src/autocomplete.ts", "../../src/canvas.ts", "../../src/cardview.ts", "../../src/checkbox.ts", "../../src/color.ts", "../../src/request.ts", "../../src/datastore.ts", "../../src/combobox.ts", "../../src/form.ts", "../../src/dialog.ts", "../../src/colorpicker.ts", "../../src/drag_manager.ts", "../../src/drawtext.ts", "../../src/image.ts", "../../src/fileupload.ts", "../../src/formatters.ts", "../../src/gridview.ts", "../../src/link.ts", "../../src/md5.ts", "../../src/messagebox.ts", "../../src/panel.ts", "../../src/spreadsheet.ts", "../../src/property_editor.ts", "../../src/radiobtn.ts", "../../src/rating.ts", "../../src/sidebarview.ts", "../../src/svgcomponent.ts", "../../src/tabbar.ts", "../../src/tabview.ts", "../../src/textarea.ts", "../../src/toaster.ts", "../../src/treeview.ts", "../../src/x4react.ts", "../../src/app_sockets.ts", "../../src/version.ts"],
4
- "sourcesContent": ["/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file x4js.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nexport * from \"./application\"\nexport * from \"./autocomplete\"\nexport * from \"./base_component\"\n//export * from \"./base64\"\nexport * from \"./button\"\nexport * from \"./calendar\"\nexport * from \"./canvas\"\nexport * from \"./cardview\"\nexport * from \"./checkbox\"\nexport * from \"./color\"\nexport * from \"./colorpicker\"\nexport * from \"./combobox\"\nexport * from \"./component\"\nexport * from \"./datastore\"\nexport * from \"./dialog\"\nexport * from \"./dom_events\"\nexport * from \"./drag_manager\"\nexport * from \"./drawtext\"\nexport * from \"./fileupload\"\nexport * from \"./form\"\nexport * from \"./formatters\"\nexport * from \"./gridview\"\nexport * from \"./i18n\"\nexport * from \"./icon\"\nexport * from \"./image\"\nexport * from \"./input\"\nexport * from \"./label\"\nexport * from \"./layout\"\nexport * from \"./link\"\nexport * from \"./listview\"\nexport * from \"./md5\"\nexport * from \"./menu\"\nexport * from \"./messagebox\"\nexport * from \"./panel\"\nexport * from \"./popup\"\nexport * from \"./property_editor\"\nexport * from \"./radiobtn\"\nexport * from \"./rating\"\nexport * from \"./request\"\nexport * from \"./router\"\nexport * from \"./settings\"\nexport * from \"./sidebarview\"\n//export * from \"./smartedit\"\nexport * from \"./spreadsheet\"\nexport * from \"./styles\"\nexport * from \"./svgcomponent\"\nexport * from \"./tabbar\"\nexport * from \"./tabview\"\nexport * from \"./textarea\"\nexport * from \"./textedit\"\n//export * from \"./texthiliter\"\nexport * from \"./toaster\"\nexport * from \"./tools\"\nexport * from \"./tooltips\"\nexport * from \"./treeview\"\nexport * from \"./x4events\"\nexport * from \"./x4react\"\nexport * from \"./app_sockets\"\n\nexport * from \"./version\"", "/**\r\n* ___ ___ __\r\n* \\ \\_/ / / _\r\n* \\ / /_| |_\r\n* / _ \\____ _| \r\n* /__/ \\__\\ |_|\r\n* \r\n* @file x4events.ts\r\n* @author Etienne Cochard \r\n*\r\n* Copyright (c) 2019-2023 R-libre ingenierie\r\n*\r\n* Permission is hereby granted, free of charge, to any person obtaining a copy \r\n* of this software and associated documentation files (the \"Software\"), to deal \r\n* in the Software without restriction, including without limitation the rights \r\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \r\n* of the Software, and to permit persons to whom the Software is furnished to do so, \r\n* subject to the following conditions:\r\n* The above copyright notice and this permission notice shall be included in all copies\r\n* or substantial portions of the Software.\r\n*\r\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \r\n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \r\n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \r\n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \r\n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n**/\r\n\r\n/**\r\n * SSR preparation\r\n */\r\n\r\ninterface IX4Document {\r\n\tcreateElement<K extends keyof HTMLElementTagNameMap>(tagName: K, options?: ElementCreationOptions): HTMLElementTagNameMap[K];\r\n\tcreateElementNS(namespace: string | null, qualifiedName: string, options?: string | ElementCreationOptions): Element;\r\n\tcreateTextNode(data: string): Text;\r\n\r\n\taddEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;\r\n\tremoveEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;\r\n\r\n\tquerySelectorAll<E extends Element = Element>(selectors: string): NodeListOf<E>;\r\n\tquerySelector<E extends Element = Element>(selectors: string): E | null;\r\n\r\n\tget body( ) : HTMLElement;\r\n\tget activeElement( ): Element;\r\n\tget location( ): Location;\r\n\tget styleSheets( ): StyleSheetList;\r\n\tget head( ): HTMLHeadElement;\r\n\tget documentElement( ): HTMLElement; \r\n\r\n\tset title( title: string );\r\n}\r\n\r\n\r\nexport let x4document: IX4Document = document;\r\n\r\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file x4events.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\n// default stopPropagation implementation for Events\nconst stopPropagation = function ( this: any ) {\n\tthis.propagationStopped = true;\n}\n\n// default preventDefault implementation for Events\nconst preventDefault = function ( this: any ) {\n\tthis.defaultPrevented = true;\n}\n\n// default callback type for events\nexport type EventCallback<T extends BasicEvent = BasicEvent> = (event: T) => any;\nexport interface EventDisposer {\n\tdispose( ) : void;\n};\n\n\n/**\n * Basic event\n * name like that to avoid conflict with Browsers Event class.\n */\n\nexport interface BasicEvent {\n\treadonly type?: string;\t\t\t// type of the event 'click', 'change', ...\n\treadonly source?: unknown;\t\t// object that fires the event\n\treadonly context?: any;\t\t// contextual data, left to the user\n\n\tpropagationStopped?: boolean;\t// if true, do not propagate the event\n\tdefaultPrevented?: boolean;\t\t// if true, do not call default handler (if any)\n\n\tstopPropagation?(): void;\t\t// stop the propagation\n\tpreventDefault?(): void;\t\t// prevent the default handler\n}\n\n/**\n * BasicEvent Builder\n * this function is responsable of BasicEvent creation\n * ie. is equivalent of new BasicEvent( xxx );\n * @param params \n * @returns BasicEvent\n */\n\nexport function BasicEvent<T extends BasicEvent = BasicEvent>(params: any): T {\n\treturn {\n\t\tstopPropagation,\n\t\tpreventDefault,\n\t\t...params,\n\t} as T;\n}\n\n/**\n * Click Event\n * click event do not have any additional parameters\n */\n\nexport interface EvClick extends BasicEvent {\n}\n\nexport function EvClick( context = null ) {\n\treturn BasicEvent<EvClick>({ context });\n}\n\n\n/**\n * Change Event\n * value is the the element value\n */\n\nexport interface EvChange extends BasicEvent {\n\treadonly value: any;\n}\n\nexport function EvChange(value: unknown, context = null ) {\n\treturn BasicEvent<EvChange>({ value, context });\n}\n\n/**\n * Selection Event\n * value is the new selection or null\n */\n\ninterface X4Selection {\n}\n\nexport interface EvSelectionChange extends BasicEvent {\n\treadonly selection: X4Selection;\n}\n\nexport function EvSelectionChange( selection: X4Selection, context = null ) {\n\treturn BasicEvent<EvSelectionChange>( { selection, context } );\n}\n\n/**\n * ContextMenu Event\n */\n\nexport interface EvContextMenu extends BasicEvent {\n\tuievent: UIEvent;\t// UI event that fire this event\n}\n\nexport function EvContextMenu( uievent: UIEvent, context = null ) {\n\treturn BasicEvent<EvContextMenu>( { uievent, context } );\n}\n\n/**\n * Timer Event\n * @see startTimer, stopTimer\n */\n\nexport interface EvTimer extends BasicEvent {\n\ttimer: string;\n\ttime: number;\n}\n\nexport function EvTimer( timer: string, time = 0, context = null ) {\n\treturn BasicEvent<EvTimer>( { timer, time, context });\n}\n\n/**\n * Simple message\n */\n\nexport interface EvMessage extends BasicEvent {\n\treadonly msg: string;\n\treadonly params?: any;\n}\n\nexport function EvMessage( msg: string, params?: unknown, source?: unknown ) {\n\treturn BasicEvent<EvMessage>({msg,params,source});\n}\n\n/**\n * Drag/Drop event\n */\n\nexport interface EvDrag extends BasicEvent {\n\telement: unknown;\n\tdata: any;\n}\n\nexport function EvDrag(element: unknown, data: any, ctx: any ) {\n\treturn BasicEvent<EvDrag>({ element, data, context: ctx });\n}\n\n/**\n * Errors\n */\n\nexport interface EvError extends BasicEvent {\n\tcode: number;\n\tmessage: string;\n}\n\t\nexport function EvError( code: number, message: string ) : EvError {\n\treturn BasicEvent<EvError>( {code, message} );\n}\n\n\n/**\n * this Base interface is used to describe available events & their types\n * \n * you can implement your own event mapping:\n * @example\n * ```ts\n * interface MyEventMap extends EventMap {\n * \t click: EvClick,\n * 'custom-message': Event,\n * \t [key: string]: Event,\n * }\n * ```\n */\n\nexport interface EventMap {\n}\n\n/**\n * basic event types, in general the type is builded from the eventMap\n * this is very usefull for editor completion\n * @example\n * ```ts\n * type MyEventType = MapEvents<MyEventMap>;\n * ```\n */\nexport interface EventTypes {\n}\n\n/**\n * convert an EventMap to a EventType\n */\n\nexport type MapEvents<Type> = {\n\t[Property in keyof Type]?: (ev: Type[Property]) => any;\n};\n\n\n/**\n * Event emitter class\n * this class allow you to emit and handle events\n * \n * @example:\n * ```ts\n * \n * interface EvDoIt extends BasicEvent {\n * param: unknown;\n * }\n * \n * function EvDoIt( e: EvDoIt ) : EvDoIt {\n * return BasicEvent<EvDoIt>( e );\n * }\n * \n * interface TestEventMap extends EventMap {\n *\tdoit: EvDoIt;\n * }\n *\n * let ee = new EventSource<TestEventMap>(null);\n * ee.listen({\n *\tdoit: (e) => {\n *\t\tconsole.log(e);\n *\t\te.preventDefault(); \n *\t},\n * });\n *\n * ee.defaults({\n *\tdoit: (e) => {\n *\t\tconsole.log('default handler for ', e.type, e.selection);\n *\t},\n * })\n * \n * ee.on('doit', (e) => {\n *\tdebugger;\n * })\n *\n * const ev = EvDoIt({ param: 10 });\n * ee.emit('change', ev);\n * if (ev.defaultPrevented) {\n *\tconsole.log('prevented');\n * }\n * ```\n */\n\nexport class EventSource<Q extends EventMap, T extends EventTypes = MapEvents<Q>> {\n\n\tprivate m_source: unknown;\n\tprivate m_eventRegistry: Map<string, EventCallback[]>;\n\tprivate m_defaultHandlers: Map<string, EventCallback[]>;\n\n\tconstructor(source: unknown = null) {\n\t\tthis.m_source = source ?? this;\n\t}\n\n\t/**\n\t * emit an event\n\t * you can stop propagation of event or prevent default\n\t * @param eventName - name of event to emit\n\t * @param event - event data \n\t */\n\n\temit<K extends keyof Q>(type: K, event?: Q[K]) {\n\t\tthis._emit(type as string, event);\n\t}\n\n\t_emit(eventName: string, e: BasicEvent): void {\n\t\tlet listeners = this.m_eventRegistry?.get(eventName);\n\t\tconst defaultHandler = this.m_defaultHandlers?.get(eventName);\n\n\t\tif (!e) {\n\t\t\te = {};\n\t\t}\n\n\t\tif (!e.source) {\n\t\t\t(e as any).source = this.m_source;\n\t\t}\n\n\t\tif (!e.type) {\n\t\t\t(e as any).type = eventName;\n\t\t}\n\n\t\tif (listeners && listeners.length) {\n\n\t\t\tif (!e.preventDefault) {\n\t\t\t\te.preventDefault = preventDefault;\n\t\t\t}\n\n\t\t\tif (!e.stopPropagation) {\n\t\t\t\te.stopPropagation = stopPropagation;\n\t\t\t}\n\n\t\t\t// small optimisation\n\t\t\tif (listeners.length == 1) {\n\t\t\t\tlisteners[0](e);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst temp = listeners.slice();\n\t\t\t\tfor (let i = 0, n = temp.length; i < n; i++) {\n\t\t\t\t\ttemp[i](e);\n\t\t\t\t\tif (e.propagationStopped) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (defaultHandler && defaultHandler.length && !e.defaultPrevented) {\n\t\t\treturn defaultHandler[0](e);\n\t\t}\n\t}\n\n\t/**\n\t * signal en event\n\t * signaled event are notification : no way to prevent default not stop propagation\n\t * @param eventName name of event to signal\n\t * @param event event data \n\t */\n\n\tsignal<K extends keyof Q>(type: K, event: Q[K], delay=-1) {\n\t\tthis._signal(type as string, event,delay);\n\t}\n\n\t_signal(eventName: string, e: BasicEvent,delay=-1): void {\n\n\t\tif (!this.m_eventRegistry) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst listeners = this.m_eventRegistry.get(eventName);\n\t\tif (!listeners || !listeners.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!e) {\n\t\t\te = {};\n\t\t}\n\n\t\tif (!e.type) {\n\t\t\t(e as any).type = eventName;\n\t\t}\n\n\t\tif (!e.source) {\n\t\t\t(e as any).source = this.m_source;\n\t\t}\n\n\t\te.preventDefault = e.stopPropagation = () => {\n\t\t\tconsole.error('this event cannot be stopped not default prevented');\n\t\t}\n\n\t\t// small optimisation\n\t\tif (listeners.length == 1 && delay==-1 ) {\n\t\t\tlisteners[0](e);\n\t\t}\n\t\telse {\n\t\t\tconst temp = listeners.slice();\n\n\t\t\tconst call = ( ) => {\n\t\t\t\tfor (let i = 0, n = temp.length; i < n; i++) {\n\t\t\t\t\ttemp[i](e);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif( delay==-1 ) {\n\t\t\t\tcall( );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsetTimeout( call, delay );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * handle an event one time\n\t * @param eventName - event name to handle\n\t * @param callback - callback to call when event is signaled\n\t * @returns Promise if callback is null\n\t * \n\t * take care with that because if the event is never fired and you await it,\n\t * the system may overflow\n\t */\n\n\tonce<K extends keyof Q>(type: K, callback: (ev: Q[K]) => any) {\n\t\t//@ts-ignore\n\t\tthis._once(type as string, callback);\n\t}\n\n\t_once(eventName: string, callback: EventCallback) {\n\n\t\tconst newCallback = ( ev ) => {\n\t\t\tthis._off(eventName, newCallback);\n\t\t\tcallback( ev );\n\t\t}\n\n\t\tthis._on(eventName, newCallback);\n\n\t\tif (!callback) {\n\t\t\treturn new Promise(function (resolve) {\n\t\t\t\tcallback = resolve;\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * set the event default handler\n\t * @param eventName - name of the event\n\t * @param callback - callback to call when the event is not handled (and preventDeault has not been called)\n\t */\n\n\tsetDefaultHandler(eventName: string, callback: EventCallback): void {\n\n\t\tlet handlers = this.m_defaultHandlers;\n\t\tif (!handlers) {\n\t\t\thandlers = this.m_defaultHandlers = new Map()\n\t\t}\n\n\t\tlet stack = handlers.get(eventName);\n\t\tif (stack) {\n\n\t\t\t// if already in the stack, remove it\n\t\t\tconst idx = stack.indexOf(callback);\n\t\t\tif (idx != -1) {\n\t\t\t\tstack.splice(idx, 1);\n\t\t\t}\n\n\t\t\t// then make it first\n\t\t\tstack.unshift(callback);\n\t\t}\n\t\telse {\n\t\t\thandlers.set(eventName, [callback]);\n\t\t}\n\t}\n\n\t/**\n\t * remove the previous default handler installed for an event\n\t * @param eventName - event name\n\t * @param callback - callback handler to remove (must be the same as in setDefaultHandler)\n\t */\n\n\tremoveDefaultHandler(eventName: string, callback: EventCallback): void {\n\t\tconst handlers = this.m_defaultHandlers;\n\t\tif (!handlers) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst stack = handlers.get(eventName);\n\t\tif (stack) {\n\t\t\tconst idx = stack.indexOf(callback);\n\t\t\tif (idx != -1) {\n\t\t\t\tstack.splice(idx, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * define a set of listeners in one call\n\t * @param events \n\t */\n\n\tlisten(events: T) {\n\t\tfor (let n in events) {\n\t\t\tthis._on(n, events[n] as unknown as EventCallback);\n\t\t}\n\t}\n\n\t/**\n\t * define a set of default handlers in one call\n\t * @param events \n\t */\n\n\tdefaults(events: T) {\n\t\tfor (let n in events) {\n\t\t\tthis.setDefaultHandler(n, events[n] as unknown as EventCallback);\n\t\t}\n\t}\n\n\t/**\n\t * listen for an event\n\t * @param eventName - event name to listen on\n\t * @param callback - callback to call\n\t * @param capturing - if true, capture event before other registred event handlers\n\t */\n\n\ton<K extends keyof Q>(type: K, callback: (ev: Q[K]) => any) : EventDisposer {\n\t\t//@ts-ignore\n\t\treturn this._on(type as string, callback);\n\t}\n\n\t_on(eventName: string, callback: EventCallback, capturing = false): EventDisposer {\n\n\t\tif (!this.m_eventRegistry) {\n\t\t\tthis.m_eventRegistry = new Map();\n\t\t}\n\n\t\tlet listeners = this.m_eventRegistry.get(eventName);\n\t\tif (!listeners) {\n\t\t\tlisteners = [];\n\t\t\tthis.m_eventRegistry.set(eventName, listeners);\n\t\t}\n\n\t\tif (listeners.indexOf(callback) == -1) {\n\t\t\tif (capturing) {\n\t\t\t\tlisteners.unshift(callback);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlisteners.push(callback);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tdispose: ( ) => { this._off( eventName, callback ); } \n\t\t}\n\t}\n\n\t/**\n\t * stop listening to an event\n\t * @param eventName - event name\n\t * @param callback - callback to remove (must be the same as in on )\n\t */\n\n\toff<K extends keyof Q>(type: K, callback: (ev: Q[K]) => any) {\n\t\t//@ts-ignore\n\t\treturn this._off(type as string, callback);\n\t}\n\n\t_off(eventName: string, callback: EventCallback ): void {\n\t\tif (!this.m_eventRegistry) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet listeners = this.m_eventRegistry.get(eventName);\n\t\tif (!listeners) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst idx = listeners.indexOf(callback);\n\t\tif (idx !== -1) {\n\t\t\tlisteners.splice(idx, 1);\n\t\t}\n\t}\n\n\t/**\n\t * remove all listeners for an event\n\t * @param eventName - event name \n\t */\n\n\tremoveAllListeners(eventName: string | null): void {\n\t\tif (!eventName) {\n\t\t\tthis.m_eventRegistry = this.m_defaultHandlers = undefined;\n\t\t}\n\t\telse {\n\t\t\tif (this.m_eventRegistry) {\n\t\t\t\tthis.m_eventRegistry[eventName] = undefined;\n\t\t\t}\n\n\t\t\tif (this.m_defaultHandlers) {\n\t\t\t\tthis.m_defaultHandlers[eventName] = undefined;\n\t\t\t}\n\t\t}\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file base_component.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*\n**/\n\nimport { EventMap, MapEvents, EventSource, EvTimer } from './x4events';\n\n/**\n * Timer Callback\n * @see EvTimer, startTimer, stopTimer\n */\n\n interface TimerCallback {\n\t(name: string, time: number): void;\n}\n\n/**\n * BaseComponent EventMap\n */\n\nexport interface BaseComponentEventMap extends EventMap {\n\ttimer: EvTimer,\n}\n\n/**\n * BaseCompoment Properties\n */\n\nexport interface BaseComponentProps<T = BaseComponentEventMap> {\n\tevents?: MapEvents<T>;\t// basic component event map in base interface, should specialised in derived interfaces\n\t[key: string]: any; // added index signature to solve \"Type 'X' has no properties with type 'Y'\" \n}\n\n/**\n * BaseComponent class\n */\n\nexport class BaseComponent< P extends BaseComponentProps<BaseComponentEventMap>, E extends BaseComponentEventMap >\n\textends EventSource< E > {\n\n\tprotected m_props: P;\n\t#m_timers: Map<string, Function>;\n\n\tconstructor(props: P) {\n\t\tsuper();\n\n\t\t//this.m_props = { ...props };\n\t\tthis.m_props = props;\n\n\t\tif (props.events) {\n\t\t\tthis.listen(props.events as EventMap);\n\t\t}\n\t}\n\n\t/**\n\t * start a new timer\n\t * @param name timer name \n\t * @param timeout time out in ms\n\t * @param repeat if true this is an auto repeat timer\n\t * @param callback if !null, the callback to call else a EvTimer is fired\n\t */\n\n\tstartTimer(name: string, timeout: number, repeat = true, callback: TimerCallback = null) {\n\t\tif (!this.#m_timers) {\n\t\t\tthis.#m_timers = new Map();\n\t\t}\n\t\telse {\n\t\t\tthis.stopTimer(name);\n\t\t}\n\n\t\tconst id = (repeat ? setInterval : setTimeout)((tm: number) => {\n\t\t\tif (callback) {\n\t\t\t\tcallback(name, tm);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.emit('timer', EvTimer( name, tm ));\n\t\t\t}\n\t\t}, timeout);\n\n\t\tthis.#m_timers.set(name, () => { (repeat ? clearInterval : clearTimeout)(id) });\n\t}\n\n\t/**\n\t * stop the given timer\n\t * @param name \n\t */\n\n\tstopTimer(name: string) {\n\t\tconst clear = this.#m_timers.get(name);\n\t\tif (clear) { clear(); }\n\t}\n\n\t/**\n\t * stop all timers\n\t */\n\n\tdisposeTimers( ) {\n\t\tthis.#m_timers?.forEach( v => v() );\n\t\tthis.#m_timers = undefined;\n\t}\n\n\t/**\n\t * \n\t * @param callback \n\t * @param timeout \n\t */\n\n\tsingleShot( callback: TimerCallback, timeout = 0 ) {\n\t\tsetTimeout( callback, timeout );\n\t}\n\n\t/**\n\t * \n\t * @param props \n\t * @param elements \n\t */\n\t\n\tpublic mapPropEvents<N extends keyof E>(props: P, ...elements: N[] ) {\n\t\telements.forEach( name => {\n\t\t\tconst n = name as string;\n\t\t\tif (props[n]) {\n\t\t\t\tthis._on(n, props[n]);\n\t\t\t}\n\t\t})\n\t}\n}\n\n", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file i18n.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\n\n\n\n/**\n * language definition\n */\n\n interface Language {\n name: string;\n base: string;\n\tsrc_translations: any;\n translations: any;\n}\n\nconst sym_lang = Symbol( \"i18n\" );\n\nlet languages: Record<string,Language> = {\n};\n\n/**\n * create a new language\n * @param name language name (code)\n * @param base base language (code)\n * @example:\n * ```js\n * createLanguage( 'en', 'fr' );\n * ```\n */\n\nexport function createLanguage( name: string, base: string ) {\n languages[name] = { \n name,\n base,\n\t\tsrc_translations: {},\n translations: {}\n };\n}\n\n/**\n * check if the given language is known\n * @param name language name (code)\n */\n\nexport function isLanguage( name: string ): boolean {\n return languages[name]!==undefined;\n}\n\n/**\n * build the language with given fragments\n * @param name language name (code)\n * @param parts misc elements that make the language\n * @example:\n * ```js\n * createLanguage( 'en', 'fr' );\n * const app = {\n * \tclients: {\n * \t\ttranslation1: \"hello\",\n * }\n * }\n * addTranslation( 'en', app );\n * ```\n */\n\nexport function addTranslation( name, ...parts ) {\n\t\n\tif( !isLanguage(name) ) {\n\t\treturn;\n\t}\n\n\tconst lang = languages[name];\n \n\tparts.forEach( p => {\n\t\t_patch( lang.src_translations, p );\n\t} );\n\n\tlang.translations = _proxyfy( lang.src_translations, lang.base, true );\n}\n\n/**\n * patch the base object with the given object\n * (real patch)\n */\n\nfunction _patch( obj: any, by: any ) {\n\n\tfor( let n in by ) {\n\t\tconst src = by[n];\n\t\tif( typeof src === \"string\" ) {\n\t\t\tobj[n] = src;\n\t\t}\n\t\telse {\n\t\t\tif( Array.isArray(src) && (!obj[n] || !Array.isArray(obj[n])) ) {\n\t\t\t\tobj[n] = [...src];\n\t\t\t}\n\t\t\telse if( !obj[n] || (typeof obj[n] !== \"object\") ) {\n\t\t\t\tobj[n] = { ...src };\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_patch( obj[n], by[n] );\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * create a proxy for all sub objects\n * (deep traverse)\n */\n\nfunction _proxyfy( obj: any, base: any, root ) {\n\n\tconst result = {}\n\n\tfor( const n in obj ) {\n\t\tif( typeof obj[n]!==\"string\" && !Array.isArray(obj[n])) {\n\t\t\tresult[n] = _proxyfy( obj[n], base, false );\n\t\t}\n\t\telse {\n\t\t\tresult[n] = obj[n];\n\t\t}\n\t}\n\n\treturn _mk_proxy( result, base, root );\n}\n\n\n/**\n * create a proxy for the given object\n */\n\nfunction _mk_proxy( obj: any, base: string, root: boolean ) : any {\n\treturn new Proxy( obj, {\n\t\tget: (target, prop) => {\n\t\t\tif( root ) {\n\t\t\t\treq_path = [prop];\n\t\t}\n\t\t\telse {\n\t\t\t\treq_path.push( prop );\n\t}\n\n\t\t\tlet value = target[prop];\n\t\t\tif( value===undefined && base ) {\n\t\t\t\tvalue = _findBaseTrans( base );\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t});\n}\n\n\n/**\n * when we ask for _tr.xxx\n * reqpath is set to [xxx]\n * \n * then when we try to get _tr.xxx.yyy\n * reqpath is [xxx,yyy]\n * if yyy is not found, we try with base langage for the full reqpath \n * until no base found\n */\n\nlet req_path: (string | symbol)[];\n\n/**\n * \n */\n\nfunction _findBaseTrans( base ) {\n\n\twhile( base ) {\n\t\tconst lang = languages[base];\n\t\tlet trans = lang.translations;\n\t\tlet value;\n\n\t\tfor( const p of req_path ) {\n\t\t\tvalue = trans[p];\n\t\t\tif( value===undefined ) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\ttrans = value;\n\t\t}\n\n\t\tif( value!==undefined ) {\n\t\t\treturn trans;\n\t\t}\n\n\t\tbase = lang.base;\n\t}\n\n\tconsole.error( \"I18N error: unable to find\", '_tr.'+req_path.join('.') );\n\treturn undefined;\n}\n\nexport let _tr: any = {};\n\n/**\n * select the given language as current\n * @param name laguage name (code)\n */\n\nexport function selectLanguage( name: string ) {\n\n\tif( !isLanguage(name) ) {\n\t\treturn;\n\t}\n\n\t_tr = languages[name].translations;\n\t_tr[sym_lang] = name;\n\treturn _tr;\n}\n\n/**\n * \n */\n\nexport function getCurrentLanguage( ): string {\n\treturn _tr[sym_lang];\n}\n\n/**\n * \n */\n\nexport function getAvailableLanguages( ): string[] {\n\treturn Object.keys( languages );\n}\n\n\n\n\n/**\n * language definition\n * x4 specific strings\n */\n\nlet fr = {\n\tglobal: {\n\t\tok: 'OK',\n\t\tcancel: 'Annuler',\n\t\tignore: 'Ignorer',\n\t\tyes: 'Oui',\n\t\tno: 'Non',\n\n\t\topen: 'Ouvrir',\n\t\tnew: 'Nouveau',\n\t\tdelete: 'Supprimer',\n\t\tclose: 'Fermer',\n\t\tsave: 'Enregistrer',\n\n\t\tsearch: 'Rechercher',\n\t\tsearch_tip: 'Saisissez le texte \u00E0 rechercher. <b>Enter</b> pour lancer la recherche. <b>Esc</b> pour annuler.',\n\n\t\trequired_field: \"information requise\",\n\t\tinvalid_format: \"format invalide\",\n\t\tinvalid_email: 'adresse mail invalide',\n\t\tinvalid_number: 'valeur num\u00E9rique invalide',\n\n\t\tdiff_date_seconds: '{0} secondes',\n\t\tdiff_date_minutes: '{0} minutes',\n\t\tdiff_date_hours: '{0} heures',\n\n\t\tinvalid_date: 'Date non reconnue ({0})',\n\t\tempty_list: 'Liste vide',\n\n\t\tdate_input_formats: 'd/m/y|d.m.y|d m y|d-m-y|dmy',\n\t\tdate_format: 'D/M/Y',\n\n\t\tday_short: [ 'dim', 'lun', 'mar', 'mer', 'jeu', 'ven', 'sam' ],\n\t\tday_long: [ 'dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi' ],\n\n\t\tmonth_short: [ 'jan', 'f\u00E9v', 'mar', 'avr', 'mai', 'jun', 'jui', 'ao\u00FB', 'sep', 'oct', 'nov', 'd\u00E9c' ],\n\t\tmonth_long: [ 'janvier', 'f\u00E9vrier', 'mars', 'avril', 'mai', 'juin', 'juillet', 'ao\u00FBt', 'septembre', 'octobre', 'novembre', 'd\u00E9cembre' ],\n\n\t\tproperty: 'Propri\u00E9t\u00E9',\n\t\tvalue: 'Valeur',\n\n\t\terr_403: `Vous n'avez pas les droits suffisants pour effectuer cette action`,\n\n\t\tcopy: 'Copier',\n\t\tcut: 'Couper',\n\t\tpaste: 'Coller'\n\t}\n};\n\n/** @ignore */\n\nlet en = {\n\tglobal: {\n\t\tok: 'OK',\n\t\tcancel: 'Cancel',\n\t\tignore: 'Ignore',\n\t\tyes: 'Yes',\n\t\tno: 'No',\n\n\t\topen: 'Open',\n\t\tnew: 'New',\n\t\tdelete: 'Delete',\n\t\tclose: 'Close',\n\t\tsave: 'Save',\n\n\t\tsearch: 'Search',\n\t\tsearch_tip: 'Type in the text to search. <b>Enter</b> to start the search. <b>Esc</b> to cancel.',\n\n\t\trequired_field: \"missing information\",\n\t\tinvalid_format: \"invalid format\",\n\t\tinvalid_email: 'invalid email address',\n\t\tinvalid_number: 'bad numeric value',\n\n\t\tdiff_date_seconds: '{0} seconds',\n\t\tdiff_date_minutes: '{0} minutes',\n\t\tdiff_date_hours: '{0} hours',\n\n\t\tinvalid_date: 'Unrecognized date({0})',\n\t\tempty_list: 'Empty list',\n\n\t\tdate_input_formats: 'm/d/y|m.d.y|m d y|m-d-y|mdy',\n\t\tdate_format: 'M/D/Y',\n\n\t\tday_short: [ 'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat' ],\n\t\tday_long: [ 'sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday' ],\n\n\t\tmonth_short: [ 'jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jui', 'aug', 'sep', 'oct', 'nov', 'dec' ],\n\t\tmonth_long: [ 'january', 'february', 'march', 'april', 'mau', 'june', 'jully', 'august', 'september', 'october', 'november', 'december' ],\n\n\t\tproperty: 'Property',\n\t\tvalue: 'Value',\n\n\t\terr_403: `You do not have sufficient rights to do that action`,\n\n\t\tcopy: 'Copy',\n\t\tcut: 'Cut',\n\t\tpaste: 'Paste'\n\t}\n};\n\ncreateLanguage( 'fr', null );\naddTranslation( 'fr', fr );\n\ncreateLanguage( 'en', 'fr' );\naddTranslation( 'en', en );\n\nselectLanguage( 'fr' );\t// by default\n\n\n\n\n\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file tools.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\n\nimport { _tr } from './i18n'; \t// you MUST create a file named translation.js\n\n// :: ENVIRONMENT ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\n/**\n * @return true is the device has touch\n */\n\nexport function isTouchDevice() {\n\treturn 'ontouchstart' in window;\n}\n\n// :: NUMBERS ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\n\n/**\n * round to a given number of decimals\n * @param num numbre to round\n * @param ndec number of decimals\n * @returns number rounded\n */\n\nexport function roundTo(num: number, ndec: number) {\n\tlet mul = Math.pow(10, ndec);\n\tlet res = Math.round(num * mul) / mul;\n\tif (Object.is(res, -0)) {\t// res===-0.0 \n\t\tres = 0;\n\t}\n\treturn res;\n}\n\n/**\n * parse an intl formatted number\n * understand grouping and ',' separator\n * @review us format: grouping = ','\n * @param num \n */\n\nexport function parseIntlFloat(num: string) {\n\tnum = num.replace(/\\s*/g, '');\t// group separator\n\tnum = num.replace(',', '.');\t\t// decimal separator\n\n\t// accept empty & return 0.0\n\tif (num.length == 0) {\n\t\treturn 0.0;\n\t}\n\n\treturn parseFloat(num);\n}\n\n// :: STRING MANIP ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\nconst RE_PCASE = /([a-z][A-Z])/g;\nconst RE_PCASE2 = /[^-a-z0-9]+/g;\n\n/**\n * inverse of camel case\n * theThingToCase -> the-thing-to-case\n * @param {String} str \n */\n\nexport function pascalCase(string: string): string {\n\n\tlet result = string;\n\n\tresult = result.replace(/([a-z])([A-Z])/g, \"$1 $2\");\n\tresult = result.toLowerCase();\n\tresult = result.replace(/[^- a-z0-9]+/g, ' ');\n\n\tif (result.indexOf(' ') < 0) {\n\t\treturn result;\n\t}\n\n\tresult = result.trim();\n\treturn result.replace(/ /g, '-');\n}\n\nexport function camelCase( text: string ) {\n\tlet result = text.toLowerCase( );\n\tresult = result.replace( /[^a-zA-Z0-9]+(.)/g, (m,chr) => {\n\t\treturn chr.toUpperCase();\n\t} );\n\treturn result;\n}\n\n// :: MISC CLASSES ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\nexport type Constructor<T> = new (...args: any[]) => T;\n\nexport class Point {\n\tx: number;\n\ty: number;\n\n\tconstructor(x = 0, y = 0) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t}\n}\n\nexport class Size {\n\twidth: number;\n\theight: number;\n\n\tconstructor(w = 0, h = 0) {\n\t\tthis.width = w;\n\t\tthis.height = h;\n\t}\n}\n\nexport class Rect {\n\n\tleft: number;\n\ttop: number;\n\twidth: number;\n\theight: number;\n\n\tconstructor();\n\tconstructor(rc: Rect);\n\tconstructor(rc: DOMRect);\n\tconstructor(left: number, top: number, width: number, height: number);\n\tconstructor(left?: number | Rect | DOMRect, top?: number, width?: number, height?: number) {\n\n\t\tif (left === undefined) {\n\t\t\tthis.left = this.top = this.right = this.bottom = 0;\n\t\t}\n\t\telse if (left instanceof Rect || left instanceof DOMRect) {\n\t\t\tlet rc = left;\n\t\t\tthis.left = rc.left;\n\t\t\tthis.top = rc.top;\n\t\t\tthis.width = rc.width;\n\t\t\tthis.height = rc.height;\n\t\t}\n\t\telse {\n\t\t\tthis.left = left;\n\t\t\tthis.top = top;\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t}\n\t}\n\n\tset(left: number, top: number, width: number, height: number) {\n\t\tthis.left = left;\n\t\tthis.top = top;\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t}\n\n\tget bottom(): number {\n\t\treturn this.top + this.height;\n\t}\n\n\tset bottom(bottom: number) {\n\t\tthis.height = bottom - this.top;\n\t}\n\n\tget right(): number {\n\t\treturn this.left + this.width;\n\t}\n\n\tset right(right: number) {\n\t\tthis.width = right - this.left;\n\t}\n\n\tget topLeft(): Point {\n\t\treturn new Point(this.left, this.top);\n\t}\n\n\tget bottomRight(): Point {\n\t\treturn new Point(this.right, this.bottom);\n\t}\n\n\tget size(): Size {\n\t\treturn new Size(this.width, this.height);\n\t}\n\n\tmoveTo(left: number, top: number): this {\n\t\tthis.left = left;\n\t\tthis.top = top;\n\t\treturn this;\n\t}\n\n\tmovedTo(left: number, top: number): Rect {\n\t\treturn new Rect(left, top, this.width, this.height);\n\t}\n\n\tmoveBy(dx: number, dy: number): this {\n\t\tthis.left += dx;\n\t\tthis.top += dy;\n\t\treturn this;\n\t}\n\n\tmovedBy(dx: number, dy: number): Rect {\n\t\treturn new Rect(this.left + dx, this.top + dy, this.width, this.height);\n\t}\n\n\tisEmpty() {\n\t\treturn this.width == 0 && this.height == 0;\n\t}\n\n\tnormalize(): this {\n\t\tlet w = this.width,\n\t\t\th = this.height;\n\n\t\tif (w < 0) {\n\t\t\tthis.left += w;\n\t\t\tthis.width = -w;\n\t\t}\n\n\t\tif (h < 0) {\n\t\t\tthis.top += h;\n\t\t\tthis.height = -h;\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tnormalized(): Rect {\n\n\t\tlet rc = new Rect(this);\n\t\tlet w = rc.width,\n\t\t\th = rc.height;\n\n\n\t\tif (w < 0) {\n\t\t\trc.left += w;\n\t\t\trc.width = -w;\n\t\t}\n\n\t\tif (h < 0) {\n\t\t\trc.top += h;\n\t\t\trc.height = -h;\n\t\t}\n\n\t\treturn rc;\n\t}\n\n\t/**\n\t * @deprecated\n\t */\n\tcontainsPt(x: number, y: number): boolean {\n\t\treturn x >= this.left && x <= this.right && y >= this.top && y <= this.bottom;\n\t}\n\n\tcontains(pt: Point): boolean;\n\tcontains(rc: Rect): boolean;\n\tcontains(arg: any): boolean {\n\t\tif (arg instanceof Rect) {\n\t\t\treturn arg.left >= this.left && arg.right <= this.right && arg.top >= this.top && arg.bottom <= this.bottom;\n\t\t}\n\t\telse {\n\t\t\treturn arg.x >= this.left && arg.x < this.right && arg.y >= this.top && arg.y < this.bottom;\n\t\t}\n\t}\n\n\ttouches(rc: Rect): boolean {\n\t\tif (this.left > rc.right || this.right < rc.left || this.top > rc.bottom || this.bottom < rc.top) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tinflate(dx: number, dy?: number) {\n\t\tif (dy === undefined) {\n\t\t\tdy = dx;\n\t\t}\n\n\t\tthis.left -= dx;\n\t\tthis.top -= dy;\n\t\tthis.width += dx + dx;\n\t\tthis.height += dy + dy;\n\t}\n\n\tinflatedBy(dx: number, dy?: number) {\n\t\tif (dy === undefined) {\n\t\t\tdy = dx;\n\t\t}\n\t\treturn new Rect(this.left - dx, this.top - dy, this.width + dx + dx, this.height + dy + dy);\n\t}\n\n\tcombine(rc: Rect) {\n\t\tlet left = Math.min(this.left, rc.left);\n\t\tlet top = Math.min(this.top, rc.top);\n\t\tlet right = Math.max(this.right, rc.right);\n\t\tlet bottom = Math.max(this.bottom, rc.bottom);\n\n\t\tthis.left = left;\n\t\tthis.top = top;\n\t\tthis.right = right;\n\t\tthis.bottom = bottom;\n\t}\n}\n\n/**\n * replace {0..9} by given arguments\n * @param format string\n * @param args \n * \n * @example ```ts\n * \n * console.log( sprintf( 'here is arg 1 {1} and arg 0 {0}', 'argument 0', 'argument 1' ) )\n */\n\nexport function sprintf(format: string, ...args) {\n\treturn format.replace(/{(\\d+)}/g, function (match, index) {\n\t\treturn typeof args[index] != 'undefined' ? args[index] : match;\n\t});\n}\n\n/**\n * replace special characters for display\n * @param unsafe \n * \n * console.log( escapeHtml('<div style=\"width:50px; height: 50px; background-color:red\"></div>') );\n */\nexport function escapeHtml(unsafe: string, nl_br = false): string {\n\tif (!unsafe || unsafe.length == 0) {\n\t\treturn \"\";\n\t}\n\n\tlet result = unsafe.replace(/[<>\\&\\\"\\']/g, function (c) {\n\t\treturn '&#' + c.charCodeAt(0) + ';';\n\t});\n\n\tif (nl_br) {\n\t\tresult = result.replace(/(\\r\\n|\\n\\r|\\r|\\n)/g, '<br/>');\n\t}\n\n\treturn result;\n}\n\n/**\n * replace special characters for display\n * @author Steven Levithan <http://slevithan.com/>\n * @param unsafe \n * \n * console.log( removeHtmlTags('<h1>sss</h1>') );\n */\n\nexport function removeHtmlTags(unsafe: string, nl_br = false): string {\n\t\n\tif ( unsafe===undefined || unsafe===null || !isString(unsafe) || unsafe.length == 0 ) {\n\t\treturn \"\";\n\t} \n\n\tlet ret_val = '';\n\tfor (let i = 0; i < unsafe.length; i++) {\n\t\tconst ch = unsafe.codePointAt(i);\n\t\tif (ch > 127) {\n\t\t\tret_val += '&#' + ch + ';';\n\t\t}\n\t\telse if (ch == 60/*<*/) {\n\t\t\tret_val += '&lt;'\n\t\t}\n\t\telse {\n\t\t\tret_val += unsafe.charAt(i);\n\t\t}\n\t}\n\treturn ret_val;\n}\n\n\n// :: DATES ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\nlet cur_locale: string = 'fr-FR';\n\n/**\n * change the current locale for misc translations (date...)\n * @param locale \n */\n\nexport function _date_set_locale(locale: string) {\n\tcur_locale = locale;\n}\n\n/**\n * \n * @param date \n * @param options \n * @example\n * let date = new Date( );\n * let options = { day: 'numeric', month: 'numeric', year: 'numeric', hour: 'numeric', minute: 'numeric' };\n * let text = date_format( date, options );\n */\n\nexport function date_format(date: Date, options?: any): string {\n\t//return new Intl.DateTimeFormat(cur_locale, options).format( date );\n\treturn formatIntlDate(date);\n}\n\n/**\n * \n * @param date \n * @param options \n */\n\nexport function date_diff(date1: Date, date2: Date, options?: any): string {\n\n\tvar dt = (date1.getTime() - date2.getTime()) / 1000;\n\n\t// seconds\n\tlet sec = dt;\n\tif (sec < 60) {\n\t\treturn sprintf(_tr.global.diff_date_seconds, Math.round(sec));\n\t}\n\n\t// minutes\n\tlet min = Math.floor(sec / 60);\n\tif (min < 60) {\n\t\treturn sprintf(_tr.global.diff_date_minutes, Math.round(min));\n\t}\n\n\t// hours\n\tlet hrs = Math.floor(min / 60);\n\treturn sprintf(_tr.global.diff_date_hours, hrs, min % 60);\n}\n\nexport function date_to_sql(date: Date, withHours: boolean) {\n\n\tif (withHours) {\n\t\treturn formatIntlDate(date, 'Y-M-D H:I:S');\n\t}\n\telse {\n\t\treturn formatIntlDate(date, 'Y-M-D');\n\t}\n}\n\n/**\n * construct a date from an utc date time (sql format)\n * YYYY-MM-DD HH:MM:SS\n */\n\nexport function date_sql_utc(date: string): Date {\n\tlet result = new Date(date + ' GMT');\n\treturn result;\n}\n\n\n\n/**\n * return a number that is a representation of the date\n * this number can be compared with another hash\n */\n\nexport function date_hash(date: Date): number {\n\treturn date.getFullYear() << 16 | date.getMonth() << 8 | date.getDate();\n}\n\n(<any>Date.prototype).hash = function (this: Date) {\n\treturn date_hash(this);\n}\n\n/**\n * return a copy of a date\n */\n\nexport function date_clone(date: Date): Date {\n\treturn new Date(date.getTime());\n}\n\n/**\n * return the week number of a date\n */\n\nexport function date_calc_weeknum(date: Date): number {\n\tconst firstDayOfYear = new Date(date.getFullYear(), 0, 1);\n\tconst pastDaysOfYear = (date.valueOf() - firstDayOfYear.valueOf()) / 86400000;\n\treturn Math.floor((pastDaysOfYear + firstDayOfYear.getDay() + 1) / 7);\n}\n\n\n\n/**\n * parse a date according to the given format \n * @param value - string date to parse\n * @param fmts - format list - i18 tranlation by default\n * allowed format specifiers:\n * d or D: date (1 or 2 digits)\n * m or M: month (1 or 2 digits)\n * y or Y: year (2 or 4 digits)\n * h or H: hours (1 or 2 digits)\n * i or I: minutes (1 or 2 digits)\n * s or S: seconds (1 or 2 digits)\n * <space>: 1 or more spaces\n * any other char: <0 or more spaces><the char><0 or more spaces>\n * each specifiers is separated from other by a pipe (|)\n * more specific at first\n * @example\n * 'd/m/y|d m Y|dmy|y-m-d h:i:s|y-m-d'\n */\n\nexport function parseIntlDate(value: string, fmts: string = _tr.global.date_input_formats): Date {\n\n\tlet formats = fmts.split('|');\n\tfor (let fmatch of formats) {\n\n\t\t//review: could do that only once & keep result\n\t\t//review: add hours, minutes, seconds\n\n\t\tlet smatch = '';\n\t\tfor (let c of fmatch) {\n\n\t\t\tif (c == 'd' || c == 'D') {\n\t\t\t\tsmatch += '(?<day>\\\\d{1,2})';\n\t\t\t}\n\t\t\telse if (c == 'm' || c == 'M') {\n\t\t\t\tsmatch += '(?<month>\\\\d{1,2})';\n\t\t\t}\n\t\t\telse if (c == 'y' || c == 'Y') {\n\t\t\t\tsmatch += '(?<year>\\\\d{1,4})';\n\t\t\t}\n\t\t\telse if (c == 'h' || c == 'H') {\n\t\t\t\tsmatch += '(?<hour>\\\\d{1,2})';\n\t\t\t}\n\t\t\telse if (c == 'i' || c == 'I') {\n\t\t\t\tsmatch += '(?<min>\\\\d{1,2})';\n\t\t\t}\n\t\t\telse if (c == 's' || c == 'S') {\n\t\t\t\tsmatch += '(?<sec>\\\\d{1,2})';\n\t\t\t}\n\t\t\telse if (c == ' ') {\n\t\t\t\tsmatch += '\\\\s+';\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsmatch += '\\\\s*\\\\' + c + '\\\\s*';\n\t\t\t}\n\t\t}\n\n\t\tlet rematch = new RegExp('^' + smatch + '$', 'm');\n\n\t\tlet match = rematch.exec(value);\n\n\t\tif (match) {\n\t\t\tconst now = new Date( );\n\n\t\t\tlet d = parseInt(match.groups.day ?? '1');\n\t\t\tlet m = parseInt(match.groups.month ?? '1');\n\t\t\tlet y = parseInt(match.groups.year ?? now.getFullYear()+'');\n\t\t\tlet h = parseInt(match.groups.hour ?? '0');\n\t\t\tlet i = parseInt(match.groups.min ?? '0');\n\t\t\tlet s = parseInt(match.groups.sec ?? '0');\n\n\t\t\tif (y > 0 && y < 100) {\n\t\t\t\ty += 2000;\n\t\t\t}\n\n\t\t\tlet result = new Date(y, m - 1, d, h, i, s, 0);\n\n\t\t\t// we test the vdate validity (without adjustments)\n\t\t\t// without this test, date ( 0, 0, 0) is accepted and transformed to 1969/11/31 (not fun)\n\t\t\tlet ty = result.getFullYear(),\n\t\t\t\ttm = result.getMonth() + 1,\n\t\t\t\ttd = result.getDate();\n\n\t\t\tif (ty != y || tm != m || td != d) {\n\t\t\t\t//debugger;\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t}\n\n\treturn null;\n}\n\n/**\n * format a date as string \n * @param date - date to format\n * @param fmt - format \n * format specifiers:\n * d: date \n * D: 2 digits date padded with 0\n * j: day of week short mode 'mon'\n * J: day of week long mode 'monday'\n * w: week number\n * m: month\n * M: 2 digits month padded with 0\n * o: month short mode 'jan'\n * O: month long mode 'january'\n * y or Y: year\n * h: hour (24 format)\n * H: 2 digits hour (24 format) padded with 0\n * i: minutes\n * I: 2 digits minutes padded with 0\n * s: seconds\n * S: 2 digits seconds padded with 0\n * a: am or pm\n * anything else is inserted\n * if you need to insert some text, put it between {}\n * \n * @example\n * \n * 01/01/1970 11:25:00 with '{this is my demo date formatter: }H-i*M'\n * \"this is my demo date formatter: 11-25*january\"\n */\n\nexport function formatIntlDate(date: Date, fmt: string = _tr.global.date_format) {\n\n\tif (!date) {\n\t\treturn '';\n\t}\n\n\tlet now = {\n\t\tyear: date.getFullYear(),\n\t\tmonth: date.getMonth() + 1,\n\t\tday: date.getDate(),\n\t\twday: date.getDay(),\n\t\thours: date.getHours(),\n\t\tminutes: date.getMinutes(),\n\t\tseconds: date.getSeconds(),\n\t\tmilli: date.getMilliseconds()\n\t};\n\n\n\tlet result = '';\n\tlet esc = 0;\n\n\tfor (let c of fmt) {\n\n\t\tif (c == '{') {\n\t\t\tif (++esc == 1) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\telse if (c == '}') {\n\t\t\tif (--esc == 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tif (esc) {\n\t\t\tresult += c;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (c == 'd') {\n\t\t\tresult += now.day;\n\t\t}\n\t\telse if (c == 'D') {\n\t\t\tresult += pad(now.day, -2);\n\t\t}\n\t\telse if (c == 'j') { // day short\n\t\t\tresult += _tr.global.day_short[now.wday];\n\t\t}\n\t\telse if (c == 'J') { // day long\n\t\t\tresult += _tr.global.day_long[now.wday];\n\t\t}\n\t\telse if (c == 'w') {\t// week\n\t\t\tresult += date_calc_weeknum(date);\n\t\t}\n\t\telse if (c == 'W') {\t// week\n\t\t\tresult += pad(date_calc_weeknum(date), -2);\n\t\t}\n\t\telse if (c == 'm') {\n\t\t\tresult += now.month;\n\t\t}\n\t\telse if (c == 'M') {\n\t\t\tresult += pad(now.month, -2);\n\t\t}\n\t\telse if (c == 'o') {\t// month short\n\t\t\tresult += _tr.global.month_short[now.month - 1];\n\t\t}\n\t\telse if (c == 'O') {\t// month long\n\t\t\tresult += _tr.global.month_long[now.month - 1];\n\t\t}\n\t\telse if (c == 'y' || c == 'Y') {\n\t\t\tresult += pad(now.year, -4);\n\t\t}\n\t\telse if (c == 'a' || c == 'A') {\n\t\t\tresult += now.hours < 12 ? 'am' : 'pm';\n\t\t}\n\t\telse if (c == 'h') {\n\t\t\tresult += now.hours;\n\t\t}\n\t\telse if (c == 'H') {\n\t\t\tresult += pad(now.hours, -2);\n\t\t}\n\t\telse if (c == 'i') {\n\t\t\tresult += now.minutes;\n\t\t}\n\t\telse if (c == 'I') {\n\t\t\tresult += pad(now.minutes, -2);\n\t\t}\n\t\telse if (c == 's') {\n\t\t\tresult += now.seconds;\n\t\t}\n\t\telse if (c == 'S') {\n\t\t\tresult += pad(now.seconds, -2);\n\t\t}\n\t\telse if (c == 'l') {\n\t\t\tresult += now.milli;\n\t\t}\n\t\telse if (c == 'L') {\n\t\t\tresult += pad(now.milli, -3);\n\t\t}\n\t\telse {\n\t\t\tresult += c;\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function calcAge(birth: Date, ref?: Date) {\n\tif (ref === undefined) {\n\t\tref = new Date();\n\t}\n\n\tif (!birth) {\n\t\treturn 0;\n\t}\n\n\tlet age = ref.getFullYear() - birth.getFullYear();\n\tif (ref.getMonth() < birth.getMonth() || (ref.getMonth() == birth.getMonth() && ref.getDate() < birth.getDate())) {\n\t\tage--;\n\t}\n\n\treturn age;\n}\n\n\n/**\n * date object patch\n */\n\ndeclare global {\n\tinterface Date {\n\t\thash(): number;\n\t\tclone(): Date;\n\t\tweekNum(): number;\n\t\tformat(format: string): string;\n\t\tisSameDay(date: Date): boolean;\n\t\taddDays( days: number );\n\t}\n}\n\nDate.prototype.isSameDay = function (date: Date) {\n\treturn this.getDate() == date.getDate() && this.getMonth() == date.getMonth() && this.getFullYear() == date.getFullYear();\n}\n\nDate.prototype.hash = function () {\n\treturn date_hash(this);\n}\n\nDate.prototype.clone = function () {\n\treturn date_clone(this);\n}\n\nDate.prototype.weekNum = function () {\n\treturn date_calc_weeknum(this);\n}\n\nDate.prototype.format = function (fmt: string) {\n\treturn formatIntlDate(this, fmt);\n}\n\nDate.prototype.addDays = function ( days: number ): Date {\n\tthis.setDate( this.getDate() + days );\n\treturn this;\n}\n\n\n\n// :: FILE CREATION ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\n\n/**\n * \n * @param data data to export\n * @param mimetype - 'text/plain'\n */\n\nexport function downloadData(data, mimetype: string, filename: string) {\n\n\t//if (data !== null && navigator.msSaveBlob) {\n\t//\treturn navigator.msSaveBlob(new Blob([data], { type: mimetype }), filename);\n\t//}\n\n\tlet blob = new Blob([data], { type: mimetype });\n\tlet url = window.URL.createObjectURL(blob);\n\n\tlet a = x4document.createElement(\"a\");\n\ta.style['display'] = \"none\";\n\ta.href = url;\n\ta.download = filename;\n\tx4document.body.appendChild(a);\n\n\ta.click();\n\twindow.URL.revokeObjectURL(url);\n}\n\n// :: MISC ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\n\n/**\n * check if a value is a string\n * @param val \n */\nexport function isString(val: any): val is string {\n\treturn typeof val === 'string';\n}\n\n/**\n * check is a value is an array\n * @param val \n */\nexport function isArray(val: any): val is any[] {\n\treturn val instanceof Array;\n}\n\n/**\n * \n */\n\nexport function isFunction(val: any): val is Function {\n\treturn val instanceof Function;\n}\n\n/**\n * \n */\n\nexport function isLiteralObject(val: any) {\n\treturn (!!val) && (val.constructor === Object);\n};\n\n/**\n * prepend 0 to a value to a given length\n * @param value \n * @param length \n */\n\nexport function pad(what: unknown, size: number, ch: string = '0') {\n\n\tlet value: string;\n\n\tif (!isString(what)) {\n\t\tvalue = '' + what;\n\t}\n\telse {\n\t\tvalue = what;\n\t}\n\n\tif (size > 0) {\n\t\treturn value.padEnd(size, ch);\n\t}\n\telse {\n\t\treturn value.padStart(-size, ch);\n\t}\n}\n\n\n/**\n * return true if val is a finite number\n */\n\nexport function isNumber(val: any): val is number {\n\treturn typeof val === 'number' && isFinite(val);\n}\n\n/**\n * \n * @param name \n */\n\nexport function waitFontLoading(name: string) {\n\n\t// tip for waiting font loading:\n\t// by default, body is created invisible ((opacity = 0)\n\t// we create a div inside with the font we need to wait the loading\n\t// as soon as the font is loaded, it's size will change, the browser end font loading\n\t// we can remove the div.\n\t// pitfall: if the font is already loaded, ne never end.\n\t// @review that\n\n\tlet ct = x4document.createElement('div');\n\n\tct.style.position = 'absolute';\n\tct.style.fontFamily = name;\n\tct.style.fontSize = '44px';\n\tct.style.opacity = '0.001';\n\tct.innerText = 'X';\n\n\tx4document.body.appendChild(ct);\n\n\treturn new Promise<void>((resolve) => {\n\n\t\tlet irc = ct.getBoundingClientRect();\n\t\tlet tm = setInterval(() => {\n\n\t\t\tlet nrc = ct.getBoundingClientRect();\n\t\t\tif (nrc.height != irc.height) {\n\t\t\t\tclearInterval(tm);\n\t\t\t\tx4document.body.removeChild(ct);\n\n\t\t\t\tresolve();\n\t\t\t}\n\t\t}, 0);\n\t});\n}\n\n/**\n * \n * @param fn \n * @param tm \n * \n * @example:\n * \n * defer( ( ) => {\n * \tconsole.log( x );\n * } )( );\n */\n\nexport function deferCall(fn: Function, tm = 0, ...args) {\n\tsetTimeout(fn, tm, ...args);\n}\n\n/**\n * \n */\n\nexport function asap(cb: (time: number) => void) {\n\trequestAnimationFrame(cb);\n}\n\n\n\n/**\n * micro md to html\n * \n * understand:\n * \t**bold**\n * \t*italic*\n * \n * > quote\n * - list\n * # title lvl 1\n * ## title lvl 2\n * ### title lvl 3 ...\n * \n */\n\nexport function markdownToHtml(text: string): string {\n\n\tif (!text) {\n\t\treturn '';\n\t}\n\n\tlet lines = text.split('\\n');\n\n\tlet state = 'para';\n\tlet div = 'p';\n\tlet result: string[] = [];\n\n\tlines.forEach((l) => {\n\n\t\tlet txt = l.trim();\n\n\t\tif (state == 'para') {\n\t\t\t// entree en mode list\n\t\t\tif (txt[0] == '-') {\n\t\t\t\ttxt = txt.substr(1);\n\t\t\t\tresult.push('<ul>')\n\t\t\t\tstate = 'list';\n\t\t\t\tdiv = 'li';\n\t\t\t}\n\t\t\telse if (txt[0] == '>') {\n\t\t\t\ttxt = txt.substr(1);\n\t\t\t\tresult.push('<blockquote>')\n\t\t\t\tstate = 'quote';\n\t\t\t\tdiv = 'p';\n\t\t\t}\n\t\t\telse if (txt[0] == '#') {\n\t\t\t\tlet lvl = 0;\n\t\t\t\tdo {\n\t\t\t\t\ttxt = txt.substr(1);\n\t\t\t\t\tlvl++;\n\t\t\t\t} while (txt[0] == '#' && lvl < 5);\n\n\t\t\t\tdiv = 'h' + lvl;\n\t\t\t\tstate = 'title';\n\t\t\t}\n\t\t}\n\t\telse if (state == 'list') {\n\t\t\t// sortie du mode list\n\t\t\tif (txt[0] != '-') {\n\t\t\t\tresult.push('</ul>')\n\t\t\t\tstate = 'para';\n\t\t\t\tdiv = 'p';\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttxt = txt.substr(1);\n\t\t\t}\n\t\t}\n\t\telse if (state == 'quote') {\n\n\t\t\t// sortie du mode blockquote\n\t\t\tif (txt[0] != '>') {\n\t\t\t\tresult.push('</blockquote>')\n\t\t\t\tstate = 'para';\n\t\t\t\tdiv = 'p';\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttxt = txt.substr(1);\n\t\t\t}\n\t\t}\n\n\t\tlet reBold = /\\*\\*([^*]+)\\*\\*/gi;\n\n\t\ttxt = escapeHtml(txt, false);\n\t\ttxt = txt.replace(reBold, (sub: string, ...a): string => {\n\t\t\treturn '<b>' + sub.substr(2, sub.length - 4) + '</b>';\n\t\t});\n\n\t\tlet reItalic = /\\*([^*]+)\\*/gi;\n\t\ttxt = txt.replace(reItalic, (sub: string, ...a): string => {\n\t\t\treturn '<i>' + sub.substr(1, sub.length - 2) + '</i>';\n\t\t});\n\n\t\t// keep empty lines\n\t\tif (txt == '') {\n\t\t\ttxt = '&nbsp;';\n\t\t}\n\n\t\tresult.push(`<${div}>` + txt + `</${div}>`);\n\n\t\tif (state == 'title') {\n\t\t\tstate = 'para';\n\t\t\tdiv = 'p';\n\t\t}\n\t});\n\n\tif (state == 'list') {\n\t\tresult.push('</ul>')\n\t}\n\telse if (state == 'quote') {\n\t\tresult.push('</blockquote>')\n\t}\n\n\treturn result.join('');\n}\n\n\n/**\n * \n */\n\nexport class NetworkError extends Error {\n\n\tprivate m_code: number;\n\n\tconstructor(response: Response);\n\tconstructor(code: number, text: string);\n\tconstructor(a: number | Response, b?: string) {\n\n\t\tif (a instanceof Response) {\n\t\t\tsuper(a.statusText);\n\t\t\tthis.m_code = a.status;\n\t\t}\n\t\telse {\n\t\t\tsuper(b);\n\t\t\tthis.m_code = a;\n\t\t}\n\t}\n\n\tget code(): number {\n\t\treturn this.m_code;\n\t}\n}\n\n/**\n * return the mouse pos in client coordinates\n * handle correctly touch & mouse\n */\n\nexport function getMousePos(ev: UIEvent, fromDoc: boolean): Point {\n\n\tlet x_name = 'offsetX',\n\t\ty_name = 'offsetY';\n\n\tif (fromDoc) {\n\t\tx_name = 'clientX';\n\t\ty_name = 'clientY';\n\t}\n\n\tif (ev.type == 'mousemove' || ev.type == 'mousedown' || ev.type == 'mouseup') {\n\t\tlet em = ev as MouseEvent;\n\t\treturn new Point(em[x_name], em[y_name]);\n\t}\n\telse if (ev.type == 'pointermove' || ev.type == 'pointerdown' || ev.type == 'pointerup') {\n\t\tlet em = ev as MouseEvent;\n\t\treturn new Point(em[x_name], em[y_name]);\n\t}\n\telse if (ev.type == 'touchmove' || ev.type == 'touchstart') {\n\t\tlet et = ev as TouchEvent;\n\t\treturn new Point(et.touches[0][x_name], et.touches[0][y_name]);\n\t}\n\telse if (ev.type == 'contextmenu') {\n\t\tlet em = ev as MouseEvent;\n\t\treturn new Point(em[x_name], em[y_name]);\n\t}\n\telse {\n\t\treturn new Point(0, 0);\n\t}\n}\n\n/**\n * clamp a value\n * @param v - value to clamp\n * @param min - min value\n * @param max - max value\n * @returns clamped value\n */\n\nexport function clamp(v: number, min: number, max: number) {\n\treturn Math.min(Math.max(v, min), max);\n}\n\n\n/**\n * \n */\n\nexport interface IDisposable {\n\tdispose();\n}\n\n// :: HTML strings ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\nexport class HtmlString extends String {\n\tconstructor(text: string) { super(text); }\n\n\tstatic from(text: string) {\n\t\treturn new HtmlString(text);\n\t}\n}\n\nexport function html(a, ...b): HtmlString {\n\treturn HtmlString.from(String.raw(a, ...b));\n}\n\nexport function isHtmlString(val: any): val is HtmlString {\n\treturn val instanceof HtmlString;\n}\n\n// :: CLIPBOARD ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\nexport class Clipboard {\n\tstatic copy(data: any) {\n\t\tif (navigator.clipboard) {\n\t\t\tnavigator.clipboard.writeText(JSON.stringify(data));\n\t\t}\n\t}\n\n\tstatic paste(cb: (data: string) => void) {\n\t\tif (navigator.clipboard) {\n\t\t\tnavigator.clipboard.readText().then(v => cb(v));\n\t\t}\n\t\telse {\n\t\t\tconsole.error('no clipboard, are you in https ?');\n\t\t}\n\t}\n}\n\n\n// :: CRC32 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\n/**\n * Calculates the CRC32 checksum of a string.\n * taken from: https://gist.github.com/wqli78/1330293/6d85cc967f32cccfcbad94ae7d088a3dcfc14bd9\n *\n * @param {String} str\n * @param {Boolean} hex\n * @return {String} checksum\n * @api public\n */\n\nexport function crc32(str) {\n\tlet crc = ~0;\n\tlet buf = Buffer.from( str );\n\n\tlet i = 0,\n\t\tl = buf.length;\n\twhile( i<l ) {\n crc = (crc >>> 8) ^ crc32tab[(crc ^ buf[i]) & 0xff];\n\t\ti++;\n }\n\n return (crc ^ -1)>>>0;\n}\n\nvar crc32tab = new Int32Array([\n\t0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,\n\t0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,\n\t0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,\n\t0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,\n\t0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,\n\t0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,\n\t0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,\n\t0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,\n\t0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,\n\t0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,\n\t0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,\n\t0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,\n\t0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,\n\t0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,\n\t0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,\n\t0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,\n\t0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,\n\t0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,\n\t0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,\n\t0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,\n\t0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,\n\t0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,\n\t0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,\n\t0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,\n\t0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,\n\t0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,\n\t0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,\n\t0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,\n\t0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,\n\t0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,\n\t0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,\n\t0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,\n\t0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,\n\t0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,\n\t0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,\n\t0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,\n\t0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,\n\t0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,\n\t0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,\n\t0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,\n\t0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,\n\t0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,\n\t0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,\n\t0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,\n\t0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,\n\t0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,\n\t0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,\n\t0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,\n\t0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,\n\t0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,\n\t0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,\n\t0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,\n\t0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,\n\t0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,\n\t0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,\n\t0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,\n\t0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,\n\t0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,\n\t0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,\n\t0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,\n\t0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,\n\t0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,\n\t0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,\n\t0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d\n]);\n\n\n// :: MIXINS ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\n/**\n * taken from this excellent article:\n *\thttps://justinfagnani.com/2015/12/21/real-mixins-with-javascript-classes/\n *\n * @example:\n *\tclass MyClass extends mix(MyBaseClass).with(Mixin1, Mixin2) {\n * }\n **/\n\nexport const mix = (superclass) => new MixinBuilder(superclass);\n\nclass MixinBuilder {\n\n\tprivate superclass: any;\n\n\tconstructor(superclass) {\n\t\tthis.superclass = superclass;\n\t}\n\n\twith(...mixins) {\n\t\treturn mixins.reduce((c, mixin) => mixin(c), this.superclass);\n\t}\n}\n\n/**\n * @example\n * \n * ```\n * \tconst cls = classNames( 'class1 class2', {\n * \t\t'class3': false,\n * \t\t'class4': true,\n * });\n * \n * // even shorter\n * const class1 = true, class2 = false;\n * const cls = classNames( { class1, class2 } ); // cls = \"class1\"\n * \n * ```\n * \n * @returns \n */\n\nexport function classNames(...args: (string | any)[]) {\n\n\tlet result = '';\n\n\tfor (const cls of args) {\n\t\tif (typeof cls === 'string') {\n\t\t\tresult += ' ' + cls;\n\t\t}\n\t\telse if (cls) {\n\t\t\tfor (const c in cls) {\n\t\t\t\tif (cls[c])\n\t\t\t\t\tresult += ' ' + c;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result;\n}\n\n/**\n * \n */\n\ninterface PasswordRule {\n\tchars: string;\n\tmin: number;\n}\n\nexport function generatePassword(length: number, rules?: PasswordRule[]) {\n\n\tif (!length || length == undefined) {\n\t\tlength = 8;\n\t}\n\n\tif (!rules) {\n\t\trules = [\n\t\t\t{ chars: \"abcdefghijklmnopqrstuvwxyz\", min: 3 }, // As least 3 lowercase letters\n\t\t\t{ chars: \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\", min: 2 }, // At least 2 uppercase letters\n\t\t\t{ chars: \"0123456789\", min: 2 }, // At least 2 digits\n\t\t\t{ chars: \"!@#$*|%+-_.;\", min: 2 } // At least 1 special char\n\t\t];\n\t}\n\n\tlet allChars = \"\";\n\tlet allMin = 0;\n\n\trules.forEach(function (rule) {\n\t\tallChars += rule.chars;\n\t\tallMin += rule.min;\n\t});\n\n\tif (length < allMin) {\n\t\tlength = allMin;\n\t}\n\n\trules.push({ chars: allChars, min: length - allMin });\n\n\tlet pswd = \"\";\n\trules.forEach(function (rule) {\n\t\tif (rule.min > 0) {\n\t\t\tpswd += shuffle(rule.chars, rule.min);\n\t\t}\n\t});\n\n\treturn shuffle(pswd);\n}\n\nfunction shuffle(str: string, maxlength?: number) {\n\tlet shuffled = str.split('').sort(() => {\n\t\treturn 0.5 - Math.random()\n\t}).join('');\n\n\tif (maxlength > 0) {\n\t\tshuffled = shuffled.substr(0, maxlength);\n\t}\n\n\treturn shuffled;\n}\n\n\n\n/**\n * taken from live-server \n * https://github.com/tapio/live-server\n * @param host \n * @param port \n */\n \nexport function installHMR(host = \"127.0.0.1\", port = \"9876\", reloadCallback?: Function ) {\n\n\tlet tm;\n\n\tfunction refreshCSS() {\n\n\t\tdocument.body.style.visibility = \"hidden\";\n\n\t\tlet sheets = [].slice.call(document.getElementsByTagName(\"link\"));\n\t\tlet head = document.getElementsByTagName(\"head\")[0];\n\t\t\n\t\tfor (let i = 0; i < sheets.length; ++i) {\n\t\t\tlet elem = sheets[i];\n\t\t\thead.removeChild(elem);\n\n\t\t\tlet rel = elem.rel;\n\t\t\tif (elem.href && typeof rel != \"string\" || rel.length == 0 || rel.toLowerCase() == \"stylesheet\") {\n\t\t\t\tlet url = elem.href.replace(/(&|\\?)_cacheOverride=\\d+/, '');\n\t\t\t\telem.href = url + (url.indexOf('?') >= 0 ? '&' : '?') + '_cacheOverride=' + (new Date().valueOf());\n\t\t\t}\n\t\t\t\n\t\t\thead.appendChild(elem);\n\t\t}\n\n\t\tif( tm ) { clearTimeout(tm); }\n\t\ttm = setTimeout( () => {\n\t\t\tdocument.body.style.visibility = \"unset\";\n\t\t}, 50 );\n\t}\n\n\tconst protocol = window.location.protocol === 'https:' ? 'wss://' : 'ws://';\n\tconst address = `${protocol}${host}:${port}/ws`;\t\n\tconst socket = new WebSocket(address);\n\n\tsocket.onmessage = function (msg) {\n\t\tif (msg.data == 'reload') {\n\t\t\tif( reloadCallback ) {\n\t\t\t\treloadCallback( );\n\t\t\t}\n\t\t\telse {\n\t\t\t\twindow.location.reload();\n\t\t\t}\n\t\t}\n\t\telse if (msg.data == 'refreshcss') {\n\t\t\trefreshCSS();\n\t\t}\n\t};\n\n\tconsole.log('Live reload enabled.');\n}", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file styles.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\n\nimport { pascalCase, isString, isArray } from \"./tools\";\n\n\n/**\n * -- [ @STYLESHEET ] -----------------------------------------------------------------\n */\n\nexport class Stylesheet {\n\n\tprivate m_sheet: CSSStyleSheet;\n\tprivate m_rules: Map<string, number> = new Map<string,number>( );\n\n\tconstructor() {\n\t\t\n\t\tfunction getStyleSheet( name ) : CSSStyleSheet {\n\t\t\tfor(let i=0; i<x4document.styleSheets.length; i++) {\n\t\t\t \tlet sheet = x4document.styleSheets[i];\n\t\t\t \tif(sheet.title === name ) {\n\t\t\t\t\treturn <CSSStyleSheet>sheet;\n\t\t\t \t}\n\t\t\t}\n\t\t}\n\n\t\tthis.m_sheet = getStyleSheet( '@dynamic-css' );\n\t\tif( !this.m_sheet ) {\n\t\t\tlet dom = x4document.createElement( 'style' );\n\t\t\tdom.setAttribute('id', '@dynamic-css' );\n\t\t\tx4document.head.appendChild(dom);\n\n\t\t\tthis.m_sheet = <CSSStyleSheet>dom.sheet\n\t\t}\n\t}\n\n /**\n * add a new rule to the style sheet\n * @param {string} name - internal rule name \n * @param {string} definition - css definition of the rule \n * @example\n * setRule('xbody', \"body { background-color: #ff0000; }\" );\n */\n\n\tpublic setRule(name: string, definition: any ) {\n\n\t\tif( isString(definition) ) {\n\t\t\tlet index = this.m_rules.get( name );\n\t\t\tif (index !== undefined) {\n\t\t\t\tthis.m_sheet.deleteRule(index);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tindex = this.m_sheet.cssRules.length;\n\t\t\t}\n\n\t\t\tthis.m_rules.set( name, this.m_sheet.insertRule( definition, index) );\n\t\t}\n\t\telse {\n\t\t\tlet idx = 1;\n\t\t\tfor( let r in definition ) {\n\n\t\t\t\tlet rule = r + \" { \",\n\t\t\t\t\tcss = definition[r];\n\n\t\t\t\tfor (let i in css) {\n\t\t\t\t\t\n\t\t\t\t\tlet values = css[i];\t// this is an array !\n\t\t\t\t\tfor (let j = 0; j < values.length; j++) {\n\t\t\t\t\t\trule += i + \": \" + values[j] + \"; \"\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\trule += '}';\n\n\t\t\t\t//console.log( rule );\n\t\t\t\t\n\t\t\t\tthis.setRule( name+'--'+idx, rule );\n\t\t\t\tidx++;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * return the style variable value\n\t * @param name - variable name \n\t * @example\n\t * ```\n\t * let color = Component.getCss( ).getVar( 'button-color' );\n\t * ```\n\t */\n\n\tpublic static getVar( name: string ) : any {\n\t\tif( !Stylesheet.doc_style ) {\n\t\t\tStylesheet.doc_style = getComputedStyle( x4document.documentElement );\n\t\t}\n\n\t\tif( name[0]!='-' ) {\n\t\t\tname = '--'+name;\n\t\t}\n\n \treturn Stylesheet.doc_style.getPropertyValue( name ); // #999999\n\t}\n\n\tstatic guid: number = 1;\n\tstatic doc_style: CSSStyleDeclaration;\n}\n\n\n/**\n * -- [ @CSSPARSER ] -----------------------------------------------------------------\n * \n * adaptation of jss-for-node-js\n */\n\nexport class CSSParser {\n\n\tprivate result = {};\n\n\tparse(css) {\n\t\tthis.result = {};\n\t\tthis.parse_json('', css);\n\t\treturn CSSParser.mk_string(this.result);\n\t}\n\n\tpublic static mk_string( rules: any ) {\n\n\t\t// output result:\t\n\t\tlet ret = '';\n\n\t\tfor (let a in rules) {\n\t\t\tlet css = rules[a];\n\t\t\tret += a + \" { \"\n\n\t\t\tfor (let i in css) {\n\t\t\t\t\n\t\t\t\tlet values = css[i];\t// this is an array !\n\t\t\t\tfor (let j = 0; j < values.length; j++) {\n\t\t\t\t\tret += i + \": \" + values[j] + \"; \"\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tret += \"}\\n\"\n\t\t}\n\n\t\treturn ret;\n\t}\n\n\tprivate parse_json(scope: string, css: any) {\n\n\t\tif (scope && !this.result[scope]) {\n\t\t\tthis.result[scope] = {};\n\t\t}\n\n\t\tfor (let property in css) {\n\n\t\t\tlet value = css[property];\n\n\t\t\tif ( isArray(value) ) {\n\t\t\t\tlet values = value;\n\t\t\t\tfor (let i = 0; i < values.length; i++) {\n\t\t\t\t\tthis.addProperty(scope, property, values[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t/*else if (value instanceof Color) {\n\t\t\t\tthis.addProperty(scope, property, value.toString());\n\t\t\t}*/\n\t\t\telse {\n\t\t\t\tswitch (typeof (value)) {\n\n\t\t\t\t\tcase \"number\": {\n\t\t\t\t\t\tthis.addProperty(scope, property, value);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"string\": {\n\t\t\t\t\t\tthis.addProperty(scope, property, value );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"object\": {\n\t\t\t\t\t\tthis.parse_json(this.makeSelectorName(scope, property), value);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tdefault: {\n\t\t\t\t\t\tconsole.error(\"ignoring unknown type \" + typeof (value) + \" in property \" + property);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate makePropertyName(n: string): string {\n\t\treturn pascalCase(n);\n\t}\n\n\tprivate makeSelectorName(scope: string, name: string): string {\n\n\t\tlet snames = [];\n\t\tlet names = name.split(/\\s*,\\s*/);\n\t\tlet scopes = scope.split(/\\s*,\\s*/);\n\n\t\tfor (let s = 0; s < scopes.length; s++) {\n\t\t\tlet scope = scopes[s];\n\n\t\t\tfor (let i = 0; i < names.length; i++) {\n\n\t\t\t\tlet name = names[i],\n\t\t\t\t\tsub = false;\n\n\t\t\t\tif (name.charAt(0) == \"&\") {\n\t\t\t\t\tname = name.substr(1);\n\t\t\t\t\tsub = true;\n\t\t\t\t}\n\n\t\t\t\tif (name.charAt(0) === '%') {\n\t\t\t\t\tname = '.o-' + name.substr(1);\n\t\t\t\t}\n\n\t\t\t\tif (sub) {\n\t\t\t\t\tsnames.push(scope + name)\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tsnames.push(scope ? scope + \" \" + name : name)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn snames.join(\", \");\n\t}\n\n\taddProperty(scope: string, property: string, value: any) {\n\n\t\tlet properties = property.split(/\\s*,\\s*/);\n\n\t\tfor (let i = 0; i < properties.length; i++) {\n\n\t\t\tlet property = this.makePropertyName(properties[i]);\n\n\t\t\tif (this.result[scope][property]) {\n\t\t\t\tthis.result[scope][property].push(value);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.result[scope][property] = [value];\n\t\t\t}\n\n\t\t\tlet specials = {\n\t\t\t\t\"box-shadow\": [\n\t\t\t\t\t\"-moz-box-shadow\",\n\t\t\t\t\t\"-webkit-box-shadow\"\n\t\t\t\t],\n\t\t\t\t\"border-radius\": [\n\t\t\t\t\t\"-moz-border-radius\",\n\t\t\t\t\t\"-webkit-border-radius\"\n\t\t\t\t],\n\t\t\t\t\"border-radius-topleft\": [\n\t\t\t\t\t\"-moz-border-radius-topleft\",\n\t\t\t\t\t\"-webkit-border-top-left-radius\"\n\t\t\t\t],\n\t\t\t\t\"border-radius-topright\": [\n\t\t\t\t\t\"-moz-border-radius-topright\",\n\t\t\t\t\t\"-webkit-border-top-right-radius\"\n\t\t\t\t],\n\t\t\t\t\"border-radius-bottomleft\": [\n\t\t\t\t\t\"-moz-border-radius-bottomleft\",\n\t\t\t\t\t\"-webkit-border-bottom-left-radius\"\n\t\t\t\t],\n\t\t\t\t\"border-radius-bottomright\": [\n\t\t\t\t\t\"-moz-border-radius-bottomright\",\n\t\t\t\t\t\"-webkit-border-bottom-right-radius\"\n\t\t\t\t]\n\t\t\t}\n\n\t\t\tlet browser_specials = specials[property];\n\t\t\tfor (let j = 0; browser_specials && j < browser_specials.length; j++) {\n\t\t\t\tthis.addProperty(scope, browser_specials[j], value);\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport class ComputedStyle {\n\tm_style:CSSStyleDeclaration;\n\n\tconstructor( style: CSSStyleDeclaration ) {\n\t\tthis.m_style = style;\n\t}\n\n\t/**\n\t * return the raw value\n\t */\n\n\tvalue( name: string ) : string {\n\t\tname = pascalCase( name );\n\t\treturn this.m_style[name];\n\t}\n\n\t/**\n\t * return the interpreted value\n\t */\n\t\n\tparse( name: string ) : number {\n\t\tname = pascalCase( name );\n\t\treturn parseInt( this.m_style[name] );\n\t}\n\n\t/**\n\t * \n\t */\n\n\tget style( ) {\n\t\treturn this.m_style;\n\t}\n}\n", "/**\r\n* ___ ___ __\r\n* \\ \\/ / / _\r\n* \\ / /_| |_\r\n* / \\____ _| \r\n* /__/\\__\\ |_|\r\n* \r\n * @file components.ts\r\n * @author Etienne Cochard \r\n*\r\n* Copyright (c) 2019-2023 R-libre ingenierie\r\n*\r\n* Permission is hereby granted, free of charge, to any person obtaining a copy \r\n* of this software and associated documentation files (the \"Software\"), to deal \r\n* in the Software without restriction, including without limitation the rights \r\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \r\n* of the Software, and to permit persons to whom the Software is furnished to do so, \r\n* subject to the following conditions:\r\n* The above copyright notice and this permission notice shall be included in all copies\r\n* or substantial portions of the Software.\r\n*\r\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \r\n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \r\n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \r\n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \r\n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n */\r\n\r\n\r\n/**\r\n * @todo \r\n *\t\tcreate Container class\r\n */\r\n\r\nimport { pascalCase, Rect, isString, isArray, Size, isNumber, asap, HtmlString, isHtmlString, Constructor, getMousePos } from './tools';\r\nimport { x4document } from './x4dom';\r\n\r\nimport { Stylesheet, ComputedStyle } from './styles';\r\nimport { _tr } from './i18n';\r\nimport { BasicEvent, EventCallback } from './x4events';\r\nimport { BaseComponent, BaseComponentProps, BaseComponentEventMap } from './base_component';\r\nimport { IDOMEvents, X4ElementEventMap } from './dom_events';\r\n\r\nexport { HtmlString, isHtmlString, html } from './tools'\r\n\r\nexport interface EventHandler<T> {\r\n\t(ev: T): any;\r\n}\r\n\r\nexport interface ICaptureInfo {\r\n\tinitiator: Component;\r\n\thandler: EventHandler<UIEvent>;\r\n\tiframes: NodeListOf<HTMLIFrameElement>;\r\n}\r\n\r\n/** @ignore classname prefix for system classes */\r\nconst _x4_ns_prefix = 'x-';\r\n\r\n// -- elements -----------\r\n\r\n/** @ignore where event handlers are stored */\r\nconst _x4_el_store = Symbol();\r\n\r\n/** @ignore where Component is stored in dom */\r\nconst _x4_el_sym = Symbol();\r\n\r\n/** @ignore properties without 'px' unit */\r\nexport const _x4_unitless = {\r\n\tanimationIterationCount: 1, borderImageOutset: 1, borderImageSlice: 1, borderImageWidth: 1, boxFlex: 1, boxFlexGroup: 1,\r\n\tboxOrdinalGroup: 1, columnCount: 1, flex: 1, flexGrow: 1, flexPositive: 1, flexShrink: 1, flexNegative: 1, flexOrder: 1,\r\n\tgridRow: 1, gridColumn: 1, fontWeight: 1, lineClamp: 1, lineHeight: 1, opacity: 1, order: 1, orphans: 1, tabSize: 1, widows: 1,\r\n\tzIndex: 1, zoom: 1,\r\n\r\n\t// SVG-related _properties\r\n\tfillOpacity: 1, floodOpacity: 1, stopOpacity: 1, strokeDasharray: 1, strokeDashoffset: 1, strokeMiterlimit: 1, strokeOpacity: 1,\r\n\tstrokeWidth: 1,\r\n};\r\n\r\n/** @ignore this events must be defined on domNode (do not bubble) */\r\nconst unbubbleEvents = {\r\n\tmouseleave: 1, mouseenter: 1, load: 1, unload: 1, scroll: 1, focus: 1, blur: 1, rowexit: 1, beforeunload: 1, stop: 1,\r\n\tdragdrop: 1, dragenter: 1, dragexit: 1, draggesture: 1, dragover: 1, contextmenu: 1, create: 2, sizechange: 2\r\n};\r\n\r\n/** @ignore */\r\nconst passiveEvents = {\r\n\ttouchstart: 1, touchmove: 1, touchend: 1, \r\n\t//pointerdown: 1, pointermove: 1, pointerup: 1,\r\n};\r\n\r\n/** ignore */\r\nconst reNumber = /^-?\\d+(\\.\\d+)?$/;\r\n\r\n\r\n/**\r\n * \r\n */\r\n\r\nexport type VoidCallback = () => void;\r\n\r\nexport type ComponentOrString = Component | string | HtmlString;\r\nexport type ComponentContent = ComponentOrString | ComponentOrString[];\r\n\r\ninterface IMap<T> {\r\n\t[key: string]: T;\r\n}\r\n\r\n/**\r\n * DblClick Event\r\n * double click event \r\n */\r\n\r\nexport interface EvDblClick extends BasicEvent {\r\n}\r\n\r\nexport function EvDblClick(context = null) {\r\n\treturn BasicEvent<EvDblClick>({ context });\r\n}\r\n\r\n/**\r\n * DblFocus Event\r\n * double click event \r\n */\r\n\r\nexport interface EvFocus extends BasicEvent {\r\n\treadonly focus: boolean;\r\n}\r\n\r\nexport function EvFocus( focus = true, context = null) {\r\n\treturn BasicEvent<EvFocus>({ focus, context });\r\n}\r\n\r\n/**\r\n * basic event map of Component\r\n */\r\n\r\nexport interface CEventMap extends BaseComponentEventMap {\r\n}\r\n\r\n\r\n\r\n\r\n/**\r\n * Basic properties of every Component\r\n */\r\n\r\nexport interface CProps<T extends CEventMap = CEventMap> extends BaseComponentProps<T> {\r\n\ttag?: string;\t\t\t// dom Tag <div> if not specified\r\n\tns?: string;\t\t\t// namespace (usefull for svg)\r\n\tcls?: string;\t\t\t// elements classes (space separated), prefix class name with @ to make it system wide\r\n\tid?: string;\t\t\t// element id\r\n\tstyle?: IMap<string | number>;\t// element style\r\n\tattrs?: object;\t\t\t// element attributes\r\n\r\n\tdom_events?: IDOMEvents;\t// DOM event handlers\r\n\tdata?: any;\t\t\t\t// element user data (you can store everything you need here)\r\n\tcontent?: ComponentContent;\t// array of sub components\r\n\ttooltip?: string;\t\t// tooltip text\r\n\tref?: string;\t\t\t// internal reference for itemWithRef\r\n\r\n\t// shortcuts for element style\r\n\tleft?: number;\r\n\ttop?: number;\r\n\twidth?: number | string;\r\n\theight?: number | string;\r\n\ttabIndex?: number | boolean;\r\n\r\n\tflex?: number | string;\t// add @flex class to the element\r\n\tenabled?: boolean;\t\t// add @disabled to the element if false\r\n}\r\n\r\ninterface DomListener {\r\n\tlistener: EventListener,\r\n\tpassive?: boolean\r\n}\r\n\r\ninterface CInternalProps {\r\n\tdom_events: Record<string,DomListener[]>;\r\n\tclasses: IMap<boolean>;\r\n\tuid: number;\r\n\tcreated: boolean;\r\n\tinrender: boolean;\r\n}\r\n\r\n/**\r\n * \r\n */\r\n\r\nexport class Component<P extends CProps<CEventMap> = CProps<CEventMap>, E extends CEventMap = CEventMap> extends BaseComponent<P, E> {\r\n\tprivate m_dom: HTMLElement;\r\n\tprivate m_iprops: CInternalProps;\r\n\r\n\tprivate static __sb_width;\t\t\t// scrollbar width\r\n\tprivate static __comp_guid = 1000;\t// component global unique id\r\n\tprivate static __privateEvents: any = {};\r\n\tprivate static __sizeObserver: ResizeObserver;\t// resize observer\r\n\tprivate static __createObserver: MutationObserver;\t// creation observer\r\n\t//private static __intersectionObserver: IntersectionObserver;\t// visibility observer\r\n\r\n\tprivate static __capture: ICaptureInfo = null;\r\n\tprivate static __capture_mask = null;\r\n\tprivate static __css = null;\r\n\r\n\tconstructor(props: P = null ) {\r\n\t\tsuper(props ?? {} as P );\r\n\r\n\t\tthis.m_iprops = {\r\n\t\t\tclasses: {},\r\n\t\t\tdom_events: {},\r\n\t\t\tuid: Component.__comp_guid++,\r\n\t\t\tinrender: false,\r\n\t\t\tcreated: false,\r\n\t\t};\r\n\r\n\t\t// prepare iprops\r\n\t\tif( this.m_props.cls ) {\r\n\t\t\tthis.addClass( this.m_props.cls );\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * \r\n\t */\r\n\r\n\tget uid() {\r\n\t\treturn this.m_iprops.uid;\r\n\t}\r\n\r\n\t/**\r\n\t * change the component content\r\n\t * @param content new content or null\r\n\t */\r\n\r\n\tsetContent(content: ComponentContent, refreshAll = false ) {\r\n\t\tthis.m_props.content = content ?? [];\r\n\r\n\t\tif( this.m_iprops.inrender || !this.m_dom ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (refreshAll) {\r\n\t\t\tthis.update();\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis._updateContent();\r\n\t\t}\r\n\t}\r\n\r\n\tgetContent( ) {\r\n\t\treturn this.m_props.content;\r\n\t}\r\n\r\n\t/**\r\n\t * add a new child to the component content\r\n\t * @param content \r\n\t */\r\n\r\n\tappendChild(content: ComponentContent) {\r\n\r\n\t\tif (!content) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst append = (c) => {\r\n\r\n\t\t\tif (!this.m_props.content) {\r\n\t\t\t\tthis.m_props.content = [];\r\n\t\t\t}\r\n\t\t\telse if (!isArray(this.m_props.content)) {\r\n\t\t\t\tthis.m_props.content = [this.m_props.content];\r\n\t\t\t}\r\n\r\n\t\t\tthis.m_props.content.push(c);\r\n\t\t\tif (this.m_dom) {\r\n\t\t\t\tthis._appendChild(c);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (isArray(content)) {\r\n\t\t\tcontent.forEach(append);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tappend(content);\r\n\t\t}\r\n\t}\r\n\r\n\tremoveChild( item: Component ) {\r\n\t\tif( this.m_props.content ) {\r\n\t\t\tif (!isArray(this.m_props.content)) {\r\n\t\t\t\tthis.m_props.content = [this.m_props.content];\r\n\t\t\t}\r\n\r\n\t\t\tthis.m_props.content = this.m_props.content.filter( x => x!==item );\r\n\t\t}\r\n\r\n\t\tif( this.dom && item.dom ) {\r\n\t\t\tthis.dom.removeChild( item.dom );\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * \r\n\t */\r\n\r\n\tsetTag( tag: string, namespace?: string ) {\r\n\t\tthis.m_props.tag = tag;\r\n\t\tif( namespace ) {\r\n\t\t\tthis.m_props.ns = namespace;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * get the Component data value\r\n\t * @param name name to get\r\n\t */\r\n\r\n\tgetData(name: string | Symbol): any {\r\n\t\tif (this.m_props.data !== undefined) {\r\n\t\t\treturn this.m_props.data[name.toString()];\r\n\t\t}\r\n\r\n\t\treturn undefined;\r\n\t}\r\n\r\n\t/**\r\n\t * set the Component data value\r\n\t * @param name name to get\r\n\t * @param value\r\n\t */\r\n\r\n\tsetData(name: string | Symbol , value: any) {\r\n\r\n\t\tlet data = this.m_props.data;\r\n\t\tif (data === undefined) {\r\n\t\t\tdata = this.m_props.data = {};\r\n\t\t}\r\n\r\n\t\tdata[name.toString()] = value;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * return the DOM associated with the Component (if any)\r\n\t */\r\n\r\n\tget dom(): HTMLElement {\r\n\t\treturn this.m_dom;\r\n\t}\r\n\r\n\t/**\r\n\t * shows the element\r\n\t * @param show\r\n\t */\r\n\r\n\tshow(show?: boolean) {\r\n\t\tif (show === undefined || show === true) {\r\n\t\t\tthis.removeClass('@hidden');\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.addClass('@hidden');\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * hides the element\r\n\t */\r\n\thide() {\r\n\t\tthis.addClass('@hidden');\r\n\t}\r\n\r\n\t/**\r\n\t * enable or disable the element\r\n\t * @param enable \r\n\t */\r\n\r\n\tenable(enable?: boolean) {\r\n\t\tif (enable === undefined || enable === true) {\r\n\t\t\tthis.removeClass('@disable');\r\n\t\t\tthis.removeAttribute('disabled');\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.disable();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * disable the element\r\n\t */\r\n\r\n\tdisable() {\r\n\t\tthis.addClass('@disable');\r\n\t\tthis.setAttribute('disabled', '');\r\n\t}\r\n\r\n\t/**\r\n\t * set the focus on the element\r\n\t */\r\n\r\n\tfocus() {\r\n\t\tconsole.assert(!!this.m_dom);\r\n\t\tthis.m_dom.focus();\r\n\t}\r\n\r\n\t/**\r\n\t * change the object style\r\n\t * @param style - style to add\r\n\t * @example ```typescript\r\n\t * el.setStyle( {left:100} );\r\n\t */\r\n\r\n\tpublic setStyle(style: object) {\r\n\t\tfor (let s in style) {\r\n\t\t\tthis.setStyleValue(s, style[s]);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * change a style value\r\n\t * @param name string style nale\r\n\t * @param value any style value or null to remove style\r\n\t */\r\n\r\n\tsetStyleValue(name: string, value: any) {\r\n\t\tlet style = this.m_props.style;\r\n\t\tif (!style) {\r\n\t\t\tstyle = this.m_props.style = {};\r\n\t\t}\r\n\r\n\t\tstyle[name] = value;\r\n\t\tthis._setDomStyleValue(name, value);\r\n\t}\r\n\r\n\tprivate _setDomStyleValue(name: string, value: string | number) {\r\n\t\tif (this.m_dom) {\r\n\r\n\t\t\tif (value === undefined) {\r\n\t\t\t\tvalue = null;\r\n\t\t\t}\r\n\t\t\telse if (!_x4_unitless[name] && (isNumber(value) || reNumber.test(value))) {\r\n\t\t\t\tvalue = value + 'px';\r\n\t\t\t}\r\n\r\n\t\t\tthis.m_dom.style[name] = value;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * compute the element style \r\n\t * @return all styles computed\r\n\t */\r\n\r\n\tpublic getComputedStyle(pseudoElt?: string): ComputedStyle {\r\n\t\tif (this.dom) {\r\n\t\t\treturn new ComputedStyle(getComputedStyle(this.dom, pseudoElt ?? null));\r\n\t\t}\r\n\r\n\t\treturn new ComputedStyle(this.m_props.style as any);\r\n\t}\r\n\r\n\t/**\r\n\t * return a single stype value\r\n\t * @param name - value to get\r\n\t */\r\n\r\n\tpublic getStyleValue(name: string) {\r\n\t\treturn this.getComputedStyle()[name];\r\n\t}\r\n\r\n\t/**\r\n\t * define the elements attributes\r\n\t * @param attrs \r\n\t */\r\n\r\n\tpublic setAttributes(attrs: any) {\r\n\t\tfor (let a in attrs) {\r\n\t\t\tthis.setAttribute(a, attrs[a]);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * change a single attribute\r\n\t * @param name attribute name\r\n\t * @param value new value \r\n\t */\r\n\r\n\tpublic setAttribute(name: string, value: any) {\r\n\r\n\t\tif (value === false || value === undefined) {\r\n\t\t\tthis.removeAttribute(name);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tif (value === true) {\r\n\t\t\t\tvalue = '';\r\n\t\t\t}\r\n\t\t\telse if (isNumber(value)) {\r\n\t\t\t\tvalue = '' + value;\r\n\t\t\t}\r\n\r\n\t\t\tlet attrs = this.m_props.attrs;\r\n\t\t\tif (!attrs) {\r\n\t\t\t\tattrs = this.m_props.attrs = {};\r\n\t\t\t}\r\n\r\n\t\t\tattrs[name] = value;\r\n\t\t\tthis._setDomAttribute(name, value);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate _setDomAttribute(name: string, value: string) {\r\n\t\tif (this.m_dom) {\r\n\t\t\tthis.m_dom.setAttribute(name, value);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * remove an atrribute\r\n\t * @param name name of the attribute\r\n\t */\r\n\tpublic removeAttribute(name: string) {\r\n\t\tlet attrs = this.m_props.attrs;\r\n\t\tif (!attrs) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tdelete attrs[name];\r\n\r\n\t\tif (this.m_dom) {\r\n\t\t\tthis.m_dom.removeAttribute(name);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * get an attribute value\r\n\t * @param {string} name - attribute name\r\n\t * @return {string} attribute value\r\n\t * @example ```typescript\r\n\t * let chk = el.getAttribute( 'checked' );\r\n\t * @review double cache\r\n\t */\r\n\r\n\tpublic getAttribute(name: string): string {\r\n\t\tif (this.m_dom) {\r\n\t\t\treturn this.m_dom.getAttribute(name);\r\n\t\t}\r\n\t\telse {\r\n\t\t\t//todo move to attrs\r\n\t\t\tif( name=='id' ) {\r\n\t\t\t\treturn this.m_props.id;\r\n\t\t\t}\r\n\r\n\t\t\treturn this.m_props.attrs ? this.m_props.attrs[name] : undefined;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * check if the element has an attribute\r\n\t * @param name attribute name\r\n\t * @return true is attribute is present\r\n\t * @example ```typescript\r\n\t * if( el.hasAttribute('checked') ) {\r\n\t * }\r\n\t */\r\n\r\n\tpublic hasAttribute(name: string): boolean {\r\n\t\tif (this.m_dom) {\r\n\t\t\treturn this.m_dom.hasAttribute(name);\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn this.m_props.attrs.hasOwnProperty(name);\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * a some classnames to the component\r\n\t * classes can be separated by a space\r\n\t * @param cls class to add\r\n\t * @example ```typescript\r\n\t * addClass( 'my class name @flex' );\r\n\t */\r\n\r\n\tpublic addClass(name: string) {\r\n\r\n\t\tif (name === null || name === undefined) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tname = name.trim();\r\n\t\tif (name === '') {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet add = (c) => {\r\n\r\n\t\t\tif (c === undefined || c === null || c === '') {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tc = this._makeCls(c);\r\n\r\n\t\t\t// update vdom\r\n\t\t\tclasses[c] = true;\r\n\r\n\t\t\t// update dom\r\n\t\t\tif (this.m_dom) {\r\n\t\t\t\tthis.m_dom.classList.add(c);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlet classes = this.m_iprops.classes;\r\n\t\tif (name.indexOf(' ') < 0) {\r\n\t\t\tadd(name);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tlet names = name.split(' ');\r\n\t\t\tnames.forEach((n) => add(n));\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Remove a class from the element\r\n\t * @param {string|array} name - classes in string form can be space separated\r\n\t * \r\n\t * @example ```typescript\r\n\t * el.removeClass( 'myclass' );\r\n\t * el.removeClass( 'myclass1 myclass2' );\r\n\t */\r\n\r\n\tpublic removeClass(name: string): void {\r\n\r\n\t\tif (name === undefined) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet remove = (c) => {\r\n\t\t\tif (c === undefined || c === null || c === '') {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tc = this._makeCls(c);\r\n\r\n\t\t\tdelete this.m_iprops.classes[c];\r\n\t\t\tif (this.m_dom) {\r\n\t\t\t\tthis.m_dom.classList.remove(c);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// faster\r\n\t\tif (name.indexOf(' ') < 0) {\r\n\t\t\tremove(name);\r\n\t\t}\r\n\t\telse {\r\n\t\t\t// build class list\r\n\t\t\tlet classes = name.trim().split(' ');\r\n\t\t\tfor (let c of classes) {\r\n\t\t\t\tif (c !== undefined && c !== null && c !== '') {\r\n\t\t\t\t\tremove(c);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * \r\n\t * @param cls \r\n\t * @param set \r\n\t */\r\n\r\n\tpublic setClass(cls: string, set: boolean) {\r\n\t\tif (set) { this.addClass(cls); }\r\n\t\telse { this.removeClass(cls); }\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * Toggle a class from the element (if present remove, if absent add)\r\n\t * @param {string|string[]} name - classes in string form can be space separated\r\n\t * @example ```typescript\r\n\t * el.toggleClass( 'myclass' );\r\n\t * el.toggleClass( 'myclass1 myclass2');\r\n\t * el.toggleClass( ['myclass1','myclass2']);\r\n\t */\r\n\r\n\tpublic toggleClass(name: string): void {\r\n\r\n\t\tlet toggle = (c) => {\r\n\t\t\tif (c === undefined && c === null && c === '') {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tc = this._makeCls(c);\r\n\t\t\tif (this.m_iprops.classes[c]) {\r\n\t\t\t\tdelete this.m_iprops.classes[c]\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tthis.m_iprops.classes[c] = true;\r\n\t\t\t}\r\n\r\n\t\t\tif (this.m_dom) {\r\n\t\t\t\tthis.m_dom.classList.toggle(c);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// faster\r\n\t\tif (name.indexOf(' ') < 0) {\r\n\t\t\ttoggle(name);\r\n\t\t}\r\n\t\telse {\r\n\r\n\t\t\t// build class list\r\n\t\t\tlet classes = name.trim().split(' ');\r\n\t\t\tfor (let c of classes) {\r\n\t\t\t\ttoggle(c);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * check if the object has the class\r\n\t * @param cls \r\n\t */\r\n\r\n\tpublic hasClass(cls: string): boolean {\r\n\r\n\t\tlet c = this._makeCls(cls);\r\n\t\tif (this.m_dom) {\r\n\t\t\treturn this.dom.classList.contains(c);\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn !!this.m_iprops.classes[c];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * remove all classes from the object \r\n\t * this is usefull for component recycling & reusing\r\n\t */\r\n\r\n\tpublic clearClasses() {\r\n\t\tthis.m_iprops.classes = {};\r\n\t\tif (this.m_dom) {\r\n\t\t\treturn this.m_dom.classList.value = '';\r\n\t\t}\r\n\t}\r\n\r\n\tpublic _build(): HTMLElement {\r\n\t\tif (this.m_dom) {\r\n\t\t\treturn this.m_dom;\r\n\t\t}\r\n\r\n\t\tthis._createDOM();\r\n\t\treturn this.m_dom;\r\n\t}\r\n\r\n\tpublic render(props: P) {\r\n\t}\r\n\r\n\tpublic _createDOM(): HTMLElement {\r\n\r\n\t\tif (this.m_dom) {\r\n\t\t\treturn this.m_dom;\r\n\t\t}\r\n\r\n\t\t// setup props\r\n\t\tconst props = this.m_props;\r\n\r\n\t\tif( props.tabIndex!==undefined ) {\r\n\t\t\tthis._setTabIndex( props.tabIndex );\r\n\t\t}\r\n\t\tthis.render(props);\r\n\t\t\r\n\t\t// shortcuts ---------\r\n\t\tif (props.left !== undefined) { this.setStyleValue('left', props.left); }\r\n\t\tif (props.top !== undefined) { this.setStyleValue('top', props.top); }\r\n\t\tif (props.width !== undefined) { this.setStyleValue('width', props.width); }\r\n\t\tif (props.height !== undefined) { this.setStyleValue('height', props.height); }\r\n\r\n\t\tif (props.flex !== undefined) {\r\n\t\t\tthis.addClass('@flex');\r\n\t\t\tif (props.flex != 1) {\r\n\t\t\t\tthis.setStyleValue('flex', props.flex);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (props.enabled === false) {\r\n\t\t\tthis.disable();\r\n\t\t}\r\n\r\n\t\t// shortcut: tip\r\n\t\tif (props.tooltip !== undefined) {\r\n\t\t\tthis.setAttribute('tip', props.tooltip.replace(/\\n/gi, '<br/>'));\r\n\t\t}\r\n\r\n\r\n\t\t// prepare iprops\r\n\t\tif (props.dom_events) {\r\n\t\t\tfor (let ename in props.dom_events) {\r\n\t\t\t\tthis._setDomEvent(ename, props.dom_events[ename]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._genClassName();\r\n\t\tthis.m_props.cls = undefined;\t// now classes are tranfered to m_iprops\r\n\r\n\t\t// create self\r\n\t\tlet vdom = this.m_iprops;\r\n\r\n\t\tif (props.ns) {\r\n\t\t\tthis.m_dom = <HTMLElement>x4document.createElementNS(props.ns, props.tag ?? 'div');\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.m_dom = x4document.createElement( (props.tag ?? 'div') as any );\r\n\t\t}\r\n\r\n\t\tthis.m_dom[_x4_el_sym] = this;\r\n\r\n\t\t//let me = Object.getPrototypeOf(this);\r\n\t\t//console.log( 'create', this.m_iprops.uid, me.constructor.name );\r\n\r\n\t\t// classes\r\n\t\tthis.m_dom.classList.add(...Object.keys(vdom.classes));\r\n\r\n\t\t// styles\r\n\t\tlet sty = props.style;\r\n\t\tif (sty) {\r\n\t\t\tfor (let s in sty) {\r\n\t\t\t\tthis._setDomStyleValue(s, sty[s]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// attributes\r\n\t\tlet att = props.attrs;\r\n\t\tif (att) {\r\n\t\t\tfor (let a in att) {\r\n\t\t\t\tconst attr = att[a];\r\n\t\t\t\tif( attr!==false && attr!==undefined ) {\r\n\t\t\t\t\tthis._setDomAttribute(a, att[a]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// special properties\r\n\t\tif (this.m_props.id) {\r\n\t\t\tthis._setDomAttribute('id', this.m_props.id);\r\n\t\t}\r\n\r\n\t\t// events\r\n\t\tlet evt = this.m_iprops.dom_events;\r\n\t\tif (evt) {\r\n\t\t\tfor (let e in evt) {\r\n\t\t\t\tlet handlers = evt[e];\r\n\t\t\t\tfor (let h of handlers) {\r\n\t\t\t\t\tthis._createEvent(e, h.listener, h.passive );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// create children\r\n\t\tlet content = props.content;\r\n\t\tif (content) {\r\n\r\n\t\t\tif (!isArray(content)) {\r\n\t\t\t\tcontent = [content];\r\n\t\t\t}\r\n\r\n\t\t\tcontent.forEach((el) => {\r\n\t\t\t\tif (!el) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (isString(el)) {\r\n\t\t\t\t\tthis.m_dom.insertAdjacentText('beforeend', el);\r\n\t\t\t\t}\r\n\t\t\t\telse if (isHtmlString(el)) {\r\n\t\t\t\t\tthis.m_dom.insertAdjacentHTML('beforeend', el as string);\r\n\t\t\t\t}\r\n\t\t\t\telse if (el instanceof Component) {\r\n\t\t\t\t\tthis.m_dom.append(el._build());\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tconsole.log( 'unknown element type: ', el );\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// wait for dom insertion inside document.body\r\n\t\tif (!Component.__createObserver) {\r\n\t\t\tComponent.__createObserver = new MutationObserver(Component._observeCreation);\r\n\t\t\tComponent.__createObserver.observe(x4document.body, { childList: true, subtree: true });\r\n\t\t}\r\n\r\n\t\treturn this.m_dom;\r\n\t}\r\n\r\n\tprotected _setTabIndex(tabIndex: number | boolean, defValue = 0) {\r\n\r\n\t\tif (tabIndex === true) {\r\n\t\t\ttabIndex = 0;\r\n\t\t}\r\n\t\telse if (tabIndex === undefined) {\r\n\t\t\ttabIndex = defValue;\r\n\t\t}\r\n\r\n\t\tif (tabIndex !== false && tabIndex !== undefined) {\r\n\t\t\tthis.setAttribute('tabindex', tabIndex);\r\n\t\t}\r\n\r\n\t\tthis.m_props.tabIndex = tabIndex;\r\n\t}\r\n\r\n\tprivate static _observeCreation(mutations: MutationRecord[]) {\r\n\r\n\t\t// notify descendants that we have been created (dom exists)\r\n\r\n\t\tconst notify = ( c: Component ) => {\r\n\r\n\t\t\tif( !c.m_iprops.created ) {\r\n\t\t\t\tif (c.dom && c.m_iprops.dom_events && c.m_iprops.dom_events.create) {\r\n\t\t\t\t\tc.dom.dispatchEvent(new Event('create'));\r\n\t\t\t\t}\r\n\t\t\r\n\t\t\t\tc.componentCreated();\r\n\t\t\t\tc.m_iprops.created = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfor (let mutation of mutations) {\r\n\r\n\t\t\tif (mutation.type == 'childList') {\r\n\r\n\t\t\t\tfor (let i = 0, n = mutation.addedNodes.length; i < n; i++) {\r\n\r\n\t\t\t\t\tlet add = mutation.addedNodes[i] as HTMLElement;\r\n\t\t\t\t\tlet el = add[_x4_el_sym] as Component;\r\n\r\n\t\t\t\t\tif (el) {\r\n\t\t\t\t\t\tel.enumChilds((c: Component) => {\r\n\t\t\t\t\t\t\tnotify( c );\r\n\t\t\t\t\t\t}, true);\r\n\r\n\t\t\t\t\t\tnotify( el );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t\r\n\t}\r\n\r\n\tpublic dispose() {\r\n\t\tif (this.m_dom) {\r\n\t\t\tthis._dispose(true,true);\r\n\t\t}\r\n\t}\r\n\r\n\tprotected _dispose(with_dom: boolean, timers: boolean ) {\r\n\r\n\t\tlet _dom = this.m_dom;\r\n\r\n\t\t// free attached resources\r\n\t\tdelete _dom[_x4_el_sym];\r\n\t\tdelete _dom[_x4_el_store];\r\n\r\n\t\t//\r\n\t\tif (with_dom) {\r\n\t\t\t_dom.remove();\r\n\t\t}\r\n\r\n\t\t// notify every child that they will be removed\r\n\t\tthis.enumChilds((c: Component) => {\r\n\t\t\tc._dispose(false,true);\r\n\t\t});\r\n\r\n\t\tthis.m_dom = null;\r\n\r\n\t\tif( timers ) {\r\n\t\t\tthis.disposeTimers();\r\n\t\t}\r\n\r\n\t\tthis.componentDisposed();\r\n\t\tthis.m_iprops.created = false;\r\n\t\t// todo: pb on update this.removeAllListeners( null );\r\n\t}\r\n\r\n\tcomponentDisposed() {\r\n\t}\r\n\r\n\tcomponentCreated() {\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t/**\r\n\t * \r\n\t */\r\n\r\n\tpublic update(delay = 0) {\r\n\r\n\t\tif (this.m_dom) {\r\n\r\n\t\t\tconst _update = () => {\r\n\t\t\t\tlet oldDOM = this.m_dom;\r\n\t\t\t\tthis._dispose(false,false);\r\n\r\n\t\t\t\tlet newDOM = this._build();\r\n\t\t\t\tconsole.assert( !!oldDOM.parentNode, 'update in componentCreated is not allowed, use updateContent' );\r\n\r\n\t\t\t\toldDOM.parentNode.replaceChild(newDOM, oldDOM);\r\n\t\t\t}\r\n\r\n\t\t\tif (delay) {\r\n\t\t\t\tthis.singleShot(_update, delay);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t_update();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * empty the node\r\n\t */\r\n\tpublic _empty( ) {\r\n\t\t//this.m_dom.innerHTML = '';\r\n\t\t\r\n\t\tconst el = this.m_dom;\r\n\t\tif( !el ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\twhile (el.firstChild) {\r\n\t\t\tel.removeChild(el.firstChild);\r\n\t\t}\r\n\t}\r\n\r\n\tpublic _updateContent() {\r\n\r\n\t\tif (!this.m_dom) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._empty( );\r\n\r\n\t\tlet content = this.m_props.content;\r\n\r\n\t\t// create children\r\n\t\tif (content) {\r\n\r\n\t\t\tif (!isArray(content)) {\r\n\t\t\t\tcontent = [content];\r\n\t\t\t}\r\n\r\n\t\t\tcontent.forEach((el) => {\r\n\t\t\t\tif (!el) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (isHtmlString(el)) {\r\n\t\t\t\t\tthis.m_dom.insertAdjacentHTML('beforeend', el as string);\r\n\t\t\t\t}\r\n\t\t\t\telse if (el instanceof Component) {\r\n\t\t\t\t\tthis.m_dom.append(el._build());\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tthis.m_dom.insertAdjacentText('beforeend', el + '');\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * @return the bounding rectangle\r\n\t * @example ```typescript\r\n\t * let rc = el.getBoundingRect( );\r\n\t * console.log( rc.left, rc.top, rc.right, rc.bottom );\r\n\t */\r\n\r\n\tpublic getBoundingRect(withMargins = false): Rect {\r\n\t\tconsole.assert(this.dom != null, 'cannot get bounding rect of an non DOM element');\r\n\t\tlet r = this.dom.getBoundingClientRect();\r\n\r\n\t\tlet rc = new Rect(r.left, r.top, r.width, r.height);\r\n\r\n\t\tif (withMargins) {\r\n\r\n\t\t\tlet st = this.getComputedStyle();\r\n\r\n\t\t\tlet tm = st.parse('marginTop'),\r\n\t\t\t\tbm = st.parse('marginBottom'),\r\n\t\t\t\tlm = st.parse('marginLeft'),\r\n\t\t\t\trm = st.parse('marginRight');\r\n\r\n\t\t\trc.left -= lm;\r\n\t\t\trc.width += lm + rm;\r\n\r\n\t\t\trc.top -= tm;\r\n\t\t\trc.height += tm + bm;\r\n\t\t}\r\n\r\n\t\treturn rc;\r\n\t}\r\n\r\n\t/**\r\n\t * append a new dom event handler\r\n\t * @param name - you can specify multiple names separated by a space\r\n\t * @param handler \r\n\t * @example\r\n\t * \r\n\t * this.setDomEvent( 'drag drop', this._handleDrag, this );\r\n\t * this.setDomEvent( 'dblclick', this._handleDblClick, this );\r\n\t */\r\n\r\n\tpublic setDomEvent<K extends keyof X4ElementEventMap>(type: K, listener: (this: HTMLDivElement, ev: X4ElementEventMap[K]) => void, passive?: boolean ) {\r\n\t\tlet _listener = listener as EventListener;\r\n\t\tthis._setDomEvent(type as string, _listener, passive);\r\n\t}\r\n\r\n\tprivate _setDomEvent(type: string, listener: EventListener, passive?: boolean) {\r\n\r\n\t\t// add event to the vdom\r\n\t\tif (!this.m_iprops.dom_events) {\r\n\t\t\tthis.m_iprops.dom_events = {};\r\n\t\t}\r\n\r\n\t\tlet listeners = this.m_iprops.dom_events[type];\r\n\t\tif (!listeners) {\r\n\t\t\tlisteners = this.m_iprops.dom_events[type] = [{listener,passive}];\r\n\t\t}\r\n\t\telse {\r\n\t\t\tlisteners.push({listener,passive});\r\n\t\t}\r\n\r\n\t\tif (this.m_dom) {\r\n\t\t\t//this.m_dom.addEventListener(type, listener);\r\n\t\t\tthis._createEvent(type, listener,passive);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * \r\n\t */\r\n\r\n\tpublic clearDomEvent<K extends keyof X4ElementEventMap>(type: K) {\r\n\t\tif (!this.m_iprops.dom_events) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tdelete this.m_iprops.dom_events[type];\r\n\r\n\t\tlet _dom = this.m_dom;\r\n\t\tif (_dom) {\r\n\t\t\tlet store = _dom[_x4_el_store];\r\n\t\t\tif (store) {\r\n\t\t\t\tdelete store[type];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * \r\n\t * @param name \r\n\t * @param handler \r\n\t */\r\n\r\n\tprivate _createEvent(name: string, handler: Function, passive?: boolean) {\r\n\r\n\t\tlet _dom = this.m_dom;\r\n\t\tlet store = _dom[_x4_el_store];\r\n\r\n\t\tif (!store) {\r\n\t\t\tstore = _dom[_x4_el_store] = {};\r\n\t\t}\r\n\r\n\t\tif (!store[name]) {\r\n\t\t\t// no handler for this event...\r\n\t\t\tstore[name] = [handler];\r\n\t\t}\r\n\t\telse {\r\n\t\t\t// append the handler\r\n\t\t\tstore[name].push(handler);\r\n\t\t}\r\n\r\n\t\tif (unbubbleEvents[name] === 1) {\r\n\t\t\t_dom['on' + name] = Component._dispatchUnbubbleEvent;\r\n\t\t}\r\n\t\telse if (!Component.__privateEvents[name]) {\r\n\t\t\tComponent.__privateEvents[name] = true; // todo count it\r\n\r\n\t\t\tif( passive===undefined ) {\r\n\t\t\t\tif ( passiveEvents[name] ) {\r\n\t\t\t\t\tx4document.addEventListener(name as any, Component._dispatchEvent, { passive: false, capture: true });\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tx4document.addEventListener(name as any, Component._dispatchEvent, true);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tx4document.addEventListener(name as any, Component._dispatchEvent, { passive, capture: passive ? true : false } );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (name === 'sizechange') {\r\n\t\t\tif (!Component.__sizeObserver) {\r\n\t\t\t\tComponent.__sizeObserver = new ResizeObserver(Component._observeSize);\r\n\t\t\t}\r\n\r\n\t\t\tComponent.__sizeObserver.observe(this.m_dom);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * dispatch a dom event to the appropriated component\r\n\t * called by the system\r\n\t */\r\n\r\n\tprivate static _dispatchEvent(ev: any) {\r\n\r\n\t\tlet target = ev.target,\r\n\t\t\tnoup = unbubbleEvents[ev.type] === 2;\r\n\r\n\t\twhile (target) {\r\n\t\t\tif (target[_x4_el_store]) {\r\n\t\t\t\tlet store = target[_x4_el_store][ev.type];\r\n\t\t\t\tif (store) {\r\n\t\t\t\t\tlet el = target[_x4_el_sym];\r\n\t\t\t\t\tlet root = el?.root ?? null;\r\n\r\n\t\t\t\t\tif (store instanceof Array) {\r\n\t\t\t\t\t\tstore.some((fn) => {\r\n\t\t\t\t\t\t\tfn(ev, root);\r\n\t\t\t\t\t\t\tif (!el.dom) {\r\n\t\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tstore(ev, root);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (ev.cancelBubble || ev.defaultPrevented || noup) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\ttarget = target.parentNode;\r\n\r\n\t\t\t// no need to go above\r\n\t\t\tif (target == document) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * dispatch a dom event to the appropriated component\r\n\t * called by the system\r\n\t */\r\n\r\n\tprivate static _dispatchUnbubbleEvent(ev: any) {\r\n\r\n\t\tlet target = ev.currentTarget || ev.target,\r\n\t\t\teventType = ev.type;\r\n\r\n\t\tlet eventStore = target[_x4_el_store],\r\n\t\t\tstore = eventStore && eventStore[eventType];\r\n\r\n\t\tif (store) {\r\n\r\n\t\t\tlet el = target[_x4_el_sym];\r\n\t\t\tlet root = el?.root ?? null;\r\n\r\n\t\t\tif (store instanceof Array) {\r\n\t\t\t\tstore.forEach((fn) => {\r\n\t\t\t\t\tfn(ev, root);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tstore(ev, root);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * called when a size change on an observed component\r\n\t */\r\n\r\n\tprivate static _observeSize(entries: ResizeObserverEntry[]) {\r\n\r\n\t\tentries.forEach((entry) => {\r\n\t\t\tlet dom = entry.target as HTMLElement;\r\n\t\t\tif (dom.offsetParent !== null) {\r\n\t\t\t\tdom.dispatchEvent(new Event('sizechange'));\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * enum all children recursively\r\n\t * @param recursive - if true do a full sub-child search \r\n\t * @param cb - callback\r\n\t * return true to stop enumeration\r\n\t */\r\n\r\n\tenumChilds(cb: (child: Component) => boolean | void, recursive = false): boolean {\r\n\r\n\t\t// use dom if available\r\n\t\tif (this.m_dom) {\r\n\r\n\t\t\tlet el = this.m_dom.firstChild;\r\n\r\n\t\t\twhile (el) {\r\n\t\t\t\t// get component (if any)\r\n\t\t\t\tlet cel = el[_x4_el_sym];\r\n\t\t\t\tif (cel) {\r\n\t\t\t\t\tcb(cel);\r\n\r\n\t\t\t\t\tif (recursive && cel.enumChilds(cb, true) === true) {\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tel = el.nextSibling;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse {\r\n\t\t\tlet content = this.m_props.content;\r\n\t\t\tif (!content) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (!isArray(content)) {\r\n\t\t\t\tcontent = [content];\r\n\t\t\t}\r\n\r\n\t\t\tcontent.some((el) => {\r\n\t\t\t\tif (!el || isString(el) || isHtmlString(el)) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (cb(el)) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (recursive && el.enumChilds(cb, true) === true) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * apprend a child to the DOM\r\n\t * @param props child to append (or string)\r\n\t */\r\n\r\n\tprivate _appendChild(el: ComponentOrString) {\r\n\r\n\t\tif (isString(el)) {\r\n\t\t\tthis.m_dom.insertAdjacentText('beforeend', el);\r\n\t\t}\r\n\t\telse if (isHtmlString(el)) {\r\n\t\t\tthis.m_dom.insertAdjacentHTML('beforeend', el as string);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tlet component: Component = el;\r\n\r\n\t\t\ttry {\r\n\t\t\t\tcomponent._build();\r\n\t\t\t\tthis.m_dom.appendChild(component.m_dom);\r\n\t\t\t}\r\n\t\t\tcatch (e) {\r\n\t\t\t\tconsole.error(e);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * generate classes from the component inheritance \r\n\t * @example\r\n\t * Button extends Component will give\r\n\t * x-comp x-button\r\n\t */\r\n\r\n\tprivate _genClassName() {\r\n\r\n\t\tthis.addClass('@comp');\r\n\r\n\t\tlet me = Object.getPrototypeOf(this);\r\n\t\twhile (me && me.constructor !== Component) {\r\n\t\t\tlet clsname = me.constructor.name;\r\n\t\t\tthis.addClass('@' + pascalCase(clsname));\r\n\r\n\t\t\tme = Object.getPrototypeOf(me);\r\n\t\t}\r\n\r\n\t\t//done in ctor now\r\n\t\t//this.addClass(this.m_props.cls);\r\n\t}\r\n\r\n\t/**\r\n\t * prepend the system class name prefix on a name if needed (if class starts with @)\r\n\t */\r\n\r\n\tprivate _makeCls(cls: string): string {\r\n\t\tif (cls[0] == '@') {\r\n\t\t\treturn cls = _x4_ns_prefix + cls.substring(1);\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn cls;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * \r\n\t */\r\n\r\n\tprivate static dispatchCaptures(event: Event) {\r\n\t\tComponent.__capture.handler(event as UIEvent);\r\n\t}\r\n\r\n\t/**\r\n\t * capture mouse events\r\n\t * @param capture name of the current capture \r\n\t * @param callback funciton to call on captured mouse events\r\n\t * \r\n\t * @example\r\n\t * Component.setCapture( this, ( ev: MouseEvent, initiator: Component ) => {\r\n\t *\t\tif( ev.type=='mousemove' ) {\r\n\t *\t\t\tthis.setStyle( {\r\n\t *\t\t\t\tleft: ev.clientX,\r\n\t *\t\t\t\ttop: ev.clientY\r\n\t *\t\t\t} );\r\n\t *\t\t}\r\n\t *\t\telse if( ev.type=='mouseup' ) {\r\n\t *\t\t\tComponent.releaseCapture( );\r\n\t *\t\t}\r\n\t *\t} );\r\n\t */\r\n\r\n\tprotected static setCapture(initiator: Component, listener: EventHandler<UIEvent>) {\r\n\r\n\t\tconsole.assert(!Component.__capture);\r\n\t\tif (Component.__capture) {\r\n\t\t\tdebugger;\r\n\t\t}\r\n\r\n\t\t//\ttodo: review that\r\n\r\n\t\tlet iframes = x4document.querySelectorAll<HTMLIFrameElement>(\"iframe\");\r\n\t\tiframes.forEach( f => {\r\n\t\t\tflyWrap(f).setStyleValue( 'pointer-events', 'none' );\r\n\t\t});\r\n\r\n\t\tlet overs = x4document.querySelectorAll(\":hover\");\r\n\r\n\t\tlet cursor = null;\r\n\t\tif (overs.length) {\r\n\t\t\tlet elementOver = <HTMLElement>overs[overs.length - 1];\r\n\t\t\tlet style = window.getComputedStyle(elementOver);\r\n\t\t\tcursor = style.cursor;\r\n\t\t}\r\n\r\n\t\tComponent.__capture_mask = x4document.createElement('div');\r\n\t\tlet mask = flyWrap(Component.__capture_mask);\r\n\t\tmask.addClass('@capture-mask');\r\n\r\n\t\tif (cursor) {\r\n\t\t\tmask.setStyleValue('cursor', cursor);\r\n\t\t}\r\n\r\n\t\tx4document.body.appendChild(mask.dom);\r\n\r\n\t\tx4document.addEventListener('mousedown', Component.dispatchCaptures);\r\n\t\tx4document.addEventListener('mousemove', Component.dispatchCaptures);\r\n\t\tx4document.addEventListener('mouseup', Component.dispatchCaptures);\r\n\r\n\t\tx4document.addEventListener('touchstart', Component.dispatchCaptures);\r\n\t\tx4document.addEventListener('touchmove', Component.dispatchCaptures);\r\n\t\tx4document.addEventListener('touchend', Component.dispatchCaptures);\r\n\r\n\t\tComponent.__capture = {\r\n\t\t\tinitiator,\r\n\t\t\thandler: listener,\r\n\t\t\tiframes\r\n\t\t};\r\n\t}\r\n\r\n\tprotected static releaseCapture() {\r\n\r\n\t\tconsole.assert(!!Component.__capture);\r\n\r\n\t\tx4document.removeEventListener('touchstart', Component.dispatchCaptures);\r\n\t\tx4document.removeEventListener('touchmove', Component.dispatchCaptures);\r\n\t\tx4document.removeEventListener('touchend', Component.dispatchCaptures);\r\n\r\n\t\tx4document.removeEventListener('mousedown', Component.dispatchCaptures);\r\n\t\tx4document.removeEventListener('mousemove', Component.dispatchCaptures);\r\n\t\tx4document.removeEventListener('mouseup', Component.dispatchCaptures);\r\n\t\t\r\n\t\tComponent.__capture.iframes.forEach( f => {\r\n\t\t\tflyWrap(f).setStyleValue( 'pointer-events', null );\r\n\t\t})\r\n\r\n\t\tComponent.__capture = null;\r\n\t\tif (Component.__capture_mask) {\r\n\t\t\tx4document.body.removeChild(Component.__capture_mask);\r\n\t\t\tComponent.__capture_mask = null;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * ensure the component is visible\r\n\t * @param: alignToTop \r\n\t */\r\n\r\n\tpublic scrollIntoView(arg?: boolean | ScrollIntoViewOptions) {\r\n\t\tif (this.m_dom) {\r\n\r\n\t\t\tconst rel = new Rect( this.dom.getBoundingClientRect( ) );\r\n\t\t\t\r\n\t\t\tlet top = undefined;\r\n\t\t\tlet bot = undefined;\r\n\t\t\tlet left = undefined;\r\n\t\t\tlet right = undefined;\r\n\r\n\t\t\tlet pn = this.dom.parentElement;\r\n\t\t\tconst bdy = x4document.body;\r\n\r\n\t\t\twhile( pn && pn!=bdy ) {\r\n\r\n\t\t\t\tconst pr = pn.getBoundingClientRect( );\r\n\r\n\t\t\t\tif( top===undefined || top<pr.top ) {\r\n\t\t\t\t\ttop = pr.top;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif( bot===undefined || bot>pr.bottom ) {\r\n\t\t\t\t\tbot = pr.bottom;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif( left===undefined || left<pr.left ) {\r\n\t\t\t\t\tleft = pr.left;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif( right===undefined || right>pr.right ) {\r\n\t\t\t\t\tright = pr.right;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tpn = pn.parentElement;\r\n\t\t\t}\r\n\r\n\t\t\tif( top===undefined || rel.top<top || rel.bottom>bot || rel.left<left || rel.right>right ) {\r\n\t\t\t\t//this.m_dom.scrollIntoView( true );\r\n\t\t\t\tthis.m_dom.scrollIntoView({ behavior: 'auto', block: 'nearest', inline: 'start' });\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t//this.m_dom.scrollIntoView(arg);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * search for a given css selector \r\n\t * @param selector \r\n\t * @returns child or null\r\n\t */\r\n\r\n\tpublic queryItem<T extends Component>(selector: string): T {\r\n\t\tlet result = <HTMLElement>this.dom.querySelector(selector);\r\n\t\treturn result ? Component.getElement<T>(result) : null;\r\n\t}\r\n\r\n\tpublic queryAll(selector: string, cb?: (el: Component) => void): HTMLElement[] {\r\n\t\tlet elements:HTMLElement[] = Array.from( this.m_dom.querySelectorAll<HTMLElement>(selector) );\r\n\t\t\r\n\t\tif( cb ) {\r\n\t\t\telements.forEach((el) => {\r\n\t\t\t\tcb(flyWrap(el as HTMLElement));\r\n\t\t\t});\r\n\t\t}\r\n\t\t\r\n\t\treturn elements;\r\n\t}\r\n\r\n\t/**\r\n\t * find a child with the given ID\r\n\t * @param id id (without '#')\r\n\t * @returns child or null\r\n\t * \r\n\t * @example\r\n\t * let btn = this.childWithId<Button>( 'myButtonId' );\r\n\t */\r\n\tpublic itemWithId<T extends Component>(id: string): T {\r\n\t\tlet result = <HTMLElement>this.dom.querySelector('#' + id);\r\n\t\treturn result ? Component.getElement<T>(result) : null;\r\n\t}\r\n\r\n\t/**\r\n\t * find a child with given ref\r\n\t * @param ref \r\n\t * @return found child or null\r\n\t */\r\n\r\n\tpublic itemWithRef<T = Component>(ref: string): T {\r\n\r\n\t\tlet result = null;\r\n\t\tthis.enumChilds((c: Component) => {\r\n\t\t\tif (c.m_props.ref === ref) {\r\n\t\t\t\tresult = c;\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}, true);\r\n\r\n\t\treturn result as T;\r\n\t}\r\n\r\n\t/**\r\n\t * \r\n\t */\r\n\r\n\tget ref() {\r\n\t\treturn this.m_props.ref;\r\n\t}\r\n\r\n\t/**\r\n\t * \r\n\t */\r\n\r\n\tstatic getCss(): Stylesheet {\r\n\t\tif (!Component.__css) {\r\n\t\t\tComponent.__css = new Stylesheet();\r\n\t\t}\r\n\r\n\t\treturn Component.__css;\r\n\t}\r\n\r\n\t/**\r\n\t * return the parent element\r\n\t * care, object must have been created (dom!=null)\r\n\t */\r\n\r\n\tpublic getParent(): Component {\r\n\t\tconsole.assert(!!this.m_dom);\r\n\r\n\t\tlet elParent = this.dom.parentNode;\r\n\t\treturn Component.getElement(<HTMLElement>elParent);\r\n\t}\r\n\r\n\t/**\r\n\t * get a component from a DOM element\r\n\t * move up to the hierarchy to find the request class type.\r\n\t * @param dom \r\n\t * @param classname \r\n\t * @returns \r\n\t * \r\n\t * @example\r\n\t * \r\n\t * with a DOM like that:\r\n\t * \t Button\r\n\t * \t \tLabel\r\n\t * \t\tIcon <- the DOM you have (dom-icon)\r\n\t * \r\n\t * let btn = Component.getElement( dom-icon, Button );\r\n\t */\r\n\r\n\tstatic getElement<T extends Component>(dom: HTMLElement | Element, classname?: Constructor<T> | string ): T {\r\n\r\n\t\tif (classname) {\r\n\r\n\t\t\tconst srhCls = isString(classname);\r\n\r\n\t\t\twhile (dom) {\r\n\t\t\t\tlet el: Component = dom[_x4_el_sym];\r\n\r\n\t\t\t\tif( srhCls ) {\r\n\t\t\t\t\tif( el && el.hasClass(classname) ) {\r\n\t\t\t\t\t\treturn el as T;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse if (el instanceof classname) {\r\n\t\t\t\t\treturn el;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tdom = dom.parentElement;\r\n\t\t\t}\r\n\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn dom ? dom[_x4_el_sym] : null;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * compute the scrollbar size ( width = height)\r\n\t */\r\n\r\n\tstatic getScrollbarSize() {\r\n\r\n\t\tif (Component.__sb_width === undefined) {\r\n\t\t\tlet outerDiv = x4document.createElement('div');\r\n\t\t\touterDiv.style.cssText = 'overflow:auto;position:absolute;top:0;width:100px;height:100px';\r\n\r\n\t\t\tlet innerDiv = x4document.createElement('div');\r\n\t\t\tinnerDiv.style.width = '200px';\r\n\t\t\tinnerDiv.style.height = '200px';\r\n\r\n\t\t\touterDiv.appendChild(innerDiv);\r\n\t\t\tx4document.body.appendChild(outerDiv);\r\n\r\n\t\t\tComponent.__sb_width = outerDiv.offsetWidth - outerDiv.clientWidth;\r\n\t\t\tx4document.body.removeChild(outerDiv);\r\n\t\t}\r\n\r\n\t\treturn Component.__sb_width;\r\n\t}\r\n\r\n\t/**\r\n\t * check if the Component is visible to the user\r\n\t */\r\n\r\n\tisUserVisible(): boolean {\r\n\t\tif (!this.m_dom) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn (this.m_dom.offsetParent !== null);\r\n\t}\r\n}\r\n\r\n/** @ignore */\r\nlet fly_element: Component = null;\r\n\r\n/**\r\n * warp <b>temporarily</b> a DOM element to be able to acces to exact API\r\n * @param dom dom element to wrap\r\n * @review qui libere le fly_element ? -> timeout\r\n */\r\n\r\nexport function flyWrap<T extends Component>(dom: HTMLElement | EventTarget): T {\r\n\r\n\tif (dom[_x4_el_sym]) {\r\n\t\treturn dom[_x4_el_sym];\r\n\t}\r\n\r\n\tlet f = fly_element;\r\n\tif (!f) { f = fly_element = new Component({}); }\r\n\t(<any>f).m_dom = dom;\r\n\r\n\treturn f as T;\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n/**\r\n * simple flex spacer\r\n */\r\n\r\nexport class Flex extends Component {\r\n\r\n\tconstructor(props: CProps = {}) {\r\n\t\tif (!props.flex) {\r\n\t\t\tprops.flex = 1;\r\n\t\t}\r\n\r\n\t\tsuper(props);\r\n\t}\r\n}\r\n\r\n/**\r\n * simple space between 2 elements\r\n */\r\n\r\nexport class Space extends Component {\r\n\r\n\tm_size: number | string;\r\n\r\n\tconstructor(size: number | string) {\r\n\t\tsuper({});\r\n\r\n\t\tthis.m_size = size;\r\n\t}\r\n\r\n\tcomponentCreated() {\r\n\r\n\t\t// try to find if we are in a hz / vt / abs container\r\n\t\tlet dom = this.dom;\r\n\t\tlet style = null;\r\n\r\n\t\twhile (dom) {\r\n\t\t\tlet el: Component = dom[_x4_el_sym];\r\n\t\t\tif (el.hasClass('@hlayout')) {\r\n\t\t\t\tstyle = { width: this.m_size };\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\telse if (el.hasClass('@vlayout')) {\r\n\t\t\t\tstyle = { height: this.m_size };\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tdom = dom.parentElement;\r\n\t\t}\r\n\r\n\t\tif (!style) {\r\n\t\t\tstyle = { width: this.m_size, height: this.m_size };\r\n\t\t}\r\n\r\n\t\tthis.setStyle(style);\r\n\t}\r\n}\r\n\r\n/**\r\n * sizable separator\r\n */\r\n\r\ntype SizeMode = null | 'minimize' | 'maximize' | 'restore';\r\n\r\nexport interface EvSize extends BasicEvent {\r\n\treadonly size: Size;\r\n\treadonly mode: SizeMode;\r\n}\r\n\r\nexport function EvSize(size: Size, mode: SizeMode = null, context = null ): EvSize {\r\n\treturn BasicEvent<EvSize>({ size, mode, context });\r\n}\r\n\r\ninterface SeparatorEventMap extends CEventMap {\r\n\tresize?: EvSize;\r\n}\r\n\r\ninterface SeparatorProps extends CProps<SeparatorEventMap> {\r\n\treadonly orientation: 'vertical' | 'horizontal';\t\t// vertical means vertical sizer so it resize horizontally\r\n\treadonly sizing: 'before' | 'after';\r\n\treadonly collapsible?: boolean;\r\n}\r\n\r\nexport class Separator extends Component<SeparatorProps, SeparatorEventMap> {\r\n\r\n\tm_irect: Rect;\r\n\tm_delta: number;\r\n\tm_target: Component;\r\n\r\n\tconstructor(props: SeparatorProps) {\r\n\t\tsuper(props);\r\n\r\n\t\tthis.setDomEvent('mousedown', (e) => this._mousedown(e));\r\n\t\tthis.setDomEvent('touchstart', (e) => this._mousedown(e));\r\n\t\tthis.setDomEvent('dblclick', (e) => this._collapse(e) );\r\n\t}\r\n\r\n\trender() {\r\n\t\tthis.addClass(this.m_props.orientation);\r\n\t}\r\n\r\n\tprivate _collapse( ev: UIEvent ) {\r\n\t\tif( this.m_props.collapsible ) {\r\n\t\t\tthis._findTarget();\r\n\t\t\tif( this.m_target ) {\r\n\t\t\t\tthis.m_target.toggleClass( '@collapsed' );\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprivate _mousedown(ev: UIEvent) {\r\n\r\n\t\tif (ev.type == 'touchstart') {\r\n\t\t\tlet te = ev as TouchEvent;\r\n\t\t\tif (te.touches.length == 1) {\r\n\t\t\t\tthis._startMoving(te.touches[0].pageX, te.touches[0].pageY, ev);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse {\r\n\t\t\tlet me = ev as MouseEvent;\r\n\t\t\tthis._startMoving(me.pageX, me.pageY, ev);\r\n\t\t}\r\n\t}\r\n\r\n\t_startMoving(x: number, y: number, ev: UIEvent) {\r\n\t\t//if( this.m_props.callback ) {\r\n\t\t//\tthis.m_props.callback( ev, this );\r\n\t\t//}\r\n\t\t//else \r\n\t\t{\r\n\t\t\tthis._findTarget();\r\n\r\n\t\t\tif (this.m_target) {\r\n\r\n\t\t\t\tif (this.m_props.orientation == 'horizontal') {\r\n\t\t\t\t\tif (this.m_props.sizing == 'before') {\r\n\t\t\t\t\t\tthis.m_delta = x - this.m_irect.right;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tthis.m_delta = x - this.m_irect.left;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif (this.m_props.sizing == 'before') {\r\n\t\t\t\t\t\tthis.m_delta = y - this.m_irect.bottom;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tthis.m_delta = y - this.m_irect.top;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tev.preventDefault();\r\n\t\t\t\tev.stopPropagation();\r\n\r\n\t\t\t\tthis.m_target.addClass('sizing');\r\n\r\n\t\t\t\tComponent.setCapture(this, (e) => this._pointerMoved(e));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprivate _pointerMoved(ev: UIEvent) {\r\n\r\n\t\tlet __move = (ex, ey) => {\r\n\r\n\t\t\tif (this.m_props.orientation == 'horizontal') {\r\n\r\n\t\t\t\tlet width;\r\n\t\t\t\tif (this.m_props.sizing == 'after') {\r\n\t\t\t\t\twidth = this.m_irect.right - (ex - this.m_delta);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\twidth = (ex - this.m_delta) - this.m_irect.left\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (width > 0) {\r\n\t\t\t\t\tlet size = new Size(width, 0);\r\n\t\t\t\t\tthis.emit('resize', EvSize(size));\r\n\r\n\t\t\t\t\tthis.m_target.setStyleValue('width', size.width);\r\n\t\t\t\t\tthis.m_target.setStyleValue('flex', null);\t// for flex>1\r\n\t\t\t\t\tthis.m_target.removeClass('@flex');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\r\n\t\t\t\tlet height;\r\n\t\t\t\tif (this.m_props.sizing == 'after') {\r\n\t\t\t\t\theight = this.m_irect.bottom - (ey - this.m_delta);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\theight = (ey - this.m_delta) - this.m_irect.top;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (height > 0) {\r\n\t\t\t\t\tlet size = new Size(0, height);\r\n\t\t\t\t\tthis.emit('resize', EvSize(size));\r\n\r\n\t\t\t\t\tthis.m_target.setStyleValue('height', size.height);\r\n\t\t\t\t\tthis.m_target.setStyleValue('flex', null);\t// for flex>1\r\n\t\t\t\t\tthis.m_target.removeClass('@flex');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (ev.type == 'mousemove') {\r\n\r\n\t\t\tlet mev = ev as MouseEvent;\r\n\t\t\t__move(mev.pageX, mev.pageY);\r\n\r\n\t\t\tev.preventDefault();\r\n\t\t\tev.stopPropagation();\r\n\t\t}\r\n\t\telse if (ev.type == 'touchmove') {\r\n\r\n\t\t\tlet tev = ev as TouchEvent;\r\n\t\t\t__move(tev.touches[0].pageX, tev.touches[0].pageY);\r\n\r\n\t\t\tev.preventDefault();\r\n\t\t\tev.stopPropagation();\r\n\t\t}\r\n\t\telse if (ev.type == 'mouseup' || ev.type == 'touchend') {\r\n\t\t\tthis.m_target.removeClass('sizing');\r\n\r\n\t\t\tComponent.releaseCapture();\r\n\t\t\tev.preventDefault();\r\n\t\t\tev.stopPropagation();\r\n\t\t}\r\n\t}\r\n\r\n\tprivate _findTarget() {\r\n\r\n\t\tif (!this.m_target) {\r\n\r\n\t\t\tif (this.m_props.sizing == 'before') {\r\n\t\t\t\tlet prevDom = this.dom.previousElementSibling;\r\n\t\t\t\tlet prevEl = prevDom ? Component.getElement(prevDom as HTMLElement) : null;\r\n\t\t\t\tthis.m_target = prevEl;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tlet nextDom = this.dom.nextElementSibling;\r\n\t\t\t\tlet nextEl = nextDom ? Component.getElement(nextDom as HTMLElement) : null;\r\n\t\t\t\tthis.m_target = nextEl;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (this.m_target) {\r\n\t\t\tthis.m_irect = this.m_target.getBoundingRect();\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.m_irect = null;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n\r\n\r\n\r\n// :: SIZERBAR ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\r\n\r\n/**\r\n * properties\r\n */\r\n\r\ntype SizerOverlaySens = 'left' | 'top' | 'right' | 'bottom' | 'topleft' | 'topright' | 'bottomleft' | 'bottomright';\r\n\r\nexport interface EvOverlayResize extends BasicEvent {\r\n\tui_event: UIEvent;\r\n\tsens: SizerOverlaySens;\r\n}\r\n\r\nexport function EvOverlayResize(ui_event: UIEvent, sens: SizerOverlaySens, context: any = null) {\r\n\treturn BasicEvent<EvOverlayResize>({ ui_event, sens, context });\r\n}\r\n\r\ninterface SizerOverlayEventMap extends CEventMap {\r\n\tresize: EvSize;\r\n\trawresize: EvOverlayResize;\r\n}\r\n\r\n\r\nexport interface SizerOverlayProps extends CProps<SizerOverlayEventMap> {\r\n\tsens: SizerOverlaySens;\r\n\ttarget: Component;\r\n\r\n\tresize?: EventCallback<EvSize>;\t// shortcut to events: { size: ... }\r\n}\r\n\r\nexport class SizerOverlay extends Component<SizerOverlayProps, SizerOverlayEventMap> {\r\n\r\n\tprivate m_delta: number;\r\n\tprivate m_irect: Rect;\r\n\r\n\tconstructor(props: SizerOverlayProps) {\r\n\t\tsuper(props);\r\n\r\n\t\tthis.addClass(props.sens);\r\n\t\tthis.setDomEvent('mousedown', (e) => this._mousedown(e));\r\n\t\tthis.setDomEvent('touchstart', (e) => this._mousedown(e));\r\n\t\tthis.setDomEvent('dblclick', (e) => this.resetflex(e));\t// todo: add option for that\r\n\r\n\t\tprops.target.appendChild(this);\r\n\r\n\t\tif( props.resize ) {\r\n\t\t\tthis.on( 'resize', this.m_props.resize );\r\n\t\t}\r\n\t}\r\n\r\n\tresetflex(event: UIEvent) {\r\n\t\tthis.m_props.target.addClass('@flex');\r\n\t\tthis.emit('resize', EvSize( { width: -1, height: 0}));\t// todo: see that\r\n\t\tevent.preventDefault();\r\n\t\tevent.stopPropagation();\r\n\t}\r\n\r\n\t// @review move that in component\r\n\r\n\t_mousedown(ev: UIEvent) {\r\n\r\n\t\tev.preventDefault();\r\n\t\tev.stopPropagation();\r\n\t\t\r\n\t\tlet eev = EvOverlayResize(ev, this.m_props.sens);\r\n\t\tthis.emit('rawresize', eev);\r\n\t\tif (eev.defaultPrevented) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet pos = getMousePos(ev, true);\r\n\t\tthis.m_irect = this.m_props.target.getBoundingRect();\r\n\r\n\t\tif (this.m_props.sens == 'right') {\r\n\t\t\tthis.m_delta = pos.x - this.m_irect.right;\r\n\t\t}\r\n\t\telse if (this.m_props.sens == 'left') {\r\n\t\t\tthis.m_delta = pos.x - this.m_irect.left;\r\n\t\t}\r\n\t\telse if (this.m_props.sens == 'bottom') {\r\n\t\t\tthis.m_delta = pos.y - this.m_irect.bottom;\r\n\t\t}\r\n\t\telse if (this.m_props.sens == 'top') {\r\n\t\t\tthis.m_delta = pos.y - this.m_irect.top;\r\n\t\t}\r\n\r\n\t\tthis.m_props.target.addClass('sizing');\r\n\t\tComponent.setCapture(this, (e) => this._handle_mouse(e));\r\n\t}\r\n\r\n\tprivate _is_horz() {\r\n\t\treturn this.m_props.sens == 'left' || this.m_props.sens == 'right';\r\n\t}\r\n\r\n\tpublic get sens() {\r\n\t\treturn this.m_props.sens;\r\n\t}\r\n\r\n\tprivate _handle_mouse(ev: UIEvent) {\r\n\t\tlet __move = (ex, ey) => {\r\n\t\t\tif (this._is_horz()) {\r\n\r\n\t\t\t\tlet width;\r\n\t\t\t\tif (this.m_props.sens == 'left') {\r\n\t\t\t\t\twidth = this.m_irect.right - (ex - this.m_delta);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\twidth = (ex - this.m_delta) - this.m_irect.left\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (width > 0) {\r\n\t\t\t\t\tlet size = {\r\n\t\t\t\t\t\twidth,\r\n\t\t\t\t\t\theight: undefined\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tthis.emit('resize', EvSize(size));\r\n\r\n\t\t\t\t\tthis.m_props.target.setStyleValue('width', size.width);\r\n\t\t\t\t\tthis.m_props.target.setStyleValue('flex', null);\t// for flex>1\r\n\t\t\t\t\tthis.m_props.target.removeClass('@flex');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\r\n\t\t\t\tlet height;\r\n\t\t\t\tif (this.m_props.sens == 'top') {\r\n\t\t\t\t\theight = this.m_irect.bottom - (ey - this.m_delta);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\theight = (ey - this.m_delta) - this.m_irect.top;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (height > 0) {\r\n\t\t\t\t\tlet size = new Size(0, height);\r\n\t\t\t\t\tthis.emit('resize', EvSize(size));\r\n\r\n\t\t\t\t\tthis.m_props.target.setStyleValue('height', size.height);\r\n\t\t\t\t\tthis.m_props.target.setStyleValue('flex', null);\t// for flex>1\r\n\t\t\t\t\tthis.m_props.target.removeClass('@flex');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (ev.type == 'mousemove') {\r\n\r\n\t\t\tlet mev = ev as MouseEvent;\r\n\t\t\t__move(mev.pageX, mev.pageY);\r\n\r\n\t\t\tev.preventDefault();\r\n\t\t\tev.stopPropagation();\r\n\t\t}\r\n\t\telse if (ev.type == 'touchmove') {\r\n\r\n\t\t\tlet tev = ev as TouchEvent;\r\n\t\t\t__move(tev.touches[0].pageX, tev.touches[0].pageY);\r\n\r\n\t\t\tev.preventDefault();\r\n\t\t\tev.stopPropagation();\r\n\t\t}\r\n\t\telse if (ev.type == 'mouseup' || ev.type == 'touchend') {\r\n\t\t\tthis.m_props.target.removeClass('sizing');\r\n\r\n\t\t\tComponent.releaseCapture();\r\n\t\t\tev.preventDefault();\r\n\t\t\tev.stopPropagation();\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * sequence: Shift+Ctrl+Alt+A\r\n */\r\n\r\nexport interface Shortcut {\r\n\tsequence: string;\r\n\tname: string;\r\n\timmediate: boolean;\r\n\tcallback?: (domTarget) => void;\r\n}\r\n\r\ninterface EvShortcut extends BasicEvent {\r\n\tname: string;\r\n}\r\n\r\nfunction EvShortcut(name: string) {\r\n\treturn BasicEvent<EvShortcut>({ name });\r\n}\r\n\r\nexport interface ContainerEventMap extends CEventMap {\r\n\tshortcut: EvShortcut;\r\n}\r\n\r\nexport interface ContainerProps<E extends ContainerEventMap = ContainerEventMap> extends CProps<E> {\r\n}\r\n\r\n/**\r\n * you can construct a Container as usual with it's properties but also directly with it's children array\r\n * \r\n * @example\r\n * new Container( [\r\n * \tchild1, \r\n * child2\r\n * ])\r\n */\r\n\r\nexport class Container<P extends ContainerProps = ContainerProps, E extends ContainerEventMap = ContainerEventMap> extends Component<P, E> {\r\n\r\n\tprivate m_shortcuts: Shortcut[];\r\n\r\n\tconstructor( props: P );\r\n\tconstructor( items: ComponentOrString[], cls?: string );\r\n\tconstructor( props: P | ComponentOrString[], cls?: string ) {\r\n\t\tif( isArray(props) ) {\r\n\t\t\tsuper( {content: props,cls} as P );\r\n\t\t}\r\n\t\telse {\r\n\t\t\tsuper( props );\r\n\t\t}\r\n\t}\r\n\t\r\n\t/**\r\n\t * add an application shortcut\r\n\t * @param sequence key sequence Shift+Ctrl+Alt+K\r\n\t * @param callback callback to call\r\n\t */\r\n\r\n\tpublic addShortcut(sequence: string | string[], name: string, callback: EventHandler<KeyboardEvent> = null, immediate = false) {\r\n\r\n\t\t// first time\r\n\t\tif (!this.m_shortcuts) {\r\n\t\t\tthis.m_shortcuts = [];\r\n\t\t\tthis.setDomEvent('keydown', (e) => this._handleKeydown(e));\r\n\t\t}\r\n\r\n\t\tif (!isArray(sequence)) {\r\n\t\t\tsequence = [sequence];\r\n\t\t}\r\n\r\n\t\tsequence.forEach((seq: string) => {\r\n\t\t\tlet reseq = '';\r\n\r\n\t\t\tlet shift = seq.match(/SHIFT/i);\r\n\t\t\tif (shift) {\r\n\t\t\t\tseq = seq.replace(/SHIFT/i, '');\r\n\t\t\t\treseq += 'shift+';\r\n\t\t\t}\r\n\r\n\t\t\tlet ctrl = seq.match(/CTRL/i);\r\n\t\t\tif (ctrl) {\r\n\t\t\t\tseq = seq.replace(/CTRL/i, '');\r\n\t\t\t\treseq += 'ctrl+';\r\n\t\t\t}\r\n\r\n\t\t\tlet cmd = seq.match(/CMD/i);\r\n\t\t\tif (cmd) {\r\n\t\t\t\tseq = seq.replace(/CMD/i, '');\r\n\t\t\t\treseq += 'cmd+';\r\n\t\t\t}\r\n\r\n\t\t\tlet alt = seq.match(/ALT/i);\r\n\t\t\tif (alt) {\r\n\t\t\t\tseq = seq.replace(/ALT/i, '');\r\n\t\t\t\treseq += 'alt+';\r\n\t\t\t}\r\n\r\n\t\t\treseq += seq.replace('+', '').toLowerCase();\r\n\r\n\t\t\tthis.m_shortcuts.push({\r\n\t\t\t\tsequence: reseq,\r\n\t\t\t\tname,\r\n\t\t\t\timmediate,\r\n\t\t\t\tcallback\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * remove all shortcuts for a target\r\n\t */\r\n\r\n\tremoveShortcuts() {\r\n\t\tif (this.m_shortcuts) {\r\n\t\t\tthis.m_shortcuts = [];\r\n\t\t}\r\n\t}\r\n\r\n\t/** @ignore this function is binded */\r\n\tprivate _handleKeydown(e: KeyboardEvent) {\r\n\r\n\t\tif (!this.m_shortcuts) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet seq = '';\r\n\r\n\t\tif (e.shiftKey) {\r\n\t\t\tseq += 'shift+';\r\n\t\t}\r\n\r\n\t\tif (e.ctrlKey) {\r\n\t\t\tseq += 'ctrl+';\r\n\t\t}\r\n\r\n\t\tif (e.metaKey) {\r\n\t\t\tseq += 'cmd+';\r\n\t\t}\r\n\r\n\t\tif (e.altKey) {\r\n\t\t\tseq += 'alt+';\r\n\t\t}\r\n\r\n\t\tseq += e.key.toLowerCase();\r\n\t\t//console.log( seq );\r\n\r\n\t\tthis.m_shortcuts.some((sk) => {\r\n\t\t\tif (sk.sequence == seq) {\r\n\r\n\t\t\t\tif (sk.callback) {\r\n\t\t\t\t\tif (sk.immediate) {\r\n\t\t\t\t\t\tsk.callback(e);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tasap(() => { sk.callback(e); });\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tthis.emit('shortcut', EvShortcut(sk.name));\r\n\t\t\t\t}\r\n\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\te.stopPropagation();\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n}\r\n\r\nexport type ComponentConstructor<T> = new (props: CProps) => T;\r\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file local_storage.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nexport class Settings {\n\n\tprivate m_data: any;\n\tprivate m_name: string;\n\n\tconstructor( name?: string ) {\n\t\tthis.m_data = null;\n\t\tthis.m_name = name ?? 'settings';\n\t}\n\n\tset( name: string, value: any ) {\n\t\tthis._load( );\n\t\tthis.m_data[name] = value;\n\t\tthis._save( );\n\t}\n\n\tget( name: string, defValue? ) : any {\n\t\tthis._load( );\n\t\treturn this.m_data[name] ?? defValue;\n\t}\n\n\tprivate _save( ) {\n\t\tlet data = JSON.stringify(this.m_data);\n\t\tlocalStorage.setItem( this.m_name, data );\n\t}\n\n\tprivate _load( ) {\n\t\tif( this.m_data ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.m_data = {};\n\n\t\tlet data = localStorage.getItem( this.m_name );\n\t\tif( data!==null ) {\n\t\t\tdata = JSON.parse( data );\n\t\t\tif( data ) {\n\t\t\t\tthis.m_data = data;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconsole.info('There was an error attempting to read your settings.');\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t\t// console.info('There was an error attempting to read your settings.');\n\t}\n}\n\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file router.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\n\nimport { EventSource, EvError, EventMap } from \"./x4events\"\n\ntype RouteHandler = ( params: any, path: string ) => void;\n\ninterface Segment {\n\tkeys: string[],\n\tpattern: RegExp;\n}\n\ninterface Route {\n\tkeys: string[],\n\tpattern: RegExp;\n\thandler: RouteHandler;\n}\n\nfunction parseRoute(str: string | RegExp, loose = false): Segment {\n\n\tif (str instanceof RegExp) {\n\t\treturn {\n\t\t\tkeys: null,\n\t\t\tpattern: str\n\t\t};\n\t}\n\n\tconst arr = str.split('/');\n\n\tlet keys = [];\n\tlet pattern = '';\n\n\tif( arr[0]=='' ) {\n\t\tarr.shift();\n\t}\n\n\tfor (const tmp of arr) {\n\t\tconst c = tmp[0];\n\n\t\tif (c === '*') {\n\t\t\tkeys.push('wild');\n\t\t\tpattern += '/(.*)';\n\t\t}\n\t\telse if (c === ':') {\n\t\t\tconst o = tmp.indexOf('?', 1);\n\t\t\tconst ext = tmp.indexOf('.', 1);\n\n\t\t\tkeys.push(tmp.substring(1, o >= 0 ? o : ext >= 0 ? ext : tmp.length));\n\t\t\tpattern += o >= 0 && ext < 0 ? '(?:/([^\\/]+?))?' : '/([^\\/]+?)';\n\t\t\tif (ext >= 0) {\n\t\t\t\tpattern += (o >= 0 ? '?' : '') + '\\\\' + tmp.substring(ext);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tpattern += '/' + tmp;\n\t\t}\n\t}\n\n\treturn {\n\t\tkeys,\n\t\tpattern: new RegExp( `^${pattern}${loose ? '(?=$|\\/)' : '\\/?$'}`, 'i' )\n\t};\n}\n\ninterface RouterEventMap extends EventMap {\n\terror: EvError;\n}\n\n\n/**\n * micro router\n * \n * ```\n * const router = new Router( );\n * \n * router.get( \"/detail/:id\", ( params: any ) => {\n * \tthis._showDetail( detail );\n * } );\n * \n * router.get( \"/:id\", ( params: any ) => {\n * if( params.id==0 )\n * \t\trouter.navigate( '/home' );\n *\t }\n * });\n * \n * router.on( \"error\", ( ) => {\n * \trouter.navigate( '/home' );\n * })\n * \n * router.init( );\n * ```\n */\n\n\nexport class Router extends EventSource< RouterEventMap > {\n\n\tprivate m_routes: Route[];\n\tprivate m_useHash: boolean;\n\n\tconstructor( useHash = true ) {\n\t\tsuper( );\n\n\t\tthis.m_routes = [];\n\t\tthis.m_useHash = useHash;\n\n\t\twindow.addEventListener('popstate', (event) => {\n\t\t\tconst url = this._getLocation( );\n\t\t\tconst found = this._find(url);\n\t\t\n\t\t\tfound.handlers.forEach(h => {\n\t\t\t\th(found.params,url);\n\t\t\t});\n\t\t});\n\t}\n\n\tget(uri: string | RegExp, handler: RouteHandler ) {\n\t\tlet { keys, pattern } = parseRoute(uri);\n\t\tthis.m_routes.push({ keys, pattern, handler });\n\t}\n\n\tinit() {\n\t\tthis.navigate( this._getLocation() );\n\t}\n\n\tprivate _getLocation( ) {\n\t\treturn this.m_useHash ? '/'+x4document.location.hash.substring(1) : x4document.location.pathname;\n\t}\n\n\tnavigate( uri: string, notify = true, replace = false ) {\n\n\t\tif( !uri.startsWith('/') ) {\n\t\t\turi = '/'+uri;\n\t\t}\n\n\t\tconst found = this._find( uri );\n\n\t\tif( !found || found.handlers.length==0 ) {\n\t\t\t//window.history.pushState({}, '', 'error')\n\t\t\tconsole.log( 'route not found: '+uri );\n\t\t\tthis.signal( \"error\", EvError( 404, \"route not found\" ) );\n\t\t\treturn;\n\t\t}\n\n\t\tif( this.m_useHash ) {\n\t\t\twhile( uri.at(0)=='/' ) {\n\t\t\t\turi = uri.substring( 1 );\n\t\t\t}\n\t\t\t\n\t\t\turi = '#'+uri;\n\t\t}\n\t\t\n\t\tif( replace ) {\n\t\t\twindow.history.replaceState({}, '', uri );\n\t\t}\n\t\telse {\n\t\t\twindow.history.pushState({}, '', uri );\n\t\t}\n\n\t\tif( notify ) {\n\t\t\tfound.handlers.forEach( h => {\n\t\t\t\th( found.params, uri );\n\t\t\t} );\n\t\t}\n\t}\n\n\tprivate _find( url: string ): { params: any, handlers: RouteHandler[] } {\n\t\t\n\t\tlet matches = [];\n\t\tlet params = {};\n\t\tlet handlers = [];\n\n\t\tfor (const tmp of this.m_routes ) {\n\t\t\tif (!tmp.keys ) {\n\t\t\t\tmatches = tmp.pattern.exec(url);\n\t\t\t\tif (!matches) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (matches['groups']) {\n\t\t\t\t\tfor (const k in matches['groups']) {\n\t\t\t\t\t\tparams[k] = matches['groups'][k];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\thandlers = [...handlers, tmp.handler];\n\t\t\t} \n\t\t\telse if (tmp.keys.length > 0) {\n\t\t\t\tmatches = tmp.pattern.exec(url);\n\t\t\t\tif (matches === null) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tfor ( let j = 0; j < tmp.keys.length;) {\n\t\t\t\t\tparams[tmp.keys[j]] = matches[++j];\n\t\t\t\t}\n\n\t\t\t\thandlers = [...handlers, tmp.handler];\n\t\t\t} \n\t\t\telse if (tmp.pattern.test(url)) {\n\t\t\t\thandlers = [...handlers, tmp.handler];\n\t\t\t}\n\t\t}\n\n\t\treturn { params, handlers };\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file application.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\nimport { EvMessage } from './x4events'\nimport { BaseComponent, BaseComponentEventMap, BaseComponentProps } from './base_component'\nimport { Component, flyWrap } from './component'\nimport { Settings } from './settings'\nimport { _tr } from './i18n'\nimport { Router } from './router'\n\nconst _x4_touch_time = Symbol( );\n\n\ninterface ApplicationEventMap extends BaseComponentEventMap {\n\tmessage: EvMessage;\n\tglobal: EvMessage;\n}\n\n/**\n * \n */\n\nexport interface ApplicationProps extends BaseComponentProps<ApplicationEventMap> {\n\tapp_name: string;\t\t// \n\tapp_version: string;\t//\n\tapp_uid?: string;\n\tlocale?: string;\t\t// fr-FR\n\trenderTo?: HTMLElement;\n}\n\n/**\n * Represents an x4 application, which is typically a single page app.\n * You should inherit Application to define yours.\n * Application derives from BaseComponent so you can use that to implement a global messaging system.\n * @example ```ts\n * \n * // in yout main caode\n * let app = new Application( );\n * \n * app.events.close.on( ( ev ) => {\n * \t... do something\n * });\n * \n * // somewhere else in the source\n * function xxx( ) {\n * \tlet app = Application.instance( );\n * \tapp.events.close.emit( new Events.close() );\n * }\n */\n\nexport class Application<P extends ApplicationProps = ApplicationProps, E extends ApplicationEventMap = ApplicationEventMap> extends BaseComponent<P,E> {\n\t\n\tprivate static self: Application = null;\n\n\t/**\n\t * the application singleton\n\t */\n\n\tstatic \tinstance( ) : Application {\n\t\treturn Application.self;\n\t}\n\n\tprivate m_mainView: Component;\n\n\tprivate m_app_name: string;\n\tprivate m_app_version: string;\n\tprivate m_app_uid: string;\n\t\n\tprivate m_local_storage: Settings;\n\tprivate m_user_data: any;\n\n\tprivate m_touch_time: number;\n\tprivate m_touch_count: number;\n\n\tprivate m_router: Router;\n\t\n\tconstructor( props : P ) {\n\t\tconsole.assert( Application.self===null, 'application is a singleton' );\n\t\tsuper( props );\n\n\t\tthis.m_app_name = props.app_name ?? 'application';\n\t\tthis.m_app_version = props.app_version ?? '1.0';\n\t\tthis.m_app_uid = props.app_uid ?? 'application';\n\n\t\tlet settings_name = `${this.m_app_name}.${this.m_app_version}.settings`;\n\t\tthis.m_local_storage = new Settings( settings_name );\n\t\tthis.m_user_data = {};\n\n\t\tthis.m_touch_time = 0;\n\t\tthis.m_touch_count = 0;\n\t\tthis.m_router = null;\n\t\n\t\tx4app = (Application.self as any) = this;\n\n\t\tif( 'onload' in globalThis ) {\n\t\t\tglobalThis.addEventListener( 'load', ( ) => {\n\t\t\t\tthis.ApplicationCreated( );\n\t\t\t})\n\t\t}\n\t\telse {\n\t\t\tthis.ApplicationCreated( );\n\t\t}\n\t}\n\n\tApplicationCreated( ) {\n\t\tthis.setTitle( '' );\n\t}\n\n\tpublic get router( ) {\n\t\tif( !this.m_router ) {\n\t\t\tthis.m_router = new Router( );\n\t\t}\n\t\treturn this.m_router;\n\t}\n\n\tpublic get app_name( ) {\n\t\treturn this.m_app_name;\n\t}\n\n\tpublic get app_uid( ) {\n\t\treturn this.m_app_uid;\n\t}\n\n\tpublic get app_version( ) {\n\t\treturn this.m_app_version;\n\t}\n\n\tpublic get local_storage( ) {\n\t\treturn this.m_local_storage;\n\t}\n\n\tpublic get user_data( ) {\n\t\treturn this.m_user_data;\n\t}\n\n\tpublic get history( ) {\n\t\t//if( !this.m_history ) {\n\t\t//\tthis.m_history = new NavigationHistory( );\n\t\t//}\n\t\t//\n\t\t//return this.m_history;\n\t\tdebugger;\n\t\treturn null;\n\t}\n\n\t/**\n\t * define the application root object (MainView)\n\t * @example ```ts\n\t * \n\t * let myApp = new Application( ... );\n\t * let mainView = new VLayout( ... );\n\t * myApp.mainView = mainView;\n\t */\n\n\t public setMainView( root: Component, clearBefore: boolean ) {\n\n\t\tconst ddom = this.m_props.renderTo ?? x4document.body;\n\t\tconst dest = flyWrap( ddom );\n\n\t\tif( !this.m_props.renderTo ) {\n\t\t\tdest.setStyleValue( 'position', 'absolute' );\t\n\t\t}\n\n\t\tdest.addClass( 'x4-root-element' );\n\t\tif( clearBefore ) {\n\t\t\tdest._empty( );\n\t\t}\n\n\t\tthis.m_mainView = root;\n\n\t\troot.setStyleValue( 'position', 'absolute' );\n\t\troot._build();\n\n\t\tddom.appendChild( root.dom );\n\t}\n\n\tset mainView( root: Component ) {\n\t\tthis.setMainView( root, false );\n\t}\n\n\tpublic get mainView( ) : Component {\n\t\treturn this.m_mainView;\n\t}\n\n\tpublic setTitle( title: string ) {\n\t\tx4document.title = this.m_app_name + (title ? (' > ' + title) : '');\n\t}\n\n\tpublic disableZoomWheel( ) {\n\n\t\twindow.addEventListener('wheel', function( ev: WheelEvent ) {\n\t\t\tif( ev.ctrlKey ) {\n\t\t\t\tev.preventDefault( );\n\t\t\t\t//ev.stopPropagation( );\n\t\t\t}\n\t\t\n\t\t}, { passive: false, capture: true } );\n\t}\n\n\tpublic enterModal( enter: boolean ) {\n\t}\n\n\tpublic enableTouchDblClick( ) {\n\t\tx4document.addEventListener( 'touchstart', ( ev: TouchEvent ) => {\n\n\t\t\tlet now = Date.now( );\n\t\t\tif( (now-this.m_touch_time) > 700 ) {\n\t\t\t\tthis.m_touch_count = 1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.m_touch_count++;\n\t\t\t}\n\n\t\t\tthis.m_touch_time = now;\n\n\t\t\tif( this.m_touch_count==2 ) {\n\t\t\t\tthis.m_touch_count = 0;\n\n\t\t\t\t// dirty fake dblclick event\n\t\t\t\tconst tch = ev.touches[0];\n\t\t\t\tlet fake: any = {type: \"dblclick\" };\n\t\t\t\tfor( const n in tch ) {\n\t\t\t\t\tfake[n] = tch[n];\n\t\t\t\t}\n\n\t\t\t\t// ignore -> private: dirty x2\n\t\t\t\t(Component as any)._dispatchEvent( fake );\n\t\t\t\tev.stopPropagation( );\n\t\t\t}\n\t\t});\n\t}\n};\n\nexport let x4app: Application;\n\n", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file layout.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\nimport { Component, CProps, ComponentContent, Container, ContainerProps, ContainerEventMap } from './component'\nimport { } from './x4events'\nimport { isArray } from './tools';\n\n// ============================================================================\n// [ABSLAYOUT]\n// ============================================================================\n\nexport class AbsLayout<P extends ContainerProps = ContainerProps, E extends ContainerEventMap = ContainerEventMap> extends Container<P, E> {\n}\n\n\n// ============================================================================\n// [HLAYOUT]\n// ============================================================================\n\nexport class HLayout<P extends ContainerProps = ContainerProps, E extends ContainerEventMap = ContainerEventMap> extends Container<P, E> {\n}\n\n// ============================================================================\n// [VLAYOUT]\n// ============================================================================\n\nexport class VLayout<P extends ContainerProps = ContainerProps, E extends ContainerEventMap = ContainerEventMap> extends Container<P, E> {\n}\n\n\n\ninterface AutoLayoutProps extends CProps {\n\tdefaultLayout: 'horizontal' | 'vertical';\t// by default is <xx>\n\tswitchSize: number;\t\t\t\t\t\t\t// switch if size < this\n}\n\nexport class AutoLayout extends Container<AutoLayoutProps> {\n\n\tconstructor(props: AutoLayoutProps) {\n\t\tsuper(props);\n\n\t\tthis.setDomEvent('sizechange', () => this._updateLayout());\n\t}\n\n\tcomponentCreated() {\n\t\tsuper.componentCreated();\n\t\tthis._updateLayout();\n\t}\n\n\tprivate _updateLayout() {\n\n\t\tlet horz = this.m_props.defaultLayout == 'horizontal' ? true : false;\n\n\t\tif (this.m_props.switchSize <= 0 && window.screen.height > window.screen.width) {\n\t\t\thorz = !horz;\n\t\t}\n\t\telse {\n\t\t\tlet rc = this.getBoundingRect();\n\t\t\tif ((horz && rc.width < this.m_props.switchSize) || (!horz && rc.height < this.m_props.switchSize)) {\n\t\t\t\thorz = !horz;\n\t\t\t}\n\t\t}\n\n\t\tif (horz) {\n\t\t\tthis.removeClass('@vlayout');\n\t\t\tthis.addClass('@hlayout');\n\t\t}\n\t\telse {\n\t\t\tthis.addClass('@vlayout');\n\t\t\tthis.removeClass('@hlayout');\n\t\t}\n\t}\n\n\n}\n\n// ============================================================================\n// [GRIDLAYOUT]\n// ============================================================================\n\nexport interface GridLayoutProps extends ContainerProps {\n\tcolSizes?: string;\t// ex: 20% 1fr 1fr 1fr ou repeat( 10, 25px )\n\trowSizes?: string;\t// ex: auto\n\tcolGap?: number;\n\ttemplate?: string[] // ex: [ \"img sa sb sc\", \"img sd sd sd\" ]\n}\n\nexport class GridLayout<P extends GridLayoutProps = GridLayoutProps> extends Container<P>\n{\n\tconstructor(props: GridLayoutProps) {\n\t\t/// @ts-ignore\n\t\t// Argument of type 'GridLayoutProps' is not assignable to parameter of type 'P'.\n\t\t// 'GridLayoutProps' is assignable to the constraint of type 'P', but 'P' could be instantiated with a different subtype of constraint 'GridLayoutProps'.\n\t\tsuper(props);\n\t}\n\n\t/** @ignore */\n\trender() {\n\t\tif (this.m_props.colSizes) {\n\t\t\tthis.setStyleValue('grid-template-columns', this.m_props.colSizes);\n\t\t}\n\n\t\tif (this.m_props.rowSizes) {\n\t\t\tthis.setStyleValue('grid-template-rows', this.m_props.rowSizes);\n\t\t}\n\n\t\tif (this.m_props.colGap) {\n\t\t\tthis.setStyleValue('grid-gap', this.m_props.colGap);\n\t\t}\n\n\t\tif (this.m_props.template) {\n\t\t\tthis.setStyleValue('grid-template-areas', this.m_props.template.join('\\n'));\n\t\t}\n\t}\n}\n\n// :: TABLE ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\nexport interface TableLayoutProps extends CProps {\n\trows: number;\n\tcolumns: number;\n}\n\ninterface CellData {\n\trowSpan?: number;\n\tcolSpan?: number;\n\twidth?: number;\n\theight?: number;\n\tcls?: string;\n\titem?: ComponentContent;\n\tdata?: any;\n}\n\nexport class TableLayout extends Container<TableLayoutProps> {\n\n\tprivate m_cells: Map<number, CellData>;\n\n\tconstructor(props: TableLayoutProps) {\n\t\tsuper(props);\n\n\t\tthis.setTag( 'table');\n\t\tthis.m_cells = new Map<number, CellData>();\n\t}\n\n\tprivate _getCell(row: number, col: number, create = true): CellData {\n\t\tlet idx = _mkid(row, col);\n\t\treturn this.m_cells.get(idx) ?? (create ? { item: undefined } : null);\n\t}\n\n\tprivate _setCell(row: number, col: number, cell: CellData, update = false) {\n\n\t\tlet idx = _mkid(row, col);\n\t\tthis.m_cells.set(idx, cell);\n\n\t\tif (this.dom && cell.item && update) {\n\n\t\t\tif (cell.item instanceof Component) {\n\t\t\t\tcell.item.update();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.enumChilds((c) => {\n\t\t\t\t\tlet crow = c.getData('row');\n\t\t\t\t\tif (crow == row) {\n\t\t\t\t\t\tlet ccol = c.getData('col');\n\t\t\t\t\t\tif (ccol == col) {\n\t\t\t\t\t\t\tc.setContent(cell.item);\n\t\t\t\t\t\t\tc.update();\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\n\tsetCell(row: number, col: number, item: ComponentContent) {\n\t\tlet cell = this._getCell(row, col);\n\t\tcell.item = item;\n\t\tthis._setCell(row, col, cell, true);\n\t}\n\n\tsetCellData(row: number, col: number, data: any ) {\n\t\tlet cell = this._getCell(row, col);\n\t\tcell.data = data;\n\t\tthis._setCell(row, col, cell, true);\n\t}\n\n\tgetCellData(row: number, col: number ) {\n\t\tlet cell = this._getCell(row, col, false);\n\t\treturn cell?.data;\n\t}\n\n\tmerge(row: number, col: number, rowCount: number, colCount: number) {\n\t\tlet cell = this._getCell(row, col);\n\t\tcell.rowSpan = rowCount;\n\t\tcell.colSpan = colCount;\n\t\tthis._setCell(row, col, cell);\n\t}\n\n\tsetCellWidth(row: number, col: number, width?: number) {\n\t\tlet cell = this._getCell(row, col);\n\t\tcell.width = width;\n\t\tthis._setCell(row, col, cell);\n\t}\n\n\tsetCellHeight(row: number, col: number, height?: number) {\n\t\tlet cell = this._getCell(row, col);\n\t\tcell.height = height;\n\t\tthis._setCell(row, col, cell);\n\t}\n\n\tsetCellClass(row: number, col: number, cls: string) {\n\t\tlet cell = this._getCell(row, col);\n\t\tcell.cls = cls;\n\t\tthis._setCell(row, col, cell);\n\t}\n\n\tsetColClass(col, cls) {\n\t\tlet cell = this._getCell(-1, col);\n\t\tcell.cls = cls;\n\t\tthis._setCell(-1, col, cell);\n\t}\n\n\tsetRowClass(row, cls) {\n\t\tlet cell = this._getCell(row, 999);\n\t\tcell.cls = cls;\n\t\tthis._setCell(row, 999, cell);\n\t}\n\n\tgetCell(row, col) {\n\t\tlet cell = this._getCell(row, col);\n\t\treturn cell?.item;\n\t}\n\n\trender() {\n\n\t\tlet rows = [];\n\t\tlet skip: number[] = [];\n\n\t\tfor (let r = 0; r < this.m_props.rows; r++) {\n\n\t\t\tlet cols = [];\n\t\t\tfor (let c = 0; c < this.m_props.columns; c++) {\n\n\t\t\t\tlet idx = _mkid(r, c);\n\t\t\t\tif (skip.indexOf(idx) >= 0) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet cell = this.m_cells.get(idx);\n\t\t\t\tlet cdata = this.m_cells.get(_mkid(-1, c));\n\n\t\t\t\tlet cls = '';\n\t\t\t\tif (cell && cell.cls) {\n\t\t\t\t\tcls = cell.cls;\n\t\t\t\t}\n\n\t\t\t\tif (cdata && cdata.cls) {\n\t\t\t\t\tcls += ' ' + cdata.cls;\n\t\t\t\t}\n\n\t\t\t\tlet cc = new Component({\n\t\t\t\t\ttag: 'td',\n\t\t\t\t\tcontent: cell?.item,\n\t\t\t\t\twidth: cell?.width,\n\t\t\t\t\theight: cell?.height,\n\t\t\t\t\tdata: { row: r, col: c },\n\t\t\t\t\tcls\n\t\t\t\t});\n\n\t\t\t\tif (cell) {\n\t\t\t\t\tlet rs = cell.rowSpan ?? 0,\n\t\t\t\t\t\tcs = cell.colSpan ?? 0;\n\n\t\t\t\t\tif (rs > 0) { cc.setAttribute('rowspan', rs + 1); }\n\t\t\t\t\tif (cs > 0) { cc.setAttribute('colspan', cs + 1); }\n\n\t\t\t\t\tif (rs || cs) {\n\t\t\t\t\t\tfor (let sr = 0; sr <= rs; sr++) {\n\t\t\t\t\t\t\tfor (let sc = 0; sc <= cs; sc++) {\n\t\t\t\t\t\t\t\tskip.push(_mkid(sr + r, sc + c));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcols.push(cc);\n\t\t\t}\n\n\t\t\tlet rdata = this._getCell(r, 999, false);\n\n\t\t\tlet rr = new Component({\n\t\t\t\ttag: 'tr',\n\t\t\t\tdata: { row: r },\n\t\t\t\tcontent: cols,\n\t\t\t\tcls: rdata?.cls\n\t\t\t});\n\n\t\t\trows.push(rr);\n\t\t}\n\n\t\tthis.setContent(rows);\n\t}\n}\n\n/**\n * @ignore\n */\n\nfunction _mkid(row: number, col: number): number {\n\treturn row * 1000 + col;\n}\n\n/**\n * @ignore\n */\n\nfunction _getid(key: number) {\n\treturn {\n\t\trow: Math.floor(key / 1000) | 0,\n\t\tcol: (key % 1000) | 0\n\t}\n}\n\n// :: SCROLLVIEW ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\ninterface ScrollViewProps extends CProps {\n}\n\nexport class ScrollView extends Component<ScrollViewProps> {\n\n\tconstructor(props: ScrollViewProps) {\n\t\tsuper(props);\n\n\t\tthis.setContent(props.content);\n\t}\n\n\tsetContent(content: ComponentContent) {\n\n\t\tif (!content) {\n\t\t\tsuper.setContent(null);\n\t\t}\n\t\telse {\n\t\t\tlet container;\n\t\t\tif (isArray(content)) {\n\t\t\t\tcontainer = new VLayout({ content });\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcontainer = content;\n\t\t\t}\n\n\t\t\tcontainer.addClass('@scroll-container');\n\t\t\tsuper.setContent(container);\n\t\t}\n\t}\n}\n\n\n// :: MASONERY ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\n// from a nice article of Andy Barefoot\n//\thttps://medium.com/@andybarefoot/a-masonry-style-layout-using-css-grid-8c663d355ebb\n\nexport class Masonry extends Container {\n\n\tconstructor(props) {\n\t\tconst items = props.items;\n\t\tprops.items = undefined;\n\n\t\tsuper(props);\n\n\t\tthis.setDomEvent('sizechange', () => {\n\t\t\tthis.resizeAllItems( );\n\t\t});\n\n\t\tif( items ) {\n\t\t\titems.forEach( i => {\n\t\t\t\tthis.addItem( i );\n\t\t\t});\n\t\t}\n\t}\n\n\tresizeItem(item: Component) {\n\n\t\tconst style = this.getComputedStyle();\n\n\t\tconst rowHeight = style.parse('grid-auto-rows');\n\t\tconst rowGap = style.parse('grid-row-gap');\n\n\t\tlet content = item.queryItem('.content');\n\t\tif( !content ) {\n\t\t\tcontent = item;\n\t\t}\n\n\t\tif (content && (rowHeight + rowGap)) {\n\t\t\tconst rc = content.getBoundingRect();\n\t\t\tconst rowSpan = Math.ceil( (rc.height + rowGap) / (rowHeight + rowGap) );\n\t\t\titem.setStyleValue('gridRowEnd', \"span \" + rowSpan);\n\t\t}\n\t}\n\t \n\tresizeAllItems( ) {\n\t\tthis.queryAll( \".item\", ( itm ) => {;\n\t\t\tthis.resizeItem( itm );\n\t\t} );\n\t}\n\n\taddItem( itm: Component ) {\n\t\titm.addClass( 'content' );\n\t\tthis.appendChild( new Container( {\n\t\t\tcls: 'item',\n\t\t\tcontent: itm\n\t\t}));\n\t}\n}\n\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file popup.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\n\nimport { Container, CProps, flyWrap, SizerOverlay, EvOverlayResize, Component, ContainerEventMap, EvSize } from './component'\nimport { Point, Size, getMousePos, asap } from './tools'\nimport { BasicEvent } from './x4events';\nimport { Application } from './application';\n\n\nexport interface EvMove extends BasicEvent {\n\tpos: Point;\n}\n\nexport function EvMove(pos: Point): EvMove {\n\treturn BasicEvent<EvMove>({ pos });\n}\n\n\nexport interface PopupEventMap extends ContainerEventMap {\n\tsize: EvSize;\n\tmove: EvMove;\n}\n\nexport interface PopupProps<E extends PopupEventMap = PopupEventMap> extends CProps<E> {\n\tsizable?: boolean;\n}\n\n\n/**\n * base class for all popup elements\n */\n\nexport class Popup<P extends PopupProps = PopupProps, E extends PopupEventMap = PopupEventMap> extends Container<P, E>\n{\n\tprotected m_ui_mask: HTMLElement;\n\tprivate m_hasMask: boolean = true;\n\n\tstatic modal_stack: HTMLElement[] = [];\n\n\tconstructor(props: P) {\n\t\tsuper(props);\n\n\t\tthis.addClass('@hidden');\n\t}\n\n\tenableMask(enable = true) {\n\t\tthis.m_hasMask = enable;\n\t}\n\n\t/**\n\t * display the popup on screen\n\t */\n\n\tpublic show(modal?: boolean) {\n\n\t\tif (modal !== undefined) {\n\t\t\tthis.m_hasMask = modal ? true : false;\n\t\t}\n\t\telse {\n\t\t\tmodal = this.m_hasMask;\n\t\t}\n\n\t\tif (this.m_hasMask) {\n\n\t\t\t// remove the focus\n\t\t\tconst focus = x4document.activeElement as HTMLElement;\n\t\t\tif (focus) {\n\t\t\t\tfocus.blur()\n\t\t\t}\n\t\t\tthis.m_ui_mask = <HTMLElement>x4document.body.lastChild;\n\n\t\t\twhile (this.m_ui_mask) {\n\n\t\t\t\tif (this.m_ui_mask.nodeType == 1) { \t// only element nodes\n\n\t\t\t\t\tlet elUI = flyWrap(this.m_ui_mask);\n\n\t\t\t\t\tif (elUI.hasClass('@menu') || elUI.hasClass('@non-maskable') ) {\n\t\t\t\t\t\t/* avoid circular dependencies instanceof Menu*/\n\t\t\t\t\t\t/* avoid nonmaskable elements tobe masked */\n\t\t\t\t\t}\n\t\t\t\t\telse if (elUI.getStyleValue('display') == 'none' || !elUI.isUserVisible()) {\n\t\t\t\t\t\t/* avoid masking hidden elements */\n\t\t\t\t\t}\n\t\t\t\t\telse if( !elUI.hasClass('@comp') ) {\n\t\t\t\t\t\t/* avoid masking element that are not to us */\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.m_ui_mask = <HTMLElement>this.m_ui_mask.previousSibling;\n\t\t\t}\n\n\t\t\tif (this.m_ui_mask) {\n\t\t\t\tflyWrap(this.m_ui_mask).addClass('@mask');\n\t\t\t}\n\t\t}\n\n\t\tif (modal) {\n\t\t\tApplication.instance().enterModal(true);\n\t\t}\n\n\t\t// to avoid body growing because of appendChild\n\t\tthis.setStyle({\n\t\t\tleft: 0,\n\t\t\ttop: 0\n\t\t});\n\n\t\tx4document.body.appendChild(this._build());\n\n\t\tthis.removeClass('@hidden');\n\t\tthis.centerOnScreen( );\n\n\t\tif (modal) {\n\t\t\tlet focus = x4document.activeElement;\n\t\t\tif (!this.dom.contains(focus)) {\n\t\t\t\t\n\t\t\t\tconst autofocus = this.queryItem('[autofocus]');\n\t\t\t\tif( autofocus ) {\n\t\t\t\t\tautofocus.focus( )\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet tabbable = this.queryAll('[tabindex]');\n\n\t\t\t\t\tif( tabbable ) {\n\t\t\t\t\t\t// remove hidden elements\n\t\t\t\t\t\ttabbable = tabbable.filter((el) => el.offsetParent !== null);\n\t\t\t\t\t\tif (tabbable.length) {\n\t\t\t\t\t\t\ttabbable[0].focus( );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tPopup.modal_stack.push(this.dom);\n\t\t}\n\t}\n\n\tcenterOnScreen( ) {\n\t\tlet rc = this.getBoundingRect();\n\n\t\t//let x = (x4document.body.clientWidth - rc.width) / 2,\n\t\t//\ty = (x4document.body.clientHeight - rc.height) / 2;\n\n\t\tconst x = `max( 0px, 50vw - ${rc.width/2}px )`;\t//(x4dom_1.x4document.body.clientWidth - rc.width) / 2;\n\t\tconst y = `max( 0px, 50vh - ${rc.height/2}px )`;\t//(x4dom_1.x4document.body.clientHeight - rc.height) / 2;\n\n\t\tthis.setStyleValue('left', x);\n\t\tthis.setStyleValue('top', y);\n\t}\n\n\t/**\n\t* display the popup at a specific position\n\t* @param x \n\t* @param y \n\t*/\n\n\tpublic displayAt(x: number, y: number, align: string = 'top left', offset?: { x, y }, modal = false ) {\n\n\t\tthis.show( modal );\n\n\t\tlet halign = 'l',\n\t\t\tvalign = 't';\n\n\t\tif (align.indexOf('right') >= 0) {\n\t\t\thalign = 'r';\n\t\t}\n\n\t\tif (align.indexOf('bottom') >= 0) {\n\t\t\tvalign = 'b';\n\t\t}\n\n\t\t// @TODO: this is a minimal overflow problem solution\n\t\tlet rc = x4document.body.getBoundingClientRect(),\n\t\t\trm = this.getBoundingRect();\n\n\t\tif (halign == 'r') {\n\t\t\tx -= rm.width;\n\t\t}\n\n\t\tif (valign == 'b') {\n\t\t\ty -= rm.height;\n\t\t}\n\n\t\tif (offset) {\n\t\t\tx += offset.x;\n\t\t\ty += offset.y;\n\t\t}\n\n\t\tif (x < 4) {\n\t\t\tx = 4;\n\t\t}\n\n\t\tif ((x + rm.width) > rc.right - 4) {\n\t\t\tx = rc.right - 4 - rm.width;\n\t\t\tif (offset?.x < 0) {\n\t\t\t\tx += offset.x;\n\t\t\t}\n\t\t}\n\n\t\tif (y < 4) {\n\t\t\ty = 4;\n\t\t}\n\n\t\tif ((y + rm.height) > rc.bottom - 4) {\n\t\t\ty = rc.bottom - 4 - rm.height;\n\n\t\t\tif (offset?.y < 0) {\n\t\t\t\ty += offset.y;\n\t\t\t}\n\t\t}\n\n\t\tthis.setStyle({ left: x, top: y });\n\t}\n\n\t/**\n\t * close the popup \n\t */\n\n\tpublic close() {\n\t\tthis.hide();\n\n\t\tif (this.m_hasMask && this.m_ui_mask) {\n\t\t\tflyWrap(this.m_ui_mask).removeClass('@mask');\n\t\t\tconst app = Application.instance();\n\t\t\tapp.enterModal(false);\n\t\t}\n\n\t\tlet index = Popup.modal_stack.indexOf(this.dom);\n\t\tif (index >= 0) {\n\t\t\tPopup.modal_stack.splice(index);\n\t\t}\n\n\t\tthis.dispose();\n\t}\n\n\tcomponentCreated() {\n\n\t\tif (this.m_props.sizable) {\n\n\t\t\tthis.addClass('@size-all');\n\n\t\t\tlet els = ['top', 'right', 'bottom', 'left', 'topleft', 'topright', 'bottomleft', 'bottomright'];\n\n\t\t\tfor (let sens of els) {\n\t\t\t\tnew SizerOverlay({\n\t\t\t\t\ttarget: this,\n\t\t\t\t\tsens: sens as any,\n\t\t\t\t\tevents: { rawresize: (e) => this._mouseResize(e) }\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * resize for 'all' resize attribute\n\t */\n\n\tprivate _mouseResize(event: EvOverlayResize) {\n\n\t\tevent.preventDefault();\n\n\t\tlet irc = this.getBoundingRect();\n\t\tlet st = this.getComputedStyle();\n\t\tlet ev = event.ui_event;\n\n\t\tlet tm = st.parse('marginTop'),\n\t\t\tlm = st.parse('marginLeft'),\n\t\t\trm = st.parse('marginRight'),\n\t\t\tbm = st.parse('marginBottom');\n\n\t\tlet ix = 0,\n\t\t\tiy = 0;\n\n\t\tlet mp = getMousePos(ev, true);\n\n\t\t// horz\n\t\tswitch (event.sens) {\n\t\t\tcase 'topright':\n\t\t\tcase 'bottomright':\n\t\t\tcase 'right': ix = (irc.right - rm) - mp.x; break;\n\n\t\t\tcase 'topleft':\n\t\t\tcase 'bottomleft':\n\t\t\tcase 'left': ix = (irc.left - lm) - mp.x; break;\n\t\t}\n\n\t\t// vert\n\t\tswitch (event.sens) {\n\t\t\tcase 'bottomleft':\n\t\t\tcase 'bottomright':\n\t\t\tcase 'bottom': iy = (irc.bottom - bm) - mp.y; break;\n\n\t\t\tcase 'topleft':\n\t\t\tcase 'topright':\n\t\t\tcase 'top': iy = (irc.top - tm) - mp.y; break;\n\t\t}\n\n\t\t// left & top are with margin\n\t\t// width & height not\n\t\tirc.left -= lm;\n\t\tirc.top -= tm;\n\n\t\t//console.log( 'capture' );\n\n\t\tlet sens = event.sens;\n\n\t\tComponent.setCapture(this, (ne: UIEvent) => {\n\n\t\t\t//console.log( ne );\n\n\t\t\tlet __move = (ex, ey) => {\n\n\t\t\t\tlet left = irc.left,\n\t\t\t\t\ttop = irc.top,\n\t\t\t\t\twidth = irc.width,\n\t\t\t\t\theight = irc.height;\n\n\t\t\t\tlet dx, dy;\n\t\t\t\tlet px = ex + ix,\n\t\t\t\t\tpy = ey + iy;\n\n\t\t\t\tif (px < 0) {\n\t\t\t\t\tpx = 0;\n\t\t\t\t}\n\n\t\t\t\tif (py < 0) {\n\t\t\t\t\tpy = 0;\n\t\t\t\t}\n\n\t\t\t\t// horz\n\t\t\t\tswitch (sens) {\n\t\t\t\t\tcase 'topright':\n\t\t\t\t\tcase 'bottomright':\n\t\t\t\t\tcase 'right': width = px - left; break;\n\n\t\t\t\t\tcase 'topleft':\n\t\t\t\t\tcase 'bottomleft':\n\t\t\t\t\tcase 'left': dx = left - px; width += dx; left -= dx; break;\n\t\t\t\t}\n\n\t\t\t\t// vert\n\t\t\t\tswitch (sens) {\n\t\t\t\t\tcase 'bottomleft':\n\t\t\t\t\tcase 'bottomright':\n\t\t\t\t\tcase 'bottom': height = py - top; break;\n\n\t\t\t\t\tcase 'topleft':\n\t\t\t\t\tcase 'topright':\n\t\t\t\t\tcase 'top': dy = top - py; height += dy; top -= dy; break;\n\t\t\t\t}\n\n\t\t\t\tlet newsize = new Size(width, height);\n\t\t\t\tthis.setStyle({ left, top, width: newsize.width, height: newsize.height });\n\n\t\t\t\tthis.emit('size', EvSize(newsize));\n\t\t\t}\n\n\t\t\tif (ne.type == 'mouseup' || ne.type == 'touchend') {\n\t\t\t\tComponent.releaseCapture();\n\t\t\t}\n\t\t\telse if (ne.type == 'mousemove') {\n\t\t\t\tlet me = ne as MouseEvent;\n\t\t\t\t__move(me.pageX, me.pageY);\n\t\t\t}\n\t\t\telse if (ne.type == 'touchmove') {\n\t\t\t\tlet tev = ne as TouchEvent;\n\t\t\t\t__move(tev.touches[0].pageX, tev.touches[0].pageY);\n\t\t\t}\n\t\t});\n\t}\n}\n\n\n\n\n\n/**\n * handle tab key\n */\n\nfunction x4handleKeyDown(e: KeyboardEvent) {\n\n\tif (e.key == 'Tab' || e.key == 'Enter') {\n\n\t\tconst target = e.target as HTMLElement;\n\t\tif (target.tagName == 'TEXTAREA') {\n\t\t\treturn;\n\t\t}\n\n\t\tconst el = Component.getElement( target );\n\t\tif( el && (el.hasAttribute('wants-tab') || el.hasAttribute('wants-enter')) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet topStack = x4document.body;\n\t\tif (Popup.modal_stack.length) {\n\t\t\ttopStack = Popup.modal_stack[Popup.modal_stack.length - 1];\n\t\t}\n\n\t\t_nextTab(topStack, e.target as HTMLElement, e.shiftKey);\n\t\te.stopPropagation();\n\t\te.preventDefault();\n\t}\n}\n\n/**\n * cycle through tabs\n */\n\nfunction _nextTab(root: HTMLElement, el: HTMLElement, prev: boolean) {\n\n\t// first check if the focus is one of our child (disabled...)\n\tlet focusEl = x4document.activeElement;\n\tif (!root.contains(focusEl)) {\n\t\treturn;\n\t}\n\n\tlet comp = Component.getElement(el);\n\n\t// get a list of elements with tab index, this way we should abble to\n\t// cycle on them (not on browser address nor under dialog elements)\n\tlet tab_indexes:HTMLElement[] = Array.from( root.querySelectorAll<HTMLElement>('[tabindex]') );\n\n\t// remove hidden elements\n\ttab_indexes = tab_indexes.filter((el) => el.offsetParent !== null);\n\tif (!tab_indexes.length) {\n\t\treturn;\n\t}\n\n\tlet ct = tab_indexes.indexOf(el);\n\n\tif (ct < 0) {\n\t\tct = 0;\n\t}\n\telse {\n\t\tif (prev) {\n\t\t\tif (ct > 0) {\n\t\t\t\tct--;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tct = tab_indexes.length - 1;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif (ct < tab_indexes.length - 1) {\n\t\t\t\tct++;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tct = 0;\n\t\t\t}\n\t\t}\n\t}\n\n\ttab_indexes[ct].focus();\n}\n\nfunction installKBHandler( ) {\n\t// set on body to be called after document (where all component domevent go)\n\tx4document.body.addEventListener('keydown', x4handleKeyDown, true);\n}\n\n// too early ?\nx4document.body ? installKBHandler( ) : window.addEventListener( 'load', installKBHandler );\n", "/**\r\n* ___ ___ __\r\n* \\ \\/ / / _\r\n* \\ / /_| |_\r\n* / \\____ _| \r\n* /__/\\__\\ |_|\r\n* \r\n* @file action.ts\r\n* @author Etienne Cochard \r\n*\r\n* Copyright (c) 2019-2023 R-libre ingenierie\r\n*\r\n* Permission is hereby granted, free of charge, to any person obtaining a copy \r\n* of this software and associated documentation files (the \"Software\"), to deal \r\n* in the Software without restriction, including without limitation the rights \r\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \r\n* of the Software, and to permit persons to whom the Software is furnished to do so, \r\n* subject to the following conditions:\r\n* The above copyright notice and this permission notice shall be included in all copies\r\n* or substantial portions of the Software.\r\n*\r\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \r\n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \r\n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \r\n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \r\n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n**/\r\n\r\nimport { BasicEvent, EvChange } from './x4events'\r\nimport { BaseComponent, BaseComponentEventMap, BaseComponentProps } from './base_component'\r\nimport { IconID } from \"./icon\"\r\nimport { EventHandler } from './component';\r\n\r\n//TODO: implement all\r\n\r\n\r\nexport interface EvAction extends BasicEvent {\r\n}\r\n\r\nexport function EvAction( source: Action ) {\r\n\treturn BasicEvent<EvAction>({source});\r\n}\r\n\r\ninterface ActionEventMap extends BaseComponentEventMap {\r\n\trun: EvAction;\r\n\tchange: EvChange;\r\n}\r\n\r\ninterface ActionProps extends BaseComponentProps<ActionEventMap> {\r\n\tid?: any;\r\n\ttext?: string;\r\n\ticon?: IconID;\r\n\tdisabled?: boolean;\r\n\thidden?: boolean;\r\n\tchecked?: boolean;\r\n\r\n\trun: EventHandler<EvAction>;\r\n\tchange?: EventHandler<EvChange>;\r\n}\r\n\r\nexport class Action extends BaseComponent<ActionProps,ActionEventMap> {\r\n\r\n\tconstructor( props: ActionProps ) {\r\n\t\tsuper( props );\r\n\r\n\t\tthis.mapPropEvents( props, \"run\" );\r\n\t}\r\n\r\n\tget props( ) {\r\n\t\treturn this.m_props;\r\n\t}\r\n\r\n\tset text( t: string ) {\r\n\t\tthis.m_props.text = t;\r\n\t\tthis.emit( \"change\", EvChange(this) );\r\n\t}\r\n\r\n\tset icon( i: IconID ) {\r\n\t\tthis.m_props.icon = i;\r\n\t\tthis.emit( \"change\", EvChange(this) );\r\n\t}\r\n\r\n\tfire( ) {\r\n\t\tthis.emit( \"run\", EvAction(this) );\r\n\t}\r\n}\r\n\r\n", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file icon.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Component, CProps } from './component'\nimport { Stylesheet } from './styles'\nimport { HtmlString, isString } from './tools';\nimport { BasicEvent, EvChange, EventMap, EventSource } from './x4events';\n\n// ============================================================================\n// [ICON]\n// ============================================================================\n\n/**\n * iconID can be:\n * - \"url( <path to image> )\" ex: \"url(my/path/to/my/image.svg)\"\n * - \"var( <css variable> )\"\n * - \"cls( <font class> )\"\n * - \"char( <character> )\" ex: \"font-char( \\uf00d )\"\n */\n\nexport type IconID = string | number;\n\nexport interface IconProps extends CProps {\n\ticon: IconID;\n\tsize?: number;\n}\n\nexport interface EvLoaded extends BasicEvent {\n\turl: string;\n\tsvg: string;\n}\n\nexport function EvLoaded( url: string, svg: string, context = null ) {\n\treturn BasicEvent<EvLoaded>({ url, svg, context });\n}\n\ninterface LoadingEventMap extends EventMap {\n\tloaded: EvLoaded;\n}\n\nfunction trimQuotes( str:string ): string {\n\tconst l = str.length;\n\n\t//chrome\n\tif( str[0]=='\"' && str[l-1]=='\"' ) {\n\t\tstr = str.substring( 1, l-1 )\n\t\tstr = str.replaceAll( '\\\\\"', \"'\" );\n\t\treturn str;\n\t}\n\n\t//firefox\n\tif( str[0]==\"'\" && str[l-1]==\"'\" ) {\n\t\tstr = str.substring( 1, l-1 )\n\t\treturn str;\n\t}\n\n\treturn str;\n}\n\nclass Loader extends EventSource<LoadingEventMap> {\n\tsvgs: Map<string,string>;\n\n\tconstructor( ) {\n\t\tsuper( );\n\t\tthis.svgs = new Map( );\n\t}\n\n\tload( url: string ) {\n\t\tif( this.svgs.has(url) ) {\n\t\t\tconst svg = this.svgs.get( url );\n\t\t\tif( svg ) {\n\t\t\t\t//console.log( 'cached=', url );\n\t\t\t\tthis.signal( 'loaded', EvLoaded(url,svg) );\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// mark it as loading\n\t\t\tthis.svgs.set( url, null );\n\n\t\t\t// then start loading\n\t\t\tconst _load = async ( url ) => {\n\t\t\t\t\t\n\t\t\t\t// shortcut\n\t\t\t\tif( url.substring(0,24)==\"data:image/svg+xml;utf8,\") {\n\t\t\t\t\tconst svg = url.substring(24);\n\t\t\t\t\tthis.svgs.set( url, svg );\n\t\t\t\t\tthis.signal( 'loaded', EvLoaded(url,svg) );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tconst r = await fetch( url );\n\t\t\t\t\tif( r.ok ) {\n\t\t\t\t\t\tconst svg = await r.text();\n\t\t\t\t\t\t// check response, must be svg\n\t\t\t\t\t\t//TODO: find better\n\t\t\t\t\t\tif (!svg.startsWith(\"<svg\") && !svg.startsWith('<?xml') ) {\n\t\t\t\t\t\t\tconsole.error( \"svg loading error (svg files must start with <svg... ): \", svg );\n\t\t\t\t\t\t\tthis.signal( 'loaded', EvLoaded(url,\"\") );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tthis.svgs.set( url, svg );\n\t\t\t\t\t\t\tthis.signal( 'loaded', EvLoaded(url,svg) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_load( url );\t\t\t\n\t\t}\n\t}\n}\n\nconst svgLoader = new Loader( );\n\n\n/**\n * standard icon\n */\nexport class Icon extends Component<IconProps>\n{\n\tprivate m_icon: string;\n\tprivate m_iconName: IconID;\n\n\tconstructor( props: IconProps | string ) {\n\n\t\tif( isString(props) ) {\n\t\t\tsuper( { icon: props } );\n\t\t}\n\t\telse {\n\t\t\tsuper( props );\n\t\t}\n\n\t\tthis._setIcon( this.m_props.icon, false );\n\t\tif( this.m_props.size ) {\n\t\t\tthis.setStyleValue( 'fontSize', this.m_props.size );\n\t\t}\n\t}\n\n\tprivate _setIcon(icon: IconID, remove_old: boolean) {\n\n\t\tif( !icon ) {\n\t\t\tthis.m_iconName = '';\n\t\t\treturn;\n\t\t}\n\n\t\tthis.removeClass( '@svg' );\n\n\t\t//\ttodo: deprecated\n\t\tlet name, url: string;\n\t\tif (typeof (icon) === 'number') {\n\t\t\ticon = icon.toString(16);\n\t\t\tname = icon;\n\t\t\tconsole.error( \"deprecation error: invalid icon name\" );\t\n\t\t}\n\t\telse {\n\t\t\t// var( <var-name> )\n\t\t\t//\t\n\t\t\t//\tin the .css\n\t\t\t// --------------------------\n\t\t\t//\t:root {\n\t\t\t//\t\t--chevron-up: data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\"><path d=\"M0 96C0 78.33 14.33 64 32 64H416C433.7 64 448 78.33 448 96C448 113.7 433.7 128 416 128H32C14.33 128 0 113.7 0 96z\"/></svg>';\n\t\t\t//\t}\n\t\t\t//\n\t\t\t//\tvar( \"--chevron-up\" )\n\t\t\tconst reVar = /\\s*var\\s*\\(\\s*(.+)\\s*\\)\\s*/gi;\n\t\t\tlet match_var = reVar.exec( icon );\n\t\t\twhile( match_var ) {\n\t\t\t\tconst varname = match_var[1].trim( );\n\t\t\t\ticon = (Stylesheet.getVar(varname) as string).trim( );\n if (icon == '' || icon === undefined) {\n\t\t\t\t\tconsole.error( `icon: unable to find variable named '${varname}'` );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ticon = trimQuotes( icon );\n\t\t\t\t}\n\n\t\t\t\tmatch_var = reVar.exec( icon );\n\t\t\t}\n\n\t\t\t// <svg ...>\n\t\t\tif( icon.startsWith('<svg') ) {\n\t\t\t\tthis._setSVG( 'data:image/svg+xml;utf8,'+icon);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\t//\tsvg( <svg-filename> )\t-> \tsvg( \"mysvgfile.svg\" )\t\n\t\t\t//\t<svg-filename>.svg \t\t-> \"mysvgfile.svg\"\n\n\t\t\tconst reSvg = /\\s*svg\\s*\\(\\s*(.+)\\s*\\)\\s*/gi;\n\t\t\tconst reSvg2 = /(.*\\.svg)$/gi;\n\t\t\t\n\t\t\tlet match_svg = reSvg.exec( icon ) || reSvg2.exec(icon);\n\t\t\tif( match_svg ) {\n\t\t\t\tconst url = match_svg[1].trim( );\n\t\t\t\tthis._setSVG( url );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t//\tdata( <direct> )\n\t\t\t//\tdata( \"data:image/svg+xml;utf8,<svg...></svg>\" )\n\n\t\t\tconst reSvg4 = /^\\s*(data\\:image\\/.+)\\s*$/gi;\n\t\t\tlet match_dta = reSvg4.exec( icon );\n\t\t\tif( match_dta ) {\n\t\t\t\tthis._setSVG( match_dta[1] );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\t//\tcls( \"fas fa-angle-up\" )\n\t\t\t//\n\t\t\tconst reCls = /\\s*cls\\s*\\(\\s*(.+)\\s*\\)\\s*/gi;\n\t\t\tlet match_cls = reCls.exec( icon );\n\t\t\tif( match_cls ) {\n\t\t\t\tconst classes = match_cls[1].trim( );\n\t\t\t\tthis.addClass( classes );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\t//\turl( \"www.google.com\" )\n\t\t\t//\n\t\t\tconst reUrl = /\\s*url\\s*\\(\\s*(.+)\\s*\\)\\s*/gi;\n\t\t\tlet match_url = reUrl.exec( icon );\n\t\t\tif( match_url ) {\n\t\t\t\turl = trimQuotes( match_url[1].trim( ) );\n\t\t\t\t// this value is escaped\t\t\t\t\n\t\t\t\turl = url.replaceAll( \"\\\\\", \"\" );\n\t\t\t\tthis._setSVG( url );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t//\turl( \"www.google.com\" )\n\t\t\t//\n\t\t\tconst reChar = /\\s*font-char\\s*\\(\\s*(.+)\\s*\\)\\s*/gi;\n\t\t\tlet match_char = reChar.exec( icon );\n\t\t\tif( match_char ) {\n\t\t\t\tthis.removeClass( '@svg-icon' );\n\t\t\t\tthis.setContent( match_char[1], false );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\telse {\n\t\t\t\t// todo: deprecated\n\t\t\t\tconsole.error( \"deprecation error: invalid icon name\" );\t\n\n\t\t\t\tname = icon;\n\t\t\t\ticon = Stylesheet.getVar( 'icon-'+icon ) as string;\n\n\t\t\t\tif( icon=='' || icon===undefined ) { \n\t\t\t\t\t// name your icon 'icon-xxx'\n\t\t\t\t\t// ex:\n\t\t\t\t\t// :root { --icon-zoom-p: f00e; }\n\t\t\t\t\ticon = '0'; \n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.m_iconName = name;\n\t\tif( this.m_icon===icon ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet css = Component.getCss(),\n\t\t\trulename: string;\n\n\t\tif (remove_old && this.m_icon) {\n\t\t\trulename = 'icon-' + name;\n\t\t\tthis.removeClass(rulename);\n\t\t}\n\t\t\t\t\n\t\t// generate dynamic css icon rule\n\t\trulename = 'icon-' + name;\n\t\t\n\t\tif( Icon.icon_cache[rulename]===undefined ) {\n\t\t\tIcon.icon_cache[rulename] = true;\n\n\t\t\tlet rule: string;\n\n\t\t\tif( url ) {\n\t\t\t\trule = `display: block; content: ' '; background-image: url(${url}); background-size: contain; width: 100%; height: 100%; background-repeat: no-repeat; color: white;`;\n\t\t\t}\n\t\t\telse {\n\t\t\t\trule = `content: \"\\\\${icon}\";`;\n\t\t\t}\n\n\t\t\tcss.setRule(rulename, `.${rulename}::before {${rule}}`);\n\t\t}\n\n\t\tthis.addClass(rulename);\n\t\tthis.m_icon = icon;\n\t}\n\n\t/**\n\t * change the icon\n\t * @param icon - new icon\n\t */\n\t\n\tpublic set icon( icon: IconID ) {\n\t\tthis._setIcon( icon, true );\n\t}\n\n\tpublic get icon( ) : IconID {\n\t\treturn this.m_iconName;\n\t}\n\n\tprivate _setSVG( url: string ) {\n\n\t\tconst set = ( ev: EvLoaded ) => {\n\t\t\t//console.log( 'set=', ev.url, 'url=', url );\n\t\t\t\n\t\t\tif( ev.url==url ) {\n\t\t\t\tthis.addClass( '@svg-icon' );\n\t\t\t\tthis.setContent( HtmlString.from(ev.svg), false );\n\t\t\t\tsvgLoader.off( 'loaded', set );\n\t\t\t}\n\t\t}\n\n\t\tsvgLoader.on( 'loaded', set );\n\t\tsvgLoader.load( url );\n\t}\n\n\t/**\n\t * todo: try to extract viewbox\n\t */\n\n\tprivate _setSVGPath( pth: string ) {\n\t\tthis.addClass( '@svg-icon' );\n\t\tthis.setContent( HtmlString.from(`<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"currentColor\"><path d=\"${pth}/></svg>`), false );\n\t}\n\n\t/**\n\t * \n\t */\n\t\n\tprivate static icon_cache = [];\n}\n\n", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file label.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Component, CProps } from './component'\nimport { escapeHtml, HtmlString } from './tools'\nimport { Icon, IconID } from './icon'\n\n// ============================================================================\n// [LABEL]\n// ============================================================================\n\nexport interface LabelProps extends CProps {\n\ttext: string | HtmlString;\n\ticon?: IconID;\n\talign?: 'left' | 'right' | 'center';\n\tmultiline?: boolean;\t// understand \\n as newlines\n}\n\n/**\n * Standard label \n */\n\nexport class Label extends Component<LabelProps>\n{\n\t/**\n\t * double constructor, from string/html or as usual\n\t */\n\n\tconstructor( props: LabelProps );\n\tconstructor( text: string | HtmlString );\n\tconstructor( param: any ) {\n\n\t\tif( typeof(param)==='string' || param instanceof HtmlString ) {\n\t\t\tsuper( { text: param } );\n\t\t}\n\t\telse {\n\t\t\tsuper( param );\n\t\t}\n\t}\n\n\t/** @ignore */\n\trender( props: LabelProps ) {\n\n\t\tlet text: any = this.m_props.text;\n\t\tif( this.m_props.multiline && !(text instanceof HtmlString) ) {\n\t\t\ttext = new HtmlString( escapeHtml(text,true) );\n\t\t}\n\n\t\tif( !props.icon ) {\n\t\t\tthis.setContent( text );\n\t\t}\n\t\telse {\n\t\t\tthis.setTag( 'span' );\n\t\t\tthis.addClass( '@hlayout' );\n\n\t\t\tthis.setContent( [\n\t\t\t\tnew Icon( { id: 'l_icon', icon: props.icon } ),\n\t\t\t\tnew Component( { content: text, ref: 'text' } )\n\t\t\t] );\n\t\t}\n\n\t\tthis.addClass( props.align ?? 'left' );\n\t}\n\n\t/**\n\t * change the displayed text\n\t * @param text - new text\n\t */\n\n\tpublic set text( txt: string | HtmlString ) {\n\n\t\tlet props = this.m_props;\t\n\n\t\tif( props.text!==txt ) {\n\t\t\tprops.text = txt;\n\n\t\t\tlet text: any = this.m_props.text;\n\t\t\tif( this.m_props.multiline && !(text instanceof HtmlString) ) {\n\t\t\t\ttext = new HtmlString(escapeHtml(text,true) );\n\t\t\t}\n\n\t\t\tif( this.dom ) {\n\n\t\t\t\tlet comp: Component = this;\n\t\t\t\tif( this.m_props.icon ) {\n\t\t\t\t\tcomp = this.itemWithRef<Component>( 'text' );\n\t\t\t\t}\n\n\t\t\t\tcomp.setContent( text );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic get text( ) : string | HtmlString {\n\t\treturn this.m_props.text;\n\t}\n\n\t/**\n\t * change the displayed icon\n\t * @param icon - new icon\n\t */\n\n\tpublic set icon( icon: IconID ) {\n\t\tthis.m_props.icon = icon;\n\t\tlet ico = this.itemWithRef<Icon>('l_icon');\n\t\tif (ico) {\n\t\t\tico.icon = icon;\n\t\t}\n\t\telse {\n\t\t\tthis.update( 0 );\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic get icon( ) : IconID {\n\t\tlet ico = this.itemWithRef<Icon>('l_icon');\n\t\treturn ico?.icon;\n\t}\n}\n\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file menu.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\n\nimport { CEventMap, Component, CProps } from './component'\nimport { EvClick, EventCallback } from './x4events'\n\nimport { Action } from './action'\n\nimport { Popup, PopupProps } from './popup'\nimport { Icon, IconID } from './icon'\nimport { Label } from './label'\nimport { HLayout } from './layout'\nimport { isString, getMousePos } from './tools'\n\n// ============================================================================\n// [MENU]\n// ============================================================================\n\nexport class MenuSeparator extends Component {\n}\n\nexport class MenuTitle extends Label {\n}\n\n\n/**\n * Standard Menu\n */\n\nexport type MenuOrSep = MenuItem | MenuSeparator | MenuTitle;\n\nexport interface MenuProps extends PopupProps {\n\titems?: MenuOrSep[];\n}\n\nexport class Menu extends Popup<MenuProps>\n{\n\tprivate static watchCount: number = 0;\n\tprivate static rootMenu: Menu = null;\n\n\tprotected m_subMenu: Menu;\n\tprotected m_opener: MenuItem;\n\tprotected m_virtual: boolean;\n\tprotected m_lock: number;\n\n\tconstructor(props: MenuProps, opener?: MenuItem) {\n\t\tsuper(props);\n\n\t\tthis.addClass('@shadow');\n\n\t\tthis.m_opener = opener;\n\t\tthis.m_virtual = false;\n\t\tthis.m_lock = 0;\n\n\t\tthis.enableMask(false);\n\t}\n\n\tlock(yes: boolean) {\n\t\tthis.m_lock += yes ? 1 : -1;\n\t}\n\n\tsetVirtual() {\n\t\tthis.m_virtual = true;\n\t}\n\n\tsetSubMenu(menu: Menu) {\n\t\tthis.m_subMenu = menu;\n\t}\n\n\thideSubMenu() {\n\t\tif (this.m_subMenu) {\n\t\t\tthis.m_subMenu.m_opener._close();\n\t\t\tthis.m_subMenu.hide();\n\t\t\tthis.m_subMenu = null;\n\t\t}\n\t}\n\n\t/** @ignore */\n\trender(props: MenuProps) {\n\t\tthis.setContent(props.items);\n\t}\n\n\t/**\n\t* \n\t*/\n\n\tpublic show() {\n\t\tif (!this.m_virtual) {\n\t\t\tMenu._addMenu(this);\n\t\t}\n\n\t\tsuper.show();\n\t}\n\n\t/**\n\t * \n\t*/\n\n\tpublic close() {\n\n\t\tif (!this.dom && !this.m_virtual) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.m_opener) {\n\t\t\tthis.m_opener._close();\n\t\t}\n\n\t\tif (this.m_subMenu) {\n\t\t\tthis.m_subMenu.close();\n\t\t\tthis.m_subMenu = null;\n\t\t}\n\n\t\tsuper.close();\n\t\tMenu._removeMenu();\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic clear() {\n\t\tthis.m_props.items = [];\n\t}\n\n\t/**\n\t* @internal\n\t*/\n\n\tpublic static _addMenu(menu) {\n\t\t//console.log( 'addmenu' );\n\t\tif (Menu.watchCount == 0) {\n\t\t\tMenu.rootMenu = menu;\n\t\t\tx4document.addEventListener('mousedown', Menu._mouseWatcher);\n\t\t}\n\n\t\tMenu.watchCount++;\n\t}\n\n\tpublic static _removeMenu() {\n\t\t//console.log( 'removemenu' );\n\t\tconsole.assert(Menu.watchCount > 0);\n\t\tMenu.watchCount--;\n\n\t\tif (Menu.watchCount == 0) {\n\t\t\tx4document.removeEventListener('mousedown', Menu._mouseWatcher);\n\t\t}\n\t}\n\n\tprivate static _mouseWatcher(ev: MouseEvent) {\n\t\tif (ev.defaultPrevented) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet elOn = <HTMLElement>ev.target;\n\n\t\twhile (elOn) {\n\t\t\t// is mouse on a menu\n\t\t\tlet mouseon = Component.getElement(elOn);\n\t\t\tif (mouseon && (mouseon instanceof Menu /*|| elOn.$el instanceof Menubar*/)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\telOn = elOn.parentElement;\n\t\t}\n\n\t\tMenu._discardAll();\n\t}\n\n\t/**\n\t* hide all the visible menus\n\t*/\n\n\tpublic static _discardAll() {\n\t\tif (Menu.rootMenu) {\n\t\t\tMenu.rootMenu.close();\n\t\t\tMenu.rootMenu = null;\n\t\t}\n\t}\n\n\tpublic displayAt(ev: UIEvent): void;\n\tpublic displayAt(x: number, y?: number, align?: string, offset?: { x, y }): void;\n\tpublic displayAt(...args) {\n\n\t\tif (!this.m_lock) {\n\t\t\tMenu._discardAll();\n\t\t}\n\n\t\tlet x, y, align, offset;\n\n\t\tif (args.length == 1) {\n\t\t\t({ x, y } = getMousePos(args[0], true));\n\t\t}\n\t\telse {\n\t\t\t[x, y, align, offset] = args;\n\t\t}\n\n\t\tif (!align) {\n\t\t\talign = 'top left';\n\t\t}\n\n\t\tsuper.displayAt(x, y, align, offset);\n\t}\n}\n\n/**\n * MENU ITEM\n */\n\ninterface MenuItemEventMap extends CEventMap {\n\tclick: EvClick;\n}\n\nexport interface MenuItemProps extends CProps {\n\titemId?: any;\n\ttext?: string;\n\ticon?: IconID;\t\t// pass -1 to avoid space for icon\n\titems?: MenuOrSep[];\n\tchecked?: boolean;\n\tcls?: string;\n\tclick?: EventCallback<EvClick>;\t// shortcut to events: { click ... }\n\n\taction?: Action;\n}\n\n\n\nexport class MenuItem extends Component<MenuItemProps, MenuItemEventMap> {\n\n\tprivate m_menu: Menu;\n\tprivate m_isOpen: boolean;\n\tprivate m_action: Action;\n\n\tconstructor(action: Action);\n\tconstructor(text: string, click: EventCallback<EvClick>);\n\tconstructor(props: MenuItemProps);\n\tconstructor(a, b?) {\n\n\t\tif (a instanceof Action) {\n\t\t\tsuper({\n\t\t\t\tclick: () => { a.fire(); }\n\t\t\t});\n\n\t\t\tthis.m_action = a;\n\t\t}\n\t\telse if (isString(a)) {\n\t\t\tsuper({\n\t\t\t\ttext: a,\n\t\t\t\tclick: b\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tsuper(a);\n\t\t}\n\n\t\tthis.mapPropEvents(this.m_props, 'click');\n\n\t\tthis.m_menu = null;\n\t\tthis.m_isOpen = false;\n\n\t\tthis.setDomEvent('mousedown', (e) => this._mousedown(e));\n\t\tthis.setDomEvent('click', (e) => this._click(e));\n\t}\n\n\t/** @ignore */\n\trender(props: MenuItemProps) {\n\n\t\tlet icon = props.icon ?? 0;\n\t\tlet text = props.text;\n\n\t\tif (props.checked !== undefined) {\n\t\t\ticon = props.checked ? 'var( --x4-icon-check )' : 0;\n\t\t}\n\n\t\tif (this.m_action) {\n\t\t\tif (!icon) {\n\t\t\t\ticon = this.m_action.props.icon;\n\t\t\t}\n\n\t\t\tif (text === undefined) {\n\t\t\t\ttext = this.m_action.props.text;\n\t\t\t}\n\t\t}\n\n\t\tlet popIco = null;\n\t\tif (this.isPopup) {\n\t\t\tthis.addClass('@popup-menu-item');\n\t\t\tpopIco = new Icon({ icon: \"var( --x4-icon-chevron-right )\", cls: \"pop-mark\" });\n\t\t}\n\n\t\tif (!text && !icon) {\n\t\t\tthis.addClass('@separator');\n\t\t}\n\n\t\tif (props.cls) {\n\t\t\tthis.addClass(props.cls);\n\t\t}\n\n\t\tthis.setTag('a');\n\t\t//@bug: do not kill focus on click \n\t\t//\tthis.setAttribute( 'tabindex', '0' );\n\n\t\tthis.setContent([\n\t\t\ticon ? new Icon({ icon }) : null,\n\t\t\tnew Label({ flex: 1, text }),\n\t\t\tpopIco\n\t\t]);\n\t}\n\n\tget id(): any {\n\t\treturn this.m_props.itemId;\n\t}\n\n\tget text(): string {\n\t\treturn this.m_props.text;\n\t}\n\n\tget isPopup(): boolean {\n\t\treturn !!this.m_props.items;\n\t}\n\n\tpublic _close() {\n\t\tthis.removeClass('@opened');\n\t\tthis.m_isOpen = false;\n\t}\n\n\tprotected _click(ev: MouseEvent) {\n\t\tif (!this.isPopup) {\n\t\t\tthis.emit('click', EvClick());\n\t\t\tMenu._discardAll();\n\t\t}\n\t}\n\n\tprotected _mousedown(ev: MouseEvent) {\n\n\t\tif (this.isPopup) {\n\t\t\tif (!this.m_menu) {\n\t\t\t\tthis.m_menu = new Menu({ items: this.m_props.items }, this);\n\t\t\t}\n\n\t\t\tlet doClose = this.m_isOpen;\n\n\t\t\t// if parent menu has an opened sub menu, close it\n\t\t\tlet parent_menu = Component.getElement(this.dom, Menu);\n\n\t\t\tif (parent_menu) {\n\t\t\t\tparent_menu.hideSubMenu();\n\t\t\t}\n\n\t\t\tif (!doClose) {\n\t\t\t\tif (parent_menu) {\n\t\t\t\t\tparent_menu.setSubMenu(this.m_menu);\n\t\t\t\t}\n\n\t\t\t\tthis.m_isOpen = true;\n\n\t\t\t\tlet rc = this.getBoundingRect();\n\n\t\t\t\tthis.m_menu.lock(true);\n\t\t\t\tif (parent_menu) {\n\t\t\t\t\t// standard menu\n\t\t\t\t\tthis.m_menu.displayAt(rc.right, rc.top);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// menubar / menubutton\n\t\t\t\t\tthis.m_menu.displayAt(rc.left, rc.bottom);\n\t\t\t\t}\n\t\t\t\tthis.m_menu.lock(false);\n\t\t\t\tthis.addClass('@opened');\n\t\t\t}\n\n\t\t\tev.preventDefault();\n\t\t}\n\t}\n}\n\n/**\n * \n */\n\nexport class MenuBar extends HLayout {\n\tprotected m_items: MenuOrSep[];\n\n\tconstructor(props: MenuProps, opener?: MenuItem) {\n\t\tsuper(props);\n\n\t\tconsole.assert(false, 'not imp');\n\n\t\tthis.addClass('@shadow');\n\t\tthis.m_items = props.items;\n\t}\n\n\t/** @ignore */\n\trender() {\n\t\tthis.setContent(this.m_items);\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file listview.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\n\nimport { Container, Component, ContainerProps, ContainerEventMap, EvDblClick } from './component'\nimport { IconID } from './icon';\nimport { HLayout, VLayout } from './layout'\nimport { Popup, PopupEventMap, PopupProps } from './popup';\nimport { HtmlString, isFunction } from './tools';\nimport { Menu, MenuItem } from \"./menu\";\n\nimport { EvContextMenu, EvSelectionChange, EvClick, EventCallback, BasicEvent, EvChange } from \"./x4events\";\n\n/**\n * item definition\n */\n\nexport interface ListViewItem {\n\tid: any;\n\ttext?: string | HtmlString;\t\t// if you need pure text\n\thtml?: boolean;\t\t// if text is html\n\ticon?: IconID;\n\tdata?: any;\n};\n\n/**\n * callback to render item\n */\n\nexport interface RenderListItem {\n\t(item: ListViewItem): any;\n}\n\n/**\n * callback to fill the list\n */\nexport interface PopulateItems {\n\t( filter: string ): ListViewItem[];\n}\n\n/**\n * listview can generate these events\n */\n\nexport interface ListViewEventMap extends ContainerEventMap {\n\tclick?: EvClick;\n\tdblClick?: EvDblClick;\n\tcontextMenu?: EvContextMenu;\n\tselectionChange?: EvSelectionChange;\n\tcancel?: EvCancel;\n}\n\n\n/**\n * listview properties\n */\nexport interface ListViewProps<E extends ListViewEventMap = ListViewEventMap> extends ContainerProps<E> {\n\titems?: ListViewItem[];\n\tpopulate?: PopulateItems;\n\tgadgets?: Component[]; // gadgets to instert at bottom\n\n\tvirtual?: boolean;\t// if true, items will be rendered on demand\n\titemHeight?: number;\t// in case of a virtual list, item height\n\n\trenderItem?: RenderListItem;\n\n\tclick?: EventCallback<EvClick>;\t// shortcut to events: { click: ... }\n\tdblClick?: EventCallback<EvDblClick>;// shortcut to events: { dblClick: ... }\n\tcontextMenu?: EventCallback<EvContextMenu>;// shortcut to events: { contentMenu: ... }\n\tselectionChange?: EventCallback<EvSelectionChange>;// shortcut to events: { selectionChange: ... }\n\tcancel?: EventCallback<EvCancel>;\t// shortcut to events: { cancel: ... }\n}\n\n/**\n * Standard listview class\n */\n\nexport class ListView extends VLayout<ListViewProps,ListViewEventMap> {\n\n\tprotected m_selection: {\n\t\titem: ListViewItem;\n\t\tcitem: Component;\n\t}\n\n\tprotected m_defer_sel: any;\n\n\tprotected m_container: Container;\n\tprotected m_view: Container;\n\n\tprotected m_topIndex: number;\n\tprotected m_itemHeight: number;\n\n\tprotected m_cache: Map<number, Component>; // recycling elements\n\n\tconstructor(props: ListViewProps) {\n\t\tsuper(props);\n\n\t\tthis.setDomEvent('keydown', (e) => this.handleKey(e));\n\t\tthis.setDomEvent('click', (e) => this._handleClick(e));\n\t\tthis.setDomEvent('dblclick', (e) => this._handleClick(e));\n\t\tthis.setDomEvent('contextmenu', (e) => this._handleCtxMenu(e));\n\n\t\tthis._setTabIndex(props.tabIndex, 0);\n\t\tthis.mapPropEvents(props, 'click', 'dblClick', 'contextMenu', 'selectionChange', 'cancel' );\n\t}\n\n\tcomponentCreated() {\n\n\t\tif (this.m_props.virtual) {\n\t\t\tthis._buildItems();\n\t\t}\n\t\telse if( this.m_props.populate ) {\n\t\t\tthis.items = this.m_props.populate( null );\n\t\t}\n\t}\n\n\trender(props: ListViewProps) {\n\n\t\tprops.items = props.items || [];\n\t\tprops.gadgets = props.gadgets;\n\t\tprops.renderItem = props.renderItem;\n\t\tprops.virtual = props.virtual ?? false;\n\n\t\tthis.m_topIndex = 0;\n\n\t\tif (props.virtual) {\n\t\t\tconsole.assert(props.itemHeight !== undefined);\n\t\t\tthis.m_itemHeight = props.itemHeight;\n\t\t\tthis.m_cache = new Map<number, Component>();\n\t\t\tthis.addClass('virtual');\n\t\t}\n\t\telse {\n\t\t\tthis.m_itemHeight = undefined;\n\t\t\tthis.m_cache = undefined;\n\t\t}\n\n\t\tthis._buildContent();\n\t}\n\n\t/**\n\t * change the list of item displayed\n\t * @param items - new array of items\n\t * @deprecated\n\t */\n\n\tpublic set items(items: ListViewItem[]) {\n\t\tthis.setItems( items );\n\t}\n\n\tpublic get items( ) {\n\t\treturn this.m_props.items;\n\t}\n\n\t/**\n\t * change the list of item displayed\n\t * @param items - new array of items\n\t */\n\t\n\tpublic setItems( items: ListViewItem[], keepSel = true ) {\n\t\tthis.m_props.items = items;\n\n\t\tif( !keepSel ) {\n\t\t\tthis.m_selection = null;\n\t\t}\n\t\t\n\t\tif( !this.m_container ) {\n\t\t\tthis._buildContent( );\n\t\t}\n\t\telse {\n\t\t\tthis._buildItems( );\n\t\t}\n\t}\n\n\tpublic handleKey(ev: KeyboardEvent) {\n\n\t\tlet moveSel = (sens) => {\n\n\t\t\tlet items: ListViewItem[];\n\t\t\tif (isFunction(this.m_props.items)) {\n\t\t\t\titems = this.m_props.items();\n\t\t\t\tthis.m_props.items = items;\n\t\t\t}\n\t\t\telse {\n\t\t\t\titems = this.m_props.items;\n\t\t\t}\n\n\t\t\tlet newsel: ListViewItem;\n\t\t\tif (!this.m_selection) {\n\t\t\t\tif (items) {\n\t\t\t\t\tnewsel = items[0];\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet index = items.findIndex((item) => item === this.m_selection.item);\n\t\t\t\tif (sens > 0 && index < (items.length - 1)) {\n\t\t\t\t\tnewsel = items[index + 1];\n\t\t\t\t}\n\t\t\t\telse if (sens < 0 && index > 0) {\n\t\t\t\t\tnewsel = items[index - 1];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tnewsel = this.selection\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet citem = this._findItemWithId(newsel?.id);\n\t\t\tthis._selectItem(newsel, citem, true);\n\t\t}\n\n\t\tswitch (ev.key) {\n\t\t\tcase 'ArrowDown': {\n\t\t\t\tmoveSel(1);\n\t\t\t\tev.preventDefault( );\n\t\t\t\tev.stopPropagation();\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'ArrowUp': {\n\t\t\t\tmoveSel(-1);\n\t\t\t\tev.preventDefault( );\n\t\t\t\tev.stopPropagation();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/** @ignore */\n\tprivate _buildContent() {\n\n\t\tlet props = this.m_props;\n\n\t\tif (props.virtual) {\n\t\t\tthis.m_container = new Container({\n\t\t\t\tcls: '@scroll-container',\n\t\t\t\tcontent: []\n\t\t\t});\n\n\t\t\tthis.m_view = new Container({\n\t\t\t\tcls: '@scroll-view',\n\t\t\t\tflex: 1,\n\t\t\t\tcontent: this.m_container,\n\t\t\t\tdom_events: {\n\t\t\t\t\tsizechange: () => this._updateScroll(true),\n\t\t\t\t\tscroll: () => this._updateScroll(false),\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.setContent(\n\t\t\t\t[\n\t\t\t\t\tthis.m_view,\n\t\t\t\t\tprops.gadgets ? new HLayout({\n\t\t\t\t\t\tcls: 'gadgets',\n\t\t\t\t\t\tcontent: props.gadgets\n\t\t\t\t\t}) : null,\n\t\t\t\t]\n\t\t\t);\n\t\t}\n\t\telse {\n\t\t\tthis.m_view = undefined;\n\t\t\tthis.m_container = new VLayout({\n\t\t\t\tcls: '@scroll-container',\n\t\t\t\tcontent: []\n\t\t\t});\n\n\t\t\tthis.addClass('@scroll-view');\n\t\t\tthis.setContent(this.m_container, false);\n\t\t}\n\n\t\tif (props.virtual) {\n\t\t\tthis.m_container.setStyleValue('height', props.items.length * this.m_itemHeight);\n\t\t}\n\n\t\tif (this.dom || !props.virtual ) {\n\t\t\tthis._buildItems();\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _updateScroll(forceUpdate: boolean) {\n\n\t\tconst update = () => {\n\t\t\tlet newTop = Math.floor(this.m_view.dom.scrollTop / this.m_itemHeight);\n\n\t\t\tif (newTop != this.m_topIndex || forceUpdate) {\n\t\t\t\tthis.m_topIndex = newTop;\n\t\t\t\tthis._buildItems();\n\t\t\t}\n\t\t}\n\n\t\tif (forceUpdate) {\n\t\t\tthis.startTimer('scroll', 10, false, update);\n\t\t}\n\t\telse {\n\t\t\tupdate();\n\t\t}\n\t}\n\n\tprivate async _buildItems() {\n\t\tlet props = this.m_props;\n\t\tlet items: Component[] = [];\n\n\t\tlet list_items = props.items;\n\t\tif (isFunction(list_items)) {\n\t\t\tlist_items = list_items();\n\t\t}\n\n\t\tlet selId = this.m_selection?.item.id;\n\t\tlet selFnd = false;\n\n\t\tif (props.virtual) {\n\t\t\tlet rc = this.getBoundingRect();\n\t\t\tlet limit = 100;\n\n\t\t\tlet y = 0;\n\t\t\tlet top = this.m_topIndex * this.m_itemHeight;\n\t\t\tlet index = this.m_topIndex;\n\t\t\tlet height = rc.height;\n\t\t\tlet count = props.items.length;\n\n\t\t\tlet newels = [];\n\n\t\t\tlet cache = this.m_cache;\n\t\t\tthis.m_cache = new Map<number, Component>();\n\n\t\t\twhile (y < height && index < count && --limit > 0) {\n\n\t\t\t\tlet it = props.items[index];\n\t\t\t\tlet itm: Component;\n\n\t\t\t\tif (cache.has(it.id)) {\n\t\t\t\t\titm = cache.get(it.id);\t// reuse it\n\t\t\t\t\tcache.delete(it.id);\t\t// cache will contain only elements to remove\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\titm = this._renderItem(it);\n\t\t\t\t\tnewels.push(itm);\n\t\t\t\t}\n\n\t\t\t\tif (selId == it.id) {\n\t\t\t\t\titm.addClass('@selected');\n\t\t\t\t\tselFnd = true;\n\t\t\t\t}\n\n\t\t\t\titm.setStyleValue('top', top + y);\n\t\t\t\titems.push(itm);\n\n\t\t\t\tthis.m_cache.set(it.id, itm);\t// keep it for next time\n\n\t\t\t\ty += this.m_itemHeight;\n\t\t\t\tindex++;\n\t\t\t}\n\n\t\t\t// all element remaining here are to remove\n\t\t\tcache.forEach((c) => {\n\t\t\t\tc.dispose();\n\t\t\t});\n\n\t\t\t//\tappend new elements\n\t\t\tthis.m_container.appendChild(newels);\n\t\t\tthis.m_container.setStyleValue( 'height', count*this.m_itemHeight );\n\n\t\t\t// check that it's still existing\n\t\t\tif( !selFnd ) {\n\t\t\t\tif( !list_items.some( it => selId == it.id ) ) {\n\t\t\t\t\tthis.m_selection = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t\telse {\n\t\t\tlist_items.forEach((it) => {\n\t\t\t\tlet itm = this._renderItem(it);\n\t\t\t\tif (selId == it.id) {\n\t\t\t\t\titm.addClass('@selected');\n\t\t\t\t\tselFnd = true;\n\t\t\t\t}\n\n\t\t\t\titems.push(itm);\n\t\t\t});\n\n\t\t\tthis.m_container.setContent(items, false);\n\n\t\t\tif( !selFnd ) {\n\t\t\t\tthis.m_selection = null;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (this.m_defer_sel) {\n\t\t\tlet t = this.m_defer_sel;\n\t\t\tthis.m_defer_sel = undefined;\n\t\t\tthis.selection = t;\n\t\t}\n\t}\n\n\t/** @ignore \n\t * default rendering of an item\n\t */\n\n\tprivate _renderItem(item: ListViewItem): Component {\n\t\t\n\t\tconst newItem = this.onRenderItem( item );\n\n\t\tnewItem.setAttribute( 'data-id', item.id );\n\t\tnewItem.addClass('@list-item');\n\t\tnewItem.setData('item-id', item.id);\n\t\t\t\t\t\n\t\treturn newItem;\n\t}\n\n\tonRenderItem( item: ListViewItem): Component {\n\t\tif (this.m_props.renderItem) {\n\t\t\treturn this.m_props.renderItem(item);\n\t\t}\n\t\telse {\n\t\t\treturn new HLayout({ content: item.text });\n\t\t}\n\t}\n\n\t/** @ignore */\n\tprivate _handleClick(e: MouseEvent) {\n\n\t\te.stopImmediatePropagation();\n\t\te.preventDefault( );\n\t\t\n\t\tlet dom = e.target as HTMLElement,\n\t\t\tself = this.dom,\n\t\t\tlist_items = this.m_props.items as ListViewItem[];\t// already created by build\n\n\t\t// go up until we find something interesting\n\t\twhile (dom && dom != self) {\n\t\t\tlet itm = Component.getElement(dom),\n\t\t\t\tid = itm?.getData('item-id');\n\n\t\t\tif (id!==undefined) {\n\t\t\t\t// find the element\n\t\t\t\tlet item = list_items.find((item) => item.id == id);\n\t\t\t\tif (item) {\n\t\t\t\t\tlet event: BasicEvent;\n\t\t\t\t\tif (e.type == 'click') {\n\t\t\t\t\t\tevent = EvClick(item);\n\t\t\t\t\t\tthis.emit('click', event);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tevent = EvDblClick(item);\n\t\t\t\t\t\tthis.emit('dblClick', event);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!event.defaultPrevented) {\n\t\t\t\t\t\tthis._selectItem(item, itm);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis._selectItem(null, null);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdom = dom.parentElement;\n\t\t}\n\n\t\tthis._selectItem(null, null);\n\t}\n\n\t/** @ignore */\n\tprivate _handleCtxMenu(e: MouseEvent) {\n\n\t\te.preventDefault();\t\t\n\n\t\tlet dom = e.target as HTMLElement,\n\t\t\tself = this.dom,\n\t\t\tlist_items = this.m_props.items as ListViewItem[];\t// already created by build;\n\n\t\twhile (dom && dom != self) {\n\t\t\tlet itm = Component.getElement(dom),\n\t\t\t\tid = itm?.getData('item-id');\n\n\t\t\tif (id) {\n\n\t\t\t\t// find the element\n\t\t\t\tlet item = list_items.find((item) => item.id == id);\n\t\t\t\tif (item) {\n\t\t\t\t\tthis._selectItem(item, itm);\n\t\t\t\t\tthis.emit('contextMenu', EvContextMenu(e, item));\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdom = dom.parentElement;\n\t\t}\n\n\t\tthis.emit('contextMenu', EvContextMenu(e, null));\n\t}\n\n\t/**\n\t * @ignore\n\t * called when an item is selected by mouse\n\t */\n\n\tprotected _selectItem(item: ListViewItem, citem: Component, notify = true) {\n\n\t\tif (this.m_selection && this.m_selection.citem) {\n\t\t\tthis.m_selection.citem.removeClass('@selected');\n\t\t}\n\n\t\tthis.m_selection = item ? {\n\t\t\titem: item,\n\t\t\tcitem: citem\n\t\t} : null;\n\n\t\tif (this.m_selection && this.m_selection.citem) {\n\t\t\tthis.m_selection.citem.addClass('@selected');\n\t\t}\n\n\t\tif (notify) {\n\t\t\tthis.emit('selectionChange', EvSelectionChange(item));\n\t\t}\n\t}\n\n\t/**\n\t * return the current selection or null\n\t */\n\n\tpublic get selection() {\n\t\treturn this.m_selection ? this.m_selection.item : null;\n\t}\n\n\tpublic set selection(id: any) {\n\t\tif (id === null || id === undefined) {\n\t\t\tthis._selectItem(null, null);\n\t\t}\n\t\telse {\n\t\t\tif (isFunction(this.m_props.items)) {\n\t\t\t\tthis.m_defer_sel = id;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet item = this.m_props.items.find((item) => item.id == id);\n\t\t\t\tlet citem = this._findItemWithId(item.id);\n\t\t\t\tthis._selectItem(item, citem, false);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _findItemWithId(id: any) {\n\t\tlet citem: Component = null;\n\n\t\tif (this.dom) {\n\t\t\t// make the element visible to user\n\t\t\t// todo: problem with virtual listview\n\t\t\tthis.m_container.enumChilds((c: Component) => {\n\t\t\t\tif (c.getData('item-id') == id) {\n\t\t\t\t\tc.scrollIntoView();\n\t\t\t\t\tcitem = c;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\treturn citem;\n\t}\n\n\t/**\n\t * append or prepend a new item\n\t * @param item \n\t * @param prepend \n\t * @param select \n\t */\n\n\tappendItem( item: ListViewItem, prepend = false, select = true ) {\n\t\t\n\t\tif( prepend ) {\n\t\t\tthis.m_props.items.unshift( item );\n\t\t}\n\t\telse {\n\t\t\tthis.m_props.items.push( item );\n\t\t}\n\n\t\tif( select ) {\n\t\t\tthis.selection = null;\n\t\t}\n\n\t\tif( !this.m_container ) {\n\t\t\tthis._buildContent();\n\t\t}\n\t\telse {\n\t\t\tthis._buildItems();\n\t\t}\n\t\t\n\t\tif( select ) {\n\t\t\tthis.selection = item.id;\n\t\t}\n\t}\n\n\t/**\n\t * update an item\n\t */\n\n\t updateItem( id: any, item: ListViewItem ) {\n\n\t\t// find item\n\t\tconst idx = this.m_props.items.findIndex( itm => itm.id === id );\n\t\tif( idx<0 ) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t// take care of selection\n\t\tlet was_sel = false;\n\t\tif( this.m_selection && this.m_selection.item===this.m_props.items[idx] ) {\n\t\t\twas_sel = true;\n\t\t}\n\n\t\t// replace it in the list\n\t\tthis.m_props.items[idx] = item;\n\n\t\t// rebuild & replace it's line\n\t\tconst oldDOM = this.queryItem( `[data-id=\"${item.id}\"]` )?.dom;\n\t\tif( oldDOM ) {\n\t\t\tconst _new = this._renderItem( item );\n\n\t\t\tif( was_sel ) {\n\t\t\t\t_new.addClass( '@selected' );\n\t\t\t\tthis.m_selection.citem = _new;\n\t\t\t\tthis.m_selection.item = item;\n\t\t\t}\n\t\t\t\n\t\t\tconst newDOM = _new._build( );\n\t\t\tthis.m_container.dom.replaceChild( newDOM, oldDOM );\n\t\t}\n\t}\n\n\t\n}\n\n\n\n/**\n * Cancel Event\n */\n\nexport interface EvCancel extends BasicEvent {\n}\n\nexport function EvCancel( context = null ) {\n\treturn BasicEvent<EvCancel>({ context });\n}\n\ninterface PopupListViewEventMap extends PopupEventMap {\n\tcancel: EvCancel;\n}\n\ninterface PopupListViewProps extends PopupProps<PopupListViewEventMap> {\n\n}\n\n\n/**\n * \n */\n\nexport class PopupListView extends Popup<PopupListViewProps,PopupListViewEventMap> {\n\n\tm_list: ListView;\n\n\tconstructor(props: ListViewProps) {\n\t\tsuper({ tabIndex: false });\n\n\t\tthis.enableMask(false);\n\t\tthis.addClass( \"@non-maskable\" );\n\n\t\tprops.tabIndex = false;\n\t\tthis.m_list = new ListView(props);\n\t\t//this.m_list.addClass( '@fit' );\n\n\t\tthis.setContent(this.m_list);\n\t\tthis.mapPropEvents( props, 'cancel' );\n\t}\n\n\tset items( items: ListViewItem[] ) {\n\t\tthis.m_list.items = items;\n\t}\n\n\tpublic handleKey( ev: KeyboardEvent ) {\n\t\tthis.m_list.handleKey( ev );\n\t}\n\n\n\t// todo: move into popup\n\tprivate _handleClick = (e: MouseEvent) => {\n\t\tif (!this.dom) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet newfocus = <HTMLElement>e.target;\n\n\t\t// child of this: ok\n\t\tif (this.dom.contains(newfocus)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// menu: ok\n\t\tlet dest = Component.getElement(newfocus, MenuItem);\n\t\tif (dest) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.signal( 'cancel', EvCancel() );\n\t\tthis.close();\n\t}\n\n\t// todo: move into popup\n\tshow(modal?: boolean) {\n\t\tx4document.addEventListener('mousedown', this._handleClick);\n\t\tsuper.show(modal);\n\t}\n\n\thide( ) {\n\t\tx4document.removeEventListener('mousedown', this._handleClick);\n\t\tsuper.hide( );\n\t}\n\n\t// todo: move into popup\n\tclose() {\n\t\tx4document.removeEventListener('mousedown', this._handleClick);\n\t\tsuper.close();\n\t}\n\n\tget selection(): any {\n\t\treturn this.m_list.selection;\n\t}\n\n\tset selection(itemId: any) {\n\t\tthis.m_list.selection = itemId;\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file tooltips.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\n\nimport { Component } from './component'\nimport { Label } from './label'\nimport { Icon } from './icon'\nimport { isTouchDevice } from './tools'\n\n\nlet tipTmo;\nlet tooltip;\n\n/**\n * \n */\n\nexport class Tooltip extends Component {\n\n\tprivate m_text: Label;\n\n\tset text(text) {\n\t\tthis.m_text.text = text;\n\t}\n\n\t/** @ignore */\n\trender() {\n\t\tthis.setClass('@non-maskable', true);\n\t\tthis.setContent([\n\t\t\tnew Icon({ icon: 'var( --x4-icon-tip )' }),\n\t\t\tthis.m_text = new Label({ text: 'help' })\n\t\t]);\n\t}\n\n\t/**\n\t* display the menu at a specific position\n\t* @param x \n\t* @param y \n\t*/\n\n\tpublic displayAt(x: number, y: number, align: string = 'top left') {\n\n\t\tthis.show();\n\n\t\tlet halign = 'l',\n\t\t\tvalign = 't';\n\n\t\tif (align.indexOf('right') >= 0) {\n\t\t\thalign = 'r';\n\t\t}\n\n\t\tif (align.indexOf('bottom') >= 0) {\n\t\t\tvalign = 'b';\n\t\t}\n\n\t\t// @TODO: this is a minimal overflow problem solution\n\t\tlet rc = x4document.body.getBoundingClientRect(),\n\t\t\trm = this.getBoundingRect();\n\n\t\tif (halign == 'r') {\n\t\t\tx -= rm.width;\n\t\t}\n\n\t\tif (valign == 'b') {\n\t\t\ty -= rm.height;\n\t\t}\n\n\t\tif ((x + rm.width) > rc.right) {\n\t\t\tx = rc.right - rm.width;\n\t\t}\n\n\t\tif ((y + rm.height) > rc.bottom) {\n\t\t\ty = rc.bottom - rm.height - 17;\t// default cursor height\n\t\t}\n\n\t\tthis.setStyle({ left: x, top: y });\n\t}\n}\n\nexport type TooltipHandler = (text: string) => void;\n\nexport function initTooltips(cb?: TooltipHandler) {\n\n\tif (isTouchDevice()) {\n\t\treturn;\n\t}\n\n\tlet tipTarget = {\n\t\ttarget: null,\n\t\tx: 0,\n\t\ty: 0\n\t};\n\n\tfunction handle_mpos(event: MouseEvent) {\n\t\ttipTarget.x = event.pageX;\n\t\ttipTarget.y = event.pageY;\n\t}\n\n\tfunction handle_mouse(event: MouseEvent) {\n\n\t\tlet target: HTMLElement = <HTMLElement>event.target;\n\t\tlet tip = null;\n\n\t\ttipTarget.x = event.pageX + 10;\n\t\ttipTarget.y = event.pageY + 15;\n\n\t\twhile (target) {\n\t\t\ttip = target.getAttribute('tip');\n\t\t\tif (tip) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\ttarget = target.parentElement;\n\t\t}\n\n\t\tif (target == tipTarget.target || (tooltip && target == tooltip.dom)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!target || !tip) {\n\t\t\ttipTarget.target = null;\n\n\t\t\tif (cb) { cb(null); }\n\t\t\telse { _hideTip(); }\n\n\t\t\treturn;\n\t\t}\n\n\t\ttipTarget.target = target;\n\t\tif (cb) { cb(null); }\n\t\telse { _hideTip(); }\n\n\t\tif (cb) {\n\t\t\tcb(tip);\n\t\t}\n\t\telse {\n\t\t\ttipTmo = setTimeout(() => {\n\n\t\t\t\tif (tooltip === undefined) {\n\t\t\t\t\ttooltip = new Tooltip({});\n\t\t\t\t\tx4document.body.appendChild(tooltip._build());\n\t\t\t\t}\n\n\t\t\t\ttooltip.text = tip;\n\t\t\t\ttooltip.displayAt(tipTarget.x + 17, tipTarget.y + 17, 'top left');\n\t\t\t}, 700);\n\t\t}\n\n\t}\n\n\tfunction _hideTip() {\n\t\tif (tipTmo) {\n\t\t\tclearTimeout(tipTmo);\n\t\t}\n\n\t\tif (tooltip) {\n\t\t\ttooltip.hide();\n\t\t}\n\t}\n\n\tx4document.body.addEventListener('mouseover', handle_mouse);\n\tx4document.body.addEventListener('mouseout', handle_mouse);\n\tx4document.body.addEventListener('mousemove', handle_mpos);\n}", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file input.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\nimport { Tooltip } from './tooltips';\nimport { Component, CProps, CEventMap, EvFocus } from './component'\n//import { EvChange } from './x4_events';\n\nexport type EditType = 'text' | 'number' | 'email' | 'date' | 'password' | 'file' | 'checkbox' | 'radio';\n\nexport interface ValueHook {\n\tget( ) : any;\n\tset( v: any ) : void;\n}\n\nexport interface InputEventMap extends CEventMap {\n//\tchange?: EvChange;\n//\tfocus?: EvFocus;\n}\n\nexport interface InputProps<P extends InputEventMap = InputEventMap> extends CProps<P> {\n\tvalue?: string;\n\tname?: string;\n\ttype?: EditType\n\tplaceHolder?: string;\n\tautoFocus?: boolean;\n\treadOnly?: boolean;\n\ttabIndex?: number | boolean;\n\tpattern?: string;\n\tuppercase?: boolean;\n\tspellcheck?: boolean;\n\tvalue_hook?: ValueHook;\n\tmin?: number;\n\tmax?: number;\n\tautosel?: boolean;\n}\n\n\n/**\n * base class for elements implementing an input\n * CARE derived classes must set this.ui.input\n */\n\nexport class Input extends Component<InputProps,InputEventMap>\n{\n\tprivate m_error_tip: Tooltip;\n\n\tconstructor( props: InputProps ) {\n\t\tsuper( props );\n\t}\n\n\tcomponentDisposed() {\n\t\tif (this.m_error_tip) {\n\t\t\tthis.m_error_tip.dispose();\n\t\t}\n\n\t\tsuper.componentDisposed();\n\t}\n\n\t/** @ignore */\t\n\trender( props: InputProps ) {\n\n\t\tthis.setTag( 'input' );\n\t\tthis._setTabIndex( props.tabIndex );\n\n\t\tthis.setAttributes( {\n\t\t\tvalue: props.value,\n\t\t\ttype: props.type || 'text',\n\t\t\tname: props.name,\n\t\t\tplaceholder: props.placeHolder,\n\t\t\tautofocus: props.autoFocus,\n\t\t\treadonly: props.readOnly,\n\t\t\tautocomplete: 'off',\t// chrome ignore 'off' but not something else than 'on'\n\t\t\ttabIndex: props.tabIndex,\n\t\t\tspellcheck: props.spellcheck===false ? 'false' : undefined,\n\t\t\tmin: props.min,\n\t\t\tmax: props.max,\n\t\t\t...props.attrs\n\t\t});\n\n\t\tthis.m_props.autosel = props.autosel ?? true;\n\t\t\n\t\tif( props.uppercase ) {\n\t\t\tthis.setStyleValue( 'textTransform', 'uppercase' );\n\t\t}\n\n\t\tif( this.m_props.autosel ) {\n\t\t\tthis.setDomEvent( \"focus\", ( ) => {\n\t\t\t\tthis.selectAll( );\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic showError(text: string) {\n\n\t\tif (!this.m_error_tip) {\n\t\t\tthis.m_error_tip = new Tooltip({ cls: 'error' });\n\t\t\tx4document.body.appendChild(this.m_error_tip._build());\n\t\t}\n\n\t\tlet rc = this.getBoundingRect();\n\n\t\tthis.m_error_tip.text = text;\n\t\tthis.m_error_tip.displayAt(rc.right, rc.top-8, 'top right');\n\t\tthis.addClass('@error');\n\t}\n\n\tpublic clearError() {\n\n\t\tif (this.m_error_tip) {\n\t\t\tthis.m_error_tip.hide();\n\t\t\tthis.removeClass('@error');\n\t\t}\n\t}\n\n\tpublic getType( ) {\n\t\treturn this.m_props.type;\n\t}\n\n\t/**\n * return the current editor value\n */\n\n public get value( ) : string {\n\t\treturn this.getValue( );\n }\n\n\tpublic getValue( ): string {\n\t\tconst dom = this.dom as HTMLInputElement;\n\n\t\tif( this.dom ) {\n\t\t\tthis.m_props.value = dom.value;\n\t\t}\n\t\t\n\t\tif( this.m_props.uppercase ) {\n\t\t\tlet upper = this.m_props.value.toUpperCase( );\t// todo: locale ?\n\t\t\tif( dom && upper!=this.m_props.value ) {\n\t\t\t\tdom.value = upper; // update the input\n\t\t\t}\n\n\t\t\tthis.m_props.value = upper;\n\t\t}\n\t\t\n\t\treturn this.m_props.value;\n\t}\n\n /**\n * Change the editor value\n * @param value - new value to set\n */\n\t\n\tpublic set value( value: string ) {\n\t\tthis.setValue( value );\n\t}\n\t\n\tpublic setValue( value: string ) {\n\t\tthis.m_props.value = value;\n\n\t\tif( this.dom ) {\n\t\t\t(<HTMLInputElement>this.dom).value = value;\n\t\t}\n\t}\n\n\tpublic getStoreValue( ): any {\n\n\t\tif( this.m_props.value_hook ) {\n\t\t\treturn this.m_props.value_hook.get( );\n\t\t}\n\t\telse {\n\t\t\tlet type = this.getAttribute('type');\n\t\t\tif( type ) { type = type.toLowerCase( ); }\n\n\t\t\tlet value;\n\t\t\tconst dom = this.dom as HTMLInputElement;\n\n if( type === \"file\") {\n\t\t\t\tvalue = [];\n\t\t\t\t\n let files = dom.files;\n for( let file = 0; file < files.length; file++ ) {\n value.push( files[file].name );\n }\n }\n else if ( type === 'checkbox' ) {\n\t\t\t\tif( dom.checked ) {\n\t\t\t\t\tvalue = 1;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tvalue = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( type === 'radio' ) {\n\t\t\t\tif( dom.checked ) {\n\t\t\t\t\tvalue = this.value;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( type === 'date' ) {\n\t\t\t\tdebugger;\n\t\t\t}\n\t\t\telse if( type=='number' ) {\n\t\t\t\tvalue = this.value;\n\t\t\t\tif (value.indexOf(\",\") >= 0) {\n\t\t\t\t\tvalue = value.replace(\",\", \".\");\n\t\t\t\t} \n\t\t\t}\n\t\t\telse {\n\t\t\t\tvalue = this.value;\n\t\t\t}\n\n\t\t\treturn value;\n\t\t}\n\t}\n\n\tpublic setStoreValue( v: any ) {\n\t\tthis.clearError( );\n\t\tif( this.m_props.value_hook ) {\n\t\t\treturn this.m_props.value_hook.set( v );\n\t\t}\n\t\telse {\n\t\t\tlet type = this.getAttribute('type'),\n\t\t\t\tdom = (<HTMLInputElement>this.dom);\n\n\t\t\tif( type ) { type = type.toLowerCase( ); }\n\t\t\tif( type==='checkbox' ) {\n\t\t\t\tlet newval = v!==null && v!=='0' && v!==0 && v!==false;\n\t\t\t\tif( newval!==dom.checked ) {\n\t\t\t\t\tdom.setAttribute( 'checked', ''+newval );\n\t\t\t\t\tdom.dispatchEvent( new Event( 'change' ) );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.value = v;\n\t\t\t}\n\t\t}\n\t}\n\n\tset readOnly( ro: boolean ) {\n\t\tthis.setAttribute('readonly', ro );\n\t}\n\n\t/**\n\t * select all the text\n\t */\n\n\tpublic selectAll( ) {\n (<HTMLInputElement>this.dom).select(); \n\t}\n\t\n\t/**\n\t * select a part of the text\n\t * @param start \n\t * @param length \n\t */\n\n\tpublic select( start: number, length: number = 9999 ) : void {\n\t\t(<HTMLInputElement>this.dom).setSelectionRange( start, start+length );\n\t}\n\t\n\t/**\n\t * get the selection as { start, length }\n\t */\n\n\tpublic getSelection( ) {\n\t\tlet idom = (<HTMLInputElement>this.dom);\n\n\t\treturn {\n\t\t\tstart: idom.selectionStart,\n\t\t\tlength: idom.selectionEnd - idom.selectionStart,\n\t\t};\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file button.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\n\nimport { Component, CProps, CEventMap, HtmlString } from './component'\nimport { EventCallback, EvClick, EvChange } from './x4events'\n\nimport { Action } from './action'\nimport { Icon, IconID } from './icon'\nimport { Label } from './label'\nimport { Menu, MenuItem, MenuOrSep } from './menu'\nimport { isFunction } from './tools'\n\n/**\n * Button events\n */\n\ninterface ButtonEventMap extends CEventMap {\n\tclick: EvClick;\n}\n\ntype MenuCallBack = () => MenuOrSep[];\n\n/**\n * Button properties\n */\n\ninterface ButtonProps<E extends ButtonEventMap = ButtonEventMap> extends CProps<E> {\n\ttext?: string | HtmlString;\t// initial button text\n\ticon?: IconID;\t// optional icon id\n\trightIcon?: IconID;\t// optional icon id\n\talign?: 'center' | 'left' | 'right';\t// text alignment\n\tautoRepeat?: number; // time in ms or 0/undefined for none\n\tmenu?: MenuOrSep[] | MenuCallBack;\n\tclick?: EventCallback<EvClick>;\t// shortcut to events: { click: ... }\n\n\taction?: Action;\n}\n\n\n/**\n * Base button\n */\n\nexport class BaseButton<P extends ButtonProps = ButtonProps, E extends ButtonEventMap = ButtonEventMap> extends Component<P, E> {\n\n\tconstructor(props: P) {\n\t\tsuper(props);\n\n\t\tthis.setTag( 'button');\n\n\t\tthis.setDomEvent('click', (e) => this._handleClick(e));\n\t\tthis.setDomEvent('mousedown', () => { this._startAutoRep(true) });\n\t\tthis.setDomEvent('mouseup', () => { this._startAutoRep(false) });\n\t\tthis.setDomEvent('keydown', (e) => this._handleKeyDown(e));\n\n\t\tthis.mapPropEvents( props, 'click' );\t\t\n\t}\n\n\trender(props: ButtonProps) {\n\n\t\tconst action = props.action;\n\t\t\n\t\tlet icon = props.icon;\n\t\tlet text = props.text;\n\t\t\n\t\tif( action ) {\n\t\t\tif( !icon && action.props.icon ) {\n\t\t\t\ticon = action.props.icon;\n\t\t\t}\n\n\t\t\tif( text===undefined && action.props.text ) {\n\t\t\t\ttext = action.props.text;\n\t\t\t}\n\t\t}\n\n\t\tconst ui_icon = icon ? new Icon({ icon, cls: 'left', ref: 'l_icon' }) : null;\n\t\tconst ui_label = new Label({ flex: 1, text: text ?? '', align: props.align, ref: 'label' });\n\t\tconst ui_ricon = props.rightIcon ? new Icon({ icon: props.rightIcon, cls: 'right', ref: 'r_icon' }) : null;\n\n\t\tif( text===undefined ) {\n\t\t\tui_label.addClass( \"@hidden\" );\n\t\t}\n\t\t\n\t\tthis.setContent([ui_icon, ui_label, ui_ricon]);\n\t\tthis._setTabIndex(props.tabIndex);\n\t}\n\n\t/**\n\t * starts/stops the autorepeat\n\t */\n\n\tprivate _startAutoRep(start: boolean) {\n\n\t\tif (!this.m_props.autoRepeat) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (start) {\n\t\t\t// 1st timer 1s\n\t\t\tthis.startTimer('repeat', 700, false, () => {\n\t\t\t\t// auto click\n\t\t\t\tthis.startTimer('repeat', this.m_props.autoRepeat, true, this._sendClick);\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tthis.stopTimer('repeat');\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprotected _handleKeyDown(ev: KeyboardEvent) {\n\t\tif (!ev.ctrlKey && !ev.shiftKey && !ev.altKey) {\n\t\t\tif (ev.key == 'Enter' || ev.key == ' ') {\n\t\t\t\tthis._sendClick();\n\t\t\t\tev.preventDefault();\n\t\t\t\tev.stopPropagation();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * called by the system on click event\n\t */\n\n\tprotected _handleClick(ev: MouseEvent) {\n\n\t\tif (this.m_props.menu) {\n\t\t\tlet menu = new Menu({\n\t\t\t\titems: isFunction(this.m_props.menu) ? this.m_props.menu() : this.m_props.menu\n\t\t\t});\n\n\t\t\tlet rc = this.getBoundingRect();\n\t\t\tmenu.displayAt(rc.left, rc.bottom, 'tl');\n\t\t}\n\t\telse {\n\t\t\tthis._sendClick();\n\t\t}\n\n\t\tev.preventDefault();\n\t\tev.stopPropagation();\n\t}\n\n\t/**\n\t * sends a click to the observers\n\t */\n\n\tprotected _sendClick() {\n\t\tif (this.m_props.menu) {\n\t\t\tlet menu = new Menu({\n\t\t\t\titems: isFunction(this.m_props.menu) ? this.m_props.menu() : this.m_props.menu\n\t\t\t});\n\n\t\t\tlet rc = this.getBoundingRect();\n\t\t\tmenu.displayAt(rc.left, rc.bottom, 'tl');\n\t\t}\n\t\telse {\n\t\t\tthis.emit('click', EvClick());\n\t\t\tif( this.m_props.action ) {\n\t\t\t\tthis.m_props.action.fire( );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * change the button text\n\t * @example\n\t * ```ts\n\t * let btn = new Button( {\n\t * \ttext: 'hello'\n\t * });\n\t * \n\t * btn.text = 'world';\n\t * ```\n\t */\n\n\tpublic set text(text: string | HtmlString) {\n\t\tthis.m_props.text = text;\n\n\t\tlet label = this.itemWithRef<Label>('label');\n\t\tif (label) { label.text = text; label.removeClass(\"@hidden\") }\n\t}\n\n\tpublic get text(): string | HtmlString {\n\t\tlet label = this.itemWithRef<Label>('label');\n\t\treturn label?.text;\n\t}\n\n\t/**\n\t * change the button icon\n\t * todo: do nothing if no icon defined at startup\n\t *\n\t * @example\n\t * ```ts\n\t * let btn = new Button( {\n\t * \ttext: 'hello',\n\t * icon: 'close'\n\t * });\n\t * btn.setIcon( 'open' );\n\t * ```\n\t */\n\n\tpublic set icon(icon: IconID) {\n\t\tthis.m_props.icon = icon;\n\n\t\tlet ico = this.itemWithRef<Icon>('l_icon');\n\t\tif (ico) {\n\t\t\tico.icon = icon;\n\t\t}\n\t\telse {\n\t\t\tthis.update( );\n\t\t}\n\t}\n\n\tpublic get icon() {\n\t\tlet ico = this.itemWithRef<Icon>('l_icon');\n\t\treturn ico?.icon;\n\t}\n\n\t/**\n\t * change the button right icon\n\t * todo: do nothing if no icon defined at startup\n\t *\n\t * @example\n\t * ```ts\n\t * let btn = new Button( {\n\t * \ttext: 'hello',\n\t * icon: 'close'\n\t * });\n\t * btn.setIcon( 'open' );\n\t * ```\n\t */\n\n\tpublic set rightIcon(icon: IconID) {\n\t\tthis.m_props.rightIcon = icon;\n\t\tlet ico = this.itemWithRef<Icon>('r_icon');\n\t\tif (ico) {\n\t\t\tico.icon = icon;\n\t\t}\n\t}\n\n\tpublic get rightIcon() {\n\t\tlet ico = this.itemWithRef<Icon>('l_icon');\n\t\treturn ico?.icon;\n\t}\n\n\t/**\n\t * \n\t */\n\t\n\tset menu( items: MenuItem[] ) {\n\t\tthis.m_props.menu = items;\n\t}\n}\n\n// :: BUTTON ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\n/**\n * \n */\n\nexport class Button extends BaseButton<ButtonProps> {\n}\n\n// :: TOGGLE BUTTON ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\n\ninterface ToggleButtonEventMap extends ButtonEventMap {\n\tchange: EvChange;\n}\n\ninterface ToggleButtonProps extends ButtonProps<ToggleButtonEventMap> {\n\tchecked: boolean;\n\tcheckedIcon?: IconID;\n}\n\n/**\n * \n */\n\nexport class ToggleButton extends BaseButton<ToggleButtonProps, ToggleButtonEventMap> {\n\n\tconstructor(props: ToggleButtonProps) {\n\t\tsuper(props);\n\t}\n\n\t/**\n\t * \n\t */\n\n\trender(props: ToggleButtonProps) {\n\t\tsuper.render(props);\n\n\t\tif (props.checked) {\n\t\t\tthis.addClass('checked');\n\t\t\tthis._updateIcon( );\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprotected _sendClick() {\n\t\tsuper._sendClick();\n\n\t\tthis.m_props.checked = !this.m_props.checked;\n\t\tthis.setClass('checked', this.m_props.checked);\n\t\tthis.emit('change', EvChange(this.m_props.checked));\n\n\t\tthis._updateIcon( );\n\t}\n\n\tprivate _updateIcon( ) {\n\t\tif( this.m_props.checkedIcon ) {\n\t\t\tconst ic = this.m_props.checked ? this.m_props.checkedIcon : this.m_props.icon;\n\t\t\tlet ico = this.itemWithRef<Icon>('l_icon');\n\t\t\tif (ico) {\n\t\t\t\tico.icon = ic;\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file calendar.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\n\nimport { Button } from './button';\nimport { Popup } from './popup';\nimport { Component, CProps, ContainerEventMap, Flex } from './component'\nimport { EvChange, EventCallback } from './x4events'\nimport { Point } from \"./tools\"\n\nimport { _tr } from './i18n';\nimport { Label } from './label';\nimport { HLayout, VLayout } from './layout'\nimport { date_hash, date_clone, formatIntlDate } from './tools'\nimport { Menu, MenuItem } from './menu';\n\n\ninterface CalendarEventMap extends ContainerEventMap {\n\tchange?: EvChange;\n}\n\n\ninterface CalendarProps extends CProps<CalendarEventMap> {\n\tdate?: Date;\t// initial date to display\n\tminDate?: Date;\t// minimal date before the user cannot go\n\tmaxDate?: Date;\t// maximal date after the user cannot go\n\n\tchange?: EventCallback<EvChange>; // shortcut to events: { change: ... }\n}\n\n\n/**\n * default calendar control\n * \n * fires:\n * \tEventChange ( value = Date )\n */\n\nexport class Calendar extends VLayout<CalendarProps, CalendarEventMap>\n{\n\tprivate m_date: Date;\n\n\tconstructor(props: CalendarProps) {\n\t\tsuper(props);\n\n\t\tthis.mapPropEvents( props, 'change' );\n\t\tthis.m_date = props.date?.clone() ?? new Date();\n\t}\n\n\t/** @ignore */\n\n\trender(props: CalendarProps) {\n\n\t\tlet month_start = date_clone(this.m_date);\n\t\tmonth_start.setDate(1);\n\n\t\tlet day = month_start.getDay();\n\t\tif (day == 0) {\n\t\t\tday = 7;\n\t\t}\n\n\t\tmonth_start.setDate(-day + 1 + 1);\n\t\tlet dte = date_clone(month_start);\n\n\t\tlet today = this.m_date.hash();\n\n\t\tlet month_end = date_clone(this.m_date);\n\t\tmonth_end.setDate(1);\n\t\tmonth_end.setMonth(month_end.getMonth() + 1);\n\t\tmonth_end.setDate(0);\n\n\t\tlet end_of_month = date_hash(month_end);\n\n\t\tlet rows: HLayout[] = [];\n\n\t\t// month selector\n\t\tlet header = new HLayout({\n\t\t\tcls: 'month-sel',\n\t\t\tcontent: [\n\t\t\t\tnew Label({\n\t\t\t\t\tcls: 'month',\n\t\t\t\t\ttext: formatIntlDate(this.m_date, 'O'),\n\t\t\t\t\tdom_events: {\n\t\t\t\t\t\tclick: () => this._choose('month')\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\tnew Label({\n\t\t\t\t\tcls: 'year',\n\t\t\t\t\ttext: formatIntlDate(this.m_date, 'Y'),\n\t\t\t\t\tdom_events: {\n\t\t\t\t\t\tclick: () => this._choose('year')\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\tnew Flex(),\n\t\t\t\tnew Button({ text: '<', click: () => this._next(false) } ),\n\t\t\t\tnew Button({ text: '>', click: () => this._next(true) } )\n\t\t\t]\n\t\t});\n\n\t\trows.push(header);\n\n\t\t// calendar part\n\t\tlet day_names = [];\n\n\t\t// day names\n\t\t// empty week num\n\t\tday_names.push(new HLayout({\n\t\t\tcls: 'weeknum cell',\n\t\t}));\n\n\t\tfor (let d = 0; d < 7; d++) {\n\t\t\tday_names.push(new Label({\n\t\t\t\tcls: 'cell',\n\t\t\t\tflex: 1,\n\t\t\t\ttext: _tr.global.day_short[(d + 1) % 7]\n\t\t\t}));\n\t\t}\n\n\t\trows.push(new HLayout({\n\t\t\tcls: 'week header',\n\t\t\tcontent: day_names\n\t\t}));\n\n\t\tlet cmonth = this.m_date.getMonth();\n\n\t\t// weeks\n\t\tlet first = true;\n\t\twhile (date_hash(dte) <= end_of_month) {\n\n\t\t\tlet days = [\n\t\t\t\tnew HLayout({ cls: 'weeknum cell', content: new Component({ tag: 'span', content: formatIntlDate(dte, 'w') }) })\n\t\t\t];\n\n\t\t\t// days\n\t\t\tfor (let d = 0; d < 7; d++) {\n\n\t\t\t\tlet cls = 'cell day';\n\t\t\t\tif (dte.hash() == today) {\n\t\t\t\t\tcls += ' today';\n\t\t\t\t}\n\n\t\t\t\tif (dte.getMonth() != cmonth) {\n\t\t\t\t\tcls += ' out';\n\t\t\t\t}\n\n\t\t\t\tconst mkItem = ( dte ) => {\n\t\t\t\t\treturn new HLayout({\n\t\t\t\t\t\tcls,\n\t\t\t\t\t\tflex: 1,\n\t\t\t\t\t\tcontent: new Component({\n\t\t\t\t\t\t\ttag: 'span',\n\t\t\t\t\t\t\tcontent: formatIntlDate(dte, 'd'),\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tdom_events: {\n\t\t\t\t\t\t\tclick: () => this.select(dte)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tdays.push( mkItem( dte.clone() ) );\n\n\t\t\t\tdte.setDate(dte.getDate() + 1);\n\t\t\t\tfirst = false;\n\t\t\t}\n\n\t\t\trows.push(new HLayout({\n\t\t\t\tcls: 'week',\n\t\t\t\tflex: 1,\n\t\t\t\tcontent: days\n\t\t\t}));\n\t\t}\n\n\t\tthis.setContent(rows);\n\t}\n\n\t/**\n\t * select the given date\n\t * @param date \n\t */\n\n\tprivate select(date: Date) {\n\t\tthis.m_date = date;\n\t\tthis.emit('change', EvChange(date));\n\t\tthis.update();\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _next(n: boolean) {\n\t\tthis.m_date.setMonth(this.m_date.getMonth() + (n ? 1 : -1));\n\t\tthis.update();\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _choose(type: 'month' | 'year') {\n\n\t\tlet items: MenuItem[] = [];\n\n\t\tif (type == 'month') {\n\t\t\tfor (let m = 0; m < 12; m++) {\n\t\t\t\titems.push(new MenuItem({\n\t\t\t\t\ttext: _tr.global.month_long[m],\n\t\t\t\t\tclick: () => { this.m_date.setMonth(m); this.update(); }\n\t\t\t\t}));\n\t\t\t}\n\t\t}\n\t\telse if (type == 'year') {\n\n\t\t\tlet min = this.m_props.minDate?.getFullYear() ?? 1900;\n\t\t\tlet max = this.m_props.maxDate?.getFullYear() ?? 2037;\n\n\t\t\tfor (let m = max; m >= min; m--) {\n\t\t\t\titems.push(new MenuItem({\n\t\t\t\t\ttext: '' + m,\n\t\t\t\t\tclick: () => { this.m_date.setFullYear(m); this.update(); }\n\t\t\t\t}));\n\t\t\t}\n\t\t}\n\n\t\tlet menu = new Menu({\n\t\t\titems\n\t\t});\n\n\t\tlet rc = this.getBoundingRect();\n\t\tmenu.displayAt(rc.left, rc.top);\n\t}\n\n\tget date() {\n\t\treturn this.m_date;\n\t}\n\n\tset date(date: Date) {\n\t\tthis.m_date = date;\n\t\tthis.update();\n\t}\n}\n\n/**\n * default popup calendar\n */\n\nexport class PopupCalendar extends Popup {\n\n\tm_cal: Calendar;\n\n\tconstructor(props: CalendarProps) {\n\t\tsuper({ tabIndex: 1 });\n\n\t\tthis.enableMask(false);\n\n\t\tthis.m_cal = new Calendar(props);\n\t\tthis.m_cal.addClass('@fit');\n\n\t\tthis.setContent(this.m_cal);\n\t}\n\n\t// binded\n\tprivate _handleClick = (e: MouseEvent) => {\n\t\tif (!this.dom) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet newfocus = <HTMLElement>e.target;\n\n\t\t// child of this: ok\n\t\tif (this.dom.contains(newfocus)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// menu: ok\n\t\tlet dest = Component.getElement(newfocus, MenuItem);\n\t\tif (dest) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.close();\n\t}\n\n\t/** @ignore */\n\tshow(modal?: boolean, at?: Point ) {\n\t\tx4document.addEventListener('mousedown', this._handleClick);\n\t\tif( at ) {\n\t\t\tsuper.displayAt( at.x, at.y, 'top left', undefined, modal );\n\t\t}\n\t\telse {\n\t\t\tsuper.show(modal);\n\t\t}\n\t}\n\n\t/** @ignore */\n\tclose() {\n\t\tx4document.removeEventListener('mousedown', this._handleClick);\n\t\tsuper.close();\n\t}\n\n}", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file textedit.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\n\nimport { Component, EvFocus, HtmlString } from './component'\nimport { Input, InputProps, InputEventMap, EditType } from './input'\nimport { IconID } from './icon'\nimport { Button } from './button'\nimport { HLayout } from './layout'\nimport { Label } from './label'\nimport { PopupCalendar } from './calendar'\nimport { sprintf, parseIntlDate, formatIntlDate } from './tools';\nimport { Tooltip } from './tooltips'\nimport { EvClick, EvChange, EventCallback } from './x4events';\n\nimport { _tr } from './i18n'\n\n// throw in case of error\n// return the corrected\ntype ValidationFunction = (value: string) => string;\n\n/** @ignore */\nconst reEmail = /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n\n// ============================================================================\n// [TEXTEDIT]\n// ============================================================================\n\ninterface TextEditEventMap extends InputEventMap {\n\tclick: EvClick;\n\tchange: EvChange;\n\tfocus: EvFocus;\n}\n\nexport interface TextEditProps extends InputProps<TextEditEventMap> {\n\tlabel?: string | HtmlString;\n\tlabelWidth?: number;\t// <0 for flex -> -3 mean flex: 3\n\tlabelAlign?: 'left' | 'right' | 'top';\n\trequired?: boolean;\n\tspellcheck?: boolean;\n\ticon?: IconID;\n\tpattern?: string;\n\tuppercase?: boolean;\n\tformat?: string | 'native'; // default store format on type date. \n\tautosel?: boolean;\t// select content on focus\n\n\t// by default mysql format without time 'YYYY-MM-DD'\n\t// use 'native' to work on real Date object (get/set value)\n\n\tgadgets?: Component[];\n\n\tvalidator?: ValidationFunction;\n\n\tchange?: EventCallback<EvChange>;\t// shortcut to events: { change: ... }\n\tclick?: EventCallback<EvClick>;\t\t// shortcut to events: { click: ... }\n\tfocus?: EventCallback<EvFocus>;\t\t// shortcut to events: { focus: ... }\n}\n\n\n\n/**\n * TextEdit is a single line editor, it can have a label and an error descriptor.\n */\n\nexport class TextEdit<T extends TextEditProps = TextEditProps, E extends TextEditEventMap = TextEditEventMap > extends Component<T, E> {\n\n\tprivate m_cal_popup: PopupCalendar;\n\tprotected m_ui_input: Input;\n\t\n\tconstructor(props: T) {\n\t\tsuper(props);\n\t\tthis.addClass( '@hlayout' );\n\t\tthis.mapPropEvents( props, 'change', 'click', 'focus' );\n\t}\n\n\tcomponentCreated() {\n\t\tsuper.componentCreated( );\n\n\t\tif (this.m_props.autoFocus) {\n\t\t\tthis.focus();\n\t\t}\n\t}\n\n\tfocus() {\n\t\tthis.m_ui_input.focus();\n\t}\n\n\t/** @ignore */\n\trender(props: TextEditProps) {\n\n\t\tlet eprops: InputProps = {\n\t\t\tflex: 1,\n\t\t\tdom_events: {\n\t\t\t\tfocus: ( ) => this._focus( ),\n\t\t\t\tfocusout: ( ) => this._blur( ),\n\t\t\t\tinput: ( ) => this._change( )\n\t\t\t},\n\t\t\tvalue: props.value,\n\t\t\tname: props.name,\n\t\t\ttype: props.type,\n\t\t\tplaceHolder: props.placeHolder,\n\t\t\tautoFocus: props.autoFocus,\n\t\t\treadOnly: props.readOnly,\n\t\t\tvalue_hook: props.value_hook,\n\t\t\tuppercase: props.uppercase,\n\t\t\tspellcheck: props.spellcheck,\n\t\t\ttabIndex: props.tabIndex === undefined ? true : props.tabIndex,\n\t\t\tattrs: props.attrs,\n\t\t\tmin: props.min,\n\t\t\tmax: props.max,\n\t\t\tautosel: props.autosel,\n\t\t};\n\n\t\t// date is handled manually with popupcalendar\n\n\t\tif (props.type == 'date') {\n\t\t\tprops.format = props.format ?? 'Y-M-D';\n\t\t\teprops.type = 'text';\n\n\t\t\tlet def_hook = {\n\t\t\t\tget: ( ) => this._date_get_hook(),\n\t\t\t\tset: (e) => this._date_set_hook(e)\n\t\t\t}\n\n\t\t\teprops.value_hook = props.value_hook ?? def_hook;\n\t\t}\n\n\t\tthis.m_ui_input = new Input(eprops);\n\n\t\t//\tbutton\n\t\tlet button = undefined;\n\t\tif (props.icon) {\n\t\t\tbutton = new Button({\n\t\t\t\ticon: props.icon,\n\t\t\t\tclick: () => this._btnClick(),\n\t\t\t\ttabIndex: false\n\t\t\t});\n\t\t}\n\t\telse if (props.type == 'date') {\n\n\t\t\tbutton = new Button({\n\t\t\t\tcls: 'gadget',\n\t\t\t\ticon: 'var( --x4-icon-calendar-days )',\n\t\t\t\ttabIndex: false,\n\t\t\t\tclick: () => this._showDatePicker(button)\n\t\t\t});\n\n\t\t\tif (!props.validator) {\n\t\t\t\tprops.validator = this._date_validator;\n\t\t\t}\n\t\t}\n\n\t\tlet ag = props.gadgets ?? [];\n\t\tag.forEach( b => {\n\t\t\tb.addClass( 'gadget' );\n\t\t});\n\n\t\tlet gadgets = [button, ...ag];\n\n\t\tthis.setClass('@required', props.required);\n\t\tif (props.gadgets && props.gadgets.length) {\n\t\t\tthis.addClass('with-gadgets');\n\t\t}\n\n\t\tlet width = undefined,\n\t\t\tflex = undefined,\n\t\t\tlabelWidth = props.labelWidth;\n\n\t\tif (labelWidth > 0) {\n\t\t\twidth = labelWidth;\n\t\t}\n\n\t\tif (labelWidth < 0) {\n\t\t\tflex = -labelWidth;\n\t\t}\n\n\t\tlet label = undefined;\n\t\tlet labelAlign = props.labelAlign;\n\t\tlet top = false;\n\n\t\tif (props.label) {\n\n\t\t\tif (labelAlign == 'top') {\n\t\t\t\tlabelAlign = 'left';\n\t\t\t\ttop = true;\n\t\t\t\tflex = 1;\n\t\t\t}\n\n\t\t\tlabel = new Label({\n\t\t\t\tref: 'label',\n\t\t\t\ttag: 'label',\n\t\t\t\tcls: 'label1' + (props.label ? '' : ' @hidden'),\t// todo: why 'label1' class name ?\n\t\t\t\ttext: props.label ?? '',\n\t\t\t\twidth,\n\t\t\t\tflex,\n\t\t\t\talign: labelAlign\n\t\t\t});\n\t\t}\n\n\t\tif (top) {\n\t\t\tthis.removeClass('@hlayout');\n\t\t\tthis.addClass('@vlayout vertical');\n\n\t\t\tthis.setContent([\n\t\t\t\tlabel,\n\t\t\t\tnew HLayout({ width, content: [this.m_ui_input, ...gadgets] })\n\t\t\t]);\n\t\t}\n\t\telse {\n\t\t\tthis.addClass('@hlayout');\n\t\t\tthis.setContent([label, this.m_ui_input, ...gadgets]);\n\t\t}\n\t}\n\n\tenable(ena?: boolean) {\n\t\tif (ena === true) {\n\t\t\tthis.m_ui_input.enable();\n\t\t}\n\n\t\tsuper.enable(ena);\n\t}\n\n\tdisable() {\n\t\tthis.m_ui_input.disable();\n\t\tsuper.disable();\n\t}\n\n\tprivate _btnClick() {\n\t\tthis.emit('click', EvClick(this.value) );\n\t}\n\n\t/**\n\t * select the value format for input/output on textedit of type date\n\t * cf. formatIntlDate / parseIntlDate\n\t * @param fmt \n\t */\n\tpublic setDateStoreFormat(fmt: string) {\n\t\tthis.m_props.format = fmt;\n\t}\n\n\tpublic setStoreValue(value: any) {\n\t\tthis.m_ui_input.setStoreValue(value);\n\t}\n\n\tpublic getStoreValue(): any {\n\t\treturn this.m_ui_input.getStoreValue();\n\t}\n\n\tprivate _date_get_hook() {\n\t\tlet date = parseIntlDate(this.value);\n\t\tlet props = this.m_props;\n\t\tif (props.format == 'native') {\n\t\t\treturn date;\n\t\t}\n\t\telse {\n\t\t\treturn date ? formatIntlDate(date, props.format) : null;\n\t\t}\n\t}\n\n\tprivate _date_set_hook(dte) {\n\t\tlet props = this.m_props;\n\n\t\tif (props.format == 'native') {\n\t\t\tthis.value = formatIntlDate(dte);\n\t\t}\n\t\telse if (dte) {\n\t\t\tlet date = parseIntlDate(dte, props.format);\n\t\t\tthis.value = formatIntlDate(date);\n\t\t}\n\t\telse {\n\t\t\tthis.value = '';\n\t\t}\n\t}\n\n\tpublic showError(text: string) {\n\t\tthis.m_ui_input.showError( text );\n\t}\n\n\tpublic clearError() {\n\t\tthis.m_ui_input.clearError( );\n\t}\n\n\tpublic get value(): string {\n\t\treturn this.getValue( );\n\t}\n\n\tpublic getValue( ) : string {\n\t\tif (this.m_ui_input) {\n\t\t\treturn this.m_ui_input.value;\n\t\t}\n\t\telse {\n\t\t\treturn this.m_props.value;\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic set value(value: string) {\n\t\tthis.setValue( value );\n\t}\n\n\tpublic setValue( value: string ) {\n\t\tif (this.m_ui_input) {\n\t\t\tthis.m_ui_input.value = value;\n\t\t}\n\t\telse {\n\t\t\tthis.m_props.value = value;\n\t\t}\n\t}\n\n\t/**\n\t * select all the text\n\t */\n\n\tpublic selectAll() {\n\t\tthis.m_ui_input.selectAll();\n\t}\n\n\tpublic select(start: number, length: number = 9999): void {\n\t\tthis.m_ui_input.select(start, length);\n\t}\n\n\tpublic getSelection() {\n\t\treturn this.m_ui_input.getSelection();\n\t}\n\n\tset readOnly(ro: boolean) {\n\t\tthis.m_ui_input.readOnly = ro;\n\t}\n\n\tget label() {\n\t\treturn this.itemWithRef<Label>('label')?.text;\n\t}\n\n\tset label(text) {\n\t\tthis.itemWithRef<Label>('label').text = text;\n\t}\n\n\t/**\n\t * content changed\n\t * todo: should move into Input\n\t */\n\n\tprivate _change() {\n\t\tlet value = this.m_ui_input.value;\n\t\tthis.emit('change', EvChange(value));\n\t}\n\n\t/**\n\t * getting focus\n\t */\n\n\tprivate _focus() {\n\t\tthis.clearError();\n\t\tthis.emit('focus', EvFocus(true));\n\t}\n\n\t/**\n\t * loosing focus\n\t * @param value \n\t */\n\n\tprivate _blur() {\n\t\tthis._validate(this.m_ui_input.value);\n\t\tthis.emit('focus', EvFocus(false));\n\t}\n\n\t/**\n\t * todo: should move into Input\n\t * @returns \n\t */\n\tpublic validate(): boolean {\n\t\treturn this._validate(this.value);\n\t}\n\n\tprotected _validate(value: string): boolean {\n\t\tlet props = this.m_props;\n\t\tlet update = false;\n\n\t\tif (props.required && value.length == 0) {\n\t\t\tthis.showError(_tr.global.required_field);\n\t\t\treturn false;\n\t\t}\n\n\t\tif (value != '') {\n\t\t\tlet pattern = this.getAttribute('pattern');\n\t\t\tif (pattern) {\n\t\t\t\tlet re = new RegExp(pattern);\n\t\t\t\tif (re && !re.test(value)) {\n\t\t\t\t\tthis.showError(_tr.global.invalid_format);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (props.type == 'email') {\n\t\t\t\tif (!reEmail.test(value.toLowerCase())) {\n\t\t\t\t\tthis.showError(_tr.global.invalid_email);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (props.type == 'number') {\n\n\t\t\t\tconst v = parseFloat(value);\n\t\t\t\tif (isNaN(v)) {\n\t\t\t\t\tthis.showError(_tr.global.invalid_number);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tlet min = parseFloat(this.m_ui_input.getAttribute('min'));\n\t\t\t\tif (min !== undefined && v < min) {\n\t\t\t\t\tvalue = '' + min;\n\t\t\t\t\tupdate = true;\n\t\t\t\t}\n\n\t\t\t\tlet max = parseFloat(this.m_ui_input.getAttribute('max'));\n\t\t\t\tif (max !== undefined && v > max) {\n\t\t\t\t\tvalue = '' + max;\n\t\t\t\t\tupdate = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\n\t\tif (props.validator) {\n\t\t\ttry {\n\t\t\t\tthis.value = props.validator(value);\n\t\t\t}\n\t\t\tcatch (err) {\n\t\t\t\tthis.showError(err instanceof Error ? err.message : err as string);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\telse if (update) {\n\t\t\tthis.value = value;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t_date_validator(value: string): string {\n\n\t\tvalue = value.trim();\n\t\tif (value == '') {\n\t\t\treturn '';\n\t\t}\n\n\t\tlet date: Date;\n\t\tif (value == '@') {\n\t\t\tdate = new Date();\n\t\t}\n\t\telse {\n\t\t\tdate = parseIntlDate(value);\n\t\t\tif (!date) {\n\t\t\t\tthrow sprintf(_tr.global.invalid_date, _tr.global.date_format);\n\t\t\t}\n\t\t}\n\n\t\treturn formatIntlDate(date);\n\t}\n\n\n\t//onKeyDown( e ) {\n\t// if( this.readOnly ) {\n\t// if( this.type=='date' && (e.key==' ' || e.key=='Enter') ) {\n\t// this.showDatePicker( );\n\t// e.stopPropagation( );\n\t// e.preventDefault( );\n\t// }\n\t// }\n\t//}\n\n\t//onClick( e ) {\n\t// if( this.readOnly ) {\n\t// if( this.type=='date' ) {\n\t// this.showDatePicker( );\n\t// e.stopPropagation( );\n\t// e.preventDefault( );\n\t// }\n\t// }\n\t//}\n\n\tprivate _showDatePicker(btn: Component) {\n\n\t\tif (!this.m_cal_popup) {\n\t\t\tthis.m_cal_popup = new PopupCalendar({\n\t\t\t\tchange: (ev: EvChange) => {\n\t\t\t\t\tthis.value = formatIntlDate(ev.value as Date);\n\t\t\t\t\tthis.m_cal_popup.close();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tlet rc = this.m_ui_input.getBoundingRect();\n\t\tthis.m_cal_popup.displayAt(rc.left, rc.bottom, 'top left');\n\t}\n\n\tget input() {\n\t\treturn this.m_ui_input;\n\t}\n\n\tget type(): EditType {\n\t\treturn this.m_props.type;\n\t}\n}\n", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file autocomplete.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { RenderListItem, ListViewItem, PopupListView } from \"./listview\";\nimport { TextEdit, TextEditProps } from './textedit';\n\n/**\n * \n */\n\ninterface AutoCompleteProps extends TextEditProps {\n\t// return an array of values to display in the popup list\n\tenumValues: ( filter: string ) => string[] | Promise<string[]>;\n\n\t// a way to change the real value vs displayed value in the popup list\n\tselectValue?: ( text: string ) => string;\n\trenderItem?: RenderListItem\n}\n\n/**\n * \n */\n\nexport class AutoComplete extends TextEdit<AutoCompleteProps> {\n\t\n\tprivate m_popup: PopupListView;\n\tprivate m_popvis: boolean;\n\tprivate m_needval: boolean;\n\tprivate m_lockpop: boolean;\n\t\n\tconstructor( props: AutoCompleteProps ) {\n\t\tsuper( props );\n\n\t\tthis.setDomEvent( \"input\", ( ) => this._onChange( ) );\n\t\tthis.setDomEvent( \"focusin\", ( ) => this._onFocus( ) );\n\t\tthis.startTimer( \"focus-check\", 100, true, () => this._checkFocus() );\n\n\t\tthis.m_popvis = false;\n\t\tthis.m_needval = false;\n\t\tthis.m_lockpop = false;\n\n\t\tthis.setDomEvent( \"keydown\", e => this._onKey(e) );\n\t}\n\n\t_onKey( e: KeyboardEvent ) {\n\t\tif( this.m_popvis ) {\n\t\t\tif( e.key==\"ArrowUp\" || e.key==\"ArrowDown\" ) {\n\t\t\t\tthis.m_lockpop = true;\n\t\t\t\tthis.m_popup.handleKey( e );\n\t\t\t\tthis.m_lockpop = false;\n\n\t\t\t\te.preventDefault( );\n\t\t\t\te.stopPropagation( );\n\t\t\t}\n\t\t\telse if( e.key==\"Escape\" ) {\n\t\t\t\tthis._hidePopup( );\n\n\t\t\t\te.preventDefault( );\n\t\t\t\te.stopPropagation( );\n\t\t\t}\n\t\t}\n\t\telse if( e.key==\"ArrowDown\" ) {\n\t\t\tthis._onChange( );\n\t\t\te.preventDefault( );\n\t\t\te.stopPropagation( );\n\t\t}\n\t}\n\n\tprivate async _onChange( ) {\n\t\tlet items = this.m_props.enumValues( this.value );\n\t\tif( items instanceof Promise ) {\n\t\t\titems = await items;\n\t\t}\n\t\t\n\t\tif( items.length==0 ) {\n\t\t\tthis._hidePopup( );\n\t\t\treturn;\n\t\t}\n\n\t\tthis._showPopup( items );\n\t}\n\n\tcomponentDisposed( ) {\n\t\tif( this.m_popup ) {\n\t\t\tthis._hidePopup( );\n\t\t}\n\n\t\tsuper.componentDisposed( );\n\t}\n\n\tshowPopup( show = true ) {\n\t\tif( show ) {\n\t\t\tthis._onChange( );\n\t\t}\n\t\telse {\n\t\t\tthis._hidePopup( );\n\t\t}\n\t}\n\n\t/** \n\t * display the popup \n\t */\n\n\tprivate _showPopup( items: string[] ) {\n\n\t\tlet props = this.m_props;\n\t\tif (props.readOnly || this.hasClass(\"@disable\") ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// need creation ?\n\t\t\n\t\tif( !this.m_popup ) {\n\t\t\tlet cstyle = this.getComputedStyle( );\n\t\t\tlet fontFamily = cstyle.value( 'fontFamily' );\n\t\t\tlet fontSize = cstyle.value( 'fontSize' );\n\n\t\t\t// prepare the combo listview\n\t\t\tthis.m_popup = new PopupListView({\n\t\t\t\tcls: '@combo-popup',\n\t\t\t\tattrs: {\n\t\t\t\t\ttabindex: 0\n\t\t\t\t},\n\t\t\t\tselectionChange: (e) => {\n\t\t\t\t\tlet value = (e.selection as ListViewItem).id\n\t\t\t\t\tif( this.m_props.selectValue ) {\n\t\t\t\t\t\tvalue = this.m_props.selectValue( value );\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.value = value;\n\t\t\t\t\tif( !this.m_lockpop ) {\n\t\t\t\t\t\tthis._hidePopup( );\n\t\t\t\t\t\tthis.focus( );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tstyle: {\n\t\t\t\t\tfontFamily,\n\t\t\t\t\tfontSize\n\t\t\t\t},\n\t\t\t\trenderItem: props.renderItem,\n\t\t\t});\n\t\t}\n\n\t\tif( items ) {\n\t\t\tthis.m_popup.items = items.map( c => ({ id: c, text: c }) );\n\t\t}\n\t\n\t\tlet r1 = this.m_ui_input.getBoundingRect();\n\t\tthis.m_popup.setStyle({\n\t\t\tminWidth: r1.width,\n\t\t});\n\n\t\tthis.m_popup.displayAt(r1.left, r1.bottom);\n\t\tthis.m_popvis = true;\n\t\t\n\t\t//if( this.value!==undefined ) {\n\t\t//\tthis.m_popup.selection = this.value;\n\t\t//}\n\t}\n\n\tprotected override _validate(value: string): boolean {\n\t\treturn true;\n\t}\n\n\toverride validate( ): boolean {\n\t\treturn super._validate( this.value );\n\t}\n\n\tprivate _checkFocus( ) {\n\t\tconst focus = document.activeElement;\n\t\tif( this.dom && this.dom.contains(focus) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif( this.m_popup && this.m_popup.dom && this.m_popup.dom.contains(focus) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._hidePopup( );\n\t}\n\n\tprivate _hidePopup( ) {\n\t\t\n\t\tif( this.m_popvis ) {\n\t\t\tthis.m_popup.close();\n\t\t\tthis.m_popvis = false;\n\t\t}\n\n\t\tif( this.m_needval ) {\n\t\t\tthis.validate( );\n\t\t\tthis.m_needval = false;\n\t\t}\n\t}\n\n\tprivate _onFocus( ) {\n\t\tif( this.value.length==0 ) {\n\t\t\tthis._onChange( );\n\t\t}\n\n\t\tthis.m_needval = true;\n\t}\n\n\tisPopupVisible( ) {\n\t\treturn this.m_popvis;\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file canvas.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Component, CProps, CEventMap, html } from './component'\nimport { BasicEvent, EventCallback } from './x4events'\n\ninterface EvPaint extends BasicEvent {\n\tctx: CanvasPainter;\n}\n\nfunction EvPaint(ctx: CanvasPainter) {\n\treturn BasicEvent<EvPaint>({ ctx });\n}\n\ninterface CanvasEventMap extends CEventMap {\n\tpaint: EvPaint;\n}\n\ninterface CanvasProps extends CProps<CanvasEventMap> {\n\tautoClear?: boolean;\n\tpainter?: PaintHandler;\n\tpaint: EventCallback<EvPaint>\n}\n\n\n// ============================================================================\n// [CANVAS]\n// ============================================================================\n\n\n\n\nexport interface CanvasPainter extends CanvasRenderingContext2D {\n\twidth: number;\n\theight: number;\n\n\tsmoothLine(points: any[], path: CanvasPath, move: boolean): void;\n\tsmoothLineEx(_points: any[], tension: number, numOfSeg: number, path: CanvasPath, move?: boolean, close?: boolean): void;\n\tline(x1: number, y1: number, x2: number, y2: number, color: string, lineWidth: number): void;\n\troundRect(x: number, y: number, width: number, height: number, radius: number): void;\n\tcalcTextSize(text: string, rounded: boolean): { width: number, height: number };\n\tsetFontSize(fs: number): void;\n\tcircle(x: number, y: number, radius: number): void;\n}\n\nfunction mkPainter(c2d: CanvasRenderingContext2D, w: number, h: number): CanvasPainter {\n\n\tlet cp = c2d as CanvasPainter;\n\n\tcp.width = w;\n\tcp.height = h;\n\n\tcp.smoothLine = smoothLine;\n\tcp.smoothLineEx = smoothLineEx;\n\tcp.line = line;\n\tcp.roundRect = roundRect;\n\tcp.calcTextSize = calcTextSize;\n\tcp.setFontSize = setFontSize;\n\tcp.circle = circle;\n\n\treturn cp;\n}\n\nfunction smoothLine( this: CanvasRenderingContext2D, points: any[], path: CanvasPath = null, move = true) {\n\tif (points.length < 2) {\n\t\treturn;\n\t}\n\n\tif (!path) {\n\t\tpath = this;\n\t}\n\n\tif (points.length == 2) {\n\t\tif (move !== false) {\n\t\t\tpath.moveTo(points[0].x, points[0].y);\n\t\t}\n\t\telse {\n\t\t\tpath.lineTo(points[0].x, points[0].y);\n\t\t}\n\n\t\tpath.lineTo(points[1].x, points[1].y);\n\t\treturn;\n\t}\n\n\tfunction midPointBtw(p1, p2) {\n\t\treturn {\n\t\t\tx: p1.x + (p2.x - p1.x) / 2,\n\t\t\ty: p1.y + (p2.y - p1.y) / 2\n\t\t};\n\t}\n\n\tfunction getQuadraticXY(t, sx, sy, cp1x, cp1y, ex, ey) {\n\t\treturn {\n\t\t\tx: (1 - t) * (1 - t) * sx + 2 * (1 - t) * t * cp1x + t * t * ex,\n\t\t\ty: (1 - t) * (1 - t) * sy + 2 * (1 - t) * t * cp1y + t * t * ey\n\t\t};\n\t}\n\n\tlet p1 = points[0],\n\t\tp2 = points[1],\n\t\tp3 = p1;\n\n\tpath.moveTo(p1.x, p1.y);\n\n\tfor (let i = 1, len = points.length; i < len; i++) {\n\t\t// we pick the point between pi+1 & pi+2 as the\n\t\t// end point and p1 as our control point\n\t\tlet midPoint = midPointBtw(p1, p2);\n\t\t//this.quadraticCurveTo(p1.x, p1.y, midPoint.x, midPoint.y);\n\t\tfor (let i = 0; i < 8; i++) {\n\t\t\tlet { x, y } = getQuadraticXY(i / 8, p3.x, p3.y, p1.x, p1.y, midPoint.x, midPoint.y);\n\t\t\tpath.lineTo(x, y);\n\t\t}\n\n\t\tp1 = points[i];\n\t\tp2 = points[i + 1];\n\t\tp3 = midPoint;\n\t}\n\n\t// Draw last line as a straight line while\n\t// we wait for the next point to be able to calculate\n\t// the bezier control point\n\n\tpath.lineTo(p1.x, p1.y);\n}\n\nfunction smoothLineEx(this: CanvasRenderingContext2D, _points: any[], tension: number = 0.5, numOfSeg: number = 10, path: CanvasPath = null, move = true, close = false) {\n\n\tlet points = [];\n\n\t//pts = points.slice(0);\n\tfor (let p = 0, pc = _points.length; p < pc; p++) {\n\t\tpoints.push(_points[p].x);\n\t\tpoints.push(_points[p].y);\n\t}\n\n\tlet pts,\n\t\ti = 1,\n\t\tl = points.length,\n\t\trPos = 0,\n\t\trLen = (l - 2) * numOfSeg + 2 + (close ? 2 * numOfSeg : 0),\n\t\tres = new Float32Array(rLen),\n\t\tcache = new Float32Array((numOfSeg + 2) * 4),\n\t\tcachePtr = 4;\n\n\tpts = points.slice(0);\n\n\tif (close) {\n\t\tpts.unshift(points[l - 1]);\t\t\t\t// insert end point as first point\n\t\tpts.unshift(points[l - 2]);\n\t\tpts.push(points[0], points[1]); \t\t// first point as last point\n\t}\n\telse {\n\t\tpts.unshift(points[1]);\t\t\t\t\t// copy 1. point and insert at beginning\n\t\tpts.unshift(points[0]);\n\t\tpts.push(points[l - 2], points[l - 1]);\t// duplicate end-points\n\t}\n\n\t// cache inner-loop calculations as they are based on t alone\n\tcache[0] = 1;\t\t\t\t\t\t\t\t// 1,0,0,0\n\n\tfor (; i < numOfSeg; i++) {\n\n\t\tvar st = i / numOfSeg,\n\t\t\tst2 = st * st,\n\t\t\tst3 = st2 * st,\n\t\t\tst23 = st3 * 2,\n\t\t\tst32 = st2 * 3;\n\n\t\tcache[cachePtr++] = st23 - st32 + 1;\t// c1\n\t\tcache[cachePtr++] = st32 - st23;\t\t// c2\n\t\tcache[cachePtr++] = st3 - 2 * st2 + st;\t// c3\n\t\tcache[cachePtr++] = st3 - st2;\t\t\t// c4\n\t}\n\n\tcache[cachePtr] = 1;\t\t\t\t\t\t// 0,1,0,0\n\n\t// calc. points\n\tparse(pts, cache, l);\n\n\tif (close) {\n\t\t//l = points.length;\n\t\tpts = [];\n\t\tpts.push(points[l - 4], points[l - 3], points[l - 2], points[l - 1]); // second last and last\n\t\tpts.push(points[0], points[1], points[2], points[3]); // first and second\n\t\tparse(pts, cache, 4);\n\t}\n\n\tfunction parse(pts, cache, l) {\n\n\t\tfor (var i = 2, t; i < l; i += 2) {\n\n\t\t\tvar pt1 = pts[i],\n\t\t\t\tpt2 = pts[i + 1],\n\t\t\t\tpt3 = pts[i + 2],\n\t\t\t\tpt4 = pts[i + 3],\n\n\t\t\t\tt1x = (pt3 - pts[i - 2]) * tension,\n\t\t\t\tt1y = (pt4 - pts[i - 1]) * tension,\n\t\t\t\tt2x = (pts[i + 4] - pt1) * tension,\n\t\t\t\tt2y = (pts[i + 5] - pt2) * tension;\n\n\t\t\tfor (t = 0; t < numOfSeg; t++) {\n\n\t\t\t\tvar c = t << 2, //t * 4;\n\n\t\t\t\t\tc1 = cache[c],\n\t\t\t\t\tc2 = cache[c + 1],\n\t\t\t\t\tc3 = cache[c + 2],\n\t\t\t\t\tc4 = cache[c + 3];\n\n\t\t\t\tres[rPos++] = c1 * pt1 + c2 * pt3 + c3 * t1x + c4 * t2x;\n\t\t\t\tres[rPos++] = c1 * pt2 + c2 * pt4 + c3 * t1y + c4 * t2y;\n\t\t\t}\n\t\t}\n\t}\n\n\t// add last point\n\tl = close ? 0 : points.length - 2;\n\tres[rPos++] = points[l];\n\tres[rPos] = points[l + 1];\n\n\tif (!path) {\n\t\tpath = this;\n\t}\n\n\t// add lines to path\n\tfor (let i = 0, l = res.length; i < l; i += 2) {\n\t\tif (i == 0 && move !== false) {\n\t\t\tpath.moveTo(res[i], res[i + 1]);\n\t\t}\n\t\telse {\n\t\t\tpath.lineTo(res[i], res[i + 1]);\n\t\t}\n\t}\n}\n\nfunction line(this: CanvasRenderingContext2D, x1: number, y1: number, x2: number, y2: number, color: string, lineWidth: number = 1) {\n\tthis.save();\n\tthis.beginPath();\n\tthis.moveTo(x1, y1);\n\tthis.lineTo(x2, y2);\n\tthis.lineWidth = lineWidth;\n\tthis.strokeStyle = color;\n\tthis.stroke();\n\tthis.restore();\n}\n\nfunction roundRect(this: CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number) {\n\t//this.beginPath( );\n\tthis.moveTo(x + radius, y);\n\tthis.lineTo(x + width - radius, y);\n\tthis.quadraticCurveTo(x + width, y, x + width, y + radius);\n\tthis.lineTo(x + width, y + height - radius);\n\tthis.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n\tthis.lineTo(x + radius, y + height);\n\tthis.quadraticCurveTo(x, y + height, x, y + height - radius);\n\tthis.lineTo(x, y + radius);\n\tthis.quadraticCurveTo(x, y, x + radius, y);\n\tthis.closePath();\n}\n\nfunction calcTextSize( this: CanvasRenderingContext2D, text: string, rounded = false): { width: number, height: number } {\n\n\tlet fh = this.measureText(text);\n\tlet lh = fh.fontBoundingBoxAscent + fh.fontBoundingBoxDescent;\n\n\tif (rounded) {\n\t\treturn { width: Math.round(fh.width), height: Math.round(lh) };\n\t}\n\telse {\n\t\treturn { width: fh.width, height: lh };\n\t}\n}\n\nfunction setFontSize( this: CanvasRenderingContext2D, fs: number) {\n\tlet fsize = Math.round(fs) + 'px';\n\tthis.font = this.font.replace(/\\d+px/, fsize);\n}\n\nfunction circle( this: CanvasRenderingContext2D, x: number, y: number, radius: number) {\n\tthis.moveTo(x + radius, y);\n\tthis.arc(x, y, radius, 0, Math.PI * 2);\n}\n\ntype PaintHandler = (ctx: CanvasPainter) => any;\n\n/**\n * \n */\n\n//export class CanvasProps extends CProps\n//{\n// low level handlers\n//mousedown?: (ev: MouseEvent) => any;\n//mousemove?: (ev: MouseEvent) => any;\n//mouseup?: (ev: MouseEvent) => any;\n//mouseleave?: (ev: MouseEvent) => any;\n//mousewheel?: (ev: WheelEvent) => any;\n//click?: (ev: MouseEvent) => any;\n//dblclick?: (ev: MouseEvent) => any;\n//touchstart?: (ev: TouchEvent) => any;\n//touchmove?: (ev: TouchEvent) => any;\n//touchend?: (ev: TouchEvent) => any;\n//keydown?: (ev: KeyboardEvent) => any;\n//keyup?: (ev: KeyboardEvent) => any;\n//}\n\n\n/**\n * Standard Canvas\n */\n\nexport class Canvas extends Component<CanvasProps, CanvasEventMap> {\n\n\tprivate m_iwidth: number = -1;\n\tprivate m_iheight: number = -1;\n\tprivate m_scale = 1.0;\n\tprivate m_canvas: Component;\n\n\tconstructor(props: CanvasProps) {\n\t\tsuper(props);\n\n\t\t//if( props.mousedown )\t{ this.setDomEvent( 'mousedown', props.mousedown ); }\n\t\t//if( props.mousemove )\t{ this.setDomEvent( 'mousemove', props.mousemove ); }\n\t\t//if( props.mouseup )\t\t{ this.setDomEvent( 'mouseup', props.mouseup ); }\n\t\t//if( props.mousewheel )\t{ this.setDomEvent( 'wheel', props.mousewheel ); }\n\t\t//if( props.mouseleave )\t{ this.setDomEvent( 'mouseleave', props.mouseleave ); }\n\t\t//if( props.click )\t\t{ this.setDomEvent( 'click', props.click ); }\n\t\t//if( props.dblclick )\t{ this.setDomEvent( 'dblclick', props.dblclick ); }\n\t\t//if( props.touchstart )\t{ this.setDomEvent( 'touchstart', props.touchstart ); }\n\t\t//if( props.touchmove )\t{ this.setDomEvent( 'touchmove', props.touchmove ); }\n\t\t//if( props.touchend )\t{ this.setDomEvent( 'touchend', props.touchend ); }\n\t\t//if( props.keydown )\t\t{ this.setDomEvent( 'keydown', props.keydown ); this.setAttribute( 'tabindex', 0 ); }\n\t\t//if( props.keyup )\t\t{ this.setDomEvent( 'keyup', props.keyup ); this.setAttribute( 'tabindex', 0 ); }\n\t\t//if( props.paint ) \t\t{ this.onPaint( props.paint ); }\n\n\t\tthis.setDomEvent('sizechange', () => { this._paint(); })\n\t\tthis.mapPropEvents( props, 'paint' );\n\t}\n\n\t/** @ignore */\n\trender() {\n\t\tthis.m_iwidth = -1;\n\t\tthis.m_iheight = -1;\n\t\tthis.m_canvas = new Component({\n\t\t\ttag: 'canvas'\n\t\t});\n\n\t\tthis.setContent( this.m_canvas );\n//\t\tthis.redraw(10);\n\t}\n\n\tupdate(delay=0 ) {\n\t\tthis.m_iheight = this.m_iwidth = -1;\n\t\tsuper.update( delay );\n\t}\n\n\t/**\n\t * scale the whole canvas\n\t */\n\n\tscale(scale: number) {\n\t\tthis.m_scale = scale;\n\t\tthis.m_iwidth = -1;\t// force recalc\n\t\tthis.redraw();\n\t}\n\n\t/**\n\t * return the internal canvas\n\t */\n\tget canvas(): Component {\n\t\treturn this.m_canvas;\n\t}\n\n\t/**\n\t * redraw the canvas (force a paint)\n\t */\n\n\tprivate $update_rep = 0;\n\tpublic redraw(wait?: number) {\n\n\t\tif (wait !== undefined) {\n\n\t\t\tif( ++this.$update_rep>=20 ) {\n\t\t\t\tthis.stopTimer( 'update' );\n\t\t\t\tthis._paint( );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.startTimer( 'update', wait, false, () => this._paint() );\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tthis.stopTimer( 'update' );\n\t\t\tthis._paint();\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\tprivate _paint() {\n\t\tthis.$update_rep = 0;\n\n\t\tlet dom = this.dom;\n\t\tif (!this.isUserVisible() ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet canvas = this.m_canvas.dom as HTMLCanvasElement,\n\t\t\tw = dom.clientWidth,\n\t\t\th = dom.clientHeight;\n\n\t\tlet ctx = <CanvasPainter>canvas.getContext('2d');\n\t\tif (w != this.m_iwidth || h != this.m_iheight) {\n\t\t\t// adjustment for HDPI\n\t\t\tlet devicePixelRatio = window.devicePixelRatio || 1;\n\t\t\tlet backingStoreRatio = (<any>ctx).webkitBackingStorePixelRatio ||\n\t\t\t\t(<any>ctx).mozBackingStorePixelRatio ||\n\t\t\t\t(<any>ctx).msBackingStorePixelRatio ||\n\t\t\t\t(<any>ctx).oBackingStorePixelRatio ||\n\t\t\t\t(<any>ctx).backingStorePixelRatio || 1;\n\n\t\t\tlet canvas = this.canvas;\n\n\t\t\tif (devicePixelRatio !== backingStoreRatio || this.m_scale != 1.0) {\n\t\t\t\tlet ratio = devicePixelRatio / backingStoreRatio,\n\t\t\t\t\trw = w * ratio,\n\t\t\t\t\trh = h * ratio;\n\n\t\t\t\tcanvas.setAttribute('width', '' + rw);\n\t\t\t\tcanvas.setAttribute('height', '' + rh);\n\t\t\t\tcanvas.setStyleValue('width', w);\n\t\t\t\tcanvas.setStyleValue('height', h);\n\n\t\t\t\tratio *= this.m_scale;\n\t\t\t\tctx.scale(ratio, ratio);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcanvas.setAttribute('width', '' + w);\n\t\t\t\tcanvas.setAttribute('height', '' + h);\n\t\t\t\tcanvas.setStyleValue('width', w);\n\t\t\t\tcanvas.setStyleValue('height', h);\n\t\t\t\tctx.scale(1, 1);\n\t\t\t}\n\n\t\t\tthis.m_iwidth = w;\n\t\t\tthis.m_iheight = h;\n\t\t}\n\n\t\tif (w && h) {\n\n\t\t\tlet cc = mkPainter(ctx, w, h);\n\n\t\t\tif (this.m_props.autoClear) {\n\t\t\t\tcc.clearRect(0, 0, w, h);\n\t\t\t}\n\n\t\t\tcc.save();\n\t\t\tcc.translate(-0.5, -0.5);\n\t\t\tthis.paint(cc);\n\t\t\tcc.restore();\n\t\t}\n\t}\n\n\tprotected paint(ctx: CanvasPainter) {\n\t\ttry {\n\t\t\tif (this.m_props.painter) {\n\t\t\t\tthis.m_props.painter(ctx);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.emit('paint', EvPaint(ctx));\n\t\t\t}\n\t\t}\n\t\tcatch (x) {\n\t\t\tconsole.assert(false, x);\n\t\t}\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file cardview.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Component, CProps, CEventMap } from './component'\nimport { EvChange } from './x4events'\n\nimport { IconID } from './icon'\nimport { asap, isFunction } from './tools'\n\nexport type PageOrCallback = Component | (() => Component);\n\nexport interface ICardViewItem {\n\ticon?: IconID;\n\tname: string,\n\ttitle: string;\n\tpage: PageOrCallback; // pre builded page\n}\n\n\ninterface CardViewEventMap extends CEventMap {\n\tchange?: EvChange;\t// value is page name\n}\n\nexport interface CardViewProps extends CProps<CardViewEventMap> {\n\tpages: ICardViewItem[];\n\tactive?: string;\n}\n\ninterface ICardItemEx extends ICardViewItem {\n\tselector: Component;\n\tactive: boolean;\n}\n\n/**\n * Standard CardView class\n * a card view is composed of multiples pages with only one visible at a time.\n * pages can be selected by a component (like tabs ou sidebar).\n * or by code.\n */\n\nexport class CardView<P extends CardViewProps = CardViewProps, E extends CardViewEventMap = CardViewEventMap> extends Component<P, E>\n{\n\tprotected m_cards: ICardItemEx[];\n\tprotected m_ipage: string;\t// initialy selected page\n\tprotected m_cpage: ICardItemEx;\t// currently selected page\n\n\tconstructor(props: P) {\n\t\tsuper(props);\n\n\t\tthis.m_cards = [];\n\t\tthis.m_ipage = props.active;\n\t\tthis.m_cpage = null;\n\n\t\tthis.singleShot(() => {\n\t\t\tthis.setPages(props.pages);\n\t\t});\n\t}\n\n\t/** @ignore */\n\trender() {\n\n\t\tlet pages = [];\n\t\tthis.m_cards.forEach((p) => {\n\t\t\tif (p.page) {\n\t\t\t\tpages.push(p.page);\n\t\t\t}\n\t\t});\n\n\t\tthis.setContent(pages);\n\t}\n\n\t/**\n\t * switch to a specific card\n\t * @param name - card name as define in constructor\n\t */\n\n\tpublic switchTo(name?: string) {\n\n\t\tif (this.m_cards.length == 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (name === undefined) {\n\t\t\tname = this.m_cards[0].name;\n\t\t}\n\n\t\tif (name === this.m_cpage?.name) {\n\t\t\treturn;\n\t\t}\n\n\t\t// hide old one\n\t\tif (this.m_cpage) {\n\t\t\tif (this.m_cpage.selector) {\n\t\t\t\tthis.m_cpage.selector.removeClass('@active');\n\t\t\t}\n\n\t\t\tif (this.m_cpage.page && !(this.m_cpage.page instanceof Function)) {\n\t\t\t\tlet page = <Component>this.m_cpage.page;\n\t\t\t\tpage.removeClass('@active');\n\t\t\t\tpage.addClass('@hidden');\n\t\t\t}\n\t\t}\n\n\t\tthis.m_cpage = this.m_cards.find((card) => card.name == name);\n\n\t\tif (this.m_cpage) {\n\t\t\tif (this.m_cpage.page) {\n\t\t\t\tif (isFunction(this.m_cpage.page)) {\n\t\t\t\t\tthis.m_cpage.page = this.m_cpage.page();\n\t\t\t\t\tconsole.assert(this.m_cpage.page != null, 'You must return a valid component');\n\t\t\t\t}\n\n\t\t\t\tlet page = this.m_cpage.page as Component;\n\t\t\t\tpage.addClass('@active');\n\t\t\t\tpage.removeClass('@hidden');\n\n\t\t\t\tif (!page.dom) {\n\t\t\t\t\tthis._preparePage(page);\n\t\t\t\t}\n\n\t\t\t\tif (this.m_cpage.selector) {\n\t\t\t\t\tthis.m_cpage.selector.addClass('@active');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.emit('change', EvChange(this.m_cpage.name));\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tsetPages(pages: ICardViewItem[]) {\n\t\tlet active = this._initTabs(pages);\n\t\tif (active) {\n\t\t\tasap(() => {\n\t\t\t\tthis.switchTo(active)\n\t\t\t\tthis.update();\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _initTabs(pages): any {\n\n\t\tif (!pages) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet active = this.m_ipage;\n\n\t\tpages.forEach((p) => {\n\n\t\t\tif( !p ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet card: ICardItemEx = { ...p };\n\n\t\t\tcard.selector = this._prepareSelector(p);\n\t\t\tcard.active = false;\n\n\t\t\tthis.m_cards.push(card);\n\n\t\t\tif (!active) {\n\t\t\t\tactive = p.name;\n\t\t\t}\n\n\t\t\tif (p.active) {\n\t\t\t\tactive = p.name;\n\t\t\t}\n\t\t});\n\n\t\treturn active;\n\t}\n\n\tprotected _updateSelector() {\n\t}\n\n\t/**\n\t * prepare the cardinfo\n\t * can be used by derivations to create & set selectors\n\t */\n\n\tprotected _prepareSelector(card: ICardViewItem): Component {\n\t\treturn null;\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprotected _preparePage(page: Component) {\n\t\tpage.setStyleValue('flex', 1);\n\t\tpage.addClass('@tab-page');\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file checkbox.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { CEventMap, Component, CProps } from './component'\nimport { EvChange, EventCallback } from './x4events'\nimport { HtmlString } from './tools'\n\nimport { Input } from './input'\nimport { Label } from './label'\n\n// ============================================================================\n// [CHECKBOX]\n// ============================================================================\n\ninterface CheckBoxEventMap extends CEventMap {\n\tchange?: EvChange;\n}\n\ninterface CheckBoxProps extends CProps<CheckBoxEventMap> {\n\tname?: string;\n\n\ttext?: string | HtmlString;\n\n\tchecked?: boolean;\n\tvalue?: string;\n\tslider?: boolean;\n\n\tlabelWidth?: number; // <0 mean flex value\n\tlabelAlign?: 'left' | 'right';\n\talign?: 'left' | 'right';\n\n\tchange?: EventCallback<EvChange>;\n}\n\n/**\n * Standard CheckBox\n */\n\nexport class CheckBox extends Component<CheckBoxProps, CheckBoxEventMap> {\n\n\tconstructor(props: CheckBoxProps) {\n\n\t\tsuper(props);\n\n\t\tthis.setDomEvent('focus', () => this._setFocus());\n\t\tthis.mapPropEvents( props, 'change' );\n\n\t\tif( props.slider ) {\n\t\t\tthis.addClass( 'slider' );\n\t\t}\n\t}\n\n\t/** @ignore */\n\trender(props: CheckBoxProps) {\n\n\t\t// checkbox\n\n\t\tlet labelWidth = props.labelWidth ?? -1;\n\t\tlet uid = '__cb_' + this.uid;\n\n\t\tthis.setTag( 'label');\n\t\tthis.addClass('@hlayout');\n\t\tthis.addClass(props.align ?? 'left');\n\t\t\n\t\tthis.setContent([\n\t\t\tnew Input({\n\t\t\t\tref: 'input',\n\t\t\t\ttype: 'checkbox',\n\t\t\t\tname: props.name,\n\t\t\t\tid: uid,\n\t\t\t\ttabIndex: props.tabIndex,\n\t\t\t\tvalue: props.value ?? 'on',\n\t\t\t\tattrs: {\n\t\t\t\t\tchecked: props.checked ? '' : undefined\n\t\t\t\t},\n\t\t\t\tdom_events: {\n\t\t\t\t\tchange: this._change.bind(this),\n\t\t\t\t}\n\t\t\t}),\n\t\t\tprops.slider ? new Component( { cls: '@slide-el' } ) : null,\n\t\t\tnew Label({\n\t\t\t\ttext: props.text ?? '',\n\t\t\t\twidth: labelWidth < 0 ? undefined : labelWidth,\n\t\t\t\tflex: labelWidth < 0 ? -labelWidth : undefined,\n\t\t\t\talign: props.labelAlign ?? 'left',\n\t\t\t\tstyle: {\n\t\t\t\t\torder: props.align == 'right' ? -1 : 1,\n\t\t\t\t},\n\t\t\t\tattrs: {\n\t\t\t\t\t\"for\": uid\n\t\t\t\t}\n\t\t\t}),\n\t\t]);\n\t}\n\n\t/**\n\t * check state changed\n\t */\n\n\tprivate _change() {\n\t\tthis.emit('change', EvChange(this.check));\n\t}\n\n\t/**\n\t * focus gained/loosed\n\t */\n\n\tprivate _setFocus() {\n\t\tlet input = this.itemWithRef<Input>('input');\n\t\tinput.focus();\n\t}\n\n\t/**\n\t * @return the checked value\n\t */\n\n\tpublic get check() {\n\t\tif (this.dom) {\n\t\t\tlet input = this.itemWithRef<Input>('input');\n\t\t\tlet dom = input.dom as HTMLInputElement;\n\t\t\treturn dom.checked;\n\t\t}\n\n\t\treturn this.m_props.checked;\n\t}\n\n\t/**\n\t * change the checked value\n\t * @param {boolean} ck new checked value\t\n\t */\n\n\tpublic set check(ck: boolean) {\n\n\t\tif (this.dom) {\n\t\t\tlet input = this.itemWithRef<Input>('input');\n\t\t\tconst dom = input.dom as HTMLInputElement;\n\t\t\tif (dom) {\n\t\t\t\tdom.checked = ck;\n\t\t\t}\n\t\t}\n\n\t\tthis.m_props.checked = ck;\n\t\t//this._change();\t// todo: is it needed when changed by code ? -> no\n\t}\n\n\tget text() {\n\t\treturn this.itemWithRef<Label>('label').text;\n\t}\n\n\tset text(text) {\n\t\tthis.itemWithRef<Label>('label').text = text;\n\t}\n\n\t/**\n\t * toggle the checkbox\n\t */\n\n\tpublic toggle() {\n\t\tthis.check = !this.check;\n\t}\n}\n\n", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file color.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Stylesheet } from './styles'\n\n\nconst colorValues = {\n\t'lightsalmon': 0xFFFFA07A,\n\t'lightseagreen': 0xFF20B2AA,\n\t'lightskyblue': 0xFF87CEFA,\n\t'lightslategray': 0xFF778899,\n\t'lightsteelblue': 0xFFB0C4DE,\n\t'lightyellow': 0xFFFFFFE0,\n\t'lime': 0xFF00FF00,\n\t'limegreen': 0xFF32CD32,\n\t'linen': 0xFFFAF0E6,\n\t'magenta': 0xFFFF00FF,\n\t'maroon': 0xFF800000,\n\t'mediumaquamarine': 0xFF66CDAA,\n\t'mediumblue': 0xFF0000CD,\n\t'mediumorchid': 0xFFBA55D3,\n\t'mediumpurple': 0xFF9370DB,\n\t'mediumseagreen': 0xFF3CB371,\n\t'mediumslateblue': 0xFF7B68EE,\n\t'mediumspringgreen': 0xFF00FA9A,\n\t'mediumturquoise': 0xFF48D1CC,\n\t'mediumvioletred': 0xFFC71585,\n\t'midnightblue': 0xFF191970,\n\t'mintcream': 0xFFF5FFFA,\n\t'mistyrose': 0xFFFFE4E1,\n\t'moccasin': 0xFFFFE4B5,\n\t'navajowhite': 0xFFFFDEAD,\n\t'navy': 0xFF000080,\n\t'oldlace': 0xFFFDF5E6,\n\t'olive': 0xFF808000,\n\t'olivedrab': 0xFF6B8E23,\n\t'orange': 0xFFFFA500,\n\t'orangered': 0xFFFF4500,\n\t'orchid': 0xFFDA70D6,\n\t'palegoldenrod': 0xFFEEE8AA,\n\t'palegreen': 0xFF98FB98,\n\t'paleturquoise': 0xFFAFEEEE,\n\t'palevioletred': 0xFFDB7093,\n\t'papayawhip': 0xFFFFEFD5,\n\t'peachpuff': 0xFFFFDAB9,\n\t'peru': 0xFFCD853F,\n\t'pink': 0xFFFFC0CB,\n\t'plum': 0xFFDDA0DD,\n\t'powderblue': 0xFFB0E0E6,\n\t'purple': 0xFF800080,\n\t'red': 0xFFFF0000,\n\t'rosybrown': 0xFFBC8F8F,\n\t'royalblue': 0xFF4169E1,\n\t'saddlebrown': 0xFF8B4513,\n\t'salmon': 0xFFFA8072,\n\t'sandybrown': 0xFFFAA460,\n\t'seagreen': 0xFF2E8B57,\n\t'seashell': 0xFFFFF5EE,\n\t'sienna': 0xFFA0522D,\n\t'silver': 0xFFC0C0C0,\n\t'skyblue': 0xFF87CEEB,\n\t'slateblue': 0xFF6A5ACD,\n\t'slategray': 0xFF708090,\n\t'snow': 0xFFFFFAFA,\n\t'springgreen': 0xFF00FF7F,\n\t'steelblue': 0xFF4682B4,\n\t'tan': 0xFFD2B48C,\n\t'teal': 0xFF008080,\n\t'thistle': 0xFFD8BFD8,\n\t'tomato': 0xFFFF6347,\n\t'turquoise': 0xFF40E0D0,\n\t'violet': 0xFFEE82EE,\n\t'wheat': 0xFFF5DEB3,\n\t'white': 0xFFFFFFFF,\n\t'whitesmoke': 0xFFF5F5F5,\n\t'yellow': 0xFFFFFF00,\n\t'yellowgreen': 0xFF9ACD32,\n\t'aliceblue': 0xFFF0F8FF,\n\t'antiquewhite': 0xFFFAEBD7,\n\t'aqua': 0xFF00FFFF,\n\t'aquamarine': 0xFF7FFFD4,\n\t'azure': 0xFFF0FFFF,\n\t'beige': 0xFFF5F5DC,\n\t'bisque': 0xFFFFE4C4,\n\t'black': 0xFF000000,\n\t'blanchedalmond': 0xFFFFEBCD,\n\t'blue': 0xFF0000FF,\n\t'blueviolet': 0xFF8A2BE2,\n\t'brown': 0xFFA52A2A,\n\t'burlywood': 0xFFDEB887,\n\t'cadetblue': 0xFF5F9EA0,\n\t'chartreuse': 0xFF7FFF00,\n\t'chocolate': 0xFFD2691E,\n\t'coral': 0xFFFF7F50,\n\t'cornflowerblue': 0xFF6495ED,\n\t'cornsilk': 0xFFFFF8DC,\n\t'crimson': 0xFFDC143C,\n\t'cyan': 0xFF00FFFF,\n\t'darkblue': 0xFF00008B,\n\t'darkcyan': 0xFF008B8B,\n\t'darkgoldenrod': 0xFFB8860B,\n\t'darkgray': 0xFFA9A9A9,\n\t'darkgreen': 0xFF006400,\n\t'darkkhaki': 0xFFBDB76B,\n\t'darkmagenta': 0xFF8B008B,\n\t'darkolivegreen': 0xFF556B2F,\n\t'darkorange': 0xFFFF8C00,\n\t'darkorchid': 0xFF9932CC,\n\t'darkred': 0xFF8B0000,\n\t'darksalmon': 0xFFE9967A,\n\t'darkseagreen': 0xFF8FBC8F,\n\t'darkslateblue': 0xFF483D8B,\n\t'darkslategray': 0xFF2F4F4F,\n\t'darkturquoise': 0xFF00CED1,\n\t'darkviolet': 0xFF9400D3,\n\t'deeppink': 0xFFFF1493,\n\t'deepskyblue': 0xFF00BFFF,\n\t'dimgray': 0xFF696969,\n\t'dodgerblue': 0xFF1E90FF,\n\t'firebrick': 0xFFB22222,\n\t'floralwhite': 0xFFFFFAF0,\n\t'forestgreen': 0xFF228B22,\n\t'fuchsia': 0xFFFF00FF,\n\t'gainsboro': 0xFFDCDCDC,\n\t'ghostwhite': 0xFFF8F8FF,\n\t'gold': 0xFFFFD700,\n\t'goldenrod': 0xFFDAA520,\n\t'gray': 0xFF808080,\n\t'green': 0xFF008000,\n\t'greenyellow': 0xFFADFF2F,\n\t'honeydew': 0xFFF0FFF0,\n\t'hotpink': 0xFFFF69B4,\n\t'indianred': 0xFFCD5C5C,\n\t'indigo': 0xFF4B0082,\n\t'ivory': 0xFFFFFFF0,\n\t'khaki': 0xFFF0E68C,\n\t'lavender': 0xFFE6E6FA,\n\t'lavenderblush': 0xFFFFF0F5,\n\t'lawngreen': 0xFF7CFC00,\n\t'lemonchiffon': 0xFFFFFACD,\n\t'lightblue': 0xFFADD8E6,\n\t'lightcoral': 0xFFF08080,\n\t'lightcyan': 0xFFE0FFFF,\n\t'lightgoldenrodyellow': 0xFFFAFAD2,\n\t'lightgreen': 0xFF90EE90,\n\t'lightgrey': 0xFFD3D3D3,\n\t'lightpink': 0xFFFFB6C1,\n\t'none': 0,\n\t'transparent': 0,\n}\n\n\n\nexport class Color\n{\n\tprivate m_value:number;\n\tprivate static custom: Color[] = []\n\n\t/**\n\t * @example\n\t * ```ts\n\t * let c = new Color( 255, 255, 255, 0.2 );\n\t * let d = new Color( \"fff\" );\n\t * let e = new Color( \"css:selection-color\" );\n\t * let f = new Color( \"rgba(255,0,255,0.6)\" );\n\t * ```\n\t */\n\n\tconstructor( );\n\tconstructor( value: number | string );\n\tconstructor( value: number | string, alpha: number );\n\tconstructor( r: number, g: number, b: number );\n\tconstructor( r: number, g: number, b: number, a: number );\n\tconstructor( r?: any, g?: any, b?: any, a?: any ) {\n\t\t\n\t\tlet argc = arguments.length;\n\t\tlet self = this;\n\n\t\tfunction _init( ) {\n\n\t\t\tif( !argc ) {\n\t\t\t\treturn 0xff000000;\n\t\t\t}\n\n\t\t\tif( argc==1 ) {\n\n\t\t\t\tif( Number.isSafeInteger(r) ) {\n\t\t\t\t\treturn 0xff000000|(r&0xffffff);\n\t\t\t\t}\n\n\t\t\t\treturn self._getCustomColor( r )\n\t\t\t}\n\t\t\telse if( argc==2 ) {\n\t\t\t\n\t\t\t\tlet base,\n\t\t\t\t\talpha = (((g*255)|0)&0xff)<<24;\n\t\t\t\n\t\t\t\tif( Number.isSafeInteger(r) ) {\n\t\t\t\t\tbase = r;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tbase = self._getCustomColor( r );\n\t\t\t\t}\n\n\t\t\t\treturn (base&0xffffff) | alpha;\n\t\t\t}\n\t\t\telse if( argc==4 && a!==undefined && a<=1.0 ) {\n\t\t\t\n\t\t\t\tif( a<=0 ) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\ta = a*255;\n\t\t\t\ta |= 0; \t// convert to int\n\t\t\t\t\t\n\t\t\t\treturn ((a&0xff)<<24) | ((r&0xff)<<16) | ((g&0xff)<<8) | (b&0xff);\n\t\t\t}\n\t\t\t\n\t\t\treturn 0xff000000 | ((r&0xff)<<16) | ((g&0xff)<<8) | (b&0xff);\n\t\t}\n\t\n\t\tthis.m_value = _init( );\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _shade( percent: number ) { \n\t\tlet t = percent < 0 ? 0 : 255,\n\t\t\tp = percent < 0 ? -percent : percent;\n\n\t\tlet v = this._split( );\n\t\t\t\n\t\treturn new Color( \n\t\t\tMath.round( (t-v.r) * p ) + v.r, \n\t\t\tMath.round( (t-v.g) * p ) + v.g, \n\t\t\tMath.round( (t-v.b) * p ) + v.b, \n\t\t\tv.a / 255 \n\t\t);\n\t}\n\n\t/**\n\t * return a color darken by percent\n\t * @param percent \n\t */\n\n\tdarken( percent: number ) {\n\n\t\tif( percent<0 ) percent = 0;\n\t\tif( percent>100 ) percent = 100;\n\n\t\treturn this._shade( -percent/100 );\n\t}\n\n\t/**\n\t * return a color lighten by percent\n\t * @param percent \n\t */\n\tlighten( percent: number ) {\n\n\t\tif( percent<0 ) percent = 0;\n\t\tif( percent>100 ) percent = 100;\n\n\t\treturn this._shade( percent/100 );\n\t}\n\n\t/**\n\t * mix 2 colors\n\t * @param {rgb} c1 - color 1\n\t * @param {rgb} c2 - color 2\n\t * @param {float} percent - 0.0 to 1.0\n\t * @example \n\t * ```js\n\t * let clr = Color.mix( color1, color2, 0.5 );\n\t * ```\n\t */\n\n\tstatic mix( c1: Color, c2: Color, p: number ) {\n\n\t\tlet e1 = c1._split( ),\n\t\t\te2 = c2._split( );\n\t\t\t\n\t\tlet A = e1.a===e2.a ? e1.a : Math.round( e2.a*p + e1.a*(1-p) ),\n\t\t\tR = e1.r===e2.r ? e1.r : Math.round( e2.r*p + e1.r*(1-p) ),\n\t\t\tG = e1.g===e2.g ? e1.g : Math.round( e2.g*p + e1.g*(1-p) ),\n\t\t\tB = e1.b===e2.b ? e1.b : Math.round( e2.b*p + e1.b*(1-p) );\n\n\t\treturn new Color( R, G, B, A/255 );\n\t}\n\n\t/**\n\t * split the color into it's base element r,g,b & a (!a 1-255)\n\t */\n\tprivate _split( ) {\n\t\tlet f = this.m_value;\n\n\t\treturn { \n\t\t\ta: (f >> 24) & 0xff, \n\t\t\tr: (f >> 16) & 0xff, \n\t\t\tg: (f >> 8) & 0xff, \n\t\t\tb: (f & 0xff)\n\t\t};\n\t}\n\n\t/**\n\t * change the alpha value\n\t */\n\n\tfadeout( percent: number ) {\n\t\tlet el = this._split();\n\t\tel.a = el.a / 255;\n\n\t\tel.a = el.a - el.a * percent / 100.0;\n\t\tif( el.a>1.0 ) {\n\t\t\tel.a = 1.0;\n\t\t}\n\t\telse if( el.a<=0.0 ) {\n\t\t\treturn Color.NONE;\n\t\t}\n\t\t\n\t\treturn new Color( el.r, el.g, el.b, el.a );\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic static fromHSV( h: number, s: number, v: number, a = 1 ) {\n\t\t\n\t\tlet i = Math.min(5, Math.floor(h * 6)),\n f = h * 6 - i,\n p = v * (1 - s),\n q = v * (1 - f * s),\n t = v * (1 - (1 - f) * s);\n\n\t\tlet R, G, B;\n\n switch (i) {\n case 0:\n R = v;\n G = t;\n B = p;\n break;\n case 1:\n R = q;\n G = v;\n B = p;\n break;\n case 2:\n R = p;\n G = v;\n B = t;\n break;\n case 3:\n R = p;\n G = q;\n B = v;\n break;\n case 4:\n R = t;\n G = p;\n B = v;\n break;\n case 5:\n R = v;\n G = p;\n B = q;\n break;\n }\n\n return new Color( R*255, G*255, B*255, a );\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic static toHSV( c: Color ) {\n\t\tlet el = c._split();\n\n\t\tel.r /= 255.0;\n\t\tel.g /= 255.0;\n\t\tel.b /= 255.0;\n\t\tel.a /= 255.0;\n\n\t\tlet max = Math.max(el.r, el.g, el.b),\n\t\t\tmin = Math.min(el.r, el.g, el.b),\n\t\t\tdelta = max - min,\n\t\t\tsaturation = (max === 0) ? 0 : (delta / max),\n\t\t\tvalue = max;\n\n\t\tlet hue;\n\n\t\tif (delta === 0) {\n\t\t\thue = 0;\n\t\t}\n\t\telse {\n\t\t\tswitch (max) {\n\t\t\tcase el.r:\n\t\t\t\thue = (el.g - el.b) / delta / 6 + (el.g < el.b ? 1 : 0);\n\t\t\t\tbreak;\n\n\t\t\tcase el.g:\n\t\t\t\thue = (el.b - el.r) / delta / 6 + 1 / 3;\n\t\t\t\tbreak;\n\n\t\t\tcase el.b:\n\t\t\t\thue = (el.r - el.g) / delta / 6 + 2 / 3;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn { h: hue, s: saturation, v: value, a: el.a };\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic static fromHLS( h: number, l: number, s: number ) {\n\t\n\t\tlet r, g, b;\n\t\tif( s == 0 ){\n\t\t\tr = g = b = l; // achromatic\n\t\t}\n\t\telse{\n\t\t\tfunction hue2rgb(p, q, t){\n\t\t\t\tif(t < 0) t += 1.0;\n\t\t\t\tif(t > 1) t -= 1.0;\n\t\t\t\tif(t < 1/6) return p + (q - p) * 6 * t;\n\t\t\t\tif(t < 1/2) return q;\n\t\t\t\tif(t < 2/3) return p + (q - p) * (2/3 - t) * 6;\n\t\t\t\treturn p;\n\t\t\t}\n\n\t\t\tlet q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n\t\t\tlet p = 2 * l - q;\n\t\t\t\n\t\t\tr = hue2rgb(p, q, h + 1/3);\n\t\t\tg = hue2rgb(p, q, h);\n\t\t\tb = hue2rgb(p, q, h - 1/3);\n\t\t}\n\t\t\n\t\tr = ((r*255) | 0) & 0xff;\n\t\tg = ((g*255) | 0) & 0xff;\n\t\tb = ((b*255) | 0) & 0xff;\n\n\t\treturn new Color( r, g, b );\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic static toHLS( color: Color ) {\n\n\t\tlet f = color.m_value,\n\t\t\tr = ((f >> 16) & 0xff) / 255,\n\t\t\tg = ((f >> 8) & 0xff) / 255,\n\t\t\tb = (f & 0xff) / 255;\n\n\t\tlet minval = r,\n\t\t\tmaxval = r;\n\t\t\n\t\tif (g < minval) {\n\t\t\tminval = g;\n\t\t}\n\n\t\tif (b < minval) {\n\t\t\tminval = b;\n\t\t}\n\t\t\n\t\tif (g > maxval) {\n\t\t\tmaxval = g;\n\t\t}\n\n\t\tif (b > maxval) {\n\t\t\tmaxval = b;\n\t\t}\n\n\t\tlet rnorm = 0,\n\t\t\tgnorm = 0,\n\t\t\tbnorm = 0;\n\n\t\tlet mdiff = maxval - minval;\n\t\tlet msum = maxval + minval;\n\t\tlet light = 0.5 * msum;\n\t\tlet satur, hue;\n\n\t\tif (maxval != minval) {\n\t\t\trnorm = (maxval - r)/mdiff;\n\t\t\tgnorm = (maxval - g)/mdiff;\n\t\t\tbnorm = (maxval - b)/mdiff;\n\t\t} \n\t\telse {\n\t\t\treturn { h: 0, l: light, s: 0 };\n\t\t}\n\n\t\tif( light < 0.5 ) {\n\t\t\tsatur = mdiff/msum;\n\t\t}\n\t\telse {\n\t\t\tsatur = mdiff/(2.0 - msum);\n\t\t}\n\n\t\tif (r == maxval) {\n\t\t\thue = 60.0 * (6.0 + bnorm - gnorm);\n\t\t}\n\t\telse if (g == maxval) {\n\t\t\thue = 60.0 * (2.0 + rnorm - bnorm);\n\t\t}\n\t\telse {\n\t\t\thue = 60.0 * (4.0 + gnorm - rnorm);\n\t\t}\n\n\t\tif (hue > 360) {\n\t\t\thue = hue - 360;\n\t\t}\n\n\t\treturn { h: hue/360.0, l: light, s: satur };\n\t}\n\n\t/**\n\t * get the red value of the color\n\t */\n\n\tred( ) {\n\t\treturn (this.m_value >> 16) & 0xff;\n\t}\n\n\t/**\n\t * get the green value of the color\n\t */\n\n\tgreen( ) {\n\t\treturn (this.m_value >> 8) & 0xff;\n\t}\n\n\t/**\n\t * get the blue value of the color\n\t */\n\n\tblue( ) {\n\t\treturn this.m_value & 0xff;\t \n\t}\n\n\t/**\n\t * get the alpha value of the color\n\t */\n\n\talpha( ) {\n\t\treturn ( (this.m_value >> 24) & 0xff ) / 255;\n\t}\n\n\t/**\n\t * \n\t */\n\n\tvalue( ) {\n\t\treturn this.m_value;\n\t}\n\n\t/**\n\t * convert the color into string value\n\t */\n\n\ttoString( ) {\n\n\t\tlet color = this.m_value;\n\t\tif( color===0 ) {\n\t\t\treturn 'transparent';\n\t\t}\n\n\t\tlet el = this._split( );\n\n\t\tif( el.a===0xff ) {\n\t\t\treturn `rgb(${el.r},${el.g},${el.b})`;\n\t\t}\n\t\telse {\n\t\t\tel.a /= 255;\n\t\t\tlet alpha = el.a.toFixed( 3 );\n\t\t\treturn `rgba(${el.r},${el.g},${el.b},${alpha})`;\n\t\t}\n\t}\n\n\ttoHex( with_alpha = true ) {\n\t\tlet color = this.m_value;\n\t\tif( color===0 ) {\n\t\t\treturn 'transparent';\n\t\t}\n\n\t\tlet el = this._split( );\n\n\t\tif( el.a===0xff || !with_alpha ) {\n\t\t\treturn `#${_hx(el.r)}${_hx(el.g)}${_hx(el.b)}`;\n\t\t}\n\t\telse {\n\t\t\treturn `#${_hx(el.r)}${_hx(el.g)}${_hx(el.b)}${_hx(el.a)}`;\n\t\t}\n\t}\n\n\tpublic static addCustomColor( name: string, value: Color ) {\n\t\tColor.custom[name] = value;\n\t}\n\n\tpublic static addCssColor( name: string ) {\n\t\tlet c = Stylesheet.getVar( name );\n\t\tColor.custom['css:'+name] = Color.parse( c.trim() );\n\t}\n\n\tpublic static parse( str: string ) : Color {\n\t\tlet m;\n\t\n\t\tif( str[0]=='#' ) {\n\t\t\tconst re1 = /#(?<r>[a-fA-F0-9]{2})(?<g>[a-fA-F0-9]{2})(?<b>[a-fA-F0-9]{2})(?<a>[a-fA-F0-9]{2})?/;\n\t\t\tif( (m=re1.exec(str))!==null ) {\n\t\t\t\tlet g = m.groups;\n\t\t\t\treturn new Color( parseInt(g.r,16), parseInt(g.g,16), parseInt(g.b,16), g.a!==undefined ? parseInt(g.a,16)/255.0 : 1.0 );\n\t\t\t}\n\n\t\t\tconst re4 = /#(?<r>[a-fA-F0-9])(?<g>[a-fA-F0-9])(?<b>[a-fA-F0-9])/;\n\t\t\tif( (m=re4.exec(str))!==null ) {\n\t\t\t\tlet gr = m.groups;\n\t\t\t\tconst r = parseInt(gr.r,16);\n\t\t\t\tconst g = parseInt(gr.g,16);\n\t\t\t\tconst b = parseInt(gr.b,16);\n\n\t\t\t\treturn new Color( r<<4|r, g<<4|g, b<<4|b, 1.0 );\n\t\t\t}\n\t\t}\n\n\t\tif( str[0]=='r' ) {\n\t\t\tconst re2 = /rgb\\(\\s*(?<r>\\d+)\\s*\\,\\s*(?<g>\\d+)\\s*\\,\\s*(?<b>\\d+)\\s*\\)/;\n\t\t\tif( (m=re2.exec(str))!==null ) {\n\t\t\t\tlet g = m.groups;\n\t\t\t\treturn new Color( parseInt(g.r,10), parseInt(g.g,10), parseInt(g.b,10), 1.0 );\n\t\t\t}\n\n\t\t\tconst re3 = /rgba\\(\\s*(?<r>\\d+)\\s*\\,\\s*(?<g>\\d+)\\s*\\,\\s*(?<b>\\d+)\\s*\\,\\s*(?<a>[0-9.]+)\\s*\\)/;\n\t\t\tif( (m=re3.exec(str))!==null ) {\n\t\t\t\tlet g = m.groups;\n\t\t\t\treturn new Color( parseInt(g.r,10), parseInt(g.g,10), parseInt(g.b,10), parseFloat(g.a) );\n\t\t\t}\n\t\t}\n\n\t\t\n\t\tconsole.log( \"invalid color value: \"+str );\n\t\treturn new Color(0);\n\t}\n\n\tprivate _getCustomColor( name: string ) : number {\n\n\t\tif( name===null ) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tlet std = colorValues[name];\n\t\tif( std!==undefined ) {\n\t\t\treturn std;\n\t\t}\n\t\t\t\n\t\tif( Color.custom[name]!==undefined ) {\n\t\t\treturn Color.custom[name].m_value;\n\t\t}\n\n\t\tif( name.substr(0,4)=='css:' ) {\n\t\t\tColor.addCssColor( name.substr(4) );\n\t\t\treturn Color.custom[name].m_value;\n\t\t}\n\n\t\treturn Color.parse( name ).m_value;\n\t}\n\t\n\n\tpublic static contrastColor( color: Color ) : Color {\n\t\tlet el = color._split( );\n\t\t \n\t\t// Calculate the perceptive luminance (aka luma) - human eye favors green color... \n \t\tlet luma = ((0.299 * el.r ) + (0.587 * el.g ) + (0.114 * el.b)) / 255;\n\n \t\t// Return black for bright colors, white for dark colors\n \t\treturn luma > 0.5 ? Color.BLACK : Color.WHITE;\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic static WHITE = new Color(255,255,255);\n\n\t/**\n\t * \n\t */\n\n\tpublic static BLACK = new Color(0,0,0);\n\n\t/**\n\t * \n\t */\n\n\tpublic static NONE = new Color(0,0,0,0);\n\n\tstatic valueFromColorName( name: string ): Color {\n\t\n\t\tlet v = colorValues[name];\n\t\t\n\t\tif( v ) {\n\t\t\treturn new Color( v );\n\t\t}\n\t\telse {\n\t\t\treturn null;\n\t\t}\n\t\t\n\t}\n\n\tstatic fromCssVar( varName: string ) {\n\t\treturn new Color( varName ).toString();\n\t}\n}\n\n\nfunction _hx( n: number ) {\n\treturn ('00'+n.toString(16)).substr(-2).toUpperCase();\n}\n\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file request.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\n\n/**\n * TODO: use fetch api\n * \n\nasync function xx( resp, cb ) {\n\tcb( await resp.json() ); \n}\n\nasync function getToto( cb ) {\n fetch('home/toto', { method: 'GET' }).then( (resp) => { xx(resp,cb); } );\n}\n\nfunction dump( resp ) {\n\tconsole.log( resp );\n}\n\ngetToto( dump );\n\n*/\n\n\nimport { isArray, isLiteralObject, isString, NetworkError } from './tools'\n\nconst DEFAULT_TIMEOUT = 10000;\n\nexport interface RequestProps\n{\n\turl: string;\n\tmethod?: 'GET' | 'POST';\n\theaders?: string[];\n\tparams?: any;\n\ttimeout?: number;\n\tresponseType?: 'text' | 'json' | 'arraybuffer';\n\tuserData?: any;\n\n\tsuccess: ( data: any, userData: any ) => void;\n\tfailure?: ( status: number, statusText: string, userData: any ) => void;\n\tprogress?: ( length: number, total: number, display: string ) => void;\n}\n\n\nexport function ajaxRequest( cfg: RequestProps ) : Function {\n\t\n\tlet params,\n\t\turl = cfg.url,\n\t\tmethod = cfg.method || 'GET',\n\t\tformdata = false;\n\n\tif( cfg.params instanceof FormData ) {\n\t\tparams = cfg.params;\n\t\tformdata = true;\n\t}\n\telse if( method=='POST' ) {\n\t\tparams = buildQuery( cfg.params, false );\n\t}\n\telse {\n\t\turl += buildQuery( cfg.params, true );\n\t}\n\n\turl = encodeURI( url );\n\n\tlet xhr = new XMLHttpRequest( );\n\txhr.open( method, url );\n\n\txhr.upload.addEventListener( 'progress', progress, false);\n\txhr.addEventListener( 'timeout', failure );\n\txhr.addEventListener( 'error', failure );\n\txhr.addEventListener( 'load', success );\n\t\n\tif( !formdata ) {\n\t\txhr.setRequestHeader( \"Content-type\", \"application/x-www-form-urlencoded; charset=UTF-8\" );\n\t}\n\t\n\tif( method!='POST' ) {\n\t\txhr.responseType = cfg.responseType || 'json';\n\t\txhr.timeout = cfg.timeout || DEFAULT_TIMEOUT;\n\t}\n\n\tif( cfg.headers ) {\n\t\tfor( let h in cfg.headers) {\n\t\t\txhr.setRequestHeader( h, cfg.headers[h] );\n\t\t}\n\t}\n\n\tfunction progress( ev: ProgressEvent<EventTarget> ) {\n\t\tconsole.log( ev );\n\t\tif( cfg.progress ) {\n\t\t\ttry {\n\t\t\t\tif( ev.lengthComputable ) {\n\t\t\t\t\tlet disp = humanSize( ev.loaded ) + ' / ' + humanSize( ev.total );\n\t\t\t\t\tcfg.progress( ev.loaded, ev.total, disp );\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch( e ) {\n\t\t\t\tconsole.error( 'unhandled exception:', e );\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction humanSize( bytes: number ) {\n\n\t\tlet unit, value: number;\n\n\t\tif( bytes>=1e9 ) {\n\t\t\tunit = 'Gb';\n\t\t\tvalue = bytes/1e9;\t\n\t\t}\n\t\telse if( bytes>=1e6 ) {\n\t\t\tunit = 'Mb';\n\t\t\tvalue = bytes/1e6;\t\n\t\t}\n\t\telse if( bytes>=1e3 ) {\n\t\t\tunit = 'Kb';\n\t\t\tvalue = bytes/1e3;\t\n\t\t}\n\t\telse {\n\t\t\tunit = 'bytes';\n\t\t\tvalue = bytes;\t\n\t\t}\n\n\t\treturn value.toFixed( 2 ) + unit;\n\t}\n\n\tfunction failure( ) {\n\t\tif( cfg.failure ) {\n\t\t\tcfg.failure( xhr.status, xhr.statusText, cfg.userData );\n\t\t}\n\t}\n\n\tfunction success( ) {\n\t\tif( xhr.status>=200 && xhr.status<300 ) {\n\t\t\tif( cfg.success ) {\n\t\t\t\ttry {\n\t\t\t\t\tcfg.success( xhr.response, cfg.userData );\n\t\t\t\t}\n\t\t\t\tcatch( e ) {\n\t\t\t\t\tconsole.error( 'unhandled exception:', e );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tfailure( );\n\t\t}\t\n\t}\n\n\tif( formdata || method=='POST' ) {\n\t\txhr.send( params );\n\t}\n\telse {\n\t\txhr.send( );\n\t}\n\n\treturn function( ) {\n\t\txhr.abort( );\n\t};\n}\n\nfunction buildQuery( params: any, getMethod: boolean ) {\n\n\tif( !params ) {\n\t\treturn '';\n\t}\n\n\tlet query = [];\n\tfor( let key in params ) {\n\n\t\tlet param = params[key];\n\n\t\t// array\n\t\tif( isArray(param) ) {\n\t\t\tfor( let i=0, n=param.length; i<n; i++ ) {\n\t\t\t\tquery.push( encodeURIComponent(key) + '[]=' + encodeURIComponent( ''+param[i] ) );\n\t\t\t}\n\t\t}\n\t\t// simple string ...\n\t\telse {\n\n\t\t\tif( param===undefined ) {\n\t\t\t\tparam = '';\n\t\t\t}\n\t\t\tquery.push( encodeURIComponent(key) + '=' + encodeURIComponent(''+param) );\n\t\t}\n\t}\n\n\tlet result = query.join( '&' );\n\tif( getMethod ) {\n\t\treturn '?' + result;\n\t}\n\telse {\n\t\treturn result;\n\t}\n}\n\n\n//type Identity<T> = { [P in keyof T]: T[P] }\n//type Replace<T, K extends keyof T, TReplace> = Identity<Pick<T, Exclude<keyof T, K>> & {\n// [P in K] : TReplace\n//}>\n//type AjaxRequestInit = Replace< RequestInit, 'body', BodyInit | null | object | undefined >;\n\n\ninterface AjaxRequestInit extends Omit<RequestInit,'body'> {\n\tbody?: BodyInit | null | object;\n\tnoGenX?: boolean;\t// donot generate exception on error\n}\n\n\nexport async function ajaxAsJSON( url: string, init?: AjaxRequestInit ) : Promise<any> {\n\tlet response = await ajax( url, init, 'application/json' );\n\treturn response.json( );\n}\n\nexport async function ajaxAsText( url: string, init?: AjaxRequestInit ) : Promise<any> {\n\tlet response = await ajax( url, init, 'text/plain' );\n\treturn response.text( );\n}\n\n/**\n * use encodeURIComponent for elements in url\n */\n\nexport async function ajax( url: string, init?: AjaxRequestInit, type?: string ) : Promise<Response> {\n\n\tlet options: AjaxRequestInit = { \n\t\tmethod: 'GET',\n\t\theaders: {\n\t\t\t'X-Requested-With': 'XMLHttpRequest'\n\t\t}\n\t}\n\n\tif( type ) {\n\t\toptions.headers['Content-Type'] = type;\n\t}\n\n\tif( init ) {\n\t\toptions = { ...options, ...init };\n\n\t\tif( init.body && !isString(init.body) ) {\n\t\t\tlet cvt = false;\n\t\t\tif( isLiteralObject(init.body) ) {\n\t\t\t\tcvt = true;\n\t\t\t}\n\t\t\telse if( !(init.body instanceof Blob) && !(init.body instanceof ArrayBuffer) && !(init.body instanceof FormData) &&\n\t\t\t\t!(init.body instanceof URLSearchParams) && !(init.body instanceof ReadableStream) )\n\t\t\t{\n\t\t\t\tcvt = true;\n\t\t\t}\n\n\t\t\tif( cvt ) {\n\t\t\t\toptions.body = JSON.stringify( init.body );\n\t\t\t}\n\t\t\telse {\n\t\t\t\toptions.body = init.body;\n\t\t\t}\n\t\t}\n\t}\n\n\tlet response = await fetch( url, options as RequestInit );\n\n\tif( init && init.noGenX ) {\n\t\treturn response;\n\t}\n\telse {\n\t\tif( !response.ok ) {\n\t\t\tthrow new NetworkError( response );\n\t\t}\n\n\t\treturn response;\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file datastore.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { ajaxRequest } from './request';\nimport { isArray, isString } from './tools';\nimport { BasicEvent, EvChange, EventSource, EventMap, MapEvents } from './x4events';\nimport { BaseComponent, BaseComponentEventMap, BaseComponentProps } from './base_component';\n\nexport type ChangeCallback = (type: string, id?: any) => void;\nexport type CalcCallback = () => string;\n\nexport type FieldType = 'string' | 'int' | 'float' | 'date' | 'bool' | 'array' | 'object' | 'any' | 'calc';\nexport type DataIndex = Uint32Array;\n\nexport interface EvDataChange extends BasicEvent {\n\ttype: string;\n\tid: any;\n}\n\nexport function EvDataChange( type: 'create' | 'update' | 'delete' | 'data' | 'change', id?: any ) {\n\treturn BasicEvent<EvDataChange>( { type, id } );\n}\n\n\n\n\n/**\n * fields definition\n * \tfield with index=0 is record id\n */\n\nexport interface MetaData {\n\ttype?: FieldType;\n\tprec?: number;\n\trequired?: boolean;\n\tcalc?: (rec: Record) => any;\n\tmodel?: Record;\t// in case of array of subtypes, the model\n}\n\nexport interface FieldInfo extends MetaData {\n\tname: string;\n}\n\n/**\n * \n */\n\nclass MetaInfos {\n\tname: string;\n\tid: string;\t\t\t\t// field name holding 'id' record info\n\tfields: FieldInfo[];\t// field list\n\n\tconstructor( name: string ) {\n\t\tthis.name = name;\n\t\tthis.id = undefined;\n\t\tthis.fields = [];\n\t}\n}\n\nconst metaFields = Symbol( 'metaField' );\n\nfunction _getMetas( obj: object, create = true ) : MetaInfos {\n\t\n\tlet ctor = obj.constructor;\n\tlet mfld = ctor.hasOwnProperty(metaFields) ? ctor[metaFields] : undefined;\n\t\n\tif( mfld===undefined ) {\n\t\tif( !create ) {\n\t\t\tconsole.assert( mfld!==undefined );\n\t\t}\n\t\t\n\t\t// construct our metas\n\t\tmfld = new MetaInfos( ctor.name );\n\n\t\t// merge with parent class metas\n\t\tlet pctor = Object.getPrototypeOf(ctor);\n\t\tif( pctor!=Record ) {\n\t\t\tlet pmetas = pctor[metaFields];\n\t\t\tmfld.fields = [...pmetas.fields, ...mfld.fields ]\n\t\t\t\n\t\t\tconsole.assert( mfld.id===undefined, 'cannot define mutiple record id' );\n\t\t\tif( !mfld.id ) {\n\t\t\t\tmfld.id = pmetas.id;\n\t\t\t}\n\t\t}\t\n\n\t\tobj.constructor[metaFields] = mfld;\n\t}\n\n\treturn mfld;\n}\n\nexport namespace data {\n\n/**\n * define a record id\n * @example\n *\t\\@data_id()\n * id: string; // this field is the record id\n **/\n\n\texport function id( ) {\n\treturn ( ownerCls, fldName ) => {\n\t\tlet metas = _getMetas( ownerCls );\n\t\tmetas.fields.push( {\n\t\t\tname: fldName,\n\t\t\ttype: 'any',\n\t\t\trequired: true,\n\t\t});\n\n\t\tmetas.id = fldName;\n\t}\n}\n\n/**\n * @ignore\n */\n\n\texport function field( data: MetaData ) {\n\n\treturn ( ownerCls, fldName ) => {\n\t\tlet metas = _getMetas( ownerCls );\n\t\tmetas.fields.push( {\n\t\t\tname: fldName,\n\t\t\t...data\n\t\t} );\n\t}\n}\n\n/**\n * following member is a string field\n * @example\n * \\@data_string()\n * my_field: string;\t// this field will be seen as a string\n */\n\n\texport function string( props?: MetaData ) {\n\t\treturn field( { ...props, type: 'string' } );\n}\n\n/**\n * following member is an integer field\n * @example\n * \\@data_string()\n * my_field: number;\t// this field will be seen as an integer\n */\n\n\texport function int( props?: MetaData ) {\n\t\treturn field( { ...props, type: 'int' } );\n}\n\n/**\n * following member is a float field\n * @example\n * \\@data_float()\n * my_field: number;\t// this field will be seen as a float\n */\n\n\texport function float( props?: MetaData ) {\n\t\treturn field( { ...props, type: 'float' } );\n}\n\n/**\n * following member is a boolean field\n * @example\n * \\@data_bool()\n * my_field: boolean;\t// this field will be seen as a boolean\n */\n\n\texport function bool( props?: MetaData ) {\n\t\treturn field( { ...props, type: 'bool' } );\n}\n\n/**\n * following member is a date field\n * @example\n * \\@data_date()\n * my_field: date;\t// this field will be seen as a date\n */\n\n\texport function date( props?: MetaData ) {\n\t\treturn field( { ...props, type: 'date' } );\n}\n\n/**\n * following member is a calculated field\n * @example\n * \\@data_calc( )\n * get my_field(): string => {\n * \treturn 'hello';\n * };\t\n */\n\n\texport function calc( props?: MetaData ) {\n\t\treturn field( { ...props, type: 'calc'} ) \n}\n\n\n\n/**\n * \n */\n\ninterface RecordConstructor {\n new ( data?: any, id?: any ): Record;\n}\n\n/**\n * following member is a record array\n * @example\n * \\@data_array( )\n * my_field(): TypedRecord[];\t\n */\n\n\texport function array( ctor: RecordConstructor, props?: MetaData ) {\n\t\treturn data.field( { ...props, type: 'array', model: ctor ? new ctor() : null } )\n\t}\n\n}\n\n\n\n\n/**\n * record model\n */\n\nexport class Record {\n\t\n\tconstructor( data?: any, id?: any ) {\n\n\t\tif( data!==undefined ) {\n\t\t\tthis.unSerialize( data, id );\n\t\t}\n\t}\n\n\tclone( source?: any ) {\n\t\tlet rec = new (this.constructor as any)( );\n\t\tif( source ) {\n\t\t\trec.unSerialize( source );\n\t\t}\n\t\treturn rec;\n\t}\n\n\t/**\n\t * get the record unique identifier\n\t * by default the return value is the first field\n\t * @return unique identifier\n\t */\n\n\tgetID(): any { \n\t\tlet metas = _getMetas( this, false );\n\t\treturn this[metas.id];\n\t}\n\n\t/**\n\t * MUST IMPLEMENT\n\t * @returns fields descriptors\n\t */\n\n\tgetFields(): FieldInfo[] { \n\t\tlet metas = _getMetas( this, false );\n\t\treturn metas.fields;\n\t}\n\n\t/**\n\t * \n\t */\n\n\tvalidate( ) : Error[] {\n\t\t\n\t\tlet errs: Error[] = null;\n\n\t\tlet fields = this.getFields( );\n\t\tfields.forEach( (fi) => {\n\t\t\tif( fi.required && !this.getField(fi.name) ) {\n\t\t\t\tif( errs ) {\n\t\t\t\t\terrs = [];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\terrs.push( new Error( `field ${fi.name} is required.` ) );\n\t\t\t}\n\t\t})\n\n\t\treturn errs;\n\t}\n\n\t//mapAnyFields() {\n\t//\tthis.getFields = ( ) => {\n\t//\t\treturn Object.keys( this ).map( (name) => {\n\t//\t\t\treturn <FieldInfo>{ name };\n\t//\t\t});\t\t\t\n\t//\t}\n\t//}\n\n\tgetFieldIndex( name: string ) : number {\n\t\tlet fields = this.getFields( );\n\t\treturn fields.findIndex( (fd) => fd.name == name );\n\t}\n\n\t/**\n\t * default serializer\n\t * @returns an object with known record values\n\t */\n\n\tserialize(): any { \n\t\tlet rec = {};\n\n\t\tthis.getFields().forEach((f) => {\n\t\t\tif( f.calc === undefined ) {\n\t\t\t\trec[f.name] = rec[f.name];\n\t\t\t}\n\t\t});\n\n\t\treturn rec;\n\t}\n\t\n\t/**\n\t * default unserializer\n\t * @param data - input data \n\t * @returns a new Record\n\t */\n\n\tunSerialize(data: any, id?: any) : Record { \n\n\t\tlet fields = this.getFields();\n\n\t\tfields.forEach( (sf) => {\n\t\t\tlet value = data[sf.name];\n\t\t\tif (value !== undefined) {\n\t\t\t\tthis[sf.name] = this._convertField( sf, value );\n\t\t\t}\n\t\t});\n\n\t\tif( id!==undefined ) {\n\t\t\tthis[fields[0].name] = id;\n\t\t}\n\t\telse {\n\t\t\tconsole.assert( this.getID()!==undefined ); // store do not have ID field\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * field conversion\n\t * @param field - field descriptor\n\t * @param input - value to convert\n\t * @returns the field value in it's original form\n\t */\n\n\tprotected _convertField( field: FieldInfo, input: any ) : any {\n\t\t\n\t\t//TODO: boolean\n\n\t\tswitch( field.type ) {\n\t\t\tcase 'float': {\n\t\t\t\tlet ffv: number = typeof (input) === 'number' ? input : parseFloat(input);\n\t\t\t\t\n\t\t\t\tif (field.prec !== undefined) {\n\t\t\t\t\tlet mul = Math.pow(10, field.prec);\n\t\t\t\t\tffv = Math.round(ffv * mul) / mul;\n\t\t\t\t}\n\t\t\t\n\t\t\t\treturn ffv;\n\t\t\t}\n\n\t\t\tcase 'int': {\n\t\t\t\treturn typeof (input) === 'number' ? input : parseInt(input);\n\t\t\t}\n\n\t\t\tcase 'date': {\n\t\t\t\treturn isString(input) ? new Date(input) : input;\n\t\t\t}\n\n\t\t\tcase 'array': {\n\t\t\t\tlet result = [];\n\t\t\t\n\t\t\t\tif( field.model ) {\n\t\t\t\t\tinput.forEach( ( v ) => {\n\t\t\t\t\t\tresult.push( field.model.clone( v ) );\n\t\t\t\t\t})\n\t\t\t\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn input;\n\t}\n\n\t/**\n\t * get raw value of a field\n\t * @param name - field name or field index\n\t */\n\n\tgetRaw( name: string | number ) : any {\n\t\t\n\t\tlet idx;\n\t\tlet fields = this.getFields( );\n\n\t\tif( typeof(name) === 'string' ) {\n\t\t\tidx = fields.findIndex( fi => fi.name == name );\n\t\t\tif( idx < 0 ) {\n\t\t\t\tconsole.assert( false, 'unknown field: '+name);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t}\n\t\telse if( name<fields.length ) {\n\t\t\tif( name<0 ) {\n\t\t\t\treturn undefined\n\t\t\t}\n\n\t\t\tidx = name;\n\t\t}\n\t\telse {\n\t\t\tconsole.assert( false, 'bad field name: '+name);\n\t\t\treturn undefined;\n\t\t}\n\n\t\tlet fld = fields[idx];\n\t\tif( fld.calc!==undefined ) {\n\t\t\treturn fld.calc( this );\n\t\t}\n\t\t\n\t\treturn this[fld.name];\n\t}\n\n\t/**\n\t * \n\t * @param name \n\t * @param data \n\t */\n\n\tsetRaw( name: string, data: string ) {\n\t\tthis[name] = data;\n\t}\n\n\t/**\n\t * get field value (as string)\n\t * @param name - field name\n\t * @example\n\t * let value = record.get('field1');\n\t */\n\n\tgetField( name: string ): string {\n\t\tlet v = this.getRaw( name );\n\t\treturn (v===undefined || v===null) ? '' : ''+v;\n\t}\n\n\t/**\n\t * set field value\n\t * @param name - field name\n\t * @param value - value to set\n\t * @example\n\t * record.set( 'field1', 7 );\n\t */\n\n\tsetField(name: string, value: any) {\n\t\tlet fields = this.getFields( );\n\t\tlet idx = fields.findIndex( fi => fi.name == name );\n\n\t\tif( idx < 0 ) {\n\t\t\tconsole.assert( false, 'unknown field: '+name);\n\t\t\treturn;\n\t\t}\n\n\t\tlet fld = fields[idx];\n\t\tif( fld.calc!==undefined ) {\n\t\t\tconsole.assert( false, 'cannot set calc field: '+name);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tthis.setRaw( fld.name, value );\n\t}\n}\n\n/**\n * by default, the field id is rhe first member or the record\n */\n\nexport class AutoRecord extends Record {\n\n\tprivate m_data;\n\tprivate m_fid: string;\n\n\tconstructor( data: any ) {\n\t\tsuper( );\n\n\t\tthis.m_data = data;\n\t}\n\n\tgetID( ) {\n\t\tif( !this.m_fid ) {\n\t\t\tlet fnames = Object.keys( this.m_data );\n\t\t\tthis.m_fid = fnames[0];\n\t\t}\n\n\t\treturn this.m_data[this.m_fid];\n\t}\n\n\tgetFields( ) : FieldInfo[] {\n\t\tlet fnames = Object.keys( this.m_data );\n\t\tlet fields: FieldInfo[] = fnames.map( (n) => {\n\t\t\treturn {\n\t\t\t\tname: n\n\t\t\t};\n\t\t})\n\n\t\treturn fields;\n\t}\n\n\tgetRaw( name: string ) : string {\n\t\treturn this.m_data[name];\n\t}\n\n\tsetRaw( name: string, data: string ) {\n\t\tthis.m_data[name] = data;\n\t}\n\n\tclone( data ) {\n\t\treturn new AutoRecord( {...data} );\n\t}\n}\n\n/**\n * \n */\n\ninterface DataEventMap extends BaseComponentEventMap {\n\tchange?: EvChange;\n}\n\ntype DataSolver = ( data: any ) => Record[];\n\nexport interface DataProxyProps extends BaseComponentProps<DataEventMap> {\n\turl: string;\n\tparams?: string[];\n\tsolver?: DataSolver;\n}\n\nexport class DataProxy extends BaseComponent<DataProxyProps,DataEventMap> {\n\n\tconstructor( props: DataProxyProps ) {\n\t\tsuper( props );\n\t}\n\n\tasync load( url?: string ) {\n\t\tif( url ) {\n\t\t\tthis.m_props.url = url;\n\t\t}\n\t\telse {\n\t\t\turl = this.m_props.url;\n\t\t}\n\n\t\tif( this.m_props.params ) {\n\t\t\turl += '?' + this.m_props.params.join( '&' );\n\t\t}\n\n\t\tconst r = await fetch( url );\n\t\tif( r.ok ) {\n\t\t\tconst raw = await r.json( );\n\t\t\t\n\t\t\tlet json = raw;\n\t\t\tif( this.m_props.solver ) {\n\t\t\t\tjson = this.m_props.solver( json );\n\t\t\t}\n\n\t\t\tthis.emit( 'change', EvChange(json,raw) );\n\t\t}\n\t}\n}\n\n\n/**\n * \n */\n\ninterface DataStoreProps<T extends Record> extends BaseComponentProps<DataStoreEventMap> {\n\tmodel: T;\n\tdata?: T[];\n\turl?: string;\n\tautoload?: false;\n}\n\n\ninterface DataStoreEventMap extends EventMap {\n\tdata_change: EvDataChange;\n}\n\n\n\n/**\n * \n */\n\nexport class DataStore<T extends Record = Record> extends EventSource<DataStoreEventMap> {\n\t\n\tprotected m_model: T;\n\tprotected m_fields: FieldInfo[];\n\tprotected m_records: T[];\n\n\tprotected m_proxy: DataProxy;\n\tprotected m_rec_index: DataIndex;\n\n\tconstructor(props: DataStoreProps<T> ) {\n\t\tsuper( );\n\n\t\tthis.m_fields = undefined;\n\t\tthis.m_records = [];\n\t\tthis.m_rec_index = null;\n\t\tthis.m_model = props.model;\n\t\tthis.m_fields = props.model.getFields();\n\n\t\tif (props.data) {\n\t\t\tthis.setRawData( props.data );\n\t\t}\n\t\telse if( props.url ) {\n\t\t\tthis.m_proxy = new DataProxy( {\n\t\t\t\turl: props.url,\n\t\t\t\tsolver: props.solver,\n\t\t\t\tevents: { change: (ev) => { this.setData( ev.value ); } }\n\t\t\t});\n\n\t\t\tif( props.autoload!=false ) {\n\t\t\t\tthis.m_proxy.load( );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * \n\t * @param records \n\t */\n\n\tasync load( url?: string ) {\n\t\treturn this.m_proxy.load( url );\n\t}\n\n\tasync reload( ) {\n\t\treturn this.m_proxy.load( );\n\t}\n\n\t/**\n\t * convert raw objects to real records from model\n\t * @param records \n\t */\n\n\tpublic setData( records: any[] ) {\n\n\t\tlet realRecords: T[] = [];\n\n\t\trecords.forEach( (rec) => {\n\t\t\trealRecords.push( this.m_model.clone(rec) );\n\t\t});\n\n\t\tthis.setRawData( realRecords );\n\t}\n\n\t/**\n\t * just set the records\n\t * @param records - must be of the same type as model\n\t */\n\n\tpublic setRawData(records: T[]) {\n\n\t\tthis.m_records = records;\n\t\tthis._rebuildIndex( );\n\t\tthis.emit( 'data_change', EvDataChange( 'change' ) );\n\t}\n\t\n\n\tprivate _rebuildIndex( ) {\n\t\tthis.m_rec_index = null; // null to signal that we have to run on records instead of index\n\t\tthis.m_rec_index = this.createIndex( null ); // prepare index (remove deleted)\n\t\tthis.m_rec_index = this.sortIndex( this.m_rec_index, null ); // sort by id\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic update( rec: T ) {\n\t\tlet id = rec.getID();\n\t\tlet index = this.indexOfId(id);\n\t\tif (index < 0) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.m_records[this.m_rec_index[index]] = rec;\n\t\tthis.emit( 'data_change', EvDataChange( 'update', id ) );\n\t\treturn true;\n\t}\n\n\t/**\n\t * \n\t * @param data \n\t */\n\n\tpublic append( rec: T | any ) {\n\n\t\tif( !(rec instanceof Record) ) {\n\t\t\tlet nrec = this.m_model.clone( );\n\t\t\trec = nrec.unSerialize( rec );\n\t\t}\n\n\t\tconsole.assert( rec.getID() );\n\n\t\tthis.m_records.push( rec );\n\t\tthis._rebuildIndex( );\n\t\tthis.emit( 'data_change', EvDataChange( 'create', rec.getID() ) );\n\t}\n\n\t/**\n\t * \n\t */\n\n\tgetMaxId( ) {\n\t\tlet maxID = undefined;\n\t\tthis.m_records.forEach( (r) => {\n\t\t\tlet rid = r.getID( );\n\t\t\tif( maxID===undefined || maxID<rid ) {\n\t\t\t\tmaxID = rid;\n\t\t\t}\n\t\t});\n\n\t\treturn maxID;\n\t}\n\n\t/**\n\t * \n\t * @param id \n\t */\n\n\tpublic delete(id: any): boolean {\n\n\t\tlet idx = this.indexOfId( id );\n\t\tif( idx<0 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tidx = this.m_rec_index[idx];\n\n\t\t// mark as deleted\n\t\tthis.m_records.splice( idx, 1 );\n\t\tthis._rebuildIndex( );\n\t\tthis.emit( 'data_change', EvDataChange( 'delete', id ) );\n\t\treturn true;\n\t}\n\n\t/**\n\t * return the number of records\n\t */\n\n\tget count( ) : number {\n\t\treturn this.m_rec_index ? this.m_rec_index.length : this.m_records.length;\n\t}\n\n\t/**\n\t * return the fields\n\t */\n\n\tget fields( ) : FieldInfo [] {\n\t\treturn this.m_fields;\n\t}\n\n\t/**\n\t * find the index of the element with the given id\n\t */\n\n\tpublic indexOfId(id: any ): number {\n\n\t\t//if( this.count<10 ) {\n\t\t//\tthis.forEach( (rec) => rec.getID() == id );\n\t\t//}\n\n\t\tfor( let lim = this.count, base = 0; lim != 0; lim >>= 1 ) {\n\t\t\t\n\t\t\tlet p = base + (lim >> 1); // int conversion\n\t\t\tlet idx = this.m_rec_index[p];\n\t\t\tlet rid = this.m_records[idx].getID( );\n\t\n\t\t\tif( rid==id ) {\n\t\t\t\treturn p;\n\t\t\t}\n\n\t\t\tif( rid<id ) {\n\t\t\t\tbase = p+1;\n\t\t\t\tlim--;\n\t\t\t}\n\t\t}\n\t\n\t\treturn -1;\n\t}\n\n\t/**\n\t * return the record by it's id \n\t * @returns record or null\n\t */\n\n\tpublic getById(id: any): T {\n\t\tlet idx = this.indexOfId( id );\n\t\tif( idx<0 ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tidx = this.m_rec_index[idx];\n\t\treturn this.m_records[idx];\n\t}\n\n\t/**\n\t * return a record by it's index\n\t * @returns record or null\n\t */\n\n\tpublic getByIndex( index: number ): T {\n\t\tlet idx = this.m_rec_index[index];\n\t\treturn this._getRecord( idx );\n\t}\n\n\tprivate _getRecord( index: number ) : T {\n\t\treturn this.m_records[index] ?? null;\n\t}\n\n\tpublic moveTo( other: DataStore<T> ) {\n\t\tother.setRawData( this.m_records );\n\t}\n\t\n\t/**\n\t * create a new view on the DataStore\n\t * @param opts \n\t */\n\n\tcreateView( opts?: DataViewProps<T> ) : DataView<T> {\n\t\tlet eopts = { ...opts, store: this };\n\t\treturn new DataView( eopts );\n\t}\n\n\t/**\n\t * \n\t */\n\n\tcreateIndex( filter: FilterInfo ) : DataIndex {\n\n\t\tif( filter && filter.op==='empty-result' ) {\n\t\t\treturn new Uint32Array(0);\n\t\t}\n\t\t\n\t\tlet index = new Uint32Array( this.m_records.length );\n\t\tlet iidx = 0;\n\t\t\t\n\t\tif( !filter ) {\n\t\t\t// reset filter\n\t\t\tthis.forEach( (rec, idx) => {\n\t\t\t\tindex[iidx++] = idx;\n\t\t\t} );\n\t\t}\n\t\telse {\n\t\t\tif( typeof(filter.op)==='function' ) {\n\n\t\t\t\tlet fn = <FilterFunc>filter.op;\n\n\t\t\t\t// scan all records and append only interesting ones\n\t\t\t\tthis.forEach( (rec, idx) => {\n\n\t\t\t\t\t// skip deleted\n\t\t\t\t\tif( !rec ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif( fn(rec) ) {\n\t\t\t\t\t\tindex[iidx++] = idx;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet filterFld = this.m_model.getFieldIndex( filter.field );\t // field index to filter on\n\t\t\t\tif( filterFld<0 ) {\n\t\t\t\t\t// unknown filter field, nothing inside\n\t\t\t\t\tconsole.assert( false, 'unknown field name in filter' )\n\t\t\t\t\treturn new Uint32Array(0);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tlet filterValue = filter.value;\n\t\t\t\tif( isString(filterValue) && !filter.caseSensitive ) {\n\t\t\t\t\tfilterValue = filterValue.toUpperCase( );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfunction _lt( recval: string ) : boolean {\n\t\t\t\t\treturn recval < filterValue;\n\t\t\t\t}\n\n\t\t\t\tfunction _le( recval: string ) : boolean {\n\t\t\t\t\treturn recval <= filterValue;\n\t\t\t\t}\n\n\t\t\t\tfunction _eq( recval: string ) : boolean {\n\t\t\t\t\treturn recval == filterValue;\n\t\t\t\t}\n\n\t\t\t\tfunction _neq( recval: string ) : boolean {\n\t\t\t\t\treturn recval != filterValue;\n\t\t\t\t}\n\n\t\t\t\tfunction _ge( recval: string ) : boolean {\n\t\t\t\t\treturn recval >= filterValue;\n\t\t\t\t}\n\n\t\t\t\tfunction _gt( recval: string ) : boolean {\n\t\t\t\t\treturn recval > filterValue;\n\t\t\t\t}\n\n\t\t\t\tfunction _re( recval: string ) : boolean {\n\t\t\t\t\tfilterRe.lastIndex = -1;\n\t\t\t\t\treturn filterRe.test( recval );\n\t\t\t\t}\n\n\t\t\t\tlet filterFn;\t// filter fn \n\t\t\t\tlet filterRe;\t// if fielter is regexp\n\t\t\t\tif( filterValue instanceof RegExp ) {\n\t\t\t\t\tfilterRe = filterValue;\n\t\t\t\t\tfilterFn = _re;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tswitch( filter.op ) {\n\t\t\t\t\t\tcase '<':\t{ filterFn = _lt; break; }\n\t\t\t\t\t\tcase '<=': \t{ filterFn = _le; break; }\n\t\t\t\t\t\tcase '=': \t{ filterFn = _eq; break; }\n\t\t\t\t\t\tcase '>=': \t{ filterFn = _ge; break; }\n\t\t\t\t\t\tcase '>': \t{ filterFn = _gt; break; }\n\t\t\t\t\t\tcase '<>': { filterFn = _neq; break; }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\n\t\t\t\t// scan all records and append only interesting ones\n\t\t\t\tthis.forEach( (rec, idx) => {\n\n\t\t\t\t\t// skip deleted\n\t\t\t\t\tif( !rec ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet field = rec.getRaw( filterFld );\n\t\t\t\t\tif( field===null || field===undefined ) {\n\t\t\t\t\t\tfield = '';\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfield = ''+field;\n\t\t\t\t\t\tif( !filter.caseSensitive ) {\n\t\t\t\t\t\t\tfield = field.toUpperCase( );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet keep = filterFn( field );\n\t\t\t\t\tif( keep ) {\n\t\t\t\t\t\tindex[iidx++] = idx;\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn index.slice( 0, iidx );\n\t}\n\n\tsortIndex( index: DataIndex, sort: SortProp[] ) {\n\t\t\n\t\tinterface sort_info {\n\t\t\tfidx: number,\n\t\t\tasc: boolean\n\t\t}\n\n\t\tlet bads = 0;\t\t// unknown fields\n\t\tlet fidxs: sort_info[] = [];\t\t// fields indexes\n\n\t\t// if no fields are given, reset sort by id\n\t\tif ( sort===null ) {\n\t\t\tfidxs.push( { fidx: 0, asc: true } );\n\t\t}\n\t\telse {\n\t\t\tfidxs = sort.map( (si) => {\n\t\t\t\t\n\t\t\t\tlet fi = this.m_model.getFieldIndex( si.field );\n\t\t\t\tif (fi == -1) {\n\t\t\t\t\tconsole.assert( false, 'unknown field name in sort' )\n\t\t\t\t\tbads++;\n\t\t\t\t}\n\n\t\t\t\treturn { fidx: fi, asc: si.ascending };\n\t\t\t});\n\t\t}\n\n\t\t// unknown field or nothing to sort on ??\n\t\tif( bads || fidxs.length==0 ) {\n\t\t\treturn index;\n\t\t}\n\n\t\t// sort only by one field : optimize it\n\t\tif( fidxs.length==1 ) {\n\n\t\t\tlet field = fidxs[0].fidx;\n\t\t\tindex.sort( ( ia, ib ) => {\n\n\t\t\t\tlet va = this.getByIndex(ia).getRaw( field ) ?? '';\n\t\t\t\tlet vb = this.getByIndex(ib).getRaw( field ) ?? '';\n\t\t\t\tif (va > vb) { return 1; }\n\t\t\t\tif (va < vb) { return -1; }\n\t\t\t\treturn 0;\n\t\t\t} );\n\n\t\t\t// just reverse if \n\t\t\tif( !fidxs[0].asc ) {\n\t\t\t\tindex.reverse( );\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tindex.sort( ( ia, ib ) => {\n\n\t\t\t\tfor( let fi=0; fi<fidxs.length; fi++ ) {\n\n\t\t\t\t\tlet fidx = fidxs[fi].fidx;\n\t\t\t\t\tlet mul = fidxs[fi].asc ? 1 : -1;\n\n\t\t\t\t\tlet va = this.getByIndex(ia).getRaw( fidx ) ?? '';\n\t\t\t\t\tlet vb = this.getByIndex(ib).getRaw( fidx ) ?? '';\n\t\t\t\t\tif (va > vb) { return mul; }\n\t\t\t\t\tif (va < vb) { return -mul; }\n\t\t\t\t}\n\n\t\t\t\treturn 0;\n\t\t\t} );\n\t\t}\n\n\t\treturn index\t\n\t}\n\n\t/**\n\t * \n\t */\n\n\tforEach( cb: ( rec:T, index: number ) => any ) {\n\t\t\n\t\tif( this.m_rec_index ) {\n\t\t\tthis.m_rec_index.some( (ri,index) => {\n\t\t\t\tif( cb( this.m_records[ri], index ) ) {\n\t\t\t\t\treturn index;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tthis.m_records.some( ( rec, index ) => {\n\t\t\t\tif( rec ) {\n\t\t\t\t\tif( cb( rec, index ) ) {\n\t\t\t\t\t\treturn index;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t}\n\n\texport( ) {\n\t\treturn this.m_records;\n\t}\n\n\tchanged( ) {\n\t\tthis.emit( 'data_change', EvDataChange('change') );\n\t}\n}\n\n\n// :: VIEWS ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\nexport interface EvViewChange extends BasicEvent {\n\taction: string;\n}\n\nexport function EvViewChange( action: 'filter' | 'sort' | 'change' ) {\n\treturn BasicEvent<EvViewChange>( { action } );\n}\n\ninterface DataViewEventMap extends BaseComponentEventMap {\n\tview_change: EvViewChange;\n}\n\ninterface DataViewProps<T extends Record> extends BaseComponentProps<DataViewEventMap> {\n\tstore?: DataStore<T>;\n\tfilter?: FilterInfo;\n\torder?: string | SortProp[] | SortProp;\n}\n\nexport type FilterFunc = ( rec: Record ) => boolean;\n\nexport interface FilterInfo {\n\top: '<' | '<=' | '=' | '>=' | '>' | '<>' | 'empty-result' | FilterFunc,\t// emptydb mean return an empty result always\n\tfield?: string;\n\tvalue?: string | RegExp; // if regexp then operator is =\n\tcaseSensitive?: boolean;\n}\n\n\nexport interface SortProp {\n\tfield: string; \t\t\t// \n\tascending: boolean;\t\t// \n}\n\n\n\n/**\n * Dataview allow different views of the DataStore.\n * You can sort the columns & filter data\n * You can have multiple views for a single DataStore\n */\n\nexport class DataView<T extends Record = Record> extends BaseComponent<DataViewProps<T>,DataViewEventMap>\n{\n\tprotected m_index: DataIndex;\n\tprotected m_store: DataStore<T>;\t\n\n\tprotected m_sort: SortProp[];\n\tprotected m_filter: FilterInfo;\n\n\tconstructor( props: DataViewProps<T> ) {\n\t\tsuper( props );\n\n\t\tthis.m_store = props.store;\n\t\tthis.m_index = null;\n\t\tthis.m_filter = null;\n\t\tthis.m_sort = null;\n\n\t\tthis.filter( props.filter );\n\t\t\n\t\tif( props.order ) {\n\t\t\tif( isString(props.order) ) {\n\t\t\t\tthis.sort( [ { field: props.order, ascending: true } ] );\n\t\t\t}\n\t\t\telse if( isArray(props.order) ) {\n\t\t\t\tthis.sort( props.order );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.sort( [props.order] );\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tthis.sort( null );\n\t\t}\n\n\t\tthis.m_store.on( 'data_change', ( e ) => this._storeChange(e) );\n\t}\n\n\tprivate _storeChange( ev: EvDataChange ) {\n\t\t\n\t\tthis._filter( this.m_filter, ev.type!='change' );\n\t\tthis._sort( this.m_sort, ev.type!='change' );\n\t\t\n\t\tthis.emit( 'view_change', EvViewChange( 'change' ) );\n\t}\n\n\t/**\n\t * \n\t * @param filter \n\t */\n\n\tpublic filter( filter?: FilterInfo ) : number {\n\n\t\tthis.m_index = null; // null to signal that we have to run on records instead of index\n\t\treturn this._filter( filter, true );\n\t}\n\n\tprivate _filter( filter: FilterInfo, notify: boolean) : number {\n\n\t\tthis.m_index = this.m_store.createIndex( filter );\n\t\tthis.m_filter = filter;\n\n\t\t// need to sort again:\n\t\tif( this.m_sort ) {\n\t\t\tthis.sort( this.m_sort );\n\t\t}\n\t\t\n\t\tif( notify ) {\n\t\t\tthis.emit( 'view_change', EvViewChange( 'filter' ) );\n\t\t}\n\n\t\treturn this.m_index.length;\n\t}\n\n\t/**\n\t * \n\t * @param columns \n\t * @param ascending \n\t */\n\n\tpublic sort( props: SortProp[] ) {\n\t\tthis._sort( props, true );\n\t}\n\n\tprivate _sort( props: SortProp[], notify: boolean ) {\n\t\tthis.m_index = this.m_store.sortIndex( this.m_index, props );\n\t\tthis.m_sort = props;\n\n\t\tif( notify ) {\n\t\t\tthis.emit( 'view_change', EvViewChange( 'sort' ) );\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tget store ( ) {\n\t\treturn this.m_store;\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic get count() {\n\t\treturn this.m_index.length;\n\t}\n\n\t/**\n\t * \n\t * @param id \n\t */\n\n\tpublic indexOfId(id): number {\n\t\tlet ridx = this.m_store.indexOfId( id );\n\t\treturn this.m_index.findIndex( (rid) => rid === ridx );\n\t}\n\n\t/**\n\t * \n\t * @param index \n\t */\n\n\tpublic getByIndex(index: number): T {\n\t\t\n\t\tif (index >= 0 && index < this.m_index.length) {\n\t\t\tlet rid = this.m_index[index];\n\t\t\treturn this.m_store.getByIndex( rid );\n\t\t}\t\n\t\t\n\t\treturn null;\n\t}\n\n\t/**\n\t * \n\t * @param id \n\t */\n\n\tpublic getById( id: any): T {\n\t\treturn this.m_store.getById( id );\n\t}\n\n\tchanged( ) {\n\t\tthis.emit( 'view_change', EvViewChange('change') );\n\t}\n\n\t/**\n\t * \n\t */\n\n\t forEach( cb: ( rec:T, index: number ) => any ) {\n\t\tthis.m_index.some( ( index ) => {\n\t\t\tlet rec = this.m_store.getByIndex( index );\n\t\t\tif( rec ) {\n\t\t\t\tif( cb( rec, index ) ) {\n\t\t\t\t\treturn index;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t}\n}\n\n\n\n", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file combobox.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\n/**\n * TODO: replace custom combo list by listview or gridview\n */\n\nimport { x4document } from './x4dom'\n\nimport { Component, CProps, ContainerEventMap } from './component'\nimport { EvChange, EvSelectionChange, EventCallback } from './x4events'\n\nimport { Input } from './input'\nimport { Label } from './label'\nimport { Button } from './button'\nimport { HLayout } from './layout'\nimport { PopupListView, ListViewItem, EvCancel, PopulateItems } from './listview';\nimport { DataStore, DataView, Record } from './datastore'\nimport { isFunction, HtmlString } from './tools'\nimport { Tooltip } from './tooltips'\nimport { _tr } from './i18n'\n\nexport interface ComboStoreProxyProps {\n\tstore: DataView | DataStore;\n\tdisplay: ( rec: Record ) => string | HtmlString;\n}\n\n// ============================================================================\n// [COMBOBOX]\n// ============================================================================\n\nexport interface ComboItemRender {\n\t( itm: ListViewItem ) : Component;\n}\n\ninterface ComboBoxEventMap extends ContainerEventMap {\n\treadonly change: EvChange;\t// value change (event.value = new value as id)\n\treadonly selectionChange?: EvSelectionChange; // ( event.value = new value as ListItem)\n\treadonly cancel?: EvCancel;\n}\n\nexport interface ComboBoxProps extends CProps<ComboBoxEventMap> {\n\ttabIndex?: number | boolean;\n\tname?: string;\n\treadOnly?: boolean;\n\trequired?: true;\n\t\n\tlabel?: string;\t\t\t\t\t\t\t\n\tlabelWidth?: number; // < 0 for flex \n\t\t\t\t\t\t // =0 to adjust label width \n\t\t\t\t\t\t // > 0 to specify a width\n\n\tlabelAlign?: 'left' | 'right';\t\n\n\titems?: ListViewItem[] | PopulateItems;\n\tvalue?: any; // shown value at init\n\n\trenderer?: ComboItemRender;\n\tselectionChange?: EventCallback<EvSelectionChange>;// shortcut to events: { selectionChange: ... }\n\teditable?: boolean;\n}\n\nabstract class InputLike extends Component {\n\tabstract setValue( text: string );\n\tabstract getValue( ): string;\n\tabstract showError( text: string );\n\tabstract clearError( );\n}\n\n\n/**\n * @review use textedit\n */\n\nexport class ComboBox extends HLayout<ComboBoxProps,ComboBoxEventMap> {\n\t\n\tprivate m_ui_input: Input | InputLike;\n\tprivate m_ui_button: Button;\n\tprivate m_popup: PopupListView;\n\tprivate m_lockpop: boolean;\n\tprivate m_lockchg: boolean;\n\tprivate m_popvis: boolean;\n\tprivate m_selection: ListViewItem;\n\t\t\n\tconstructor(props: ComboBoxProps) {\n\t\tsuper(props);\n\n\t\tif( !props.editable ) {\n\t\t\tthis.setDomEvent( 'keypress', () => this.showPopup() );\n\t\t}\n\n\t\tthis.setDomEvent( 'click', () => {\n\t\t\tif( this.m_props.editable ) {\n\t\t\t\tthis.m_ui_input.focus( );\n\t\t\t}\n\t\t\t\n\t\t\tthis.showPopup();\n\t\t} );\n\n\t\tthis.setDomEvent(\"keydown\", e => this._onKey(e));\n\t\tthis.mapPropEvents(props, 'selectionChange' );\n\t\t\n\t\tthis.m_popvis = false;\n\t\tthis.m_lockpop = false;\n\t\tthis.m_lockchg = false;\n\t}\n\n\t_onKey(e) {\n if (this.m_popvis) {\n if (e.key == \"ArrowUp\" || e.key == \"ArrowDown\") {\n\t\t\t\tthis.m_lockpop = true;\n this.m_popup.handleKey(e);\n this.m_lockpop = false;\n e.preventDefault();\n e.stopPropagation();\n }\n else if (e.key == \"Escape\") {\n this._hidePopup();\n e.preventDefault();\n e.stopPropagation();\n }\n }\n }\n\n\tset items( items: ListViewItem[] ) {\n\t\tthis.m_props.items = items;\n\t\tif( this.m_popup ) {\n\t\t\tthis.m_popup.items = items;\n\t\t}\n\t}\n\t\n\t/** @ignore */\t\n\trender( props: ComboBoxProps ) {\n\n\t\tif( !props.renderer ) {\n\t\t\t\n\t\t\tthis.setClass('@required', props.required);\n\n\t\t\tconst input = new Input( {\n\t\t\t\tflex \t: 1,\n\t\t\t\treadOnly : this.m_props.editable ? false : true,\n\t\t\t\ttabIndex : 0,\n\t\t\t\tname: props.name,\n\t\t\t\tvalue_hook: {\n\t\t\t\t\tget: (): string => { return this.value; },\n\t\t\t\t\tset: (v: string) => { this.value = v; }\n\t\t\t\t},\n\t\t\t\tdom_events: {\n\t\t\t\t\tfocus: () => {\n\t\t\t\t\t\tthis.clearError();\n\t\t\t\t\t\tif( this.m_props.editable && input.value.length==0 ) {\n\t\t\t\t\t\t\tthis.showPopup( );\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tinput: ( ) => {\n\t\t\t\t\t\tif( this.m_lockchg ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst text = input.value;\n\t\t\t\t\t\tthis.m_selection = { id: undefined, text };\n\t\t\t\t\t\tlet items = this.showPopup( );\n\t\t\t\t\t\tif( items && items.length && items[0].text==text ) {\n\t\t\t\t\t\t\tthis.m_selection = { id: items[0].id, text };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.m_ui_input = input;\n\t\t}\n\t\telse {\n\t\t\tthis.m_ui_input = new Component( { \n\t\t\t\tflex: 1, \n\t\t\t\tcls: '@fake-input @hlayout', \n\t\t\t\ttabIndex: 1 \n\t\t\t} ) as any;\n\t\t}\n\n\t\tlet width = undefined,\n\t\t\tflex = undefined;\n\n\t\tlet labelWidth = props.labelWidth ?? 0;\n\t\t\t\t\n\t\tif( labelWidth>0 ) {\n\t\t\twidth = labelWidth;\n\t\t}\n\t\telse if( labelWidth<0 ) {\n\t\t\tflex = -labelWidth;\n\t\t}\n\n\t\tthis.setContent([\n\t\t\t// todo: why 'label1' class name\n\t\t\tnew Label({\n\t\t\t\tcls: 'label1' + (props.label ? '' : ' @hidden'),\t\n\t\t\t\ttext: props.label,\n\t\t\t\twidth,\n\t\t\t\tflex,\n\t\t\t\talign: props.labelAlign\n\t\t\t}),\n\t\t\tnew HLayout({\n\t\t\t\tflex: 1,\n\t\t\t\tcontent: [\n\t\t\t\t\tthis.m_ui_input,\n\t\t\t\t\tthis.m_ui_button = new Button({\n\t\t\t\t\t\tcls: 'gadget',\n\t\t\t\t\t\ticon: 'var( --x4-icon-angle-down )',\n\t\t\t\t\t\ttabIndex: false,\n\t\t\t\t\t\tclick: () => {\n\t\t\t\t\t\t\tthis.showPopup( false )\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdom_events: {\n\t\t\t\t\t\t\tfocus: () => { \n\t\t\t\t\t\t\t\tthis.clearError();\n\t\t\t\t\t\t\t\tthis.dom.focus(); \n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t]\n\t\t\t}),\n\t\t]);\n\n\t\tif (props.value !== undefined) {\n\t\t\tthis.value = props.value;\n\t\t}\n\t}\n\n\tcomponentDisposed( ) {\n\t\tif( this.m_popup ) {\n\t\t\tthis.m_popup.close( );\n\t\t}\n\n\t\tsuper.componentDisposed( );\n\t}\n\n\t/** \n\t * display the popup \n\t */\n\n\tshowPopup( filter_items: boolean = true ) {\n\n\t\tlet props = this.m_props;\n\t\tif (props.readOnly || this.hasClass(\"@disable\") ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tlet items = props.items;\n\t\tif( isFunction( items ) ) {\n\t\t\tconst filter = filter_items ? (this.m_ui_input as Input).value : null;\n\t\t\titems = items( filter );\n\t\t}\n\t\t\n\t\tif( items.length==0 ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// need creation ?\n\t\t\n\t\tif( !this.m_popup ) {\n\t\t\tlet cstyle = this.getComputedStyle( );\n\t\t\tlet fontFamily = cstyle.value( 'fontFamily' );\n\t\t\tlet fontSize = cstyle.value( 'fontSize' );\n\n\t\t\t// prepare the combo listview\n\t\t\tthis.m_popup = new PopupListView({\n\t\t\t\tcls: '@combo-popup',\n\t\t\t\tpopulate: props.populate,\n\t\t\t\trenderItem: this.m_props.renderer,\n\t\t\t\tselectionChange: (e) => {\n\n\t\t\t\t\tthis._selectItem(e);\n\t\t\t\t\t\n\t\t\t\t\tif (!this.m_lockpop) {\n this._hidePopup();\n this.focus();\n }\n\t\t\t\t},\n\t\t\t\tcancel: ( e ) => this.signal( 'cancel', e ),\n\t\t\t\tstyle: {\n\t\t\t\t\tfontFamily,\n\t\t\t\t\tfontSize\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.m_popup.items = items;\n\t\n\t\tlet r1 = this.m_ui_button.getBoundingRect(),\n\t\t\tr2 = this.m_ui_input.getBoundingRect();\n\n\t\tthis.m_popup.setStyle({\n\t\t\tminWidth: r1.right - r2.left,\n\t\t});\n\n\t\tthis.m_popup.displayAt(r2.left, r2.bottom);\n\t\tthis.m_popvis = true;\n\t\tthis.startTimer(\"focus-check\", 100, true, () => this._checkFocus());\n\n\t\tif( this.value!==undefined ) {\n\t\t\tthis.m_popup.selection = this.value;\n\t\t}\n\n\t\treturn items;\n\t}\n\n\t/**\n\t * \n\t */\n\n\tvalidate( ) {\n\t\tif( this.m_props.required && !this.m_selection ) {\n\t\t\tthis.showError(_tr.global.required_field);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic showError(text: string) {\n\t\tthis.m_ui_input.showError( text );\n\t}\n\n\tpublic clearError() {\n\t\tthis.m_ui_input.clearError( );\n\t}\n\n\t/** @ignore\n\t */\n\n\tprivate _selectItem( ev: EvSelectionChange ) {\n\n\t\tlet item: ListViewItem = ev.selection as ListViewItem;\n\t\tif( !item ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.m_lockchg = true;\n\t\tthis._setInput( item, true );\n\t\tthis.m_lockchg = false;\n\t\t\t\t\t\n\t\tthis.m_selection = {\n\t\t\tid: \titem.id,\n\t\t\ttext: \titem.text\n\t\t};\n\n\t\tthis.emit( 'selectionChange', EvSelectionChange( item ) );\n\t\tthis.emit( 'change', EvChange(item.id) );\n\t\t//this.m_ui_input.focus( );\n\t\t//this.m_popup.hide( );\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _setInput( item, fireEv = false ) {\n\n\t\tif( item ) {\n\t\t\tif( this.m_ui_input ) {\n\t\t\t\tif( this.m_ui_input instanceof Input ) {\n\t\t\t\t\tthis.m_ui_input.value = item.text;\n\t\t\t\t\t// fires a change event\n\t\t\t\t\tif( fireEv ) {\n\t\t\t\t\t\tthis.m_ui_input.dom.dispatchEvent( new Event('input') );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.m_ui_input.setContent( this.m_props.renderer( item ) );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.m_props.value = item.id;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif( this.m_ui_input && this.m_ui_input instanceof Input ) {\n\t\t\t\tthis.m_ui_input.value = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic get value() {\n\t\treturn this.m_selection ? this.m_selection.id : undefined;\n\t}\n\n\tpublic get valueText( ) {\n\t\tif( this.m_selection ) {\n\t\t\treturn this.m_selection.text;\n\t\t}\n\n\t\tif( this.m_props.editable ) {\n\t\t\treturn (this.m_ui_input as Input).value;\n\t\t}\n\n\t\treturn '';\n\t}\n\n\t/**\n\t * \n\t */\n\t\n\tpublic set value(id) {\n\t\tlet items = this.m_props.items;\n\n\t\tif( isFunction(items) ) {\n\t\t\titems = items( null );\n\t\t}\n\t\t\n\t\tconst found = items.some( (v) => {\n\t\t\tif (v.id === id) {\n\t\t\t\tthis._setInput( v );\n\t\t\t\tthis.m_selection = v;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t});\n\n\t\tif( !found ) {\n\t\t\tthis._setInput( null );\n\t\t\tthis.m_selection = null;\n\t\t}\n\t}\n\n\tget input( ) : Input {\n\t\treturn this.m_ui_input instanceof Input ? this.m_ui_input : null;\n\t}\n\n\t_checkFocus() {\n const focus = document.activeElement;\n if (this.dom && this.dom.contains(focus) || focus==document.body ) {\n return;\n }\n\n if (this.m_popup && this.m_popup.dom && this.m_popup.dom.contains(focus)) {\n return;\n }\n\n this._hidePopup();\n }\n\n\t_hidePopup() {\n if (this.m_popvis) {\n this.m_popup.close();\n this.m_popvis = false;\n\t\t\tthis.stopTimer(\"focus-check\");\n }\n }\n\t\n\tstatic storeProxy( props: ComboStoreProxyProps ): PopulateItems { \n\n\t\tlet view: DataView = props.store instanceof DataStore ? props.store.createView() : props.store;\n\t\t\n\t\treturn ( ) => {\n\t\t\tlet result: ListViewItem[] = new Array( props.store.count );\n\t\t\t\n\t\t\tprops.store.forEach( ( rec, index ) => {\n\t\t\t\tresult[index] = {\n\t\t\t\t\tid: rec.getID( ),\n\t\t\t\t\ttext: props.display( rec )\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn result;\n\t\t};\n\t} \n\n\tfocus( ) {\n\t\tif( this.m_props.editable ) {\n\t\t\tthis.m_ui_input.focus( );\n\t\t}\n\t\telse {\n\t\t\tsuper.focus( );\n\t\t}\n\t}\n}\n\n", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file form.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Component, Container, CProps, ContainerEventMap, ComponentContent, flyWrap, EventHandler } from './component'\nimport { HLayout, VLayout } from './layout'\nimport { Button } from './button'\nimport { Input } from './input'\nimport { TextEdit } from './textedit'\nimport { ajaxRequest, RequestProps } from './request'\nimport { BasicEvent } from './x4events'\nimport { EvBtnClick } from './dialog'\nimport { ComboBox } from './combobox'\n\nimport { _tr } from './i18n'\n\n\nexport interface EvDirty extends BasicEvent {\n\tdirty: boolean;\n}\n\n// ============================================================================\n// [FORM]\n// ============================================================================\n\nexport type FormBtn = 'ok' | 'cancel' | 'ignore' | 'yes' | 'no' | 'close' | 'save' | 'dontsave';\nexport type FormButtons = (FormBtn | Button | Component)[];\n\nexport interface FormEventMap extends ContainerEventMap {\n\tbtnClick?: EvBtnClick;\n\tdirty?: EvDirty;\n}\n\nexport interface FormProps extends CProps<FormEventMap> {\n\tdisableSuggestions?: boolean;\n\tbuttons?: FormButtons;\n\tbtnClick?: EventHandler<EvBtnClick>;\t// shortcut for events: { btnClick: ... }\n\tdirty?: EventHandler<EvDirty>;\n}\n\n/**\n * \n */\n\nexport class Form<T extends FormProps = FormProps, E extends FormEventMap = FormEventMap> extends VLayout<T, E>\n{\n\tprotected m_height: string | number;\n\tprotected m_container: Container;\n\tprotected m_buttons: HLayout;\n\tprotected m_dirty: boolean;\n\tprotected m_watchChanges: boolean;\n\n\tconstructor(props: T) {\n\n\t\tlet content = props.content;\n\t\tprops.content = null;\n\n\t\t// save height, because real form height is 'height' PLUS button bar height\n\t\tlet height = props.height;\n\t\tprops.height = undefined;\n\n\t\tsuper(props);\n\n\t\tthis.setTag( props.disableSuggestions ? 'section' : 'form');\n\t\tthis.mapPropEvents(props, 'btnClick', 'dirty');\n\t\tthis.updateContent(content, props.buttons, height);\n\n\t\tthis.m_dirty = false;\n\t\tthis.m_watchChanges = false;\n\t}\n\n\t/**\n\t * returns the container object\n\t */\n\n\tget container(): Container {\n\t\treturn this.m_container;\n\t}\n\n\t/**\n\t * \n\t */\n\n\toverride componentCreated(): void {\n\t\tsuper.componentCreated()\n\t\tif (this.m_watchChanges) {\n\t\t\tthis.watchChanges();\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic updateContent(items: ComponentContent, buttons: FormButtons, height: string | number = 0) {\n\n\t\tif (height) {\n\t\t\t// keep height for next time\n\t\t\tthis.m_height = height;\n\t\t}\n\n\t\tthis._makeButtons(buttons);\n\n\t\tlet content = [\n\t\t\tthis.m_container = new VLayout({\n\t\t\t\tcls: 'container',\n\t\t\t\theight: this.m_height,\n\t\t\t\tcontent: items\n\t\t\t}),\n\t\t\tthis.m_buttons,\n\t\t];\n\n\t\tsuper.setContent(content);\n\t}\n\n\t/**\n\t * \n\t * @param els \n\t * @param refreshAll \n\t */\n\n\tsetContent(els: ComponentContent, refreshAll = true) {\n\t\tthis.m_container.setContent(els, refreshAll);\n\t}\n\n\t/**\n\t * \n\t * @param buttons \n\t */\n\tsetButtons(buttons: FormButtons) {\n\t\tthis._makeButtons(buttons);\n\t}\n\n\t/**\n\t * enable a button by it's name\n\t */\n\n\tenableButton(name: string, enable = true) {\n\t\tlet button = this.getButton(name);\n\t\tif (button) {\n\t\t\tbutton.enable(enable);\n\t\t}\n\t}\n\n\t/**\n\t * return a button by it's name\n\t * @param name \n\t */\n\n\tgetButton(name: string) {\n\t\tlet button = this.m_buttons?.itemWithRef<Button>('@' + name);\n\t\treturn button;\n\t}\n\n\n\t/**\n\t * \n\t */\n\n\tprivate _makeButtons(buttons?: FormButtons): void {\n\n\t\tif (!this.m_buttons) {\n\t\t\tthis.m_buttons = new HLayout({\n\t\t\t\tcls: 'footer',\n\t\t\t\tref: 'buttons',\n\t\t\t});\n\t\t}\n\n\t\tlet btns: Component[] = [];\n\n\t\tif (buttons) {\n\t\t\tfor (let b of buttons) {\n\t\t\t\tif (b instanceof Component) {\n\t\t\t\t\tbtns.push(b);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tswitch (b) {\n\t\t\t\t\t\tcase 'ok': { btns.push(new Button({ ref: '@' + b, text: _tr.global.ok, click: () => { this._click(<FormBtn>b); } })); break; }\n\t\t\t\t\t\tcase 'cancel': { btns.push(new Button({ ref: '@' + b, text: _tr.global.cancel, click: () => { this._click(<FormBtn>b); } })); break; }\n\t\t\t\t\t\tcase 'ignore': { btns.push(new Button({ ref: '@' + b, text: _tr.global.ignore, click: () => { this._click(<FormBtn>b); } })); break; }\n\t\t\t\t\t\tcase 'yes': { btns.push(new Button({ ref: '@' + b, text: _tr.global.yes, click: () => { this._click(<FormBtn>b); } })); break; }\n\t\t\t\t\t\tcase 'no': { btns.push(new Button({ ref: '@' + b, text: _tr.global.no, click: () => { this._click(<FormBtn>b); } })); break; }\n\t\t\t\t\t\tcase 'close': { btns.push(new Button({ ref: '@' + b, text: _tr.global.close, click: () => { this._click(<FormBtn>b); } })); break; }\n\t\t\t\t\t\tcase 'save': { btns.push(new Button({ ref: '@' + b, text: _tr.global.save, click: () => { this._click(<FormBtn>b); } })); break; }\n\t\t\t\t\t\tcase 'dontsave': { btns.push(new Button({ ref: '@' + b, text: _tr.global.dontsave, click: () => { this._click(<FormBtn>b); } })); break; }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (btns.length == 1) {\n\t\t\tbtns[0].setAttribute('autofocus', true);\n\t\t}\n\n\t\tthis.m_buttons.setContent(btns);\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic validate() {\n\t\tlet inputs = this.queryAll('input'),\n\t\t\tresult = true;\n\n\t\tfor (let i = 0; i < inputs.length; i++) {\n\t\t\tconst input = Component.getElement(inputs[i], TextEdit);\n\t\t\tif (input && !input.validate()) {\n\t\t\t\tresult = false;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst combo = Component.getElement(inputs[i], ComboBox);\n\t\t\t\tif( combo && !combo.validate() ) {\n\t\t\t\t\tresult = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _click(btn: FormBtn) {\n\t\tthis.emit('btnClick', EvBtnClick(btn));\n\t}\n\n\t/**\n\t * replacement for HTMLFormElement.elements\n\t * as chrome shows suggestions on form elements even if we ask him (not to do that)\n\t * we removed <form> element.\n\t * so we have to get children by hand\n\t */\n\n\tprivate _getElements() {\n\t\tconsole.assert(!!this.dom);\n\t\tconst els = this.queryAll('[name]');\n\t\treturn els;\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic setValues(values: any) {\n\n\t\tlet elements = this._getElements();\n\t\tfor (let e = 0; e < elements.length; e++) {\n\n\t\t\tlet input = <HTMLInputElement>elements[e];\n\n\t\t\tlet item = Component.getElement(input);\n\t\t\tif (!item.hasAttribute(\"name\")) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet name = item.getAttribute('name'),\n\t\t\t\ttype = item.getAttribute('type');\n\n\t\t\tif (values[name] !== undefined) {\n\t\t\t\t(<Input>item).setStoreValue(values[name]);\n\t\t\t}\n\t\t}\n\n\t\tthis.setDirty(false);\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic clearValues() {\n\n\t\tlet elements = this._getElements();\n\t\tfor (let e = 0; e < elements.length; e++) {\n\n\t\t\tlet input = <HTMLInputElement>elements[e];\n\n\t\t\tlet item = Component.getElement(input);\n\t\t\tif (!item.hasAttribute(\"name\")) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t(<Input>item).setStoreValue( null );\n\t\t}\n\n\t\tthis.setDirty(false);\n\t}\n\n\n\t/**\n\t * values are not escaped\n\t * checkbox set true when checked\n\t * radio set value when checked\n\t */\n\n\tpublic getValues(): any {\n\t\tlet elements = this._getElements();\n\t\tlet result = {};\n\n\t\tfor (let e = 0; e < elements.length; e++) {\n\n\t\t\tlet el = <HTMLElement>elements[e];\n\t\t\tlet item = <Input>Component.getElement(el);\n\t\t\tif (!item.hasAttribute(\"name\")) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet name = item.getAttribute('name'),\n\t\t\t\tvalue = item.getStoreValue();\n\n\t\t\tif (value !== undefined) {\n\t\t\t\tresult[name] = value;\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * send the query to the desired handler\n\t */\n\n\tpublic submit(cfg: RequestProps, cbvalidation: Function) {\n\n\t\tif (!this.validate()) {\n\t\t\treturn false;\n\t\t}\n\n\t\tlet values = this.getValues();\n\t\tif (cbvalidation) {\n\t\t\tif (!cbvalidation(values)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tlet form = new FormData();\n\t\tfor (let n in values) {\n\t\t\tif (values.hasOwnProperty(n)) {\n\t\t\t\tform.append(n, values[n] === undefined ? '' : values[n]);\n\t\t\t}\n\t\t}\n\n\t\tcfg.params = form;\n\t\treturn ajaxRequest(cfg);\n\t}\n\n\t/**\n\t * to be abble to see the dirty flag, you need to call this method\n\t * cf. isDirty, setDirty\n\t */\n\n\twatchChanges() {\n\t\tif (this.dom) {\n\t\t\tconst els = this.queryAll('input[name], textarea[name]');\n\t\t\tels.forEach(el => {\n\t\t\t\tflyWrap<Input>(el).setDomEvent('input', () => {\n\t\t\t\t\tthis.setDirty();\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tthis.m_watchChanges = false;\n\t\t}\n\t\telse {\n\t\t\tthis.m_watchChanges = true;\n\t\t}\n\t}\n\n\t/**\n\t * cf. watchChanges\n\t */\n\n\tsetDirty(set = true) {\n\t\tthis.m_dirty = set;\n\t\tthis.emit( 'dirty', { dirty: set } );\n\t}\n\n\t/**\n\t * cf. watchChanges\n\t */\n\n\tisDirty() {\n\t\treturn this.m_dirty;\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file dialog.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\n\nimport { Popup, PopupProps, PopupEventMap, EvMove } from './popup'\nimport { Icon, IconID } from './icon'\nimport { HLayout } from './layout'\nimport { Label } from './label'\nimport { Form, FormButtons } from './form'\nimport { Component, ComponentContent, EvSize, flyWrap } from './component'\nimport { BasicEvent, EventCallback } from './x4events'\nimport { Rect, getMousePos, isFunction, isTouchDevice, isString, Size } from './tools'\n\ninterface Geometry {\n\tleft: number;\n\ttop: number;\n\twidth: number;\n\theight: number;\n\tminimized: boolean;\n\tmaximized: boolean;\n}\n\n// ============================================================================\n// [DIALOG]\n// ============================================================================\n\n\nexport interface EvClose extends BasicEvent {\n}\n\nexport interface EvBtnClick extends BasicEvent {\n\tbutton: string;\n}\n\nexport function EvBtnClick(button: string) {\n\treturn BasicEvent<EvBtnClick>({ button });\n}\n\n\nexport interface DialogBoxEventMap extends PopupEventMap {\n\tclose: EvClose;\n\tbtnClick: EvBtnClick;\n}\n\nexport type InitFormCallback = () => Form;\n\nexport interface DialogProps<E extends DialogBoxEventMap = DialogBoxEventMap> extends PopupProps<E> {\n\ttitle?: string;\n\ticon?: IconID;\n\tbuttons?: FormButtons;\n\t\n\tbtnClick?: EventCallback<EvBtnClick>;\n\n\tclosable?: boolean;\n\tmovable?: boolean;\n\tmaximized?: boolean;\n\tmaximizable?: boolean;\n\tminimizable?: boolean;\n\tautoClose?: boolean;\t// if true, close the dialog when a button is clicked\n\n\twidth?: number;\t\t\t// when you specify a width here, this is the minimal FORM content width\n\theight?: number;\t\t// when you specify a width here, this is the minimal FORM content heigt\n\tdlgWidth?: number;\t\t// this is the prefered initial dialog width in percent of screen\n\tdlgHeight?: number;\t\t// this is the prefered initial dialog height in percent of screen\n\n\tform?: Form | InitFormCallback;\n\tdisableSuggestions?: boolean;\n}\n\n/**\n * Standard dialog class\n */\n\nexport class Dialog<P extends DialogProps = DialogProps, E extends DialogBoxEventMap = DialogBoxEventMap> extends Popup<P, E>\n{\n\tprotected m_icon: IconID;\n\tprotected m_title: string;\n\tprotected m_form: Form;\n\tprotected m_buttons: FormButtons;\n\tprotected m_closable: boolean;\n\tprotected m_movable: boolean;\n\tprotected m_maximized: boolean;\n\tprotected m_minimized: boolean;\n\tprotected m_maximizable: boolean;\n\tprotected m_minimizable: boolean;\n\n\tprotected m_minFormSize: Size;\n\n\tprotected m_rc_max: Rect;\n\tprotected m_rc_min: Rect;\n\n\tprotected m_el_title: Component;\n\tprotected m_last_down: number;\n\tprotected m_auto_close: boolean;\n\n\tprotected m_ui_title: Label;\n\tprotected m_form_cb: InitFormCallback;\n\n\tconstructor(props: P) {\n\n\t\tlet content = props.content;\n\t\tprops.content = null;\n\n\t\tlet width = props.width;\n\t\tlet height = props.height;\n\n\t\tprops.width = undefined;\n\t\tprops.height = undefined;\n\n\t\tsuper(props);\n\n\t\tthis.m_minFormSize = { width, height };\n\n\t\tthis.enableMask(true);\n\n\t\tif (props.form) {\n\t\t\tif (!isFunction(props.form)) {\n\t\t\t\tthis.m_form = props.form;\n\t\t\t\tthis.m_form.on('btnClick', (e) => this._handleClick(e));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.m_form_cb = props.form;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tthis.m_form = new Form({\n\t\t\t\tcontent,\n\t\t\t\tbuttons: props.buttons,\n\t\t\t\tdisableSuggestions: props.disableSuggestions,\n\t\t\t\tbtnClick: (e) => this._handleClick(e)\n\t\t\t});\n\t\t}\n\n\t\tthis.m_movable = props.movable;\n\t\tthis.m_auto_close = props.autoClose ?? true;\n\n\t\tthis.m_icon = props.icon;\n\t\tthis.m_title = props.title;\n\t\tthis.m_buttons = props.buttons ?? null;\n\t\tthis.m_closable = props.closable ?? false;\n\t\tthis.m_last_down = 0;\n\n\t\tthis.on('size', (ev: EvSize) => {\n\t\t\tthis.addClass('@resized');\n\t\t\tthis.m_form.setStyleValue('width', null);\n\t\t\tthis.m_form.setStyleValue('height', null);\n\t\t});\n\n\t\tthis.m_maximized = false;\n\t\tthis.m_minimized = false;\n\t\tthis.m_maximizable = false;\n\t\tthis.m_minimizable = false;\n\n\t\tif (props.maximizable !== undefined) {\n\t\t\tthis.m_maximizable = props.maximizable;\n\t\t}\n\n\t\tif (props.minimizable !== undefined) {\n\t\t\tthis.m_minimizable = props.minimizable;\n\t\t}\n\n\t\tif (props.maximized == true) {\n\t\t\tthis.m_maximizable = true;\n\t\t}\n\n\t\tif( props.btnClick ) {\n\t\t\tthis.on( 'btnClick', props.btnClick );\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\t\n\tcomponentCreated() // override\n\t{\n\t\tsuper.componentCreated();\n\n\t\tif( this.m_minFormSize.width ) {\n\t\t\tthis.m_form.setStyle( {\n\t\t\t\tminWidth: this.m_minFormSize.width,\n\t\t\t\twidth: this.m_minFormSize.width \n\t\t\t} );\n\t\t}\n\n\t\tif( this.m_minFormSize.height ) {\n\t\t\tthis.m_form.setStyle( {\n\t\t\t\tminHeight: this.m_minFormSize.height,\n\t\t\t\theight: this.m_minFormSize.height \n\t\t\t});\n\t\t}\n\t\t\t\n\t\tconst rc = this.getBoundingRect( );\n\t\tthis.setStyleValue( 'min-width', rc.width );\n\t\tthis.setStyleValue( 'min-height', rc.height );\n\n\t\tthis.setStyleValue( 'width', rc.width );\n\t\tthis.setStyleValue( 'height', rc.height );\n\t\t\n\t\tif( this.m_props.dlgWidth ) {\n\t\t\tthis.setStyleValue( 'width', this.m_props.dlgWidth+'%' );\n\t\t}\n\n\t\tif( this.m_props.dlgHeight ) {\n\t\t\tthis.setStyleValue( 'height', this.m_props.dlgHeight+'%' );\n\t\t}\n\t\t\n\t\tthis.addClass('@resized');\n\n\t\tif( this.m_el_title ) {\n\t\t\tthis.m_el_title.setStyleValue( \"width\", \"auto\" );\n\t\t}\n\n\t\tif (this.m_props.maximized) {\n\t\t\tthis._maximize();\n\t\t\tthis.emit('size', EvSize(null));\n\t\t}\n\t\telse {\n\t\t\tthis.centerOnScreen( );\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _handleClick(ev: EvBtnClick) {\n\t\tthis.emit('btnClick', ev);\n\t\tif (!ev.defaultPrevented) {\n\t\t\tthis.close();\n\t\t}\n\t}\n\n\t/**\n\t * restore the geometry\n\t */\n\n\tsetGeometry(geom: Geometry) {\n\n\t\tif (geom.minimized && this.m_minimizable) {\n\t\t\tthis._minimize(false);\n\t\t\tthis.m_rc_min = new Rect(geom.left, geom.top, geom.width, geom.height);\n\t\t\tthis.displayAt(geom.left, geom.top, 'top-left');\n\t\t}\n\t\telse if (geom.maximized && this.m_maximizable) {\n\t\t\tthis._maximize(false);\n\t\t\tthis.m_rc_max = new Rect(geom.left, geom.top, geom.width, geom.height);\n\t\t}\n\t\telse {\n\t\t\tthis.setSize(geom.width, geom.height);\n\t\t\tthis.displayAt(geom.left, geom.top, 'top-left');\n\t\t}\n\t}\n\n\t/**\n\t * return the geometry (usefull to save state)\n\t */\n\n\tgetGeometry(): Geometry {\n\n\t\tif (this.m_minimized) {\n\t\t\treturn {\n\t\t\t\tleft: this.m_rc_min.left,\n\t\t\t\ttop: this.m_rc_min.top,\n\t\t\t\twidth: this.m_rc_min.width,\n\t\t\t\theight: this.m_rc_min.height,\n\t\t\t\tminimized: true,\n\t\t\t\tmaximized: false\n\t\t\t}\n\t\t}\n\t\telse if (this.m_maximized) {\n\t\t\treturn {\n\t\t\t\tleft: this.m_rc_max.left,\n\t\t\t\ttop: this.m_rc_max.top,\n\t\t\t\twidth: this.m_rc_max.width,\n\t\t\t\theight: this.m_rc_max.height,\n\t\t\t\tminimized: false,\n\t\t\t\tmaximized: true\n\t\t\t}\n\t\t}\n\n\t\tlet rc = this.getBoundingRect();\n\n\t\treturn {\n\t\t\tleft: rc.left,\n\t\t\ttop: rc.top,\n\t\t\twidth: rc.width,\n\t\t\theight: rc.height,\n\t\t\tminimized: false,\n\t\t\tmaximized: false\n\t\t};\n\t}\n\n\t/**\n\t * resize the dialog\n\t * @param width \n\t * @param height \n\t */\n\tsetSize(width: number, height: number) {\n\t\tthis.setStyle({ width, height });\n\t\tthis.emit('size', EvSize({ width, height }));\n\t}\n\n\t/** @ignore */\n\trender() {\n\n\t\tif (this.m_form_cb) {\n\t\t\tthis.m_form = this.m_form_cb();\n\t\t\tthis.m_form.on('btnClick', (e) => this._handleClick(e));\n\t\t\tthis.m_form_cb = null;\n\t\t}\n\n\t\tlet hasTitle = this.m_icon !== undefined || this.m_closable || this.m_title !== undefined || this.m_movable;\n\t\tthis.m_el_title = null;\n\n\t\tif (hasTitle) {\n\t\t\tthis.m_el_title = new HLayout({\n\t\t\t\tcls: 'title',\n\t\t\t\tcontent: [\n\t\t\t\t\tthis.m_icon ? new Icon({ icon: this.m_icon }) : null,\n\t\t\t\t\tthis.m_ui_title = new Label({ flex: 1, text: this.m_title }),\n\t\t\t\t\tthis.m_minimizable ? new Icon({ cls: 'min-btn', icon: 'var( --x4-icon-window-minimize )', dom_events: { click: () => this._toggleMin() } }) : null,\n\t\t\t\t\tthis.m_maximizable ? new Icon({ cls: 'max-btn', icon: 'var( --x4-icon-window-maximize )', dom_events: { click: () => this._toggleMax() } }) : null,\n\t\t\t\t\tthis.m_maximizable ? new Icon({ cls: 'res-btn', icon: 'var( --x4-icon-window-restore )', dom_events: { click: () => this._toggleMax() } }) : null,\n\t\t\t\t\tthis.m_closable ? new Icon({ cls: 'close-btn', icon: 'var( --x4-icon-rectangle-times )', dom_events: { click: () => this.close() } }) : null,\n\t\t\t\t]\n\t\t\t});\n\n\t\t\tif (this.m_movable) {\n\t\t\t\tif( isTouchDevice() ) {\n\t\t\t\t\tthis.m_el_title.setDomEvent('touchstart', (e) => this._mouseDown(e));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.m_el_title.setDomEvent('mousedown', (e) => this._mouseDown(e));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tsuper.setContent([\n\t\t\tthis.m_el_title,\n\t\t\tthis.m_form\n\t\t]);\n\t}\n\n\t/**\n\t * change the dialog content\n\t * @param els \n\t * @param refreshAll \n\t */\n\n\tsetContent( els: ComponentContent, refreshAll = true ) {\n\t\tthis.m_form.setContent( els, refreshAll );\n\t}\n\n\t/**\n\t * change the dialog buttons\n\t * @param buttons \n\t */\n\n\tsetButtons( buttons: FormButtons ) {\n\t\tthis.m_form.setButtons( buttons );\n\t}\n\n\t/**\n\t * return the dialog form\n\t */\n\n\tpublic get form(): Form {\n\t\treturn this.m_form;\n\t}\n\n\t/**\n\t * close the dialog\n\t */\n\n\tpublic close() {\n\t\tthis.emit( 'close', {} );\n\t\tsuper.close();\n\t}\n\n\t/**\n\t * \n\t */\n\tprivate _toggleMax() {\n\t\tif (!this.m_maximizable) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.m_maximized) {\n\t\t\tthis.removeClass('maximized');\n\t\t\tthis.setStyle({\n\t\t\t\tleft: this.m_rc_max.left,\n\t\t\t\ttop: this.m_rc_max.top,\n\t\t\t\twidth: this.m_rc_max.width,\n\t\t\t\theight: this.m_rc_max.height,\n\t\t\t});\n\t\t\tthis.m_maximized = false;\n\t\t\tthis.emit( 'size', EvSize(null, 'restore'));\n\t\t}\n\t\telse {\n\t\t\tthis._maximize();\n\t\t\tthis.emit( 'size', EvSize(null, 'maximize'));\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _toggleMin() {\n\t\tif (!this.m_minimizable) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.m_minimized) {\n\t\t\tthis.removeClass('minimized');\n\t\t\tthis.setStyle({\n\t\t\t\t//left: \tthis.m_rc_min.left,\n\t\t\t\t//top: \tthis.m_rc_min.top,\n\t\t\t\twidth: this.m_rc_min.width,\n\t\t\t\theight: this.m_rc_min.height,\n\t\t\t});\n\t\t\tthis.m_minimized = false;\n\t\t\tthis.emit('size', EvSize(null, 'restore'));\n\t\t}\n\t\telse {\n\t\t\tthis._minimize();\n\t\t\tthis.emit('size', EvSize(null, 'minimize'));\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _mouseDown(event: UIEvent) {\n\n\t\tlet { x, y } = getMousePos(event, true);\n\n\t\tlet wrc = flyWrap(x4document.body).getBoundingRect();\n\t\tlet rc = this.getBoundingRect(true);\n\t\t///let trc = this.m_el_title.getBoundingRect();\n\n\t\tlet dx = x - rc.left,\n\t\t\tdy = y - rc.top;\n\n\t\t//let cstyle = this.getComputedStyle();\n\t\t//let topw = cstyle.parse('marginTop') + cstyle.parse('paddingTop') + cstyle.parse('borderTopWidth');\n\t\t//let botw = cstyle.parse('marginBottom') + cstyle.parse('paddingBottom') + cstyle.parse('borderBottomWidth');\n\t\t//let lftw = cstyle.parse('marginLeft') + cstyle.parse('paddingLeft') + cstyle.parse('borderLeftWidth');\n\t\t//let rgtw = cstyle.parse('marginRight') + cstyle.parse('paddingRight') + cstyle.parse('borderRightWidth');\n\n\t\t//wrc.top += topw - trc.height;\n\t\t//wrc.height -= topw + botw - trc.height;\n\n\t\t//wrc.left += lftw;\n\t\t//wrc.width -= lftw + rgtw;\n\n\t\t// custom handling double click\n\t\tconst now = Date.now();\n\t\tconst delta = now - this.m_last_down;\n\t\t\n\t\tif ( this.m_maximizable && delta < 700) {\n\t\t\tthis._toggleMax();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.m_last_down = now;\n\t\tif (this.m_maximized) {\n\t\t\t// cannot move in max state\n\t\t\treturn;\n\t\t}\n\n\t\tlet __move = (ex, ey) => {\n\t\t\t\n\t\t\tif( ex>wrc.right ) {\n\t\t\t\tex = wrc.right;\n\t\t\t}\n\t\t\telse if( ex<wrc.left ) {\n\t\t\t\tex = wrc.left;\n\t\t\t}\n\n\t\t\tif( ey>wrc.bottom ) {\n\t\t\t\tey = wrc.bottom;\n\t\t\t}\n\t\t\telse if( ey<wrc.top ) {\n\t\t\t\tey = wrc.top;\n\t\t\t}\n\n\t\t\tlet x = ex - dx,\n\t\t\t\ty = ey - dy;\n\n\t\t\t//if (x + rc.width < wrc.left) {\n\t\t\t//\tx = wrc.left - rc.width;\n\t\t\t//}\n\t\t\t//else if (x > wrc.right) {\n\t\t\t//\tx = wrc.right;\n\t\t\t//}\n\t\t\t//\n\t\t\t//if (y < wrc.top) { // title grip is on top\n\t\t\t//\ty = wrc.top;\n\t\t\t//}\n\t\t\t//else if (y > wrc.bottom) {\n\t\t\t//\ty = wrc.bottom;\n\t\t\t//}\n\n\t\t\tthis.setStyle({\n\t\t\t\tleft: x,\n\t\t\t\ttop: y\n\t\t\t});\n\t\t}\n\n\t\tComponent.setCapture(this, (ev) => {\n\n\t\t\tif (ev.type == 'mousemove') {\n\t\t\t\tlet mev = ev as MouseEvent;\n\t\t\t\t__move(mev.clientX, mev.clientY);\n\t\t\t}\n\t\t\telse if (ev.type == 'touchmove') {\n\t\t\t\tlet tev = ev as TouchEvent;\n\n\t\t\t\tif (tev.touches.length == 1) {\n\t\t\t\t\t__move(tev.touches[0].clientX, tev.touches[0].clientY);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ev.type == 'mouseup' || ev.type == 'touchend') {\n\t\t\t\tComponent.releaseCapture();\n\t\t\t\tthis.emit( 'move', EvMove(null));\n\t\t\t}\n\t\t\telse if (ev.type == 'mousedown' || ev.type == 'touchstart') {\n\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * maximize the dialog\n\t */\n\n\tpublic maximize() {\n\t\tif (!this.m_maximizable || this.m_maximized) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._maximize();\n\t\tthis.emit('size', EvSize(null));\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _maximize(saveRect = true) {\n\n\t\tif (saveRect) {\n\t\t\tthis.m_rc_max = this.getBoundingRect(false);\n\t\t}\n\n\t\tthis.addClass('maximized');\n\t\tthis.m_maximized = true;\n\n\t\tthis.setStyle({\n\t\t\tleft: undefined,\n\t\t\ttop: undefined,\n\t\t\twidth: undefined,\n\t\t\theight: undefined,\n\t\t});\n\t}\n\n\t/**\n\t * minimize the dialog\n\t */\n\n\tpublic minimize() {\n\t\tif (!this.m_minimizable || this.m_minimized) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._minimize();\n\t\tthis.emit('size', EvSize(null));\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _minimize(saveRect = true) {\n\n\t\tif (saveRect) {\n\t\t\tthis.m_rc_min = this.getBoundingRect(false);\n\t\t}\n\n\t\tthis.addClass('minimized');\n\t\tthis.m_minimized = true;\n\n\t\tthis.setStyle({\n\t\t\t//left: undefined,\n\t\t\t//top: undefined,\n\t\t\twidth: undefined,\n\t\t\theight: undefined,\n\t\t});\n\n\n\t}\n\n\t/**\n\t * change the dialog title\n\t */\n\n\tset title(title: string) {\n\t\tthis.m_title = title;\n\t\tif (this.m_ui_title) {\n\t\t\tthis.m_ui_title.text = title;\n\t\t}\n\t}\n\n\titemWithName<T extends Component>( name: string ): T {\n\t\tlet result = <HTMLElement>this.dom.querySelector( `[name=\"${name}\"]` );\n\t\treturn result ? Component.getElement<T>(result) : null;\n\t}\n\n\tgetValues( ) {\n\t\treturn this.m_form.getValues( );\n\t}\n\n\tvalidate( ) {\n\t\treturn this.m_form.validate( );\n\t}\n}\n", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file colorpicker.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\n/**\n * ARGH this code is awfull\n */\n\n\nimport { Container, Component, ContainerProps, ContainerEventMap } from './component'\nimport { CheckBox } from './checkbox'\nimport { Dialog, DialogBoxEventMap, DialogProps } from './dialog'\nimport { EvChange, EventCallback } from './x4events'\nimport { VLayout, HLayout } from './layout'\nimport { Label } from './label'\nimport { Color } from './color'\nimport { isString, getMousePos, clamp, classNames } from './tools'\nimport { TextEdit } from './textedit'\nimport { Menu, MenuItem } from './menu'\n\ninterface ColorPickerEventMap extends ContainerEventMap {\n\tchange: EvChange;\n}\n\nexport interface ColorPickerProps extends ContainerProps<ColorPickerEventMap> {\n\tcolor: Color;\n\thasAlpha?: boolean;\n}\n\nconst pal_colors = {\n\tblue: [0x0e5a8a, 0x106ba3, 0x137cbd, 0x2b95d6, 0x48aff0,],\n\tgreen: [0x0a6640, 0x0d8050, 0x0f9960, 0x15b371, 0x3dcc91,],\n\torange: [0xa66321, 0xbf7326, 0xd9822b, 0xf29d49, 0xffb366,],\n\tred: [0xa82a2a, 0xc23030, 0xdb3737, 0xf55656, 0xff7373,],\n\tvermilion: [0x9e2b0e, 0xb83211, 0xd13913, 0xeb532d, 0xff6e4a,],\n\trose: [0xa82255, 0xc22762, 0xdb2c6f, 0xf5498b, 0xff66a1,],\n\tviolet: [0x5c255c, 0x752f75, 0x8f398f, 0xa854a8, 0xc274c2,],\n\tindigo: [0x5642a6, 0x634dbf, 0x7157d9, 0x9179f2, 0xad99ff,],\n\tcobalt: [0x1f4b99, 0x2458b3, 0x2965cc, 0x4580e6, 0x669eff,],\n\tturquoise: [0x008075, 0x00998c, 0x00b3a4, 0x14ccbd, 0x2ee6d6,],\n\tforest: [0x1d7324, 0x238c2c, 0x29a634, 0x43bf4d, 0x62d96b,],\n\tlime: [0x728c23, 0x87a629, 0x9bbf30, 0xb6d94c, 0xd1f26d,],\n\tgold: [0xa67908, 0xbf8c0a, 0xd99e0b, 0xf2b824, 0xffc940,],\n\tsepia: [0x63411e, 0x7d5125, 0x96622d, 0xb07b46, 0xc99765,],\n\tbw: [0x000000, 0x444444, 0x666666, 0xcccccc, 0xffffff,],\n};\n\n\n\nexport class ColorPicker extends Container<ColorPickerProps, ColorPickerEventMap> {\n\n\tprivate m_colorSel: Component;\n\tprivate m_colorHue: Component;\n\tprivate m_colorAlpha: Component;\n\tprivate m_sample: Component;\n\tprivate m_selMark: Component;\n\tprivate m_hueMark: Component;\n\tprivate m_alphaMark: Component;\n\n\tprivate m_baseHSV: { h: number, s: number, v: number, a: number };\n\tprivate m_baseColor: Color;\n\tprivate m_transpCk: CheckBox;\n\tprivate m_colorEdit: TextEdit;\n\n\tprivate m_palmode: boolean;\n\n\tstatic last_palmode = false;\n\n\tconstructor(props: ColorPickerProps) {\n\t\tsuper(props);\n\t\tthis.m_palmode = ColorPicker.last_palmode;\n\t\tthis.setDomEvent('contextmenu', (e) => this._showCtx(e));\n\t}\n\n\tprivate _showCtx(e: UIEvent) {\n\t\tconst menu = new Menu({\n\t\t\titems: [\n\t\t\t\tnew MenuItem({\n\t\t\t\t\ttext: 'Palette', checked: this.m_palmode, click: () => {\n\t\t\t\t\t\tthis.m_palmode = !this.m_palmode;\n\t\t\t\t\t\tColorPicker.last_palmode = this.m_palmode;\n\t\t\t\t\t\tthis.update();\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t]\n\t\t})\n\n\t\tlet pt = getMousePos(e, true);\n\t\tmenu.displayAt(pt.x, pt.y);\n\t}\n\n\trender(props: ColorPickerProps) {\n\n\t\tthis.m_baseColor = props.color;\n\t\tthis.m_baseHSV = Color.toHSV(this.m_baseColor);\n\n\t\tif (this.m_palmode) {\n\n\t\t\tthis.addClass(\"pal-mode\");\n\n\t\t\tlet selector = null;\n\t\t\tlet cur = null;\n\n\t\t\tlet main_sel = [];\n\t\t\tlet sub_sel = [];\n\n\t\t\tconst ccolor = this.m_baseColor.value();\n\n\t\t\tmaterialColors.forEach(mc => {\n\t\t\t\tconst color = mc.variations[4].hex;\n\t\t\t\t\n\t\t\t\tlet selected = color === ccolor;\n\t\t\t\tif( !selected ) {\n\t\t\t\t\tselected = mc.variations.some( c => {\n\t\t\t\t\t\tconst cc = new Color(c.hex).value();\n\t\t\t\t\t\tif( cc===ccolor ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tlet cls = classNames('clr-box xbox', { selected });\n\t\t\t\tlet el = new Component({ \n\t\t\t\t\tcls, \n\t\t\t\t\tstyle: { backgroundColor: new Color(color).toHex() }, \n\t\t\t\t\tdata: { color, main: mc.variations } \n\t\t\t\t});\n\n\t\t\t\tif( selected ) {\n\t\t\t\t\tfillSubs( mc.variations );\n\t\t\t\t}\n\n\t\t\t\tmain_sel.push(el);\n\t\t\t});\n\n\t\t\tfunction fillSubs( colors ) {\n\t\t\t\tsub_sel = [];\n\t\t\t\tcolors.forEach(mc => {\n\t\t\t\t\tlet clr = new Color(mc.hex);\n\t\t\t\t\tconst selected = clr.value() == ccolor;\n\n\t\t\t\t\tlet cls = classNames('hclr-box xbox', { selected });\n\t\t\t\t\t\n\t\t\t\t\tlet el = new Component({ \n\t\t\t\t\t\tcls, \n\t\t\t\t\t\tstyle: { backgroundColor: clr.toHex(), color: Color.contrastColor(clr).toHex() }, \n\t\t\t\t\t\tdata: { color: clr.value() } ,\n\t\t\t\t\t\tcontent: clr.toHex()\n\t\t\t\t\t});\n\n\t\t\t\t\tsub_sel.push(el);\n\n\t\t\t\t\tif( selected ) {\n\t\t\t\t\t\tcur = el;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif( selector ) {\n\t\t\t\t\tselector.itemWithId('vsel').setContent( sub_sel );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tselector = new VLayout({\n\t\t\t\tcontent: [\n\t\t\t\t\tnew HLayout({\n\t\t\t\t\t\tid: 'hsel',\n\t\t\t\t\t\tcontent: main_sel\n\t\t\t\t\t}),\n\t\t\t\t\tnew VLayout({\n\t\t\t\t\t\tid: 'vsel',\n\t\t\t\t\t\tflex: 1,\n\t\t\t\t\t\tcontent: sub_sel\n\t\t\t\t\t})\n\t\t\t\t]\n\t\t\t});\n\n\n\t\t\t/*\n\t\t\tlet cur = null;\n\t\t\tconst buildCol = ( colors: number[] ) => {\n\t\t\t\t\n\t\t\t\tconst ccolor = this.m_baseColor.value();\n\t\t\t\tconst els = colors.map( x => {\n\t\t\t\t\tconst selected = x==ccolor;\n\n\t\t\t\t\tlet cls = classNames( 'clr-box', { selected } );\n\t\t\t\t\tlet el = new Component( { cls, style: { backgroundColor: new Color(x).toHex() }, data: { color: x } } );\n\n\t\t\t\t\tif( selected ) {\n\t\t\t\t\t\tcur = el;\n\t\t\t\t\t}\n\t\t\t\t\treturn el;\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\treturn new VLayout( {\n\t\t\t\t\tcls: 'vcol',\n\t\t\t\t\tcontent: els\n\t\t\t\t});\n\t\t\t}\n\t\t\t\n\t\t\tlet rows = new HLayout( {\n\t\t\t\tcls: 'hcol',\n\t\t\t\tcontent: [\n\t\t\t\t\t\tbuildCol( pal_colors.blue ),\n\t\t\t\t\t\tbuildCol( pal_colors.green ),\n\t\t\t\t\t\tbuildCol( pal_colors.orange ),\n\t\t\t\t\t\tbuildCol( pal_colors.red ),\n\t\t\t\t\t\tbuildCol( pal_colors.vermilion ),\n\t\t\t\t\t\tbuildCol( pal_colors.rose ),\n\t\t\t\t\t\tbuildCol( pal_colors.violet ),\n\t\t\t\t\t\tbuildCol( pal_colors.indigo ),\n\t\t\t\t\t\tbuildCol( pal_colors.cobalt ),\n\t\t\t\t\t\tbuildCol( pal_colors.turquoise ),\n\t\t\t\t\t\tbuildCol( pal_colors.forest ),\n\t\t\t\t\t\tbuildCol( pal_colors.lime ),\n\t\t\t\t\t\tbuildCol( pal_colors.gold ),\n\t\t\t\t\t\tbuildCol( pal_colors.sepia ),\n\t\t\t\t\t\tbuildCol( pal_colors.bw ),\n\t\t\t\t]\n\t\t\t});\n\t\t\t*/\n\n\n\t\t\tthis.m_colorEdit = new TextEdit({\n\t\t\t\tcls: 'hexv',\n\t\t\t\tvalue: '',\n\t\t\t\tattrs: {\n\t\t\t\t\tspellcheck: false,\n\t\t\t\t},\n\t\t\t\tchange: (ev) => {\n\t\t\t\t\tconst clr = new Color(ev.value);\n\t\t\t\t\tif (clr) {\n\t\t\t\t\t\tthis.m_baseColor = clr;\n\t\t\t\t\t\tthis.m_baseHSV = Color.toHSV(clr);\n\t\t\t\t\t\tthis._updateColor(false);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.m_transpCk = new CheckBox({\n\t\t\t\tcls: 'transp',\n\t\t\t\ttext: 'transparent',\n\t\t\t\tchange: (ev) => {\n\t\t\t\t\tthis.m_baseHSV.a = ev.value ? 0 : 1;\n\t\t\t\t\tthis._updateColor();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.setContent([selector, this.m_transpCk, this.m_colorEdit]);\n\n\t\t\t// globally handle click\n\n\t\t\tselector.setDomEvent('click', (ev) => {\n\n\t\t\t\tif (cur) {\n\t\t\t\t\tcur.removeClass('selected');\n\t\t\t\t\tcur = null;\n\t\t\t\t}\n\n\t\t\t\tlet cell = Component.getElement(ev.target as HTMLElement, 'xbox');\n\t\t\t\tif (cell) {\n\t\t\t\t\tconst subs = cell.getData('main');\n\t\t\t\t\tif( subs ) {\n\t\t\t\t\t\tfillSubs( subs );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tconst clr = new Color(cell.getData('color'));\n\t\t\t\t\t\tthis.m_baseColor = clr;\n\t\t\t\t\t\tthis.m_baseHSV = Color.toHSV(clr);\n\t\t\t\t\t\tthis._updateColor();\n\n\t\t\t\t\t\tcur = cell;\n\t\t\t\t\t\tcell.addClass('selected');\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tthis.removeClass(\"pal-mode\");\n\n\t\t\tthis.m_selMark = new Component({ cls: 'marker' });\n\t\t\tthis.m_colorSel = new Component({\n\t\t\t\tcls: 'sel',\n\t\t\t\tcontent: [\n\t\t\t\t\tnew Component({ cls: '@fit light' }),\n\t\t\t\t\tnew Component({ cls: '@fit dark' }),\n\t\t\t\t\tthis.m_selMark,\n\t\t\t\t]\n\t\t\t});\n\n\t\t\tthis.m_hueMark = new Component({ cls: 'marker' });\n\t\t\tthis.m_colorHue = new Component({\n\t\t\t\tcls: 'hue',\n\t\t\t\tcontent: [\n\t\t\t\t\tthis.m_hueMark\n\t\t\t\t]\n\t\t\t});\n\t\t\tthis.m_sample = new Component({ cls: 'sample' });\n\n\t\t\tif (props.hasAlpha) {\n\t\t\t\tthis.addClass('with-alpha');\n\t\t\t\tthis.m_alphaMark = new Component({ cls: 'marker' });\n\t\t\t\tthis.m_colorAlpha = new Component({\n\t\t\t\t\tcls: 'alpha',\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\tnew Component({ cls: 'bk @fit', ref: 'color' }),\n\t\t\t\t\t\tthis.m_alphaMark\n\t\t\t\t\t]\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.removeClass('with-alpha');\n\t\t\t\tthis.m_transpCk = new CheckBox({\n\t\t\t\t\tcls: 'transp',\n\t\t\t\t\ttext: 'transparent',\n\t\t\t\t\tchange: (ev) => {\n\t\t\t\t\t\tthis.m_baseHSV.a = ev.value ? 0 : 1;\n\t\t\t\t\t\tthis._updateColor();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.m_colorEdit = new TextEdit({\n\t\t\t\tcls: 'hexv',\n\t\t\t\tvalue: '',\n\t\t\t\tattrs: {\n\t\t\t\t\tspellcheck: false,\n\t\t\t\t},\n\t\t\t\tchange: (ev) => {\n\t\t\t\t\tconst clr = new Color(ev.value);\n\t\t\t\t\tif (clr) {\n\t\t\t\t\t\tthis.m_baseColor = clr;\n\t\t\t\t\t\tthis.m_baseHSV = Color.toHSV(clr);\n\t\t\t\t\t\tthis._updateColor(false);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.setContent([\n\t\t\t\tthis.m_colorSel,\n\t\t\t\tthis.m_colorHue,\n\t\t\t\tthis.m_colorAlpha,\n\t\t\t\tthis.m_transpCk,\n\t\t\t\tthis.m_colorEdit,\n\t\t\t\tthis.m_sample,\n\t\t\t]);\n\n\t\t\tthis.m_colorSel.setDomEvent('mousedown', (ev: MouseEvent) => {\n\t\t\t\tComponent.setCapture(this, (e) => this._selChange(e));\n\t\t\t});\n\n\t\t\tthis.m_colorHue.setDomEvent('mousedown', (ev: MouseEvent) => {\n\t\t\t\tComponent.setCapture(this, (e) => this._hueChange(e));\n\t\t\t});\n\n\t\t\tif (props.hasAlpha) {\n\t\t\t\tthis.m_colorAlpha.setDomEvent('mousedown', (ev: MouseEvent) => {\n\t\t\t\t\tComponent.setCapture(this, (e) => this._alphaChange(e));\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis._updateColor();\n\t\t}\n\t}\n\n\tset color(clr: Color) {\n\t\tthis.m_baseColor = clr;\n\t\tthis.m_baseHSV = Color.toHSV(this.m_baseColor);\n\n\t\tthis._updateColor();\n\t}\n\n\tget color() {\n\t\treturn this.m_baseColor;\n\t}\n\n\tprivate _selChange(ev: UIEvent) {\n\t\tlet pt = getMousePos(ev, true);\n\t\tconsole.log(pt);\n\t\tlet rc = this.m_colorSel.getBoundingRect();\n\n\t\tif (!this.m_props.hasAlpha) {\n\t\t\tthis.m_baseHSV.a = 1;\n\t\t}\n\n\t\tthis.m_baseHSV.s = clamp((pt.x - rc.left) / rc.width, 0, 1);\n\t\tthis.m_baseHSV.v = 1 - clamp((pt.y - rc.top) / rc.height, 0, 1);\n\t\tthis._updateColor();\n\n\t\tif (ev.type == 'mouseup' || ev.type == 'touchend') {\n\t\t\tComponent.releaseCapture();\n\t\t}\n\t}\n\n\tprivate _hueChange(ev: UIEvent) {\n\t\tlet pt = getMousePos(ev, true);\n\t\tlet rc = this.m_colorHue.getBoundingRect();\n\n\t\tthis.m_baseHSV.h = clamp((pt.y - rc.top) / rc.height, 0, 1);\n\t\tthis._updateColor();\n\n\t\tif (ev.type == 'mouseup' || ev.type == 'touchend') {\n\t\t\tComponent.releaseCapture();\n\t\t}\n\t}\n\n\tprivate _alphaChange(ev: UIEvent) {\n\t\tlet pt = getMousePos(ev, true);\n\t\tlet rc = this.m_colorAlpha.getBoundingRect();\n\n\t\tthis.m_baseHSV.a = clamp((pt.x - rc.left) / rc.width, 0, 1);\n\t\tthis._updateColor();\n\n\t\tif (ev.type == 'mouseup' || ev.type == 'touchend') {\n\t\t\tComponent.releaseCapture();\n\t\t}\n\t}\n\n\tprivate _updateColor(edit = true) {\n\n\t\tlet color: Color;\n\n\t\tif (!this.m_palmode) {\n\n\t\t\tcolor = Color.fromHSV(this.m_baseHSV.h, 1, 1, 1);\n\t\t\tthis.m_colorSel.setStyleValue('backgroundColor', color.toString());\n\n\t\t\tcolor = Color.fromHSV(this.m_baseHSV.h, this.m_baseHSV.s, this.m_baseHSV.v, 1);\n\t\t\tthis.m_sample.setStyleValue('backgroundColor', color.toString());\n\n\t\t\tif (this.m_props.hasAlpha) {\n\t\t\t\tlet gradient = `linear-gradient(to right, rgba(0,0,0,0) 0%, ${color.toString()} 100%)`;\n\t\t\t\tthis.m_colorAlpha.itemWithRef<Component>('color').setStyleValue('backgroundImage', gradient);\n\t\t\t}\n\n\t\t\tthis.m_selMark.setStyle({\n\t\t\t\tleft: (this.m_baseHSV.s * 100) + '%',\n\t\t\t\ttop: (100 - this.m_baseHSV.v * 100) + '%',\n\t\t\t});\n\n\t\t\tthis.m_hueMark.setStyle({\n\t\t\t\ttop: (this.m_baseHSV.h * 100) + '%',\n\t\t\t});\n\n\t\t\tif (this.m_props.hasAlpha) {\n\t\t\t\tthis.m_alphaMark.setStyle({\n\t\t\t\t\tleft: (this.m_baseHSV.a * 100) + '%',\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.m_transpCk.check = this.m_baseHSV.a == 0;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tthis.m_transpCk.check = this.m_baseHSV.a == 0;\n\t\t}\n\n\t\tcolor = Color.fromHSV(this.m_baseHSV.h, this.m_baseHSV.s, this.m_baseHSV.v, this.m_baseHSV.a);\n\t\tthis.m_baseColor = color;\n\n\t\tif (edit) {\n\t\t\tthis.m_colorEdit.value = color.alpha() == 1 ? color.toHex() : color.toString()\t//color.toHex();\n\t\t}\n\n\t\tthis._change();\n\t}\n\n\tprivate _change() {\n\t\tthis.emit('change', EvChange(this.m_baseColor));\n\t}\n}\n\n// :: color dialog ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\ninterface ColorPickerBoxEventMap extends DialogBoxEventMap {\n\tchange: EvChange;\n}\n\nexport interface ColorPickerBoxProps extends DialogProps<ColorPickerBoxEventMap> {\n\tcolor: Color;\n\thasAlpha?: boolean;\n\tcust_colors?: Color[];\n\n\tchange?: EventCallback<EvChange>;\t// shortcut to { event: change: ... }\n}\n\n\nexport class ColorPickerBox extends Dialog<ColorPickerBoxProps, ColorPickerBoxEventMap>\n{\n\tprivate m_picker: ColorPicker;\n\n\tconstructor(props: ColorPickerBoxProps) {\n\n\t\tprops.icon = undefined;\n\t\tprops.buttons = undefined;\n\n\t\tsuper(props);\n\n\t\tthis.mapPropEvents(props, 'change');\n\n\t\tthis.m_picker = new ColorPicker({\n\t\t\tcolor: props.color,\n\t\t\thasAlpha: props.hasAlpha,\n\t\t\tstyle: { padding: 8 },\n\t\t\twidth: 250,\n\t\t\theight: 250,\n\t\t});\n\n\t\tlet customs = this._makeCustoms(props.cust_colors);\n\n\t\tthis.form.updateContent([\n\t\t\tnew VLayout({\n\t\t\t\tcontent: [\n\t\t\t\t\tthis.m_picker,\n\t\t\t\t\tcustoms\n\t\t\t\t]\n\t\t\t})\n\t\t], ['ok', 'cancel']);\n\n\t\tthis.on('btnClick', (ev) => {\n\t\t\tif (ev.button == 'ok') {\n\t\t\t\tthis.emit('change', EvChange(this.m_picker.color));\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate _makeCustoms(cc) {\n\n\t\tlet custom = null;\n\n\t\tif (cc && cc.length > 0) {\n\n\t\t\tlet els = [];\n\n\t\t\tfor (let i = 0; i < cc.length; i += 8) {\n\n\t\t\t\tlet lne = [];\n\n\t\t\t\tfor (let j = 0; j < 8; j++) {\n\n\t\t\t\t\tlet idx = i + j,\n\t\t\t\t\t\tclr = cc[idx];\n\n\t\t\t\t\tlne.push(new Label({\n\t\t\t\t\t\tcls: 'cust-cc',\n\t\t\t\t\t\ttext: '',\n\t\t\t\t\t\tflex: 1,\n\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\tbackgroundColor: clr ? clr.toString() : 'transparent'\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttooltip: clr ? clr.toString() : undefined,\n\t\t\t\t\t\tdom_events: {\n\t\t\t\t\t\t\tclick: () => {\n\t\t\t\t\t\t\t\tif (clr) {\n\t\t\t\t\t\t\t\t\tthis.m_picker.color = clr;\n\t\t\t\t\t\t\t\t\tthis.emit('change', EvChange(clr));\n\t\t\t\t\t\t\t\t\tthis.close();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}));\n\t\t\t\t}\n\n\t\t\t\tels.push(new HLayout({ cls: 'line', content: lne }));\n\t\t\t}\n\n\t\t\tcustom = new VLayout({ cls: 'customs', content: els });\n\t\t}\n\n\t\treturn custom;\n\t}\n\n\tset color(clr: Color) {\n\t\tthis.m_picker.color = clr;\n\t}\n\n\tget color() {\n\t\treturn this.m_picker.color;\n\t}\n\n\t/**\n\t * display a messagebox\n\t */\n\n\tstatic show(props: string | ColorPickerBoxProps): ColorPickerBox {\n\n\t\tlet msg;\n\n\t\tif (isString(props)) {\n\t\t\tmsg = new ColorPickerBox({ color: new Color(props) });\n\t\t}\n\t\telse {\n\t\t\tmsg = new ColorPickerBox(props);\n\t\t}\n\n\t\tmsg.show();\n\t\treturn msg;\n\t}\n}\n\n// :: PickerEditor ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\nexport interface ColorPickerEditorProps extends ColorPickerProps {\n\tlabel?: string;\n\tlabelWidth?: number;\n\tcust_colors?: Color[];\n\tdisplayValue?: false,\n\tchange?: EventCallback<EvChange>;\n\tname?: string;\n}\n\nexport class ColorPickerEditor extends HLayout<ColorPickerEditorProps, ColorPickerEventMap> {\n\n\tconstructor(props: ColorPickerEditorProps) {\n\t\tsuper(props);\n\n\t\tthis.mapPropEvents(props, 'change');\n\t}\n\n\trender(props: ColorPickerEditorProps) {\n\n\t\tlet color = props.color;\n\t\tlet tcolor: string;\n\n\t\tif (this._isTransp(color)) {\n\t\t\tcolor = Color.NONE;\n\t\t\ttcolor = 'black';\n\t\t}\n\t\telse {\n\t\t\ttcolor = Color.contrastColor(color).toString();\n\t\t}\n\n\t\tthis.setContent([\n\t\t\tprops.label ? new Label({\n\t\t\t\tcls: 'label',\n\t\t\t\ttext: props.label,\n\t\t\t\tflex: props.labelWidth < 0 ? -props.labelWidth : undefined,\n\t\t\t\twidth: props.labelWidth >= 0 ? props.labelWidth : undefined,\n\t\t\t}) : null,\n\t\t\tnew Component( {\n\t\t\t\tflex: 1,\n\t\t\t\tcontent: [\n\t\t\t\t\tnew Label({\n\t\t\t\t\t\tcls: 'alpha @fit',\n\t\t\t\t\t\ttext: ''\n\t\t\t\t\t}),\n\t\t\t\t\tnew Label({\n\t\t\t\t\t\tcls: 'value @fit',\n\t\t\t\t\t\ttext: props.displayValue===false ? '' : color.toHex(),\n\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\tbackgroundColor: color.toString(),\n\t\t\t\t\t\t\tcolor: tcolor\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdom_events: {\n\t\t\t\t\t\t\tclick: () => this._showPicker()\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t],\n\t\t\t} )\n\t\t]);\n\n\t\tif( props.displayValue===false ) {\n\t\t\tthis.setStyleValue( 'background-image', \"url( 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAEsmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEwIgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iMTAiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSIKICAgdGlmZjpJbWFnZVdpZHRoPSIxMCIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTAiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLjAiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLjAiCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgeG1wOk1vZGlmeURhdGU9IjIwMjEtMDMtMjJUMTU6NTE6NDkrMDE6MDAiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMDMtMjJUMTU6NTE6NDkrMDE6MDAiPgogICA8eG1wTU06SGlzdG9yeT4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJwcm9kdWNlZCIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWZmaW5pdHkgRGVzaWduZXIgMS45LjAiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMDMtMjJUMTU6NTE6NDkrMDE6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/Pn8+b7YAAAGCaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRy0tCQRSHv7Qwyh5gRIsWEtZKwwyiNi2UXlAt1CCrjV5fgdrlXiOibdBWKIja9FrUX1DboHUQFEUQ7YLWRW0qbueqoESe4cz55jdzDjNnwBLOKFm93gvZXF4LTvid85EFp+0FK5204sURVXR1JjQepqZ93lNnxluPWav2uX+tOZ7QFahrFB5VVC0vPCk8vZZXTd4R7lDS0bjwmbBbkwsK35l6rMSvJqdK/G2yFg4GwNIu7ExVcayKlbSWFZaX48pmVpXyfcyX2BO5uZDEHvFudIJM4MfJFGMEGGKAEZmH8OCjX1bUyPcW82dZkVxFZpV1NJZJkSaPW9RVqZ6QmBQ9ISPDutn/v33Vk4O+UnW7HxqeDeO9F2zb8FMwjK8jw/g5BusTXOYq+SuHMPwheqGiuQ6gbRPOrypabBcutqDrUY1q0aJkFbckk/B2Ci0RcNxA02KpZ+V9Th4gvCFfdQ17+9An59uWfgF7Hmfv4QYbGAAAAAlwSFlzAAALEwAACxMBAJqcGAAAACdJREFUGJVjbGhoYEAC9fX1yFwmBryAptKM////R+Y3NjbSzW4C0gAo9QeQBmhTIwAAAABJRU5ErkJggg=='\" );\n\t\t}\n\n\t\tthis._setTabIndex(props.tabIndex);\n\t}\n\n\tset value(color: Color) {\n\t\tthis.m_props.color = color;\n\t\tthis.update();\n\t}\n\n\tget value() {\n\t\treturn this.m_props.color;\n\t}\n\n\tset custom_colors(v: Color[]) {\n\t\tthis.m_props.cust_colors = v;\n\t}\n\n\tprivate _showPicker() {\n\t\tlet dlg = new ColorPickerBox({\n\t\t\tcolor: this.m_props.color,\n\t\t\tcust_colors: this.m_props.cust_colors,\n\t\t\thasAlpha: this.m_props.hasAlpha,\n\t\t\tevents: {\n\t\t\t\tchange: (e) => {\n\t\t\t\t\tthis.m_props.color = e.value as Color;\n\t\t\t\t\tthis._change();\n\t\t\t\t\tthis.update();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tlet rc = this.getBoundingRect();\n\t\tdlg.displayAt(rc.left, rc.bottom, 'tl');\n\t}\n\n\tprivate _change() {\n\t\tthis.emit('change', EvChange(this.m_props.color));\n\t}\n\n\tprivate _isTransp(color: Color) {\n\t\treturn !color.alpha();\n\t}\n}\n\n\n// :: Material colors scheme ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\nconst materialColors = [\n\t{\n\t\tcolor: \"Red\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xFFEBEE\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xFFCDD2\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xEF9A9A\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0xE57373\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0xEF5350\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0xF44336\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0xE53935\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0xD32F2F\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0xC62828\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0xB71C1C\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Pink\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xFCE4EC\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xF8BBD0\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xF48FB1\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0xF06292\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0xEC407A\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0xE91E63\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0xD81B60\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0xC2185B\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0xAD1457\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x880E4F\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Purple\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xF3E5F5\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xE1BEE7\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xCE93D8\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0xBA68C8\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0xAB47BC\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0x9C27B0\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0x8E24AA\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0x7B1FA2\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0x6A1B9A\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x4A148C\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Deep Purple\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xEDE7F6\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xD1C4E9\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xB39DDB\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0x9575CD\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0x7E57C2\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0x673AB7\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0x5E35B1\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0x512DA8\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0x4527A0\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x311B92\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Indigo\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xE8EAF6\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xC5CAE9\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0x9FA8DA\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0x7986CB\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0x5C6BC0\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0x3F51B5\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0x3949AB\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0x303F9F\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0x283593\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x1A237E\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Blue\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xE3F2FD\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xBBDEFB\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0x90CAF9\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0x64B5F6\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0x42A5F5\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0x2196F3\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0x1E88E5\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0x1976D2\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0x1565C0\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x0D47A1\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Light Blue\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xE1F5FE\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xB3E5FC\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0x81D4FA\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0x4FC3F7\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0x29B6F6\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0x03A9F4\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0x039BE5\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0x0288D1\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0x0277BD\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x01579B\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Cyan\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xE0F7FA\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xB2EBF2\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0x80DEEA\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0x4DD0E1\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0x26C6DA\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0x00BCD4\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0x00ACC1\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0x0097A7\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0x00838F\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x006064\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Teal\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xE0F2F1\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xB2DFDB\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0x80CBC4\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0x4DB6AC\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0x26A69A\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0x009688\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0x00897B\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0x00796B\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0x00695C\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x004D40\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Green\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xE8F5E9\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xC8E6C9\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xA5D6A7\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0x81C784\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0x66BB6A\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0x4CAF50\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0x43A047\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0x388E3C\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0x2E7D32\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x1B5E20\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Light Green\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xF1F8E9\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xDCEDC8\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xC5E1A5\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0xAED581\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0x9CCC65\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0x8BC34A\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0x7CB342\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0x689F38\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0x558B2F\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x33691E\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Lime\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xF9FBE7\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xF0F4C3\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xE6EE9C\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0xDCE775\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0xD4E157\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0xCDDC39\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0xC0CA33\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0xAFB42B\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0x9E9D24\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x827717\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Yellow\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xFFFDE7\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xFFF9C4\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xFFF59D\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0xFFF176\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0xFFEE58\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0xFFEB3B\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0xFDD835\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0xFBC02D\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0xF9A825\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0xF57F17\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Amber\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xFFF8E1\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xFFECB3\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xFFE082\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0xFFD54F\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0xFFCA28\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0xFFC107\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0xFFB300\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0xFFA000\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0xFF8F00\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0xFF6F00\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Orange\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xFFF3E0\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xFFE0B2\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xFFCC80\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0xFFB74D\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0xFFA726\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0xFF9800\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0xFB8C00\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0xF57C00\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0xEF6C00\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0xE65100\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Deep Orange\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xFBE9E7\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xFFCCBC\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xFFAB91\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0xFF8A65\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0xFF7043\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0xFF5722\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0xF4511E\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0xE64A19\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0xD84315\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0xBF360C\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Brown\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xEFEBE9\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xD7CCC8\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xBCAAA4\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0xA1887F\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0x8D6E63\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0x795548\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0x6D4C41\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0x5D4037\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0x4E342E\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x3E2723\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Grey\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xFAFAFA\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xF5F5F5\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xEEEEEE\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0xE0E0E0\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0xBDBDBD\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0x9E9E9E\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0x757575\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0x616161\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0x424242\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x212121\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Blue Grey\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xECEFF1\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xCFD8DC\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xB0BEC5\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0x90A4AE\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0x78909C\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0x607D8B\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0x546E7A\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0x455A64\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0x37474F\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x263238\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Grey\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xFFFFFF\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xe0e0e0\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xc4c4c4\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0xa8a8a8\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0x8c8c8c\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0x707070\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0x545454\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0x383838\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0x1c1c1c\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x00000\n\t\t\t}\n\t\t]\n\t}\n];", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file drag_manager.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\n\nimport { Component } from './component';\nimport { Point } from './tools';\n\nconst x_drag_cb = Symbol( 'x-drag-cb' );\n\ninterface DropInfo {\n\tpt: Point;\n\tdata: DataTransfer;\n}\n\ntype DropCallback = ( command: 'enter' | 'leave' | 'drag' | 'drop', el: Component, infos: DropInfo ) => void;\ntype FilterCallback = ( el: Component ) => boolean;\n\n/**\n * \n */\n\n\nclass DragManager {\n\n\tdragSource: Component;\n\tdragGhost: HTMLElement;\n\tdropTarget: Component;\n\t\n\tnotified: Component;\n\t\n\ttimer;\n\n\t/**\n\t * \n\t */\n\n\tregisterDraggableElement(el: Component) {\n\n\t\tel.setDomEvent('dragstart', (ev: DragEvent) => {\n\n\t\t\tthis.dragSource = el;\n\t\t\tthis.dragGhost = el.dom.cloneNode(true) as HTMLElement;\n\t\t\t\n\t\t\tthis.dragGhost.classList.add('dragged');\n\t\t\tx4document.body.appendChild(this.dragGhost);\n\n\t\t\tel.addClass( 'dragging' );\n\n\t\t\tev.dataTransfer.setData('text/string', '1');\n\t\t\tev.dataTransfer.setDragImage(new Image(), 0, 0);\n\n\t\t\tev.stopPropagation( );\n\t\t});\n\n\t\tel.setDomEvent('drag', (ev: DragEvent) => {\n\t\t\tthis.dragGhost.style.left = ev.pageX + \"px\";\n\t\t\tthis.dragGhost.style.top = ev.pageY + \"px\";\n\t\t});\n\n\t\tel.setDomEvent('dragend', (ev: DragEvent) => {\n\t\t\tel.removeClass( 'dragging' );\n\t\t\tthis.dragGhost.remove();\n\t\t});\n\n\t\tel.setAttribute('draggable', \"true\");\n\t}\n\n\t/**\n\t * \n\t */\n\n\tregisterDropTarget(el: Component, cb: DropCallback, filterCB?: FilterCallback ) {\n\n\t\tconst dragEnter = (ev: DragEvent) => {\n\t\t\tif( filterCB && !filterCB(this.dragSource) ) {\n\t\t\t\tconsole.log( 'reject ', el );\n\t\t\t\tev.dataTransfer.dropEffect = 'none';\t\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconsole.log( 'accepted ', el );\n\t\t\tev.preventDefault();\n\t\t\tev.dataTransfer.dropEffect = 'copy';\n\t\t};\n\n\t\tconst dragOver = (ev: DragEvent) => {\n\t\t\t//console.log( \"dragover\", ev.target );\n\t\t\t\n\t\t\tif( filterCB && !filterCB(this.dragSource) ) {\n\t\t\t\tconsole.log( 'reject ', el );\n\t\t\t\tev.dataTransfer.dropEffect = 'none';\t\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tev.preventDefault();\n\t\t\t\t\t\t\t\t\t\n\t\t\tif (this.dropTarget != el) {\n\t\t\t\tthis.dropTarget = el;\n\t\t\t\tthis._startCheck();\n\t\t\t}\n\n\t\t\tif( this.dropTarget ) {\n\t\t\t\tconst infos = {\n\t\t\t\t\tpt: new Point( ev.pageX, ev.pageY ),\n\t\t\t\t\tdata: ev.dataTransfer,\n\t\t\t\t}\n\n\t\t\t\tcb( 'drag', this.dragSource, infos );\n\t\t\t}\n\n\t\t\tev.dataTransfer.dropEffect = 'copy';\n\t\t};\n\n\t\tconst dragLeave = (ev: DragEvent) => {\n\t\t\t//console.log( \"dragleave\", ev.target );\n\t\t\tthis.dropTarget = null;\n\t\t\tev.preventDefault();\n\t\t};\n\n\t\tconst drop = (ev: DragEvent) => {\n\t\t\tconst infos = {\n\t\t\t\tpt: new Point( ev.pageX, ev.pageY ),\n\t\t\t\tdata: ev.dataTransfer,\n\t\t\t}\n\n\t\t\tcb('drop', this.dragSource, infos );\n\t\t\t\n\t\t\tthis.dropTarget = null;\n\t\t\tel.removeClass('drop-over');\n\n\t\t\tev.preventDefault();\n\t\t}\n\n\t\tel.setDomEvent('dragenter', dragEnter);\n\t\tel.setDomEvent('dragover', dragOver);\n\t\tel.setDomEvent('dragleave', dragLeave);\n\t\tel.setDomEvent('drop', drop);\n\n\t\tel.setData( x_drag_cb, cb );\n\t}\n\n\t_startCheck() {\n\n\t\tif (this.timer) {\n\t\t\tclearInterval(this.timer);\n\t\t\tthis._check( );\n\t\t}\n\n\t\tthis.timer = setInterval( () => this._check(), 300 );\n\t}\n\n\t_check( ) {\n\n\t\tconst leaving = ( x ) => {\n\t\t\tx.removeClass('drop-over');\n\n\t\t\tconst cb = x.getData( x_drag_cb );\n\t\t\tcb( 'leave', this.dragSource );\n\t\t}\n\n\t\tconst entering = ( x ) => {\n\t\t\tx.addClass('drop-over');\n\t\t\tconst cb = x.getData( x_drag_cb );\n\t\t\tcb( 'enter', this.dragSource );\n\t\t}\n\t\n\t\tif (this.dropTarget) {\n\t\t\tif (!this.notified || this.notified != this.dropTarget) {\n\n\t\t\t\tif( this.notified ) {\n\t\t\t\t\tleaving( this.notified );\n\t\t\t\t}\n\t\t\n\t\t\t\tthis.notified = this.dropTarget;\n\t\t\t\tentering( this.notified );\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif (this.notified) {\n\t\t\t\tleaving( this.notified );\n\t\t\t\tthis.notified = null;\n\n\t\t\t\tclearInterval(this.timer);\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport const dragManager = new DragManager();", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file drawtext.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { deferCall, Point, Rect, roundTo } from './tools'\n\n// adapted & modified from Canvas-txt: \n// https://github.com/geongeorge/Canvas-Txt/blob/master/src/index.js\n\n// Hair space character for precise justification\nconst SPACE = '\\u200a';\n\nexport interface DrawTextStyle {\n\talign?: 'left' | 'center' | 'right' | 'justify',\n\tvAlign?: 'top' | 'middle' | 'bottom',\n\tfontSize?: number,\t\t\t\t// in pixels\n\tfontWeight?: number | 'bold' | 'light' | 'normal',\t// in em (fontHeight)\n\tfontStyle?: string,\n\tfontVariant?: string,\n\tfontFamily?: string,\n\tlineHeight?: number,\n\tclip?: boolean,\n\tcolumns?: number;\n\tcolumnGap?: number;\n\tlineBreak?: boolean;\n\trotation?: number;\n}\n\nconst defStyle: DrawTextStyle = {\n\talign: 'center',\n\tvAlign: 'middle',\n\tfontSize: 14,\n\tfontWeight: null,\n\tfontStyle: '',\n\tfontVariant: '',\n\tfontFamily: 'Arial',\n\tlineHeight: 0,\n\tclip: true,\n\tcolumns: 1,\n\tcolumnGap: 0,\n\tlineBreak: true,\n};\n\n/**\n *\n */\n\ninterface ITextWord {\n\twidth: number; // word width\n\ttext: string;\t// text to print\n}\n\ninterface ITextLine {\n\twidth: number;\t\t// line width\n\twords: ITextWord[];\t// words in line\n\tspace: number;\t\t// space between words\n\tlast?: boolean;\n}\n\nexport function drawText(ctx: CanvasRenderingContext2D, input_Text: string, rc: Rect, drawStyle: DrawTextStyle) {\n\n\tif (rc.width <= 0 || rc.height <= 0) {\n\t\t//width or height or font size cannot be 0\n\t\treturn\n\t}\n\n\t//console.time( 'drawtext' );\n\n\tdrawStyle = { ...defStyle, ...drawStyle };\n\n\tctx.save();\n\n\tif (drawStyle.clip) {\n\t\tctx.beginPath();\n\t\tctx.rect(rc.left, rc.top, rc.width, rc.height);\n\t\tctx.clip();\n\t}\n\n\tif( drawStyle.rotation ) {\n\t\tconst center = new Point(rc.left+rc.width/2, rc.top+rc.height/2);\n\t\tconst rad = drawStyle.rotation / 180 * Math.PI;\n\n\t\tctx.translate( center.x, center.y );\n\t\tctx.rotate( rad );\n\t\tctx.translate( -center.x, -center.y );\n\t\t\n\t\t//ctx.beginPath();\n\t\t//ctx.rect( rc.left, rc.top, rc.width, rc.height );\n\t\t//ctx.stroke( );\n\t}\n\n\tctx.textBaseline = 'bottom';\n\n\t// End points\n\tlet fontSize = roundTo(drawStyle.fontSize, 2) ?? 12;\n\t//let style = `${drawStyle.fontStyle ?? ''} ${drawStyle.fontVariant ?? ''} ${drawStyle.fontWeight ?? ''} ${fontSize}px ${drawStyle.fontFamily ?? 'arial'}`;\n\tlet style = '';\n\n\tif( drawStyle.fontStyle ) {style += drawStyle.fontStyle + ' ';}\n\tif( drawStyle.fontVariant ) {style += drawStyle.fontVariant + ' ';}\n\tif( drawStyle.fontWeight ) {style += drawStyle.fontWeight + ' ';}\n\tstyle += fontSize + 'px ';\n\n\tlet family = drawStyle.fontFamily ?? 'sans-serif';\n\tif( family.indexOf('.')>0 ) {\n\t\tfamily = '\"'+family+'\"';\n\t}\n\n\tstyle += family;\n\tctx.font = style.trim();\n\n\tlet textarray: ITextLine[] = [];\n\tlet lines = input_Text.split('\\n');\n\n\tconst columns = drawStyle.columns < 1 ? 1 : drawStyle.columns;\n\tconst gap = drawStyle.columnGap;\n\n\tlet col_width = (rc.width - gap * (columns - 1)) / columns;\n\tlet col_left = rc.left;\n\tlet hlimit = col_width;\n\n\tif( !drawStyle.lineBreak ) {\n\t\thlimit = 99999999;\n\t}\n\n\tconst spaceW = _measureText(ctx, ' ' );\n\n\tlines.forEach((text) => {\n\n\t\tlet line: ITextLine = { width: 0, words: [], space: 0 };\n\n\t\t// fit in width ?\n\t\tlet lwidth = _measureText(ctx, text);\n\t\tif (lwidth < hlimit) {\n\t\t\tline.width = lwidth;\n\t\t\tline.words.push({ width: lwidth, text });\n\t\t\ttextarray.push(line);\n\t\t}\n\t\t// break line to fit in width\n\t\telse {\n\t\t\t// make word list & measure them\n\t\t\tlet twords = text.split(/\\s/).filter(w => w !== '');\n\t\t\t\n\t\t\tlet words: ITextWord[] = twords.map( w => {\n\t\t\t\tconst wwidth = _measureText(ctx, w );\n\t\t\t\tconst word: ITextWord = {\n\t\t\t\t\twidth: wwidth,\n\t\t\t\t\ttext: w\n\t\t\t\t};\n\t\t\t\treturn word;\n\t\t\t});\n\n\t\t\t// then compute lines \n\t\t\tlet n = 0;\n\t\t\tlet e = 0;\n\n\t\t\twhile (n < words.length) {\n\n\t\t\t\tconst word = words[n];\n\t\t\t\tlet test = line.width;\n\t\t\t\tif( test ) {\n\t\t\t\t\ttest += spaceW;\n\t\t\t\t}\n\t\t\t\ttest += word.width;\n\n\t\t\t\t//console.log( word, test, col_width );\n\t\t\t\tif (test > col_width && e > 0) {\n\t\t\t\t\ttextarray.push(line);\n\n\t\t\t\t\t// restart\n\t\t\t\t\te = 0;\n\t\t\t\t\tlwidth = 0;\n\t\t\t\t\tline = { width: 0, words: [], space: 0 };\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tline.words.push(word);\n\t\t\t\t\tline.width = test;\n\t\t\t\t\tn++;\n\t\t\t\t\te++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (e) {\n\t\t\t\ttextarray.push(line);\n\t\t\t\tline.last = true;\n\t\t\t}\n\t\t}\n\t});\n\n\tconst textSize = _calcTextHeight(ctx, \"Ag\");\n\tlet lineHeight = (drawStyle.lineHeight??1.3) * textSize; \t// * 1.2 = map to pdf \n\tconst nlines = textarray.length;\n\n\t// calc vertical Align\n\tlet col_top = rc.top;\n\n\tif (columns == 1) {\n\t\t\n\t\tlet fullHeight = lineHeight * nlines;\n\t\tif( nlines==1 ) {\n\t\t\tlineHeight = textSize;\n\t\t\tfullHeight = textSize;\n\t\t}\n\t\t\n\t\tif (drawStyle.vAlign === 'middle') {\n\t\t\tcol_top = rc.top + rc.height / 2 - fullHeight / 2;\n\t\t\tcol_top += lineHeight / 2;\n\t\t\tctx.textBaseline = 'middle';\n\t\t}\n\t\telse if (drawStyle.vAlign === 'bottom') {\n\t\t\tif (fullHeight < rc.height) {\n\t\t\t\tcol_top = rc.top + rc.height - fullHeight + lineHeight;\n\t\t\t}\n\t\t}\n\t\telse { \n\t\t\tcol_top = rc.top;\n\t\t\tctx.textBaseline = 'top';\n\t\t}\n\t}\n\telse {\n\t\t// always top, cannot justify multi-columns vertically\n\t\t// todo: for now\n\t\tcol_top += textSize;\n\t}\n\n\tconst justify = drawStyle.align == 'justify';\n\n\tlet column = columns;\n\tlet y = col_top;\n\tlet align = 0;\n\n\t// faster test..\n\tswitch (drawStyle.align) {\n\t\tcase 'right': align = 1; break;\n\t\tcase 'center': align = 2; break;\n\t}\n\n\t//print all lines of text\n\t//let idx = 1, yy = 0;\n\n\tlet maxw = 0;\n\ttextarray.some( line => {\n\n\t\t//console.log( idx++, yy );\n\n\t\tline.space = spaceW;\n\t\tif (justify && !line.last) {\n\t\t\t_justify(line, col_width, spaceW);\n\t\t}\n\n\t\tlet x = col_left;\n\t\tlet cw = 0;\n\n\t\tif (align == 1) { \n\t\t\tx += col_width - line.width; \n\t\t}\n\t\telse if (align == 2) { \n\t\t\tx += col_width / 2 - line.width / 2; \n\t\t}\n\n\t\t// ...debug\n\t\t/*ctx.lineWidth = 1;\n\t\tctx.beginPath( );\n\t\tctx.moveTo( rc.left, y );\n\t\tctx.lineTo( rc.right, y );\n\t\tctx.strokeStyle = 'white';\n\t\tctx.stroke( );*/\n\n\t\tline.words.forEach(w => {\n\t\t\t/*ctx.beginPath( );\n\t\t\tctx.moveTo( x, y );\n\t\t\tctx.lineTo( x, y-40 );\n\t\t\tctx.strokeStyle = 'red';\n\t\t\tctx.stroke( );*/\n\n\t\t\t/*ctx.beginPath( );\n\t\t\tctx.moveTo( x+w.width, y );\n\t\t\tctx.lineTo( x+w.width, y-40 );\n\t\t\tctx.strokeStyle = 'green';\n\t\t\tctx.stroke( );*/\n\n\t\t\tctx.fillText(w.text, x, y);\n\t\t\tx += w.width + line.space;\n\t\t\tcw += w.width + line.space;\n\t\t});\n\n\t\ty += lineHeight;\n\t\t//yy += lineHeight;\n\n\t\tif( maxw<cw ) {\n\t\t\tmaxw = cw;\n\t\t}\n\n\t\tif (y > (rc.bottom+lineHeight) ) {\n\t\t\ty = col_top;\n\t\t\tcol_left += col_width + gap;\n\t\t\tif( --column==0 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t} )\n\n\tctx.restore();\n\n\t//console.timeEnd( 'drawtext' );\n\n\t// todo autogrow + multi-columns\n\treturn { width: maxw, height: (textarray.length+0.3) * lineHeight };\n}\n\n// Calculate Height of the font\nfunction _calcTextHeight(ctx: CanvasRenderingContext2D, text: string) {\n\tconst size = ctx.measureText(text);\n\treturn size.actualBoundingBoxAscent+size.actualBoundingBoxDescent;\n}\n\nfunction _measureText(ctx: CanvasRenderingContext2D, text: string) {\n\treturn roundTo(ctx.measureText(text).width,2);\n}\n\nfunction _justify(line: ITextLine, width: number, spaceW: number ) {\n\n\tlet delta = (width - line.width) / (line.words.length - 1) + spaceW;\n\tif (delta <= 0) {\n\t\treturn;\n\t}\n\n\tline.width = width;\n\tline.space = delta;\n}", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file image.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\nimport { Component, CProps, html } from './component'\n\ninterface LazyLoad {\n\tel: Component;\n\tsrc: string;\n}\n\n// ============================================================================\n// [IMAGE]\n// ============================================================================\n\nexport interface ImageProps extends CProps\n{\n\tsrc: string;\n\talt?: string;\n\tlazy?: boolean;\t// mark image as lazy loading\n\talignment?: 'fill' | 'contain' | 'cover' | 'scale-down' | 'none';\n\toverlays?: Component[];\n}\n\nconst emptyImageSrc = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\n\nfunction _isStaticImage( src: string ) {\n\treturn src.substring(0,5)=='data:';\n}\n\n\n\n/**\n * Standard image class\n */\nexport class Image extends Component<ImageProps>\n{\n\tprotected m_created: boolean;\n\tprotected m_lazysrc: string;\t\t// expected \n\tprivate m_img: Component;\n\t\n\tconstructor(props: ImageProps) {\n\t\tsuper(props);\n\n\t\tthis.m_created = false;\n\t\t\n\t\tthis.m_props.lazy = props.lazy===false ? false : true;\n\t\tthis.m_props.alt = props.alt;\n\t\t\n\t\tif( props.lazy!==false ) {\n\t\t\tthis.m_lazysrc = props.src;\n\t\t\tprops.src = emptyImageSrc;\n\t\t}\n\t\t\n\t\tthis.setDomEvent( 'create', ( ) => {\n\t\t\tif( props.lazy ) {\n\t\t\t\tthis.setImage( this.m_lazysrc, true );\n\t\t\t}\n\t\t});\n\t}\n\n\t/** @ignore */\n\trender( ) {\n\t\tlet mp = this.m_props;\n\n\t\tthis.m_img = new Component( {\n\t\t\ttag: 'img',\n\t\t\tattrs: {\n\t\t\t\tdraggable: false,\n\t\t\t\talt: mp.alt ?? '',\n\t\t\t\tdecoding: mp.lazy ? 'async' : undefined,\n\t\t\t},\n\t\t\tstyle: {\n\t\t\t\tobjectFit: mp.alignment ? mp.alignment : undefined\n\t\t\t}\n\t\t});\n\n\t\tif( mp.overlays ) {\n\t\t\tmp.overlays.forEach( x => x.addClass('@fit') );\n\t\t\tthis.setContent( [this.m_img,...mp.overlays] );\n\t\t}\n\t\telse {\n\t\t\tthis.setContent( this.m_img );\n\t\t}\n\t}\n\t\n\t/**\n\t * change the image\n\t * @param src - image path\n\t */\n\n\tpublic setImage( src: string, force?: boolean ) {\n\n\t\tif( !src ) {\n\t\t\tsrc = emptyImageSrc;\n\t\t\tthis.addClass( 'empty' );\n\t\t}\n\t\telse {\n\t\t\tthis.removeClass( 'empty' );\n\t\t}\n\t\t\n\t\tif( !this.m_props.lazy ) {\n\t\t\tthis.m_props.src = src;\n\t\t\tthis.m_lazysrc = src;\n\n\t\t\tif( this.m_img.dom ) {\n\t\t\t\tthis.m_img.dom.setAttribute( 'src', src );\n\t\t\t}\n\t\t}\n\t\telse if( force || this.m_lazysrc!=src ) {\n\t\t\tif( _isStaticImage(src) ) {\n\t\t\t\t// not to download -> direct display\n\t\t\t\tthis.m_props.src = src;\n\t\t\t\tthis.m_lazysrc = src;\n\n\t\t\t\tif( this.m_img.dom ) {\n\t\t\t\t\tthis.m_img.dom.setAttribute( 'src', this.m_props.src );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// clear current image while waiting\n\t\t\t\tthis.m_props.src = emptyImageSrc;\n\t\t\t\tif( this.m_img.dom ) {\n\t\t\t\t\tthis.m_img.dom.setAttribute( 'src', this.m_props.src );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.m_lazysrc = src;\n\t\t\t\tif( this.dom ) {\n\t\t\t\t\tthis._update_image( );\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _update_image( ) {\n\n\t\tconsole.assert( !!this.dom );\n\n\t\tif( this.m_lazysrc && !_isStaticImage(this.m_lazysrc) ) {\n\t\t\t// we do not push Components in a static array...\n\t\t\tImage.lazy_images_waiting.push( { \n\t\t\t\tel: this, \n\t\t\t\tsrc: this.m_lazysrc \n\t\t\t} );\n\n\t\t\tif( Image.lazy_image_timer===undefined ) {\n\t\t\t\tImage.lazy_image_timer = setInterval( Image.lazyWatch as TimerHandler, 10 );\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate static lazy_images_waiting: LazyLoad[] = [];\n\tprivate static lazy_image_timer: number = undefined;\n\n\tprivate static lazyWatch( ) {\n\n\t\tlet newList = [];\n\t\tlet done = 0;\n\t\t\t\n\t\tImage.lazy_images_waiting.forEach( ( lazy ) => {\n\n\t\t\tlet dom = lazy.el.dom,\n\t\t\t\tsrc = lazy.src;\n\t\t\t\t\n\t\t\t// skip deleted elements\n\t\t\tif( !dom || dom.offsetParent === null ) {\n\t\t\t\t// do not append to newList\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet rc = dom.getBoundingClientRect();\n\n\t\t\t// if it is visible & inserted inside the document\n\t\t\tif( !done && dom.offsetParent!==null && \n\t\t\t\trc.bottom >= 0 && rc.right >= 0 && \n\t\t\t\trc.top <= (window.innerHeight || x4document.documentElement.clientHeight) && \n\t\t\t\trc.left <= (window.innerWidth || x4document.documentElement.clientWidth) ) {\n\n\t\t\t\t// ok, we load the image\n\t\t\t\tlet img = <HTMLElement>dom.firstChild;\n\t\t\t\timg.setAttribute( 'src', src );\n\t\t\t\tlazy.el.removeClass( 'empty' );\n\t\t\t\tdone++;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// still not visible: may be next time\n\t\t\t\tnewList.push( lazy );\n\t\t\t}\n\t\t} );\n\n\t\tImage.lazy_images_waiting = newList;\n\n\t\t// no more elements to watch...\n\t\tif( newList.length==0 ) {\n\t\t\tclearInterval( Image.lazy_image_timer );\n\t\t\tImage.lazy_image_timer = undefined;\n\t\t}\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file fileupload.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\nimport { Component, CProps } from './component'\n\nimport { HLayout } from './layout'\nimport { Input } from './input'\nimport { Image } from './image'\n\n// ============================================================================\n// [FILEUPLOAD]\n// ============================================================================\n\nexport interface FileUploadProps extends CProps {\n\tname: string;\n\tvalue: string;\n}\n\nexport class FileUpload extends HLayout<FileUploadProps> {\n\tconstructor(props: FileUploadProps) {\n\t\tsuper(props);\n\t}\n\n\tclear() {\n\t\tthis.m_props.value = '';\n\t}\n}\n\n/**\n * \n */\n\nexport class ImageUpload extends FileUpload {\n\n\tprivate m_path: any;\n\tprivate m_ui_img: Image;\n\tprivate m_ui_input: Input;\n\n\t/** @ignore */\n\trender(props: FileUploadProps) {\n\n\t\tlet ename = \"up\" + this.uid;\n\n\t\tthis.setContent([\n\n\t\t\tnew Component({\n\t\t\t\ttag: 'label', attrs: { for: ename }, content: [\n\t\t\t\t\tthis.m_ui_img = new Image({ src: this.m_props.value }),\n\t\t\t\t]\n\t\t\t}),\n\n\t\t\tthis.m_ui_input = new Input({\n\t\t\t\tcls: '@hidden',\n\t\t\t\tid: ename,\n\t\t\t\ttype: 'file',\n\t\t\t\tname: this.m_props.name,\n\t\t\t\tvalue_hook: {\n\t\t\t\t\tget: () => { return this._get_value() },\n\t\t\t\t\tset: (v) => { this._set_value(v); }\n\t\t\t\t},\n\t\t\t\tattrs: {\n\t\t\t\t\taccept: 'image/*'\n\t\t\t\t},\n\t\t\t\tdom_events: {\n\t\t\t\t\tchange: (e) => { this._handleChange(e) }\n\t\t\t\t}\n\t\t\t}),\n\t\t]);\n\t}\n\n\tclear() {\n\t\tsuper.clear();\n\t\t(<HTMLInputElement>this.m_ui_input.dom).value = '';\n\t\tthis.m_ui_img.setImage(null, false);\n\t}\n\n\tprivate _get_value() {\n\t\treturn this.m_path;\n\t}\n\n\tprivate _set_value(v) {\n\t\tdebugger;\n\t}\n\n\tprivate _handleChange(e) {\n\n\t\tlet self = this;\n\t\tfunction createThumbnail(file) {\n\n\t\t\tlet reader = new FileReader();\n\t\t\treader.addEventListener('load', (e) => {\n\t\t\t\tself.m_ui_img.setImage(reader.result.toString());\n\t\t\t});\n\n\t\t\treader.readAsDataURL(file);\n\t\t}\n\n\t\tconst allowedTypes = ['png', 'jpg', 'jpeg', 'gif'];\n\n\t\tlet files = e.target.files,\n\t\t\tfilesLen = files.length;\n\n\t\tfor (let i = 0; i < filesLen; i++) {\n\n\t\t\tlet imgType: string = files[i].name.split('.');\n\t\t\timgType = imgType[imgType.length - 1];\n\t\t\timgType = imgType.toLowerCase();\n\n\t\t\tif (allowedTypes.indexOf(imgType) != -1) {\n\t\t\t\tcreateThumbnail(files[i]);\n\t\t\t\tthis.m_path = files[i];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\nlet g_file_input: Component = null;\n\nfunction _createFileInput() {\n\tif (!g_file_input) {\n\t\tg_file_input = new Component({\n\t\t\ttag: 'input',\n\t\t\tstyle: {\n\t\t\t\tdisplay: 'none',\n\t\t\t\tid: 'fileDialog',\n\t\t\t},\n\t\t\tattrs: {\n\t\t\t\ttype: 'file'\n\t\t\t}\n\t\t});\n\n\t\t// ajoute un input type:file cach\u00E9 pour pouvoir choir un fichier a ouvrir\n\t\tx4document.body.appendChild(g_file_input._build());\n\t}\n\n\tg_file_input.clearDomEvent('change');\n\treturn g_file_input;\n}\n\n/**\n * show openfile dialog\n * @param extensions - string - ex: '.doc,.docx'\n * @param cb - callback to call when user select a file\n */\n\nexport function openFileDialog(extensions: string, cb: (filename: FileList) => void, multiple = false) {\n\n\tlet fi = _createFileInput();\n\n\tfi.removeAttribute('nwsaveas');\n\tfi.setAttribute('accept', extensions);\n\tfi.setAttribute('multiple', multiple);\n\n\t// Set up the file chooser for the on change event\n\tfi.setDomEvent(\"change\", (evt) => {\n\t\t// When we reach this point, it means the user has selected a file,\n\t\tlet files = (<HTMLInputElement>fi.dom).files\n\t\tcb(files);\n\t});\n\n\tfi.dom.click();\n}\n\n/**\n * open saveas dialog\n * @param defFileName - string - proposed filename \n * @param cb - callback to call when user choose the destination\n */\n\nexport function saveFileDialog(defFileName: string, extensions: string, cb: (filename: File) => void) {\n\n\tlet fi = _createFileInput();\n\tfi.setAttribute('nwsaveas', defFileName);\n\tfi.setAttribute('accept', extensions);\n\n\t// Set up the file chooser for the on change event\n\tfi.setDomEvent(\"change\", (evt) => {\n\t\t// When we reach this point, it means the user has selected a file,\n\t\tlet files = (<HTMLInputElement>fi.dom).files\n\t\tcb(files[0]);\n\t});\n\n\tfi.dom.click();\n}\n\n", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file formatters.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { formatIntlDate, roundTo } from './tools'\n\nexport type FormatFunc = (input: any, rec: any) => string;\n\nlet locale: string;\nlet moneyFmt: Intl.NumberFormat;\n\nexport function setCurrencySymbol( symbol: string | null ) {\n\n\tif( symbol ) {\n\t\tmoneyFmt = new Intl.NumberFormat( locale, { style: 'currency', currency: symbol /*, currencyDisplay: 'symbol'*/ } );\n\t}\n\telse {\n\t\tmoneyFmt = new Intl.NumberFormat( locale, { style: 'decimal', useGrouping: true, minimumFractionDigits: 2, maximumFractionDigits: 2 } );\n\t}\n}\n\nexport function sql_date_formatter(input: any): string {\n\n\tif (input === null || input === undefined || input === '') {\n\t\treturn '';\n\t}\n\n\tlet dte = new Date(Date.parse(input));\n\n\t//todo: better implementation\n\tconst options: Intl.DateTimeFormatOptions = { /*weekday: 'short',*/ month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' };\n\treturn dte.toLocaleDateString(locale, options)\n}\n\nexport function date_formatter(input: any): string {\n\n\tif (input === null || input === undefined || input === '') {\n\t\treturn '';\n\t}\n\n\tlet dte: Date = typeof (input) == 'string' ? new Date(Date.parse(input)) : input;\n\treturn formatIntlDate(dte);\n}\n\nexport function money_formatter(input: any): string {\n\n\tif (input === null || input === undefined || input === '') {\n\t\treturn '';\n\t}\n\n\tlet val: number = roundTo(typeof (input) == 'string' ? parseFloat(input) : input, 2);\n\tif (Object.is(val, -0.00)) {\n\t\tval = 0.00;\n\t}\n\n\tlet res = moneyFmt.format(val);\n\treturn res;\n}\n\nexport function money_formatter_nz(input: any): string {\n\n\tif (input === null || input === undefined || input === '') {\n\t\treturn '';\n\t}\n\n\tlet val: number = roundTo(typeof (input) == 'string' ? parseFloat(input) : input, 2);\n\tif (!val) {\t// do not show zeros\n\t\treturn '';\n\t}\n\n\tlet res = moneyFmt.format(val);\n\treturn res;\n}\n\nexport function bool_formatter(input: any): string {\n\treturn input ? 'oui' : '-';\n}\n\n\nsetCurrencySymbol( null );", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file gridview.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nconst T_UPDATE = Symbol('update');\n\n/**\n * todo: sizable column\n * todo: button in a column\n */\n\nimport { x4document } from './x4dom'\n\nimport { HLayout, VLayout } from './layout'\nimport { Component, ContainerEventMap, EvSize, EvDblClick, CProps, flyWrap, html, HtmlString, SizerOverlay, Flex } from './component'\nimport { Label } from './label'\nimport { _tr } from './i18n'\nimport { FormatFunc } from './formatters'\nimport { downloadData, isFunction } from './tools'\nimport { DataView, DataStore, Record } from './datastore'\n\nimport { EvContextMenu, EvSelectionChange, BasicEvent, EventDisposer } from \"./x4events\";\nimport { Icon } from './icon.js';\n\nexport interface EvGridCheck extends BasicEvent {\n\trec: Record;\n\tchk: boolean;\n}\n\nexport function EvGridCheck(rec: Record, chk: boolean) {\n\treturn BasicEvent<EvGridCheck>( { rec, chk } );\n}\n\n\n\n\n\n/**\n * \n */\n\nexport interface GridColumn {\n\tid: any;\n\ttitle: string;\n\twidth: number;\n\tflex?: number;\n\talign?: 'left' | 'center' | 'right';\n\trenderer?: CellRenderer;\n\tformatter?: FormatFunc;\n\tcls?: string;\n\tsortable?: boolean;\n}\n\ninterface GridColumnInternal extends GridColumn {\n\t$hdr: ColHeader;\n\t$ftr: Component;\n}\n\n\n\nexport type CellRenderer = (rec: Record) => Component;\nexport type RowClassifier = (rec: Record, Row: Component) => void;\nexport type ContextMenuGridItem = (event: MouseEvent, item: Record, grid: GridView) => any;\n\ntype emptyFn = () => string;\n\ninterface GridViewEventMap extends ContainerEventMap {\n\tdblClick?: EvDblClick;\n\tselectionChange?: EvSelectionChange;\n\tcontextMenu?: EvContextMenu;\n\tgridCheck?: EvGridCheck;\n}\n\nexport interface GridViewProps extends CProps<GridViewEventMap> {\n\tstore: DataStore | DataView;\n\tcolumns: GridColumn[];\n\tcalcRowClass?: RowClassifier;\n\tempty_text?: string | emptyFn;\t// set or return '' to avoid message\n\thasMarks?: boolean;\t// if true add a checkbox on left side cf. clearMarks, getMarksIds\n\thasFooter?: boolean;\n}\n\n\nclass ColHeader extends Component {\n\n\tprivate m_sens: \"up\" | \"dn\";\n\tprivate m_sorted: boolean;\n\t\n\tconstructor( props, title ) {\n\t\tsuper( props );\n\n\t\tthis.m_sorted = false;\n\t\tthis.m_sens = 'dn';\n\t\n\t\tthis.setContent( [\n\t\t\tnew Component({\n\t\t\t\ttag: 'span',\n\t\t\t\tcontent: title\n\t\t\t}),\n\t\t\tnew Icon( {\n\t\t\t\tref: 'sorter',\n\t\t\t\tcls: '@hidden sort',\n\t\t\t\ticon: 'var( --x4-icon-arrow-down )'\n\t\t\t})\n\t\t]);\n\t}\n\n\tget sorted( ) {\n\t\treturn this.m_sorted;\n\t}\n\n\t//set sorted( v ) {\n\t//\tthis.m_sorted = v;\n\t//\tthis.m_sens = 'dn';\n\t//\tthis.itemWithRef<Icon>( 'sorter' ).show( v );\n\t//}\n\n\tsort( v: boolean, sens: \"up\" | \"dn\" ) {\n\t\tthis.m_sorted = v;\n this.m_sens = sens;\n\n\t\tconst ic = this.itemWithRef<Icon>('sorter');\n ic.icon = this.m_sens == 'up' ? 'var( --x4-icon-arrow-down )' : 'var( --x4-icon-arrow-up )';\n\t\tic.show(v);\n\t}\n\n\tget sens( ) {\n\t\treturn this.m_sens;\n\t}\n\n\ttoggleSens( ) {\n\t\tthis.m_sens = this.m_sens=='up' ? 'dn' : 'up';\n\t\tthis.itemWithRef<Icon>( 'sorter' ).icon = this.m_sens=='up' ? 'var( --x4-icon-arrow-down )' : 'var( --x4-icon-arrow-up )';\n\t}\n}\n\n\n\n/**\n * gridview class\n */\n\nexport class GridView extends VLayout<GridViewProps, GridViewEventMap> {\n\n\tprotected m_dataview: DataView;\n\tprotected m_data_cx: EventDisposer;\n\n\tprotected m_columns: GridColumn[];\n\n\tprotected m_view_el: Component;\n\tprotected m_container: Component;\n\tprotected m_header: Component;\n\n\tprotected m_footer: Component;\n\t\n\tprotected m_empty_msg: Label;\n\tprotected m_empty_text: string | emptyFn;\n\n\tprotected m_selection: any;\n\tprivate m_itemHeight: number;\n\tprivate m_topIndex: number;\n\tprotected m_visible_rows: Component[];\t\t// shown elements\n\n\tprotected m_hasMarks: boolean;\n\tprotected m_marks: Set<any>;\t// checked elements\n\n\tprivate m_recycler: Component[];\n\n\tprivate m_rowClassifier: RowClassifier;\n\n\tconstructor(props: GridViewProps) {\n\t\tsuper(props);\n\n\t\tthis.m_columns = props.columns;\n\t\tthis.m_hasMarks = props.hasMarks ?? false;\n\t\tthis.m_marks = new Set<any>();\n\n\t\t// prepend the checkable column\n\t\tif (this.m_hasMarks) {\n\t\t\tthis.m_columns.unshift({\n\t\t\t\tid: 'id',\n\t\t\t\ttitle: '',\n\t\t\t\twidth: 30,\n\t\t\t\trenderer: (e) => this._renderCheck( e )\n\t\t\t});\n\t\t}\n\n\t\tthis.setAttribute('tabindex', 0);\n\n\t\tthis.m_topIndex = 0;\n\t\tthis.m_itemHeight = 0;\n\t\tthis.m_recycler = [];\n\t\tthis.m_rowClassifier = props.calcRowClass;\n\n\t\tthis.m_empty_text = props.empty_text ?? _tr.global.empty_list;\n\n\t\t//this.setDomEvent('create', this._handleCreate, this);\n\t\tthis.setDomEvent('click', (e)=>this._itemClick(e));\n\t\tthis.setDomEvent('dblclick', (e)=>this._itemDblClick(e));\n\t\tthis.setDomEvent('contextmenu', (e)=>this._itemMenu(e));\n\t\tthis.setDomEvent('keydown', (e)=>this._handleKey(e));\n\n\t\tthis.setStore(props.store);\n\t}\n\n\tcomponentCreated() {\n\t\tthis._updateScroll(true);\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _moveSel(sens: number, select = true) {\n\n\t\tlet sel = this.m_selection;\n\t\tlet scrolltype = null;\n\n\t\tif (sel === undefined) {\n\t\t\tsel = this.m_dataview.getByIndex(0).getID();\n\t\t}\n\t\telse {\n\n\t\t\tlet index = this.m_dataview.indexOfId(this.m_selection);\n\n\t\t\tif (sens == 1) {\n\t\t\t\tindex++;\n\t\t\t}\n\t\t\telse if (sens == -1) {\n\t\t\t\tindex--;\n\t\t\t}\n\t\t\telse if (sens == 2) {\n\t\t\t\tindex += this.m_visible_rows.length - 1;\n\t\t\t}\n\t\t\telse if (sens == -2) {\n\t\t\t\tindex -= this.m_visible_rows.length - 1;\n\t\t\t}\n\n\t\t\tif (sens < 0) {\n\t\t\t\tscrolltype = 'start';\n\t\t\t}\n\t\t\telse {\n\t\t\t\tscrolltype = 'end';\n\t\t\t}\n\n\t\t\tif (index < 0) {\n\t\t\t\tindex = 0;\n\t\t\t}\n\t\t\telse if (index >= this.m_dataview.count) {\n\t\t\t\tindex = this.m_dataview.count - 1;\n\t\t\t}\n\n\t\t\tsel = this.m_dataview.getByIndex(index).getID();\n\t\t}\n\n\t\tif (this.m_selection != sel && select) {\n\t\t\tthis._selectItem(sel, null, scrolltype);\n\t\t}\n\n\t\treturn sel;\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _handleKey(event: KeyboardEvent) {\n\t\tif (!this.m_dataview || this.m_dataview.count == 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowDown':\n\t\t\tcase 'Down': {\n\t\t\t\tthis._moveSel(1);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'ArrowUp':\n\t\t\tcase 'Up': {\n\t\t\t\tthis._moveSel(-1);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'PageUp': {\n\t\t\t\tthis._moveSel(-2);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'PageDown': {\n\t\t\t\tthis._moveSel(2);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tgetNextSel(sens: number) {\n\t\treturn this._moveSel(sens, false);\n\t}\n\n\tprivate _scrollIntoView(id: any, sens?: string) {\n\n\t\tlet itm = this._findItem(id);\n\t\tif (itm) {\n\t\t\titm.scrollIntoView({\n\t\t\t\tblock: 'center'\t//<ScrollLogicalPosition>sens ?? 'nearest'\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tthis.m_topIndex = this.m_dataview.indexOfId(id);\n\t\t\tthis.m_view_el.dom.scrollTop = this.m_topIndex * this.m_itemHeight;\n\t\t\tthis._buildItems();\n\n\t\t\tthis._scrollIntoView(id);\n\t\t}\n\n\t}\n\n\t/**\n\t * change the list of item displayed\n\t * @param items - new array of items\n\t */\n\n\tpublic setStore(store: DataStore | DataView) {\n\n\t\tthis.m_selection = undefined;\n\n\t\tif (store instanceof DataStore) {\n\t\t\tthis.m_dataview = store.createView();\n\t\t}\n\t\telse {\n\t\t\tthis.m_dataview = store;\n\t\t}\n\n\t\tif( this.m_hasMarks ) {\n\t\t\tthis.clearMarks( );\n\t\t}\n\n\t\t// unlink previous observer\n\t\tif (this.m_data_cx) {\n\t\t\tthis.m_data_cx.dispose( );\n\t\t}\n\n\t\tif (this.m_dataview) {\n\n\t\t\tthis.m_data_cx = this.m_dataview.on( 'view_change', ( ev ) => {\n\t\t\t\tif (ev.action == 'change') {\n\t\t\t\t\tthis.m_selection = undefined;\n\t\t\t\t}\n\n\t\t\t\tthis._updateScroll(true);\n\t\t\t});\n\n\t\t\t//this.update( );\n\t\t\tthis._updateScroll(true);\n\t\t}\n\t}\n\n\tpublic getView(): DataView {\n\t\treturn this.m_dataview;\n\t}\n\n\t/**\n\t * return the current selection (row id) or null \n\t */\n\n\tpublic getSelection(): any {\n\t\treturn this.m_selection;\n\t}\n\n\tpublic getSelRec(): Record {\n\t\tif (this.m_selection) {\n\t\t\treturn this.m_dataview.getById(this.m_selection);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic setSelection(recId: any) {\n\t\tthis._selectItem(recId, null, 'center');\n\t}\n\n\t/** @ignore */\n\trender() {\n\n\t\tthis.m_recycler = [];\n\t\tthis.m_container = new Component({\n\t\t\tcls: 'content',\n\t\t});\n\n\t\tthis.m_empty_msg = new Label({\n\t\t\tcls: 'empty-msg',\n\t\t\ttext: ''\n\t\t});\n\n\t\tthis.m_view_el = new Component({\n\t\t\tcls: '@scroll-view',\n\t\t\tflex: 1,\n\t\t\tdom_events: {\n\t\t\t\tsizechange: ( ) => this._updateScroll(true),\n\t\t\t\tscroll: ( ) => this._updateScroll(false)\n\t\t\t},\n\t\t\tcontent: this.m_container\n\t\t});\n\n\t\tlet flex = false;\n\t\tlet cols = this.m_columns.map((col, index) => {\n\n\t\t\tlet cls = '@cell';\n\t\t\tif (col.cls) {\n\t\t\t\tcls += ' ' + col.cls;\n\t\t\t}\n\n\t\t\tlet comp = new ColHeader({\n\t\t\t\tcls,\n\t\t\t\tflex: col.flex,\n\t\t\t\tsizable: 'right',\n\t\t\t\tstyle: {\n\t\t\t\t\twidth: col.width\n\t\t\t\t},\n\t\t\t\tdom_events: {\n\t\t\t\t\tclick: (ev: MouseEvent) => {\n\t\t\t\t\t\tlet t = flyWrap(<HTMLElement>ev.target);\n\t\t\t\t\t\tif (!t.hasClass('@sizer-overlay')) { // avoid sizer click\n\t\t\t\t\t\t\tthis._sortCol(col);\n\t\t\t\t\t\t\tev.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, col.title );\n\n\t\t\tconst resizeCol = ( ev: EvSize ) => {\n\t\t\t\tthis._on_col_resize(index, ev.size.width);\n\n\t\t\t\tif( this.m_footer ) {\n\t\t\t\t\tlet col = Component.getElement( this.m_footer.dom.childNodes[index] as HTMLElement );\n\t\t\t\t\tif( col ) {\n\t\t\t\t\t\tcol.setStyleValue( 'width', ev.size.width ); \n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tnew SizerOverlay({\n\t\t\t\ttarget: comp,\n\t\t\t\tsens: 'right',\n\t\t\t\tevents: {resize: ( e ) => resizeCol(e )}\n\t\t\t});\n\n\t\t\tif( col.flex ) {\n\t\t\t\tflex = true;\n\t\t\t}\n\n\t\t\t(<any>col).$hdr = comp;\n\t\t\treturn comp;\n\t\t});\n\n\t\t(cols as any).push( new Flex( {\n\t\t\tref: 'flex',\n\t\t\tcls: flex ? '@hidden' : ''\n\t\t} ) );\n\t\t\n\t\t// compute full width\n\t\tlet full_width = 0;\n\t\tthis.m_columns.forEach((col) => {\n\t\t\tfull_width += col.width ?? 0;\n\t\t});\n\n\t\tthis.m_header = new HLayout({\n\t\t\tcls: '@header',\n\t\t\tcontent: <any>cols,\n\t\t\tstyle: {\n\t\t\t\tminWidth: full_width\n\t\t\t}\n\t\t});\t\n\n\t\tif( this.m_props.hasFooter ) {\n\t\t\tlet foots = this.m_columns.map((col, index) => {\n\n\t\t\t\tlet cls = '@cell';\n\n\t\t\t\tif (col.align) {\n\t\t\t\t\tcls += ' ' + col.align;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (col.cls) {\n\t\t\t\t\tcls += ' ' + col.cls;\n\t\t\t\t}\n\n\t\t\t\tlet comp = new Component({\n\t\t\t\t\tcls,\n\t\t\t\t\tdata: { col: index },\n\t\t\t\t\tflex: col.flex,\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\twidth: col.width\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t(col as GridColumnInternal).$ftr = comp;\n\t\t\t\treturn comp;\n\t\t\t});\n\n\t\t\t(foots as any).push( new Flex( {\n\t\t\t\tref: 'flex',\n\t\t\t\tcls: flex ? '@hidden' : ''\n\t\t\t} ) );\n\t\t\t\n\t\t\tthis.m_footer = new HLayout({\n\t\t\t\tcls: '@footer',\n\t\t\t\tcontent: <any>foots,\n\t\t\t\tstyle: {\n\t\t\t\t\tminWidth: full_width\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tthis.m_footer = null;\n\t\t}\n\n\t\tthis.setContent([\n\t\t\tthis.m_header,\n\t\t\tthis.m_view_el,\n\t\t\tthis.m_footer,\n\t\t\tthis.m_empty_msg,\n\t\t]);\n\n\t}\n\n\tprivate _on_col_resize(col: number, width: number) {\n\n\t\tconst _col = this.m_columns[col] as GridColumnInternal;\n\n\t\tlet updateFlex = false;\n\t\t\t\t\n\t\tif( width>=0 ) {\n\t\t\t_col.width = width;\n\t\t\tif( _col.flex ) {\n\t\t\t\t_col.$hdr.removeClass( '@flex' );\n\t\t\t\t_col.$ftr?.removeClass( '@flex' );\n\t\t\t\t_col.flex = undefined;\n\t\t\t\tupdateFlex = true;\n\t\t\t}\n\t\t}\n\t\telse if( width<0 && !_col.flex ) {\n\t\t\t_col.$hdr.addClass( '@flex' );\n\t\t\t_col.$ftr?.addClass( '@flex' );\n\t\t\t_col.flex = 1;\n\t\t\tupdateFlex = true;\n\t\t}\n\n\t\tif( updateFlex ) {\n\t\t\tlet flex = false;\n\t\t\tthis.m_columns.forEach( c => {\n\t\t\t\tif( c.flex ) {\n\t\t\t\t\tflex = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\t\t\n\t\t\tthis.m_header.itemWithRef( 'flex' )?.show( flex ? false : true );\n\t\t\tif( this.m_footer ) {\n\t\t\t\tthis.m_footer.itemWithRef( 'flex' )?.show( flex ? false : true );\n\t\t\t}\n\t\t}\n\n\t\tthis._updateScroll(true);\n\t}\n\n\t/**\n\t * \n\t */\n\n\tsortCol( name: string, asc = true ) {\n\t\tconst col = this.m_columns.find(c => c.id==name );\n\t\tif( col===undefined ) {\n\t\t\tconsole.assert( false, \"unknown field \"+name+\" in grid.sortCol\" );\n\t\t\treturn;\n\t\t}\n\n\t\tthis._sortCol( col, asc ? \"dn\" : \"up\" );\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _sortCol(col: GridColumn, sens: \"up\" | \"dn\" = \"up\" ) {\n\n\t\tif (col.sortable === false) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.m_columns.forEach((c) => {\n\t\t\tif (c !== col) {\n\t\t\t\t(c as GridColumnInternal).$hdr.sort( false, \"dn\" );\n\t\t\t}\n\t\t});\n\n\t\tconst $hdr = (col as GridColumnInternal).$hdr;\n\n\t\tif ($hdr.sorted) {\n\t\t\t$hdr.toggleSens( );\n\t\t}\n\t\telse {\n\t\t\t$hdr.sort( true, sens );\n\t\t}\n\n\t\tif (this.m_dataview) {\n\t\t\tthis.m_dataview.sort([\n\t\t\t\t{ field: col.id, ascending: $hdr.sens=='dn' ? false : true }\n\t\t\t]);\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _computeItemHeight() {\n\t\tlet gr = x4document.createElement('div');\n\t\tgr.classList.add('x-row');\n\n\t\tlet gv = x4document.createElement('div');\n\t\tgv.classList.add('x-grid-view');\n\t\tgv.style.position = 'absolute';\n\t\tgv.style.top = '-1000px';\n\t\tgv.appendChild(gr);\n\n\t\tthis.dom.appendChild(gv);\n\t\tlet rc = gr.getBoundingClientRect();\n\t\tthis.dom.removeChild(gv);\n\n\t\tthis.m_itemHeight = rc.height;\n\t}\n\n\tprivate _createRow( props: CProps ): Component {\n\n\t\tlet row: Component;\n\t\tif (this.m_recycler.length) {\n\t\t\trow = this.m_recycler.pop();\n\t\t\trow.clearClasses();\n\t\t\trow.addClass( props.cls );\n\t\t\trow.setContent( props.content );\n\t\t\trow.setStyle( props.style );\n\n\t\t\tfor( let n in props.data ) {\n\t\t\t\trow.setData( n, props.data[n] );\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\trow = new HLayout( props );\n\t\t}\n\n\t\tif (!row.dom) {\n\t\t\tthis.m_container.appendChild(row);\n\t\t}\n\n\t\treturn row;\n\t}\n\n\tprivate _buildItems( canOpt = true ) {\n\t\tlet rc = this.getBoundingRect();\n\t\tlet rh = this.m_header.getBoundingRect();\n\t\tlet height = rc.height - rh.height + this.m_itemHeight;\n\n\t\tif (this.m_itemHeight == 0) {\n\t\t\tthis._computeItemHeight();\n\t\t}\n\n\t\tlet top = this.m_topIndex * this.m_itemHeight;\n\t\tlet y = 0;\n\t\tlet cidx = 0;\n\t\tlet index = this.m_topIndex;\n\t\tlet count = this.m_dataview ? this.m_dataview.count : 0;\n\t\t\n\t\tlet full_width = 0; // todo: +4 pixel of left border\n\t\tlet even = this.m_topIndex & 1 ? true : false;\n\n\t\t// compute full width\n\t\tthis.m_columns.forEach((col) => {\n\t\t\tfull_width += col.width ?? 0;\n\t\t});\n\n\t\t// if items height make scroll visible, update header width\n\t\tif (((count + 1) * this.m_itemHeight) >= height) {\n\t\t\tlet w = Component.getScrollbarSize();\n\t\t\tthis.m_header.setStyleValue(\"paddingRight\", w);\n\t\t\tthis.m_footer?.setStyleValue(\"paddingRight\", w);\n\t\t}\n\t\telse {\n\t\t\tthis.m_header.setStyleValue(\"paddingRight\", 0);\n\t\t\tthis.m_footer?.setStyleValue(\"paddingRight\", 0);\n\t\t}\n\n\t\t// passe 0 - all created cells are moved to the recycler\n\t\tif( this.m_visible_rows ) {\n\t\t\tthis.m_visible_rows.forEach((c) => {\n\t\t\t\tthis.m_recycler.push(c);\n\t\t\t});\n\t\t}\n\n\t\tthis.m_visible_rows = [];\n\t\tlet limit = 100;\n\t\twhile (y < height && index < count && --limit > 0) {\n\n\t\t\tlet rec = this.m_dataview.getByIndex(index);\n\t\t\tlet rowid = rec.getID();\n\n\t\t\tlet crow = canOpt ? this.m_recycler.findIndex( ( r ) => r.getData('row-id')==rowid ) : -1;\n\t\t\tif( crow>=0 ) {\n\t\t\t\tlet rrow = this.m_recycler.splice( crow, 1 )[ 0 ];\n\t\t\t\trrow.setStyle( {\n\t\t\t\t\ttop: y + top,\n\t\t\t\t\tminWidth: full_width,\n\t\t\t\t} );\n\n\t\t\t\tif (this.m_hasMarks) {\n\t\t\t\t\trrow.setClass( '@marked', this.m_marks.has(rowid) );\n\t\t\t\t}\n\n\t\t\t\trrow.removeClass( '@hidden' );\n\t\t\t\trrow.setClass( '@selected', this.m_selection === rowid );\n\n\t\t\t\tthis.m_visible_rows[cidx] = rrow;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet cols = this.m_columns.map( col => {\n\n\t\t\t\t\tlet cls = '@cell';\n\t\t\t\t\tif (col.align) {\n\t\t\t\t\t\tcls += ' ' + col.align;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (col.cls) {\n\t\t\t\t\t\tcls += ' ' + col.cls;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet cell: Component;\n\t\t\t\t\tif (col.renderer) {\n\t\t\t\t\t\tcell = col.renderer(rec);\n\t\t\t\t\t\tif (cell) {\n\t\t\t\t\t\t\tcell.addClass(cls);\n\t\t\t\t\t\t\tcell.setStyleValue('width', col.width);\n\t\t\t\t\t\t\tif (col.flex !== undefined) {\n\t\t\t\t\t\t\t\tcell.addClass('@flex');\n\t\t\t\t\t\t\t\tcell.setStyleValue('flex', col.flex);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\n\t\t\t\t\t\tlet fmt = col.formatter;\n\t\t\t\t\t\tlet text;\n\n\t\t\t\t\t\tif (fmt && fmt instanceof Function) {\n\t\t\t\t\t\t\ttext = fmt(rec.getRaw(col.id), rec);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\ttext = rec.getField(col.id);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcell = new Component({\n\t\t\t\t\t\t\tcls,\n\t\t\t\t\t\t\twidth: col.width,\n\t\t\t\t\t\t\tcontent: html`<span>${text}</span>`,\n\t\t\t\t\t\t\tflex: col.flex\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\n\t\t\t\t\treturn cell;\n\t\t\t\t});\n\n\t\t\t\tlet cls = '@row @hlayout center';\n\t\t\t\tif (this.m_hasMarks) {\n\t\t\t\t\tif (this.m_marks.has(rowid)) {\n\t\t\t\t\t\tcls += ' @marked';\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this.m_selection === rowid) {\n\t\t\t\t\tcls += ' @selected';\n\t\t\t\t}\n\n\t\t\t\tlet row = this.m_visible_rows[cidx] = this._createRow( {\n\t\t\t\t\tcls,\n\t\t\t\t\tcontent: <any>cols,\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\ttop: y + top,\n\t\t\t\t\t\tminWidth: full_width,\n\t\t\t\t\t},\n\t\t\t\t\tdata: {\n\t\t\t\t\t\t'row-id': rowid,\n\t\t\t\t\t\t'row-idx': index\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\trow.addClass(even ? 'even' : 'odd');\n\t\t\t\teven = !even;\n\n\t\t\t\tif (this.m_rowClassifier) {\n\t\t\t\t\tthis.m_rowClassifier(rec, row);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ty += this.m_itemHeight;\n\n\t\t\tindex++;\n\t\t\tcidx++;\n\t\t}\n\n\t\t// if some cells are still in cache, hide them\n\t\tthis.m_recycler.forEach((c) => {\n\t\t\tc.addClass('@hidden');\n\t\t})\n\n\t\t//this.m_container.setContent(<ComponentContent>this.m_visible_rows);\n\n\t\tlet show = !count;\n\t\tlet msg = (this.m_empty_text instanceof Function) ? this.m_empty_text() : this.m_empty_text;\n\t\tthis.m_empty_msg.text = msg;\n\n\t\tif (show && msg.length == 0) {\n\t\t\tshow = false;\n\t\t}\n\n\t\tthis.m_empty_msg.show(show);\n\n\t\tif (full_width < rc.width) {\n\t\t\tthis.m_header.setStyleValue('width', null);\n\t\t\tthis.m_footer?.setStyleValue('width', null);\n\t\t\tthis.m_container.setStyle({\n\t\t\t\theight: count * this.m_itemHeight,\n\t\t\t\twidth: null\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tthis.m_header.setStyleValue('width', full_width + 1000 );\n\t\t\tthis.m_footer?.setStyleValue('width', full_width + 1000 );\n\t\t\tthis.m_container.setStyle({\n\t\t\t\theight: count * this.m_itemHeight,\n\t\t\t\twidth: full_width\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _updateScroll(forceUpdate) {\n\t\tif (!this.m_view_el || !this.m_view_el.dom) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst update = () => {\n\n\t\t\t// element destroyed between updateScroll and now\n\t\t\tif( !this.dom ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet newTop = Math.floor(this.m_view_el.dom.scrollTop / (this.m_itemHeight || 1));\n\n\t\t\tif (newTop != this.m_topIndex || forceUpdate) {\n\t\t\t\tthis.m_topIndex = newTop;\n\t\t\t\tthis._buildItems( !forceUpdate );\n\t\t\t}\n\n\t\t\tlet newLeft = this.m_view_el.dom.scrollLeft;\n\t\t\tthis.m_header.setStyleValue('left', -newLeft);\n\t\t\tthis.m_footer?.setStyleValue('left', -newLeft);\n\t\t}\n\n\t\tif (forceUpdate) {\n\t\t\tthis.singleShot( update, 10 );\n\t\t}\n\t\telse {\n\t\t\tupdate();\n\t\t}\n\t}\n\n\t/** @ignore */\n\n\tprivate _rowFromTarget(dom) {\n\t\tlet self = this.dom;\n\n\t\twhile (dom && dom != self) {\n\t\t\tlet itm = Component.getElement(dom);\n\n\t\t\tif (itm) {\n\t\t\t\tlet id = itm.getData('row-id');\n\t\t\t\tif (id !== undefined) {\n\t\t\t\t\treturn { id, itm };\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdom = dom.parentElement;\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tprivate _itemClick(e: MouseEvent) {\n\t\tlet hit = this._rowFromTarget(e.target);\n\t\tif (hit) {\n\t\t\tthis._selectItem(hit.id, hit.itm);\n\t\t}\n\t\telse {\n\t\t\tthis._selectItem(undefined, undefined);\n\t\t}\n\t}\n\n\tprivate _itemDblClick(e: MouseEvent) {\n\t\tlet hit = this._rowFromTarget(e.target);\n\t\tif (hit) {\n\t\t\tthis._selectItem(hit.id, hit.itm);\n\n\t\t\tlet rec = this.m_dataview.getById(hit.id);\n\t\t\tthis.emit( 'dblClick', EvDblClick(rec) );\n\n\t\t\tif (this.m_hasMarks) {\n\t\t\t\tthis._toggleMark(rec);\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/** @ignore */\n\tprivate _itemMenu(e: MouseEvent) {\n\n\t\tlet dom = e.target as HTMLElement,\n\t\t\tself = this.dom;\n\n\t\twhile (dom && dom != self) {\n\t\t\tlet itm = Component.getElement(dom),\n\t\t\t\tid = itm?.getData('row-id');\n\n\t\t\tif (id !== undefined) {\n\t\t\t\tthis._selectItem(id, itm);\n\n\t\t\t\tlet idx = itm.getData('row-idx');\n\t\t\t\tlet rec = this.m_dataview.getByIndex(idx);\n\n\t\t\t\tthis._showItemContextMenu(e, rec);\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdom = dom.parentElement;\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _findItem(id): Component {\n\n\t\tfor (let i = 0; i < this.m_visible_rows.length; i++) {\n\t\t\tlet itm = this.m_visible_rows[i];\n\t\t\tif (itm.getData('row-id') === id) {\n\t\t\t\treturn itm;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * @ignore\n\t * called when an item is selected by mouse\n\t */\n\n\tprotected _selectItem(item: any, dom_item: Component, scrollIntoView?: string) {\n\n\t\tif (this.m_selection !== undefined) {\n\t\t\tlet old = this._findItem(this.m_selection);\n\t\t\tif (old) {\n\t\t\t\told.removeClass('@selected');\n\t\t\t}\n\t\t}\n\n\t\tthis.m_selection = item;\n\n\t\tif (item) {\n\t\t\tif (scrollIntoView) {\n\t\t\t\tthis._scrollIntoView(item, scrollIntoView);\n\t\t\t}\n\n\t\t\tif (!dom_item) {\n\t\t\t\tdom_item = this._findItem(item);\n\t\t\t}\n\n\t\t\tif (dom_item) {\n\t\t\t\tdom_item.addClass('@selected');\n\t\t\t}\n\n\t\t\tlet rec = this.m_dataview.getById(item);\n\t\t\tthis.emit( 'selectionChange', EvSelectionChange(rec));\n\t\t}\n\t\telse {\n\t\t\tthis.emit( 'selectionChange', EvSelectionChange(null));\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprotected _showItemContextMenu(event: MouseEvent, item: Record) {\n\t\tthis.emit( 'contextMenu', EvContextMenu(event,item));\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic clearSelection() {\n\t\tthis._selectItem(null, null);\n\t}\n\n\t/**\n\t * todo: moveto datastore\n\t */\n\n\tpublic exportData(filename) {\n\n\t\tlet data = '';\n\t\tconst fsep = '\\t';\n\t\tconst lsep = '\\r\\n';\n\n\t\tlet rec = '';\n\t\tthis.m_columns.map((col) => {\n\n\t\t\tif (rec.length) {\n\t\t\t\trec += fsep;\n\t\t\t}\n\n\t\t\trec += col.title;\n\t\t});\n\n\t\tdata += rec + lsep;\n\n\t\tlet count = this.m_dataview.count;\n\n\t\tfor (let i = 0; i < count; i++) {\n\n\t\t\tlet record = this.m_dataview.getByIndex(i);\n\n\t\t\trec = '';\n\t\t\tlet cols = this.m_columns.map((col) => {\n\n\t\t\t\tlet text = record.getField(col.id);\n\t\t\t\tlet fmt = col.formatter;\n\n\t\t\t\tif (fmt && fmt instanceof Function) {\n\t\t\t\t\ttext = fmt(text, record);\n\t\t\t\t}\n\n\t\t\t\tif (rec.length > 0) {\n\t\t\t\t\trec += fsep;\n\t\t\t\t}\n\n\t\t\t\trec += text;\n\t\t\t});\n\n\t\t\tdata += rec + lsep;\n\t\t}\n\n\t\t//todo: review that\n\t\tdata = data.replace(/[\u00E0\u00E2\u00E4]/gm, 'a');\n\t\tdata = data.replace(/[\u00E9\u00E8\u00EA]/gm, 'e');\n\t\tdata = data.replace(/[\u00EE\u00EF]/gm, 'i');\n\t\tdata = data.replace(/[\u00FB\u00FC\u00F9]/gm, 'u');\n\t\tdata = data.replace(/\u202F/gm, ' '); \t// non breaking space\n\n\t\tdownloadData(data, 'text/csv', filename);\n\t}\n\n\tset empty_text(text: string | HtmlString) {\n\t\tthis.m_empty_msg.text = text;\n\t}\n\n\tprivate _renderCheck(rec: Record) {\n\t\tlet icon = '--x4-icon-square';\n\t\tif (this.m_marks.has(rec.getID())) {\n\t\t\ticon = '--x4-icon-square-check';\n\t\t}\n\n\t\treturn new Icon({ icon: `var(${icon})` });\n\t}\n\n\tprivate _toggleMark(rec: Record) {\n\n\t\tlet id = rec.getID();\n\t\tlet chk = false;\n\n\t\tif (this.m_marks.has(id)) {\n\t\t\tthis.m_marks.delete(id);\n\t\t}\n\t\telse {\n\t\t\tthis.m_marks.add(id);\n\t\t\tchk = true;\n\t\t}\n\n\t\tthis.emit( 'gridCheck', EvGridCheck(rec, chk));\n\t\tthis._buildItems( false );\n\t}\n\n\tpublic getMarks(): any[] {\n\t\tlet ids = [];\n\t\tfor (const v of this.m_marks.values()) {\n\t\t\tids.push(v);\n\t\t}\n\n\t\treturn ids;\n\t}\n\n\tpublic clearMarks() {\n\t\tif (this.m_marks.size) {\n\t\t\tthis.m_marks = new Set<any>();\n\t\t\tthis._buildItems( false );\n\t\t}\n\t}\n\n\tpublic setFooterData( rec: any ) {\n\t\tif( !this.m_footer ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.m_footer.enumChilds( (c) => {\n\t\t\tlet cid = c.getData( 'col' );\n\t\t\tif( cid ) {\n\t\t\t\tlet col = this.m_columns[cid];\n\n\t\t\t\tlet value = rec[col.id];\n\t\t\t\tif( value!==undefined ) {\n\t\t\t\t\tif( isFunction(value) ) {\t// FooterRenderer\n\t\t\t\t\t\tvalue( c );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tlet text;\n\t\t\t\t\t\tconst fmt = col.formatter;\n\t\t\t\t\t\tif (fmt && fmt instanceof Function) {\n\t\t\t\t\t\t\ttext = fmt(value, rec);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\ttext = value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tc.setContent( text, false );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n\n", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file link.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Component, CProps, CEventMap, isHtmlString, HtmlString, html } from './component'\nimport { EvClick, EventCallback } from './x4events'\n\n// ============================================================================\n// [LINK]\n// ============================================================================\n\ninterface LinkEventMap extends CEventMap {\n\tclick: EvClick;\n}\n\nexport interface LinkProps extends CProps<LinkEventMap> {\n\ttext?: string | HtmlString;\n\thref?: string;\n\ttarget?: string;\n\tclick?: EventCallback<EvClick>;\t// shortcut to event { click: ... }\n}\n\n\n/**\n * Standard Link\n */\n\nexport class Link extends Component<LinkProps, LinkEventMap>\n{\n\tconstructor(props?: LinkProps) {\n\t\tsuper(props);\n\n\t\tthis.setDomEvent('click', () => this._handleClick());\n\t\tthis.mapPropEvents(props, 'click');\n\t}\n\n\tprivate _handleClick() {\n\t\tthis.emit('click', EvClick());\n\t}\n\n\t/** @ignore */\n\trender(props: LinkProps) {\n\n\t\tlet text = props.text ?? '';\n\t\tlet href = props.href ?? '#';\n\n\t\tthis.setTag( 'a');\n\t\tthis.setAttribute('tabindex', 0);\n\t\tthis.setAttribute('href', href);\n\t\tthis.setAttribute('target', props.target);\n\n\t\tif( text ) {\n\t\t\tthis.setContent(isHtmlString(text) ? text : html`<span>${text}</span>`);\n\t\t}\n\t}\n\n\tset text( text: string | HtmlString ) {\n\t\tthis.m_props.text = text;\n\t\tthis.update( );\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file md5.ts\n* @author Etienne Cochard \n* @license\n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\n/*\nTypeScript Md5\n==============\nBased on work by\n* Joseph Myers: http://www.myersdaily.org/joseph/javascript/md5-text.html\n* Andr\u00E9 Cruz: https://github.com/satazor/SparkMD5\n* Raymond Hill: https://github.com/gorhill/yamd5.js\nEffectively a TypeScrypt re-write of Raymond Hill JS Library\nThe MIT License (MIT)\nCopyright (C) 2014 Raymond Hill\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n\nexport class Md5 {\n\n // One time hashing functions\n public static hashStr(str: string, raw?: false): string\n public static hashStr(str: string, raw?: true): Int32Array\n public static hashStr(str: string, raw: boolean = false) {\n return this.onePassHasher\n .start()\n .appendStr(str)\n .end(raw);\n }\n\n public static hashAsciiStr(str: string, raw?: false): string\n public static hashAsciiStr(str: string, raw?: true): Int32Array\n public static hashAsciiStr(str: string, raw: boolean = false) {\n return this.onePassHasher\n .start()\n .appendAsciiStr(str)\n .end(raw);\n }\n // Private Static Variables\n private static stateIdentity = new Int32Array([1732584193, -271733879, -1732584194, 271733878]);\n private static buffer32Identity = new Int32Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);\n private static hexChars = '0123456789abcdef';\n private static hexOut: string[] = [];\n\n // Permanent instance is to use for one-call hashing\n private static onePassHasher = new Md5();\n\n private static _hex(x: any): string {\n const hc = Md5.hexChars;\n const ho = Md5.hexOut;\n let n;\n let offset;\n let j;\n let i;\n\n for (i = 0; i < 4; i += 1) {\n offset = i * 8;\n n = x[i];\n for (j = 0; j < 8; j += 2) {\n ho[offset + 1 + j] = hc.charAt(n & 0x0F);\n n >>>= 4;\n ho[offset + 0 + j] = hc.charAt(n & 0x0F);\n n >>>= 4;\n }\n }\n return ho.join('');\n }\n\n private static _md5cycle(x: Int32Array|Uint32Array, k: Int32Array|Uint32Array) {\n let a = x[0];\n let b = x[1];\n let c = x[2];\n let d = x[3];\n // ff()\n a += (b & c | ~b & d) + k[0] - 680876936 | 0;\n a = (a << 7 | a >>> 25) + b | 0;\n d += (a & b | ~a & c) + k[1] - 389564586 | 0;\n d = (d << 12 | d >>> 20) + a | 0;\n c += (d & a | ~d & b) + k[2] + 606105819 | 0;\n c = (c << 17 | c >>> 15) + d | 0;\n b += (c & d | ~c & a) + k[3] - 1044525330 | 0;\n b = (b << 22 | b >>> 10) + c | 0;\n a += (b & c | ~b & d) + k[4] - 176418897 | 0;\n a = (a << 7 | a >>> 25) + b | 0;\n d += (a & b | ~a & c) + k[5] + 1200080426 | 0;\n d = (d << 12 | d >>> 20) + a | 0;\n c += (d & a | ~d & b) + k[6] - 1473231341 | 0;\n c = (c << 17 | c >>> 15) + d | 0;\n b += (c & d | ~c & a) + k[7] - 45705983 | 0;\n b = (b << 22 | b >>> 10) + c | 0;\n a += (b & c | ~b & d) + k[8] + 1770035416 | 0;\n a = (a << 7 | a >>> 25) + b | 0;\n d += (a & b | ~a & c) + k[9] - 1958414417 | 0;\n d = (d << 12 | d >>> 20) + a | 0;\n c += (d & a | ~d & b) + k[10] - 42063 | 0;\n c = (c << 17 | c >>> 15) + d | 0;\n b += (c & d | ~c & a) + k[11] - 1990404162 | 0;\n b = (b << 22 | b >>> 10) + c | 0;\n a += (b & c | ~b & d) + k[12] + 1804603682 | 0;\n a = (a << 7 | a >>> 25) + b | 0;\n d += (a & b | ~a & c) + k[13] - 40341101 | 0;\n d = (d << 12 | d >>> 20) + a | 0;\n c += (d & a | ~d & b) + k[14] - 1502002290 | 0;\n c = (c << 17 | c >>> 15) + d | 0;\n b += (c & d | ~c & a) + k[15] + 1236535329 | 0;\n b = (b << 22 | b >>> 10) + c | 0;\n // gg()\n a += (b & d | c & ~d) + k[1] - 165796510 | 0;\n a = (a << 5 | a >>> 27) + b | 0;\n d += (a & c | b & ~c) + k[6] - 1069501632 | 0;\n d = (d << 9 | d >>> 23) + a | 0;\n c += (d & b | a & ~b) + k[11] + 643717713 | 0;\n c = (c << 14 | c >>> 18) + d | 0;\n b += (c & a | d & ~a) + k[0] - 373897302 | 0;\n b = (b << 20 | b >>> 12) + c | 0;\n a += (b & d | c & ~d) + k[5] - 701558691 | 0;\n a = (a << 5 | a >>> 27) + b | 0;\n d += (a & c | b & ~c) + k[10] + 38016083 | 0;\n d = (d << 9 | d >>> 23) + a | 0;\n c += (d & b | a & ~b) + k[15] - 660478335 | 0;\n c = (c << 14 | c >>> 18) + d | 0;\n b += (c & a | d & ~a) + k[4] - 405537848 | 0;\n b = (b << 20 | b >>> 12) + c | 0;\n a += (b & d | c & ~d) + k[9] + 568446438 | 0;\n a = (a << 5 | a >>> 27) + b | 0;\n d += (a & c | b & ~c) + k[14] - 1019803690 | 0;\n d = (d << 9 | d >>> 23) + a | 0;\n c += (d & b | a & ~b) + k[3] - 187363961 | 0;\n c = (c << 14 | c >>> 18) + d | 0;\n b += (c & a | d & ~a) + k[8] + 1163531501 | 0;\n b = (b << 20 | b >>> 12) + c | 0;\n a += (b & d | c & ~d) + k[13] - 1444681467 | 0;\n a = (a << 5 | a >>> 27) + b | 0;\n d += (a & c | b & ~c) + k[2] - 51403784 | 0;\n d = (d << 9 | d >>> 23) + a | 0;\n c += (d & b | a & ~b) + k[7] + 1735328473 | 0;\n c = (c << 14 | c >>> 18) + d | 0;\n b += (c & a | d & ~a) + k[12] - 1926607734 | 0;\n b = (b << 20 | b >>> 12) + c | 0;\n // hh()\n a += (b ^ c ^ d) + k[5] - 378558 | 0;\n a = (a << 4 | a >>> 28) + b | 0;\n d += (a ^ b ^ c) + k[8] - 2022574463 | 0;\n d = (d << 11 | d >>> 21) + a | 0;\n c += (d ^ a ^ b) + k[11] + 1839030562 | 0;\n c = (c << 16 | c >>> 16) + d | 0;\n b += (c ^ d ^ a) + k[14] - 35309556 | 0;\n b = (b << 23 | b >>> 9) + c | 0;\n a += (b ^ c ^ d) + k[1] - 1530992060 | 0;\n a = (a << 4 | a >>> 28) + b | 0;\n d += (a ^ b ^ c) + k[4] + 1272893353 | 0;\n d = (d << 11 | d >>> 21) + a | 0;\n c += (d ^ a ^ b) + k[7] - 155497632 | 0;\n c = (c << 16 | c >>> 16) + d | 0;\n b += (c ^ d ^ a) + k[10] - 1094730640 | 0;\n b = (b << 23 | b >>> 9) + c | 0;\n a += (b ^ c ^ d) + k[13] + 681279174 | 0;\n a = (a << 4 | a >>> 28) + b | 0;\n d += (a ^ b ^ c) + k[0] - 358537222 | 0;\n d = (d << 11 | d >>> 21) + a | 0;\n c += (d ^ a ^ b) + k[3] - 722521979 | 0;\n c = (c << 16 | c >>> 16) + d | 0;\n b += (c ^ d ^ a) + k[6] + 76029189 | 0;\n b = (b << 23 | b >>> 9) + c | 0;\n a += (b ^ c ^ d) + k[9] - 640364487 | 0;\n a = (a << 4 | a >>> 28) + b | 0;\n d += (a ^ b ^ c) + k[12] - 421815835 | 0;\n d = (d << 11 | d >>> 21) + a | 0;\n c += (d ^ a ^ b) + k[15] + 530742520 | 0;\n c = (c << 16 | c >>> 16) + d | 0;\n b += (c ^ d ^ a) + k[2] - 995338651 | 0;\n b = (b << 23 | b >>> 9) + c | 0;\n // ii()\n a += (c ^ (b | ~d)) + k[0] - 198630844 | 0;\n a = (a << 6 | a >>> 26) + b | 0;\n d += (b ^ (a | ~c)) + k[7] + 1126891415 | 0;\n d = (d << 10 | d >>> 22) + a | 0;\n c += (a ^ (d | ~b)) + k[14] - 1416354905 | 0;\n c = (c << 15 | c >>> 17) + d | 0;\n b += (d ^ (c | ~a)) + k[5] - 57434055 | 0;\n b = (b << 21 | b >>> 11) + c | 0;\n a += (c ^ (b | ~d)) + k[12] + 1700485571 | 0;\n a = (a << 6 | a >>> 26) + b | 0;\n d += (b ^ (a | ~c)) + k[3] - 1894986606 | 0;\n d = (d << 10 | d >>> 22) + a | 0;\n c += (a ^ (d | ~b)) + k[10] - 1051523 | 0;\n c = (c << 15 | c >>> 17) + d | 0;\n b += (d ^ (c | ~a)) + k[1] - 2054922799 | 0;\n b = (b << 21 | b >>> 11) + c | 0;\n a += (c ^ (b | ~d)) + k[8] + 1873313359 | 0;\n a = (a << 6 | a >>> 26) + b | 0;\n d += (b ^ (a | ~c)) + k[15] - 30611744 | 0;\n d = (d << 10 | d >>> 22) + a | 0;\n c += (a ^ (d | ~b)) + k[6] - 1560198380 | 0;\n c = (c << 15 | c >>> 17) + d | 0;\n b += (d ^ (c | ~a)) + k[13] + 1309151649 | 0;\n b = (b << 21 | b >>> 11) + c | 0;\n a += (c ^ (b | ~d)) + k[4] - 145523070 | 0;\n a = (a << 6 | a >>> 26) + b | 0;\n d += (b ^ (a | ~c)) + k[11] - 1120210379 | 0;\n d = (d << 10 | d >>> 22) + a | 0;\n c += (a ^ (d | ~b)) + k[2] + 718787259 | 0;\n c = (c << 15 | c >>> 17) + d | 0;\n b += (d ^ (c | ~a)) + k[9] - 343485551 | 0;\n b = (b << 21 | b >>> 11) + c | 0;\n\n x[0] = a + x[0] | 0;\n x[1] = b + x[1] | 0;\n x[2] = c + x[2] | 0;\n x[3] = d + x[3] | 0;\n }\n\n private _dataLength: number;\n private _bufferLength: number;\n\n private _state: Int32Array = new Int32Array(4);\n private _buffer: ArrayBuffer = new ArrayBuffer(68);\n private _buffer8: Uint8Array;\n private _buffer32: Uint32Array;\n\n constructor() {\n this._buffer8 = new Uint8Array(this._buffer, 0, 68);\n this._buffer32 = new Uint32Array(this._buffer, 0, 17);\n this.start();\n }\n\n public start() {\n this._dataLength = 0;\n this._bufferLength = 0;\n this._state.set(Md5.stateIdentity);\n return this;\n }\n\n // Char to code point to to array conversion:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt\n // #Example.3A_Fixing_charCodeAt_to_handle_non-Basic-Multilingual-Plane_characters_if_their_presence_earlier_in_the_string_is_unknown\n public appendStr(str: string) {\n const buf8 = this._buffer8;\n const buf32 = this._buffer32;\n let bufLen = this._bufferLength;\n let code;\n let i;\n\n for (i = 0; i < str.length; i += 1) {\n code = str.charCodeAt(i);\n if (code < 128) {\n buf8[bufLen++] = code;\n } else if (code < 0x800) {\n buf8[bufLen++] = (code >>> 6) + 0xC0;\n buf8[bufLen++] = code & 0x3F | 0x80;\n } else if (code < 0xD800 || code > 0xDBFF) {\n buf8[bufLen++] = (code >>> 12) + 0xE0;\n buf8[bufLen++] = (code >>> 6 & 0x3F) | 0x80;\n buf8[bufLen++] = (code & 0x3F) | 0x80;\n } else {\n code = ((code - 0xD800) * 0x400) + (str.charCodeAt(++i) - 0xDC00) + 0x10000;\n if (code > 0x10FFFF) {\n throw new Error('Unicode standard supports code points up to U+10FFFF');\n }\n buf8[bufLen++] = (code >>> 18) + 0xF0;\n buf8[bufLen++] = (code >>> 12 & 0x3F) | 0x80;\n buf8[bufLen++] = (code >>> 6 & 0x3F) | 0x80;\n buf8[bufLen++] = (code & 0x3F) | 0x80;\n }\n if (bufLen >= 64) {\n this._dataLength += 64;\n Md5._md5cycle(this._state, buf32);\n bufLen -= 64;\n buf32[0] = buf32[16];\n }\n }\n this._bufferLength = bufLen;\n return this;\n }\n\n public appendAsciiStr(str: string) {\n const buf8 = this._buffer8;\n const buf32 = this._buffer32;\n let bufLen = this._bufferLength;\n let i;\n let j = 0;\n\n for (; ;) {\n i = Math.min(str.length - j, 64 - bufLen);\n while (i--) {\n buf8[bufLen++] = str.charCodeAt(j++);\n }\n if (bufLen < 64) {\n break;\n }\n this._dataLength += 64;\n Md5._md5cycle(this._state, buf32);\n bufLen = 0;\n }\n this._bufferLength = bufLen;\n return this;\n }\n\n public appendByteArray(input: Uint8Array) {\n const buf8 = this._buffer8;\n const buf32 = this._buffer32;\n let bufLen = this._bufferLength;\n let i;\n let j = 0;\n\n for (; ;) {\n i = Math.min(input.length - j, 64 - bufLen);\n while (i--) {\n buf8[bufLen++] = input[j++];\n }\n if (bufLen < 64) {\n break;\n }\n this._dataLength += 64;\n Md5._md5cycle(this._state, buf32);\n bufLen = 0;\n }\n this._bufferLength = bufLen;\n return this;\n }\n\n public getState() {\n const self = this;\n const s = self._state;\n\n return {\n\t\t\t//@ts-ignore\n buffer: String.fromCharCode.apply(null, self._buffer8),\n buflen: self._bufferLength,\n length: self._dataLength,\n state: [s[0], s[1], s[2], s[3]]\n };\n }\n\n public setState(state: any) {\n const buf = state.buffer;\n const x = state.state;\n const s = this._state;\n let i;\n\n this._dataLength = state.length;\n this._bufferLength = state.buflen;\n s[0] = x[0];\n s[1] = x[1];\n s[2] = x[2];\n s[3] = x[3];\n\n for (i = 0; i < buf.length; i += 1) {\n this._buffer8[i] = buf.charCodeAt(i);\n }\n }\n\n public end(raw: boolean = false) {\n const bufLen = this._bufferLength;\n const buf8 = this._buffer8;\n const buf32 = this._buffer32;\n const i = (bufLen >> 2) + 1;\n let dataBitsLen;\n\n this._dataLength += bufLen;\n\n buf8[bufLen] = 0x80;\n buf8[bufLen + 1] = buf8[bufLen + 2] = buf8[bufLen + 3] = 0;\n buf32.set(Md5.buffer32Identity.subarray(i), i);\n\n if (bufLen > 55) {\n Md5._md5cycle(this._state, buf32);\n buf32.set(Md5.buffer32Identity);\n }\n\n // Do the final computation based on the tail and length\n // Beware that the final length may not fit in 32 bits so we take care of that\n dataBitsLen = this._dataLength * 8;\n if (dataBitsLen <= 0xFFFFFFFF) {\n buf32[14] = dataBitsLen;\n } else {\n const matches = dataBitsLen.toString(16).match(/(.*?)(.{0,8})$/);\n if (matches === null) {\n return;\n }\n\n const lo = parseInt(matches[2], 16);\n const hi = parseInt(matches[1], 16) || 0;\n\n buf32[14] = lo;\n buf32[15] = hi;\n }\n\n Md5._md5cycle(this._state, buf32);\n\n return raw ? this._state : Md5._hex(this._state);\n }\n}\n\n/*\nif (Md5.hashStr('hello') !== '5d41402abc4b2a76b9719d911017c592') {\n console.error('Md5 self test failed.');\n}\n*/", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file messagebox.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Dialog, DialogProps, EvBtnClick } from './dialog'\nimport { FormButtons } from './form'\nimport { asap, HtmlString, isHtmlString, isString } from './tools'\nimport { HLayout } from './layout'\nimport { Icon, IconID } from './icon'\nimport { Label } from './label'\nimport { TextEdit } from './textedit'\n\n/**\n * [ MESSAGEBOX ] -----------------------------------------------------------------\n */\n\nexport interface MessageBoxProps extends DialogProps {\n\tmessage: string | HtmlString;\t// always allow html\n\tclick: (button: string) => void;\n}\n\nexport class MessageBox extends Dialog<MessageBoxProps>\n{\n\tm_label: Label;\n\n\tconstructor(props: MessageBoxProps) {\n\n\t\t// remove overloaded elements from DialogBoxProps\n\t\tlet icon = props.icon ?? 'var( --x4-icon-exclamation )';\t// todo: resolve that\n\t\tprops.icon = undefined;\n\n\t\tlet buttons: FormButtons = props.buttons === undefined ? ['ok'] : props.buttons;\n\t\tprops.buttons = undefined;\n\n\t\tsuper(props);\n\n\t\tlet msg = props.message;\n\n\t\tthis.form.updateContent(new HLayout({\n\t\t\tstyle: { padding: 8 },\n\t\t\tcontent: [\n\t\t\t\ticon ? new Icon({ cls: 'icon', icon }) : null,\n\t\t\t\tthis.m_label = new Label({ cls: 'text', text: msg, multiline: true })\n\t\t\t]\n\t\t}), buttons);\n\n\t\tthis.on('btnClick', (ev: EvBtnClick) => {\n\t\t\t// no prevent default -> always close the messagebox\n\t\t\tif (!this.m_props.click) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tasap(() => {\n\t\t\t\tthis.m_props.click( ev.button );\n\t\t\t});\n\t\t});\n\t}\n\n\tset text(txt: string | HtmlString) {\n\t\tthis.m_label.text = txt;\n\t}\n\n\n\t/**\n\t * display a messagebox\n\t */\n\n\tstatic show(props: string | HtmlString | MessageBoxProps): MessageBox {\n\n\t\tlet msg;\n\n\t\tif (isString(props) || isHtmlString(props)) {\n\t\t\tmsg = new MessageBox({ message: props, click: () => { } });\n\t\t}\n\t\telse {\n\t\t\tmsg = new MessageBox(props);\n\t\t}\n\n\t\tmsg.show();\n\t\treturn msg;\n\t}\n\n\tstatic async showAsync( props: string | HtmlString | MessageBoxProps): Promise<string> {\n\t\treturn new Promise( (resolve, reject ) => {\n\t\t\t\n\t\t\tlet _props: MessageBoxProps;\n\n\t\t\tconst cb = ( btn: string ) => {\n\t\t\t\tresolve( btn );\n\t\t\t}\n\n\t\t\tif (isString(props) || isHtmlString(props)) {\n\t\t\t\t_props = { message: props, click: cb };\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_props = { ...props, click: cb };\n\t\t\t}\n\n\t\t\tconst msg = new MessageBox(_props);\n\t\t\tmsg.show();\n\t\t});\n\t}\n\n\t/**\n\t * display an alert message\n\t */\n\n\tstatic alert(text: string | HtmlString, title: string = null) {\n\t\tnew MessageBox({\n\t\t\tcls: 'warning',\n\t\t\ttitle,\n\t\t\tmessage: text,\n\t\t\tbuttons: ['ok'],\n\t\t\tclick: () => { },\n\t\t}).show();\n\t}\n}\n\n\n// :: PrompDialogBox ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\nexport interface PromptBoxProps extends DialogProps {\n\tmessage: string | HtmlString;\n\tvalue?: string;\t\t// default input value\n\ticon?: IconID;\n\n\tclick: (value: string) => void;\n}\n\nexport class PromptDialogBox extends Dialog<PromptBoxProps> {\n\n\tm_edit: TextEdit;\n\n\tconstructor(props: PromptBoxProps) {\n\n\t\t// remove overloaded elements from DialogBoxProps\n\t\t//let icon = props.icon;\t// ?? 'cls(far fa-comment-check)';\t// todo: resolve that\n\t\t//props.icon = undefined;\n\t\tprops.buttons = undefined;\n\n\t\tprops.width = props.width ?? 500;\n\t\tsuper(props);\n\n\t\tthis.form.updateContent(\n\t\t\tnew HLayout({\n\t\t\t\tcls: 'panel',\n\t\t\t\tcontent: [\n\t\t\t\t\t//icon ? new Icon({\n\t\t\t\t\t//\tcls: 'icon',\n\t\t\t\t\t//\ticon: icon\n\t\t\t\t\t//}) : null,\n\t\t\t\t\tthis.m_edit = new TextEdit({\n\t\t\t\t\t\tflex: 1,\n\t\t\t\t\t\tautoFocus: true,\n\t\t\t\t\t\tlabel: props.message,\n\t\t\t\t\t\tvalue: props.value\n\t\t\t\t\t}),\n\t\t\t\t]\n\t\t\t}),\n\t\t\t['ok', 'cancel']\n\t\t);\n\n\t\tif (props.click) {\n\t\t\tthis.on('btnClick', (ev: EvBtnClick) => {\n\n\t\t\t\tif (ev.button === 'ok') {\n\t\t\t\t\t// no prevent default -> always close the messagebox\n\t\t\t\t\t// asap to allow\n\t\t\t\t\tasap(() => {\n\t\t\t\t\t\tthis.m_props.click(this.m_edit.value);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tset text(txt: string | HtmlString) {\n\t\tthis.m_edit.label = txt;\n\t}\n\n\t/**\n\t * display a messagebox\n\t */\n\n\tstatic show(props: string | HtmlString | PromptBoxProps, inputCallback?: (input: string) => void): PromptBoxProps {\n\n\t\tlet msg;\n\n\t\tif (isString(props) || isHtmlString(props)) {\n\t\t\tmsg = new PromptDialogBox({ message: props, click: inputCallback });\n\t\t}\n\t\telse {\n\t\t\tmsg = new PromptDialogBox(props);\n\t\t}\n\n\t\tmsg.show();\n\t\treturn msg;\n\t}\n}\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file panel.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Component, CProps, ComponentContent, ContainerProps, ContainerEventMap } from './component'\nimport { VLayout, HLayout } from './layout'\nimport { Label } from './label'\nimport { Icon, IconID } from './icon';\n\n// ============================================================================\n// [PANEL]\n// ============================================================================\n\nexport interface PanelProps<E extends ContainerEventMap = ContainerEventMap> extends ContainerProps<E> {\n\ticon?: IconID;\n\ttitle: string;\n\tgadgets?: Component[];\n\tsens?: 'horizontal' | 'vertical';\t// vertical by default\n\tbodyStyle?: any;\n}\n\nexport class Panel<T extends PanelProps = PanelProps, E extends ContainerEventMap = ContainerEventMap> extends VLayout<T,E> {\n\tprivate m_ui_title: Label;\n\tprivate m_ui_body: Component;\n\t\n\tconstructor( props: T ) {\n\t\tsuper( props );\n\n\t\tconst sens = props?.sens=='horizontal' ? '@hlayout' : '@vlayout';\n\n\t\t//todo: cannot be called twice do to content overload\n\t\tthis.m_ui_title = new Label({cls: 'title', text: this.m_props.title});\n\t\tthis.m_ui_body = new Component( { cls: 'body '+sens, content: this.m_props.content, style: props.bodyStyle } );\n\t}\n\n\t/** @ignore */\t\n\trender( ) {\n\t\tconst gadgets = this.m_props.gadgets ?? [];\n\t\tconst icon = this.m_props.icon ? new Icon( { icon: this.m_props.icon}) : null;\n\n\t\tsuper.setContent( [ \n\t\t\tnew HLayout( {\n\t\t\t\tcls: 'title',\n\t\t\t\tcontent: [\n\t\t\t\t\ticon,\n\t\t\t\t\tthis.m_ui_title, \n\t\t\t\t\t...gadgets\n\t\t\t\t]\n\t\t\t}),\n\t\t\tthis.m_ui_body\n\t\t] );\n\t}\n\n\tsetContent( els: ComponentContent ) {\n\t\tthis.m_ui_body.setContent( els );\n\t}\n\n\tset title( text: string ) {\n\t\tthis.m_ui_title.text = text;\n\t}\n}\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file spreadsheet.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\n\nimport { Component, SizerOverlay, EvDblClick, EvSize, ContainerEventMap, ContainerProps } from './component'\nimport { Input, InputProps } from './input';\nimport { HLayout, VLayout } from './layout';\nimport { TextEditProps, TextEdit } from './textedit';\nimport { FormatFunc } from './formatters'\nimport { asap, parseIntlFloat } from './tools';\nimport { deferCall } from './tools';\nimport { EvContextMenu, EvChange, EvSelectionChange, EventCallback } from './x4events'\nimport { ComboBox } from './combobox';\n\n\nexport interface EditorFactory {\n\t(props: InputProps, row: number, col: number) : Component;\n}\n\n\n\n/**\n * \n */\nexport interface ColProp {\n\ttitle: string;\n\twidth: number;\n\tformatter?: string;\n\talign?: string;\n\tcls?: string;\n\tmin_width?: number;\n\trenderer?: FormatFunc;\n\tcreateEditor?: EditorFactory;\t\t// null => disable edition\n}\n\nclass CellData {\n\ttext: string;\n\tcls?: string;\n\n\tstatic empty_cell: CellData = {\n\t\ttext: ''\n\t}\n}\n\n/**\n * \n */\n\nexport interface SpreadsheetEventSet extends ContainerEventMap {\n\tchange?: EvChange;\n\tdblClick?: EvDblClick;\n\tselectionChange?: EvSelectionChange;\n\tcontextMenu?: EvContextMenu;\n}\n\n\n/**\n * \n */\n\nexport interface SpreadsheetProps extends ContainerProps {\n\tcolumns: ColProp[];\n\tmaxrows?: number;\n\tautoedit?: boolean;\n\n\tchange?: EventCallback<EvChange>;\t// shortcut to event { change: ... }\n\tdblClick?: EventCallback<EvDblClick>;// shortcut to event { dblclick: ... }\n\tselectionChange?: EventCallback<EvSelectionChange>;// shortcut to event { selectionChange: ... }\n\tcontextMenu?: EventCallback<EvContextMenu>;// shortcut to event { contextMenu: ... }\n}\n\n\n/**\n * \n */\n\nexport class Spreadsheet extends VLayout<SpreadsheetProps, SpreadsheetEventSet> {\n\n\tprivate m_columns: ColProp[];\n\tprivate m_row_limit: number;\n\tprivate m_cells_data: Map<number, CellData>;\n\tprivate m_rows_data: Map<number, string>;\n\n\tprotected m_view: Component;\n\tprotected m_container: Component;\n\tprotected m_header: Component;\n\n\tprivate m_itemHeight: number;\n\tprivate m_topIndex: number;\n\n\tprivate m_visible_cells: Map<number, Component>;\n\tprivate m_row_count: number;\t// visible row count\n\n\tprivate m_selection: { row: number, col: number };\n\tprivate m_editor: Component;\n\tprivate m_autoedit: boolean;\n\tprivate m_lockupdate: number;\n\tprivate m_auto_row_count: boolean;\n\n\tprivate m_recycler: Component[];\n\tprivate m_used_cells: Component[];\n\n\tconstructor(props: SpreadsheetProps) {\n\t\tsuper(props);\n\n\t\tthis.m_columns = props.columns;\n\t\tthis.m_autoedit = props.autoedit;\n\t\tthis.m_lockupdate = 0;\n\n\t\tthis.m_cells_data = new Map<number, CellData>();\n\t\tthis.m_rows_data = new Map<number, string>();\n\t\tthis.m_itemHeight = 0;\n\t\tthis.m_selection = { row: 0, col: 0 };\n\t\tthis.m_row_count = 0;\n\t\tthis.m_auto_row_count = false;\n\t\tthis.m_recycler = [];\n\t\tthis.m_used_cells = [];\n\n\t\tif (props.maxrows === undefined) {\n\t\t\tthis.m_row_limit = 0;\n\t\t\tthis.m_auto_row_count = true;\n\t\t}\n\t\telse if (props.maxrows < 0) {\n\t\t\tthis.m_row_limit = 0;\n\t\t\tthis.m_auto_row_count = true;\n\t\t}\n\t\telse {\n\t\t\tthis.m_row_limit = props.maxrows;\n\t\t}\n\n\t\tthis.setAttribute('tabindex', 0);\n\n\t\tthis.setDomEvent('click', (e) => this._itemClick(e) );\n\t\tthis.setDomEvent('dblclick', (e) => this._itemDblClick(e) );\n\t\tthis.setDomEvent('keydown', (e) => this._handleKey(e) );\n\t\tthis.setDomEvent('keypress', (e) => this._keyPress(e) );\n\t\tthis.setDomEvent('focus', () => this._focus(true));\n\t\tthis.setDomEvent('focusout', () => this._focus(false));\n\t\tthis.setDomEvent('contextmenu', (e) => this._ctxMenu(e));\n\t\t\n\t\tthis.mapPropEvents( props, 'dblClick', 'selectionChange', 'contextMenu', 'change' );\n\t}\n\n\tcomponentCreated() {\n\t\tsuper.componentCreated( );\n\t\tthis._updateScroll(true);\n\t}\n\n\tsetColWidth(col: number, width: number) {\n\t\tthis._on_col_resize(col, width);\n\t\tthis.update(10);\n\t}\n\n\tgetColWidth(col: number): number {\n\t\tif (!this.m_columns[col]) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this.m_columns[col].width;\n\t}\n\n\tsetColTitle(col: number, title: string) {\n\t\tconsole.assert(this.m_columns[col] !== undefined); // what ?\n\t\tthis.m_columns[col].title = title;\n\t\tthis.update(10);\n\t}\n\n\t/**\n\t * reset the spreadsheet\n\t * @param columns \n\t */\n\treset(columns?: ColProp[]) {\n\t\tif( columns ) {\n\t\t\tthis.m_columns = columns;\n\t\t}\n\t\t\n\t\tthis.m_cells_data = new Map<number, CellData>();\n\t\tthis.m_rows_data = new Map<number, string>();\n\t\tthis.update(10);\n\t}\n\n\t/**\n\t * insert a row\n\t * @param before row number before wich insert the new row \n\t */\n\n\tpublic insertRow(before: number) {\n\n\t\tlet new_cells_data = new Map<number, CellData>();\n\t\tthis.m_cells_data.forEach((celldata, key) => {\n\n\t\t\tlet { row, col } = _getid(key);\n\n\t\t\tif (row >= before) {\n\t\t\t\tnew_cells_data.set(_mkid(row + 1, col), celldata);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tnew_cells_data.set(key, celldata);\n\t\t\t}\n\t\t});\n\n\t\tlet new_rows_data = new Map<number, string>();\n\t\tthis.m_rows_data.forEach((rowdata, row) => {\n\n\t\t\tif (row >= before) {\n\t\t\t\tnew_rows_data.set(row + 1, rowdata);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tnew_rows_data.set(row, rowdata);\n\t\t\t}\n\t\t});\n\n\t\tthis.m_cells_data = new_cells_data;\n\t\tthis.m_rows_data = new_rows_data;\n\n\t\tthis._buildItems();\n\t}\n\n\t/**\n\t * remove a row\n\t * @param rowtodel row number to remove\n\t */\n\n\tpublic deleteRow(rowtodel: number) {\n\t\tlet new_cells_data = new Map<number, CellData>();\n\t\tlet new_rows_data = new Map<number, string>();\n\n\t\tthis.m_cells_data.forEach((celldata, key) => {\n\n\t\t\tlet { row, col } = _getid(key);\n\n\t\t\tif (row > rowtodel) {\n\t\t\t\tnew_cells_data.set(_mkid(row - 1, col), celldata);\n\t\t\t}\n\t\t\telse if (row < rowtodel) {\n\t\t\t\tnew_cells_data.set(key, celldata);\n\t\t\t}\n\t\t});\n\n\t\tthis.m_rows_data.forEach((rowdata, row) => {\n\n\t\t\tif (row > rowtodel) {\n\t\t\t\tnew_rows_data.set(row - 1, rowdata);\n\t\t\t}\n\t\t\telse if (row < rowtodel) {\n\t\t\t\tnew_rows_data.set(row, rowdata);\n\t\t\t}\n\t\t});\n\n\t\tthis.m_cells_data = new_cells_data;\n\t\tthis.m_rows_data = new_rows_data;\n\n\t\tthis._buildItems();\n\t}\n\n\t/**\n\t * insert a new column\n\t * @param before column index before to insert the new column or <0 to append\n\t */\n\n\tpublic insertCol(before: number, column: ColProp) {\n\n\t\tlet inspos = before;\n\t\tif (inspos < 0) {\n\t\t\tinspos = this.m_columns.length + 1;\n\t\t}\n\n\t\t// insert the col at the right place\n\t\tthis.m_columns.splice(inspos, 0, column);\n\n\t\tif (before >= 0) {\n\t\t\tlet new_cells_data = new Map<number, CellData>();\n\n\t\t\tthis.m_cells_data.forEach((celldata, key) => {\n\n\t\t\t\tlet { row, col } = _getid(key);\n\n\t\t\t\tif (col >= before) {\n\t\t\t\t\tnew_cells_data.set(_mkid(row, col + 1), celldata);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tnew_cells_data.set(key, celldata);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.m_cells_data = new_cells_data;\n\t\t}\n\n\t\tthis.update();\n\t}\n\n\t/**\n\t * remove a column\n\t * @param coltodel \n\t */\n\n\tpublic deleteCol(coltodel: number) {\n\n\t\t// insert the col at the right place\n\t\tthis.m_columns.splice(coltodel, 1);\n\n\t\tlet new_cells_data = new Map<number, CellData>();\n\t\tthis.m_cells_data.forEach((celldata, key) => {\n\n\t\t\tlet { row, col } = _getid(key);\n\n\t\t\tif (col > coltodel) {\n\t\t\t\tnew_cells_data.set(_mkid(row, col - 1), celldata);\n\t\t\t}\n\t\t\telse if (col < coltodel) {\n\t\t\t\tnew_cells_data.set(key, celldata);\n\t\t\t}\n\t\t});\n\n\t\tthis.m_cells_data = new_cells_data;\n\t\tthis.update();\n\t}\n\n\t/**\n\t * \n\t * @param row \n\t * @param col \n\t */\n\n\tprivate _getCellData(row: number, col: number, raw: boolean = false): CellData {\n\t\tlet value = this.m_cells_data.get(_mkid(row, col));\n\t\tif (value === undefined) {\n\t\t\treturn raw ? null : CellData.empty_cell;\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tprivate _focus(focus: boolean) {\n\t\tthis.setClass('@focus', focus);\n\t}\n\n\tprivate _ctxMenu(e) {\n\n\t\tlet dom = e.target,\n\t\t\tself = this.dom;\n\n\t\twhile (dom && dom != self) {\n\t\t\tlet itm = Component.getElement(dom),\n\t\t\t\trow = itm.getData('row-id'),\n\t\t\t\tcol = itm.getData('col-id');\n\n\t\t\tif (row !== undefined) {\n\t\t\t\tthis._selectItem(row, col);\n\t\t\t\tthis.emit( 'contextMenu', EvContextMenu(e, { row, col, item: itm }));\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdom = dom.parentElement;\n\t\t}\n\t}\n\n\t/** @ignore */\n\n\trender() {\n\n\t\tthis.m_recycler = [];\n\t\tthis.m_container = new Component({\n\t\t\tcls: 'content',\n\t\t});\n\n\t\tthis.m_view = new Component({\n\t\t\tcls: '@scroll-view',\n\t\t\tflex: 1,\n\t\t\tdom_events: {\n\t\t\t\tsizechange: ( ) => this._updateScroll(true),\n\t\t\t\tscroll: ( ) => this._updateScroll(false)\n\t\t\t},\n\t\t\tcontent: this.m_container\n\t\t});\n\n\t\tlet cols = this.m_columns.map((col, index) => {\n\n\t\t\tlet comp = new Component({\n\t\t\t\tcls: '@cell c'+index,\n\t\t\t\tcontent: col.title ? col.title : '&nbsp',\n\t\t\t\tflex: col.width < 0 ? -col.width : undefined,\n\t\t\t\tattrs: {\n\t\t\t\t\ttitle: col.title\n\t\t\t\t},\n\t\t\t\tstyle: {\n\t\t\t\t\twidth: col.width >= 0 ? col.width : undefined,\n\t\t\t\t\tminWidth: col.min_width\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tnew SizerOverlay({\n\t\t\t\ttarget: comp,\n\t\t\t\tsens: 'right',\n\t\t\t\tresize: (ev: EvSize) => {\n\t\t\t\t\tthis._on_col_resize(index, ev.size.width);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t(<any>col).$col = comp;\n\t\t\treturn comp;\n\t\t});\n\n\t\tthis.m_header = new HLayout({\n\t\t\tcls: '@header',\n\t\t\tcontent: <any>cols,\n\t\t});\n\n\t\tthis.setContent([\n\t\t\tthis.m_header,\n\t\t\tthis.m_view\n\t\t]);\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _on_col_resize(col, width) {\n\n\t\tif (!this.m_columns[col]) {\n\t\t\treturn;\n\t\t}\n\n\t\t// -> flex\n\t\tif (width <= 0) {\n\t\t\tthis.m_columns[col].width = -1;\t// flex default\n\t\t}\n\t\telse {\n\t\t\tthis.m_columns[col].width = width;\n\t\t}\n\n\t\tthis._updateScroll(true);\n\t}\n\n\t/**\n\t * compute misc dimensions\n\t * - item height\n\t * - scroll width\n\t */\n\n\tprivate _computeItemHeight() {\n\t\tlet g1 = x4document.createElement('div');\n\t\tg1.classList.add('x-spreadsheet');\n\n\t\tlet g2 = x4document.createElement('div');\n\t\tg2.classList.add('content');\n\n\t\tlet g3 = x4document.createElement('div');\n\t\tg3.classList.add('x-cell');\n\t\tg3.append( '&nbsp;' )\n\n\t\tg2.appendChild(g3);\n\t\tg1.appendChild(g2);\n\n\t\tthis.dom.appendChild(g1);\n\t\tlet rc = g3.getBoundingClientRect();\n\t\tthis.dom.removeChild(g1);\n\n\t\tthis.m_itemHeight = rc.height;\n\t}\n\n\t/**\n\t * compute columns widths \n\t * use col.width for fixed size columns\n\t * if col.width < 0 that mean that this is a proportion of the remaining space\n\t */\n\n\tprivate _calcColWidths(width: number) {\n\n\t\tlet fullw = 0;\n\t\tlet nwide = 0;\n\n\t\tlet calcw = new Int32Array(this.m_columns.length);\n\t\tlet calcz = new Int32Array(this.m_columns.length);\n\t\tlet calcm = new Int32Array(this.m_columns.length);\n\n\t\tthis.m_columns.forEach((col, colIdx) => {\n\n\t\t\tlet minw = Math.max(10, col.min_width ?? 0);\n\n\t\t\tif (col.width > 0) {\n\t\t\t\tlet cw = Math.max(col.width, minw);\n\t\t\t\tfullw += cw;\n\t\t\t\tcalcw[colIdx] = cw;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet z = -col.width;\n\t\t\t\tcalcz[colIdx] = z;\n\t\t\t\tnwide += z;\n\t\t\t}\n\n\t\t\tcalcm[colIdx] = minw;\n\t\t});\n\n\t\tif (nwide) {\n\t\t\tlet restw = width - fullw;\n\n\t\t\tfor (let i = 0; i < this.m_columns.length && nwide; i++) {\n\n\t\t\t\tif (!calcw[i]) {\n\t\t\t\t\tlet rest = Math.round(restw / nwide) * calcz[i];\n\t\t\t\t\tif (rest < calcm[i]) {\n\t\t\t\t\t\trest = calcm[i];\n\t\t\t\t\t}\n\n\t\t\t\t\tcalcw[i] = rest;\n\t\t\t\t\trestw -= rest;\n\t\t\t\t\tnwide -= calcz[i];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn calcw;\n\t}\n\n\t/**\n\t * create a cell (component)\n\t * and append it to the parent view\n\t * if a cell was reviously recyled, use it\n\t */\n\tprivate _createCell(): Component {\n\n\t\tlet cell;\n\t\tif (this.m_recycler.length) {\n\t\t\tcell = this.m_recycler.pop();\n\t\t\tcell.clearClasses();\n\t\t\tcell.addClass( '@comp' );\t// todo: find better to reset to default\n\t\t}\n\t\telse {\n\t\t\tcell = new Component({\n\t\t\t\tcls: '@cell'\n\t\t\t});\n\t\t}\n\n\t\tif (!cell.dom) {\n\t\t\tthis.m_container.appendChild(cell);\n\t\t}\n\n\t\treturn cell;\n\t}\n\n\t/**\n\t * build cells of the spreadsheet\n\t * cells are recycled when scrolling,\n\t * only visibles cells exists\n\t */\n\n\tprivate _buildItems() {\n\n\t\tlet rc = this.getBoundingRect();\n\t\tlet rh = this.m_header.getBoundingRect();\n\t\tlet height = rc.height - rh.height;\n\n\t\tif (this.m_itemHeight == 0) {\n\t\t\tthis._computeItemHeight();\n\t\t}\n\n\t\tlet top = this.m_topIndex * this.m_itemHeight;\n\t\tlet y = 0;\n\t\tlet cidx = 0;\n\t\tlet rowIdx = this.m_topIndex;\n\t\tlet count = this.m_row_limit;\n\n\t\tif (this.m_auto_row_count) {\n\t\t\t//@review should be evaluated only when row count change\n\t\t\tthis.m_row_limit = count = this.getMaxRowCount();\n\t\t}\n\n\t\tlet right_pos = 0;\n\t\tif ((count * this.m_itemHeight) > height) {\n\t\t\tlet w = Component.getScrollbarSize();\n\t\t\trc.width -= w;\n\t\t\tright_pos = w;\n\t\t}\n\n\t\tlet even = this.m_topIndex & 1 ? true : false;\n\t\tthis.m_visible_cells = new Map<number, Component>();\n\n\t\t// passe 0 - all created cells are moved to the recycler\n\t\tthis.m_used_cells.forEach((c) => {\n\t\t\tthis.m_recycler.push(c);\n\t\t});\n\n\t\tthis.m_used_cells = [];\n\n\t\t// pass 1 - compute column widths\n\t\tlet calcw = this._calcColWidths(rc.width);\n\n\t\t//\n\t\tlet full_width = 0;\n\t\tfor (let i = 0; i < calcw.length; i++) {\n\t\t\tfull_width += calcw[i];\n\t\t}\n\n\t\tif (full_width <= rc.width) {\n\n\t\t\tthis.m_view.setStyleValue('overflow-x', 'hidden');\n\t\t\tthis.m_header.setStyleValue('width', rc.width);\n\t\t\tthis.m_container.setStyleValue('width', rc.width);\n\n\t\t\tthis.m_container.setStyle({\n\t\t\t\theight: count * this.m_itemHeight,\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tthis.m_header.setStyleValue('width', full_width);\n\t\t\tthis.m_container.setStyleValue('width', full_width);\n\t\t\tthis.m_view.setStyleValue('overflow-x', 'visible');\n\n\t\t\tthis.m_container.setStyle({\n\t\t\t\theight: count * this.m_itemHeight,\n\t\t\t\twidth: full_width\n\t\t\t});\n\t\t}\n\n\t\tthis.m_view.addClass('@hidden');\n\n\t\t// pass 2 - build cells\n\t\tlet limit = 100;\n\t\twhile (y < height && rowIdx < count && --limit > 0) {\n\n\t\t\tlet rowdata = this.m_rows_data.get(rowIdx);\n\t\t\tlet x = 0;\n\n\t\t\tlet cols = this.m_columns.map((col, colIdx) => {\n\n\t\t\t\tlet cls = '@cell c'+colIdx ;\n\t\t\t\tif (col.align) {\n\t\t\t\t\tcls += ' ' + col.align;\n\t\t\t\t}\n\n\t\t\t\tif (col.cls) {\n\t\t\t\t\tcls += ' ' + col.cls;\n\t\t\t\t}\n\n\t\t\t\tlet cell: Component;\n\t\t\t\tlet celldata = this._getCellData(rowIdx, colIdx);\n\n\t\t\t\tlet text: string = celldata.text;\n\n\t\t\t\tif (col.renderer && text.length) {\n\t\t\t\t\ttext = col.renderer(text, { row: rowIdx, col: colIdx });\n\t\t\t\t}\n\n\t\t\t\t//if( text.length==0 ) {\n\t\t\t\t//\ttext = '&nbsp;'\n\t\t\t\t//}\n\n\t\t\t\tcls += (even ? ' even' : ' odd');\n\t\t\t\tif (rowdata) {\n\t\t\t\t\tcls += ' ' + rowdata;\n\t\t\t\t}\n\n\t\t\t\tcell = this._createCell();\n\t\t\t\tthis.m_used_cells.push(cell);\n\n\t\t\t\tcell.setContent(text);\t// always because cell reuse\n\n\t\t\t\tcell.addClass(cls);\n\t\t\t\tcell.setStyle({\n\t\t\t\t\tleft: x,\n\t\t\t\t\ttop: top + y,\n\t\t\t\t\twidth: calcw[colIdx],\n\t\t\t\t\theight: this.m_itemHeight\n\t\t\t\t});\n\n\t\t\t\tif (this.m_selection.row == rowIdx && this.m_selection.col == colIdx) {\n\t\t\t\t\tcell.addClass('@selected');\n\t\t\t\t}\n\n\t\t\t\tcell.setData('row-id', rowIdx);\n\t\t\t\tcell.setData('col-id', colIdx);\n\n\t\t\t\tif (celldata.cls) {\n\t\t\t\t\tcell.addClass(celldata.cls);\n\t\t\t\t}\n\n\t\t\t\tthis.m_visible_cells.set(_mkid(rowIdx, colIdx), cell);\n\n\t\t\t\tx += calcw[colIdx];\n\t\t\t\treturn cell;\n\t\t\t});\n\n\t\t\teven = !even;\n\n\t\t\ty += this.m_itemHeight;\n\n\t\t\trowIdx++;\n\t\t\tcidx++;\n\n\t\t\t//rows.splice( rows.length, 0, ...cols );\n\t\t}\n\n\t\t// if some cells are still in cache, hide them\n\t\tthis.m_recycler.forEach((c) => {\n\t\t\tc.addClass('@hidden');\n\t\t})\n\n\t\tthis.m_row_count = cidx;\n\t\t//this.m_container.setContent( <ComponentContent>rows);\n\n\t\tthis.m_view.removeClass('@hidden');\n\t\tthis.setClass('empty', count == 0);\n\t}\n\n\t/** @ignore */\n\tprivate _itemClick(e: MouseEvent) {\n\t\tlet dom = e.target as HTMLElement;\n\t\tif (this.m_editor && this.m_editor.dom.contains(dom)) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet itm = Component.getElement(dom, Component);\n\n\t\tif (!itm) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet rowIdx = itm.getData('row-id'),\n\t\t\tcolIdx = itm.getData('col-id');\n\n\t\tif (rowIdx === undefined || colIdx === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._selectItem(rowIdx, colIdx);\n\t}\n\n\tprivate _itemDblClick(e: MouseEvent) {\n\t\tlet dom = e.target as HTMLElement;\n\t\tif (this.m_editor && this.m_editor.dom.contains(dom)) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet itm = Component.getElement(dom),\n\t\t\trowIdx = itm.getData('row-id'),\n\t\t\tcolIdx = itm.getData('col-id');\n\n\t\tif (rowIdx === undefined || colIdx === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.emit( 'dblClick', EvDblClick({ row: rowIdx, col: colIdx }));\n\t\tthis.editCell(rowIdx, colIdx);\n\t}\n\n\t/**\n\t * \n\t * @param rowIdx \n\t * @param colIdx \n\t * @param scrollIntoView \n\t */\n\n\tprotected _selectItem(rowIdx: number, colIdx: number, scrollIntoView?: boolean) {\n\n\t\tif (rowIdx < 0) {\n\t\t\trowIdx = 0;\n\t\t}\n\n\t\tif (rowIdx > this.m_row_limit - 1) {\n\t\t\trowIdx = this.m_row_limit - 1;\n\t\t}\n\n\t\tif (colIdx < 0) {\n\t\t\tcolIdx = 0;\n\t\t}\n\n\t\tlet lastcol = this.m_columns.length - 1;\n\t\tif (colIdx > lastcol) {\n\t\t\tcolIdx = lastcol;\n\t\t}\n\n\t\tif (this.m_selection.row == rowIdx && this.m_selection.col == colIdx) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.select(rowIdx, colIdx, scrollIntoView);\n\t}\n\n\tprivate _scrollIntoView(row: number, col: number) {\n\n\t\tlet doscroll = (itm: Component, mode: string = 'nearest') => {\n\t\t\titm.scrollIntoView({\n\t\t\t\tblock: <ScrollLogicalPosition>mode\t//<ScrollLogicalPosition>sens ?? 'nearest'\n\t\t\t});\n\t\t}\n\n\t\tlet last = this.m_topIndex + this.m_row_count - 1;\n\n\t\tif (row < this.m_topIndex) {\n\t\t\tthis.m_topIndex = row;\n\t\t\tthis.m_view.dom.scrollTop = this.m_topIndex * this.m_itemHeight;\n\t\t\tthis._buildItems();\n\t\t\tdoscroll(this._findItem(row, col), 'start');\n\t\t}\n\t\telse if (row > last) {\n\t\t\tthis.m_topIndex = row - this.m_row_count + 1;\n\t\t\tthis.m_view.dom.scrollTop = this.m_topIndex * this.m_itemHeight;\n\t\t\tthis._buildItems();\n\t\t\tdoscroll(this._findItem(row, col), 'end');\n\t\t}\n\t\telse {\n\t\t\tdoscroll(this._findItem(row, col));\n\t\t}\n\t}\n\n\t/**\n\t * \n\t * @param row \n\t * @param col \n\t */\n\n\tprivate _findItem(row, col): Component {\n\t\tif (!this.m_visible_cells) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this.m_visible_cells.get(_mkid(row, col));\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _updateScroll(forceUpdate) {\n\t\tif (!this?.m_view?.dom) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet newTop = Math.floor(this.m_view.dom.scrollTop / (this.m_itemHeight || 1));\n\n\t\tif (newTop != this.m_topIndex || forceUpdate) {\n\t\t\tthis.m_topIndex = newTop;\n\t\t\tthis._buildItems();\n\t\t}\n\n\t\tlet newLeft = this.m_view.dom.scrollLeft;\n\t\tthis.m_header.setStyleValue('left', -newLeft);\n\t}\n\n\t/**\n\t * \n\t * @param event \n\t * @param t \n\t */\n\n\tprivate _moveSel(sensy: number, sensx: number) {\n\n\t\tlet sel = this.m_selection;\n\n\t\tlet newRow = sel.row ?? 0;\n\t\tlet newCol = sel.col ?? 0;\n\n\t\tif (sensy == 1) {\n\t\t\tnewRow++;\n\t\t}\n\t\telse if (sensy == -1) {\n\t\t\tnewRow--;\n\t\t}\n\t\telse if (sensy == 2) {\n\t\t\tnewRow += this.m_row_count - 1;\n\t\t}\n\t\telse if (sensy == -2) {\n\t\t\tnewRow -= this.m_row_count - 1;\n\t\t}\n\t\telse if (sensy == 3) {\n\t\t\tnewRow = this.m_row_limit - 1;\n\t\t}\n\t\telse if (sensy == -3) {\n\t\t\tnewRow = 0;\n\t\t}\n\n\t\tif (sensx == 1) {\n\t\t\tnewCol++;\n\t\t}\n\t\telse if (sensx == -1) {\n\t\t\tnewCol--;\n\t\t}\n\t\telse if (sensx == 2) {\n\t\t\tnewCol = this.m_columns.length - 1;\n\t\t}\n\t\telse if (sensx == -2) {\n\t\t\tnewCol = 0;\n\t\t}\n\t\telse if (sensx == 3) { // new editable cell skip line if needed\n\t\t\tnewCol++;\n\n\t\t\tlet lastcol = this.m_columns.length - 1;\n\n\t\t\tl1: for (let trys = 0; trys < 2; trys++) {\n\t\t\t\twhile (newCol < lastcol) {\n\t\t\t\t\tif (this.m_columns[newCol].createEditor !== null) {\n\t\t\t\t\t\tbreak l1;\n\t\t\t\t\t}\n\n\t\t\t\t\tnewCol++;\n\t\t\t\t}\n\n\t\t\t\tif (newCol > lastcol) {\n\t\t\t\t\tnewRow++;\n\t\t\t\t\tnewCol = 0;\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t}\n\t\telse if (sensx == -3) {\n\t\t\tnewCol--;\n\n\t\t\tlet lastcol = this.m_columns.length - 1;\n\n\t\t\tl2: for (let trys = 0; trys < 2; trys++) {\n\t\t\t\twhile (newCol >= 0) {\n\t\t\t\t\tif (this.m_columns[newCol].createEditor !== null) {\n\t\t\t\t\t\tbreak l2;\n\t\t\t\t\t}\n\n\t\t\t\t\tnewCol--;\n\t\t\t\t}\n\n\t\t\t\tif (newCol < 0) {\n\t\t\t\t\tnewRow--;\n\t\t\t\t\tnewCol = lastcol;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis._selectItem(newRow, newCol, true);\n\t}\n\n\tprivate _handleKey(event: KeyboardEvent) {\n\t\tlet dom = <Node>event.target;\n\t\tif (this.m_editor && this.m_editor.dom.contains(dom)) {\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowDown':\n\t\t\tcase 'Down': {\n\t\t\t\tthis._moveSel(1, 0);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'ArrowUp':\n\t\t\tcase 'Up': {\n\t\t\t\tthis._moveSel(-1, 0);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'PageUp': {\n\t\t\t\tthis._moveSel(-2, 0);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'PageDown': {\n\t\t\t\tthis._moveSel(2, 0);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'ArrowLeft':\n\t\t\tcase 'Left': {\n\t\t\t\tthis._moveSel(0, -1);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'ArrowRight':\n\t\t\tcase 'Right': {\n\t\t\t\tthis._moveSel(0, 1);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'Home': {\n\t\t\t\tif (event.ctrlKey) {\n\t\t\t\t\tthis._moveSel(-3, 0);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis._moveSel(0, -2);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'End': {\n\t\t\t\tif (event.ctrlKey) {\n\t\t\t\t\tthis._moveSel(3, 0);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis._moveSel(0, 2);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'Enter': {\n\t\t\t\tthis.editCurCell();\n\t\t\t\tevent.stopPropagation( );\n\t\t\t\tevent.preventDefault( );\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'Delete': {\n\t\t\t\tthis.clearCell(this.m_selection.row, this.m_selection.col);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\t//console.log( \"unknown key: \", event.key);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _keyPress(event: KeyboardEvent) {\n\t\tlet dom = <Node>event.target;\n\t\tif (this.m_editor && this.m_editor.dom.contains(dom)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.ctrlKey || event.altKey) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.editCurCell(event.key);\n\t}\n\n\t/**\n\t * return the selection\n\t * { row, col }\n\t */\n\n\tgetSelection() {\n\t\treturn this.m_selection;\n\t}\n\n\tselect(row: number, col: number, scrollIntoView: boolean = true) {\n\n\t\tif (this.m_selection.row == row && this.m_selection.col == col) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet oldSel = this._findItem(this.m_selection.row, this.m_selection.col);\n\t\tif (oldSel) {\n\t\t\toldSel.removeClass('@selected');\n\t\t}\n\n\t\tthis.m_selection = { row, col };\n\n\t\tif (scrollIntoView) {\n\t\t\tthis._scrollIntoView(row, col);\n\t\t}\n\n\t\tlet newSel = this._findItem(row, col);\n\t\tif (newSel) {\n\t\t\tnewSel.addClass('@selected');\n\t\t}\n\n\t\tthis.emit( 'selectionChange', EvSelectionChange({ row, col }));\n\t}\n\n\t/**\n\t * return the row count\n\t */\n\n\trowCount() {\n\t\treturn this.m_row_limit;\n\t}\n\n\t/**\n\t * return the maximum row index filled with something\n\t */\n\n\tgetMaxRowCount() {\n\n\t\tlet max_row = 0;\n\n\t\tthis.m_cells_data.forEach((c, uid) => {\n\t\t\tlet row = Math.round(uid / 1000) + 1;\n\t\t\tif (max_row < row) {\n\t\t\t\tmax_row = row;\n\t\t\t}\n\t\t});\n\n\t\treturn max_row;\n\t}\n\n\tgetColCount() {\n\t\treturn this.m_columns.length;\n\t}\n\n\tsetRowStyle(row: number, cls: string) {\n\t\tthis.m_rows_data.set(row, cls);\n\n\t\tif (this.m_lockupdate == 0) {\n\t\t\tthis._buildItems();\n\t\t}\n\t}\n\n\tgetRowStyle(row: number) {\n\t\treturn this.m_rows_data.get(row);\n\t}\n\n\tsetCellStyle(row: number, col: number, cls: string) {\n\t\tlet cell = this._getCellData(row, col, true);\n\t\tif (!cell) {\n\t\t\tcell = { text: '' };\n\t\t\tthis.m_cells_data.set(_mkid(row, col), cell);\n\t\t}\n\n\t\tcell.cls = cls;\n\n\t\tif (this.m_lockupdate == 0 && this.m_visible_cells) {\n\t\t\tlet itm = this._findItem(row, col);\n\t\t\tif (itm) {\n\t\t\t\titm.setClass(cls, true); //todo: pb when changing classes\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._buildItems();\n\t\t\t}\n\t\t}\n\t}\n\n\tgetCellText(row: number, col: number): string {\n\t\treturn this._getCellData(row, col).text;\n\t}\n\n\tgetCellNumber(row: number, col: number): number {\n\t\tlet text = this._getCellData(row, col).text;\n\t\treturn parseIntlFloat(text);\n\t}\n\n\tclearRow(row: number) {\n\t\tfor (let c = 0; c < this.m_columns.length; c++) {\n\t\t\tthis.clearCell(row, c);\n\t\t}\n\t\tthis.update(10);\n\t}\n\n\tclearCell(row: number, col: number) {\n\t\tthis.setCellText(row, col, null);\n\t}\n\n\teditCurCell(forceText?: string) {\n\t\tthis.editCell(this.m_selection.row, this.m_selection.col, forceText);\n\t}\n\n\teditCell(row: number, col: number, forcedText?: string) {\n\n\t\tif (!this.m_autoedit) {\n\t\t\treturn;\n\t\t}\n\n\t\t// disable edition\n\t\tif (this.m_columns[col].createEditor === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._scrollIntoView(row, col);\n\n\t\tlet item = this._findItem(row, col);\n\t\tlet place = item.dom;\n\t\tlet parent = place.parentElement;\n\n\t\tlet rc = place.getBoundingClientRect();\n\t\tlet prc = parent.getBoundingClientRect();\n\n\t\tlet cell = this._getCellData(row, col, true);\n\n\t\tlet edtBuilder = (props: TextEditProps, col, row): Component => {\n\t\t\treturn new TextEdit(props);\n\t\t}\n\n\t\tif (this.m_columns[col].createEditor) {\n\t\t\tedtBuilder = this.m_columns[col].createEditor;\n\t\t}\n\n\t\tlet cellvalue = forcedText ? forcedText : (cell ? cell.text : '');\n\n\t\tthis.m_editor = edtBuilder({\n\t\t\tcls: '@editor',\n\t\t\tstyle: {\n\t\t\t\tleft: rc.left - prc.left,\n\t\t\t\ttop: rc.top - prc.top,\n\t\t\t\twidth: rc.width - 1,\n\t\t\t\theight: rc.height - 1\n\t\t\t},\n\t\t\ttabIndex: false,\n\t\t\tvalue: cellvalue,\n\t\t\tdata: {\n\t\t\t\trow,\n\t\t\t\tcol\n\t\t\t},\n\t\t}, row, col);\n\n\t\tif( !this.m_editor ) {\n\t\t\treturn;\n\t\t}\n\n\t\tparent.appendChild(this.m_editor._build());\n\n\t\tthis._setupEditor( );\n\t\t\n\t\tthis.m_editor.setData('old-value', cellvalue);\n\t\tthis.m_editor.focus();\n\n\t\tif (this.m_editor instanceof TextEdit) {\n\t\t\tthis.m_editor.selectAll();\n\t\t}\n\t}\n\n\t_setupEditor( ) {\n\t\t\n\t\tlet movesel = (sensy, sensx) => {\n\t\t\tdeferCall(() => {\n\t\t\t\tthis.killEditor(true);\n\t\t\t\tthis._moveSel(sensy, sensx);\n\t\t\t\tthis.editCurCell();\n\t\t\t});\n\t\t}\n\n\t\t// todo: better\n\t\tif( this.m_editor instanceof TextEdit ) {\n\t\t\tlet editor = this.m_editor as TextEdit;\n\t\t\tlet input: Input = editor.input;\n\n\t\t\tinput.setDomEvent( 'blur', () => {\n\t\t\t\tthis.killEditor(true);\n\t\t\t} );\n\n\t\t\tinput.setDomEvent( 'keydown', (e: KeyboardEvent) => {\n\t\t\t\t// prevented by edit...\n\t\t\t\tif( e.defaultPrevented ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tswitch (e.key) {\n\t\t\t\t\tcase 'Escape': {\n\t\t\t\t\t\tthis.killEditor(false);\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\te.preventDefault( );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 'Enter':\n\t\t\t\t\tcase 'Tab': {\n\t\t\t\t\t\tlet sens = 3;\n\t\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\t\tsens = -3;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmovesel(0, sens);\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\te.preventDefault( );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 'ArrowUp':\n\t\t\t\t\tcase 'Up': {\n\t\t\t\t\t\tmovesel(-1, 0);\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\te.preventDefault( );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 'ArrowDown':\n\t\t\t\t\tcase 'Down': {\n\t\t\t\t\t\tmovesel(1, 0);\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\te.preventDefault( );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\telse if( this.m_editor instanceof ComboBox ) {\n\t\t\t\n\t\t\tlet input: Input = (this.m_editor as ComboBox).input;\n\t\t\tinput.setDomEvent( 'blur', () => {\n\t\t\t\tthis.killEditor(true);\n\t\t\t} );\n\n\t\t\tinput.setDomEvent( 'keydown', (e: KeyboardEvent) => {\n\t\t\t\t\n\t\t\t\tswitch (e.key) {\n\t\t\t\t\tcase 'Escape': {\n\t\t\t\t\t\tthis.killEditor(false);\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\te.preventDefault( );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 'Enter':\n\t\t\t\t\tcase 'Tab': {\n\t\t\t\t\t\tlet sens = 3;\n\t\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\t\tsens = -3;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmovesel(0, sens);\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\te.preventDefault( );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.m_editor.showPopup( );\n\t\t\tthis.m_editor.on( 'change', ( ev ) => {\n\t\t\t\tthis.killEditor(true);\n\t\t\t});\n\n\t\t\tthis.m_editor.on( 'cancel', ( ev ) => {\n\t\t\t\tthis.killEditor(false);\n\t\t\t});\n\t\t}\n\t}\n\n\tkillEditor(save: boolean) {\n\t\tif (this.m_editor) {\n\t\t\tif (save) {\n\t\t\t\t\n\t\t\t\tlet text, id;\n\t\t\t\t\n\t\t\t\tif( this.m_editor instanceof TextEdit ) {\n\t\t\t\t\ttext = (this.m_editor as TextEdit).value;\n\t\t\t\t}\n\t\t\t\telse if( this.m_editor instanceof ComboBox ) {\n\t\t\t\t\tid = (this.m_editor as ComboBox).value;\n\t\t\t\t\ttext = (this.m_editor as ComboBox).valueText;\n\t\t\t\t}\n\n\t\t\t\tlet row = this.m_editor.getData('row');\n\t\t\t\tlet col = this.m_editor.getData('col');\n\t\t\t\tlet old = this.m_editor.getData('old-value');\n\n\t\t\t\tthis.setCellText(row, col, text);\n\t\t\t\tconst ev = EvChange(text, { row, col, oldValue: old, id });\n\t\t\t\tthis.emit('change', ev );\n\n\t\t\t\tif( ev.defaultPrevented ) {\n\t\t\t\t\tthis.setCellText(row, col, old);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// cannot dipose while handling blur event, so we defer...\n\t\t\tlet t = this.m_editor;\n\t\t\tasap( ( ) => {\n\t\t\t\tt.dispose();\n\t\t\t})\n\t\t\t\n\t\t\tthis.m_editor = null;\n\t\t\tthis.focus();\n\t\t}\n\t}\n\n\tclearData() {\n\t\tthis.m_cells_data = new Map<number, CellData>();\n\t\tthis.m_rows_data = new Map<number, string>();\n\t}\n\n\tsetCellText(row: number, col: number, value: string) {\n\n\t\tif (value == null || value.length == 0) {\n\t\t\tthis.m_cells_data.delete(_mkid(row, col));\n\t\t\tvalue = '';\t//'&nbsp';\n\t\t}\n\t\telse {\n\t\t\tlet cell: any = this._getCellData(row, col, true);\n\t\t\tif (!cell) {\n\t\t\t\tcell = {};\n\t\t\t}\n\n\t\t\tcell.text = value;\n\t\t\tthis.m_cells_data.set(_mkid(row, col), cell);\n\t\t}\n\n\t\tif (this.m_lockupdate == 0 && this.m_visible_cells) {\n\t\t\tlet itm = this._findItem(row, col);\n\t\t\tif (itm) {\n\n\t\t\t\tif (this.m_columns[col].renderer) {\n\t\t\t\t\tvalue = this.m_columns[col].renderer(value, { row, col });\n\t\t\t\t}\n\n\t\t\t\titm.setContent(value);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._buildItems();\n\t\t\t}\n\t\t}\n\t}\n\n\tlockUpdate(start: boolean) {\n\t\tif (start) {\n\t\t\tthis.m_lockupdate++;\n\t\t}\n\t\telse {\n\t\t\tif (--this.m_lockupdate == 0) {\n\t\t\t\tthis._updateScroll(true);\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * @ignore\n */\n\nfunction _mkid(row: number, col: number): number {\n\treturn row * 1000 + col;\n}\n\n/**\n * @ignore\n */\n\nfunction _getid(key: number) {\n\treturn {\n\t\trow: Math.floor(key / 1000) | 0,\n\t\tcol: (key % 1000) | 0\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file propertyeditor.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { CEventMap, Component, CProps } from './component'\nimport { EvChange, EventCallback } from './x4events'\n\nimport { InputProps, Input } from './input'\nimport { TextEdit } from './textedit'\nimport { CheckBox } from './checkbox'\nimport { Spreadsheet } from './spreadsheet'\nimport { DataView, Record } from './datastore'\nimport { _tr } from './i18n'\n\n\n//@TODO: review all\n\nexport interface SaveCallback {\n\t(id: any, record: any[]) : void;\n}\n\nexport type IPropertyField = {\n\tid: any;\n\ttitle: string;\n\ttype: Function | \"string\" | 'number' | 'boolean' | 'choice' | 'password' | 'button' | 'color';\n\tvalue?: any;\n\n\tdata?: any;\t// associated data if needed\n\teditorProps?: InputProps;\n\treadOnly?: boolean;\n\t//values?: any[] | DataView;\n}\n\ninterface PropertyEditorEventMap extends CEventMap {\n\tchange: EvChange;\n}\n\nexport interface PropertyEditorProps extends CProps<PropertyEditorEventMap> {\n\tfields: IPropertyField[];\n\tlabelWidth?: number;\n\trecord?: Record;\n\tchange: EventCallback<EvChange>;\n}\n\n\nexport class PropertyEditor extends Component<PropertyEditorProps, PropertyEditorEventMap> {\n\n\tm_fields: IPropertyField[];\n\tm_record: Record;\n\tm_sheet: Spreadsheet;\n\tm_label_w: number;\n\n\tconstructor(props: PropertyEditorProps) {\n\t\tsuper(props);\n\t\tthis.mapPropEvents( props, 'change' );\n\t}\n\n\trender(props: PropertyEditorProps) {\n\n\t\tthis.m_record = props.record;\n\t\tthis.m_fields = props.fields ?? [];\n\t\tthis.m_label_w = props.labelWidth;\n\n\t\tthis.m_sheet = new Spreadsheet({\n\t\t\tcls: '@fit',\n\t\t\tcolumns: [\n\t\t\t\t{ \n\t\t\t\t\ttitle: _tr.global.property, \n\t\t\t\t\twidth: this.m_label_w > 0 ? this.m_label_w : -1, \n\t\t\t\t\tcls: 'property' \n\t\t\t\t},\n\t\t\t\t{ \n\t\t\t\t\ttitle: _tr.global.value, \n\t\t\t\t\twidth: -1, \n\t\t\t\t\tcreateEditor: ( ...a ) => this._editCell(...a), \n\t\t\t\t\trenderer: (...a) => this._renderCell(...a) \n\t\t\t\t},\n\t\t\t],\n\t\t\tautoedit: true,\n\t\t\tchange: ( e ) => this._cellChange(e)\n\t\t});\n\n\t\tthis._updateProperties();\n\t\tthis.setContent( this.m_sheet );\n\t}\n\n\tsetFields(fields: IPropertyField[]) {\n\t\tif (fields) {\n\t\t\tthis.m_fields = fields;\n\t\t\tthis._updateProperties();\n\t\t}\n\t\telse {\n\t\t\tthis.m_sheet.clearData();\n\t\t}\n\t}\n\n\tsetRecord(record: Record) {\n\t\tthis.m_record = record;\n\t\tthis._updateProperties();\n\t}\n\n\tprivate _updateProperties() {\n\t\tthis.m_sheet.lockUpdate(true);\n\t\tthis.m_sheet.clearData();\n\n\t\tthis.m_fields.forEach((fld, lno) => {\n\t\t\tthis.m_sheet.setCellText(lno, 0, fld.title);\n\n\t\t\tif (this.m_record) {\n\t\t\t\tthis.m_sheet.setCellText(lno, 1, this.m_record.getField(fld.id));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.m_sheet.setCellText(lno, 1, fld.value);\n\t\t\t}\n\t\t});\n\n\t\tthis.m_sheet.lockUpdate(false);\n\t}\n\n\n\tprivate _cellChange(ev: EvChange) {\n\n\t\tlet ctx: { row: number, col: number } = ev.context;\n\t\tlet text: number = ev.value as number;\n\n\t\tif (ctx.col != 1) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet fld = this.m_fields[ctx.row];\n\n\t\tswitch (fld.type) {\n\t\t\tdefault:\n\t\t\tcase 'string': {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'number': {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'password': {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'boolean': {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'choice': {\n\t\t\t\t/*\n\t\t\t\tlet cprops = <ComboBoxProps>fprops;\n\t\t\t\tif( cprops!==fld.props ) {\n\t\t\t\t\t\n\t\t\t\t\tlet choices;\n\t\t\t\t\tif( isArray(fld.values) ) {\n\t\t\t\t\t\tchoices = this._choicesFromArray( fld.values );\n\t\t\t\t\t}\n\t\t\t\t\telse if( fld.values instanceof DataStore ) {\n\t\t\t\t\t\tchoices = this._choicesFromStore( fld.values, 'name' );\n\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tcprops.items = choices;\n\t\t\t\t}\n\n\t\t\t\teditor = new ComboBox( cprops ); \n\t\t\t\t*/\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (this.m_record) {\n\t\t\tthis.m_record.setField(fld.id, text);\n\t\t}\n\t\telse {\n\t\t\tfld.value = text;\n\t\t}\n\n\t\tthis.emit( 'change', EvChange(text, fld) );\n\t}\n\n\t_renderCell(text, rec) {\n\n\t\tlet fld = this.m_fields[rec.row];\n\n\t\tswitch (fld.type) {\n\t\t\tdefault:\n\t\t\tcase 'string': {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'number': {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'password': {\n\t\t\t\ttext = '\u25CF\u25CF\u25CF\u25CF\u25CF\u25CF';\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'boolean': {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'choice': {\n\t\t\t\t/*\n\t\t\t\tlet cprops = <ComboBoxProps>fprops;\n\t\t\t\tif( cprops!==fld.props ) {\n\t\t\t\t\t\n\t\t\t\t\tlet choices;\n\t\t\t\t\tif( isArray(fld.values) ) {\n\t\t\t\t\t\tchoices = this._choicesFromArray( fld.values );\n\t\t\t\t\t}\n\t\t\t\t\telse if( fld.values instanceof DataStore ) {\n\t\t\t\t\t\tchoices = this._choicesFromStore( fld.values, 'name' );\n\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tcprops.items = choices;\n\t\t\t\t}\n\n\t\t\t\teditor = new ComboBox( cprops ); \n\t\t\t\t*/\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn text;\n\t}\n\n\t_editCell(props, row: number, col: number) {\n\n\t\tlet fld = this.m_fields[row];\n\n\t\tlet editor: Component;\n\t\tswitch (fld.type) {\n\t\t\tdefault:\n\t\t\tcase 'string': {\n\t\t\t\teditor = new TextEdit(props);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'number': {\n\t\t\t\teditor = new TextEdit(props);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'password': {\n\t\t\t\tprops.type = 'password';\n\t\t\t\tprops.value = this.m_record.getField(fld.id);\n\t\t\t\teditor = new Input(props);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'boolean': {\n\t\t\t\teditor = new CheckBox(props);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'choice': {\n\t\t\t\t/*let cprops = <ComboBoxProps>props;\n\t\t\t\tif( cprops!==fld.props ) {\n\t\t\t\t\t\n\t\t\t\t\tlet choices;\n\t\t\t\t\tif( isArray(fld.values) ) {\n\t\t\t\t\t\tchoices = this._choicesFromArray( fld.values );\n\t\t\t\t\t}\n\t\t\t\t\telse if( fld.values instanceof DataStore ) {\n\t\t\t\t\t\tchoices = this._choicesFromStore( fld.values, 'name' );\n\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tcprops.items = choices;\n\t\t\t\t}\n\n\t\t\t\teditor = new ComboBox( cprops ); \n\t\t\t\t*/\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn editor;\n\t}\n\n\tprivate _choicesFromArray(values): any[] {\n\t\tlet choices = values.map((e) => {\n\n\t\t\tif (typeof (e) == 'object') {\n\t\t\t\treturn { id: e.id, text: e.value };\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn { id: e, text: '' + e };\n\t\t\t}\n\t\t});\n\n\t\treturn choices;\n\t}\n\n\tprivate _choicesFromStore(view: DataView, field: string): any[] {\n\n\t\tlet choices = [];\n\n\t\tfor (let i = 0, n = view.count; i < n; i++) {\n\t\t\tlet rec = view.getByIndex(i);\n\t\t\tchoices.push({ id: rec.getID(), text: rec.getField(field) });\n\t\t}\n\n\t\treturn choices;\n\t}\n\n\n}\n\n\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file radiobtn.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\nimport { HtmlString } from './tools'\n\nimport { Component, CProps, CEventMap } from './component'\nimport { EvChange, EventCallback } from './x4events'\n\nimport { IconID } from './icon';\nimport { Input } from './input'\nimport { Label } from './label'\n\n// ============================================================================\n// [RADIOBTN]\n// ============================================================================\n\ninterface RadioBtnEventMap extends CEventMap {\n\tchange?: EvChange;\n}\n\nexport interface RadioBtnProps extends CProps {\n\n\tgroup: string;\t// same as 'name' but required\n\tvalue: string;\n\t\n\ttabIndex?: number | boolean;\n\tname?: string;\n\n\ticon?: IconID;\n\ttext?: string;\n\tchecked?: boolean;\n\tlabelWidth?: number | 'flex';\t// flex | value\n\talign?: 'left' | 'right';\n\n\tchange?: EventCallback<EvChange>; // shortcut to events: { change: xxx }\n}\n\n\n/**\n * Standard RadioBtn\n */\n\nexport class RadioBtn extends Component<RadioBtnProps,RadioBtnEventMap> {\n\n\tprotected m_ui_input: Input;\t// todo: remove that / use ref\n\n\tconstructor(props: RadioBtnProps) {\n\n\t\tsuper( props );\n\t\tthis.mapPropEvents( props, 'change' );\n\t}\n\n\t/** @ignore */\n\trender( props: RadioBtnProps) {\n\n\t\tlet text = props.text ?? '';\n\t\tlet name = props.name ?? props.group;\n\t\tlet labelWidth = props.labelWidth ?? -1;\n\t\tlet checked = props.checked ?? false;\n\t\tlet align = props.align ?? 'left';\n\t\tlet value = props.value;\n\t\tlet icon = props.icon;\n\t\t\n\t\tthis.setTag( 'label' );\n\t\tthis.addClass( '@hlayout' );\n\t\t\n\t\tthis.addClass( align );\n\t\tthis._setTabIndex( props.tabIndex );\n\n\t\tif( checked ) {\n\t\t\tthis.addClass( 'checked' );\n\t\t}\n\n\t\tthis.setContent( [\n\t\t\tthis.m_ui_input = new Input({\n\t\t\t\ttype: 'radio',\t\t\t\t\n\t\t\t\tname: name,\n\t\t\t\ttabIndex: props.tabIndex,\n\t\t\t\tvalue: value,\n\t\t\t\tattrs: {\n\t\t\t\t\tchecked: checked ? '' : undefined\n\t\t\t\t},\n\t\t\t\tdom_events: {\n\t\t\t\t\tchange: ( ) => this._change( ),\n\t\t\t\t\tfocus: \t( ) => this.m_ui_input.focus( ),\n\t\t\t\t}\n\t\t\t}),\n\t\t\tnew Label( {\n\t\t\t\tref: 'label',\n\t\t\t\ticon: icon,\n\t\t\t\ttext: text,\n\t\t\t\twidth: labelWidth==='flex' ? undefined : labelWidth,\n\t\t\t\tflex: labelWidth==='flex' ? 1 : undefined,\n\t\t\t\tstyle: {\n\t\t\t\t\torder: align=='right' ? -1 : undefined,\n\t\t\t\t},\t\t\n\t\t\t} )\n\t\t] );\n\t}\n\n\t/**\n\t * check state changed\n\t */\n\n\tprivate _change( ) {\n\n\t\tlet props = this.m_props;\n\n\t\tlet query = '.x-input[name='+props.name+']';\n\t\tlet nlist = x4document.querySelectorAll( query );\t\t//todo: document ?\n\n\t\tnlist.forEach( (dom) => {\n\t\t\tlet radio = Component.getElement( <HTMLElement>dom, RadioBtn );\n\t\t\tradio.removeClass( 'checked' );\n\t\t});\n\n\t\tlet dom = (<HTMLInputElement>this.m_ui_input.dom);\n\t\tthis.setClass( 'checked', dom.checked )\n\n\t\tthis.emit( 'change', EvChange( true ) );\n\t}\n\n\t/**\n * @return the checked value\n */\n\n public get check( ) {\n\t\tif( this.m_ui_input ) {\n\t\t\treturn (<HTMLInputElement>this.m_ui_input.dom).checked;\n\t\t}\n\t\t\n\t\treturn this.m_props.checked;\n }\n\n /**\n * change the checked value\n * @param {boolean} ck new checked value\t\n */\n\n public set check( ck ) {\n\n\t\tlet dom = (<HTMLInputElement>this.m_ui_input.dom);\n\t\t\n if ( ck ) {\n\t\t\t//this.addClass( 'checked' );\n\t\t\tif( dom ) {\n\t\t\t\tdom.checked = true;\n\t\t\t}\n\t\t\t\n\t\t\tthis.m_props.checked = true;\n }\n else {\n\t\t\t//this.removeClass( 'checked' );\n if( dom ) {\n\t\t\t\tdom.checked = false;\n\t\t\t}\n\n\t\t\tthis.m_props.checked = false;\n\t\t}\n\t}\n\n\tget text( ): HtmlString | string {\n\t\treturn this.itemWithRef<Label>('label').text;\n\t}\n\n\tset text( text: HtmlString | string ) {\n\t\tthis.itemWithRef<Label>('label').text = text;\n\t}\n}\n\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file rating.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { CProps, Component, ContainerEventMap } from './component'\nimport { HLayout } from './layout';\nimport { Input } from './input'\nimport { EvChange, EventCallback } from './x4events';\n\ninterface RatingEventMap extends ContainerEventMap {\n\tchange: EvChange;\n}\n\nexport interface RatingProps extends CProps<RatingEventMap> {\n\tsteps?: number;\n\tvalue?: number;\n\tshape?: string;\n\tname?: string; \n\n\tchange?: EventCallback<EvChange>;\n}\n\n\nexport class Rating extends HLayout<RatingProps,RatingEventMap> {\n\n\tprivate m_els: Component[];\n\tprivate m_input: Input;\n\t\n\tconstructor( props: RatingProps ) {\n\t\tsuper( props );\n\n\t\tprops.steps = props.steps ?? 5;\n\t}\n\n\trender( props: RatingProps ) {\n\t\t\n\t\tlet shape = props.shape ?? 'star';\n\t\tlet value = props.value ?? 0;\n\n\t\tthis.m_input = new Input( {\n\t\t\tcls: '@hidden',\n\t\t\tname: props.name,\n\t\t\tvalue: ''+value\n\t\t} );\n\n\t\tthis.addClass( shape );\n\t\tthis.setDomEvent( 'click', (e) => this._onclick(e) );\n\n\t\tthis.m_els = [];\n\t\tfor( let i=0; i<props.steps; i++ ) {\n\t\t\t\n\t\t\tlet cls = 'item';\n\t\t\tif( i+1 <= value ) {\n\t\t\t\tcls += ' checked';\n\t\t\t}\n\n\t\t\tlet c = new Component( { \n\t\t\t\ttag: 'option',\n\t\t\t\tcls,\n\t\t\t\tdata: { value: i+1 }\n\t\t\t} );\n\n\t\t\tthis.m_els.push( c );\n\t\t}\n\n\t\tthis.m_els.push( this.m_input );\n\t\tthis.setContent( this.m_els );\n\t}\n\n\tgetValue( ) {\n\t\treturn this.m_props.value ?? 0;\n\t}\n\n\tset value( v: number ) {\n\t\tthis.m_props.value = v;\n\n\t\tfor( let c=0; c<this.m_props.steps; c++ ) {\n\t\t\tthis.m_els[c].setClass( 'checked', this.m_els[c].getData('value')<=v );\n\t\t}\n\n\t\tthis.m_input.value = ''+this.m_props.value;\n\t}\n\n\tset steps( n: number ) {\n\t\tthis.m_props.steps = n;\n\t\tthis.update( );\n\t}\n\n\tset shape( shape: string ) {\n\t\tthis.removeClass( this.m_props.shape );\n\t\tthis.m_props.shape = shape;\n\t\tthis.addClass( this.m_props.shape );\n\t}\n\n\tprivate _onclick( ev: MouseEvent ) {\n\n\t\tlet on = true;\n\t\tfor( let el=this.dom.firstChild; el; el = el.nextSibling ) {\n\t\t\tlet comp = Component.getElement( <HTMLElement>el );\n\t\t\tcomp.setClass( 'checked', on )\n\n\t\t\tif( el==ev.target ) {\n\t\t\t\tthis.m_input.value = comp.getData( 'value' );\n\t\t\t\ton = false;\n\t\t\t}\n\t\t}\n\n\t\tthis.emit( 'change', EvChange( this.m_props.value) );\n\t} \n}\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file sidebarview.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Component, CProps, Flex, Separator } from './component'\nimport { HLayout, VLayout } from './layout'\nimport { Button } from './button'\nimport { CardView, CardViewProps, ICardViewItem } from './cardview'\nimport { Image } from './image';\n\nexport interface SideBarItem extends ICardViewItem {\n}\n\nexport interface SideBarProps extends CardViewProps {\n\tbar_sizable?: boolean;\n\tbar_width?: number;\n\tlogo?: Image;\n}\n\n/**\n * \n */\n\nexport class SideBarView extends CardView<SideBarProps> {\n\tm_sidebar: VLayout;\n\tm_content: Component;\n\n\tconstructor( props: SideBarProps ) {\n\n\t\tsuper( props );\n\n\t\tthis.addClass( '@hlayout' );\n\n\t\tthis.m_sidebar = new VLayout( {\n\t\t\tcls: '@side-bar',\n\t\t\twidth: props.bar_width ?? undefined,\n\t\t});\n\n\t\tthis.m_content = new HLayout( { flex: 1, cls: '@tab-container' } );\n\t}\n\n\t/** @ignore */\n\trender() {\n\n\t\tlet tabs = [];\n\t\t\n\t\tthis.m_cards.forEach( (p) => {\n\t\t\ttabs.push( p.selector );\n\t\t} );\n\n\t\tthis.m_sidebar.setContent( new VLayout( {\n\t\t\tflex: 1,\n\t\t\tcls: 'content',\n\t\t\tcontent: [\n\t\t\t\tthis.m_props.logo,\n\t\t\t\t...tabs\n\t\t\t]\n\t\t}) );\n\n\t\tthis.setContent( [\n\t\t\tthis.m_sidebar,\n\t\t\tthis.m_props.bar_sizable ? new Separator( { orientation: \"horizontal\", sizing: \"before\" }) : undefined,\n\t\t\tthis.m_content\n\t\t] );\n\t}\n\n\tprotected _prepareSelector( card: ICardViewItem ): Component {\n\t\treturn new Button( {\n\t\t\ttext: card.title,\n\t\t\ticon: card.icon,\n\t\t\ttooltip: card.title,\n\t\t\tclick: ( ) => { this.switchTo( card.name); }\n\t\t});\n\t}\n\n\tprotected _preparePage( page: Component ) {\n\t\tsuper._preparePage( page );\n\t\t\n\t\tif( !page.dom ) {\n\t\t\tthis.m_content.appendChild( page );\n\t\t}\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file svgcomponent.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Component, CProps, _x4_unitless } from './component'\nimport { isNumber, isString } from \"./tools\"\n\nconst reNumber = /^-?\\d+(\\.\\d+)?$/;\n\n// degrees to radian\nfunction d2r( d: number ): number {\n\treturn d * Math.PI / 180.0;\n}\n\n// polar to cartesian\nfunction p2c( x: number, y: number, r: number, deg: number ): {x: number,y: number} {\n\tconst rad = d2r( deg );\n\treturn {\n\t\tx: x + r * Math.cos( rad ),\n\t\ty: y + r * Math.sin( rad )\n\t};\n}\n\nfunction num( x: number ): number {\n\treturn Math.round( x * 1000 ) / 1000;\n}\n\nfunction clean( a, ...b ) {\n\n\t// just round number values to 3 digits\n\tb = b.map( v => {\n\t\tif( typeof v === 'number' && isFinite(v) ) {\n\t\t\treturn num(v);\n\t\t}\n\n\t\treturn v;\n\t});\n\n\treturn String.raw( a, ...b );\n}\n\n/**\n * \n */\n\nexport abstract class SVGItem {\n\tprivate m_tag: string\n\tprivate m_attrs: Map<string,string>;\n\tprivate m_style: Map<string,string>;\n\n\tconstructor( tag: string ) {\n\t\tthis.m_tag = tag;\n\t\tthis.m_attrs = new Map( );\n\t\tthis.m_style = new Map( );\n\t}\n\n\t/**\n\t * render the item\n\t * @returns \n\t */\n\trender( ) : string {\n\t\treturn `<${this.m_tag} ${this.renderAttrs()} ${this.renderStyle()}>${this.renderContent( )}</${this.m_tag}>`;\n\t}\n\n\t/**\n\t * change the stroke color\n\t * @param color \n\t */\n\n\tstroke( color: string, width?: number ): this {\n\t\tthis.attr( 'stroke', color );\n\t\tif( width!==undefined ) {\n\t\t\tthis.attr( 'stroke-width', width+'px' );\t\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * change the stroke width\n\t * @param width \n\t */\n\tstrokeWidth( width: number ): this {\n\t\tthis.attr( 'stroke-width', width+'px' );\n\t\treturn this;\n\t}\n\n\t/**\n\t * change the fill color\n\t * @param color \n\t */\n\n\tfill( color: string ): this {\n\t\tthis.attr( 'fill', color );\n\t\treturn this;\n\t}\n\n\t/**\n\t * define a new attribute\n\t * @param name attibute name\n\t * @param value attribute value\n\t * @returns this\n\t */\n\n\tattr( name: string, value: string ) : this {\n\t\tthis.m_attrs.set( name, value );\n\t\treturn this;\n\t}\n\n\tstyle( name: string, value: string | number ) : this {\n\t\t\n\t\tif (value === undefined || value==='' || value===undefined ) {\n\t\t\tthis.m_style.delete( name );\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\tif (!_x4_unitless[name] && (isNumber(value) || reNumber.test(value))) {\n\t\t\tvalue = value + 'px';\n\t\t}\n\n\t\tthis.m_style.set( name, ''+value );\n\t\treturn this;\n\t}\n\n\t/**\n\t * add a class\n\t * @param name class name to add \n\t */\n\t\n\tclass( name: string ): this {\n\t\tlet c = this.m_attrs.get( 'class' );\n\t\tthis.m_attrs.set( 'class', (c??'' + ' ' + name).trim() );\n\t\treturn this;\n\t}\n\t\n\t/**\n\t * \n\t */\n\t\n\trenderAttrs( ): string {\n\t\tif( !this.m_attrs.size ) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tlet result = '';\n\t\tthis.m_attrs.forEach( (v,k) => {\n\t\t\tresult += ` ${k} = \"${v}\"`\n\t\t});\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * \n\t */\n\t\n\t renderStyle( ): string {\n\n\t\tif( !this.m_style.size ) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tlet result = 'style=\"';\n\t\tthis.m_style.forEach( (v,k) => {\n\t\t\tresult += `${k}:${v};`\n\t\t});\n\n\t\treturn result+'\"';\n\t}\n\t\n\t/**\n\t * \n\t */\n\n\trenderContent( ): string {\n\t\treturn '';\n\t}\n\n\t/**\n\t * \n\t */\n\n\tclip( id: string ): this {\n\t\tthis.attr( \"clip-path\", `url(#${id})` );\n\t\treturn this;\n\t}\n\n\t/**\n\t * \n\t */\n\n\ttransform( tr: string ): this {\n\t\tthis.attr( \"transform\", tr );\n\t\treturn this;\n\t}\n\n\t/**\n\t * \n\t */\n\n\trotate( deg: number, cx: number, cy: number ): this {\n\t\tthis.transform( `rotate( ${deg} ${cx} ${cy} )` );\n\t\treturn this;\n\t}\n\n\ttranslate( dx: number, dy: number ): this {\n\t\tthis.transform( `translate( ${dx} ${dy} )` );\n\t\treturn this;\n\t}\n\n\tscale( x: number ): this {\n\t\tthis.transform( `scale( ${x} )` );\n\t\treturn this;\n\t}\n}\n\n/**\n * \n */\n\nexport class SVGPath extends SVGItem {\n\tprivate m_path: string;\n\n\tconstructor( ) {\n\t\tsuper( 'path' );\n\t\tthis.m_path = '';\n\t}\n\n\toverride renderAttrs(): string {\n\t\tthis.attr( 'd', this.m_path );\n\t\treturn super.renderAttrs( );\n\t}\n\n\t/**\n\t * move the current pos\n\t * @param x new pos x\n\t * @param y new pos y\n\t * @returns this\n\t */\n\n\tmoveTo( x: number, y: number ) : this {\n\t\tthis.m_path += clean`M${x},${y}`;\n\t\treturn this;\n\t}\n\n\t/**\n\t * draw aline to the given point\n\t * @param x end x\n\t * @param y end y\n\t * @returns this\n\t */\n\n\tlineTo( x: number, y: number ): this {\n\t\tthis.m_path += clean`L${x},${y}`;\n\t\treturn this;\n\t}\n\n\t/**\n\t * close the currentPath\n\t */\n\n\tclosePath( ): this {\n\t\tthis.m_path += 'Z';\n\t\treturn this;\n\t}\n\n\t/**\n\t * draw an arc\n\t * @param x center x\n\t * @param y center y\n\t * @param r radius\n\t * @param start angle start in degrees\n\t * @param end angle end in degrees\n\t * @returns this\n\t */\n\n\tarc( x: number, y: number, r: number, start: number, end: number ): this {\n\n\t\tconst st = p2c( x, y, r, start-90 );\n\t\tconst en = p2c( x, y, r, end-90 );\n\n\t\tconst flag = end - start <= 180 ? \"0\" : \"1\";\n\t\tthis.m_path += clean`M${st.x},${st.y}A${r},${r} 0 ${flag} 1 ${en.x},${en.y}`;\n\t\t\n\t\treturn this;\n\t}\n}\n\n/**\n * \n */\n\nexport class SVGText extends SVGItem {\n\n\tprivate m_text;\n\n\tconstructor( x: number, y: number, txt: string ) {\n\t\tsuper( 'text' );\n\t\tthis.m_text = txt;\n\t\tthis.attr( 'x', num(x)+'' );\n\t\tthis.attr( 'y', num(y)+'' );\n\t}\n\n\tfont( font: string ): this {\n\t\tthis.attr( 'font-family', font );\n\t\treturn this;\n\t}\n\n\tfontSize( size: number | string ): this {\n\t\tthis.attr( 'font-size', size+'' );\n\t\treturn this;\n\t}\n\n\tfontWeight( weight: 'light' | 'normal' | 'bold' ): this {\n\t\tthis.attr( 'font-weight', weight );\n\t\treturn this;\n\t}\n\n\ttextAlign( align: 'left' | 'center' | 'right' ): this {\n\n\t\tlet al;\n\t\tswitch( align ) {\n\t\t\tcase 'left': al = 'start'; break;\n\t\t\tcase 'center': al = 'middle'; break;\n\t\t\tcase 'right': al = 'end'; break;\n\t\t\tdefault: return this;\n\t\t}\n\n\t\tthis.attr( 'text-anchor', al );\n\t\treturn this;\n\t}\n\n\tverticalAlign( align: 'top' | 'center' | 'bottom' ): this {\n\n\t\tlet al;\n\t\tswitch( align ) {\n\t\t\tcase 'top': al = 'hanging'; break;\n\t\t\tcase 'center': al = 'middle'; break;\n\t\t\tcase 'bottom': al = 'baseline'; break;\n\t\t\tdefault: return;\n\t\t}\n\n\t\tthis.attr( 'alignment-baseline', al );\n\t\treturn this;\n\t}\n\n\toverride renderContent( ) {\n\t\treturn this.m_text;\n\t}\n}\n\n/**\n * \n */\n\nexport class SVGShape extends SVGItem {\n\tconstructor( tag: string ) {\n\t\tsuper( tag );\n\t}\n}\n\n/**\n * \n */\n\ntype number_or_perc = number | `${string}%`\n\nexport class SVGGradient extends SVGItem {\n\n\tprivate static g_id = 1;\n\n\tprivate m_id: string;\n\tprivate m_stops: { offset: number_or_perc, color: string } [];\n\n\tconstructor( x1: number_or_perc, y1: number_or_perc, x2: number_or_perc, y2: number_or_perc ) {\n\t\tsuper( 'linearGradient')\n\t\t\n\t\tthis.m_id = 'gx-'+SVGGradient.g_id;\n\t\tthis.attr( 'id', this.m_id );\n\t\tthis.attr( 'x1', isString(x1) ? x1 : num(x1)+'' );\n\t\tthis.attr( 'x2', isString(x2) ? x2 : num(x2)+'' );\n\t\tthis.attr( 'y1', isString(y1) ? y1 : num(y1)+'' );\n\t\tthis.attr( 'y2', isString(y2) ? y2 : num(y2)+'' );\n\n\t\tthis.m_stops = [];\n\t\tSVGGradient.g_id++;\n\t}\n\n\tget id( ) {\n\t\treturn 'url(#'+this.m_id+')';\n\t}\n\n\taddStop( offset: number_or_perc, color: string ): this {\n\t\tthis.m_stops.push( {offset,color} );\n\t\treturn this;\n\t}\n\n\toverride renderContent(): string {\n\n\t\tconst result = [];\n\t\tthis.m_stops.forEach( s => {\n\t\t\tresult.push( `<stop offset=\"${s.offset}%\" stop-color=\"${s.color}\"></stop>`);\n\t\t});\n\n\t\treturn result.join('\\n' );\n\t}\n}\n\n/**\n * \n */\n\nexport class SVGGroup extends SVGItem {\n\tprotected m_items: SVGItem[];\n\n\tconstructor( tag = \"g\" ) {\n\t\tsuper( tag )\n\n this.m_items = [];\n\t}\n\n\tpath( ) {\n\t\tconst path = new SVGPath( );\n\t\tthis.m_items.push( path );\n\t\treturn path;\n\t}\n\n\ttext( x, y, txt ) {\n\t\tconst text = new SVGText( x, y, txt );\n\t\tthis.m_items.push( text );\n\t\treturn text;\n\t}\n\n\tellipse( x, y, r1, r2 = r1 ) {\n\t\tconst shape = new SVGShape( 'ellipse' );\n\t\tshape.attr( 'cx', num(x)+'' );\n\t\tshape.attr( 'cy', num(y)+'' );\n\t\tshape.attr( 'rx', num(r1)+'' );\n\t\tshape.attr( 'ry', num(r2)+'' );\n\t\tthis.m_items.push( shape );\n\t\treturn shape;\n\t}\n\n\trect( x, y, w, h ) {\n\t\tconst shape = new SVGShape( 'rect' );\n\t\tshape.attr( 'x', num(x)+'' );\n\t\tshape.attr( 'y', num(y)+'' );\n\t\tshape.attr( 'width', num(w)+'' );\n\t\tshape.attr( 'height', num(h)+'' );\n\t\tthis.m_items.push( shape );\n\t\treturn shape;\n\t}\n\n\tgroup( ) {\n\t\tconst group = new SVGGroup( );\n\t\tthis.m_items.push( group );\n\t\treturn group;\n\t}\n\n\t/**\n\t * \n\t * example\n\t * ```ts\n\t * const g = c.linear_gradient( '0%', '0%', '0%', '100%' )\n\t * \t\t\t\t.addStop( 0, 'red' )\n\t * \t\t\t\t.addStop( 100, 'green' );\n\t * \n\t * p.rect( 0, 0, 100, 100 )\n\t * \t\t.stroke( g.id );\n\t * \n\t * ```\n\t */\n\n\tlinear_gradient( x1: number_or_perc, y1: number_or_perc, x2: number_or_perc, y2: number_or_perc ) {\n\t\tconst grad = new SVGGradient( x1, y1, x2, y2 );\n\t\tthis.m_items.push( grad );\n\t\treturn grad;\n\t}\n\n\t/**\n\t * clear \n\t */\n\n\tclear( ) {\n\t\tthis.m_items = [];\n\t}\n\n\trenderContent( ) {\n\t\tlet result: string[] = [];\n\t\tthis.m_items.forEach( i => {\n\t\t\tresult.push( i.render() );\n\t\t});\n\n\t\treturn result.join( '\\n' );\n\t}\n}\n\n\n/**\n * \n */\n\nexport class SVGPathBuilder extends SVGGroup\n{\n\tprivate static g_clip_id = 1;\n\t\n\tconstructor( ) {\n\t\tsuper( '' );\n\t}\n\n\taddClip( x: number, y: number, w: number, h: number ) {\n \n\t\tconst id = 'c-'+SVGPathBuilder.g_clip_id++;\n\t\tconst clip = new SVGGroup( 'clipPath' );\n\t\tclip.attr('id', id );\n\t\tclip.rect( x, y, w, h );\n\n\t\tthis.m_items.push(clip);\n return id;\n }\n \n render() {\n\n\t\tlet result = [];\n this.m_items.forEach(i => {\n result.push(i.render());\n });\n\n\t\treturn result.join('\\n');\n }\n}\n\n/**\n * \n */\n\n\nexport interface SVGProps extends CProps {\n\tviewBox?: string;\n\tpath?: string;\n}\n\n\nexport class SVGComponent<P extends SVGProps = SVGProps> extends Component<P> {\n\n\tconstructor( props: P ) {\n\t\tsuper( props );\n\n\t\tthis.setTag('svg','http://www.w3.org/2000/svg');\n\t\tthis.setAttribute('xmlns','http://www.w3.org/2000/svg');\n\n\t\tthis.setAttributes( {\n\t\t\tviewBox: props.viewBox,\n\t\t});\n\n\t\tthis.setContent( props.path );\n\t}\n\n\t\n}\n\n\n\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file tabbar.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Component, Container, ContainerEventMap, CProps, EventHandler } from './component';\nimport { Button } from './button';\nimport { EvChange } from './x4events';\nimport { IconID } from './icon.js';\n\ninterface TabBarEventMap extends ContainerEventMap {\n\tchange: EvChange;\n}\n\ninterface TabBarProps extends CProps<TabBarEventMap> {\n\tpages?: ITabPage[];\n\tdefault?: string;\n\tvertical?: boolean;\n\tchange: EventHandler<EvChange>;\n}\n\nexport interface ITabPage {\n\tid: string;\n\ttitle?: string;\n\ticon?: IconID;\n\tpage: Component;\n}\n\ninterface TabPage extends ITabPage {\n\tbtn?: Component;\n}\n\nexport class TabBar extends Container<TabBarProps,TabBarEventMap> {\n\n\tprivate m_pages: TabPage[];\n\tprivate m_curPage: TabPage;\n\n\tconstructor( props: TabBarProps ) {\n\t\tsuper( props );\n\n\t\tthis.m_pages = [];\n\t\tthis.m_curPage = null;\n\n\t\tthis.mapPropEvents( props, 'change' );\n\n\t\tif( props.vertical ) {\n\t\t\tthis.addClass( '@vlayout')\n\t\t}\n\t\telse {\n\t\t\tthis.addClass( '@hlayout')\n\t\t}\n\n\t\tthis.m_props.pages?.forEach( p => this.addPage(p) );\n\t}\n\n\tcomponentCreated(): void {\n\t\tif( this.m_props.default ) {\n\t\t\tthis.select( this.m_props.default, true );\n\t\t}\t\t\n\t}\n\n\taddPage( page: ITabPage ) {\n\t\tthis.m_pages.push( { ...page } );\n\t\tthis._updateContent( );\n\t}\n\n\trender( ) {\n\t\tlet buttons = [];\n\t\tthis.m_pages.forEach( p => {\n\t\t\tp.btn = new Button( { cls: p===this.m_curPage ? 'selected' : '', text: p.title, icon: p.icon, click: () => this._select(p,true) } );\n\t\t\tbuttons.push( p.btn );\n\t\t});\n\n\t\tthis.setContent( buttons );\n\t}\n\n\tselect( id: string | null, notify = false ): boolean {\n\t\tif( !id ) {\n\t\t\tthis._select( null, notify );\n\t\t\treturn true;\n\t\t}\n\t\telse {\n\t\t\tlet page = this.m_pages.find( x => x.id===id );\n\t\t\tif( page ) {\n\t\t\t\tthis._select( page, notify );\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tprivate _select( p: TabPage, notify: boolean ) {\n\n\t\tif( this.m_curPage==p ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif( !this.dom ) {\n\t\t\tthis.m_props.default = p.id;\n\t\t\treturn;\n\t\t}\n\n\t\tif( this.m_curPage ) {\n\t\t\tthis.m_curPage.btn.removeClass( 'selected' );\n\t\t\tif( this.m_curPage.page ) {\n\t\t\t\tthis.m_curPage.page.hide( );\n\t\t\t}\n\t\t}\n\n\t\tthis.m_curPage = p;\n\n\t\tif( notify ) {\n\t\t\tthis.signal( 'change', EvChange(p ? p.id : null) );\n\t\t}\n\n\t\tif( this.m_curPage ) {\n\t\t\tthis.m_curPage.btn.addClass( 'selected' );\n\t\t\tif( this.m_curPage.page ) {\n\t\t\t\tthis.m_curPage.page.show( );\n\t\t\t}\n\t\t}\n\t}\n\n\tget selection( ): Component {\n\t\treturn this.m_curPage?.page;\n\t}\n}\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file tabview.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Component, CProps } from './component'\nimport { HLayout } from './layout'\nimport { Button } from './button'\nimport { CardView, CardViewProps, ICardViewItem } from './cardview'\nimport { MenuItem } from './menu'\n\ninterface TabProps extends CardViewProps\n{\n\ttab_selector?: boolean;\n\tmenu?: MenuItem;\n}\n\n/**\n * Standard TabView class\n */\n\nexport class TabView extends CardView<TabProps>\n{\n\tprotected m_tab_selector: boolean;\n\tprotected m_menu: MenuItem;\n\t\n\tconstructor( props: TabProps ) {\n\t\tsuper( props );\n\n\t\tthis.m_tab_selector = props.tab_selector ? true : false;\n\t\tthis.m_menu = props.menu;\n\n\t\tthis.addClass( '@vlayout' );\n\t}\n\t\n\t/** @ignore */\n\trender() {\n\n\t\tlet tabs = [];\n\t\tlet pages = [];\n\n\t\tif( this.m_menu ) {\n\t\t\tthis.m_menu.addClass( '@button @tab-btn' );\n\t\t\tthis.m_menu.removeClass( '@menu-item' );\n\t\t\ttabs.push( this.m_menu );\n\t\t}\n\n\t\tthis.m_cards.forEach( (p) => {\n\t\t\ttabs.push( p.selector );\n\t\t\tif( !(p.page instanceof Function) ) {\n\t\t\t\tpages.push( p.page );\n\t\t\t}\n\t\t} );\n\n\t\tif( this.m_tab_selector ) {\n\t\t\tpages.unshift( new HLayout( {\n\t\t\t\tcls: '@tab-switch',\n\t\t\t\tcontent: tabs\n\t\t\t}) );\n\t\t}\n\n\t\tthis.setContent( pages );\n\t}\n\n\tprotected _updateSelector( ) {\n\t\n\t}\n\n\tprotected _prepareSelector( card: ICardViewItem ): Component {\n\t\t\n\t\treturn new Button( {\n\t\t\tcls: '@tab-btn',\n\t\t\ttext: card.title,\n\t\t\ticon: card.icon,\n\t\t\tclick: ( ) => { this.switchTo(card.name); }\n\t\t});\n\t}\n\n\tprotected _preparePage( page: Component ) {\n\t\tsuper._preparePage( page );\n\n\t\tif( !page.dom ) {\n\t\t\tthis.appendChild( page );\n\t\t}\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file textarea.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Component, CProps, CEventMap } from './component'\nimport { EvChange, EventCallback } from './x4events'\nimport { asap } from './tools'\n\ninterface TextAreaEventMap extends CEventMap {\n\tchange: EvChange;\n}\n\ninterface Selection {\n\tstart: number;\n\tend: number;\n}\n\nexport interface TextAreaProps extends CProps {\n\ttext?: string;\n\treadOnly?: boolean;\n\ttabIndex?: number;\n\tplaceHolder?: string;\n\tname?: string;\n\trows?: number;\n\tautoGrow?: boolean;\n\tautoFocus?: boolean;\n\tspellcheck?: boolean;\n\n\tchange?: EventCallback<EvChange>;\n}\n\nexport class TextArea extends Component<TextAreaProps, TextAreaEventMap> {\n\n\tconstructor(props: TextAreaProps) {\n\t\tsuper(props);\n\n\t\tthis.mapPropEvents( props, 'change' );\n\t}\n\n\t\n\t/** @ignore */\n\trender(props: TextAreaProps) {\n\n\t\tprops.text = props.text ?? '';\n\n\t\tthis.setAttribute('tabindex', props.tabIndex ?? 0);\n\t\tif( props.spellcheck===false ) {\n\t\t\tthis.setAttribute('spellcheck', 'false' );\n\t\t}\n\n\t\tif (props.readOnly !== undefined) {\n\t\t\tthis.setAttribute('readonly', props.readOnly);\n\t\t}\n\n\t\tif (props.rows) {\n\t\t\tthis.setAttribute('rows', props.rows);\n\t\t}\n\n\t\tif (props.placeHolder) {\n\t\t\tthis.setAttribute('placeholder', props.placeHolder);\n\t\t}\n\n\t\tif (props.autoFocus) {\n\t\t\tthis.setAttribute('autofocus', props.autoFocus);\n\t\t}\n\n\t\tif (props.name) {\n\t\t\tthis.setAttribute('name', props.name);\n\t\t}\n\n\t\tif (props.autoGrow) {\n\t\t\tthis.m_props.autoGrow = true;\n\t\t\tthis.setAttribute('rows', this._calcHeight(props.text));\n\t\t\tthis.setDomEvent('keydown', () => {\n\t\t\t\tasap( ()=>this._updateHeight());\n\t\t\t});\n\t\t}\n\n\t\t// avoid going to next element on enter\n\t\tthis.setDomEvent('keydown', (e: KeyboardEvent) => {\n\t\t\te.stopPropagation();\n\t\t});\n\n\t\tthis.setTag( 'textarea');\n\t\tthis.setDomEvent('input', () => this._change());\n\t}\n\n\tprivate _change() {\n\t\tthis.emit('change', EvChange(this.value));\n\t}\n\n\tcomponentCreated() {\n\t\tthis.value = this.m_props.text;\n\t}\n\n\tget value(): string {\n\n\t\tif (this.dom) {\n\t\t\treturn (<HTMLTextAreaElement>this.dom).value;\n\t\t}\n\n\t\treturn this.m_props.text;\n\t}\n\n\tset value(t: string) {\n\t\tthis.m_props.text = t ?? '';\n\n\t\tif (this.dom) {\n\t\t\t(<HTMLTextAreaElement>this.dom).value = this.m_props.text;\n\n\t\t\tif (this.m_props.autoGrow) {\n\t\t\t\tthis.setAttribute('rows', this._calcHeight(this.m_props.text));\n\t\t\t}\n\t\t}\n\t}\n\t\n\tget text( ): string {\n\t\treturn this.value;\n\t}\n\n\tset text( text: string ) {\n\t\tthis.value = text;\n\t}\n\n\tprivate _calcHeight(text: string): number {\n\t\treturn 1 + (text.match(/\\n/g) || []).length;\n\t}\n\n\tprivate _updateHeight() {\n\t\tconst text = this.value;\n\t\tconst lines = this._calcHeight(text);\n\n\t\tif (this.getData('lines') != lines) {\n\t\t\tthis.setAttribute('rows', lines);\n\t\t\tthis.setData('lines', lines);\n\t\t}\n\t}\n\n\t/**\n\t * @deprected use appendText\n\t * insert text at cursor position\n\t */\n\n\tpublic insertText(text) {\n\t\tthis.appendText( text );\n\t}\n\n\t/**\n\t * append the text\n\t */\n\n\tpublic appendText( text ) {\n\t\tif (this.dom) {\n\t\t\tlet dom = (<HTMLTextAreaElement>this.dom);\n\t\t\tlet end = dom.selectionEnd;\n\t\t\tdom.setRangeText(text,end,end,\"end\");\n\t\t}\n\t}\n\n\tpublic replaceText( text ) {\n\t\tif (this.dom) {\n\t\t\tlet dom = (<HTMLTextAreaElement>this.dom);\n\t\t\tdom.setRangeText(text);\n\t\t}\n\t}\n\n\tpublic getSelection( ) : Selection {\n\t\tif (this.dom) {\n\t\t\tlet dom = (<HTMLTextAreaElement>this.dom);\n\t\t\treturn { start: dom.selectionStart, end: dom.selectionEnd };\n\t\t}\n\t\telse {\n\t\t\treturn {start: 0, end: 0 };\n\t\t}\n\t}\n\n\tpublic setSelection( sel : Selection ) {\n\t\tif (this.dom) {\n\t\t\tlet dom = (<HTMLTextAreaElement>this.dom);\n\t\t\tif( sel.start!==undefined ) {\n\t\t\t\tdom.selectionStart = sel.start;\n\t\t\t}\n\n\t\t\tif( sel.end!==undefined ) {\n\t\t\t\tdom.selectionEnd = sel.end;\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic getStoreValue( ): any {\n\t\treturn this.value;\n\t}\n\n\tpublic setStoreValue( value: any ) {\n\t\tthis.value = value;\n\t}\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file toaster.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { IconID } from './icon';\nimport { Label } from \"./label\";\nimport { Popup, PopupProps} from './popup';\n\n\nexport interface ToasterProps extends PopupProps {\n\tmessage: string;\n\ticon?: IconID;\n}\n\nexport class Toaster extends Popup<ToasterProps> {\n\n\tprivate m_message: string;\n\tprivate m_icon: IconID;\n\n\tconstructor( props: ToasterProps ) {\n\t\tsuper( props );\n\n\t\tthis.m_message = props.message;\n\t\tthis.m_icon = props.icon;\n\t\tthis.enableMask( false );\n\t\tthis.addClass( '@non-maskable' );\n\t}\n\n\t/** @ignore */\t\n\trender( ) {\n\t\tthis.addClass( '@hlayout' );\n\t\tthis.setContent( [\n\t\t\tnew Label( { icon: this.m_icon, text: this.m_message } )\n\t\t]);\n\t}\n\n\tshow( ) {\n\t\tthis.show = super.show;\n\t\tthis.displayAt( 9999, 9999, 'br', {x:0,y:-24} );\n\n\t\tlet opacity = 1.0;\n\n\t\tthis.startTimer( 'fadeout', 2000, false, ( ) => {\n\t\t\t\n\t\t\tthis.startTimer( 'opacity', 100, true, ( ) => {\n\t\t\t\tthis.setStyleValue( 'opacity', opacity );\n\t\t\t\topacity -= 0.1;\n\t\t\t\n\t\t\t\tif( opacity<0 ) {\n\t\t\t\t\tthis.dispose( );\n\t\t\t\t}\n\t\t\t});\n\t\t} );\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file treeview.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Component, Container, ContainerEventMap, ContainerProps, EvDblClick, EventHandler } from './component';\nimport { HtmlString, Rect } from './tools';\nimport { Icon, IconID } from './icon';\nimport { Label } from './label';\nimport { HLayout, VLayout } from './layout';\nimport { EvClick, BasicEvent, EvDrag, EvSelectionChange, EvContextMenu } from './x4events';\n\nexport interface EvExpand extends BasicEvent {\n\tnode: TreeNode;\n}\n\nfunction EvExpand(node: TreeNode) {\n\treturn BasicEvent<EvExpand>({ node });\n}\n\nexport interface HierarchicalNode {\n\tid: number;\n\tname: string;\n\tparent?: number;\n\tcls?: string;\n\tleaf?: boolean\n\ticon?: string;\n\tdata?: any;\n}\n\nexport interface TreeNode {\n\tid: any;\n\ttext?: string | HtmlString;\n\ticon?: IconID;\n\tchildren?: TreeNode[];\n\topen?: boolean;\n\tdata?: any;\n\tparent?: number;\n\tcls?: string;\n}\n\ninterface TreeViewEventMap extends ContainerEventMap {\n\tclick: EvClick;\n\tdblclick: EvDblClick;\n\texpand: EvExpand;\n\tdrag: EvDrag;\n\tselectionchange: EvSelectionChange;\n\tcontextMenu: EvContextMenu;\n}\n\nexport interface TreeViewProps extends ContainerProps<TreeViewEventMap> {\n\troot: TreeNode;\t\t\t// root node\n\tindent?: number;\t\t// items indentation\n\tgadgets?: Component[];\n\tsort?: boolean;\t// sort items\n\tcanDragItems?: boolean;\n\trenderItem?: ( itm: TreeNode ) => Component;\n\n\tdblclick?: EventHandler<EvDblClick>;\n\tselectionchange?: EventHandler<EvSelectionChange>;\n\tdrag?: EventHandler<EvDrag>;\n\tcontextMenu?: EventHandler<EvContextMenu>;\t\n}\n\n\n/**\n * \n */\n\nexport class TreeView extends VLayout<TreeViewProps, TreeViewEventMap> {\n\n\tm_view: Container;\n\tm_container: Container;\n\tm_selection: {\n\t\tid: any;\n\t\tel: Component\n\t};\n\n\tconstructor(props: TreeViewProps) {\n\t\tsuper(props);\n\n\t\tprops.root = props.root;\n\t\tprops.indent = props.indent ?? 8;\n\t\tprops.gadgets = props.gadgets;\n\t\tprops.sort = props.sort ?? false;\n\n\t\tthis.m_selection = null;\n\n\t\tthis.m_container = new Container({ cls: '@scroll-container' });\n\t\tthis.m_view = new Container({\n\t\t\tcls: '@scroll-view',\n\t\t\tflex: 1,\n\t\t\tcontent: this.m_container\n\t\t});\n\n\t\tthis.setContent([\n\t\t\tthis.m_view,\n\t\t\tprops.gadgets ? new HLayout({\n\t\t\t\tcls: 'gadgets',\n\t\t\t\tcontent: props.gadgets\n\t\t\t}) : null,\n\t\t])\n\n\t\tthis.setDomEvent( 'click', (e) => this._click(e) );\n\t\tthis.setDomEvent( 'dblclick', (e) => this._click(e) );\n\t\tthis.setDomEvent('contextmenu', (e) => this._handleCtxMenu(e));\n\t\t\n\t\tif (props.canDragItems) {\n\t\t\tthis.setDomEvent('dragstart', (ev: DragEvent) => {\n\t\t\t\tlet hit = Component.getElement(ev.target as HTMLElement, Component);\n\t\t\t\tlet node = hit?.getData(\"node\");\n\n\t\t\t\tif (node) {\n\t\t\t\t\tev.dataTransfer.effectAllowed = 'move';\n\t\t\t\t\tev.dataTransfer.items.add(JSON.stringify({\n\t\t\t\t\t\ttype: 'treeview',\n\t\t\t\t\t\tid: node.id\n\t\t\t\t\t}), 'string');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tev.preventDefault();\n\t\t\t\t\tev.stopPropagation();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.setDomEvent('dragover', ev => this._dragEnter(ev));\n\t\t\tthis.setDomEvent('dragenter', ev => this._dragEnter(ev));\n\n\t\t\tthis.setDomEvent('dragend', ev => this._dragLeave(ev));\n\t\t\tthis.setDomEvent('dragleave', ev => this._dragLeave(ev));\n\t\t\tthis.setDomEvent('drop', ev => this._dragLeave(ev));\n\n\t\t\tthis.setDomEvent('drop', ev => this._drop(ev) );\n\t\t}\n\n\t\tthis.mapPropEvents(props, 'dblclick', 'drag', 'selectionchange', 'contextMenu' );\n\t}\n\n\tprivate _dragEnter(ev: DragEvent) {\n\t\tev.preventDefault();\n\n\t\tlet hit = Component.getElement(ev.target as HTMLElement, Component);\n\t\tlet node = hit?.getData(\"node\");\n\n\t\tif (node) {\n\t\t\thit.addClass('@drag-over');\n\t\t\tev.dataTransfer.dropEffect = 'move';\n\t\t}\n\t}\n\n\tprivate _dragLeave(ev: Event) {\n\n\t\tlet hit = Component.getElement(ev.target as HTMLElement, Component);\n\t\tlet node = hit?.getData(\"node\");\n\n\t\tif (node) {\n\t\t\thit.removeClass('@drag-over');\n\t\t}\n\t}\n\n\tprivate _drop(ev: DragEvent) {\n\t\tlet hit = Component.getElement(ev.target as HTMLElement, Component);\n\t\tlet node = hit?.getData(\"node\");\n\n\t\tif (!node) {\n\t\t\tnode = this.m_props.root;\n\t\t}\n\n\t\tif (node) {\n\t\t\tlet parent: TreeNode;\n\n\t\t\t// is a folder\n\t\t\tif (node.children) {\n\t\t\t\tparent = node;\n\t\t\t}\n\t\t\t// in it's parent node\n\t\t\telse {\n\t\t\t\tparent = hit.getData(\"parent\");\n\t\t\t}\n\n\t\t\tfor (let i = 0; i < ev.dataTransfer.items.length; i++) {\n\t\t\t\tev.dataTransfer.items[0].getAsString((value) => {\n\t\t\t\t\tlet data = JSON.parse(value);\n\t\t\t\t\tthis.emit('drag', EvDrag( node, data, parent) );\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\trender() {\n\t\tthis.__update( );\n\t}\n\n\tprivate __update( ) {\n\t\tif (this.m_props.root) {\n\t\t\tlet items = [];\n\t\t\tthis._buildBranch(this.m_props.root, -1, items, this.m_props.root);\n\t\t\tthis.m_container.setContent(items);\n\t\t}\n\t}\n\n\tupdateElement( id: any ) {\n\t\tconst { node: child, item } = this._getNode( id );\n\t\tif( child ) {\n\t\t\tconst pn = child.dom.parentNode;\n\t\t\tconst newchild = this._makeNode( item, child.dom.classList.value, child.getData('icon'), child.getData('level') );\n\t\t\tconst dm = newchild._build( );\n\t\t\tpn.replaceChild( dm, child.dom );\n\n\t\t\tif( this.m_selection?.el===child ) {\n\t\t\t\tthis.m_selection.el = newchild;\n\t\t\t}\n\t\t}\n\t}\n\n\tset root(root: TreeNode) {\n\t\tthis.m_props.root = root;\n\t\tthis.update();\n\t}\n\n\topenAll( open = true) {\n\t\tthis.forEach((node: TreeNode) => {\n\t\t\tif( node.children ) {\n\t\t\t\tnode.open = open;\n\t\t\t}\n\t\t});\n\n\t\tthis.__update( )\n\t}\n\n\t/**\n\t * same as root = xxx but keep elements open\n\t */\n\n\trefreshRoot(root: TreeNode) {\n\n\t\tlet openList = [];\n\n\t\tthis.forEach((node: TreeNode): boolean => {\n\t\t\tif (node.open) {\n\t\t\t\topenList.push(node.id);\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\n\t\tlet oldSel = this.selection;\n\t\tif( root ) {\n\t\t\tthis.m_props.root = root;\n\t\t}\n\n\t\tthis.forEach((node: TreeNode): boolean => {\n\n\t\t\tif (openList.indexOf(node.id) >= 0) {\n\t\t\t\tnode.open = true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t});\n\n\t\tthis.__update( );\n\t}\n\n\tprivate _buildBranch(node: TreeNode, level: number, items: Component[], parent: TreeNode) {\n\t\t\n\t\tlet cls = '@tree-item';\n\n\t\tif( node.cls ) {\n\t\t\tcls += ' '+node.cls;\n\t\t}\n\n\t\tif (!node.open && node.children) {\n\t\t\tcls += ' collapsed';\n\t\t}\n\n\t\tif (node.children) {\n\t\t\tcls += ' folder';\n\t\t\tif (node.children.length == 0) {\n\t\t\t\tcls += ' empty';\n\t\t\t}\n\t\t}\n\n\t\tlet icon: IconID = node.icon;\n\t\tif (icon === undefined ) {\n\t\t\tif (node.children) {\n\t\t\t\tif( node.open===true ) {\n\t\t\t\t\ticon = 'var(--x4-icon-chevron-down)';\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ticon = 'var(--x4-icon-chevron-right)';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (level >= 0) {\n\n\t\t\tconst item = this._makeNode( node, cls, icon, level );\n\n\t\t\tif (this.m_selection?.id == node.id) {\n\t\t\t\tthis.m_selection.el = item;\n\t\t\t\titem.addClass('selected');\n\t\t\t}\n\n\t\t\titems.push(item);\n\t\t}\n\n\t\tif (level == -1 || node.open) {\n\t\t\tif (node.children) {\n\n\t\t\t\tif (this.m_props.sort) {\n\t\t\t\t\t// sort items case insensitive:\n\t\t\t\t\t//\tfirst folders\n\t\t\t\t\t//\tthen items \n\t\t\t\t\tnode.children = node.children.sort((a, b) => {\n\t\t\t\t\t\tlet at = (a.children ? '0' + a.text : a.text)?.toLocaleLowerCase();\n\t\t\t\t\t\tlet bt = (b.children ? '0' + b.text : b.text)?.toLocaleLowerCase();\n\t\t\t\t\t\treturn at < bt ? -1 : at > bt ? 1 : 0;\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tnode.children.forEach((c) => {\n\t\t\t\t\tthis._buildBranch(c, level + 1, items, node)\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _renderDef( node: TreeNode ) {\n\t\treturn new Label({ cls: 'tree-label', flex:1, text: node.text });\n\t}\n\n\tprivate _makeNode( node: TreeNode, cls: string, icon: IconID, level: number ): Component {\n\t\t\n\t\tconst item = new HLayout({\n\t\t\tcls,\n\t\t\tcontent: [\n\t\t\t\tnew Icon({ cls: 'tree-icon', icon }),\n\t\t\t\tthis.m_props.renderItem ? this.m_props.renderItem( node ) : this._renderDef( node ),\n\t\t\t],\n\t\t\tdata: {\n\t\t\t\t'node': node,\n\t\t\t\t'level': level,\n\t\t\t\t'icon': icon,\n\t\t\t},\n\t\t\tstyle: {\n\t\t\t\tpaddingLeft: 4 + level * this.m_props.indent\n\t\t\t},\n\t\t\tattrs: {\n\t\t\t\tdraggable: this.m_props.canDragItems ? true : undefined\n\t\t\t},\t\t\t\t\n\t\t});\n\n\n\t\treturn item;\n\t}\n\n\t/**\n\t * \n\t */\n\n\tforEach(cb: (node: TreeNode) => boolean | void ) {\n\t\tlet found = null;\n\n\t\tfunction scan(node) {\n\t\t\tif (cb(node) == true) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (node.children) {\n\t\t\t\tfor (let i = 0; i < node.children.length; i++) {\n\t\t\t\t\tif (scan(node.children[i])) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.m_props.root) {\n\t\t\tscan(this.m_props.root);\n\t\t}\n\n\t\treturn found;\n\t}\n\n\tensureVisible( id: any ) {\n\t\tconst { node } = this._getNode( id );\n\t\tif( node ) {\n\t\t\tnode.scrollIntoView( );\n\t\t}\n\t}\n\n\tset selection(id: any) {\n\t\tthis.select( id, false );\n\t}\n\n\t/**\n\t * care, component should have been created, to select an item at startup,\n\t * use something like \n\t * componentCreated( ) {\n\t * \tmytree.select( id );\n\t * }\n\t */\n\n\tselect( id: any, notify = true ) {\n\t\t\n\t\tif (this.m_selection?.el) {\n\t\t\tthis.m_selection.el.removeClass('selected');\n\t\t}\n\n\t\tthis.m_selection = null;\n\n\t\tif (id !== undefined) {\n\t\t\tconst { node: sel } = this._getNode( id );\n\t\t\tif( sel ) {\n\t\t\t\tthis.m_selection = {\n\t\t\t\t\tid: id,\n\t\t\t\t\tel: sel\n\t\t\t\t};\n\n\t\t\t\tsel.addClass('selected');\n\t\t\t\tsel.scrollIntoView( );\n\n\t\t\t\tif( notify ) {\n\t\t\t\t\tlet nd = sel.getData('node') as TreeNode;\n\t\t\t\t\tthis.emit('selectionchange', EvSelectionChange(nd));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif( notify ) {\n\t\t\t\tthis.emit('selectionchange', EvSelectionChange(null));\n\t\t\t}\n\t\t}\n\t}\n\t\n\n\tprivate _getNode( id ): {node:Component,item:TreeNode} {\n\t\tlet found = { node: null, item: null };\n\n\t\tthis.m_container.enumChilds((c) => {\n\t\t\tlet node = c.getData('node');\n\t\t\tif (node?.id == id) {\n\t\t\t\tfound = {node:c,item:node};\n\t\t\t\treturn true;\n\t\t\t}\n\t\t});\n\n\t\treturn found;\n\t}\n\n\tget selection() {\n\t\treturn this.m_selection?.id;\n\t}\n\n\tgetNodeWithId(id: any): TreeNode {\n\t\treturn this.forEach((node) => node.id == id);\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _click(ev: MouseEvent) {\n\n\t\tlet dom = ev.target as HTMLElement;\n\t\tlet idom = dom;\n\t\tlet onsub = false;\n\n\t\t// avoid getting click on sub childs\n\t\tif( dom.tabIndex!==-1 ) {\n\t\t\tonsub = true;\n\t\t}\n\n\t\twhile (dom != this.dom) {\n\n\t\t\tlet el = Component.getElement(dom);\n\t\t\tlet nd = el?.getData('node') as TreeNode;\n\t\t\tif (nd) {\n\n\t\t\t\tif (nd.children && !onsub ) {\n\t\t\t\t\t// on text or on expando ?\n\t\t\t\t\tif (el.hasClass('selected') || idom.classList.contains('tree-icon') ) {\t//expando\n\t\t\t\t\t\tnd.open = nd.open ? false : true;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.m_selection = { id: nd.id, el: null };\n\n\t\t\t\t\tlet offset = this.m_view?.dom?.scrollTop;\n\t\t\t\t\tthis.update( );\n\t\t\t\t\tif (offset) {\n\t\t\t\t\t\tthis.m_view.dom.scrollTo(0, offset);\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.emit('expand', EvExpand(nd));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.selection = nd.id;\n\n\t\t\t\t\tif( !onsub ) {\n\t\t\t\t\t\tif (ev.type == 'click') {\n\t\t\t\t\t\t\tthis.emit('click', EvClick(nd));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tthis.emit('dblclick', EvDblClick(nd));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.emit('selectionchange', EvSelectionChange(nd));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdom = dom.parentElement;\n\t\t}\n\n\t\tif (ev.type == 'click') {\n\t\t\tthis.m_selection = null;\n\t\t\tthis.update( );\n\t\t\tthis.emit('selectionchange', EvSelectionChange(null) );\t\n\t\t}\n\t}\n\n\tprivate _handleCtxMenu(ev: MouseEvent) {\n\t\tev.preventDefault();\n\t\t\n\t\tlet dom = ev.target as HTMLElement;\n\t\tlet idom = dom;\n\n\t\twhile (dom != this.dom) {\n\n\t\t\tlet el = Component.getElement(dom);\n\t\t\tlet nd = el?.getData('node') as TreeNode;\n\t\t\tif (nd) {\n\t\t\t\tif (nd.children) {\n\t\t\t\t\t// on text or on expando ?\n\t\t\t\t\tif ( idom.classList.contains('tree-icon') ) {\t//expando\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.selection = nd.id;\n\t\t\t\t\n\t\t\t\tthis.emit('click', EvClick(nd) );\n\t\t\t\tthis.emit('contextMenu', EvContextMenu(ev, nd));\n\t\t\t\t\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdom = dom.parentElement;\n\t\t}\n\n\t\tthis.selection = null;\n\t\tthis.emit('contextMenu', EvContextMenu(ev, null));\n\t}\n\n\t/**\n\t * constructs a tree node from an array of strings\n\t * elements are organized like folders (separator = /)\n\t * @example\n\t * let root = TreeView.buildFromString( [\n\t * \t'this/is/a/final/file'\n\t * 'this/is/another/file'\n\t * ] );\n\t */\n\n\tstatic buildFromStrings(paths: string[], separator = '/'): TreeNode {\n\n\t\tlet root: TreeNode = {\n\t\t\tid: 0,\n\t\t\ttext: '<root>',\n\t\t\tchildren: []\n\t\t};\n\n\t\tfunction insert(elements: TreeNode[], path: string) {\n\n\t\t\tlet pos = path.indexOf(separator);\n\t\t\tlet main = path.substr(0, pos < 0 ? undefined : pos);\n\n\t\t\tlet elem: TreeNode;\n\n\t\t\tif (pos >= 0) {\n\t\t\t\telem = elements.find((el) => {\n\t\t\t\t\treturn el.text == main;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (!elem) {\n\t\t\t\telem = {\n\t\t\t\t\tid: path,\n\t\t\t\t\ttext: main,\n\t\t\t\t};\n\n\t\t\t\telements.push(elem);\n\t\t\t}\n\n\t\t\tif (pos >= 0) {\n\t\t\t\tif (!elem.children) {\n\t\t\t\t\telem.children = [];\n\t\t\t\t}\n\n\t\t\t\tinsert(elem.children, path.substr(pos + separator.length));\n\t\t\t}\n\t\t}\n\n\t\tpaths.forEach((path) => {\n\t\t\tinsert(root.children, path);\n\t\t});\n\n\t\treturn root;\n\t}\n\n\t/**\n\t * constructs a tree node from an array of nodes like\n\t * node {\n\t * \tid: number,\n\t * parent: number,\n\t * name: string\n\t * }\n\t */\n\n\tstatic buildFromHierarchy(nodes: HierarchicalNode[], cb?: (node: TreeNode) => void): TreeNode {\n\n\t\tlet root: TreeNode = {\n\t\t\tid: 0,\n\t\t\ttext: '<root>',\n\t\t\tchildren: []\n\t\t};\n\n\t\tlet tree_nodes: TreeNode[] = [];\n\n\t\tfunction insert(node: HierarchicalNode) {\n\n\t\t\tlet elem: TreeNode;\n\t\t\tlet pelem: TreeNode;\n\n\t\t\tif (node.parent > 0) {\n\t\t\t\tpelem = tree_nodes.find((tnode: TreeNode) => tnode.id == node.parent);\n\n\t\t\t\tif (!pelem) {\n\t\t\t\t\tpelem = {\n\t\t\t\t\t\tid: node.parent,\n\t\t\t\t\t\ttext: '',\n\t\t\t\t\t\tchildren: []\n\t\t\t\t\t};\n\n\t\t\t\t\ttree_nodes.push(pelem);\n\t\t\t\t}\n\n\t\t\t\tif (!pelem.children) {\n\t\t\t\t\tpelem.children = [];\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tpelem = root;\n\t\t\t}\n\n\t\t\telem = tree_nodes.find((tnode: TreeNode) => tnode.id == node.id);\n\t\t\tif (!elem) {\n\t\t\t\telem = {\n\t\t\t\t\tid: node.id,\n\t\t\t\t\ttext: node.name,\n\t\t\t\t\tparent: node.parent,\n\t\t\t\t\tcls: node.cls,\n\t\t\t\t\ticon: node.icon,\n\t\t\t\t\tdata: node.data,\n\t\t\t\t};\n\n\t\t\t\tif (!node.leaf) {\n\t\t\t\t\telem.children = [];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\telem.icon = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\telem.text = node.name;\n\t\t\t\telem.parent = node.parent;\n\t\t\t}\n\n\t\t\ttree_nodes.push(elem);\n\t\t\tpelem.children.push(elem)\n\t\t}\n\n\t\tnodes.forEach(insert);\n\t\tif (cb) {\n\t\t\ttree_nodes.forEach(cb);\n\t\t}\n\n\t\treturn root;\n\t}\n}\n\n\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file x4react.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Component, ComponentContent, CProps, CEventMap } from './component';\n\n\nconst createElement = ( clsOrTag, attrs, ...children ): ComponentContent => {\n\n\tlet comp: Component;\n\n\t// fragment\n\tif( clsOrTag==createFragment || clsOrTag==Fragment ) {\n\t\treturn children;\n\t}\n\t// class constructor, yes : dirty\n\telse if( clsOrTag instanceof Function ) {\n\t\tcomp = new (clsOrTag as any)( attrs );\n\t}\n\t// basic tag\n\telse {\n\t\tcomp = new Component( {\n\t\t\ttag: clsOrTag,\n\t\t\t...attrs,\n\t\t});\n\t}\n\n\tif( children && children.length ) {\n\t\tcomp.setContent( children );\n\t}\n\n\treturn comp;\n}\n\nconst Fragment = Symbol( \"fragment\" );\n\nconst createFragment = ( ): ComponentContent => {\n\treturn null;\n}\n\nexport let React = {\n\tcreateElement,\n\tcreateFragment,\n\tFragment,\n}\n\n\n\n\n\n/**\n * \n */\n\n export abstract class TSXComponent<P extends CProps<CEventMap> = CProps<CEventMap>, E extends CEventMap = CEventMap> extends Component<P,E> {\n\tpublic render(props: P) {\n\t\tconst tsx = this.renderTSX( props );\n\t\tif( tsx ) {\n\t\t\tthis.setContent( tsx );\n\t\t}\n\t}\n\n\tpublic abstract renderTSX( props: P ): Component | Component[];\n}\n\n", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file app_sockets.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Application } from \"./application\"\nimport { EvMessage } from \"./x4events\"\n\n/**\n * WEB SOCKETS\n * \n * les messages re\u00E7us par l'application sont retransmis au websocket.\n * comme \u00E7a, tous les clients connect\u00E9s sur le serveur recevront une copie du message.\n * ca permet de mettre a jour les clients dynamiquement\n * \n */\n\nconst msg_sent = Symbol( 'msg_sent' );\n\nexport function setupWSMessaging( closeCB: ( ) => void ) {\n\tconst protocol = window.location.protocol === 'https:' ? 'wss://' : 'ws://';\n\tconst sockets = new WebSocket( `${protocol}${window.location.hostname}:${window.location.port}`, 'messaging' );\n\n\tconst app = Application.instance( );\n\n\t// pour tous les messages recus par l'application\n\t//\ton transmet aux autres\n\tapp.on( 'global', ( e: EvMessage ) => {\n\t\tif( (e as any)[msg_sent] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tsockets.send( JSON.stringify( {\n\t\t\tmsg: e.msg,\n\t\t\tparams: e.params,\n\t\t} ) );\n\t});\n\n\t// reception d'un message\n\tsockets.onmessage = ( e ) => {\n\t\tif( e.data!='ping' ) {\n\t\t\tconst message = JSON.parse(e.data);\n\t\t\tmessage[msg_sent] = true;\n\t\t\tapp.signal( 'global', message );\n\t\t}\n\t}\n\n\t// perte du socket\n\tsockets.onclose = ( ev ) => {\n\t\tconsole.log( 'websocket closed:', ev );\n\t\tcloseCB( );\n\t}\n\n\tsockets.onerror = (ev )=> {\n\t\tconsole.log( 'websocket error:', ev );\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file version.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nexport const x4js_version = \"1.6.0\";"],
5
- "mappings": "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ACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,CACD,CACD,EACA,CACC,MAAO,OACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,CACD,CACD,EACA,CACC,MAAO,SACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,CACD,CACD,EACA,CACC,MAAO,cACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,CACD,CACD,EACA,CACC,MAAO,SACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,CACD,CACD,EACA,CACC,MAAO,OACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,MACN,CACD,CACD,EACA,CACC,MAAO,aACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,MACN,EACA,CACC,OAAQ,IACR,IAAK,MACN,EACA,CACC,OAAQ,IACR,IAAK,MACN,EACA,CACC,OAAQ,IACR,IAAK,MACN,EACA,CACC,OAAQ,IACR,IAAK,KACN,CACD,CACD,EACA,CACC,MAAO,OACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,KACN,EACA,CACC,OAAQ,IACR,IAAK,KACN,EACA,CACC,OAAQ,IACR,IAAK,KACN,EACA,CACC,OAAQ,IACR,IAAK,KACN,EACA,CACC,OAAQ,IACR,IAAK,KACN,CACD,CACD,EACA,CACC,MAAO,OACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,KACN,EACA,CACC,OAAQ,IACR,IAAK,KACN,EACA,CACC,OAAQ,IACR,IAAK,KACN,EACA,CACC,OAAQ,IACR,IAAK,KACN,EACA,CACC,OAAQ,IACR,IAAK,KACN,CACD,CACD,EACA,CACC,MAAO,QACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,CACD,CACD,EACA,CACC,MAAO,cACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,CACD,CACD,EACA,CACC,MAAO,OACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,CACD,CACD,EACA,CACC,MAAO,SACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,CACD,CACD,EACA,CACC,MAAO,QACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,CACD,CACD,EACA,CACC,MAAO,SACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,CACD,CACD,EACA,CACC,MAAO,cACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,CACD,CACD,EACA,CACC,MAAO,QACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,CACD,CACD,EACA,CACC,MAAO,OACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,CACD,CACD,EACA,CACC,MAAO,YACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,C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",
6
- "names": ["x4js_exports", "__export", "AbsLayout", "Application", "AutoComplete", "AutoLayout", "AutoRecord", "BaseButton", "BaseComponent", "BasicEvent", "Button", "CSSParser", "Calendar", "Canvas", "CardView", "CheckBox", "Clipboard", "Color", "ColorPicker", "ColorPickerBox", "ColorPickerEditor", "ComboBox", "Component", "ComputedStyle", "Container", "DataProxy", "DataStore", "DataView", "Dialog", "EvBtnClick", "EvCancel", "EvChange", "EvClick", "EvContextMenu", "EvDataChange", "EvDblClick", "EvDrag", "EvError", "EvFocus", "EvGridCheck", "EvLoaded", "EvMessage", "EvMove", "EvOverlayResize", "EvSelectionChange", "EvSize", "EvTimer", "EvViewChange", "EventSource", "FileUpload", "Flex", "Form", "GridLayout", "GridView", "HLayout", "HtmlString", "Icon", "Image", "ImageUpload", "Input", "Label", "Link", "ListView", "Masonry", "Md5", "Menu", "MenuBar", "MenuItem", "MenuSeparator", "MenuTitle", "MessageBox", "NetworkError", "Panel", "Point", "Popup", "PopupCalendar", "PopupListView", "PromptDialogBox", "PropertyEditor", "RadioBtn", "Rating", "React", "Record", "Rect", "Router", "SVGComponent", "SVGGradient", "SVGGroup", "SVGItem", "SVGPath", "SVGPathBuilder", "SVGShape", "SVGText", "ScrollView", "Separator", "Settings", "SideBarView", "Size", "SizerOverlay", "Space", "Spreadsheet", "Stylesheet", "TSXComponent", "TabBar", "TabView", "TableLayout", "TextArea", "TextEdit", "Toaster", "ToggleButton", "Tooltip", "TreeView", "VLayout", "_date_set_locale", "_tr", "_x4_unitless", "addTranslation", "ajax", "ajaxAsJSON", "ajaxAsText", "ajaxRequest", "asap", "bool_formatter", "calcAge", "camelCase", "clamp", "classNames", "crc32", "createLanguage", "data", "date_calc_weeknum", "date_clone", "date_diff", "date_format", "date_formatter", "date_hash", "date_sql_utc", "date_to_sql", "deferCall", "downloadData", "dragManager", "drawText", "escapeHtml", "flyWrap", "formatIntlDate", "generatePassword", "getAvailableLanguages", "getCurrentLanguage", "getMousePos", "html", "initTooltips", "installHMR", "isArray", "isFunction", "isHtmlString", "isLanguage", "isLiteralObject", "isNumber", "isString", "isTouchDevice", "markdownToHtml", "mix", "money_formatter", "money_formatter_nz", "openFileDialog", "pad", "parseIntlDate", "parseIntlFloat", "pascalCase", "removeHtmlTags", "roundTo", "saveFileDialog", "selectLanguage", "setCurrencySymbol", "setupWSMessaging", "sprintf", "sql_date_formatter", "waitFontLoading", "x4app", "x4js_version", "__toCommonJS", "x4document", "stopPropagation", "__name", "preventDefault", "BasicEvent", "params", "EvClick", "context", "EvChange", "value", "EvSelectionChange", "selection", "EvContextMenu", "uievent", "EvTimer", "timer", "time", "EvMessage", "msg", "source", "EvDrag", "element", "data", "ctx", "EvError", "code", "message", "EventSource", "type", "event", "eventName", "e", "listeners", "defaultHandler", "temp", "i", "n", "delay", "call", "callback", "newCallback", "ev", "resolve", "handlers", "stack", "idx", "events", "capturing", "BaseComponent", "EventSource", "#m_timers", "props", "name", "timeout", "repeat", "callback", "id", "tm", "EvTimer", "clear", "v", "elements", "n", "__name", "sym_lang", "languages", "createLanguage", "name", "base", "__name", "isLanguage", "addTranslation", "parts", "lang", "p", "_patch", "_proxyfy", "obj", "by", "n", "src", "root", "result", "_mk_proxy", "target", "prop", "req_path", "value", "_findBaseTrans", "trans", "_tr", "selectLanguage", "getCurrentLanguage", "getAvailableLanguages", "fr", "en", "isTouchDevice", "__name", "roundTo", "num", "ndec", "mul", "res", "parseIntlFloat", "pascalCase", "string", "result", "__name", "camelCase", "text", "m", "chr", "Point", "x", "y", "Size", "w", "h", "Rect", "left", "top", "width", "height", "rc", "bottom", "right", "dx", "dy", "arg", "sprintf", "format", "args", "match", "index", "escapeHtml", "unsafe", "nl_br", "c", "removeHtmlTags", "isString", "ret_val", "ch", "cur_locale", "_date_set_locale", "locale", "date_format", "date", "options", "formatIntlDate", "date_diff", "date1", "date2", "dt", "sec", "_tr", "min", "hrs", "date_to_sql", "withHours", "date_sql_utc", "date_hash", "date_clone", "date_calc_weeknum", "firstDayOfYear", "pastDaysOfYear", "parseIntlDate", "value", "fmts", "formats", "fmatch", "smatch", "now", "d", "i", "s", "ty", "tm", "td", "fmt", "esc", "pad", "calcAge", "birth", "ref", "age", "days", "downloadData", "data", "mimetype", "filename", "blob", "url", "a", "x4document", "val", "isArray", "isFunction", "isLiteralObject", "what", "size", "isNumber", "waitFontLoading", "name", "ct", "resolve", "irc", "deferCall", "fn", "asap", "cb", "markdownToHtml", "lines", "state", "div", "l", "txt", "lvl", "reBold", "sub", "reItalic", "NetworkError", "b", "getMousePos", "ev", "fromDoc", "x_name", "y_name", "em", "et", "clamp", "v", "max", "HtmlString", "html", "isHtmlString", "Clipboard", "crc32", "str", "crc", "buf", "crc32tab", "mix", "superclass", "MixinBuilder", "mixins", "mixin", "classNames", "cls", "generatePassword", "length", "rules", "allChars", "allMin", "rule", "pswd", "shuffle", "maxlength", "shuffled", "installHMR", "host", "port", "reloadCallback", "refreshCSS", "sheets", "head", "elem", "rel", "address", "socket", "msg", "_Stylesheet", "getStyleSheet", "name", "x4document", "sheet", "__name", "dom", "definition", "isString", "index", "idx", "r", "rule", "css", "i", "values", "j", "Stylesheet", "__publicField", "CSSParser", "rules", "ret", "a", "scope", "property", "value", "isArray", "n", "pascalCase", "snames", "names", "scopes", "s", "sub", "properties", "browser_specials", "ComputedStyle", "style", "_x4_ns_prefix", "_x4_el_store", "_x4_el_sym", "_x4_unitless", "unbubbleEvents", "passiveEvents", "reNumber", "EvDblClick", "context", "BasicEvent", "__name", "EvFocus", "focus", "_Component", "BaseComponent", "props", "content", "refreshAll", "append", "c", "isArray", "item", "x", "tag", "namespace", "name", "value", "data", "show", "enable", "style", "s", "isNumber", "pseudoElt", "ComputedStyle", "attrs", "a", "add", "classes", "remove", "cls", "set", "toggle", "ename", "vdom", "x4document", "sty", "att", "attr", "evt", "e", "handlers", "h", "el", "isString", "isHtmlString", "tabIndex", "defValue", "mutations", "notify", "mutation", "i", "with_dom", "timers", "_dom", "delay", "_update", "oldDOM", "newDOM", "withMargins", "r", "rc", "Rect", "st", "tm", "bm", "lm", "rm", "type", "listener", "passive", "_listener", "listeners", "store", "handler", "ev", "target", "noup", "root", "fn", "eventType", "eventStore", "entries", "entry", "dom", "cb", "recursive", "cel", "component", "me", "clsname", "pascalCase", "event", "initiator", "iframes", "f", "flyWrap", "overs", "cursor", "elementOver", "mask", "arg", "rel", "top", "bot", "left", "right", "pn", "bdy", "pr", "selector", "result", "elements", "id", "ref", "Stylesheet", "elParent", "classname", "srhCls", "outerDiv", "innerDiv", "Component", "__publicField", "fly_element", "Flex", "Space", "size", "EvSize", "mode", "Separator", "te", "y", "__move", "ex", "ey", "width", "Size", "height", "mev", "tev", "prevDom", "prevEl", "nextDom", "nextEl", "EvOverlayResize", "ui_event", "sens", "SizerOverlay", "eev", "pos", "getMousePos", "EvShortcut", "Container", "sequence", "callback", "immediate", "seq", "reseq", "sk", "asap", "Settings", "name", "value", "defValue", "data", "__name", "parseRoute", "str", "loose", "arr", "keys", "pattern", "tmp", "c", "o", "ext", "__name", "Router", "EventSource", "useHash", "event", "url", "found", "h", "uri", "handler", "x4document", "notify", "replace", "EvError", "matches", "params", "handlers", "j", "k", "_x4_touch_time", "_Application", "BaseComponent", "props", "settings_name", "Settings", "x4app", "Router", "root", "clearBefore", "ddom", "x4document", "dest", "flyWrap", "title", "ev", "enter", "now", "tch", "fake", "Component", "Application", "__name", "__publicField", "AbsLayout", "Container", "__name", "HLayout", "VLayout", "AutoLayout", "props", "horz", "rc", "GridLayout", "TableLayout", "row", "col", "create", "idx", "_mkid", "cell", "update", "Component", "c", "item", "data", "rowCount", "colCount", "width", "height", "cls", "rows", "skip", "r", "cols", "cdata", "cc", "rs", "cs", "sr", "sc", "rdata", "rr", "ScrollView", "Component", "props", "content", "container", "isArray", "VLayout", "__name", "Masonry", "Container", "items", "item", "style", "rowHeight", "rowGap", "rc", "rowSpan", "itm", "EvMove", "pos", "BasicEvent", "__name", "_Popup", "Container", "props", "enable", "modal", "focus", "x4document", "elUI", "flyWrap", "Application", "autofocus", "tabbable", "el", "rc", "x", "y", "align", "offset", "halign", "valign", "rm", "index", "els", "sens", "SizerOverlay", "e", "event", "irc", "st", "ev", "tm", "lm", "bm", "ix", "iy", "mp", "getMousePos", "Component", "ne", "__move", "ex", "ey", "left", "top", "width", "height", "dx", "dy", "px", "py", "newsize", "Size", "EvSize", "me", "tev", "Popup", "__publicField", "x4handleKeyDown", "target", "topStack", "_nextTab", "root", "prev", "focusEl", "comp", "tab_indexes", "ct", "installKBHandler", "EvAction", "source", "BasicEvent", "__name", "Action", "BaseComponent", "props", "t", "EvChange", "i", "EvLoaded", "url", "svg", "context", "BasicEvent", "__name", "trimQuotes", "str", "l", "Loader", "EventSource", "r", "svgLoader", "_Icon", "Component", "props", "isString", "icon", "remove_old", "name", "reVar", "match_var", "varname", "Stylesheet", "reSvg", "reSvg2", "match_svg", "match_dta", "match_cls", "classes", "match_url", "match_char", "css", "rulename", "rule", "set", "ev", "HtmlString", "pth", "Icon", "__publicField", "Label", "Component", "param", "HtmlString", "props", "text", "escapeHtml", "Icon", "txt", "comp", "icon", "ico", "__name", "MenuSeparator", "Component", "__name", "MenuTitle", "Label", "_Menu", "Popup", "props", "opener", "yes", "menu", "x4document", "ev", "elOn", "mouseon", "args", "x", "y", "align", "offset", "getMousePos", "Menu", "__publicField", "MenuItem", "a", "b", "Action", "isString", "e", "icon", "text", "popIco", "Icon", "EvClick", "doClose", "parent_menu", "rc", "MenuBar", "HLayout", "ListView", "VLayout", "props", "e", "items", "keepSel", "ev", "moveSel", "__name", "sens", "isFunction", "newsel", "index", "item", "citem", "Container", "HLayout", "forceUpdate", "update", "newTop", "list_items", "selId", "selFnd", "rc", "limit", "y", "top", "height", "count", "newels", "cache", "it", "itm", "c", "t", "newItem", "dom", "self", "Component", "id", "event", "EvClick", "EvDblClick", "EvContextMenu", "notify", "EvSelectionChange", "prepend", "select", "idx", "was_sel", "oldDOM", "_new", "newDOM", "EvCancel", "context", "BasicEvent", "PopupListView", "Popup", "newfocus", "MenuItem", "modal", "x4document", "itemId", "tipTmo", "tooltip", "Tooltip", "Component", "text", "Icon", "Label", "x", "y", "align", "halign", "valign", "rc", "x4document", "rm", "__name", "initTooltips", "cb", "isTouchDevice", "tipTarget", "handle_mpos", "event", "handle_mouse", "target", "tip", "_hideTip", "Input", "Component", "props", "text", "Tooltip", "x4document", "rc", "dom", "upper", "value", "type", "files", "file", "v", "newval", "ro", "start", "length", "idom", "__name", "BaseButton", "Component", "props", "e", "action", "icon", "text", "ui_icon", "Icon", "ui_label", "Label", "ui_ricon", "start", "ev", "menu", "Menu", "isFunction", "rc", "EvClick", "label", "ico", "items", "__name", "Button", "ToggleButton", "EvChange", "ic", "Calendar", "VLayout", "props", "month_start", "date_clone", "day", "dte", "today", "month_end", "end_of_month", "date_hash", "rows", "header", "HLayout", "Label", "formatIntlDate", "Flex", "Button", "day_names", "d", "_tr", "cmonth", "first", "days", "Component", "cls", "mkItem", "__name", "date", "EvChange", "n", "type", "items", "m", "MenuItem", "min", "max", "menu", "Menu", "rc", "PopupCalendar", "Popup", "newfocus", "modal", "at", "x4document", "reEmail", "TextEdit", "Component", "props", "eprops", "def_hook", "e", "Input", "button", "Button", "ag", "b", "gadgets", "width", "flex", "labelWidth", "label", "labelAlign", "top", "Label", "HLayout", "ena", "EvClick", "fmt", "value", "date", "parseIntlDate", "formatIntlDate", "dte", "text", "start", "length", "ro", "EvChange", "EvFocus", "update", "_tr", "pattern", "re", "v", "min", "max", "err", "sprintf", "btn", "PopupCalendar", "ev", "rc", "__name", "AutoComplete", "TextEdit", "props", "e", "items", "show", "cstyle", "fontFamily", "fontSize", "PopupListView", "value", "c", "r1", "focus", "__name", "EvPaint", "ctx", "BasicEvent", "__name", "mkPainter", "c2d", "w", "h", "cp", "smoothLine", "smoothLineEx", "line", "roundRect", "calcTextSize", "setFontSize", "circle", "points", "path", "move", "midPointBtw", "p1", "p2", "getQuadraticXY", "t", "sx", "sy", "cp1x", "cp1y", "ex", "ey", "p3", "i", "len", "midPoint", "x", "y", "_points", "tension", "numOfSeg", "close", "p", "pc", "pts", "l", "rPos", "rLen", "res", "cache", "cachePtr", "st", "st2", "st3", "st23", "st32", "parse", "pt1", "pt2", "pt3", "pt4", "t1x", "t1y", "t2x", "t2y", "c", "c1", "c2", "c3", "c4", "x1", "y1", "x2", "y2", "color", "lineWidth", "width", "height", "radius", "text", "rounded", "fh", "lh", "fs", "fsize", "Canvas", "Component", "props", "delay", "scale", "wait", "dom", "canvas", "devicePixelRatio", "backingStoreRatio", "ratio", "rw", "rh", "cc", "CardView", "Component", "props", "pages", "p", "name", "page", "card", "isFunction", "EvChange", "active", "asap", "__name", "CheckBox", "Component", "props", "labelWidth", "uid", "Input", "Label", "EvChange", "ck", "dom", "text", "__name", "colorValues", "_Color", "r", "g", "b", "a", "argc", "self", "_init", "base", "alpha", "__name", "percent", "p", "v", "c1", "c2", "e1", "e2", "A", "R", "G", "B", "f", "el", "h", "s", "i", "q", "t", "c", "max", "min", "delta", "saturation", "value", "hue", "l", "hue2rgb", "color", "minval", "maxval", "rnorm", "gnorm", "bnorm", "mdiff", "msum", "light", "satur", "with_alpha", "_hx", "name", "Stylesheet", "str", "m", "gr", "std", "varName", "Color", "__publicField", "n", "DEFAULT_TIMEOUT", "ajaxRequest", "cfg", "params", "url", "method", "formdata", "buildQuery", "xhr", "progress", "failure", "success", "h", "ev", "disp", "humanSize", "e", "__name", "bytes", "unit", "value", "getMethod", "query", "key", "param", "isArray", "i", "n", "result", "ajaxAsJSON", "init", "ajax", "ajaxAsText", "type", "options", "isString", "cvt", "isLiteralObject", "response", "NetworkError", "EvDataChange", "type", "id", "BasicEvent", "__name", "MetaInfos", "name", "metaFields", "_getMetas", "obj", "create", "ctor", "mfld", "pctor", "Record", "pmetas", "data", "ownerCls", "fldName", "metas", "field", "string", "props", "int", "float", "bool", "date", "calc", "array", "source", "rec", "errs", "fi", "fd", "f", "fields", "sf", "value", "input", "ffv", "mul", "isString", "result", "v", "idx", "fld", "AutoRecord", "fnames", "n", "DataProxy", "BaseComponent", "url", "r", "raw", "json", "EvChange", "DataStore", "EventSource", "ev", "records", "realRecords", "index", "maxID", "rid", "lim", "base", "p", "other", "opts", "eopts", "DataView", "filter", "iidx", "fn", "_lt", "recval", "filterValue", "_le", "_eq", "_neq", "_ge", "_gt", "_re", "filterRe", "filterFld", "filterFn", "sort", "bads", "fidxs", "si", "ia", "ib", "va", "vb", "fidx", "cb", "ri", "EvViewChange", "action", "isArray", "e", "notify", "ridx", "ComboBox", "HLayout", "props", "e", "items", "Component", "input", "Input", "v", "text", "width", "flex", "labelWidth", "Label", "Button", "filter_items", "isFunction", "filter", "cstyle", "fontFamily", "fontSize", "PopupListView", "r1", "r2", "_tr", "ev", "item", "EvSelectionChange", "EvChange", "fireEv", "id", "focus", "view", "DataStore", "result", "rec", "index", "__name", "Form", "VLayout", "props", "content", "height", "items", "buttons", "els", "refreshAll", "name", "enable", "button", "HLayout", "btns", "b", "Component", "Button", "_tr", "inputs", "result", "input", "TextEdit", "combo", "ComboBox", "btn", "EvBtnClick", "values", "elements", "e", "item", "type", "el", "value", "cfg", "cbvalidation", "form", "ajaxRequest", "flyWrap", "set", "__name", "EvBtnClick", "button", "BasicEvent", "__name", "Dialog", "Popup", "props", "content", "width", "height", "isFunction", "e", "Form", "ev", "rc", "EvSize", "geom", "Rect", "hasTitle", "HLayout", "Icon", "Label", "isTouchDevice", "els", "refreshAll", "buttons", "event", "x", "y", "getMousePos", "wrc", "flyWrap", "x4document", "dx", "dy", "now", "delta", "__move", "ex", "ey", "Component", "mev", "tev", "EvMove", "saveRect", "title", "name", "result", "_ColorPicker", "Container", "props", "e", "menu", "Menu", "MenuItem", "pt", "getMousePos", "Color", "fillSubs", "colors", "sub_sel", "mc", "clr", "selected", "ccolor", "cls", "classNames", "el", "Component", "cur", "selector", "__name", "main_sel", "materialColors", "color", "c", "VLayout", "HLayout", "TextEdit", "ev", "CheckBox", "cell", "subs", "rc", "clamp", "edit", "gradient", "EvChange", "ColorPicker", "__publicField", "ColorPickerBox", "Dialog", "customs", "cc", "custom", "els", "i", "lne", "j", "idx", "Label", "msg", "isString", "ColorPickerEditor", "tcolor", "v", "dlg", "x_drag_cb", "DragManager", "el", "ev", "x4document", "cb", "filterCB", "dragEnter", "__name", "dragOver", "infos", "Point", "dragLeave", "drop", "leaving", "x", "entering", "dragManager", "defStyle", "drawText", "ctx", "input_Text", "rc", "drawStyle", "center", "Point", "rad", "fontSize", "roundTo", "style", "family", "textarray", "lines", "columns", "gap", "col_width", "col_left", "hlimit", "spaceW", "_measureText", "text", "line", "lwidth", "words", "w", "n", "e", "word", "test", "textSize", "_calcTextHeight", "lineHeight", "nlines", "col_top", "fullHeight", "justify", "column", "y", "align", "maxw", "_justify", "x", "cw", "__name", "size", "width", "delta", "emptyImageSrc", "_isStaticImage", "src", "__name", "_Image", "Component", "props", "mp", "x", "force", "newList", "done", "lazy", "dom", "rc", "x4document", "Image", "__publicField", "FileUpload", "HLayout", "props", "__name", "ImageUpload", "ename", "Component", "Image", "Input", "v", "e", "self", "createThumbnail", "file", "reader", "allowedTypes", "files", "filesLen", "i", "imgType", "g_file_input", "_createFileInput", "x4document", "openFileDialog", "extensions", "cb", "multiple", "fi", "evt", "saveFileDialog", "defFileName", "locale", "moneyFmt", "setCurrencySymbol", "symbol", "__name", "sql_date_formatter", "input", "dte", "options", "date_formatter", "formatIntlDate", "money_formatter", "val", "roundTo", "money_formatter_nz", "bool_formatter", "T_UPDATE", "EvGridCheck", "rec", "chk", "BasicEvent", "__name", "ColHeader", "Component", "props", "title", "Icon", "v", "sens", "ic", "GridView", "VLayout", "e", "_tr", "select", "sel", "scrolltype", "index", "event", "id", "itm", "store", "DataStore", "ev", "recId", "Label", "flex", "cols", "col", "cls", "comp", "flyWrap", "resizeCol", "SizerOverlay", "Flex", "full_width", "HLayout", "foots", "width", "_col", "updateFlex", "c", "name", "asc", "$hdr", "gr", "x4document", "gv", "rc", "row", "n", "canOpt", "rh", "height", "top", "y", "cidx", "count", "even", "w", "limit", "rowid", "crow", "r", "rrow", "cell", "fmt", "text", "html", "show", "msg", "forceUpdate", "update", "newTop", "newLeft", "dom", "self", "hit", "EvDblClick", "idx", "i", "item", "dom_item", "scrollIntoView", "old", "EvSelectionChange", "EvContextMenu", "filename", "data", "fsep", "lsep", "record", "downloadData", "icon", "ids", "cid", "value", "isFunction", "Link", "Component", "props", "EvClick", "text", "href", "isHtmlString", "html", "__name", "_Md5", "str", "raw", "x", "hc", "ho", "n", "offset", "j", "i", "k", "a", "b", "c", "d", "buf8", "buf32", "bufLen", "code", "input", "self", "s", "state", "buf", "dataBitsLen", "matches", "lo", "hi", "Md5", "__name", "__publicField", "MessageBox", "Dialog", "props", "icon", "buttons", "msg", "HLayout", "Icon", "Label", "ev", "asap", "txt", "isString", "isHtmlString", "resolve", "reject", "_props", "cb", "__name", "btn", "text", "title", "PromptDialogBox", "TextEdit", "inputCallback", "Panel", "VLayout", "props", "sens", "Label", "Component", "gadgets", "icon", "Icon", "HLayout", "els", "text", "__name", "CellData", "__name", "__publicField", "Spreadsheet", "VLayout", "props", "e", "col", "width", "title", "columns", "before", "new_cells_data", "celldata", "key", "row", "_getid", "_mkid", "new_rows_data", "rowdata", "rowtodel", "column", "inspos", "coltodel", "raw", "value", "focus", "dom", "self", "itm", "Component", "EvContextMenu", "cols", "index", "comp", "SizerOverlay", "ev", "HLayout", "g1", "x4document", "g2", "g3", "rc", "fullw", "nwide", "calcw", "calcz", "calcm", "colIdx", "minw", "cw", "z", "restw", "i", "rest", "cell", "rh", "height", "top", "y", "cidx", "rowIdx", "count", "right_pos", "w", "even", "c", "full_width", "limit", "x", "cls", "text", "EvDblClick", "scrollIntoView", "lastcol", "doscroll", "mode", "last", "forceUpdate", "newTop", "newLeft", "sensy", "sensx", "sel", "newRow", "newCol", "l1", "trys", "l2", "event", "oldSel", "newSel", "EvSelectionChange", "max_row", "uid", "parseIntlFloat", "forceText", "forcedText", "place", "parent", "prc", "edtBuilder", "TextEdit", "cellvalue", "movesel", "deferCall", "input", "sens", "ComboBox", "save", "id", "old", "EvChange", "asap", "start", "PropertyEditor", "Component", "props", "Spreadsheet", "_tr", "a", "e", "fields", "record", "fld", "lno", "ev", "ctx", "text", "EvChange", "rec", "row", "col", "editor", "TextEdit", "Input", "CheckBox", "values", "view", "field", "choices", "i", "__name", "RadioBtn", "Component", "props", "text", "name", "labelWidth", "checked", "align", "value", "icon", "Input", "Label", "query", "x4document", "dom", "EvChange", "ck", "__name", "Rating", "HLayout", "props", "shape", "value", "Input", "e", "i", "cls", "c", "Component", "v", "n", "ev", "on", "el", "comp", "EvChange", "__name", "SideBarView", "CardView", "props", "VLayout", "HLayout", "tabs", "p", "Separator", "card", "Button", "page", "__name", "reNumber", "d2r", "d", "__name", "p2c", "x", "y", "r", "deg", "rad", "num", "clean", "a", "b", "v", "SVGItem", "tag", "color", "width", "name", "value", "_x4_unitless", "isNumber", "c", "result", "k", "id", "tr", "cx", "cy", "dx", "dy", "SVGPath", "start", "end", "st", "en", "flag", "SVGText", "txt", "font", "size", "weight", "align", "al", "SVGShape", "_SVGGradient", "x1", "y1", "x2", "y2", "isString", "offset", "s", "SVGGradient", "__publicField", "SVGGroup", "path", "text", "r1", "r2", "shape", "w", "h", "group", "grad", "i", "_SVGPathBuilder", "clip", "SVGPathBuilder", "SVGComponent", "Component", "props", "TabBar", "Container", "props", "p", "page", "buttons", "Button", "id", "notify", "x", "EvChange", "__name", "TabView", "CardView", "props", "tabs", "pages", "p", "HLayout", "card", "Button", "page", "__name", "TextArea", "Component", "props", "asap", "e", "EvChange", "t", "text", "lines", "dom", "end", "sel", "value", "__name", "Toaster", "Popup", "props", "Label", "opacity", "__name", "EvExpand", "node", "BasicEvent", "__name", "TreeView", "VLayout", "props", "Container", "HLayout", "e", "ev", "Component", "hit", "parent", "i", "value", "data", "EvDrag", "items", "id", "child", "item", "pn", "newchild", "dm", "root", "open", "openList", "oldSel", "level", "cls", "icon", "b", "at", "bt", "c", "Label", "Icon", "cb", "found", "scan", "notify", "sel", "nd", "EvSelectionChange", "dom", "idom", "onsub", "el", "offset", "EvClick", "EvDblClick", "EvContextMenu", "paths", "separator", "insert", "elements", "path", "pos", "main", "elem", "nodes", "tree_nodes", "pelem", "tnode", "createElement", "__name", "clsOrTag", "attrs", "children", "comp", "createFragment", "Fragment", "Component", "React", "TSXComponent", "props", "tsx", "msg_sent", "setupWSMessaging", "closeCB", "protocol", "sockets", "app", "Application", "e", "message", "ev", "__name", "x4js_version"]
4
+ "sourcesContent": ["/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file x4js.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nexport * from \"./application\"\nexport * from \"./autocomplete\"\nexport * from \"./base_component\"\n//export * from \"./base64\"\nexport * from \"./button\"\nexport * from \"./calendar\"\nexport * from \"./canvas\"\nexport * from \"./cardview\"\nexport * from \"./checkbox\"\nexport * from \"./color\"\nexport * from \"./colorpicker\"\nexport * from \"./combobox\"\nexport * from \"./component\"\nexport * from \"./datastore\"\nexport * from \"./dialog\"\nexport * from \"./dom_events\"\nexport * from \"./drag_manager\"\nexport * from \"./drawtext\"\nexport * from \"./fileupload\"\nexport * from \"./form\"\nexport * from \"./formatters\"\nexport * from \"./gridview\"\nexport * from \"./i18n\"\nexport * from \"./icon\"\nexport * from \"./image\"\nexport * from \"./input\"\nexport * from \"./label\"\nexport * from \"./layout\"\nexport * from \"./link\"\nexport * from \"./listview\"\nexport * from \"./md5\"\nexport * from \"./menu\"\nexport * from \"./messagebox\"\nexport * from \"./panel\"\nexport * from \"./popup\"\nexport * from \"./property_editor\"\nexport * from \"./radiobtn\"\nexport * from \"./rating\"\nexport * from \"./request\"\nexport * from \"./router\"\nexport * from \"./settings\"\nexport * from \"./sidebarview\"\n//export * from \"./smartedit\"\nexport * from \"./spreadsheet\"\nexport * from \"./styles\"\nexport * from \"./svgcomponent\"\nexport * from \"./tabbar\"\nexport * from \"./tabview\"\nexport * from \"./textarea\"\nexport * from \"./textedit\"\n//export * from \"./texthiliter\"\nexport * from \"./toaster\"\nexport * from \"./tools\"\nexport * from \"./tooltips\"\nexport * from \"./treeview\"\nexport * from \"./x4events\"\nexport * from \"./x4react\"\nexport * from \"./app_sockets\"\n\nexport * from \"./version\"", "/**\r\n* ___ ___ __\r\n* \\ \\_/ / / _\r\n* \\ / /_| |_\r\n* / _ \\____ _| \r\n* /__/ \\__\\ |_|\r\n* \r\n* @file x4events.ts\r\n* @author Etienne Cochard \r\n*\r\n* Copyright (c) 2019-2023 R-libre ingenierie\r\n*\r\n* Permission is hereby granted, free of charge, to any person obtaining a copy \r\n* of this software and associated documentation files (the \"Software\"), to deal \r\n* in the Software without restriction, including without limitation the rights \r\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \r\n* of the Software, and to permit persons to whom the Software is furnished to do so, \r\n* subject to the following conditions:\r\n* The above copyright notice and this permission notice shall be included in all copies\r\n* or substantial portions of the Software.\r\n*\r\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \r\n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \r\n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \r\n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \r\n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n**/\r\n\r\n/**\r\n * SSR preparation\r\n */\r\n\r\ninterface IX4Document {\r\n\tcreateElement<K extends keyof HTMLElementTagNameMap>(tagName: K, options?: ElementCreationOptions): HTMLElementTagNameMap[K];\r\n\tcreateElementNS(namespace: string | null, qualifiedName: string, options?: string | ElementCreationOptions): Element;\r\n\tcreateTextNode(data: string): Text;\r\n\r\n\taddEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;\r\n\tremoveEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;\r\n\r\n\tquerySelectorAll<E extends Element = Element>(selectors: string): NodeListOf<E>;\r\n\tquerySelector<E extends Element = Element>(selectors: string): E | null;\r\n\r\n\tget body( ) : HTMLElement;\r\n\tget activeElement( ): Element;\r\n\tget location( ): Location;\r\n\tget styleSheets( ): StyleSheetList;\r\n\tget head( ): HTMLHeadElement;\r\n\tget documentElement( ): HTMLElement; \r\n\r\n\tset title( title: string );\r\n}\r\n\r\n\r\nexport let x4document: IX4Document = document;\r\n\r\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file x4events.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\n// default stopPropagation implementation for Events\nconst stopPropagation = function ( this: any ) {\n\tthis.propagationStopped = true;\n}\n\n// default preventDefault implementation for Events\nconst preventDefault = function ( this: any ) {\n\tthis.defaultPrevented = true;\n}\n\n// default callback type for events\nexport type EventCallback<T extends BasicEvent = BasicEvent> = (event: T) => any;\nexport interface EventDisposer {\n\tdispose( ) : void;\n};\n\n\n/**\n * Basic event\n * name like that to avoid conflict with Browsers Event class.\n */\n\nexport interface BasicEvent {\n\treadonly type?: string;\t\t\t// type of the event 'click', 'change', ...\n\treadonly source?: unknown;\t\t// object that fires the event\n\treadonly context?: any;\t\t// contextual data, left to the user\n\n\tpropagationStopped?: boolean;\t// if true, do not propagate the event\n\tdefaultPrevented?: boolean;\t\t// if true, do not call default handler (if any)\n\n\tstopPropagation?(): void;\t\t// stop the propagation\n\tpreventDefault?(): void;\t\t// prevent the default handler\n}\n\n/**\n * BasicEvent Builder\n * this function is responsable of BasicEvent creation\n * ie. is equivalent of new BasicEvent( xxx );\n * @param params \n * @returns BasicEvent\n */\n\nexport function BasicEvent<T extends BasicEvent = BasicEvent>(params: any): T {\n\treturn {\n\t\tstopPropagation,\n\t\tpreventDefault,\n\t\t...params,\n\t} as T;\n}\n\n/**\n * Click Event\n * click event do not have any additional parameters\n */\n\nexport interface EvClick extends BasicEvent {\n}\n\nexport function EvClick( context: any = null ) {\n\treturn BasicEvent<EvClick>({ context });\n}\n\n\n/**\n * Change Event\n * value is the the element value\n */\n\nexport interface EvChange extends BasicEvent {\n\treadonly value: any;\n}\n\nexport function EvChange(value: unknown, context: any = null ) {\n\treturn BasicEvent<EvChange>({ value, context });\n}\n\n/**\n * Selection Event\n * value is the new selection or null\n */\n\ninterface X4Selection {\n}\n\nexport interface EvSelectionChange extends BasicEvent {\n\treadonly selection: X4Selection;\n}\n\nexport function EvSelectionChange( selection: X4Selection, context: any = null ) {\n\treturn BasicEvent<EvSelectionChange>( { selection, context } );\n}\n\n/**\n * ContextMenu Event\n */\n\nexport interface EvContextMenu extends BasicEvent {\n\tuievent: UIEvent;\t// UI event that fire this event\n}\n\nexport function EvContextMenu( uievent: UIEvent, context: any = null ) {\n\treturn BasicEvent<EvContextMenu>( { uievent, context } );\n}\n\n/**\n * Timer Event\n * @see startTimer, stopTimer\n */\n\nexport interface EvTimer extends BasicEvent {\n\ttimer: string;\n\ttime: number;\n}\n\nexport function EvTimer( timer: string, time = 0, context: any = null ) {\n\treturn BasicEvent<EvTimer>( { timer, time, context });\n}\n\n/**\n * Simple message\n */\n\nexport interface EvMessage extends BasicEvent {\n\treadonly msg: string;\n\treadonly params?: any;\n}\n\nexport function EvMessage( msg: string, params?: unknown, source?: unknown ) {\n\treturn BasicEvent<EvMessage>({msg,params,source});\n}\n\n/**\n * Drag/Drop event\n */\n\nexport interface EvDrag extends BasicEvent {\n\telement: unknown;\n\tdata: any;\n}\n\nexport function EvDrag(element: unknown, data: any, ctx: any ) {\n\treturn BasicEvent<EvDrag>({ element, data, context: ctx });\n}\n\n/**\n * Errors\n */\n\nexport interface EvError extends BasicEvent {\n\tcode: number;\n\tmessage: string;\n}\n\t\nexport function EvError( code: number, message: string ) : EvError {\n\treturn BasicEvent<EvError>( {code, message} );\n}\n\n\n/**\n * this Base interface is used to describe available events & their types\n * \n * you can implement your own event mapping:\n * @example\n * ```ts\n * interface MyEventMap extends EventMap {\n * \t click: EvClick,\n * 'custom-message': Event,\n * \t [key: string]: Event,\n * }\n * ```\n */\n\nexport interface EventMap {\n}\n\n/**\n * basic event types, in general the type is builded from the eventMap\n * this is very usefull for editor completion\n * @example\n * ```ts\n * type MyEventType = MapEvents<MyEventMap>;\n * ```\n */\nexport interface EventTypes {\n}\n\n/**\n * convert an EventMap to a EventType\n */\n\nexport type MapEvents<Type> = {\n\t[Property in keyof Type]?: (ev: Type[Property]) => any;\n};\n\n\n/**\n * Event emitter class\n * this class allow you to emit and handle events\n * \n * @example:\n * ```ts\n * \n * interface EvDoIt extends BasicEvent {\n * param: unknown;\n * }\n * \n * function EvDoIt( e: EvDoIt ) : EvDoIt {\n * return BasicEvent<EvDoIt>( e );\n * }\n * \n * interface TestEventMap extends EventMap {\n *\tdoit: EvDoIt;\n * }\n *\n * let ee = new EventSource<TestEventMap>(null);\n * ee.listen({\n *\tdoit: (e) => {\n *\t\tconsole.log(e);\n *\t\te.preventDefault(); \n *\t},\n * });\n *\n * ee.defaults({\n *\tdoit: (e) => {\n *\t\tconsole.log('default handler for ', e.type, e.selection);\n *\t},\n * })\n * \n * ee.on('doit', (e) => {\n *\tdebugger;\n * })\n *\n * const ev = EvDoIt({ param: 10 });\n * ee.emit('change', ev);\n * if (ev.defaultPrevented) {\n *\tconsole.log('prevented');\n * }\n * ```\n */\n\nexport class EventSource<Q extends EventMap, T extends EventTypes = MapEvents<Q>> {\n\n\tprivate m_source: unknown;\n\tprivate m_eventRegistry: Map<string, EventCallback[]>;\n\tprivate m_defaultHandlers: Map<string, EventCallback[]>;\n\n\tconstructor(source: unknown = null) {\n\t\tthis.m_source = source ?? this;\n\t}\n\n\t/**\n\t * emit an event\n\t * you can stop propagation of event or prevent default\n\t * @param eventName - name of event to emit\n\t * @param event - event data \n\t */\n\n\temit<K extends keyof Q>(type: K, event?: Q[K]) {\n\t\tthis._emit(type as string, event);\n\t}\n\n\t_emit(eventName: string, e: BasicEvent): void {\n\t\tlet listeners = this.m_eventRegistry?.get(eventName);\n\t\tconst defaultHandler = this.m_defaultHandlers?.get(eventName);\n\n\t\tif (!e) {\n\t\t\te = {};\n\t\t}\n\n\t\tif (!e.source) {\n\t\t\t(e as any).source = this.m_source;\n\t\t}\n\n\t\tif (!e.type) {\n\t\t\t(e as any).type = eventName;\n\t\t}\n\n\t\tif (listeners && listeners.length) {\n\n\t\t\tif (!e.preventDefault) {\n\t\t\t\te.preventDefault = preventDefault;\n\t\t\t}\n\n\t\t\tif (!e.stopPropagation) {\n\t\t\t\te.stopPropagation = stopPropagation;\n\t\t\t}\n\n\t\t\t// small optimisation\n\t\t\tif (listeners.length == 1) {\n\t\t\t\tlisteners[0](e);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst temp = listeners.slice();\n\t\t\t\tfor (let i = 0, n = temp.length; i < n; i++) {\n\t\t\t\t\ttemp[i](e);\n\t\t\t\t\tif (e.propagationStopped) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (defaultHandler && defaultHandler.length && !e.defaultPrevented) {\n\t\t\treturn defaultHandler[0](e);\n\t\t}\n\t}\n\n\t/**\n\t * signal en event\n\t * signaled event are notification : no way to prevent default not stop propagation\n\t * @param eventName name of event to signal\n\t * @param event event data \n\t */\n\n\tsignal<K extends keyof Q>(type: K, event: Q[K], delay=-1) {\n\t\tthis._signal(type as string, event,delay);\n\t}\n\n\t_signal(eventName: string, e: BasicEvent,delay=-1): void {\n\n\t\tif (!this.m_eventRegistry) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst listeners = this.m_eventRegistry.get(eventName);\n\t\tif (!listeners || !listeners.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!e) {\n\t\t\te = {};\n\t\t}\n\n\t\tif (!e.type) {\n\t\t\t(e as any).type = eventName;\n\t\t}\n\n\t\tif (!e.source) {\n\t\t\t(e as any).source = this.m_source;\n\t\t}\n\n\t\te.preventDefault = e.stopPropagation = () => {\n\t\t\tconsole.error('this event cannot be stopped not default prevented');\n\t\t}\n\n\t\t// small optimisation\n\t\tif (listeners.length == 1 && delay==-1 ) {\n\t\t\tlisteners[0](e);\n\t\t}\n\t\telse {\n\t\t\tconst temp = listeners.slice();\n\n\t\t\tconst call = ( ) => {\n\t\t\t\tfor (let i = 0, n = temp.length; i < n; i++) {\n\t\t\t\t\ttemp[i](e);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif( delay==-1 ) {\n\t\t\t\tcall( );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsetTimeout( call, delay );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * handle an event one time\n\t * @param eventName - event name to handle\n\t * @param callback - callback to call when event is signaled\n\t * @returns Promise if callback is null\n\t * \n\t * take care with that because if the event is never fired and you await it,\n\t * the system may overflow\n\t */\n\n\tonce<K extends keyof Q>(type: K, callback: (ev: Q[K]) => any) {\n\t\t//@ts-ignore\n\t\tthis._once(type as string, callback);\n\t}\n\n\t_once(eventName: string, callback: EventCallback) {\n\n\t\tconst newCallback = ( ev: BasicEvent ) => {\n\t\t\tthis._off(eventName, newCallback);\n\t\t\tcallback( ev );\n\t\t}\n\n\t\tthis._on(eventName, newCallback);\n\n\t\tif (!callback) {\n\t\t\treturn new Promise(function (resolve) {\n\t\t\t\tcallback = resolve;\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * set the event default handler\n\t * @param eventName - name of the event\n\t * @param callback - callback to call when the event is not handled (and preventDeault has not been called)\n\t */\n\n\tsetDefaultHandler(eventName: string, callback: EventCallback): void {\n\n\t\tlet handlers = this.m_defaultHandlers;\n\t\tif (!handlers) {\n\t\t\thandlers = this.m_defaultHandlers = new Map()\n\t\t}\n\n\t\tlet stack = handlers.get(eventName);\n\t\tif (stack) {\n\n\t\t\t// if already in the stack, remove it\n\t\t\tconst idx = stack.indexOf(callback);\n\t\t\tif (idx != -1) {\n\t\t\t\tstack.splice(idx, 1);\n\t\t\t}\n\n\t\t\t// then make it first\n\t\t\tstack.unshift(callback);\n\t\t}\n\t\telse {\n\t\t\thandlers.set(eventName, [callback]);\n\t\t}\n\t}\n\n\t/**\n\t * remove the previous default handler installed for an event\n\t * @param eventName - event name\n\t * @param callback - callback handler to remove (must be the same as in setDefaultHandler)\n\t */\n\n\tremoveDefaultHandler(eventName: string, callback: EventCallback): void {\n\t\tconst handlers = this.m_defaultHandlers;\n\t\tif (!handlers) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst stack = handlers.get(eventName);\n\t\tif (stack) {\n\t\t\tconst idx = stack.indexOf(callback);\n\t\t\tif (idx != -1) {\n\t\t\t\tstack.splice(idx, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * define a set of listeners in one call\n\t * @param events \n\t */\n\n\tlisten(events: T) {\n\t\tfor (let n in events) {\n\t\t\tthis._on(n, events[n] as unknown as EventCallback);\n\t\t}\n\t}\n\n\t/**\n\t * define a set of default handlers in one call\n\t * @param events \n\t */\n\n\tdefaults(events: T) {\n\t\tfor (let n in events) {\n\t\t\tthis.setDefaultHandler(n, events[n] as unknown as EventCallback);\n\t\t}\n\t}\n\n\t/**\n\t * listen for an event\n\t * @param eventName - event name to listen on\n\t * @param callback - callback to call\n\t * @param capturing - if true, capture event before other registred event handlers\n\t */\n\n\ton<K extends keyof Q>(type: K, callback: (ev: Q[K]) => any) : EventDisposer {\n\t\t//@ts-ignore\n\t\treturn this._on(type as string, callback);\n\t}\n\n\t_on(eventName: string, callback: EventCallback, capturing = false): EventDisposer {\n\n\t\tif (!this.m_eventRegistry) {\n\t\t\tthis.m_eventRegistry = new Map();\n\t\t}\n\n\t\tlet listeners = this.m_eventRegistry.get(eventName);\n\t\tif (!listeners) {\n\t\t\tlisteners = [];\n\t\t\tthis.m_eventRegistry.set(eventName, listeners);\n\t\t}\n\n\t\tif (listeners.indexOf(callback) == -1) {\n\t\t\tif (capturing) {\n\t\t\t\tlisteners.unshift(callback);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlisteners.push(callback);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tdispose: ( ) => { this._off( eventName, callback ); } \n\t\t}\n\t}\n\n\t/**\n\t * stop listening to an event\n\t * @param eventName - event name\n\t * @param callback - callback to remove (must be the same as in on )\n\t */\n\n\toff<K extends keyof Q>(type: K, callback: (ev: Q[K]) => any) {\n\t\t//@ts-ignore\n\t\treturn this._off(type as string, callback);\n\t}\n\n\t_off(eventName: string, callback: EventCallback ): void {\n\t\tif (!this.m_eventRegistry) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet listeners = this.m_eventRegistry.get(eventName);\n\t\tif (!listeners) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst idx = listeners.indexOf(callback);\n\t\tif (idx !== -1) {\n\t\t\tlisteners.splice(idx, 1);\n\t\t}\n\t}\n\n\t/**\n\t * remove all listeners for an event\n\t * @param eventName - event name \n\t */\n\n\tremoveAllListeners(eventName: string ): void {\n\t\tif (!eventName) {\n\t\t\tthis.m_eventRegistry = this.m_defaultHandlers = undefined;\n\t\t}\n\t\telse {\n\t\t\tif (this.m_eventRegistry) {\n\t\t\t\tthis.m_eventRegistry.delete( eventName );\n\t\t\t}\n\n\t\t\tif (this.m_defaultHandlers) {\n\t\t\t\tthis.m_defaultHandlers.delete( eventName );\n\t\t\t}\n\t\t}\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file base_component.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*\n**/\n\nimport { EventMap, MapEvents, EventSource, EvTimer } from './x4events';\n\n/**\n * Timer Callback\n * @see EvTimer, startTimer, stopTimer\n */\n\n interface TimerCallback {\n\t(name: string, time: number): void;\n}\n\n/**\n * BaseComponent EventMap\n */\n\nexport interface BaseComponentEventMap extends EventMap {\n\ttimer: EvTimer,\n}\n\n/**\n * BaseCompoment Properties\n */\n\nexport interface BaseComponentProps<T = BaseComponentEventMap> {\n\tevents?: MapEvents<T>;\t// basic component event map in base interface, should specialised in derived interfaces\n\t[key: string]: any; // added index signature to solve \"Type 'X' has no properties with type 'Y'\" \n}\n\n/**\n * BaseComponent class\n */\n\nexport class BaseComponent< P extends BaseComponentProps<BaseComponentEventMap>, E extends BaseComponentEventMap >\n\textends EventSource< E > {\n\n\tprotected m_props: P;\n\t#m_timers: Map<string, Function>;\n\n\tconstructor(props: P) {\n\t\tsuper();\n\n\t\t//this.m_props = { ...props };\n\t\tthis.m_props = props;\n\n\t\tif (props.events) {\n\t\t\tthis.listen(props.events as EventMap);\n\t\t}\n\t}\n\n\t/**\n\t * start a new timer\n\t * @param name timer name \n\t * @param timeout time out in ms\n\t * @param repeat if true this is an auto repeat timer\n\t * @param callback if !null, the callback to call else a EvTimer is fired\n\t */\n\n\tstartTimer(name: string, timeout: number, repeat = true, callback: TimerCallback = null) {\n\t\tif (!this.#m_timers) {\n\t\t\tthis.#m_timers = new Map();\n\t\t}\n\t\telse {\n\t\t\tthis.stopTimer(name);\n\t\t}\n\n\t\tconst id = (repeat ? setInterval : setTimeout)((tm: number) => {\n\t\t\tif (callback) {\n\t\t\t\tcallback(name, tm);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.emit('timer', EvTimer( name, tm ));\n\t\t\t}\n\t\t}, timeout);\n\n\t\tthis.#m_timers.set(name, () => { (repeat ? clearInterval : clearTimeout)(id) });\n\t}\n\n\t/**\n\t * stop the given timer\n\t * @param name \n\t */\n\n\tstopTimer(name: string) {\n\t\tconst clear = this.#m_timers.get(name);\n\t\tif (clear) { clear(); }\n\t}\n\n\t/**\n\t * stop all timers\n\t */\n\n\tdisposeTimers( ) {\n\t\tthis.#m_timers?.forEach( v => v() );\n\t\tthis.#m_timers = undefined;\n\t}\n\n\t/**\n\t * \n\t * @param callback \n\t * @param timeout \n\t */\n\n\tsingleShot( callback: TimerCallback, timeout = 0 ) {\n\t\tsetTimeout( callback, timeout );\n\t}\n\n\t/**\n\t * \n\t * @param props \n\t * @param elements \n\t */\n\t\n\tpublic mapPropEvents<N extends keyof E>(props: P, ...elements: N[] ) {\n\t\telements.forEach( name => {\n\t\t\tconst n = name as string;\n\t\t\tif (props[n]) {\n\t\t\t\tthis._on(n, props[n]);\n\t\t\t}\n\t\t})\n\t}\n}\n\n", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file i18n.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\n\n\n\n/**\n * language definition\n */\n\n interface Language {\n name: string;\n base: string;\n\tsrc_translations: any;\n translations: any;\n}\n\nconst sym_lang = Symbol( \"i18n\" );\n\nlet languages: Record<string,Language> = {\n};\n\n/**\n * create a new language\n * @param name language name (code)\n * @param base base language (code)\n * @example:\n * ```js\n * createLanguage( 'en', 'fr' );\n * ```\n */\n\nexport function createLanguage( name: string, base: string ) {\n languages[name] = { \n name,\n base,\n\t\tsrc_translations: {},\n translations: {}\n };\n}\n\n/**\n * check if the given language is known\n * @param name language name (code)\n */\n\nexport function isLanguage( name: string ): boolean {\n return languages[name]!==undefined;\n}\n\n/**\n * build the language with given fragments\n * @param name language name (code)\n * @param parts misc elements that make the language\n * @example:\n * ```js\n * createLanguage( 'en', 'fr' );\n * const app = {\n * \tclients: {\n * \t\ttranslation1: \"hello\",\n * }\n * }\n * addTranslation( 'en', app );\n * ```\n */\n\nexport function addTranslation( name, ...parts ) {\n\t\n\tif( !isLanguage(name) ) {\n\t\treturn;\n\t}\n\n\tconst lang = languages[name];\n \n\tparts.forEach( p => {\n\t\t_patch( lang.src_translations, p );\n\t} );\n\n\tlang.translations = _proxyfy( lang.src_translations, lang.base, true );\n}\n\n/**\n * patch the base object with the given object\n * (real patch)\n */\n\nfunction _patch( obj: any, by: any ) {\n\n\tfor( let n in by ) {\n\t\tconst src = by[n];\n\t\tif( typeof src === \"string\" ) {\n\t\t\tobj[n] = src;\n\t\t}\n\t\telse {\n\t\t\tif( Array.isArray(src) && (!obj[n] || !Array.isArray(obj[n])) ) {\n\t\t\t\tobj[n] = [...src];\n\t\t\t}\n\t\t\telse if( !obj[n] || (typeof obj[n] !== \"object\") ) {\n\t\t\t\tobj[n] = { ...src };\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_patch( obj[n], by[n] );\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * create a proxy for all sub objects\n * (deep traverse)\n */\n\nfunction _proxyfy( obj: any, base: any, root ) {\n\n\tconst result = {}\n\n\tfor( const n in obj ) {\n\t\tif( typeof obj[n]!==\"string\" && !Array.isArray(obj[n])) {\n\t\t\tresult[n] = _proxyfy( obj[n], base, false );\n\t\t}\n\t\telse {\n\t\t\tresult[n] = obj[n];\n\t\t}\n\t}\n\n\treturn _mk_proxy( result, base, root );\n}\n\n\n/**\n * create a proxy for the given object\n */\n\nfunction _mk_proxy( obj: any, base: string, root: boolean ) : any {\n\treturn new Proxy( obj, {\n\t\tget: (target, prop) => {\n\t\t\tif( root ) {\n\t\t\t\treq_path = [prop];\n\t\t}\n\t\t\telse {\n\t\t\t\treq_path.push( prop );\n\t}\n\n\t\t\tlet value = target[prop];\n\t\t\tif( value===undefined && base ) {\n\t\t\t\tvalue = _findBaseTrans( base );\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t});\n}\n\n\n/**\n * when we ask for _tr.xxx\n * reqpath is set to [xxx]\n * \n * then when we try to get _tr.xxx.yyy\n * reqpath is [xxx,yyy]\n * if yyy is not found, we try with base langage for the full reqpath \n * until no base found\n */\n\nlet req_path: (string | symbol)[];\n\n/**\n * \n */\n\nfunction _findBaseTrans( base ) {\n\n\twhile( base ) {\n\t\tconst lang = languages[base];\n\t\tlet trans = lang.translations;\n\t\tlet value;\n\n\t\tfor( const p of req_path ) {\n\t\t\tvalue = trans[p];\n\t\t\tif( value===undefined ) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\ttrans = value;\n\t\t}\n\n\t\tif( value!==undefined ) {\n\t\t\treturn trans;\n\t\t}\n\n\t\tbase = lang.base;\n\t}\n\n\tconsole.error( \"I18N error: unable to find\", '_tr.'+req_path.join('.') );\n\treturn undefined;\n}\n\nexport let _tr: any = {};\n\n/**\n * select the given language as current\n * @param name laguage name (code)\n */\n\nexport function selectLanguage( name: string ) {\n\n\tif( !isLanguage(name) ) {\n\t\treturn;\n\t}\n\n\t_tr = languages[name].translations;\n\t_tr[sym_lang] = name;\n\treturn _tr;\n}\n\n/**\n * \n */\n\nexport function getCurrentLanguage( ): string {\n\treturn _tr[sym_lang];\n}\n\n/**\n * \n */\n\nexport function getAvailableLanguages( ): string[] {\n\treturn Object.keys( languages );\n}\n\n\n\n\n/**\n * language definition\n * x4 specific strings\n */\n\nlet fr = {\n\tglobal: {\n\t\tok: 'OK',\n\t\tcancel: 'Annuler',\n\t\tignore: 'Ignorer',\n\t\tyes: 'Oui',\n\t\tno: 'Non',\n\n\t\topen: 'Ouvrir',\n\t\tnew: 'Nouveau',\n\t\tdelete: 'Supprimer',\n\t\tclose: 'Fermer',\n\t\tsave: 'Enregistrer',\n\n\t\tsearch: 'Rechercher',\n\t\tsearch_tip: 'Saisissez le texte \u00E0 rechercher. <b>Enter</b> pour lancer la recherche. <b>Esc</b> pour annuler.',\n\n\t\trequired_field: \"information requise\",\n\t\tinvalid_format: \"format invalide\",\n\t\tinvalid_email: 'adresse mail invalide',\n\t\tinvalid_number: 'valeur num\u00E9rique invalide',\n\n\t\tdiff_date_seconds: '{0} secondes',\n\t\tdiff_date_minutes: '{0} minutes',\n\t\tdiff_date_hours: '{0} heures',\n\n\t\tinvalid_date: 'Date non reconnue ({0})',\n\t\tempty_list: 'Liste vide',\n\n\t\tdate_input_formats: 'd/m/y|d.m.y|d m y|d-m-y|dmy',\n\t\tdate_format: 'D/M/Y',\n\n\t\tday_short: [ 'dim', 'lun', 'mar', 'mer', 'jeu', 'ven', 'sam' ],\n\t\tday_long: [ 'dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi' ],\n\n\t\tmonth_short: [ 'jan', 'f\u00E9v', 'mar', 'avr', 'mai', 'jun', 'jui', 'ao\u00FB', 'sep', 'oct', 'nov', 'd\u00E9c' ],\n\t\tmonth_long: [ 'janvier', 'f\u00E9vrier', 'mars', 'avril', 'mai', 'juin', 'juillet', 'ao\u00FBt', 'septembre', 'octobre', 'novembre', 'd\u00E9cembre' ],\n\n\t\tproperty: 'Propri\u00E9t\u00E9',\n\t\tvalue: 'Valeur',\n\n\t\terr_403: `Vous n'avez pas les droits suffisants pour effectuer cette action`,\n\n\t\tcopy: 'Copier',\n\t\tcut: 'Couper',\n\t\tpaste: 'Coller'\n\t}\n};\n\n/** @ignore */\n\nlet en = {\n\tglobal: {\n\t\tok: 'OK',\n\t\tcancel: 'Cancel',\n\t\tignore: 'Ignore',\n\t\tyes: 'Yes',\n\t\tno: 'No',\n\n\t\topen: 'Open',\n\t\tnew: 'New',\n\t\tdelete: 'Delete',\n\t\tclose: 'Close',\n\t\tsave: 'Save',\n\n\t\tsearch: 'Search',\n\t\tsearch_tip: 'Type in the text to search. <b>Enter</b> to start the search. <b>Esc</b> to cancel.',\n\n\t\trequired_field: \"missing information\",\n\t\tinvalid_format: \"invalid format\",\n\t\tinvalid_email: 'invalid email address',\n\t\tinvalid_number: 'bad numeric value',\n\n\t\tdiff_date_seconds: '{0} seconds',\n\t\tdiff_date_minutes: '{0} minutes',\n\t\tdiff_date_hours: '{0} hours',\n\n\t\tinvalid_date: 'Unrecognized date({0})',\n\t\tempty_list: 'Empty list',\n\n\t\tdate_input_formats: 'm/d/y|m.d.y|m d y|m-d-y|mdy',\n\t\tdate_format: 'M/D/Y',\n\n\t\tday_short: [ 'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat' ],\n\t\tday_long: [ 'sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday' ],\n\n\t\tmonth_short: [ 'jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jui', 'aug', 'sep', 'oct', 'nov', 'dec' ],\n\t\tmonth_long: [ 'january', 'february', 'march', 'april', 'mau', 'june', 'jully', 'august', 'september', 'october', 'november', 'december' ],\n\n\t\tproperty: 'Property',\n\t\tvalue: 'Value',\n\n\t\terr_403: `You do not have sufficient rights to do that action`,\n\n\t\tcopy: 'Copy',\n\t\tcut: 'Cut',\n\t\tpaste: 'Paste'\n\t}\n};\n\ncreateLanguage( 'fr', null );\naddTranslation( 'fr', fr );\n\ncreateLanguage( 'en', 'fr' );\naddTranslation( 'en', en );\n\nselectLanguage( 'fr' );\t// by default\n\n\n\n\n\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file tools.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\n\nimport { _tr } from './i18n'; \t// you MUST create a file named translation.js\n\n// :: ENVIRONMENT ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\n/**\n * @return true is the device has touch\n */\n\nexport function isTouchDevice() {\n\treturn 'ontouchstart' in window;\n}\n\n// :: NUMBERS ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\n\n/**\n * round to a given number of decimals\n * @param num numbre to round\n * @param ndec number of decimals\n * @returns number rounded\n */\n\nexport function roundTo(num: number, ndec: number) {\n\tlet mul = Math.pow(10, ndec);\n\tlet res = Math.round(num * mul) / mul;\n\tif (Object.is(res, -0)) {\t// res===-0.0 \n\t\tres = 0;\n\t}\n\treturn res;\n}\n\n/**\n * parse an intl formatted number\n * understand grouping and ',' separator\n * @review us format: grouping = ','\n * @param num \n */\n\nexport function parseIntlFloat(num: string) {\n\tnum = num.replace(/\\s*/g, '');\t// group separator\n\tnum = num.replace(',', '.');\t\t// decimal separator\n\n\t// accept empty & return 0.0\n\tif (num.length == 0) {\n\t\treturn 0.0;\n\t}\n\n\treturn parseFloat(num);\n}\n\n// :: STRING MANIP ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\nconst RE_PCASE = /([a-z][A-Z])/g;\nconst RE_PCASE2 = /[^-a-z0-9]+/g;\n\n/**\n * inverse of camel case\n * theThingToCase -> the-thing-to-case\n * @param {String} str \n */\n\nexport function pascalCase(string: string): string {\n\n\tlet result = string;\n\n\tresult = result.replace(/([a-z])([A-Z])/g, \"$1 $2\");\n\tresult = result.toLowerCase();\n\tresult = result.replace(/[^- a-z0-9]+/g, ' ');\n\n\tif (result.indexOf(' ') < 0) {\n\t\treturn result;\n\t}\n\n\tresult = result.trim();\n\treturn result.replace(/ /g, '-');\n}\n\nexport function camelCase( text: string ) {\n\tlet result = text.toLowerCase( );\n\tresult = result.replace( /[^a-zA-Z0-9]+(.)/g, (m,chr) => {\n\t\treturn chr.toUpperCase();\n\t} );\n\treturn result;\n}\n\n// :: MISC CLASSES ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\nexport type Constructor<T> = new (...args: any[]) => T;\n\nexport class Point {\n\tx: number;\n\ty: number;\n\n\tconstructor(x = 0, y = 0) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t}\n}\n\nexport class Size {\n\twidth: number;\n\theight: number;\n\n\tconstructor(w = 0, h = 0) {\n\t\tthis.width = w;\n\t\tthis.height = h;\n\t}\n}\n\nexport class Rect {\n\n\tleft: number;\n\ttop: number;\n\twidth: number;\n\theight: number;\n\n\tconstructor();\n\tconstructor(rc: Rect);\n\tconstructor(rc: DOMRect);\n\tconstructor(left: number, top: number, width: number, height: number);\n\tconstructor(left?: number | Rect | DOMRect, top?: number, width?: number, height?: number) {\n\n\t\tif (left === undefined) {\n\t\t\tthis.left = this.top = this.right = this.bottom = 0;\n\t\t}\n\t\telse if (left instanceof Rect || left instanceof DOMRect) {\n\t\t\tlet rc = left;\n\t\t\tthis.left = rc.left;\n\t\t\tthis.top = rc.top;\n\t\t\tthis.width = rc.width;\n\t\t\tthis.height = rc.height;\n\t\t}\n\t\telse {\n\t\t\tthis.left = left;\n\t\t\tthis.top = top;\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t}\n\t}\n\n\tset(left: number, top: number, width: number, height: number) {\n\t\tthis.left = left;\n\t\tthis.top = top;\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t}\n\n\tget bottom(): number {\n\t\treturn this.top + this.height;\n\t}\n\n\tset bottom(bottom: number) {\n\t\tthis.height = bottom - this.top;\n\t}\n\n\tget right(): number {\n\t\treturn this.left + this.width;\n\t}\n\n\tset right(right: number) {\n\t\tthis.width = right - this.left;\n\t}\n\n\tget topLeft(): Point {\n\t\treturn new Point(this.left, this.top);\n\t}\n\n\tget bottomRight(): Point {\n\t\treturn new Point(this.right, this.bottom);\n\t}\n\n\tget size(): Size {\n\t\treturn new Size(this.width, this.height);\n\t}\n\n\tmoveTo(left: number, top: number): this {\n\t\tthis.left = left;\n\t\tthis.top = top;\n\t\treturn this;\n\t}\n\n\tmovedTo(left: number, top: number): Rect {\n\t\treturn new Rect(left, top, this.width, this.height);\n\t}\n\n\tmoveBy(dx: number, dy: number): this {\n\t\tthis.left += dx;\n\t\tthis.top += dy;\n\t\treturn this;\n\t}\n\n\tmovedBy(dx: number, dy: number): Rect {\n\t\treturn new Rect(this.left + dx, this.top + dy, this.width, this.height);\n\t}\n\n\tisEmpty() {\n\t\treturn this.width == 0 && this.height == 0;\n\t}\n\n\tnormalize(): this {\n\t\tlet w = this.width,\n\t\t\th = this.height;\n\n\t\tif (w < 0) {\n\t\t\tthis.left += w;\n\t\t\tthis.width = -w;\n\t\t}\n\n\t\tif (h < 0) {\n\t\t\tthis.top += h;\n\t\t\tthis.height = -h;\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tnormalized(): Rect {\n\n\t\tlet rc = new Rect(this);\n\t\tlet w = rc.width,\n\t\t\th = rc.height;\n\n\n\t\tif (w < 0) {\n\t\t\trc.left += w;\n\t\t\trc.width = -w;\n\t\t}\n\n\t\tif (h < 0) {\n\t\t\trc.top += h;\n\t\t\trc.height = -h;\n\t\t}\n\n\t\treturn rc;\n\t}\n\n\t/**\n\t * @deprecated\n\t */\n\tcontainsPt(x: number, y: number): boolean {\n\t\treturn x >= this.left && x <= this.right && y >= this.top && y <= this.bottom;\n\t}\n\n\tcontains(pt: Point): boolean;\n\tcontains(rc: Rect): boolean;\n\tcontains(arg: any): boolean {\n\t\tif (arg instanceof Rect) {\n\t\t\treturn arg.left >= this.left && arg.right <= this.right && arg.top >= this.top && arg.bottom <= this.bottom;\n\t\t}\n\t\telse {\n\t\t\treturn arg.x >= this.left && arg.x < this.right && arg.y >= this.top && arg.y < this.bottom;\n\t\t}\n\t}\n\n\ttouches(rc: Rect): boolean {\n\t\tif (this.left > rc.right || this.right < rc.left || this.top > rc.bottom || this.bottom < rc.top) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tinflate(dx: number, dy?: number) {\n\t\tif (dy === undefined) {\n\t\t\tdy = dx;\n\t\t}\n\n\t\tthis.left -= dx;\n\t\tthis.top -= dy;\n\t\tthis.width += dx + dx;\n\t\tthis.height += dy + dy;\n\t}\n\n\tinflatedBy(dx: number, dy?: number) {\n\t\tif (dy === undefined) {\n\t\t\tdy = dx;\n\t\t}\n\t\treturn new Rect(this.left - dx, this.top - dy, this.width + dx + dx, this.height + dy + dy);\n\t}\n\n\tcombine(rc: Rect) {\n\t\tlet left = Math.min(this.left, rc.left);\n\t\tlet top = Math.min(this.top, rc.top);\n\t\tlet right = Math.max(this.right, rc.right);\n\t\tlet bottom = Math.max(this.bottom, rc.bottom);\n\n\t\tthis.left = left;\n\t\tthis.top = top;\n\t\tthis.right = right;\n\t\tthis.bottom = bottom;\n\t}\n}\n\n/**\n * replace {0..9} by given arguments\n * @param format string\n * @param args \n * \n * @example ```ts\n * \n * console.log( sprintf( 'here is arg 1 {1} and arg 0 {0}', 'argument 0', 'argument 1' ) )\n */\n\nexport function sprintf(format: string, ...args) {\n\treturn format.replace(/{(\\d+)}/g, function (match, index) {\n\t\treturn typeof args[index] != 'undefined' ? args[index] : match;\n\t});\n}\n\n/**\n * replace special characters for display\n * @param unsafe \n * \n * console.log( escapeHtml('<div style=\"width:50px; height: 50px; background-color:red\"></div>') );\n */\nexport function escapeHtml(unsafe: string, nl_br = false): string {\n\tif (!unsafe || unsafe.length == 0) {\n\t\treturn \"\";\n\t}\n\n\tlet result = unsafe.replace(/[<>\\&\\\"\\']/g, function (c) {\n\t\treturn '&#' + c.charCodeAt(0) + ';';\n\t});\n\n\tif (nl_br) {\n\t\tresult = result.replace(/(\\r\\n|\\n\\r|\\r|\\n)/g, '<br/>');\n\t}\n\n\treturn result;\n}\n\n/**\n * replace special characters for display\n * @author Steven Levithan <http://slevithan.com/>\n * @param unsafe \n * \n * console.log( removeHtmlTags('<h1>sss</h1>') );\n */\n\nexport function removeHtmlTags(unsafe: string, nl_br = false): string {\n\t\n\tif ( unsafe===undefined || unsafe===null || !isString(unsafe) || unsafe.length == 0 ) {\n\t\treturn \"\";\n\t} \n\n\tlet ret_val = '';\n\tfor (let i = 0; i < unsafe.length; i++) {\n\t\tconst ch = unsafe.codePointAt(i);\n\t\tif (ch > 127) {\n\t\t\tret_val += '&#' + ch + ';';\n\t\t}\n\t\telse if (ch == 60/*<*/) {\n\t\t\tret_val += '&lt;'\n\t\t}\n\t\telse {\n\t\t\tret_val += unsafe.charAt(i);\n\t\t}\n\t}\n\treturn ret_val;\n}\n\n\n// :: DATES ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\nlet cur_locale: string = 'fr-FR';\n\n/**\n * change the current locale for misc translations (date...)\n * @param locale \n */\n\nexport function _date_set_locale(locale: string) {\n\tcur_locale = locale;\n}\n\n/**\n * \n * @param date \n * @param options \n * @example\n * let date = new Date( );\n * let options = { day: 'numeric', month: 'numeric', year: 'numeric', hour: 'numeric', minute: 'numeric' };\n * let text = date_format( date, options );\n */\n\nexport function date_format(date: Date, options?: any): string {\n\t//return new Intl.DateTimeFormat(cur_locale, options).format( date );\n\treturn formatIntlDate(date);\n}\n\n/**\n * \n * @param date \n * @param options \n */\n\nexport function date_diff(date1: Date, date2: Date, options?: any): string {\n\n\tvar dt = (date1.getTime() - date2.getTime()) / 1000;\n\n\t// seconds\n\tlet sec = dt;\n\tif (sec < 60) {\n\t\treturn sprintf(_tr.global.diff_date_seconds, Math.round(sec));\n\t}\n\n\t// minutes\n\tlet min = Math.floor(sec / 60);\n\tif (min < 60) {\n\t\treturn sprintf(_tr.global.diff_date_minutes, Math.round(min));\n\t}\n\n\t// hours\n\tlet hrs = Math.floor(min / 60);\n\treturn sprintf(_tr.global.diff_date_hours, hrs, min % 60);\n}\n\nexport function date_to_sql(date: Date, withHours: boolean) {\n\n\tif (withHours) {\n\t\treturn formatIntlDate(date, 'Y-M-D H:I:S');\n\t}\n\telse {\n\t\treturn formatIntlDate(date, 'Y-M-D');\n\t}\n}\n\n/**\n * construct a date from an utc date time (sql format)\n * YYYY-MM-DD HH:MM:SS\n */\n\nexport function date_sql_utc(date: string): Date {\n\tlet result = new Date(date + ' GMT');\n\treturn result;\n}\n\n\n\n/**\n * return a number that is a representation of the date\n * this number can be compared with another hash\n */\n\nexport function date_hash(date: Date): number {\n\treturn date.getFullYear() << 16 | date.getMonth() << 8 | date.getDate();\n}\n\n(<any>Date.prototype).hash = function (this: Date) {\n\treturn date_hash(this);\n}\n\n/**\n * return a copy of a date\n */\n\nexport function date_clone(date: Date): Date {\n\treturn new Date(date.getTime());\n}\n\n/**\n * return the week number of a date\n */\n\nexport function date_calc_weeknum(date: Date): number {\n\tconst firstDayOfYear = new Date(date.getFullYear(), 0, 1);\n\tconst pastDaysOfYear = (date.valueOf() - firstDayOfYear.valueOf()) / 86400000;\n\treturn Math.floor((pastDaysOfYear + firstDayOfYear.getDay() + 1) / 7);\n}\n\n\n\n/**\n * parse a date according to the given format \n * @param value - string date to parse\n * @param fmts - format list - i18 tranlation by default\n * allowed format specifiers:\n * d or D: date (1 or 2 digits)\n * m or M: month (1 or 2 digits)\n * y or Y: year (2 or 4 digits)\n * h or H: hours (1 or 2 digits)\n * i or I: minutes (1 or 2 digits)\n * s or S: seconds (1 or 2 digits)\n * <space>: 1 or more spaces\n * any other char: <0 or more spaces><the char><0 or more spaces>\n * each specifiers is separated from other by a pipe (|)\n * more specific at first\n * @example\n * 'd/m/y|d m Y|dmy|y-m-d h:i:s|y-m-d'\n */\n\nexport function parseIntlDate(value: string, fmts: string = _tr.global.date_input_formats): Date {\n\n\tlet formats = fmts.split('|');\n\tfor (let fmatch of formats) {\n\n\t\t//review: could do that only once & keep result\n\t\t//review: add hours, minutes, seconds\n\n\t\tlet smatch = '';\n\t\tfor (let c of fmatch) {\n\n\t\t\tif (c == 'd' || c == 'D') {\n\t\t\t\tsmatch += '(?<day>\\\\d{1,2})';\n\t\t\t}\n\t\t\telse if (c == 'm' || c == 'M') {\n\t\t\t\tsmatch += '(?<month>\\\\d{1,2})';\n\t\t\t}\n\t\t\telse if (c == 'y' || c == 'Y') {\n\t\t\t\tsmatch += '(?<year>\\\\d{1,4})';\n\t\t\t}\n\t\t\telse if (c == 'h' || c == 'H') {\n\t\t\t\tsmatch += '(?<hour>\\\\d{1,2})';\n\t\t\t}\n\t\t\telse if (c == 'i' || c == 'I') {\n\t\t\t\tsmatch += '(?<min>\\\\d{1,2})';\n\t\t\t}\n\t\t\telse if (c == 's' || c == 'S') {\n\t\t\t\tsmatch += '(?<sec>\\\\d{1,2})';\n\t\t\t}\n\t\t\telse if (c == ' ') {\n\t\t\t\tsmatch += '\\\\s+';\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsmatch += '\\\\s*\\\\' + c + '\\\\s*';\n\t\t\t}\n\t\t}\n\n\t\tlet rematch = new RegExp('^' + smatch + '$', 'm');\n\n\t\tlet match = rematch.exec(value);\n\n\t\tif (match) {\n\t\t\tconst now = new Date( );\n\n\t\t\tlet d = parseInt(match.groups.day ?? '1');\n\t\t\tlet m = parseInt(match.groups.month ?? '1');\n\t\t\tlet y = parseInt(match.groups.year ?? now.getFullYear()+'');\n\t\t\tlet h = parseInt(match.groups.hour ?? '0');\n\t\t\tlet i = parseInt(match.groups.min ?? '0');\n\t\t\tlet s = parseInt(match.groups.sec ?? '0');\n\n\t\t\tif (y > 0 && y < 100) {\n\t\t\t\ty += 2000;\n\t\t\t}\n\n\t\t\tlet result = new Date(y, m - 1, d, h, i, s, 0);\n\n\t\t\t// we test the vdate validity (without adjustments)\n\t\t\t// without this test, date ( 0, 0, 0) is accepted and transformed to 1969/11/31 (not fun)\n\t\t\tlet ty = result.getFullYear(),\n\t\t\t\ttm = result.getMonth() + 1,\n\t\t\t\ttd = result.getDate();\n\n\t\t\tif (ty != y || tm != m || td != d) {\n\t\t\t\t//debugger;\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t}\n\n\treturn null;\n}\n\n/**\n * format a date as string \n * @param date - date to format\n * @param fmt - format \n * format specifiers:\n * d: date \n * D: 2 digits date padded with 0\n * j: day of week short mode 'mon'\n * J: day of week long mode 'monday'\n * w: week number\n * m: month\n * M: 2 digits month padded with 0\n * o: month short mode 'jan'\n * O: month long mode 'january'\n * y or Y: year\n * h: hour (24 format)\n * H: 2 digits hour (24 format) padded with 0\n * i: minutes\n * I: 2 digits minutes padded with 0\n * s: seconds\n * S: 2 digits seconds padded with 0\n * a: am or pm\n * anything else is inserted\n * if you need to insert some text, put it between {}\n * \n * @example\n * \n * 01/01/1970 11:25:00 with '{this is my demo date formatter: }H-i*M'\n * \"this is my demo date formatter: 11-25*january\"\n */\n\nexport function formatIntlDate(date: Date, fmt: string = _tr.global.date_format) {\n\n\tif (!date) {\n\t\treturn '';\n\t}\n\n\tlet now = {\n\t\tyear: date.getFullYear(),\n\t\tmonth: date.getMonth() + 1,\n\t\tday: date.getDate(),\n\t\twday: date.getDay(),\n\t\thours: date.getHours(),\n\t\tminutes: date.getMinutes(),\n\t\tseconds: date.getSeconds(),\n\t\tmilli: date.getMilliseconds()\n\t};\n\n\n\tlet result = '';\n\tlet esc = 0;\n\n\tfor (let c of fmt) {\n\n\t\tif (c == '{') {\n\t\t\tif (++esc == 1) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\telse if (c == '}') {\n\t\t\tif (--esc == 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tif (esc) {\n\t\t\tresult += c;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (c == 'd') {\n\t\t\tresult += now.day;\n\t\t}\n\t\telse if (c == 'D') {\n\t\t\tresult += pad(now.day, -2);\n\t\t}\n\t\telse if (c == 'j') { // day short\n\t\t\tresult += _tr.global.day_short[now.wday];\n\t\t}\n\t\telse if (c == 'J') { // day long\n\t\t\tresult += _tr.global.day_long[now.wday];\n\t\t}\n\t\telse if (c == 'w') {\t// week\n\t\t\tresult += date_calc_weeknum(date);\n\t\t}\n\t\telse if (c == 'W') {\t// week\n\t\t\tresult += pad(date_calc_weeknum(date), -2);\n\t\t}\n\t\telse if (c == 'm') {\n\t\t\tresult += now.month;\n\t\t}\n\t\telse if (c == 'M') {\n\t\t\tresult += pad(now.month, -2);\n\t\t}\n\t\telse if (c == 'o') {\t// month short\n\t\t\tresult += _tr.global.month_short[now.month - 1];\n\t\t}\n\t\telse if (c == 'O') {\t// month long\n\t\t\tresult += _tr.global.month_long[now.month - 1];\n\t\t}\n\t\telse if (c == 'y' || c == 'Y') {\n\t\t\tresult += pad(now.year, -4);\n\t\t}\n\t\telse if (c == 'a' || c == 'A') {\n\t\t\tresult += now.hours < 12 ? 'am' : 'pm';\n\t\t}\n\t\telse if (c == 'h') {\n\t\t\tresult += now.hours;\n\t\t}\n\t\telse if (c == 'H') {\n\t\t\tresult += pad(now.hours, -2);\n\t\t}\n\t\telse if (c == 'i') {\n\t\t\tresult += now.minutes;\n\t\t}\n\t\telse if (c == 'I') {\n\t\t\tresult += pad(now.minutes, -2);\n\t\t}\n\t\telse if (c == 's') {\n\t\t\tresult += now.seconds;\n\t\t}\n\t\telse if (c == 'S') {\n\t\t\tresult += pad(now.seconds, -2);\n\t\t}\n\t\telse if (c == 'l') {\n\t\t\tresult += now.milli;\n\t\t}\n\t\telse if (c == 'L') {\n\t\t\tresult += pad(now.milli, -3);\n\t\t}\n\t\telse {\n\t\t\tresult += c;\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function calcAge(birth: Date, ref?: Date) {\n\tif (ref === undefined) {\n\t\tref = new Date();\n\t}\n\n\tif (!birth) {\n\t\treturn 0;\n\t}\n\n\tlet age = ref.getFullYear() - birth.getFullYear();\n\tif (ref.getMonth() < birth.getMonth() || (ref.getMonth() == birth.getMonth() && ref.getDate() < birth.getDate())) {\n\t\tage--;\n\t}\n\n\treturn age;\n}\n\n\n/**\n * date object patch\n */\n\ndeclare global {\n\tinterface Date {\n\t\thash(): number;\n\t\tclone(): Date;\n\t\tweekNum(): number;\n\t\tformat(format: string): string;\n\t\tisSameDay(date: Date): boolean;\n\t\taddDays( days: number );\n\t}\n}\n\nDate.prototype.isSameDay = function (date: Date) {\n\treturn this.getDate() == date.getDate() && this.getMonth() == date.getMonth() && this.getFullYear() == date.getFullYear();\n}\n\nDate.prototype.hash = function () {\n\treturn date_hash(this);\n}\n\nDate.prototype.clone = function () {\n\treturn date_clone(this);\n}\n\nDate.prototype.weekNum = function () {\n\treturn date_calc_weeknum(this);\n}\n\nDate.prototype.format = function (fmt: string) {\n\treturn formatIntlDate(this, fmt);\n}\n\nDate.prototype.addDays = function ( days: number ): Date {\n\tthis.setDate( this.getDate() + days );\n\treturn this;\n}\n\n\n\n// :: FILE CREATION ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\n\n/**\n * \n * @param data data to export\n * @param mimetype - 'text/plain'\n */\n\nexport function downloadData(data, mimetype: string, filename: string) {\n\n\t//if (data !== null && navigator.msSaveBlob) {\n\t//\treturn navigator.msSaveBlob(new Blob([data], { type: mimetype }), filename);\n\t//}\n\n\tlet blob = new Blob([data], { type: mimetype });\n\tlet url = window.URL.createObjectURL(blob);\n\n\tlet a = x4document.createElement(\"a\");\n\ta.style['display'] = \"none\";\n\ta.href = url;\n\ta.download = filename;\n\tx4document.body.appendChild(a);\n\n\ta.click();\n\twindow.URL.revokeObjectURL(url);\n}\n\n// :: MISC ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\n\n/**\n * check if a value is a string\n * @param val \n */\nexport function isString(val: any): val is string {\n\treturn typeof val === 'string';\n}\n\n/**\n * check is a value is an array\n * @param val \n */\nexport function isArray(val: any): val is any[] {\n\treturn val instanceof Array;\n}\n\n/**\n * \n */\n\nexport function isFunction(val: any): val is Function {\n\treturn val instanceof Function;\n}\n\n/**\n * \n */\n\nexport function isLiteralObject(val: any) {\n\treturn (!!val) && (val.constructor === Object);\n};\n\n/**\n * prepend 0 to a value to a given length\n * @param value \n * @param length \n */\n\nexport function pad(what: unknown, size: number, ch: string = '0') {\n\n\tlet value: string;\n\n\tif (!isString(what)) {\n\t\tvalue = '' + what;\n\t}\n\telse {\n\t\tvalue = what;\n\t}\n\n\tif (size > 0) {\n\t\treturn value.padEnd(size, ch);\n\t}\n\telse {\n\t\treturn value.padStart(-size, ch);\n\t}\n}\n\n\n/**\n * return true if val is a finite number\n */\n\nexport function isNumber(val: any): val is number {\n\treturn typeof val === 'number' && isFinite(val);\n}\n\n/**\n * \n * @param name \n */\n\nexport function waitFontLoading(name: string) {\n\n\t// tip for waiting font loading:\n\t// by default, body is created invisible ((opacity = 0)\n\t// we create a div inside with the font we need to wait the loading\n\t// as soon as the font is loaded, it's size will change, the browser end font loading\n\t// we can remove the div.\n\t// pitfall: if the font is already loaded, ne never end.\n\t// @review that\n\n\tlet ct = x4document.createElement('div');\n\n\tct.style.position = 'absolute';\n\tct.style.fontFamily = name;\n\tct.style.fontSize = '44px';\n\tct.style.opacity = '0.001';\n\tct.innerText = 'X';\n\n\tx4document.body.appendChild(ct);\n\n\treturn new Promise<void>((resolve) => {\n\n\t\tlet irc = ct.getBoundingClientRect();\n\t\tlet tm = setInterval(() => {\n\n\t\t\tlet nrc = ct.getBoundingClientRect();\n\t\t\tif (nrc.height != irc.height) {\n\t\t\t\tclearInterval(tm);\n\t\t\t\tx4document.body.removeChild(ct);\n\n\t\t\t\tresolve();\n\t\t\t}\n\t\t}, 0);\n\t});\n}\n\n/**\n * \n * @param fn \n * @param tm \n * \n * @example:\n * \n * defer( ( ) => {\n * \tconsole.log( x );\n * } )( );\n */\n\nexport function deferCall(fn: Function, tm = 0, ...args) {\n\tsetTimeout(fn, tm, ...args);\n}\n\n/**\n * \n */\n\nexport function asap(cb: (time: number) => void) {\n\trequestAnimationFrame(cb);\n}\n\n\n\n/**\n * micro md to html\n * \n * understand:\n * \t**bold**\n * \t*italic*\n * \n * > quote\n * - list\n * # title lvl 1\n * ## title lvl 2\n * ### title lvl 3 ...\n * \n */\n\nexport function markdownToHtml(text: string): string {\n\n\tif (!text) {\n\t\treturn '';\n\t}\n\n\tlet lines = text.split('\\n');\n\n\tlet state = 'para';\n\tlet div = 'p';\n\tlet result: string[] = [];\n\n\tlines.forEach((l) => {\n\n\t\tlet txt = l.trim();\n\n\t\tif (state == 'para') {\n\t\t\t// entree en mode list\n\t\t\tif (txt[0] == '-') {\n\t\t\t\ttxt = txt.substr(1);\n\t\t\t\tresult.push('<ul>')\n\t\t\t\tstate = 'list';\n\t\t\t\tdiv = 'li';\n\t\t\t}\n\t\t\telse if (txt[0] == '>') {\n\t\t\t\ttxt = txt.substr(1);\n\t\t\t\tresult.push('<blockquote>')\n\t\t\t\tstate = 'quote';\n\t\t\t\tdiv = 'p';\n\t\t\t}\n\t\t\telse if (txt[0] == '#') {\n\t\t\t\tlet lvl = 0;\n\t\t\t\tdo {\n\t\t\t\t\ttxt = txt.substr(1);\n\t\t\t\t\tlvl++;\n\t\t\t\t} while (txt[0] == '#' && lvl < 5);\n\n\t\t\t\tdiv = 'h' + lvl;\n\t\t\t\tstate = 'title';\n\t\t\t}\n\t\t}\n\t\telse if (state == 'list') {\n\t\t\t// sortie du mode list\n\t\t\tif (txt[0] != '-') {\n\t\t\t\tresult.push('</ul>')\n\t\t\t\tstate = 'para';\n\t\t\t\tdiv = 'p';\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttxt = txt.substr(1);\n\t\t\t}\n\t\t}\n\t\telse if (state == 'quote') {\n\n\t\t\t// sortie du mode blockquote\n\t\t\tif (txt[0] != '>') {\n\t\t\t\tresult.push('</blockquote>')\n\t\t\t\tstate = 'para';\n\t\t\t\tdiv = 'p';\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttxt = txt.substr(1);\n\t\t\t}\n\t\t}\n\n\t\tlet reBold = /\\*\\*([^*]+)\\*\\*/gi;\n\n\t\ttxt = escapeHtml(txt, false);\n\t\ttxt = txt.replace(reBold, (sub: string, ...a): string => {\n\t\t\treturn '<b>' + sub.substr(2, sub.length - 4) + '</b>';\n\t\t});\n\n\t\tlet reItalic = /\\*([^*]+)\\*/gi;\n\t\ttxt = txt.replace(reItalic, (sub: string, ...a): string => {\n\t\t\treturn '<i>' + sub.substr(1, sub.length - 2) + '</i>';\n\t\t});\n\n\t\t// keep empty lines\n\t\tif (txt == '') {\n\t\t\ttxt = '&nbsp;';\n\t\t}\n\n\t\tresult.push(`<${div}>` + txt + `</${div}>`);\n\n\t\tif (state == 'title') {\n\t\t\tstate = 'para';\n\t\t\tdiv = 'p';\n\t\t}\n\t});\n\n\tif (state == 'list') {\n\t\tresult.push('</ul>')\n\t}\n\telse if (state == 'quote') {\n\t\tresult.push('</blockquote>')\n\t}\n\n\treturn result.join('');\n}\n\n\n/**\n * \n */\n\nexport class NetworkError extends Error {\n\n\tprivate m_code: number;\n\n\tconstructor(response: Response);\n\tconstructor(code: number, text: string);\n\tconstructor(a: number | Response, b?: string) {\n\n\t\tif (a instanceof Response) {\n\t\t\tsuper(a.statusText);\n\t\t\tthis.m_code = a.status;\n\t\t}\n\t\telse {\n\t\t\tsuper(b);\n\t\t\tthis.m_code = a;\n\t\t}\n\t}\n\n\tget code(): number {\n\t\treturn this.m_code;\n\t}\n}\n\n/**\n * return the mouse pos in client coordinates\n * handle correctly touch & mouse\n */\n\nexport function getMousePos(ev: UIEvent, fromDoc: boolean): Point {\n\n\tlet x_name = 'offsetX',\n\t\ty_name = 'offsetY';\n\n\tif (fromDoc) {\n\t\tx_name = 'clientX';\n\t\ty_name = 'clientY';\n\t}\n\n\tif (ev.type == 'mousemove' || ev.type == 'mousedown' || ev.type == 'mouseup') {\n\t\tlet em = ev as MouseEvent;\n\t\treturn new Point(em[x_name], em[y_name]);\n\t}\n\telse if (ev.type == 'pointermove' || ev.type == 'pointerdown' || ev.type == 'pointerup') {\n\t\tlet em = ev as MouseEvent;\n\t\treturn new Point(em[x_name], em[y_name]);\n\t}\n\telse if (ev.type == 'touchmove' || ev.type == 'touchstart') {\n\t\tlet et = ev as TouchEvent;\n\t\treturn new Point(et.touches[0][x_name], et.touches[0][y_name]);\n\t}\n\telse if (ev.type == 'contextmenu') {\n\t\tlet em = ev as MouseEvent;\n\t\treturn new Point(em[x_name], em[y_name]);\n\t}\n\telse {\n\t\treturn new Point(0, 0);\n\t}\n}\n\n/**\n * clamp a value\n * @param v - value to clamp\n * @param min - min value\n * @param max - max value\n * @returns clamped value\n */\n\nexport function clamp(v: number, min: number, max: number) {\n\treturn Math.min(Math.max(v, min), max);\n}\n\n\n/**\n * \n */\n\nexport interface IDisposable {\n\tdispose();\n}\n\n// :: HTML strings ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\nexport class HtmlString extends String {\n\tconstructor(text: string) { super(text); }\n\n\tstatic from(text: string) {\n\t\treturn new HtmlString(text);\n\t}\n}\n\nexport function html(a, ...b): HtmlString {\n\treturn HtmlString.from(String.raw(a, ...b));\n}\n\nexport function isHtmlString(val: any): val is HtmlString {\n\treturn val instanceof HtmlString;\n}\n\n// :: CLIPBOARD ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\nexport class Clipboard {\n\tstatic copy(data: any) {\n\t\tif (navigator.clipboard) {\n\t\t\tnavigator.clipboard.writeText(JSON.stringify(data));\n\t\t}\n\t}\n\n\tstatic paste(cb: (data: string) => void) {\n\t\tif (navigator.clipboard) {\n\t\t\tnavigator.clipboard.readText().then(v => cb(v));\n\t\t}\n\t\telse {\n\t\t\tconsole.error('no clipboard, are you in https ?');\n\t\t}\n\t}\n}\n\n\n// :: CRC32 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\n/**\n * Calculates the CRC32 checksum of a string.\n * taken from: https://gist.github.com/wqli78/1330293/6d85cc967f32cccfcbad94ae7d088a3dcfc14bd9\n *\n * @param {String} str\n * @param {Boolean} hex\n * @return {String} checksum\n * @api public\n */\n\nexport function crc32(str) {\n\tlet crc = ~0;\n\tlet buf = Buffer.from( str );\n\n\tlet i = 0,\n\t\tl = buf.length;\n\twhile( i<l ) {\n crc = (crc >>> 8) ^ crc32tab[(crc ^ buf[i]) & 0xff];\n\t\ti++;\n }\n\n return (crc ^ -1)>>>0;\n}\n\nvar crc32tab = new Int32Array([\n\t0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,\n\t0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,\n\t0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,\n\t0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,\n\t0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,\n\t0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,\n\t0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,\n\t0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,\n\t0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,\n\t0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,\n\t0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,\n\t0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,\n\t0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,\n\t0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,\n\t0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,\n\t0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,\n\t0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,\n\t0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,\n\t0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,\n\t0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,\n\t0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,\n\t0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,\n\t0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,\n\t0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,\n\t0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,\n\t0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,\n\t0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,\n\t0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,\n\t0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,\n\t0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,\n\t0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,\n\t0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,\n\t0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,\n\t0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,\n\t0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,\n\t0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,\n\t0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,\n\t0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,\n\t0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,\n\t0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,\n\t0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,\n\t0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,\n\t0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,\n\t0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,\n\t0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,\n\t0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,\n\t0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,\n\t0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,\n\t0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,\n\t0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,\n\t0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,\n\t0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,\n\t0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,\n\t0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,\n\t0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,\n\t0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,\n\t0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,\n\t0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,\n\t0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,\n\t0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,\n\t0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,\n\t0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,\n\t0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,\n\t0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d\n]);\n\n\n// :: MIXINS ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\n/**\n * taken from this excellent article:\n *\thttps://justinfagnani.com/2015/12/21/real-mixins-with-javascript-classes/\n *\n * @example:\n *\tclass MyClass extends mix(MyBaseClass).with(Mixin1, Mixin2) {\n * }\n **/\n\nexport const mix = (superclass) => new MixinBuilder(superclass);\n\nclass MixinBuilder {\n\n\tprivate superclass: any;\n\n\tconstructor(superclass) {\n\t\tthis.superclass = superclass;\n\t}\n\n\twith(...mixins) {\n\t\treturn mixins.reduce((c, mixin) => mixin(c), this.superclass);\n\t}\n}\n\n/**\n * @example\n * \n * ```\n * \tconst cls = classNames( 'class1 class2', {\n * \t\t'class3': false,\n * \t\t'class4': true,\n * });\n * \n * // even shorter\n * const class1 = true, class2 = false;\n * const cls = classNames( { class1, class2 } ); // cls = \"class1\"\n * \n * ```\n * \n * @returns \n */\n\nexport function classNames(...args: (string | any)[]) {\n\n\tlet result = '';\n\n\tfor (const cls of args) {\n\t\tif (typeof cls === 'string') {\n\t\t\tresult += ' ' + cls;\n\t\t}\n\t\telse if (cls) {\n\t\t\tfor (const c in cls) {\n\t\t\t\tif (cls[c])\n\t\t\t\t\tresult += ' ' + c;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result;\n}\n\n/**\n * \n */\n\ninterface PasswordRule {\n\tchars: string;\n\tmin: number;\n}\n\nexport function generatePassword(length: number, rules?: PasswordRule[]) {\n\n\tif (!length || length == undefined) {\n\t\tlength = 8;\n\t}\n\n\tif (!rules) {\n\t\trules = [\n\t\t\t{ chars: \"abcdefghijklmnopqrstuvwxyz\", min: 3 }, // As least 3 lowercase letters\n\t\t\t{ chars: \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\", min: 2 }, // At least 2 uppercase letters\n\t\t\t{ chars: \"0123456789\", min: 2 }, // At least 2 digits\n\t\t\t{ chars: \"!@#$*|%+-_.;\", min: 2 } // At least 1 special char\n\t\t];\n\t}\n\n\tlet allChars = \"\";\n\tlet allMin = 0;\n\n\trules.forEach(function (rule) {\n\t\tallChars += rule.chars;\n\t\tallMin += rule.min;\n\t});\n\n\tif (length < allMin) {\n\t\tlength = allMin;\n\t}\n\n\trules.push({ chars: allChars, min: length - allMin });\n\n\tlet pswd = \"\";\n\trules.forEach(function (rule) {\n\t\tif (rule.min > 0) {\n\t\t\tpswd += shuffle(rule.chars, rule.min);\n\t\t}\n\t});\n\n\treturn shuffle(pswd);\n}\n\nfunction shuffle(str: string, maxlength?: number) {\n\tlet shuffled = str.split('').sort(() => {\n\t\treturn 0.5 - Math.random()\n\t}).join('');\n\n\tif (maxlength > 0) {\n\t\tshuffled = shuffled.substr(0, maxlength);\n\t}\n\n\treturn shuffled;\n}\n\n\n\n/**\n * taken from live-server \n * https://github.com/tapio/live-server\n * @param host \n * @param port \n */\n \nexport function installHMR(host = \"127.0.0.1\", port = \"9876\", reloadCallback?: Function ) {\n\n\tlet tm;\n\n\tfunction refreshCSS() {\n\n\t\tdocument.body.style.visibility = \"hidden\";\n\n\t\tlet sheets = [].slice.call(document.getElementsByTagName(\"link\"));\n\t\tlet head = document.getElementsByTagName(\"head\")[0];\n\t\t\n\t\tfor (let i = 0; i < sheets.length; ++i) {\n\t\t\tlet elem = sheets[i];\n\t\t\thead.removeChild(elem);\n\n\t\t\tlet rel = elem.rel;\n\t\t\tif (elem.href && typeof rel != \"string\" || rel.length == 0 || rel.toLowerCase() == \"stylesheet\") {\n\t\t\t\tlet url = elem.href.replace(/(&|\\?)_cacheOverride=\\d+/, '');\n\t\t\t\telem.href = url + (url.indexOf('?') >= 0 ? '&' : '?') + '_cacheOverride=' + (new Date().valueOf());\n\t\t\t}\n\t\t\t\n\t\t\thead.appendChild(elem);\n\t\t}\n\n\t\tif( tm ) { clearTimeout(tm); }\n\t\ttm = setTimeout( () => {\n\t\t\tdocument.body.style.visibility = \"unset\";\n\t\t}, 50 );\n\t}\n\n\tconst protocol = window.location.protocol === 'https:' ? 'wss://' : 'ws://';\n\tconst address = `${protocol}${host}:${port}/ws`;\t\n\tconst socket = new WebSocket(address);\n\n\tsocket.onmessage = function (msg) {\n\t\tif (msg.data == 'reload') {\n\t\t\tif( reloadCallback ) {\n\t\t\t\treloadCallback( );\n\t\t\t}\n\t\t\telse {\n\t\t\t\twindow.location.reload();\n\t\t\t}\n\t\t}\n\t\telse if (msg.data == 'refreshcss') {\n\t\t\trefreshCSS();\n\t\t}\n\t};\n\n\tconsole.log('Live reload enabled.');\n}", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file styles.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\n\nimport { pascalCase, isString, isArray } from \"./tools\";\n\n\n/**\n * -- [ @STYLESHEET ] -----------------------------------------------------------------\n */\n\nexport class Stylesheet {\n\n\tprivate m_sheet: CSSStyleSheet;\n\tprivate m_rules: Map<string, number> = new Map<string,number>( );\n\n\tconstructor() {\n\t\t\n\t\tfunction getStyleSheet( name ) : CSSStyleSheet {\n\t\t\tfor(let i=0; i<x4document.styleSheets.length; i++) {\n\t\t\t \tlet sheet = x4document.styleSheets[i];\n\t\t\t \tif(sheet.title === name ) {\n\t\t\t\t\treturn <CSSStyleSheet>sheet;\n\t\t\t \t}\n\t\t\t}\n\t\t}\n\n\t\tthis.m_sheet = getStyleSheet( '@dynamic-css' );\n\t\tif( !this.m_sheet ) {\n\t\t\tlet dom = x4document.createElement( 'style' );\n\t\t\tdom.setAttribute('id', '@dynamic-css' );\n\t\t\tx4document.head.appendChild(dom);\n\n\t\t\tthis.m_sheet = <CSSStyleSheet>dom.sheet\n\t\t}\n\t}\n\n /**\n * add a new rule to the style sheet\n * @param {string} name - internal rule name \n * @param {string} definition - css definition of the rule \n * @example\n * setRule('xbody', \"body { background-color: #ff0000; }\" );\n */\n\n\tpublic setRule(name: string, definition: any ) {\n\n\t\tif( isString(definition) ) {\n\t\t\tlet index = this.m_rules.get( name );\n\t\t\tif (index !== undefined) {\n\t\t\t\tthis.m_sheet.deleteRule(index);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tindex = this.m_sheet.cssRules.length;\n\t\t\t}\n\n\t\t\tthis.m_rules.set( name, this.m_sheet.insertRule( definition, index) );\n\t\t}\n\t\telse {\n\t\t\tlet idx = 1;\n\t\t\tfor( let r in definition ) {\n\n\t\t\t\tlet rule = r + \" { \",\n\t\t\t\t\tcss = definition[r];\n\n\t\t\t\tfor (let i in css) {\n\t\t\t\t\t\n\t\t\t\t\tlet values = css[i];\t// this is an array !\n\t\t\t\t\tfor (let j = 0; j < values.length; j++) {\n\t\t\t\t\t\trule += i + \": \" + values[j] + \"; \"\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\trule += '}';\n\n\t\t\t\t//console.log( rule );\n\t\t\t\t\n\t\t\t\tthis.setRule( name+'--'+idx, rule );\n\t\t\t\tidx++;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * return the style variable value\n\t * @param name - variable name \n\t * @example\n\t * ```\n\t * let color = Component.getCss( ).getVar( 'button-color' );\n\t * ```\n\t */\n\n\tpublic static getVar( name: string ) : any {\n\t\tif( !Stylesheet.doc_style ) {\n\t\t\tStylesheet.doc_style = getComputedStyle( x4document.documentElement );\n\t\t}\n\n\t\tif( name[0]!='-' ) {\n\t\t\tname = '--'+name;\n\t\t}\n\n \treturn Stylesheet.doc_style.getPropertyValue( name ); // #999999\n\t}\n\n\tstatic guid: number = 1;\n\tstatic doc_style: CSSStyleDeclaration;\n}\n\n\n/**\n * -- [ @CSSPARSER ] -----------------------------------------------------------------\n * \n * adaptation of jss-for-node-js\n */\n\nexport class CSSParser {\n\n\tprivate result = {};\n\n\tparse(css) {\n\t\tthis.result = {};\n\t\tthis.parse_json('', css);\n\t\treturn CSSParser.mk_string(this.result);\n\t}\n\n\tpublic static mk_string( rules: any ) {\n\n\t\t// output result:\t\n\t\tlet ret = '';\n\n\t\tfor (let a in rules) {\n\t\t\tlet css = rules[a];\n\t\t\tret += a + \" { \"\n\n\t\t\tfor (let i in css) {\n\t\t\t\t\n\t\t\t\tlet values = css[i];\t// this is an array !\n\t\t\t\tfor (let j = 0; j < values.length; j++) {\n\t\t\t\t\tret += i + \": \" + values[j] + \"; \"\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tret += \"}\\n\"\n\t\t}\n\n\t\treturn ret;\n\t}\n\n\tprivate parse_json(scope: string, css: any) {\n\n\t\tif (scope && !this.result[scope]) {\n\t\t\tthis.result[scope] = {};\n\t\t}\n\n\t\tfor (let property in css) {\n\n\t\t\tlet value = css[property];\n\n\t\t\tif ( isArray(value) ) {\n\t\t\t\tlet values = value;\n\t\t\t\tfor (let i = 0; i < values.length; i++) {\n\t\t\t\t\tthis.addProperty(scope, property, values[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t/*else if (value instanceof Color) {\n\t\t\t\tthis.addProperty(scope, property, value.toString());\n\t\t\t}*/\n\t\t\telse {\n\t\t\t\tswitch (typeof (value)) {\n\n\t\t\t\t\tcase \"number\": {\n\t\t\t\t\t\tthis.addProperty(scope, property, value);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"string\": {\n\t\t\t\t\t\tthis.addProperty(scope, property, value );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"object\": {\n\t\t\t\t\t\tthis.parse_json(this.makeSelectorName(scope, property), value);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tdefault: {\n\t\t\t\t\t\tconsole.error(\"ignoring unknown type \" + typeof (value) + \" in property \" + property);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate makePropertyName(n: string): string {\n\t\treturn pascalCase(n);\n\t}\n\n\tprivate makeSelectorName(scope: string, name: string): string {\n\n\t\tlet snames = [];\n\t\tlet names = name.split(/\\s*,\\s*/);\n\t\tlet scopes = scope.split(/\\s*,\\s*/);\n\n\t\tfor (let s = 0; s < scopes.length; s++) {\n\t\t\tlet scope = scopes[s];\n\n\t\t\tfor (let i = 0; i < names.length; i++) {\n\n\t\t\t\tlet name = names[i],\n\t\t\t\t\tsub = false;\n\n\t\t\t\tif (name.charAt(0) == \"&\") {\n\t\t\t\t\tname = name.substr(1);\n\t\t\t\t\tsub = true;\n\t\t\t\t}\n\n\t\t\t\tif (name.charAt(0) === '%') {\n\t\t\t\t\tname = '.o-' + name.substr(1);\n\t\t\t\t}\n\n\t\t\t\tif (sub) {\n\t\t\t\t\tsnames.push(scope + name)\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tsnames.push(scope ? scope + \" \" + name : name)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn snames.join(\", \");\n\t}\n\n\taddProperty(scope: string, property: string, value: any) {\n\n\t\tlet properties = property.split(/\\s*,\\s*/);\n\n\t\tfor (let i = 0; i < properties.length; i++) {\n\n\t\t\tlet property = this.makePropertyName(properties[i]);\n\n\t\t\tif (this.result[scope][property]) {\n\t\t\t\tthis.result[scope][property].push(value);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.result[scope][property] = [value];\n\t\t\t}\n\n\t\t\tlet specials = {\n\t\t\t\t\"box-shadow\": [\n\t\t\t\t\t\"-moz-box-shadow\",\n\t\t\t\t\t\"-webkit-box-shadow\"\n\t\t\t\t],\n\t\t\t\t\"border-radius\": [\n\t\t\t\t\t\"-moz-border-radius\",\n\t\t\t\t\t\"-webkit-border-radius\"\n\t\t\t\t],\n\t\t\t\t\"border-radius-topleft\": [\n\t\t\t\t\t\"-moz-border-radius-topleft\",\n\t\t\t\t\t\"-webkit-border-top-left-radius\"\n\t\t\t\t],\n\t\t\t\t\"border-radius-topright\": [\n\t\t\t\t\t\"-moz-border-radius-topright\",\n\t\t\t\t\t\"-webkit-border-top-right-radius\"\n\t\t\t\t],\n\t\t\t\t\"border-radius-bottomleft\": [\n\t\t\t\t\t\"-moz-border-radius-bottomleft\",\n\t\t\t\t\t\"-webkit-border-bottom-left-radius\"\n\t\t\t\t],\n\t\t\t\t\"border-radius-bottomright\": [\n\t\t\t\t\t\"-moz-border-radius-bottomright\",\n\t\t\t\t\t\"-webkit-border-bottom-right-radius\"\n\t\t\t\t]\n\t\t\t}\n\n\t\t\tlet browser_specials = specials[property];\n\t\t\tfor (let j = 0; browser_specials && j < browser_specials.length; j++) {\n\t\t\t\tthis.addProperty(scope, browser_specials[j], value);\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport class ComputedStyle {\n\tm_style:CSSStyleDeclaration;\n\n\tconstructor( style: CSSStyleDeclaration ) {\n\t\tthis.m_style = style;\n\t}\n\n\t/**\n\t * return the raw value\n\t */\n\n\tvalue( name: string ) : string {\n\t\tname = pascalCase( name );\n\t\treturn this.m_style[name];\n\t}\n\n\t/**\n\t * return the interpreted value\n\t */\n\t\n\tparse( name: string ) : number {\n\t\tname = pascalCase( name );\n\t\treturn parseInt( this.m_style[name] );\n\t}\n\n\t/**\n\t * \n\t */\n\n\tget style( ) {\n\t\treturn this.m_style;\n\t}\n}\n", "/**\r\n* ___ ___ __\r\n* \\ \\/ / / _\r\n* \\ / /_| |_\r\n* / \\____ _| \r\n* /__/\\__\\ |_|\r\n* \r\n * @file components.ts\r\n * @author Etienne Cochard \r\n*\r\n* Copyright (c) 2019-2023 R-libre ingenierie\r\n*\r\n* Permission is hereby granted, free of charge, to any person obtaining a copy \r\n* of this software and associated documentation files (the \"Software\"), to deal \r\n* in the Software without restriction, including without limitation the rights \r\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \r\n* of the Software, and to permit persons to whom the Software is furnished to do so, \r\n* subject to the following conditions:\r\n* The above copyright notice and this permission notice shall be included in all copies\r\n* or substantial portions of the Software.\r\n*\r\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \r\n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \r\n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \r\n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \r\n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n */\r\n\r\n\r\n/**\r\n * @todo \r\n *\t\tcreate Container class\r\n */\r\n\r\nimport { pascalCase, Rect, isString, isArray, Size, isNumber, asap, HtmlString, isHtmlString, Constructor, getMousePos } from './tools';\r\nimport { x4document } from './x4dom';\r\n\r\nimport { Stylesheet, ComputedStyle } from './styles';\r\nimport { _tr } from './i18n';\r\nimport { BasicEvent, EventCallback } from './x4events';\r\nimport { BaseComponent, BaseComponentProps, BaseComponentEventMap } from './base_component';\r\nimport { IDOMEvents, X4ElementEventMap } from './dom_events';\r\n\r\nexport { HtmlString, isHtmlString, html } from './tools'\r\n\r\nexport interface EventHandler<T> {\r\n\t(ev: T): any;\r\n}\r\n\r\nexport interface ICaptureInfo {\r\n\tinitiator: Component;\r\n\thandler: EventHandler<UIEvent>;\r\n\tiframes: NodeListOf<HTMLIFrameElement>;\r\n}\r\n\r\ntype CSSPropertyName = {\r\n\t-readonly [K in keyof CSSStyleDeclaration & string]: CSSStyleDeclaration[K];\r\n};\r\n\r\n/** @ignore classname prefix for system classes */\r\nconst _x4_ns_prefix = 'x-';\r\n\r\n// -- elements -----------\r\n\r\n/** @ignore where event handlers are stored */\r\nconst _x4_el_store = Symbol();\r\n\r\n/** @ignore where Component is stored in dom */\r\nconst _x4_el_sym = Symbol();\r\n\r\n/** @ignore properties without 'px' unit */\r\nexport const _x4_unitless: Record<string,1> = {\r\n\tanimationIterationCount: 1, borderImageOutset: 1, borderImageSlice: 1, borderImageWidth: 1, boxFlex: 1, boxFlexGroup: 1,\r\n\tboxOrdinalGroup: 1, columnCount: 1, flex: 1, flexGrow: 1, flexPositive: 1, flexShrink: 1, flexNegative: 1, flexOrder: 1,\r\n\tgridRow: 1, gridColumn: 1, fontWeight: 1, lineClamp: 1, lineHeight: 1, opacity: 1, order: 1, orphans: 1, tabSize: 1, widows: 1,\r\n\tzIndex: 1, zoom: 1,\r\n\r\n\t// SVG-related _properties\r\n\tfillOpacity: 1, floodOpacity: 1, stopOpacity: 1, strokeDasharray: 1, strokeDashoffset: 1, strokeMiterlimit: 1, strokeOpacity: 1,\r\n\tstrokeWidth: 1,\r\n};\r\n\r\n/** @ignore this events must be defined on domNode (do not bubble) */\r\nconst unbubbleEvents = {\r\n\tmouseleave: 1, mouseenter: 1, load: 1, unload: 1, scroll: 1, focus: 1, blur: 1, rowexit: 1, beforeunload: 1, stop: 1,\r\n\tdragdrop: 1, dragenter: 1, dragexit: 1, draggesture: 1, dragover: 1, contextmenu: 1, create: 2, sizechange: 2\r\n};\r\n\r\n/** @ignore */\r\nconst passiveEvents = {\r\n\ttouchstart: 1, touchmove: 1, touchend: 1, \r\n\t//pointerdown: 1, pointermove: 1, pointerup: 1,\r\n};\r\n\r\n/** ignore */\r\nconst reNumber = /^-?\\d+(\\.\\d+)?$/;\r\n\r\n\r\n/**\r\n * \r\n */\r\n\r\nexport type VoidCallback = () => void;\r\n\r\nexport type ComponentOrString = Component | string | HtmlString;\r\nexport type ComponentContent = ComponentOrString | ComponentOrString[];\r\n\r\ninterface IMap<T> {\r\n\t[key: string]: T;\r\n}\r\n\r\n/**\r\n * DblClick Event\r\n * double click event \r\n */\r\n\r\nexport interface EvDblClick extends BasicEvent {\r\n}\r\n\r\nexport function EvDblClick(context: any = null) {\r\n\treturn BasicEvent<EvDblClick>({ context });\r\n}\r\n\r\n/**\r\n * DblFocus Event\r\n * double click event \r\n */\r\n\r\nexport interface EvFocus extends BasicEvent {\r\n\treadonly focus: boolean;\r\n}\r\n\r\nexport function EvFocus( focus = true, context: any = null) {\r\n\treturn BasicEvent<EvFocus>({ focus, context });\r\n}\r\n\r\n/**\r\n * basic event map of Component\r\n */\r\n\r\nexport interface CEventMap extends BaseComponentEventMap {\r\n}\r\n\r\n\r\n\r\n\r\n/**\r\n * Basic properties of every Component\r\n */\r\n\r\nexport interface CProps<T extends CEventMap = CEventMap> extends BaseComponentProps<T> {\r\n\ttag?: string;\t\t\t// dom Tag <div> if not specified\r\n\tns?: string;\t\t\t// namespace (usefull for svg)\r\n\tcls?: string;\t\t\t// elements classes (space separated), prefix class name with @ to make it system wide\r\n\tid?: string;\t\t\t// element id\r\n\tstyle?: IMap<string | number>;\t// element style\r\n\tattrs?: Record<string,string|number|boolean>;\t\t\t// element attributes\r\n\r\n\tdom_events?: IDOMEvents;\t// DOM event handlers\r\n\tdata?: any;\t\t\t\t// element user data (you can store everything you need here)\r\n\tcontent?: ComponentContent;\t// array of sub components\r\n\ttooltip?: string;\t\t// tooltip text\r\n\tref?: string;\t\t\t// internal reference for itemWithRef\r\n\r\n\t// shortcuts for element style\r\n\tleft?: number;\r\n\ttop?: number;\r\n\twidth?: number | string;\r\n\theight?: number | string;\r\n\ttabIndex?: number | boolean;\r\n\r\n\tflex?: number | string;\t// add @flex class to the element\r\n\tenabled?: boolean;\t\t// add @disabled to the element if false\r\n}\r\n\r\ninterface DomListener {\r\n\tlistener: EventListener,\r\n\tpassive?: boolean\r\n}\r\n\r\ninterface CInternalProps {\r\n\tdom_events: Record<string,DomListener[]>;\r\n\tclasses: IMap<boolean>;\r\n\tuid: number;\r\n\tcreated: boolean;\r\n\tinrender: boolean;\r\n}\r\n\r\n/**\r\n * \r\n */\r\n\r\nexport class Component<P extends CProps<CEventMap> = CProps<CEventMap>, E extends CEventMap = CEventMap> extends BaseComponent<P, E> {\r\n\tprivate m_dom: HTMLElement;\r\n\tprivate m_iprops: CInternalProps;\r\n\r\n\tprivate static __sb_width: number;\t\t\t// scrollbar width\r\n\tprivate static __comp_guid = 1000;\t// component global unique id\r\n\tprivate static __privateEvents: any = {};\r\n\tprivate static __sizeObserver: ResizeObserver;\t// resize observer\r\n\tprivate static __createObserver: MutationObserver;\t// creation observer\r\n\t//private static __intersectionObserver: IntersectionObserver;\t// visibility observer\r\n\r\n\tprivate static __capture: ICaptureInfo = null;\r\n\tprivate static __capture_mask: HTMLElement = null;\r\n\tprivate static __css: Stylesheet = null;\r\n\r\n\tconstructor(props: P = null ) {\r\n\t\tsuper(props ?? {} as P );\r\n\r\n\t\tthis.m_iprops = {\r\n\t\t\tclasses: {},\r\n\t\t\tdom_events: {},\r\n\t\t\tuid: Component.__comp_guid++,\r\n\t\t\tinrender: false,\r\n\t\t\tcreated: false,\r\n\t\t};\r\n\r\n\t\t// prepare iprops\r\n\t\tif( this.m_props.cls ) {\r\n\t\t\tthis.addClass( this.m_props.cls );\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * \r\n\t */\r\n\r\n\tget uid() {\r\n\t\treturn this.m_iprops.uid;\r\n\t}\r\n\r\n\t/**\r\n\t * change the component content\r\n\t * @param content new content or null\r\n\t */\r\n\r\n\tsetContent(content: ComponentContent, refreshAll = false ) {\r\n\t\tthis.m_props.content = content ?? [];\r\n\r\n\t\tif( this.m_iprops.inrender || !this.m_dom ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (refreshAll) {\r\n\t\t\tthis.update();\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis._updateContent();\r\n\t\t}\r\n\t}\r\n\r\n\tgetContent( ) {\r\n\t\treturn this.m_props.content;\r\n\t}\r\n\r\n\t/**\r\n\t * add a new child to the component content\r\n\t * @param content \r\n\t */\r\n\r\n\tappendChild(content: ComponentContent) {\r\n\r\n\t\tif (!content) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst append = (c: ComponentOrString) => {\r\n\r\n\t\t\tif (!this.m_props.content) {\r\n\t\t\t\tthis.m_props.content = [];\r\n\t\t\t}\r\n\t\t\telse if (!isArray(this.m_props.content)) {\r\n\t\t\t\tthis.m_props.content = [this.m_props.content];\r\n\t\t\t}\r\n\r\n\t\t\tthis.m_props.content.push(c);\r\n\t\t\tif (this.m_dom) {\r\n\t\t\t\tthis._appendChild(c);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (isArray(content)) {\r\n\t\t\tcontent.forEach(append);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tappend(content);\r\n\t\t}\r\n\t}\r\n\r\n\tremoveChild( item: Component ) {\r\n\t\tif( this.m_props.content ) {\r\n\t\t\tif (!isArray(this.m_props.content)) {\r\n\t\t\t\tthis.m_props.content = [this.m_props.content];\r\n\t\t\t}\r\n\r\n\t\t\tthis.m_props.content = this.m_props.content.filter( x => x!==item );\r\n\t\t}\r\n\r\n\t\tif( this.dom && item.dom ) {\r\n\t\t\tthis.dom.removeChild( item.dom );\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * \r\n\t */\r\n\r\n\tsetTag( tag: string, namespace?: string ) {\r\n\t\tthis.m_props.tag = tag;\r\n\t\tif( namespace ) {\r\n\t\t\tthis.m_props.ns = namespace;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * get the Component data value\r\n\t * @param name name to get\r\n\t */\r\n\r\n\tgetData(name: string | Symbol): any {\r\n\t\tif (this.m_props.data !== undefined) {\r\n\t\t\treturn this.m_props.data[name.toString()];\r\n\t\t}\r\n\r\n\t\treturn undefined;\r\n\t}\r\n\r\n\t/**\r\n\t * set the Component data value\r\n\t * @param name name to get\r\n\t * @param value\r\n\t */\r\n\r\n\tsetData(name: string | Symbol , value: any) {\r\n\r\n\t\tlet data = this.m_props.data;\r\n\t\tif (data === undefined) {\r\n\t\t\tdata = this.m_props.data = {};\r\n\t\t}\r\n\r\n\t\tdata[name.toString()] = value;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * return the DOM associated with the Component (if any)\r\n\t */\r\n\r\n\tget dom(): HTMLElement {\r\n\t\treturn this.m_dom;\r\n\t}\r\n\r\n\t/**\r\n\t * shows the element\r\n\t * @param show\r\n\t */\r\n\r\n\tshow(show?: boolean) {\r\n\t\tif (show === undefined || show === true) {\r\n\t\t\tthis.removeClass('@hidden');\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.addClass('@hidden');\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * hides the element\r\n\t */\r\n\thide() {\r\n\t\tthis.addClass('@hidden');\r\n\t}\r\n\r\n\t/**\r\n\t * enable or disable the element\r\n\t * @param enable \r\n\t */\r\n\r\n\tenable(enable?: boolean) {\r\n\t\tif (enable === undefined || enable === true) {\r\n\t\t\tthis.removeClass('@disable');\r\n\t\t\tthis.removeAttribute('disabled');\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.disable();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * disable the element\r\n\t */\r\n\r\n\tdisable() {\r\n\t\tthis.addClass('@disable');\r\n\t\tthis.setAttribute('disabled', '');\r\n\t}\r\n\r\n\t/**\r\n\t * set the focus on the element\r\n\t */\r\n\r\n\tfocus() {\r\n\t\tconsole.assert(!!this.m_dom);\r\n\t\tthis.m_dom.focus();\r\n\t}\r\n\r\n\t/**\r\n\t * change the object style\r\n\t * @param style - style to add\r\n\t * @example ```typescript\r\n\t * el.setStyle( {left:100} );\r\n\t */\r\n\r\n\tpublic setStyle(style: Record<string,any>) {\r\n\t\tfor (let s in style) {\r\n\t\t\tthis.setStyleValue(s, style[s]);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * change a style value\r\n\t * @param name string style nale\r\n\t * @param value any style value or null to remove style\r\n\t */\r\n\r\n\tsetStyleValue(name: string, value: any) {\r\n\t\tlet style = this.m_props.style;\r\n\t\tif (!style) {\r\n\t\t\tstyle = this.m_props.style = {};\r\n\t\t}\r\n\r\n\t\tstyle[name] = value;\r\n\t\tthis._setDomStyleValue(name, value);\r\n\t}\r\n\r\n\tprivate _setDomStyleValue(name: string, value: string | number) {\r\n\r\n\t\tif (this.m_dom) {\r\n\t\t\tif (value === undefined) {\r\n\t\t\t\tvalue = null;\r\n\t\t\t}\r\n\t\t\telse if (!_x4_unitless[name as string] && (isNumber(value) || reNumber.test(value))) {\r\n\t\t\t\tvalue = value + 'px';\r\n\t\t\t}\r\n\r\n\t\t\t(this.m_dom.style as any)[name] = value;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * compute the element style \r\n\t * @return all styles computed\r\n\t */\r\n\r\n\tpublic getComputedStyle(pseudoElt?: string): ComputedStyle {\r\n\t\tif (this.dom) {\r\n\t\t\treturn new ComputedStyle(getComputedStyle(this.dom, pseudoElt ?? null));\r\n\t\t}\r\n\r\n\t\treturn new ComputedStyle(this.m_props.style as any);\r\n\t}\r\n\r\n\t/**\r\n\t * return a single stype value\r\n\t * @param name - value to get\r\n\t */\r\n\r\n\tpublic getStyleValue(name: string) {\r\n\t\treturn (this.getComputedStyle() as any)[name];\r\n\t}\r\n\r\n\t/**\r\n\t * define the elements attributes\r\n\t * @param attrs \r\n\t */\r\n\r\n\tpublic setAttributes(attrs: any) {\r\n\t\tfor (let a in attrs) {\r\n\t\t\tthis.setAttribute(a, attrs[a]);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * change a single attribute\r\n\t * @param name attribute name\r\n\t * @param value new value \r\n\t */\r\n\r\n\tpublic setAttribute(name: string, value: any) {\r\n\r\n\t\tif (value === false || value === undefined) {\r\n\t\t\tthis.removeAttribute(name);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tif (value === true) {\r\n\t\t\t\tvalue = '';\r\n\t\t\t}\r\n\t\t\telse if (isNumber(value)) {\r\n\t\t\t\tvalue = '' + value;\r\n\t\t\t}\r\n\r\n\t\t\tlet attrs = this.m_props.attrs;\r\n\t\t\tif (!attrs) {\r\n\t\t\t\tattrs = this.m_props.attrs = {};\r\n\t\t\t}\r\n\r\n\t\t\tattrs[name] = value;\r\n\t\t\tthis._setDomAttribute(name, value);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate _setDomAttribute(name: string, value: string) {\r\n\t\tif (this.m_dom) {\r\n\t\t\tthis.m_dom.setAttribute(name, value);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * remove an atrribute\r\n\t * @param name name of the attribute\r\n\t */\r\n\tpublic removeAttribute(name: string) {\r\n\t\tlet attrs = this.m_props.attrs;\r\n\t\tif (!attrs) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tdelete attrs[name];\r\n\r\n\t\tif (this.m_dom) {\r\n\t\t\tthis.m_dom.removeAttribute(name);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * get an attribute value\r\n\t * @param {string} name - attribute name\r\n\t * @return {string} attribute value\r\n\t * @example ```typescript\r\n\t * let chk = el.getAttribute( 'checked' );\r\n\t * @review double cache\r\n\t */\r\n\r\n\tpublic getAttribute(name: string): string {\r\n\t\tif (this.m_dom) {\r\n\t\t\treturn this.m_dom.getAttribute(name);\r\n\t\t}\r\n\t\telse {\r\n\t\t\t//todo move to attrs\r\n\t\t\tif( name=='id' ) {\r\n\t\t\t\treturn this.m_props.id;\r\n\t\t\t}\r\n\r\n\t\t\treturn this.m_props.attrs ? this.m_props.attrs[name]+'' : undefined;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * check if the element has an attribute\r\n\t * @param name attribute name\r\n\t * @return true is attribute is present\r\n\t * @example ```typescript\r\n\t * if( el.hasAttribute('checked') ) {\r\n\t * }\r\n\t */\r\n\r\n\tpublic hasAttribute(name: string): boolean {\r\n\t\tif (this.m_dom) {\r\n\t\t\treturn this.m_dom.hasAttribute(name);\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn this.m_props.attrs.hasOwnProperty(name);\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * a some classnames to the component\r\n\t * classes can be separated by a space\r\n\t * @param cls class to add\r\n\t * @example ```typescript\r\n\t * addClass( 'my class name @flex' );\r\n\t */\r\n\r\n\tpublic addClass(name: string) {\r\n\r\n\t\tif (name === null || name === undefined) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tname = name.trim();\r\n\t\tif (name === '') {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet add = (c: string) => {\r\n\r\n\t\t\tif (c === undefined || c === null || c === '') {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tc = this._makeCls(c);\r\n\r\n\t\t\t// update vdom\r\n\t\t\tclasses[c] = true;\r\n\r\n\t\t\t// update dom\r\n\t\t\tif (this.m_dom) {\r\n\t\t\t\tthis.m_dom.classList.add(c);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlet classes = this.m_iprops.classes;\r\n\t\tif (name.indexOf(' ') < 0) {\r\n\t\t\tadd(name);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tlet names = name.split(' ');\r\n\t\t\tnames.forEach((n) => add(n));\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Remove a class from the element\r\n\t * @param {string|array} name - classes in string form can be space separated\r\n\t * \r\n\t * @example ```typescript\r\n\t * el.removeClass( 'myclass' );\r\n\t * el.removeClass( 'myclass1 myclass2' );\r\n\t */\r\n\r\n\tpublic removeClass(name: string): void {\r\n\r\n\t\tif (name === undefined) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet remove = (c: string) => {\r\n\t\t\tif (c === undefined || c === null || c === '') {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tc = this._makeCls(c);\r\n\r\n\t\t\tdelete this.m_iprops.classes[c];\r\n\t\t\tif (this.m_dom) {\r\n\t\t\t\tthis.m_dom.classList.remove(c);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// faster\r\n\t\tif (name.indexOf(' ') < 0) {\r\n\t\t\tremove(name);\r\n\t\t}\r\n\t\telse {\r\n\t\t\t// build class list\r\n\t\t\tlet classes = name.trim().split(' ');\r\n\t\t\tfor (let c of classes) {\r\n\t\t\t\tif (c !== undefined && c !== null && c !== '') {\r\n\t\t\t\t\tremove(c);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * \r\n\t * @param cls \r\n\t * @param set \r\n\t */\r\n\r\n\tpublic setClass(cls: string, set: boolean) {\r\n\t\tif (set) { this.addClass(cls); }\r\n\t\telse { this.removeClass(cls); }\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * Toggle a class from the element (if present remove, if absent add)\r\n\t * @param {string|string[]} name - classes in string form can be space separated\r\n\t * @example ```typescript\r\n\t * el.toggleClass( 'myclass' );\r\n\t * el.toggleClass( 'myclass1 myclass2');\r\n\t * el.toggleClass( ['myclass1','myclass2']);\r\n\t */\r\n\r\n\tpublic toggleClass(name: string): void {\r\n\r\n\t\tlet toggle = (c: string) => {\r\n\t\t\tif (c === undefined && c === null && c === '') {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tc = this._makeCls(c);\r\n\t\t\tif (this.m_iprops.classes[c]) {\r\n\t\t\t\tdelete this.m_iprops.classes[c]\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tthis.m_iprops.classes[c] = true;\r\n\t\t\t}\r\n\r\n\t\t\tif (this.m_dom) {\r\n\t\t\t\tthis.m_dom.classList.toggle(c);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// faster\r\n\t\tif (name.indexOf(' ') < 0) {\r\n\t\t\ttoggle(name);\r\n\t\t}\r\n\t\telse {\r\n\r\n\t\t\t// build class list\r\n\t\t\tlet classes = name.trim().split(' ');\r\n\t\t\tfor (let c of classes) {\r\n\t\t\t\ttoggle(c);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * check if the object has the class\r\n\t * @param cls \r\n\t */\r\n\r\n\tpublic hasClass(cls: string): boolean {\r\n\r\n\t\tlet c = this._makeCls(cls);\r\n\t\tif (this.m_dom) {\r\n\t\t\treturn this.dom.classList.contains(c);\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn !!this.m_iprops.classes[c];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * remove all classes from the object \r\n\t * this is usefull for component recycling & reusing\r\n\t */\r\n\r\n\tpublic clearClasses() {\r\n\t\tthis.m_iprops.classes = {};\r\n\t\tif (this.m_dom) {\r\n\t\t\treturn this.m_dom.classList.value = '';\r\n\t\t}\r\n\t}\r\n\r\n\tpublic _build(): HTMLElement {\r\n\t\tif (this.m_dom) {\r\n\t\t\treturn this.m_dom;\r\n\t\t}\r\n\r\n\t\tthis._createDOM();\r\n\t\treturn this.m_dom;\r\n\t}\r\n\r\n\tpublic render(props: P) {\r\n\t}\r\n\r\n\tpublic _createDOM(): HTMLElement {\r\n\r\n\t\tif (this.m_dom) {\r\n\t\t\treturn this.m_dom;\r\n\t\t}\r\n\r\n\t\t// setup props\r\n\t\tconst props = this.m_props;\r\n\r\n\t\tif( props.tabIndex!==undefined ) {\r\n\t\t\tthis._setTabIndex( props.tabIndex );\r\n\t\t}\r\n\t\tthis.render(props);\r\n\t\t\r\n\t\t// shortcuts ---------\r\n\t\tif (props.left !== undefined) { this.setStyleValue('left', props.left); }\r\n\t\tif (props.top !== undefined) { this.setStyleValue('top', props.top); }\r\n\t\tif (props.width !== undefined) { this.setStyleValue('width', props.width); }\r\n\t\tif (props.height !== undefined) { this.setStyleValue('height', props.height); }\r\n\r\n\t\tif (props.flex !== undefined) {\r\n\t\t\tthis.addClass('@flex');\r\n\t\t\tif (props.flex != 1) {\r\n\t\t\t\tthis.setStyleValue('flex', props.flex);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (props.enabled === false) {\r\n\t\t\tthis.disable();\r\n\t\t}\r\n\r\n\t\t// shortcut: tip\r\n\t\tif (props.tooltip !== undefined) {\r\n\t\t\tthis.setAttribute('tip', props.tooltip.replace(/\\n/gi, '<br/>'));\r\n\t\t}\r\n\r\n\r\n\t\t// prepare iprops\r\n\t\tif (props.dom_events) {\r\n\t\t\tfor (let ename in props.dom_events) {\r\n\t\t\t\tthis._setDomEvent(ename, (props.dom_events as any)[ename]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._genClassName();\r\n\t\tthis.m_props.cls = undefined;\t// now classes are tranfered to m_iprops\r\n\r\n\t\t// create self\r\n\t\tlet vdom = this.m_iprops;\r\n\r\n\t\tif (props.ns) {\r\n\t\t\tthis.m_dom = <HTMLElement>x4document.createElementNS(props.ns, props.tag ?? 'div');\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.m_dom = x4document.createElement( (props.tag ?? 'div') as any );\r\n\t\t}\r\n\r\n\t\t(this.m_dom as any)[_x4_el_sym] = this;\r\n\r\n\t\t//let me = Object.getPrototypeOf(this);\r\n\t\t//console.log( 'create', this.m_iprops.uid, me.constructor.name );\r\n\r\n\t\t// classes\r\n\t\tthis.m_dom.classList.add(...Object.keys(vdom.classes));\r\n\r\n\t\t// styles\r\n\t\tlet sty = props.style;\r\n\t\tif (sty) {\r\n\t\t\tfor (let s in sty) {\r\n\t\t\t\tthis._setDomStyleValue(s, sty[s]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// attributes\r\n\t\tlet att = props.attrs;\r\n\t\tif (att) {\r\n\t\t\tfor (let a in att) {\r\n\t\t\t\tconst attr = att[a];\r\n\t\t\t\tif( attr!==false && attr!==undefined ) {\r\n\t\t\t\t\tthis._setDomAttribute(a, ''+att[a] );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// special properties\r\n\t\tif (this.m_props.id) {\r\n\t\t\tthis._setDomAttribute('id', this.m_props.id);\r\n\t\t}\r\n\r\n\t\t// events\r\n\t\tlet evt = this.m_iprops.dom_events;\r\n\t\tif (evt) {\r\n\t\t\tfor (let e in evt) {\r\n\t\t\t\tlet handlers = evt[e];\r\n\t\t\t\tfor (let h of handlers) {\r\n\t\t\t\t\tthis._createEvent(e, h.listener, h.passive );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// create children\r\n\t\tlet content = props.content;\r\n\t\tif (content) {\r\n\r\n\t\t\tif (!isArray(content)) {\r\n\t\t\t\tcontent = [content];\r\n\t\t\t}\r\n\r\n\t\t\tcontent.forEach((el) => {\r\n\t\t\t\tif (!el) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (isString(el)) {\r\n\t\t\t\t\tthis.m_dom.insertAdjacentText('beforeend', el);\r\n\t\t\t\t}\r\n\t\t\t\telse if (isHtmlString(el)) {\r\n\t\t\t\t\tthis.m_dom.insertAdjacentHTML('beforeend', el as string);\r\n\t\t\t\t}\r\n\t\t\t\telse if (el instanceof Component) {\r\n\t\t\t\t\tthis.m_dom.append(el._build());\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tconsole.log( 'unknown element type: ', el );\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// wait for dom insertion inside document.body\r\n\t\tif (!Component.__createObserver) {\r\n\t\t\tComponent.__createObserver = new MutationObserver(Component._observeCreation);\r\n\t\t\tComponent.__createObserver.observe(x4document.body, { childList: true, subtree: true });\r\n\t\t}\r\n\r\n\t\treturn this.m_dom;\r\n\t}\r\n\r\n\tprotected _setTabIndex(tabIndex: number | boolean, defValue = 0) {\r\n\r\n\t\tif (tabIndex === true) {\r\n\t\t\ttabIndex = 0;\r\n\t\t}\r\n\t\telse if (tabIndex === undefined) {\r\n\t\t\ttabIndex = defValue;\r\n\t\t}\r\n\r\n\t\tif (tabIndex !== false && tabIndex !== undefined) {\r\n\t\t\tthis.setAttribute('tabindex', tabIndex);\r\n\t\t}\r\n\r\n\t\tthis.m_props.tabIndex = tabIndex;\r\n\t}\r\n\r\n\tprivate static _observeCreation(mutations: MutationRecord[]) {\r\n\r\n\t\t// notify descendants that we have been created (dom exists)\r\n\r\n\t\tconst notify = ( c: Component ) => {\r\n\r\n\t\t\tif( !c.m_iprops.created ) {\r\n\t\t\t\tif (c.dom && c.m_iprops.dom_events && c.m_iprops.dom_events.create) {\r\n\t\t\t\t\tc.dom.dispatchEvent(new Event('create'));\r\n\t\t\t\t}\r\n\t\t\r\n\t\t\t\tc.componentCreated();\r\n\t\t\t\tc.m_iprops.created = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfor (let mutation of mutations) {\r\n\r\n\t\t\tif (mutation.type == 'childList') {\r\n\r\n\t\t\t\tfor (let i = 0, n = mutation.addedNodes.length; i < n; i++) {\r\n\r\n\t\t\t\t\tlet add = mutation.addedNodes[i] as HTMLElement;\r\n\t\t\t\t\tlet el = (add as any)[_x4_el_sym] as Component;\r\n\r\n\t\t\t\t\tif (el) {\r\n\t\t\t\t\t\tel.enumChilds((c: Component) => {\r\n\t\t\t\t\t\t\tnotify( c );\r\n\t\t\t\t\t\t}, true);\r\n\r\n\t\t\t\t\t\tnotify( el );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t\r\n\t}\r\n\r\n\tpublic dispose() {\r\n\t\tif (this.m_dom) {\r\n\t\t\tthis._dispose(true,true);\r\n\t\t}\r\n\t}\r\n\r\n\tprotected _dispose(with_dom: boolean, timers: boolean ) {\r\n\r\n\t\tlet _dom = this.m_dom;\r\n\r\n\t\t// free attached resources\r\n\t\tdelete (_dom as any)[_x4_el_sym];\r\n\t\tdelete (_dom as any)[_x4_el_store];\r\n\r\n\t\t//\r\n\t\tif (with_dom) {\r\n\t\t\t_dom.remove();\r\n\t\t}\r\n\r\n\t\t// notify every child that they will be removed\r\n\t\tthis.enumChilds((c: Component) => {\r\n\t\t\tc._dispose(false,true);\r\n\t\t});\r\n\r\n\t\tthis.m_dom = null;\r\n\r\n\t\tif( timers ) {\r\n\t\t\tthis.disposeTimers();\r\n\t\t}\r\n\r\n\t\tthis.componentDisposed();\r\n\t\tthis.m_iprops.created = false;\r\n\t\t// todo: pb on update this.removeAllListeners( null );\r\n\t}\r\n\r\n\tcomponentDisposed() {\r\n\t}\r\n\r\n\tcomponentCreated() {\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t/**\r\n\t * \r\n\t */\r\n\r\n\tpublic update(delay = 0) {\r\n\r\n\t\tif (this.m_dom) {\r\n\r\n\t\t\tconst _update = () => {\r\n\t\t\t\tlet oldDOM = this.m_dom;\r\n\t\t\t\tthis._dispose(false,false);\r\n\r\n\t\t\t\tlet newDOM = this._build();\r\n\t\t\t\tconsole.assert( !!oldDOM.parentNode, 'update in componentCreated is not allowed, use updateContent' );\r\n\r\n\t\t\t\toldDOM.parentNode.replaceChild(newDOM, oldDOM);\r\n\t\t\t}\r\n\r\n\t\t\tif (delay) {\r\n\t\t\t\tthis.singleShot(_update, delay);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t_update();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * empty the node\r\n\t */\r\n\tpublic _empty( ) {\r\n\t\t//this.m_dom.innerHTML = '';\r\n\t\t\r\n\t\tconst el = this.m_dom;\r\n\t\tif( !el ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\twhile (el.firstChild) {\r\n\t\t\tel.removeChild(el.firstChild);\r\n\t\t}\r\n\t}\r\n\r\n\tpublic _updateContent() {\r\n\r\n\t\tif (!this.m_dom) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._empty( );\r\n\r\n\t\tlet content = this.m_props.content;\r\n\r\n\t\t// create children\r\n\t\tif (content) {\r\n\r\n\t\t\tif (!isArray(content)) {\r\n\t\t\t\tcontent = [content];\r\n\t\t\t}\r\n\r\n\t\t\tcontent.forEach((el) => {\r\n\t\t\t\tif (!el) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (isHtmlString(el)) {\r\n\t\t\t\t\tthis.m_dom.insertAdjacentHTML('beforeend', el as string);\r\n\t\t\t\t}\r\n\t\t\t\telse if (el instanceof Component) {\r\n\t\t\t\t\tthis.m_dom.append(el._build());\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tthis.m_dom.insertAdjacentText('beforeend', el + '');\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * @return the bounding rectangle\r\n\t * @example ```typescript\r\n\t * let rc = el.getBoundingRect( );\r\n\t * console.log( rc.left, rc.top, rc.right, rc.bottom );\r\n\t */\r\n\r\n\tpublic getBoundingRect(withMargins = false): Rect {\r\n\t\tconsole.assert(this.dom != null, 'cannot get bounding rect of an non DOM element');\r\n\t\tlet r = this.dom.getBoundingClientRect();\r\n\r\n\t\tlet rc = new Rect(r.left, r.top, r.width, r.height);\r\n\r\n\t\tif (withMargins) {\r\n\r\n\t\t\tlet st = this.getComputedStyle();\r\n\r\n\t\t\tlet tm = st.parse('marginTop'),\r\n\t\t\t\tbm = st.parse('marginBottom'),\r\n\t\t\t\tlm = st.parse('marginLeft'),\r\n\t\t\t\trm = st.parse('marginRight');\r\n\r\n\t\t\trc.left -= lm;\r\n\t\t\trc.width += lm + rm;\r\n\r\n\t\t\trc.top -= tm;\r\n\t\t\trc.height += tm + bm;\r\n\t\t}\r\n\r\n\t\treturn rc;\r\n\t}\r\n\r\n\t/**\r\n\t * append a new dom event handler\r\n\t * @param name - you can specify multiple names separated by a space\r\n\t * @param handler \r\n\t * @example\r\n\t * \r\n\t * this.setDomEvent( 'drag drop', this._handleDrag, this );\r\n\t * this.setDomEvent( 'dblclick', this._handleDblClick, this );\r\n\t */\r\n\r\n\tpublic setDomEvent<K extends keyof X4ElementEventMap>(type: K, listener: (this: HTMLDivElement, ev: X4ElementEventMap[K]) => void, passive?: boolean ) {\r\n\t\tlet _listener = listener as EventListener;\r\n\t\tthis._setDomEvent(type as string, _listener, passive);\r\n\t}\r\n\r\n\tprivate _setDomEvent(type: string, listener: EventListener, passive?: boolean) {\r\n\r\n\t\t// add event to the vdom\r\n\t\tif (!this.m_iprops.dom_events) {\r\n\t\t\tthis.m_iprops.dom_events = {};\r\n\t\t}\r\n\r\n\t\tlet listeners = this.m_iprops.dom_events[type];\r\n\t\tif (!listeners) {\r\n\t\t\tlisteners = this.m_iprops.dom_events[type] = [{listener,passive}];\r\n\t\t}\r\n\t\telse {\r\n\t\t\tlisteners.push({listener,passive});\r\n\t\t}\r\n\r\n\t\tif (this.m_dom) {\r\n\t\t\t//this.m_dom.addEventListener(type, listener);\r\n\t\t\tthis._createEvent(type, listener,passive);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * \r\n\t */\r\n\r\n\tpublic clearDomEvent<K extends keyof X4ElementEventMap>(type: K) {\r\n\t\tif (!this.m_iprops.dom_events) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tdelete this.m_iprops.dom_events[type];\r\n\r\n\t\tlet _dom = this.m_dom;\r\n\t\tif (_dom) {\r\n\t\t\tlet store = (_dom as any)[_x4_el_store];\r\n\t\t\tif (store) {\r\n\t\t\t\tdelete store[type];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * \r\n\t * @param name \r\n\t * @param handler \r\n\t */\r\n\r\n\tprivate _createEvent(name: string, handler: Function, passive?: boolean) {\r\n\r\n\t\tlet _dom = this.m_dom;\r\n\t\tlet store = (_dom as any)[_x4_el_store];\r\n\r\n\t\tif (!store) {\r\n\t\t\tstore = (_dom as any)[_x4_el_store] = {};\r\n\t\t}\r\n\r\n\t\tif (!store[name]) {\r\n\t\t\t// no handler for this event...\r\n\t\t\tstore[name] = [handler];\r\n\t\t}\r\n\t\telse {\r\n\t\t\t// append the handler\r\n\t\t\tstore[name].push(handler);\r\n\t\t}\r\n\r\n\t\tif ((unbubbleEvents as any)[name] === 1) {\r\n\t\t\t(_dom as any)['on' + name] = Component._dispatchUnbubbleEvent;\r\n\t\t}\r\n\t\telse if (!Component.__privateEvents[name]) {\r\n\t\t\tComponent.__privateEvents[name] = true; // todo count it\r\n\r\n\t\t\tif( passive===undefined ) {\r\n\t\t\t\tif ( (passiveEvents as any)[name] ) {\r\n\t\t\t\t\tx4document.addEventListener(name as any, Component._dispatchEvent, { passive: false, capture: true });\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tx4document.addEventListener(name as any, Component._dispatchEvent, true);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tx4document.addEventListener(name as any, Component._dispatchEvent, { passive, capture: passive ? true : false } );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (name === 'sizechange') {\r\n\t\t\tif (!Component.__sizeObserver) {\r\n\t\t\t\tComponent.__sizeObserver = new ResizeObserver(Component._observeSize);\r\n\t\t\t}\r\n\r\n\t\t\tComponent.__sizeObserver.observe(this.m_dom);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * dispatch a dom event to the appropriated component\r\n\t * called by the system\r\n\t */\r\n\r\n\tprivate static _dispatchEvent(ev: any) {\r\n\r\n\t\tlet target = ev.target,\r\n\t\t\tnoup = (unbubbleEvents as any)[ev.type] === 2;\r\n\r\n\t\twhile (target) {\r\n\t\t\tif (target[_x4_el_store]) {\r\n\t\t\t\tlet store = target[_x4_el_store][ev.type];\r\n\t\t\t\tif (store) {\r\n\t\t\t\t\tlet el = target[_x4_el_sym];\r\n\t\t\t\t\tlet root = el?.root ?? null;\r\n\r\n\t\t\t\t\tif (store instanceof Array) {\r\n\t\t\t\t\t\tstore.some((fn) => {\r\n\t\t\t\t\t\t\tfn(ev, root);\r\n\t\t\t\t\t\t\tif (!el.dom) {\r\n\t\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tstore(ev, root);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (ev.cancelBubble || ev.defaultPrevented || noup) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\ttarget = target.parentNode;\r\n\r\n\t\t\t// no need to go above\r\n\t\t\tif (target == document) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * dispatch a dom event to the appropriated component\r\n\t * called by the system\r\n\t */\r\n\r\n\tprivate static _dispatchUnbubbleEvent(ev: any) {\r\n\r\n\t\tlet target = ev.currentTarget || ev.target,\r\n\t\t\teventType = ev.type;\r\n\r\n\t\tlet eventStore = target[_x4_el_store],\r\n\t\t\tstore = eventStore && eventStore[eventType];\r\n\r\n\t\tif (store) {\r\n\r\n\t\t\tlet el = target[_x4_el_sym];\r\n\t\t\tlet root = el?.root ?? null;\r\n\r\n\t\t\tif (store instanceof Array) {\r\n\t\t\t\tstore.forEach((fn) => {\r\n\t\t\t\t\tfn(ev, root);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tstore(ev, root);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * called when a size change on an observed component\r\n\t */\r\n\r\n\tprivate static _observeSize(entries: ResizeObserverEntry[]) {\r\n\r\n\t\tentries.forEach((entry) => {\r\n\t\t\tlet dom = entry.target as HTMLElement;\r\n\t\t\tif (dom.offsetParent !== null) {\r\n\t\t\t\tdom.dispatchEvent(new Event('sizechange'));\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * enum all children recursively\r\n\t * @param recursive - if true do a full sub-child search \r\n\t * @param cb - callback\r\n\t * return true to stop enumeration\r\n\t */\r\n\r\n\tenumChilds(cb: (child: Component) => boolean | void, recursive = false): boolean {\r\n\r\n\t\t// use dom if available\r\n\t\tif (this.m_dom) {\r\n\r\n\t\t\tlet el = this.m_dom.firstChild;\r\n\r\n\t\t\twhile (el) {\r\n\t\t\t\t// get component (if any)\r\n\t\t\t\tlet cel = (el as any)[_x4_el_sym];\r\n\t\t\t\tif (cel) {\r\n\t\t\t\t\tcb(cel);\r\n\r\n\t\t\t\t\tif (recursive && cel.enumChilds(cb, true) === true) {\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tel = el.nextSibling;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse {\r\n\t\t\tlet content = this.m_props.content;\r\n\t\t\tif (!content) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (!isArray(content)) {\r\n\t\t\t\tcontent = [content];\r\n\t\t\t}\r\n\r\n\t\t\tcontent.some((el) => {\r\n\t\t\t\tif (!el || isString(el) || isHtmlString(el)) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (cb(el)) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (recursive && el.enumChilds(cb, true) === true) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * apprend a child to the DOM\r\n\t * @param props child to append (or string)\r\n\t */\r\n\r\n\tprivate _appendChild(el: ComponentOrString) {\r\n\r\n\t\tif (isString(el)) {\r\n\t\t\tthis.m_dom.insertAdjacentText('beforeend', el);\r\n\t\t}\r\n\t\telse if (isHtmlString(el)) {\r\n\t\t\tthis.m_dom.insertAdjacentHTML('beforeend', el as string);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tlet component: Component = el;\r\n\r\n\t\t\ttry {\r\n\t\t\t\tcomponent._build();\r\n\t\t\t\tthis.m_dom.appendChild(component.m_dom);\r\n\t\t\t}\r\n\t\t\tcatch (e) {\r\n\t\t\t\tconsole.error(e);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * generate classes from the component inheritance \r\n\t * @example\r\n\t * Button extends Component will give\r\n\t * x-comp x-button\r\n\t */\r\n\r\n\tprivate _genClassName() {\r\n\r\n\t\tthis.addClass('@comp');\r\n\r\n\t\tlet me = Object.getPrototypeOf(this);\r\n\t\twhile (me && me.constructor !== Component) {\r\n\t\t\tlet clsname = me.constructor.name;\r\n\t\t\tthis.addClass('@' + pascalCase(clsname));\r\n\r\n\t\t\tme = Object.getPrototypeOf(me);\r\n\t\t}\r\n\r\n\t\t//done in ctor now\r\n\t\t//this.addClass(this.m_props.cls);\r\n\t}\r\n\r\n\t/**\r\n\t * prepend the system class name prefix on a name if needed (if class starts with @)\r\n\t */\r\n\r\n\tprivate _makeCls(cls: string): string {\r\n\t\tif (cls[0] == '@') {\r\n\t\t\treturn cls = _x4_ns_prefix + cls.substring(1);\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn cls;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * \r\n\t */\r\n\r\n\tprivate static dispatchCaptures(event: Event) {\r\n\t\tComponent.__capture.handler(event as UIEvent);\r\n\t}\r\n\r\n\t/**\r\n\t * capture mouse events\r\n\t * @param capture name of the current capture \r\n\t * @param callback funciton to call on captured mouse events\r\n\t * \r\n\t * @example\r\n\t * Component.setCapture( this, ( ev: MouseEvent, initiator: Component ) => {\r\n\t *\t\tif( ev.type=='mousemove' ) {\r\n\t *\t\t\tthis.setStyle( {\r\n\t *\t\t\t\tleft: ev.clientX,\r\n\t *\t\t\t\ttop: ev.clientY\r\n\t *\t\t\t} );\r\n\t *\t\t}\r\n\t *\t\telse if( ev.type=='mouseup' ) {\r\n\t *\t\t\tComponent.releaseCapture( );\r\n\t *\t\t}\r\n\t *\t} );\r\n\t */\r\n\r\n\tprotected static setCapture(initiator: Component, listener: EventHandler<UIEvent>) {\r\n\r\n\t\tconsole.assert(!Component.__capture);\r\n\t\tif (Component.__capture) {\r\n\t\t\tdebugger;\r\n\t\t}\r\n\r\n\t\t//\ttodo: review that\r\n\r\n\t\tlet iframes = x4document.querySelectorAll<HTMLIFrameElement>(\"iframe\");\r\n\t\tiframes.forEach( f => {\r\n\t\t\tflyWrap(f).setStyleValue( 'pointer-events', 'none' );\r\n\t\t});\r\n\r\n\t\tlet overs = x4document.querySelectorAll(\":hover\");\r\n\r\n\t\tlet cursor = null;\r\n\t\tif (overs.length) {\r\n\t\t\tlet elementOver = <HTMLElement>overs[overs.length - 1];\r\n\t\t\tlet style = window.getComputedStyle(elementOver);\r\n\t\t\tcursor = style.cursor;\r\n\t\t}\r\n\r\n\t\tComponent.__capture_mask = x4document.createElement('div');\r\n\t\tlet mask = flyWrap(Component.__capture_mask);\r\n\t\tmask.addClass('@capture-mask');\r\n\r\n\t\tif (cursor) {\r\n\t\t\tmask.setStyleValue('cursor', cursor);\r\n\t\t}\r\n\r\n\t\tx4document.body.appendChild(mask.dom);\r\n\r\n\t\tx4document.addEventListener('mousedown', Component.dispatchCaptures);\r\n\t\tx4document.addEventListener('mousemove', Component.dispatchCaptures);\r\n\t\tx4document.addEventListener('mouseup', Component.dispatchCaptures);\r\n\r\n\t\tx4document.addEventListener('touchstart', Component.dispatchCaptures);\r\n\t\tx4document.addEventListener('touchmove', Component.dispatchCaptures);\r\n\t\tx4document.addEventListener('touchend', Component.dispatchCaptures);\r\n\r\n\t\tComponent.__capture = {\r\n\t\t\tinitiator,\r\n\t\t\thandler: listener,\r\n\t\t\tiframes\r\n\t\t};\r\n\t}\r\n\r\n\tprotected static releaseCapture() {\r\n\r\n\t\tconsole.assert(!!Component.__capture);\r\n\r\n\t\tx4document.removeEventListener('touchstart', Component.dispatchCaptures);\r\n\t\tx4document.removeEventListener('touchmove', Component.dispatchCaptures);\r\n\t\tx4document.removeEventListener('touchend', Component.dispatchCaptures);\r\n\r\n\t\tx4document.removeEventListener('mousedown', Component.dispatchCaptures);\r\n\t\tx4document.removeEventListener('mousemove', Component.dispatchCaptures);\r\n\t\tx4document.removeEventListener('mouseup', Component.dispatchCaptures);\r\n\t\t\r\n\t\tComponent.__capture.iframes.forEach( f => {\r\n\t\t\tflyWrap(f).setStyleValue( 'pointer-events', null );\r\n\t\t})\r\n\r\n\t\tComponent.__capture = null;\r\n\t\tif (Component.__capture_mask) {\r\n\t\t\tx4document.body.removeChild(Component.__capture_mask);\r\n\t\t\tComponent.__capture_mask = null;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * ensure the component is visible\r\n\t * @param: alignToTop \r\n\t */\r\n\r\n\tpublic scrollIntoView(arg?: boolean | ScrollIntoViewOptions) {\r\n\t\tif (this.m_dom) {\r\n\r\n\t\t\tconst rel = new Rect( this.dom.getBoundingClientRect( ) );\r\n\t\t\t\r\n\t\t\tlet top = undefined;\r\n\t\t\tlet bot = undefined;\r\n\t\t\tlet left = undefined;\r\n\t\t\tlet right = undefined;\r\n\r\n\t\t\tlet pn = this.dom.parentElement;\r\n\t\t\tconst bdy = x4document.body;\r\n\r\n\t\t\twhile( pn && pn!=bdy ) {\r\n\r\n\t\t\t\tconst pr = pn.getBoundingClientRect( );\r\n\r\n\t\t\t\tif( top===undefined || top<pr.top ) {\r\n\t\t\t\t\ttop = pr.top;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif( bot===undefined || bot>pr.bottom ) {\r\n\t\t\t\t\tbot = pr.bottom;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif( left===undefined || left<pr.left ) {\r\n\t\t\t\t\tleft = pr.left;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif( right===undefined || right>pr.right ) {\r\n\t\t\t\t\tright = pr.right;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tpn = pn.parentElement;\r\n\t\t\t}\r\n\r\n\t\t\tif( top===undefined || rel.top<top || rel.bottom>bot || rel.left<left || rel.right>right ) {\r\n\t\t\t\t//this.m_dom.scrollIntoView( true );\r\n\t\t\t\tthis.m_dom.scrollIntoView({ behavior: 'auto', block: 'nearest', inline: 'start' });\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t//this.m_dom.scrollIntoView(arg);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * search for a given css selector \r\n\t * @param selector \r\n\t * @returns child or null\r\n\t */\r\n\r\n\tpublic queryItem<T extends Component>(selector: string): T {\r\n\t\tlet result = <HTMLElement>this.dom.querySelector(selector);\r\n\t\treturn result ? Component.getElement<T>(result) : null;\r\n\t}\r\n\r\n\tpublic queryAll(selector: string, cb?: (el: Component) => void): HTMLElement[] {\r\n\t\tlet elements:HTMLElement[] = Array.from( this.m_dom.querySelectorAll<HTMLElement>(selector) );\r\n\t\t\r\n\t\tif( cb ) {\r\n\t\t\telements.forEach((el) => {\r\n\t\t\t\tcb(flyWrap(el as HTMLElement));\r\n\t\t\t});\r\n\t\t}\r\n\t\t\r\n\t\treturn elements;\r\n\t}\r\n\r\n\t/**\r\n\t * find a child with the given ID\r\n\t * @param id id (without '#')\r\n\t * @returns child or null\r\n\t * \r\n\t * @example\r\n\t * let btn = this.childWithId<Button>( 'myButtonId' );\r\n\t */\r\n\tpublic itemWithId<T extends Component>(id: string): T {\r\n\t\tlet result = <HTMLElement>this.dom.querySelector('#' + id);\r\n\t\treturn result ? Component.getElement<T>(result) : null;\r\n\t}\r\n\r\n\t/**\r\n\t * find a child with given ref\r\n\t * @param ref \r\n\t * @return found child or null\r\n\t */\r\n\r\n\tpublic itemWithRef<T = Component>(ref: string): T {\r\n\r\n\t\tlet result = null;\r\n\t\tthis.enumChilds((c: Component) => {\r\n\t\t\tif (c.m_props.ref === ref) {\r\n\t\t\t\tresult = c;\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}, true);\r\n\r\n\t\treturn result as T;\r\n\t}\r\n\r\n\t/**\r\n\t * \r\n\t */\r\n\r\n\tget ref() {\r\n\t\treturn this.m_props.ref;\r\n\t}\r\n\r\n\t/**\r\n\t * \r\n\t */\r\n\r\n\tstatic getCss(): Stylesheet {\r\n\t\tif (!Component.__css) {\r\n\t\t\tComponent.__css = new Stylesheet();\r\n\t\t}\r\n\r\n\t\treturn Component.__css;\r\n\t}\r\n\r\n\t/**\r\n\t * return the parent element\r\n\t * care, object must have been created (dom!=null)\r\n\t */\r\n\r\n\tpublic getParent(): Component {\r\n\t\tconsole.assert(!!this.m_dom);\r\n\r\n\t\tlet elParent = this.dom.parentNode;\r\n\t\treturn Component.getElement(<HTMLElement>elParent);\r\n\t}\r\n\r\n\t/**\r\n\t * get a component from a DOM element\r\n\t * move up to the hierarchy to find the request class type.\r\n\t * @param dom \r\n\t * @param classname \r\n\t * @returns \r\n\t * \r\n\t * @example\r\n\t * \r\n\t * with a DOM like that:\r\n\t * \t Button\r\n\t * \t \tLabel\r\n\t * \t\tIcon <- the DOM you have (dom-icon)\r\n\t * \r\n\t * let btn = Component.getElement( dom-icon, Button );\r\n\t */\r\n\r\n\tstatic getElement<T extends Component>(dom: HTMLElement | Element, classname?: Constructor<T> | string ): T {\r\n\r\n\t\tif (classname) {\r\n\r\n\t\t\tconst srhCls = isString(classname);\r\n\r\n\t\t\twhile (dom) {\r\n\t\t\t\tlet el: Component = (dom as any)[_x4_el_sym];\r\n\r\n\t\t\t\tif( srhCls ) {\r\n\t\t\t\t\tif( el && el.hasClass(classname) ) {\r\n\t\t\t\t\t\treturn el as T;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse if (el instanceof classname) {\r\n\t\t\t\t\treturn el;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tdom = dom.parentElement;\r\n\t\t\t}\r\n\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn dom ? (dom as any)[_x4_el_sym] : null;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * compute the scrollbar size ( width = height)\r\n\t */\r\n\r\n\tstatic getScrollbarSize() {\r\n\r\n\t\tif (Component.__sb_width === undefined) {\r\n\t\t\tlet outerDiv = x4document.createElement('div');\r\n\t\t\touterDiv.style.cssText = 'overflow:auto;position:absolute;top:0;width:100px;height:100px';\r\n\r\n\t\t\tlet innerDiv = x4document.createElement('div');\r\n\t\t\tinnerDiv.style.width = '200px';\r\n\t\t\tinnerDiv.style.height = '200px';\r\n\r\n\t\t\touterDiv.appendChild(innerDiv);\r\n\t\t\tx4document.body.appendChild(outerDiv);\r\n\r\n\t\t\tComponent.__sb_width = outerDiv.offsetWidth - outerDiv.clientWidth;\r\n\t\t\tx4document.body.removeChild(outerDiv);\r\n\t\t}\r\n\r\n\t\treturn Component.__sb_width;\r\n\t}\r\n\r\n\t/**\r\n\t * check if the Component is visible to the user\r\n\t */\r\n\r\n\tisUserVisible(): boolean {\r\n\t\tif (!this.m_dom) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn (this.m_dom.offsetParent !== null);\r\n\t}\r\n}\r\n\r\n/** @ignore */\r\nlet fly_element: Component = null;\r\n\r\n/**\r\n * warp <b>temporarily</b> a DOM element to be able to acces to exact API\r\n * @param dom dom element to wrap\r\n * @review qui libere le fly_element ? -> timeout\r\n */\r\n\r\nexport function flyWrap<T extends Component>(dom: HTMLElement | EventTarget): T {\r\n\r\n\tif ((dom as any)[_x4_el_sym]) {\r\n\t\treturn (dom as any)[_x4_el_sym];\r\n\t}\r\n\r\n\tlet f = fly_element;\r\n\tif (!f) { f = fly_element = new Component({}); }\r\n\t(<any>f).m_dom = dom;\r\n\r\n\treturn f as T;\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n/**\r\n * simple flex spacer\r\n */\r\n\r\nexport class Flex extends Component {\r\n\r\n\tconstructor(props: CProps = {}) {\r\n\t\tif (!props.flex) {\r\n\t\t\tprops.flex = 1;\r\n\t\t}\r\n\r\n\t\tsuper(props);\r\n\t}\r\n}\r\n\r\n/**\r\n * simple space between 2 elements\r\n */\r\n\r\nexport class Space extends Component {\r\n\r\n\tm_size: number | string;\r\n\r\n\tconstructor(size: number | string) {\r\n\t\tsuper({});\r\n\r\n\t\tthis.m_size = size;\r\n\t}\r\n\r\n\tcomponentCreated() {\r\n\r\n\t\t// try to find if we are in a hz / vt / abs container\r\n\t\tlet dom = this.dom;\r\n\t\tlet style = null;\r\n\r\n\t\twhile (dom) {\r\n\t\t\tlet el: Component = (dom as any)[_x4_el_sym];\r\n\t\t\tif (el.hasClass('@hlayout')) {\r\n\t\t\t\tstyle = { width: this.m_size };\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\telse if (el.hasClass('@vlayout')) {\r\n\t\t\t\tstyle = { height: this.m_size };\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tdom = dom.parentElement;\r\n\t\t}\r\n\r\n\t\tif (!style) {\r\n\t\t\tstyle = { width: this.m_size, height: this.m_size };\r\n\t\t}\r\n\r\n\t\tthis.setStyle(style);\r\n\t}\r\n}\r\n\r\n/**\r\n * sizable separator\r\n */\r\n\r\ntype SizeMode = null | 'minimize' | 'maximize' | 'restore';\r\n\r\nexport interface EvSize extends BasicEvent {\r\n\treadonly size: Size;\r\n\treadonly mode: SizeMode;\r\n}\r\n\r\nexport function EvSize(size: Size, mode: SizeMode = null, context: any = null ): EvSize {\r\n\treturn BasicEvent<EvSize>({ size, mode, context });\r\n}\r\n\r\ninterface SeparatorEventMap extends CEventMap {\r\n\tresize?: EvSize;\r\n}\r\n\r\ninterface SeparatorProps extends CProps<SeparatorEventMap> {\r\n\treadonly orientation: 'vertical' | 'horizontal';\t\t// vertical means vertical sizer so it resize horizontally\r\n\treadonly sizing: 'before' | 'after';\r\n\treadonly collapsible?: boolean;\r\n}\r\n\r\nexport class Separator extends Component<SeparatorProps, SeparatorEventMap> {\r\n\r\n\tm_irect: Rect;\r\n\tm_delta: number;\r\n\tm_target: Component;\r\n\r\n\tconstructor(props: SeparatorProps) {\r\n\t\tsuper(props);\r\n\r\n\t\tthis.setDomEvent('mousedown', (e) => this._mousedown(e));\r\n\t\tthis.setDomEvent('touchstart', (e) => this._mousedown(e));\r\n\t\tthis.setDomEvent('dblclick', (e) => this._collapse(e) );\r\n\t}\r\n\r\n\trender() {\r\n\t\tthis.addClass(this.m_props.orientation);\r\n\t}\r\n\r\n\tprivate _collapse( ev: UIEvent ) {\r\n\t\tif( this.m_props.collapsible ) {\r\n\t\t\tthis._findTarget();\r\n\t\t\tif( this.m_target ) {\r\n\t\t\t\tthis.m_target.toggleClass( '@collapsed' );\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprivate _mousedown(ev: UIEvent) {\r\n\r\n\t\tif (ev.type == 'touchstart') {\r\n\t\t\tlet te = ev as TouchEvent;\r\n\t\t\tif (te.touches.length == 1) {\r\n\t\t\t\tthis._startMoving(te.touches[0].pageX, te.touches[0].pageY, ev);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse {\r\n\t\t\tlet me = ev as MouseEvent;\r\n\t\t\tthis._startMoving(me.pageX, me.pageY, ev);\r\n\t\t}\r\n\t}\r\n\r\n\t_startMoving(x: number, y: number, ev: UIEvent) {\r\n\t\t//if( this.m_props.callback ) {\r\n\t\t//\tthis.m_props.callback( ev, this );\r\n\t\t//}\r\n\t\t//else \r\n\t\t{\r\n\t\t\tthis._findTarget();\r\n\r\n\t\t\tif (this.m_target) {\r\n\r\n\t\t\t\tif (this.m_props.orientation == 'horizontal') {\r\n\t\t\t\t\tif (this.m_props.sizing == 'before') {\r\n\t\t\t\t\t\tthis.m_delta = x - this.m_irect.right;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tthis.m_delta = x - this.m_irect.left;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif (this.m_props.sizing == 'before') {\r\n\t\t\t\t\t\tthis.m_delta = y - this.m_irect.bottom;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tthis.m_delta = y - this.m_irect.top;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tev.preventDefault();\r\n\t\t\t\tev.stopPropagation();\r\n\r\n\t\t\t\tthis.m_target.addClass('sizing');\r\n\r\n\t\t\t\tComponent.setCapture(this, (e) => this._pointerMoved(e));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprivate _pointerMoved(ev: UIEvent) {\r\n\r\n\t\tlet __move = (ex: number, ey: number) => {\r\n\r\n\t\t\tif (this.m_props.orientation == 'horizontal') {\r\n\r\n\t\t\t\tlet width;\r\n\t\t\t\tif (this.m_props.sizing == 'after') {\r\n\t\t\t\t\twidth = this.m_irect.right - (ex - this.m_delta);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\twidth = (ex - this.m_delta) - this.m_irect.left\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (width > 0) {\r\n\t\t\t\t\tlet size = new Size(width, 0);\r\n\t\t\t\t\tthis.emit('resize', EvSize(size));\r\n\r\n\t\t\t\t\tthis.m_target.setStyleValue('width', size.width);\r\n\t\t\t\t\tthis.m_target.setStyleValue('flex', null);\t// for flex>1\r\n\t\t\t\t\tthis.m_target.removeClass('@flex');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\r\n\t\t\t\tlet height;\r\n\t\t\t\tif (this.m_props.sizing == 'after') {\r\n\t\t\t\t\theight = this.m_irect.bottom - (ey - this.m_delta);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\theight = (ey - this.m_delta) - this.m_irect.top;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (height > 0) {\r\n\t\t\t\t\tlet size = new Size(0, height);\r\n\t\t\t\t\tthis.emit('resize', EvSize(size));\r\n\r\n\t\t\t\t\tthis.m_target.setStyleValue('height', size.height);\r\n\t\t\t\t\tthis.m_target.setStyleValue('flex', null);\t// for flex>1\r\n\t\t\t\t\tthis.m_target.removeClass('@flex');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (ev.type == 'mousemove') {\r\n\r\n\t\t\tlet mev = ev as MouseEvent;\r\n\t\t\t__move(mev.pageX, mev.pageY);\r\n\r\n\t\t\tev.preventDefault();\r\n\t\t\tev.stopPropagation();\r\n\t\t}\r\n\t\telse if (ev.type == 'touchmove') {\r\n\r\n\t\t\tlet tev = ev as TouchEvent;\r\n\t\t\t__move(tev.touches[0].pageX, tev.touches[0].pageY);\r\n\r\n\t\t\tev.preventDefault();\r\n\t\t\tev.stopPropagation();\r\n\t\t}\r\n\t\telse if (ev.type == 'mouseup' || ev.type == 'touchend') {\r\n\t\t\tthis.m_target.removeClass('sizing');\r\n\r\n\t\t\tComponent.releaseCapture();\r\n\t\t\tev.preventDefault();\r\n\t\t\tev.stopPropagation();\r\n\t\t}\r\n\t}\r\n\r\n\tprivate _findTarget() {\r\n\r\n\t\tif (!this.m_target) {\r\n\r\n\t\t\tif (this.m_props.sizing == 'before') {\r\n\t\t\t\tlet prevDom = this.dom.previousElementSibling;\r\n\t\t\t\tlet prevEl = prevDom ? Component.getElement(prevDom as HTMLElement) : null;\r\n\t\t\t\tthis.m_target = prevEl;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tlet nextDom = this.dom.nextElementSibling;\r\n\t\t\t\tlet nextEl = nextDom ? Component.getElement(nextDom as HTMLElement) : null;\r\n\t\t\t\tthis.m_target = nextEl;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (this.m_target) {\r\n\t\t\tthis.m_irect = this.m_target.getBoundingRect();\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.m_irect = null;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n\r\n\r\n\r\n// :: SIZERBAR ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\r\n\r\n/**\r\n * properties\r\n */\r\n\r\ntype SizerOverlaySens = 'left' | 'top' | 'right' | 'bottom' | 'topleft' | 'topright' | 'bottomleft' | 'bottomright';\r\n\r\nexport interface EvOverlayResize extends BasicEvent {\r\n\tui_event: UIEvent;\r\n\tsens: SizerOverlaySens;\r\n}\r\n\r\nexport function EvOverlayResize(ui_event: UIEvent, sens: SizerOverlaySens, context: any = null) {\r\n\treturn BasicEvent<EvOverlayResize>({ ui_event, sens, context });\r\n}\r\n\r\ninterface SizerOverlayEventMap extends CEventMap {\r\n\tresize: EvSize;\r\n\trawresize: EvOverlayResize;\r\n}\r\n\r\n\r\nexport interface SizerOverlayProps extends CProps<SizerOverlayEventMap> {\r\n\tsens: SizerOverlaySens;\r\n\ttarget: Component;\r\n\r\n\tresize?: EventCallback<EvSize>;\t// shortcut to events: { size: ... }\r\n}\r\n\r\nexport class SizerOverlay extends Component<SizerOverlayProps, SizerOverlayEventMap> {\r\n\r\n\tprivate m_delta: number;\r\n\tprivate m_irect: Rect;\r\n\r\n\tconstructor(props: SizerOverlayProps) {\r\n\t\tsuper(props);\r\n\r\n\t\tthis.addClass(props.sens);\r\n\t\tthis.setDomEvent('mousedown', (e) => this._mousedown(e));\r\n\t\tthis.setDomEvent('touchstart', (e) => this._mousedown(e));\r\n\t\tthis.setDomEvent('dblclick', (e) => this.resetflex(e));\t// todo: add option for that\r\n\r\n\t\tprops.target.appendChild(this);\r\n\r\n\t\tif( props.resize ) {\r\n\t\t\tthis.on( 'resize', this.m_props.resize );\r\n\t\t}\r\n\t}\r\n\r\n\tresetflex(event: UIEvent) {\r\n\t\tthis.m_props.target.addClass('@flex');\r\n\t\tthis.emit('resize', EvSize( { width: -1, height: 0}));\t// todo: see that\r\n\t\tevent.preventDefault();\r\n\t\tevent.stopPropagation();\r\n\t}\r\n\r\n\t// @review move that in component\r\n\r\n\t_mousedown(ev: UIEvent) {\r\n\r\n\t\tev.preventDefault();\r\n\t\tev.stopPropagation();\r\n\t\t\r\n\t\tlet eev = EvOverlayResize(ev, this.m_props.sens);\r\n\t\tthis.emit('rawresize', eev);\r\n\t\tif (eev.defaultPrevented) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet pos = getMousePos(ev, true);\r\n\t\tthis.m_irect = this.m_props.target.getBoundingRect();\r\n\r\n\t\tif (this.m_props.sens == 'right') {\r\n\t\t\tthis.m_delta = pos.x - this.m_irect.right;\r\n\t\t}\r\n\t\telse if (this.m_props.sens == 'left') {\r\n\t\t\tthis.m_delta = pos.x - this.m_irect.left;\r\n\t\t}\r\n\t\telse if (this.m_props.sens == 'bottom') {\r\n\t\t\tthis.m_delta = pos.y - this.m_irect.bottom;\r\n\t\t}\r\n\t\telse if (this.m_props.sens == 'top') {\r\n\t\t\tthis.m_delta = pos.y - this.m_irect.top;\r\n\t\t}\r\n\r\n\t\tthis.m_props.target.addClass('sizing');\r\n\t\tComponent.setCapture(this, (e) => this._handle_mouse(e));\r\n\t}\r\n\r\n\tprivate _is_horz() {\r\n\t\treturn this.m_props.sens == 'left' || this.m_props.sens == 'right';\r\n\t}\r\n\r\n\tpublic get sens() {\r\n\t\treturn this.m_props.sens;\r\n\t}\r\n\r\n\tprivate _handle_mouse(ev: UIEvent) {\r\n\t\tlet __move = (ex:number, ey:number) => {\r\n\t\t\tif (this._is_horz()) {\r\n\r\n\t\t\t\tlet width;\r\n\t\t\t\tif (this.m_props.sens == 'left') {\r\n\t\t\t\t\twidth = this.m_irect.right - (ex - this.m_delta);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\twidth = (ex - this.m_delta) - this.m_irect.left\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (width > 0) {\r\n\t\t\t\t\tlet size = {\r\n\t\t\t\t\t\twidth,\r\n\t\t\t\t\t\theight: undefined\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tthis.emit('resize', EvSize(size));\r\n\r\n\t\t\t\t\tthis.m_props.target.setStyleValue('width', size.width);\r\n\t\t\t\t\tthis.m_props.target.setStyleValue('flex', null);\t// for flex>1\r\n\t\t\t\t\tthis.m_props.target.removeClass('@flex');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\r\n\t\t\t\tlet height;\r\n\t\t\t\tif (this.m_props.sens == 'top') {\r\n\t\t\t\t\theight = this.m_irect.bottom - (ey - this.m_delta);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\theight = (ey - this.m_delta) - this.m_irect.top;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (height > 0) {\r\n\t\t\t\t\tlet size = new Size(0, height);\r\n\t\t\t\t\tthis.emit('resize', EvSize(size));\r\n\r\n\t\t\t\t\tthis.m_props.target.setStyleValue('height', size.height);\r\n\t\t\t\t\tthis.m_props.target.setStyleValue('flex', null);\t// for flex>1\r\n\t\t\t\t\tthis.m_props.target.removeClass('@flex');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (ev.type == 'mousemove') {\r\n\r\n\t\t\tlet mev = ev as MouseEvent;\r\n\t\t\t__move(mev.pageX, mev.pageY);\r\n\r\n\t\t\tev.preventDefault();\r\n\t\t\tev.stopPropagation();\r\n\t\t}\r\n\t\telse if (ev.type == 'touchmove') {\r\n\r\n\t\t\tlet tev = ev as TouchEvent;\r\n\t\t\t__move(tev.touches[0].pageX, tev.touches[0].pageY);\r\n\r\n\t\t\tev.preventDefault();\r\n\t\t\tev.stopPropagation();\r\n\t\t}\r\n\t\telse if (ev.type == 'mouseup' || ev.type == 'touchend') {\r\n\t\t\tthis.m_props.target.removeClass('sizing');\r\n\r\n\t\t\tComponent.releaseCapture();\r\n\t\t\tev.preventDefault();\r\n\t\t\tev.stopPropagation();\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * sequence: Shift+Ctrl+Alt+A\r\n */\r\n\r\nexport interface Shortcut {\r\n\tsequence: string;\r\n\tname: string;\r\n\timmediate: boolean;\r\n\tcallback?: EventHandler<KeyboardEvent>;\r\n}\r\n\r\ninterface EvShortcut extends BasicEvent {\r\n\tname: string;\r\n}\r\n\r\nfunction EvShortcut(name: string) {\r\n\treturn BasicEvent<EvShortcut>({ name });\r\n}\r\n\r\nexport interface ContainerEventMap extends CEventMap {\r\n\tshortcut: EvShortcut;\r\n}\r\n\r\nexport interface ContainerProps<E extends ContainerEventMap = ContainerEventMap> extends CProps<E> {\r\n}\r\n\r\n/**\r\n * you can construct a Container as usual with it's properties but also directly with it's children array\r\n * \r\n * @example\r\n * new Container( [\r\n * \tchild1, \r\n * child2\r\n * ])\r\n */\r\n\r\nexport class Container<P extends ContainerProps = ContainerProps, E extends ContainerEventMap = ContainerEventMap> extends Component<P, E> {\r\n\r\n\tprivate m_shortcuts: Shortcut[];\r\n\r\n\tconstructor( props: P );\r\n\tconstructor( items: ComponentOrString[], cls?: string );\r\n\tconstructor( props: P | ComponentOrString[], cls?: string ) {\r\n\t\tif( isArray(props) ) {\r\n\t\t\tsuper( {content: props,cls} as P );\r\n\t\t}\r\n\t\telse {\r\n\t\t\tsuper( props );\r\n\t\t}\r\n\t}\r\n\t\r\n\t/**\r\n\t * add an application shortcut\r\n\t * @param sequence key sequence Shift+Ctrl+Alt+K\r\n\t * @param callback callback to call\r\n\t */\r\n\r\n\tpublic addShortcut(sequence: string | string[], name: string, callback: EventHandler<KeyboardEvent> = null, immediate = false) {\r\n\r\n\t\t// first time\r\n\t\tif (!this.m_shortcuts) {\r\n\t\t\tthis.m_shortcuts = [];\r\n\t\t\tthis.setDomEvent('keydown', (e) => this._handleKeydown(e));\r\n\t\t}\r\n\r\n\t\tif (!isArray(sequence)) {\r\n\t\t\tsequence = [sequence];\r\n\t\t}\r\n\r\n\t\tsequence.forEach((seq: string) => {\r\n\t\t\tlet reseq = '';\r\n\r\n\t\t\tlet shift = seq.match(/SHIFT/i);\r\n\t\t\tif (shift) {\r\n\t\t\t\tseq = seq.replace(/SHIFT/i, '');\r\n\t\t\t\treseq += 'shift+';\r\n\t\t\t}\r\n\r\n\t\t\tlet ctrl = seq.match(/CTRL/i);\r\n\t\t\tif (ctrl) {\r\n\t\t\t\tseq = seq.replace(/CTRL/i, '');\r\n\t\t\t\treseq += 'ctrl+';\r\n\t\t\t}\r\n\r\n\t\t\tlet cmd = seq.match(/CMD/i);\r\n\t\t\tif (cmd) {\r\n\t\t\t\tseq = seq.replace(/CMD/i, '');\r\n\t\t\t\treseq += 'cmd+';\r\n\t\t\t}\r\n\r\n\t\t\tlet alt = seq.match(/ALT/i);\r\n\t\t\tif (alt) {\r\n\t\t\t\tseq = seq.replace(/ALT/i, '');\r\n\t\t\t\treseq += 'alt+';\r\n\t\t\t}\r\n\r\n\t\t\treseq += seq.replace('+', '').toLowerCase();\r\n\r\n\t\t\tthis.m_shortcuts.push({\r\n\t\t\t\tsequence: reseq,\r\n\t\t\t\tname,\r\n\t\t\t\timmediate,\r\n\t\t\t\tcallback\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * remove all shortcuts for a target\r\n\t */\r\n\r\n\tremoveShortcuts() {\r\n\t\tif (this.m_shortcuts) {\r\n\t\t\tthis.m_shortcuts = [];\r\n\t\t}\r\n\t}\r\n\r\n\t/** @ignore this function is binded */\r\n\tprivate _handleKeydown(e: KeyboardEvent) {\r\n\r\n\t\tif (!this.m_shortcuts) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet seq = '';\r\n\r\n\t\tif (e.shiftKey) {\r\n\t\t\tseq += 'shift+';\r\n\t\t}\r\n\r\n\t\tif (e.ctrlKey) {\r\n\t\t\tseq += 'ctrl+';\r\n\t\t}\r\n\r\n\t\tif (e.metaKey) {\r\n\t\t\tseq += 'cmd+';\r\n\t\t}\r\n\r\n\t\tif (e.altKey) {\r\n\t\t\tseq += 'alt+';\r\n\t\t}\r\n\r\n\t\tseq += e.key.toLowerCase();\r\n\t\t//console.log( seq );\r\n\r\n\t\tthis.m_shortcuts.some((sk) => {\r\n\t\t\tif (sk.sequence == seq) {\r\n\r\n\t\t\t\tif (sk.callback) {\r\n\t\t\t\t\tif (sk.immediate) {\r\n\t\t\t\t\t\tsk.callback(e);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tasap(() => { sk.callback(e); });\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tthis.emit('shortcut', EvShortcut(sk.name));\r\n\t\t\t\t}\r\n\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\te.stopPropagation();\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n}\r\n\r\nexport type ComponentConstructor<T> = new (props: CProps) => T;\r\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file local_storage.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nexport class Settings {\n\n\tprivate m_data: any;\n\tprivate m_name: string;\n\n\tconstructor( name?: string ) {\n\t\tthis.m_data = null;\n\t\tthis.m_name = name ?? 'settings';\n\t}\n\n\tset( name: string, value: any ) {\n\t\tthis._load( );\n\t\tthis.m_data[name] = value;\n\t\tthis._save( );\n\t}\n\n\tget( name: string, defValue? ) : any {\n\t\tthis._load( );\n\t\treturn this.m_data[name] ?? defValue;\n\t}\n\n\tprivate _save( ) {\n\t\tlet data = JSON.stringify(this.m_data);\n\t\tlocalStorage.setItem( this.m_name, data );\n\t}\n\n\tprivate _load( ) {\n\t\tif( this.m_data ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.m_data = {};\n\n\t\tlet data = localStorage.getItem( this.m_name );\n\t\tif( data!==null ) {\n\t\t\tdata = JSON.parse( data );\n\t\t\tif( data ) {\n\t\t\t\tthis.m_data = data;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconsole.info('There was an error attempting to read your settings.');\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t\t// console.info('There was an error attempting to read your settings.');\n\t}\n}\n\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file router.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\n\nimport { EventSource, EvError, EventMap } from \"./x4events\"\n\ntype RouteHandler = ( params: any, path: string ) => void;\n\ninterface Segment {\n\tkeys: string[],\n\tpattern: RegExp;\n}\n\ninterface Route {\n\tkeys: string[],\n\tpattern: RegExp;\n\thandler: RouteHandler;\n}\n\nfunction parseRoute(str: string | RegExp, loose = false): Segment {\n\n\tif (str instanceof RegExp) {\n\t\treturn {\n\t\t\tkeys: null,\n\t\t\tpattern: str\n\t\t};\n\t}\n\n\tconst arr = str.split('/');\n\n\tlet keys = [];\n\tlet pattern = '';\n\n\tif( arr[0]=='' ) {\n\t\tarr.shift();\n\t}\n\n\tfor (const tmp of arr) {\n\t\tconst c = tmp[0];\n\n\t\tif (c === '*') {\n\t\t\tkeys.push('wild');\n\t\t\tpattern += '/(.*)';\n\t\t}\n\t\telse if (c === ':') {\n\t\t\tconst o = tmp.indexOf('?', 1);\n\t\t\tconst ext = tmp.indexOf('.', 1);\n\n\t\t\tkeys.push(tmp.substring(1, o >= 0 ? o : ext >= 0 ? ext : tmp.length));\n\t\t\tpattern += o >= 0 && ext < 0 ? '(?:/([^\\/]+?))?' : '/([^\\/]+?)';\n\t\t\tif (ext >= 0) {\n\t\t\t\tpattern += (o >= 0 ? '?' : '') + '\\\\' + tmp.substring(ext);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tpattern += '/' + tmp;\n\t\t}\n\t}\n\n\treturn {\n\t\tkeys,\n\t\tpattern: new RegExp( `^${pattern}${loose ? '(?=$|\\/)' : '\\/?$'}`, 'i' )\n\t};\n}\n\ninterface RouterEventMap extends EventMap {\n\terror: EvError;\n}\n\n\n/**\n * micro router\n * \n * ```\n * const router = new Router( );\n * \n * router.get( \"/detail/:id\", ( params: any ) => {\n * \tthis._showDetail( detail );\n * } );\n * \n * router.get( \"/:id\", ( params: any ) => {\n * if( params.id==0 )\n * \t\trouter.navigate( '/home' );\n *\t }\n * });\n * \n * router.on( \"error\", ( ) => {\n * \trouter.navigate( '/home' );\n * })\n * \n * router.init( );\n * ```\n */\n\n\nexport class Router extends EventSource< RouterEventMap > {\n\n\tprivate m_routes: Route[];\n\tprivate m_useHash: boolean;\n\n\tconstructor( useHash = true ) {\n\t\tsuper( );\n\n\t\tthis.m_routes = [];\n\t\tthis.m_useHash = useHash;\n\n\t\twindow.addEventListener('popstate', (event) => {\n\t\t\tconst url = this._getLocation( );\n\t\t\tconst found = this._find(url);\n\t\t\n\t\t\tfound.handlers.forEach(h => {\n\t\t\t\th(found.params,url);\n\t\t\t});\n\t\t});\n\t}\n\n\tget(uri: string | RegExp, handler: RouteHandler ) {\n\t\tlet { keys, pattern } = parseRoute(uri);\n\t\tthis.m_routes.push({ keys, pattern, handler });\n\t}\n\n\tinit() {\n\t\tthis.navigate( this._getLocation() );\n\t}\n\n\tprivate _getLocation( ) {\n\t\treturn this.m_useHash ? '/'+x4document.location.hash.substring(1) : x4document.location.pathname;\n\t}\n\n\tnavigate( uri: string, notify = true, replace = false ) {\n\n\t\tif( !uri.startsWith('/') ) {\n\t\t\turi = '/'+uri;\n\t\t}\n\n\t\tconst found = this._find( uri );\n\n\t\tif( !found || found.handlers.length==0 ) {\n\t\t\t//window.history.pushState({}, '', 'error')\n\t\t\tconsole.log( 'route not found: '+uri );\n\t\t\tthis.signal( \"error\", EvError( 404, \"route not found\" ) );\n\t\t\treturn;\n\t\t}\n\n\t\tif( this.m_useHash ) {\n\t\t\twhile( uri.at(0)=='/' ) {\n\t\t\t\turi = uri.substring( 1 );\n\t\t\t}\n\t\t\t\n\t\t\turi = '#'+uri;\n\t\t}\n\t\t\n\t\tif( replace ) {\n\t\t\twindow.history.replaceState({}, '', uri );\n\t\t}\n\t\telse {\n\t\t\twindow.history.pushState({}, '', uri );\n\t\t}\n\n\t\tif( notify ) {\n\t\t\tfound.handlers.forEach( h => {\n\t\t\t\th( found.params, uri );\n\t\t\t} );\n\t\t}\n\t}\n\n\tprivate _find( url: string ): { params: any, handlers: RouteHandler[] } {\n\t\t\n\t\tlet matches = [];\n\t\tlet params = {};\n\t\tlet handlers = [];\n\n\t\tfor (const tmp of this.m_routes ) {\n\t\t\tif (!tmp.keys ) {\n\t\t\t\tmatches = tmp.pattern.exec(url);\n\t\t\t\tif (!matches) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (matches['groups']) {\n\t\t\t\t\tfor (const k in matches['groups']) {\n\t\t\t\t\t\tparams[k] = matches['groups'][k];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\thandlers = [...handlers, tmp.handler];\n\t\t\t} \n\t\t\telse if (tmp.keys.length > 0) {\n\t\t\t\tmatches = tmp.pattern.exec(url);\n\t\t\t\tif (matches === null) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tfor ( let j = 0; j < tmp.keys.length;) {\n\t\t\t\t\tparams[tmp.keys[j]] = matches[++j];\n\t\t\t\t}\n\n\t\t\t\thandlers = [...handlers, tmp.handler];\n\t\t\t} \n\t\t\telse if (tmp.pattern.test(url)) {\n\t\t\t\thandlers = [...handlers, tmp.handler];\n\t\t\t}\n\t\t}\n\n\t\treturn { params, handlers };\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file application.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\nimport { EvMessage } from './x4events'\nimport { BaseComponent, BaseComponentEventMap, BaseComponentProps } from './base_component'\nimport { Component, flyWrap } from './component'\nimport { Settings } from './settings'\nimport { _tr } from './i18n'\nimport { Router } from './router'\n\nconst _x4_touch_time = Symbol( );\n\n\ninterface ApplicationEventMap extends BaseComponentEventMap {\n\tmessage: EvMessage;\n\tglobal: EvMessage;\n}\n\n/**\n * \n */\n\nexport interface ApplicationProps extends BaseComponentProps<ApplicationEventMap> {\n\tapp_name: string;\t\t// \n\tapp_version: string;\t//\n\tapp_uid?: string;\n\tlocale?: string;\t\t// fr-FR\n\trenderTo?: HTMLElement;\n}\n\n/**\n * Represents an x4 application, which is typically a single page app.\n * You should inherit Application to define yours.\n * Application derives from BaseComponent so you can use that to implement a global messaging system.\n * @example ```ts\n * \n * // in yout main caode\n * let app = new Application( );\n * \n * app.events.close.on( ( ev ) => {\n * \t... do something\n * });\n * \n * // somewhere else in the source\n * function xxx( ) {\n * \tlet app = Application.instance( );\n * \tapp.events.close.emit( new Events.close() );\n * }\n */\n\nexport class Application<P extends ApplicationProps = ApplicationProps, E extends ApplicationEventMap = ApplicationEventMap> extends BaseComponent<P,E> {\n\t\n\tprivate static self: Application = null;\n\n\t/**\n\t * the application singleton\n\t */\n\n\tstatic \tinstance( ) : Application {\n\t\treturn Application.self;\n\t}\n\n\tprivate m_mainView: Component;\n\n\tprivate m_app_name: string;\n\tprivate m_app_version: string;\n\tprivate m_app_uid: string;\n\t\n\tprivate m_local_storage: Settings;\n\tprivate m_user_data: any;\n\n\tprivate m_touch_time: number;\n\tprivate m_touch_count: number;\n\n\tprivate m_router: Router;\n\t\n\tconstructor( props : P ) {\n\t\tconsole.assert( Application.self===null, 'application is a singleton' );\n\t\tsuper( props );\n\n\t\tthis.m_app_name = props.app_name ?? 'application';\n\t\tthis.m_app_version = props.app_version ?? '1.0';\n\t\tthis.m_app_uid = props.app_uid ?? 'application';\n\n\t\tlet settings_name = `${this.m_app_name}.${this.m_app_version}.settings`;\n\t\tthis.m_local_storage = new Settings( settings_name );\n\t\tthis.m_user_data = {};\n\n\t\tthis.m_touch_time = 0;\n\t\tthis.m_touch_count = 0;\n\t\tthis.m_router = null;\n\t\n\t\tx4app = (Application.self as any) = this;\n\n\t\tif( 'onload' in globalThis ) {\n\t\t\tglobalThis.addEventListener( 'load', ( ) => {\n\t\t\t\tthis.ApplicationCreated( );\n\t\t\t})\n\t\t}\n\t\telse {\n\t\t\tthis.ApplicationCreated( );\n\t\t}\n\t}\n\n\tApplicationCreated( ) {\n\t\tthis.setTitle( '' );\n\t}\n\n\tpublic get router( ) {\n\t\tif( !this.m_router ) {\n\t\t\tthis.m_router = new Router( );\n\t\t}\n\t\treturn this.m_router;\n\t}\n\n\tpublic get app_name( ) {\n\t\treturn this.m_app_name;\n\t}\n\n\tpublic get app_uid( ) {\n\t\treturn this.m_app_uid;\n\t}\n\n\tpublic get app_version( ) {\n\t\treturn this.m_app_version;\n\t}\n\n\tpublic get local_storage( ) {\n\t\treturn this.m_local_storage;\n\t}\n\n\tpublic get user_data( ) {\n\t\treturn this.m_user_data;\n\t}\n\n\tpublic get history( ): null {\n\t\t//if( !this.m_history ) {\n\t\t//\tthis.m_history = new NavigationHistory( );\n\t\t//}\n\t\t//\n\t\t//return this.m_history;\n\t\tdebugger;\n\t\treturn null;\n\t}\n\n\t/**\n\t * define the application root object (MainView)\n\t * @example ```ts\n\t * \n\t * let myApp = new Application( ... );\n\t * let mainView = new VLayout( ... );\n\t * myApp.mainView = mainView;\n\t */\n\n\t public setMainView( root: Component, clearBefore: boolean ) {\n\n\t\tconst ddom = this.m_props.renderTo ?? x4document.body;\n\t\tconst dest = flyWrap( ddom );\n\n\t\tif( !this.m_props.renderTo ) {\n\t\t\tdest.setStyleValue( 'position', 'absolute' );\t\n\t\t}\n\n\t\tdest.addClass( 'x4-root-element' );\n\t\tif( clearBefore ) {\n\t\t\tdest._empty( );\n\t\t}\n\n\t\tthis.m_mainView = root;\n\n\t\troot.setStyleValue( 'position', 'absolute' );\n\t\troot._build();\n\n\t\tddom.appendChild( root.dom );\n\t}\n\n\tset mainView( root: Component ) {\n\t\tthis.setMainView( root, false );\n\t}\n\n\tpublic get mainView( ) : Component {\n\t\treturn this.m_mainView;\n\t}\n\n\tpublic setTitle( title: string ) {\n\t\tx4document.title = this.m_app_name + (title ? (' > ' + title) : '');\n\t}\n\n\tpublic disableZoomWheel( ) {\n\n\t\twindow.addEventListener('wheel', function( ev: WheelEvent ) {\n\t\t\tif( ev.ctrlKey ) {\n\t\t\t\tev.preventDefault( );\n\t\t\t\t//ev.stopPropagation( );\n\t\t\t}\n\t\t\n\t\t}, { passive: false, capture: true } );\n\t}\n\n\tpublic enterModal( enter: boolean ) {\n\t}\n\n\tpublic enableTouchDblClick( ) {\n\t\tx4document.addEventListener( 'touchstart', ( ev: TouchEvent ) => {\n\n\t\t\tlet now = Date.now( );\n\t\t\tif( (now-this.m_touch_time) > 700 ) {\n\t\t\t\tthis.m_touch_count = 1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.m_touch_count++;\n\t\t\t}\n\n\t\t\tthis.m_touch_time = now;\n\n\t\t\tif( this.m_touch_count==2 ) {\n\t\t\t\tthis.m_touch_count = 0;\n\n\t\t\t\t// dirty fake dblclick event\n\t\t\t\tconst tch = ev.touches[0];\n\t\t\t\tlet fake: any = {type: \"dblclick\" };\n\t\t\t\tfor( const n in tch ) {\n\t\t\t\t\tfake[n] = (tch as any)[n];\n\t\t\t\t}\n\n\t\t\t\t// ignore -> private: dirty x2\n\t\t\t\t(Component as any)._dispatchEvent( fake );\n\t\t\t\tev.stopPropagation( );\n\t\t\t}\n\t\t});\n\t}\n};\n\nexport let x4app: Application;\n\n", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file layout.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\nimport { Component, CProps, ComponentContent, Container, ContainerProps, ContainerEventMap } from './component'\nimport { } from './x4events'\nimport { isArray } from './tools';\n\n// ============================================================================\n// [ABSLAYOUT]\n// ============================================================================\n\nexport class AbsLayout<P extends ContainerProps = ContainerProps, E extends ContainerEventMap = ContainerEventMap> extends Container<P, E> {\n}\n\n\n// ============================================================================\n// [HLAYOUT]\n// ============================================================================\n\nexport class HLayout<P extends ContainerProps = ContainerProps, E extends ContainerEventMap = ContainerEventMap> extends Container<P, E> {\n}\n\n// ============================================================================\n// [VLAYOUT]\n// ============================================================================\n\nexport class VLayout<P extends ContainerProps = ContainerProps, E extends ContainerEventMap = ContainerEventMap> extends Container<P, E> {\n}\n\n\n\ninterface AutoLayoutProps extends CProps {\n\tdefaultLayout: 'horizontal' | 'vertical';\t// by default is <xx>\n\tswitchSize: number;\t\t\t\t\t\t\t// switch if size < this\n}\n\nexport class AutoLayout extends Container<AutoLayoutProps> {\n\n\tconstructor(props: AutoLayoutProps) {\n\t\tsuper(props);\n\n\t\tthis.setDomEvent('sizechange', () => this._updateLayout());\n\t}\n\n\tcomponentCreated() {\n\t\tsuper.componentCreated();\n\t\tthis._updateLayout();\n\t}\n\n\tprivate _updateLayout() {\n\n\t\tlet horz = this.m_props.defaultLayout == 'horizontal' ? true : false;\n\n\t\tif (this.m_props.switchSize <= 0 && window.screen.height > window.screen.width) {\n\t\t\thorz = !horz;\n\t\t}\n\t\telse {\n\t\t\tlet rc = this.getBoundingRect();\n\t\t\tif ((horz && rc.width < this.m_props.switchSize) || (!horz && rc.height < this.m_props.switchSize)) {\n\t\t\t\thorz = !horz;\n\t\t\t}\n\t\t}\n\n\t\tif (horz) {\n\t\t\tthis.removeClass('@vlayout');\n\t\t\tthis.addClass('@hlayout');\n\t\t}\n\t\telse {\n\t\t\tthis.addClass('@vlayout');\n\t\t\tthis.removeClass('@hlayout');\n\t\t}\n\t}\n\n\n}\n\n// ============================================================================\n// [GRIDLAYOUT]\n// ============================================================================\n\nexport interface GridLayoutProps extends ContainerProps {\n\tcolSizes?: string;\t// ex: 20% 1fr 1fr 1fr ou repeat( 10, 25px )\n\trowSizes?: string;\t// ex: auto\n\tcolGap?: number;\n\ttemplate?: string[] // ex: [ \"img sa sb sc\", \"img sd sd sd\" ]\n}\n\nexport class GridLayout<P extends GridLayoutProps = GridLayoutProps> extends Container<P>\n{\n\tconstructor(props: GridLayoutProps) {\n\t\t/// @ts-ignore\n\t\t// Argument of type 'GridLayoutProps' is not assignable to parameter of type 'P'.\n\t\t// 'GridLayoutProps' is assignable to the constraint of type 'P', but 'P' could be instantiated with a different subtype of constraint 'GridLayoutProps'.\n\t\tsuper(props);\n\t}\n\n\t/** @ignore */\n\trender() {\n\t\tif (this.m_props.colSizes) {\n\t\t\tthis.setStyleValue('grid-template-columns', this.m_props.colSizes);\n\t\t}\n\n\t\tif (this.m_props.rowSizes) {\n\t\t\tthis.setStyleValue('grid-template-rows', this.m_props.rowSizes);\n\t\t}\n\n\t\tif (this.m_props.colGap) {\n\t\t\tthis.setStyleValue('grid-gap', this.m_props.colGap);\n\t\t}\n\n\t\tif (this.m_props.template) {\n\t\t\tthis.setStyleValue('grid-template-areas', this.m_props.template.join('\\n'));\n\t\t}\n\t}\n}\n\n// :: TABLE ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\nexport interface TableLayoutProps extends CProps {\n\trows: number;\n\tcolumns: number;\n}\n\ninterface CellData {\n\trowSpan?: number;\n\tcolSpan?: number;\n\twidth?: number;\n\theight?: number;\n\tcls?: string;\n\titem?: ComponentContent;\n\tdata?: any;\n}\n\nexport class TableLayout extends Container<TableLayoutProps> {\n\n\tprivate m_cells: Map<number, CellData>;\n\n\tconstructor(props: TableLayoutProps) {\n\t\tsuper(props);\n\n\t\tthis.setTag( 'table');\n\t\tthis.m_cells = new Map<number, CellData>();\n\t}\n\n\tprivate _getCell(row: number, col: number, create = true): CellData {\n\t\tlet idx = _mkid(row, col);\n\t\treturn this.m_cells.get(idx) ?? (create ? { item: undefined } : null);\n\t}\n\n\tprivate _setCell(row: number, col: number, cell: CellData, update = false) {\n\n\t\tlet idx = _mkid(row, col);\n\t\tthis.m_cells.set(idx, cell);\n\n\t\tif (this.dom && cell.item && update) {\n\n\t\t\tif (cell.item instanceof Component) {\n\t\t\t\tcell.item.update();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.enumChilds((c) => {\n\t\t\t\t\tlet crow = c.getData('row');\n\t\t\t\t\tif (crow == row) {\n\t\t\t\t\t\tlet ccol = c.getData('col');\n\t\t\t\t\t\tif (ccol == col) {\n\t\t\t\t\t\t\tc.setContent(cell.item);\n\t\t\t\t\t\t\tc.update();\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\n\tsetCell(row: number, col: number, item: ComponentContent) {\n\t\tlet cell = this._getCell(row, col);\n\t\tcell.item = item;\n\t\tthis._setCell(row, col, cell, true);\n\t}\n\n\tsetCellData(row: number, col: number, data: any ) {\n\t\tlet cell = this._getCell(row, col);\n\t\tcell.data = data;\n\t\tthis._setCell(row, col, cell, true);\n\t}\n\n\tgetCellData(row: number, col: number ) {\n\t\tlet cell = this._getCell(row, col, false);\n\t\treturn cell?.data;\n\t}\n\n\tmerge(row: number, col: number, rowCount: number, colCount: number) {\n\t\tlet cell = this._getCell(row, col);\n\t\tcell.rowSpan = rowCount;\n\t\tcell.colSpan = colCount;\n\t\tthis._setCell(row, col, cell);\n\t}\n\n\tsetCellWidth(row: number, col: number, width?: number) {\n\t\tlet cell = this._getCell(row, col);\n\t\tcell.width = width;\n\t\tthis._setCell(row, col, cell);\n\t}\n\n\tsetCellHeight(row: number, col: number, height?: number) {\n\t\tlet cell = this._getCell(row, col);\n\t\tcell.height = height;\n\t\tthis._setCell(row, col, cell);\n\t}\n\n\tsetCellClass(row: number, col: number, cls: string) {\n\t\tlet cell = this._getCell(row, col);\n\t\tcell.cls = cls;\n\t\tthis._setCell(row, col, cell);\n\t}\n\n\tsetColClass(col, cls) {\n\t\tlet cell = this._getCell(-1, col);\n\t\tcell.cls = cls;\n\t\tthis._setCell(-1, col, cell);\n\t}\n\n\tsetRowClass(row, cls) {\n\t\tlet cell = this._getCell(row, 999);\n\t\tcell.cls = cls;\n\t\tthis._setCell(row, 999, cell);\n\t}\n\n\tgetCell(row, col) {\n\t\tlet cell = this._getCell(row, col);\n\t\treturn cell?.item;\n\t}\n\n\trender() {\n\n\t\tlet rows = [];\n\t\tlet skip: number[] = [];\n\n\t\tfor (let r = 0; r < this.m_props.rows; r++) {\n\n\t\t\tlet cols = [];\n\t\t\tfor (let c = 0; c < this.m_props.columns; c++) {\n\n\t\t\t\tlet idx = _mkid(r, c);\n\t\t\t\tif (skip.indexOf(idx) >= 0) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet cell = this.m_cells.get(idx);\n\t\t\t\tlet cdata = this.m_cells.get(_mkid(-1, c));\n\n\t\t\t\tlet cls = '';\n\t\t\t\tif (cell && cell.cls) {\n\t\t\t\t\tcls = cell.cls;\n\t\t\t\t}\n\n\t\t\t\tif (cdata && cdata.cls) {\n\t\t\t\t\tcls += ' ' + cdata.cls;\n\t\t\t\t}\n\n\t\t\t\tlet cc = new Component({\n\t\t\t\t\ttag: 'td',\n\t\t\t\t\tcontent: cell?.item,\n\t\t\t\t\twidth: cell?.width,\n\t\t\t\t\theight: cell?.height,\n\t\t\t\t\tdata: { row: r, col: c },\n\t\t\t\t\tcls\n\t\t\t\t});\n\n\t\t\t\tif (cell) {\n\t\t\t\t\tlet rs = cell.rowSpan ?? 0,\n\t\t\t\t\t\tcs = cell.colSpan ?? 0;\n\n\t\t\t\t\tif (rs > 0) { cc.setAttribute('rowspan', rs + 1); }\n\t\t\t\t\tif (cs > 0) { cc.setAttribute('colspan', cs + 1); }\n\n\t\t\t\t\tif (rs || cs) {\n\t\t\t\t\t\tfor (let sr = 0; sr <= rs; sr++) {\n\t\t\t\t\t\t\tfor (let sc = 0; sc <= cs; sc++) {\n\t\t\t\t\t\t\t\tskip.push(_mkid(sr + r, sc + c));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcols.push(cc);\n\t\t\t}\n\n\t\t\tlet rdata = this._getCell(r, 999, false);\n\n\t\t\tlet rr = new Component({\n\t\t\t\ttag: 'tr',\n\t\t\t\tdata: { row: r },\n\t\t\t\tcontent: cols,\n\t\t\t\tcls: rdata?.cls\n\t\t\t});\n\n\t\t\trows.push(rr);\n\t\t}\n\n\t\tthis.setContent(rows);\n\t}\n}\n\n/**\n * @ignore\n */\n\nfunction _mkid(row: number, col: number): number {\n\treturn row * 1000 + col;\n}\n\n/**\n * @ignore\n */\n\nfunction _getid(key: number) {\n\treturn {\n\t\trow: Math.floor(key / 1000) | 0,\n\t\tcol: (key % 1000) | 0\n\t}\n}\n\n// :: SCROLLVIEW ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\ninterface ScrollViewProps extends CProps {\n}\n\nexport class ScrollView extends Component<ScrollViewProps> {\n\n\tconstructor(props: ScrollViewProps) {\n\t\tsuper(props);\n\n\t\tthis.setContent(props.content);\n\t}\n\n\tsetContent(content: ComponentContent) {\n\n\t\tif (!content) {\n\t\t\tsuper.setContent(null);\n\t\t}\n\t\telse {\n\t\t\tlet container;\n\t\t\tif (isArray(content)) {\n\t\t\t\tcontainer = new VLayout({ content });\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcontainer = content;\n\t\t\t}\n\n\t\t\tcontainer.addClass('@scroll-container');\n\t\t\tsuper.setContent(container);\n\t\t}\n\t}\n}\n\n\n// :: MASONERY ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\n// from a nice article of Andy Barefoot\n//\thttps://medium.com/@andybarefoot/a-masonry-style-layout-using-css-grid-8c663d355ebb\n\nexport class Masonry extends Container {\n\n\tconstructor(props) {\n\t\tconst items = props.items;\n\t\tprops.items = undefined;\n\n\t\tsuper(props);\n\n\t\tthis.setDomEvent('sizechange', () => {\n\t\t\tthis.resizeAllItems( );\n\t\t});\n\n\t\tif( items ) {\n\t\t\titems.forEach( i => {\n\t\t\t\tthis.addItem( i );\n\t\t\t});\n\t\t}\n\t}\n\n\tresizeItem(item: Component) {\n\n\t\tconst style = this.getComputedStyle();\n\n\t\tconst rowHeight = style.parse('grid-auto-rows');\n\t\tconst rowGap = style.parse('grid-row-gap');\n\n\t\tlet content = item.queryItem('.content');\n\t\tif( !content ) {\n\t\t\tcontent = item;\n\t\t}\n\n\t\tif (content && (rowHeight + rowGap)) {\n\t\t\tconst rc = content.getBoundingRect();\n\t\t\tconst rowSpan = Math.ceil( (rc.height + rowGap) / (rowHeight + rowGap) );\n\t\t\titem.setStyleValue('gridRowEnd', \"span \" + rowSpan);\n\t\t}\n\t}\n\t \n\tresizeAllItems( ) {\n\t\tthis.queryAll( \".item\", ( itm ) => {;\n\t\t\tthis.resizeItem( itm );\n\t\t} );\n\t}\n\n\taddItem( itm: Component ) {\n\t\titm.addClass( 'content' );\n\t\tthis.appendChild( new Container( {\n\t\t\tcls: 'item',\n\t\t\tcontent: itm\n\t\t}));\n\t}\n}\n\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file popup.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\n\nimport { Container, CProps, flyWrap, SizerOverlay, EvOverlayResize, Component, ContainerEventMap, EvSize } from './component'\nimport { Point, Size, getMousePos, asap } from './tools'\nimport { BasicEvent } from './x4events';\nimport { Application } from './application';\n\n\nexport interface EvMove extends BasicEvent {\n\tpos: Point;\n}\n\nexport function EvMove(pos: Point): EvMove {\n\treturn BasicEvent<EvMove>({ pos });\n}\n\n\nexport interface PopupEventMap extends ContainerEventMap {\n\tsize: EvSize;\n\tmove: EvMove;\n}\n\nexport interface PopupProps<E extends PopupEventMap = PopupEventMap> extends CProps<E> {\n\tsizable?: boolean;\n}\n\n\n/**\n * base class for all popup elements\n */\n\nexport class Popup<P extends PopupProps = PopupProps, E extends PopupEventMap = PopupEventMap> extends Container<P, E>\n{\n\tprotected m_ui_mask: HTMLElement;\n\tprivate m_hasMask: boolean = true;\n\n\tstatic modal_stack: HTMLElement[] = [];\n\n\tconstructor(props: P) {\n\t\tsuper(props);\n\n\t\tthis.addClass('@hidden');\n\t}\n\n\tenableMask(enable = true) {\n\t\tthis.m_hasMask = enable;\n\t}\n\n\t/**\n\t * display the popup on screen\n\t */\n\n\tpublic show(modal?: boolean) {\n\n\t\tif (modal !== undefined) {\n\t\t\tthis.m_hasMask = modal ? true : false;\n\t\t}\n\t\telse {\n\t\t\tmodal = this.m_hasMask;\n\t\t}\n\n\t\tif (this.m_hasMask) {\n\n\t\t\t// remove the focus\n\t\t\tconst focus = x4document.activeElement as HTMLElement;\n\t\t\tif (focus) {\n\t\t\t\tfocus.blur()\n\t\t\t}\n\t\t\tthis.m_ui_mask = <HTMLElement>x4document.body.lastChild;\n\n\t\t\twhile (this.m_ui_mask) {\n\n\t\t\t\tif (this.m_ui_mask.nodeType == 1) { \t// only element nodes\n\n\t\t\t\t\tlet elUI = flyWrap(this.m_ui_mask);\n\n\t\t\t\t\tif (elUI.hasClass('@menu') || elUI.hasClass('@non-maskable') ) {\n\t\t\t\t\t\t/* avoid circular dependencies instanceof Menu*/\n\t\t\t\t\t\t/* avoid nonmaskable elements tobe masked */\n\t\t\t\t\t}\n\t\t\t\t\telse if (elUI.getStyleValue('display') == 'none' || !elUI.isUserVisible()) {\n\t\t\t\t\t\t/* avoid masking hidden elements */\n\t\t\t\t\t}\n\t\t\t\t\telse if( !elUI.hasClass('@comp') ) {\n\t\t\t\t\t\t/* avoid masking element that are not to us */\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.m_ui_mask = <HTMLElement>this.m_ui_mask.previousSibling;\n\t\t\t}\n\n\t\t\tif (this.m_ui_mask) {\n\t\t\t\tflyWrap(this.m_ui_mask).addClass('@mask');\n\t\t\t}\n\t\t}\n\n\t\tif (modal) {\n\t\t\tApplication.instance().enterModal(true);\n\t\t}\n\n\t\t// to avoid body growing because of appendChild\n\t\tthis.setStyle({\n\t\t\tleft: 0,\n\t\t\ttop: 0\n\t\t});\n\n\t\tx4document.body.appendChild(this._build());\n\n\t\tthis.removeClass('@hidden');\n\t\tthis.centerOnScreen( );\n\n\t\tif (modal) {\n\t\t\tlet focus = x4document.activeElement;\n\t\t\tif (!this.dom.contains(focus)) {\n\t\t\t\t\n\t\t\t\tconst autofocus = this.queryItem('[autofocus]');\n\t\t\t\tif( autofocus ) {\n\t\t\t\t\tautofocus.focus( )\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet tabbable = this.queryAll('[tabindex]');\n\n\t\t\t\t\tif( tabbable ) {\n\t\t\t\t\t\t// remove hidden elements\n\t\t\t\t\t\ttabbable = tabbable.filter((el) => el.offsetParent !== null);\n\t\t\t\t\t\tif (tabbable.length) {\n\t\t\t\t\t\t\ttabbable[0].focus( );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tPopup.modal_stack.push(this.dom);\n\t\t}\n\t}\n\n\tcenterOnScreen( ) {\n\t\tlet rc = this.getBoundingRect();\n\n\t\t//let x = (x4document.body.clientWidth - rc.width) / 2,\n\t\t//\ty = (x4document.body.clientHeight - rc.height) / 2;\n\n\t\tconst x = `max( 0px, 50vw - ${rc.width/2}px )`;\t//(x4dom_1.x4document.body.clientWidth - rc.width) / 2;\n\t\tconst y = `max( 0px, 50vh - ${rc.height/2}px )`;\t//(x4dom_1.x4document.body.clientHeight - rc.height) / 2;\n\n\t\tthis.setStyleValue('left', x);\n\t\tthis.setStyleValue('top', y);\n\t}\n\n\t/**\n\t* display the popup at a specific position\n\t* @param x \n\t* @param y \n\t*/\n\n\tpublic displayAt(x: number, y: number, align: string = 'top left', offset?: { x, y }, modal = false ) {\n\n\t\tthis.show( modal );\n\n\t\tlet halign = 'l',\n\t\t\tvalign = 't';\n\n\t\tif (align.indexOf('right') >= 0) {\n\t\t\thalign = 'r';\n\t\t}\n\n\t\tif (align.indexOf('bottom') >= 0) {\n\t\t\tvalign = 'b';\n\t\t}\n\n\t\t// @TODO: this is a minimal overflow problem solution\n\t\tlet rc = x4document.body.getBoundingClientRect(),\n\t\t\trm = this.getBoundingRect();\n\n\t\tif (halign == 'r') {\n\t\t\tx -= rm.width;\n\t\t}\n\n\t\tif (valign == 'b') {\n\t\t\ty -= rm.height;\n\t\t}\n\n\t\tif (offset) {\n\t\t\tx += offset.x;\n\t\t\ty += offset.y;\n\t\t}\n\n\t\tif (x < 4) {\n\t\t\tx = 4;\n\t\t}\n\n\t\tif ((x + rm.width) > rc.right - 4) {\n\t\t\tx = rc.right - 4 - rm.width;\n\t\t\tif (offset?.x < 0) {\n\t\t\t\tx += offset.x;\n\t\t\t}\n\t\t}\n\n\t\tif (y < 4) {\n\t\t\ty = 4;\n\t\t}\n\n\t\tif ((y + rm.height) > rc.bottom - 4) {\n\t\t\ty = rc.bottom - 4 - rm.height;\n\n\t\t\tif (offset?.y < 0) {\n\t\t\t\ty += offset.y;\n\t\t\t}\n\t\t}\n\n\t\tthis.setStyle({ left: x, top: y });\n\t}\n\n\t/**\n\t * close the popup \n\t */\n\n\tpublic close() {\n\t\tthis.hide();\n\n\t\tif (this.m_hasMask && this.m_ui_mask) {\n\t\t\tflyWrap(this.m_ui_mask).removeClass('@mask');\n\t\t\tconst app = Application.instance();\n\t\t\tapp.enterModal(false);\n\t\t}\n\n\t\tlet index = Popup.modal_stack.indexOf(this.dom);\n\t\tif (index >= 0) {\n\t\t\tPopup.modal_stack.splice(index);\n\t\t}\n\n\t\tthis.dispose();\n\t}\n\n\tcomponentCreated() {\n\n\t\tif (this.m_props.sizable) {\n\n\t\t\tthis.addClass('@size-all');\n\n\t\t\tlet els = ['top', 'right', 'bottom', 'left', 'topleft', 'topright', 'bottomleft', 'bottomright'];\n\n\t\t\tfor (let sens of els) {\n\t\t\t\tnew SizerOverlay({\n\t\t\t\t\ttarget: this,\n\t\t\t\t\tsens: sens as any,\n\t\t\t\t\tevents: { rawresize: (e) => this._mouseResize(e) }\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * resize for 'all' resize attribute\n\t */\n\n\tprivate _mouseResize(event: EvOverlayResize) {\n\n\t\tevent.preventDefault();\n\n\t\tlet irc = this.getBoundingRect();\n\t\tlet st = this.getComputedStyle();\n\t\tlet ev = event.ui_event;\n\n\t\tlet tm = st.parse('marginTop'),\n\t\t\tlm = st.parse('marginLeft'),\n\t\t\trm = st.parse('marginRight'),\n\t\t\tbm = st.parse('marginBottom');\n\n\t\tlet ix = 0,\n\t\t\tiy = 0;\n\n\t\tlet mp = getMousePos(ev, true);\n\n\t\t// horz\n\t\tswitch (event.sens) {\n\t\t\tcase 'topright':\n\t\t\tcase 'bottomright':\n\t\t\tcase 'right': ix = (irc.right - rm) - mp.x; break;\n\n\t\t\tcase 'topleft':\n\t\t\tcase 'bottomleft':\n\t\t\tcase 'left': ix = (irc.left - lm) - mp.x; break;\n\t\t}\n\n\t\t// vert\n\t\tswitch (event.sens) {\n\t\t\tcase 'bottomleft':\n\t\t\tcase 'bottomright':\n\t\t\tcase 'bottom': iy = (irc.bottom - bm) - mp.y; break;\n\n\t\t\tcase 'topleft':\n\t\t\tcase 'topright':\n\t\t\tcase 'top': iy = (irc.top - tm) - mp.y; break;\n\t\t}\n\n\t\t// left & top are with margin\n\t\t// width & height not\n\t\tirc.left -= lm;\n\t\tirc.top -= tm;\n\n\t\t//console.log( 'capture' );\n\n\t\tlet sens = event.sens;\n\n\t\tComponent.setCapture(this, (ne: UIEvent) => {\n\n\t\t\t//console.log( ne );\n\n\t\t\tlet __move = (ex, ey) => {\n\n\t\t\t\tlet left = irc.left,\n\t\t\t\t\ttop = irc.top,\n\t\t\t\t\twidth = irc.width,\n\t\t\t\t\theight = irc.height;\n\n\t\t\t\tlet dx, dy;\n\t\t\t\tlet px = ex + ix,\n\t\t\t\t\tpy = ey + iy;\n\n\t\t\t\tif (px < 0) {\n\t\t\t\t\tpx = 0;\n\t\t\t\t}\n\n\t\t\t\tif (py < 0) {\n\t\t\t\t\tpy = 0;\n\t\t\t\t}\n\n\t\t\t\t// horz\n\t\t\t\tswitch (sens) {\n\t\t\t\t\tcase 'topright':\n\t\t\t\t\tcase 'bottomright':\n\t\t\t\t\tcase 'right': width = px - left; break;\n\n\t\t\t\t\tcase 'topleft':\n\t\t\t\t\tcase 'bottomleft':\n\t\t\t\t\tcase 'left': dx = left - px; width += dx; left -= dx; break;\n\t\t\t\t}\n\n\t\t\t\t// vert\n\t\t\t\tswitch (sens) {\n\t\t\t\t\tcase 'bottomleft':\n\t\t\t\t\tcase 'bottomright':\n\t\t\t\t\tcase 'bottom': height = py - top; break;\n\n\t\t\t\t\tcase 'topleft':\n\t\t\t\t\tcase 'topright':\n\t\t\t\t\tcase 'top': dy = top - py; height += dy; top -= dy; break;\n\t\t\t\t}\n\n\t\t\t\tlet newsize = new Size(width, height);\n\t\t\t\tthis.setStyle({ left, top, width: newsize.width, height: newsize.height });\n\n\t\t\t\tthis.emit('size', EvSize(newsize));\n\t\t\t}\n\n\t\t\tif (ne.type == 'mouseup' || ne.type == 'touchend') {\n\t\t\t\tComponent.releaseCapture();\n\t\t\t}\n\t\t\telse if (ne.type == 'mousemove') {\n\t\t\t\tlet me = ne as MouseEvent;\n\t\t\t\t__move(me.pageX, me.pageY);\n\t\t\t}\n\t\t\telse if (ne.type == 'touchmove') {\n\t\t\t\tlet tev = ne as TouchEvent;\n\t\t\t\t__move(tev.touches[0].pageX, tev.touches[0].pageY);\n\t\t\t}\n\t\t});\n\t}\n}\n\n\n\n\n\n/**\n * handle tab key\n */\n\nfunction x4handleKeyDown(e: KeyboardEvent) {\n\n\tif (e.key == 'Tab' || e.key == 'Enter') {\n\n\t\tconst target = e.target as HTMLElement;\n\t\tif (target.tagName == 'TEXTAREA') {\n\t\t\treturn;\n\t\t}\n\n\t\tconst el = Component.getElement( target );\n\t\tif( el && (el.hasAttribute('wants-tab') || el.hasAttribute('wants-enter')) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet topStack = x4document.body;\n\t\tif (Popup.modal_stack.length) {\n\t\t\ttopStack = Popup.modal_stack[Popup.modal_stack.length - 1];\n\t\t}\n\n\t\t_nextTab(topStack, e.target as HTMLElement, e.shiftKey);\n\t\te.stopPropagation();\n\t\te.preventDefault();\n\t}\n}\n\n/**\n * cycle through tabs\n */\n\nfunction _nextTab(root: HTMLElement, el: HTMLElement, prev: boolean) {\n\n\t// first check if the focus is one of our child (disabled...)\n\tlet focusEl = x4document.activeElement;\n\tif (!root.contains(focusEl)) {\n\t\treturn;\n\t}\n\n\tlet comp = Component.getElement(el);\n\n\t// get a list of elements with tab index, this way we should abble to\n\t// cycle on them (not on browser address nor under dialog elements)\n\tlet tab_indexes:HTMLElement[] = Array.from( root.querySelectorAll<HTMLElement>('[tabindex]') );\n\n\t// remove hidden elements\n\ttab_indexes = tab_indexes.filter((el) => el.offsetParent !== null);\n\tif (!tab_indexes.length) {\n\t\treturn;\n\t}\n\n\tlet ct = tab_indexes.indexOf(el);\n\n\tif (ct < 0) {\n\t\tct = 0;\n\t}\n\telse {\n\t\tif (prev) {\n\t\t\tif (ct > 0) {\n\t\t\t\tct--;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tct = tab_indexes.length - 1;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif (ct < tab_indexes.length - 1) {\n\t\t\t\tct++;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tct = 0;\n\t\t\t}\n\t\t}\n\t}\n\n\ttab_indexes[ct].focus();\n}\n\nfunction installKBHandler( ) {\n\t// set on body to be called after document (where all component domevent go)\n\tx4document.body.addEventListener('keydown', x4handleKeyDown, true);\n}\n\n// too early ?\nx4document.body ? installKBHandler( ) : window.addEventListener( 'load', installKBHandler );\n", "/**\r\n* ___ ___ __\r\n* \\ \\/ / / _\r\n* \\ / /_| |_\r\n* / \\____ _| \r\n* /__/\\__\\ |_|\r\n* \r\n* @file action.ts\r\n* @author Etienne Cochard \r\n*\r\n* Copyright (c) 2019-2023 R-libre ingenierie\r\n*\r\n* Permission is hereby granted, free of charge, to any person obtaining a copy \r\n* of this software and associated documentation files (the \"Software\"), to deal \r\n* in the Software without restriction, including without limitation the rights \r\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \r\n* of the Software, and to permit persons to whom the Software is furnished to do so, \r\n* subject to the following conditions:\r\n* The above copyright notice and this permission notice shall be included in all copies\r\n* or substantial portions of the Software.\r\n*\r\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \r\n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \r\n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \r\n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \r\n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n**/\r\n\r\nimport { BasicEvent, EvChange } from './x4events'\r\nimport { BaseComponent, BaseComponentEventMap, BaseComponentProps } from './base_component'\r\nimport { IconID } from \"./icon\"\r\nimport { EventHandler } from './component';\r\n\r\n//TODO: implement all\r\n\r\n\r\nexport interface EvAction extends BasicEvent {\r\n}\r\n\r\nexport function EvAction( source: Action ) {\r\n\treturn BasicEvent<EvAction>({source});\r\n}\r\n\r\ninterface ActionEventMap extends BaseComponentEventMap {\r\n\trun: EvAction;\r\n\tchange: EvChange;\r\n}\r\n\r\ninterface ActionProps extends BaseComponentProps<ActionEventMap> {\r\n\tid?: any;\r\n\ttext?: string;\r\n\ticon?: IconID;\r\n\tdisabled?: boolean;\r\n\thidden?: boolean;\r\n\tchecked?: boolean;\r\n\r\n\trun: EventHandler<EvAction>;\r\n\tchange?: EventHandler<EvChange>;\r\n}\r\n\r\nexport class Action extends BaseComponent<ActionProps,ActionEventMap> {\r\n\r\n\tconstructor( props: ActionProps ) {\r\n\t\tsuper( props );\r\n\r\n\t\tthis.mapPropEvents( props, \"run\" );\r\n\t}\r\n\r\n\tget props( ) {\r\n\t\treturn this.m_props;\r\n\t}\r\n\r\n\tset text( t: string ) {\r\n\t\tthis.m_props.text = t;\r\n\t\tthis.emit( \"change\", EvChange(this) );\r\n\t}\r\n\r\n\tset icon( i: IconID ) {\r\n\t\tthis.m_props.icon = i;\r\n\t\tthis.emit( \"change\", EvChange(this) );\r\n\t}\r\n\r\n\tfire( ) {\r\n\t\tthis.emit( \"run\", EvAction(this) );\r\n\t}\r\n}\r\n\r\n", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file icon.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Component, CProps } from './component'\nimport { Stylesheet } from './styles'\nimport { HtmlString, isString } from './tools';\nimport { BasicEvent, EvChange, EventMap, EventSource } from './x4events';\n\n// ============================================================================\n// [ICON]\n// ============================================================================\n\n/**\n * iconID can be:\n * - \"url( <path to image> )\" ex: \"url(my/path/to/my/image.svg)\"\n * - \"var( <css variable> )\"\n * - \"cls( <font class> )\"\n * - \"char( <character> )\" ex: \"font-char( \\uf00d )\"\n */\n\nexport type IconID = string | number;\n\nexport interface IconProps extends CProps {\n\ticon: IconID;\n\tsize?: number;\n}\n\nexport interface EvLoaded extends BasicEvent {\n\turl: string;\n\tsvg: string;\n}\n\nexport function EvLoaded( url: string, svg: string, context = null ) {\n\treturn BasicEvent<EvLoaded>({ url, svg, context });\n}\n\ninterface LoadingEventMap extends EventMap {\n\tloaded: EvLoaded;\n}\n\nfunction trimQuotes( str:string ): string {\n\tconst l = str.length;\n\n\t//chrome\n\tif( str[0]=='\"' && str[l-1]=='\"' ) {\n\t\tstr = str.substring( 1, l-1 )\n\t\tstr = str.replaceAll( '\\\\\"', \"'\" );\n\t\treturn str;\n\t}\n\n\t//firefox\n\tif( str[0]==\"'\" && str[l-1]==\"'\" ) {\n\t\tstr = str.substring( 1, l-1 )\n\t\treturn str;\n\t}\n\n\treturn str;\n}\n\nclass Loader extends EventSource<LoadingEventMap> {\n\tsvgs: Map<string,string>;\n\n\tconstructor( ) {\n\t\tsuper( );\n\t\tthis.svgs = new Map( );\n\t}\n\n\tload( url: string ) {\n\t\tif( this.svgs.has(url) ) {\n\t\t\tconst svg = this.svgs.get( url );\n\t\t\tif( svg ) {\n\t\t\t\t//console.log( 'cached=', url );\n\t\t\t\tthis.signal( 'loaded', EvLoaded(url,svg) );\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// mark it as loading\n\t\t\tthis.svgs.set( url, null );\n\n\t\t\t// then start loading\n\t\t\tconst _load = async ( url ) => {\n\t\t\t\t\t\n\t\t\t\t// shortcut\n\t\t\t\tif( url.substring(0,24)==\"data:image/svg+xml;utf8,\") {\n\t\t\t\t\tconst svg = url.substring(24);\n\t\t\t\t\tthis.svgs.set( url, svg );\n\t\t\t\t\tthis.signal( 'loaded', EvLoaded(url,svg) );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tconst r = await fetch( url );\n\t\t\t\t\tif( r.ok ) {\n\t\t\t\t\t\tconst svg = await r.text();\n\t\t\t\t\t\t// check response, must be svg\n\t\t\t\t\t\t//TODO: find better\n\t\t\t\t\t\tif (!svg.startsWith(\"<svg\") && !svg.startsWith('<?xml') ) {\n\t\t\t\t\t\t\tconsole.error( \"svg loading error (svg files must start with <svg... ): \", svg );\n\t\t\t\t\t\t\tthis.signal( 'loaded', EvLoaded(url,\"\") );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tthis.svgs.set( url, svg );\n\t\t\t\t\t\t\tthis.signal( 'loaded', EvLoaded(url,svg) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_load( url );\t\t\t\n\t\t}\n\t}\n}\n\nconst svgLoader = new Loader( );\n\n\n/**\n * standard icon\n */\nexport class Icon extends Component<IconProps>\n{\n\tprivate m_icon: string;\n\tprivate m_iconName: IconID;\n\n\tconstructor( props: IconProps | string ) {\n\n\t\tif( isString(props) ) {\n\t\t\tsuper( { icon: props } );\n\t\t}\n\t\telse {\n\t\t\tsuper( props );\n\t\t}\n\n\t\tthis._setIcon( this.m_props.icon, false );\n\t\tif( this.m_props.size ) {\n\t\t\tthis.setStyleValue( 'fontSize', this.m_props.size );\n\t\t}\n\t}\n\n\tprivate _setIcon(icon: IconID, remove_old: boolean) {\n\n\t\tif( !icon ) {\n\t\t\tthis.m_iconName = '';\n\t\t\treturn;\n\t\t}\n\n\t\tthis.removeClass( '@svg' );\n\n\t\t//\ttodo: deprecated\n\t\tlet name, url: string;\n\t\tif (typeof (icon) === 'number') {\n\t\t\ticon = icon.toString(16);\n\t\t\tname = icon;\n\t\t\tconsole.error( \"deprecation error: invalid icon name\" );\t\n\t\t}\n\t\telse {\n\t\t\t// var( <var-name> )\n\t\t\t//\t\n\t\t\t//\tin the .css\n\t\t\t// --------------------------\n\t\t\t//\t:root {\n\t\t\t//\t\t--chevron-up: data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\"><path d=\"M0 96C0 78.33 14.33 64 32 64H416C433.7 64 448 78.33 448 96C448 113.7 433.7 128 416 128H32C14.33 128 0 113.7 0 96z\"/></svg>';\n\t\t\t//\t}\n\t\t\t//\n\t\t\t//\tvar( \"--chevron-up\" )\n\t\t\tconst reVar = /\\s*var\\s*\\(\\s*(.+)\\s*\\)\\s*/gi;\n\t\t\tlet match_var = reVar.exec( icon );\n\t\t\twhile( match_var ) {\n\t\t\t\tconst varname = match_var[1].trim( );\n\t\t\t\ticon = (Stylesheet.getVar(varname) as string).trim( );\n if (icon == '' || icon === undefined) {\n\t\t\t\t\tconsole.error( `icon: unable to find variable named '${varname}'` );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ticon = trimQuotes( icon );\n\t\t\t\t}\n\n\t\t\t\tmatch_var = reVar.exec( icon );\n\t\t\t}\n\n\t\t\t// <svg ...>\n\t\t\tif( icon.startsWith('<svg') ) {\n\t\t\t\tthis._setSVG( 'data:image/svg+xml;utf8,'+icon);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\t//\tsvg( <svg-filename> )\t-> \tsvg( \"mysvgfile.svg\" )\t\n\t\t\t//\t<svg-filename>.svg \t\t-> \"mysvgfile.svg\"\n\n\t\t\tconst reSvg = /\\s*svg\\s*\\(\\s*(.+)\\s*\\)\\s*/gi;\n\t\t\tconst reSvg2 = /(.*\\.svg)$/gi;\n\t\t\t\n\t\t\tlet match_svg = reSvg.exec( icon ) || reSvg2.exec(icon);\n\t\t\tif( match_svg ) {\n\t\t\t\tconst url = match_svg[1].trim( );\n\t\t\t\tthis._setSVG( url );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t//\tdata( <direct> )\n\t\t\t//\tdata( \"data:image/svg+xml;utf8,<svg...></svg>\" )\n\n\t\t\tconst reSvg4 = /^\\s*(data\\:image\\/.+)\\s*$/gi;\n\t\t\tlet match_dta = reSvg4.exec( icon );\n\t\t\tif( match_dta ) {\n\t\t\t\tthis._setSVG( match_dta[1] );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\t//\tcls( \"fas fa-angle-up\" )\n\t\t\t//\n\t\t\tconst reCls = /\\s*cls\\s*\\(\\s*(.+)\\s*\\)\\s*/gi;\n\t\t\tlet match_cls = reCls.exec( icon );\n\t\t\tif( match_cls ) {\n\t\t\t\tconst classes = match_cls[1].trim( );\n\t\t\t\tthis.addClass( classes );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\t//\turl( \"www.google.com\" )\n\t\t\t//\n\t\t\tconst reUrl = /\\s*url\\s*\\(\\s*(.+)\\s*\\)\\s*/gi;\n\t\t\tlet match_url = reUrl.exec( icon );\n\t\t\tif( match_url ) {\n\t\t\t\turl = trimQuotes( match_url[1].trim( ) );\n\t\t\t\t// this value is escaped\t\t\t\t\n\t\t\t\turl = url.replaceAll( \"\\\\\", \"\" );\n\t\t\t\tthis._setSVG( url );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t//\turl( \"www.google.com\" )\n\t\t\t//\n\t\t\tconst reChar = /\\s*font-char\\s*\\(\\s*(.+)\\s*\\)\\s*/gi;\n\t\t\tlet match_char = reChar.exec( icon );\n\t\t\tif( match_char ) {\n\t\t\t\tthis.removeClass( '@svg-icon' );\n\t\t\t\tthis.setContent( match_char[1], false );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\telse {\n\t\t\t\t// todo: deprecated\n\t\t\t\tconsole.error( \"deprecation error: invalid icon name\" );\t\n\n\t\t\t\tname = icon;\n\t\t\t\ticon = Stylesheet.getVar( 'icon-'+icon ) as string;\n\n\t\t\t\tif( icon=='' || icon===undefined ) { \n\t\t\t\t\t// name your icon 'icon-xxx'\n\t\t\t\t\t// ex:\n\t\t\t\t\t// :root { --icon-zoom-p: f00e; }\n\t\t\t\t\ticon = '0'; \n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.m_iconName = name;\n\t\tif( this.m_icon===icon ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet css = Component.getCss(),\n\t\t\trulename: string;\n\n\t\tif (remove_old && this.m_icon) {\n\t\t\trulename = 'icon-' + name;\n\t\t\tthis.removeClass(rulename);\n\t\t}\n\t\t\t\t\n\t\t// generate dynamic css icon rule\n\t\trulename = 'icon-' + name;\n\t\t\n\t\tif( Icon.icon_cache[rulename]===undefined ) {\n\t\t\tIcon.icon_cache[rulename] = true;\n\n\t\t\tlet rule: string;\n\n\t\t\tif( url ) {\n\t\t\t\trule = `display: block; content: ' '; background-image: url(${url}); background-size: contain; width: 100%; height: 100%; background-repeat: no-repeat; color: white;`;\n\t\t\t}\n\t\t\telse {\n\t\t\t\trule = `content: \"\\\\${icon}\";`;\n\t\t\t}\n\n\t\t\tcss.setRule(rulename, `.${rulename}::before {${rule}}`);\n\t\t}\n\n\t\tthis.addClass(rulename);\n\t\tthis.m_icon = icon;\n\t}\n\n\t/**\n\t * change the icon\n\t * @param icon - new icon\n\t */\n\t\n\tpublic set icon( icon: IconID ) {\n\t\tthis._setIcon( icon, true );\n\t}\n\n\tpublic get icon( ) : IconID {\n\t\treturn this.m_iconName;\n\t}\n\n\tprivate _setSVG( url: string ) {\n\n\t\tconst set = ( ev: EvLoaded ) => {\n\t\t\t//console.log( 'set=', ev.url, 'url=', url );\n\t\t\t\n\t\t\tif( ev.url==url ) {\n\t\t\t\tthis.addClass( '@svg-icon' );\n\t\t\t\tthis.setContent( HtmlString.from(ev.svg), false );\n\t\t\t\tsvgLoader.off( 'loaded', set );\n\t\t\t}\n\t\t}\n\n\t\tsvgLoader.on( 'loaded', set );\n\t\tsvgLoader.load( url );\n\t}\n\n\t/**\n\t * todo: try to extract viewbox\n\t */\n\n\tprivate _setSVGPath( pth: string ) {\n\t\tthis.addClass( '@svg-icon' );\n\t\tthis.setContent( HtmlString.from(`<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"currentColor\"><path d=\"${pth}/></svg>`), false );\n\t}\n\n\t/**\n\t * \n\t */\n\t\n\tprivate static icon_cache = [];\n}\n\n", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file label.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Component, CProps } from './component'\nimport { escapeHtml, HtmlString } from './tools'\nimport { Icon, IconID } from './icon'\n\n// ============================================================================\n// [LABEL]\n// ============================================================================\n\nexport interface LabelProps extends CProps {\n\ttext: string | HtmlString;\n\ticon?: IconID;\n\talign?: 'left' | 'right' | 'center';\n\tmultiline?: boolean;\t// understand \\n as newlines\n}\n\n/**\n * Standard label \n */\n\nexport class Label extends Component<LabelProps>\n{\n\t/**\n\t * double constructor, from string/html or as usual\n\t */\n\n\tconstructor( props: LabelProps );\n\tconstructor( text: string | HtmlString );\n\tconstructor( param: any ) {\n\n\t\tif( typeof(param)==='string' || param instanceof HtmlString ) {\n\t\t\tsuper( { text: param } );\n\t\t}\n\t\telse {\n\t\t\tsuper( param );\n\t\t}\n\t}\n\n\t/** @ignore */\n\trender( props: LabelProps ) {\n\n\t\tlet text: any = this.m_props.text;\n\t\tif( this.m_props.multiline && !(text instanceof HtmlString) ) {\n\t\t\ttext = new HtmlString( escapeHtml(text,true) );\n\t\t}\n\n\t\tif( !props.icon ) {\n\t\t\tthis.setContent( text );\n\t\t}\n\t\telse {\n\t\t\tthis.setTag( 'span' );\n\t\t\tthis.addClass( '@hlayout' );\n\n\t\t\tthis.setContent( [\n\t\t\t\tnew Icon( { id: 'l_icon', icon: props.icon } ),\n\t\t\t\tnew Component( { content: text, ref: 'text' } )\n\t\t\t] );\n\t\t}\n\n\t\tthis.addClass( props.align ?? 'left' );\n\t}\n\n\t/**\n\t * change the displayed text\n\t * @param text - new text\n\t */\n\n\tpublic set text( txt: string | HtmlString ) {\n\n\t\tlet props = this.m_props;\t\n\n\t\tif( props.text!==txt ) {\n\t\t\tprops.text = txt;\n\n\t\t\tlet text: any = this.m_props.text;\n\t\t\tif( this.m_props.multiline && !(text instanceof HtmlString) ) {\n\t\t\t\ttext = new HtmlString(escapeHtml(text,true) );\n\t\t\t}\n\n\t\t\tif( this.dom ) {\n\n\t\t\t\tlet comp: Component = this;\n\t\t\t\tif( this.m_props.icon ) {\n\t\t\t\t\tcomp = this.itemWithRef<Component>( 'text' );\n\t\t\t\t}\n\n\t\t\t\tcomp.setContent( text );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic get text( ) : string | HtmlString {\n\t\treturn this.m_props.text;\n\t}\n\n\t/**\n\t * change the displayed icon\n\t * @param icon - new icon\n\t */\n\n\tpublic set icon( icon: IconID ) {\n\t\tthis.m_props.icon = icon;\n\t\tlet ico = this.itemWithRef<Icon>('l_icon');\n\t\tif (ico) {\n\t\t\tico.icon = icon;\n\t\t}\n\t\telse {\n\t\t\tthis.update( 0 );\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic get icon( ) : IconID {\n\t\tlet ico = this.itemWithRef<Icon>('l_icon');\n\t\treturn ico?.icon;\n\t}\n}\n\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file menu.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\n\nimport { CEventMap, Component, CProps } from './component'\nimport { EvClick, EventCallback } from './x4events'\n\nimport { Action } from './action'\n\nimport { Popup, PopupProps } from './popup'\nimport { Icon, IconID } from './icon'\nimport { Label } from './label'\nimport { HLayout } from './layout'\nimport { isString, getMousePos } from './tools'\n\n// ============================================================================\n// [MENU]\n// ============================================================================\n\nexport class MenuSeparator extends Component {\n}\n\nexport class MenuTitle extends Label {\n}\n\n\n/**\n * Standard Menu\n */\n\nexport type MenuOrSep = MenuItem | MenuSeparator | MenuTitle;\n\nexport interface MenuProps extends PopupProps {\n\titems?: MenuOrSep[];\n}\n\nexport class Menu extends Popup<MenuProps>\n{\n\tprivate static watchCount: number = 0;\n\tprivate static rootMenu: Menu = null;\n\n\tprotected m_subMenu: Menu;\n\tprotected m_opener: MenuItem;\n\tprotected m_virtual: boolean;\n\tprotected m_lock: number;\n\n\tconstructor(props: MenuProps, opener?: MenuItem) {\n\t\tsuper(props);\n\n\t\tthis.addClass('@shadow');\n\n\t\tthis.m_opener = opener;\n\t\tthis.m_virtual = false;\n\t\tthis.m_lock = 0;\n\n\t\tthis.enableMask(false);\n\t}\n\n\tlock(yes: boolean) {\n\t\tthis.m_lock += yes ? 1 : -1;\n\t}\n\n\tsetVirtual() {\n\t\tthis.m_virtual = true;\n\t}\n\n\tsetSubMenu(menu: Menu) {\n\t\tthis.m_subMenu = menu;\n\t}\n\n\thideSubMenu() {\n\t\tif (this.m_subMenu) {\n\t\t\tthis.m_subMenu.m_opener._close();\n\t\t\tthis.m_subMenu.hide();\n\t\t\tthis.m_subMenu = null;\n\t\t}\n\t}\n\n\t/** @ignore */\n\trender(props: MenuProps) {\n\t\tthis.setContent(props.items);\n\t}\n\n\t/**\n\t* \n\t*/\n\n\tpublic show() {\n\t\tif (!this.m_virtual) {\n\t\t\tMenu._addMenu(this);\n\t\t}\n\n\t\tsuper.show();\n\t}\n\n\t/**\n\t * \n\t*/\n\n\tpublic close() {\n\n\t\tif (!this.dom && !this.m_virtual) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.m_opener) {\n\t\t\tthis.m_opener._close();\n\t\t}\n\n\t\tif (this.m_subMenu) {\n\t\t\tthis.m_subMenu.close();\n\t\t\tthis.m_subMenu = null;\n\t\t}\n\n\t\tsuper.close();\n\t\tMenu._removeMenu();\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic clear() {\n\t\tthis.m_props.items = [];\n\t}\n\n\t/**\n\t* @internal\n\t*/\n\n\tpublic static _addMenu(menu) {\n\t\t//console.log( 'addmenu' );\n\t\tif (Menu.watchCount == 0) {\n\t\t\tMenu.rootMenu = menu;\n\t\t\tx4document.addEventListener('mousedown', Menu._mouseWatcher);\n\t\t}\n\n\t\tMenu.watchCount++;\n\t}\n\n\tpublic static _removeMenu() {\n\t\t//console.log( 'removemenu' );\n\t\tconsole.assert(Menu.watchCount > 0);\n\t\tMenu.watchCount--;\n\n\t\tif (Menu.watchCount == 0) {\n\t\t\tx4document.removeEventListener('mousedown', Menu._mouseWatcher);\n\t\t}\n\t}\n\n\tprivate static _mouseWatcher(ev: MouseEvent) {\n\t\tif (ev.defaultPrevented) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet elOn = <HTMLElement>ev.target;\n\n\t\twhile (elOn) {\n\t\t\t// is mouse on a menu\n\t\t\tlet mouseon = Component.getElement(elOn);\n\t\t\tif (mouseon && (mouseon instanceof Menu /*|| elOn.$el instanceof Menubar*/)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\telOn = elOn.parentElement;\n\t\t}\n\n\t\tMenu._discardAll();\n\t}\n\n\t/**\n\t* hide all the visible menus\n\t*/\n\n\tpublic static _discardAll() {\n\t\tif (Menu.rootMenu) {\n\t\t\tMenu.rootMenu.close();\n\t\t\tMenu.rootMenu = null;\n\t\t}\n\t}\n\n\tpublic displayAt(ev: UIEvent): void;\n\tpublic displayAt(x: number, y?: number, align?: string, offset?: { x, y }): void;\n\tpublic displayAt(...args) {\n\n\t\tif (!this.m_lock) {\n\t\t\tMenu._discardAll();\n\t\t}\n\n\t\tlet x, y, align, offset;\n\n\t\tif (args.length == 1) {\n\t\t\t({ x, y } = getMousePos(args[0], true));\n\t\t}\n\t\telse {\n\t\t\t[x, y, align, offset] = args;\n\t\t}\n\n\t\tif (!align) {\n\t\t\talign = 'top left';\n\t\t}\n\n\t\tsuper.displayAt(x, y, align, offset);\n\t}\n}\n\n/**\n * MENU ITEM\n */\n\ninterface MenuItemEventMap extends CEventMap {\n\tclick: EvClick;\n}\n\nexport interface MenuItemProps extends CProps {\n\titemId?: any;\n\ttext?: string;\n\ticon?: IconID;\t\t// pass -1 to avoid space for icon\n\titems?: MenuOrSep[];\n\tchecked?: boolean;\n\tcls?: string;\n\tclick?: EventCallback<EvClick>;\t// shortcut to events: { click ... }\n\n\taction?: Action;\n}\n\n\n\nexport class MenuItem extends Component<MenuItemProps, MenuItemEventMap> {\n\n\tprivate m_menu: Menu;\n\tprivate m_isOpen: boolean;\n\tprivate m_action: Action;\n\n\tconstructor(action: Action);\n\tconstructor(text: string, click: EventCallback<EvClick>);\n\tconstructor(props: MenuItemProps);\n\tconstructor(a, b?) {\n\n\t\tif (a instanceof Action) {\n\t\t\tsuper({\n\t\t\t\tclick: () => { a.fire(); }\n\t\t\t});\n\n\t\t\tthis.m_action = a;\n\t\t}\n\t\telse if (isString(a)) {\n\t\t\tsuper({\n\t\t\t\ttext: a,\n\t\t\t\tclick: b\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tsuper(a);\n\t\t}\n\n\t\tthis.mapPropEvents(this.m_props, 'click');\n\n\t\tthis.m_menu = null;\n\t\tthis.m_isOpen = false;\n\n\t\tthis.setDomEvent('mousedown', (e) => this._mousedown(e));\n\t\tthis.setDomEvent('click', (e) => this._click(e));\n\t}\n\n\t/** @ignore */\n\trender(props: MenuItemProps) {\n\n\t\tlet icon = props.icon ?? 0;\n\t\tlet text = props.text;\n\n\t\tif (props.checked !== undefined) {\n\t\t\ticon = props.checked ? 'var( --x4-icon-check )' : 0;\n\t\t}\n\n\t\tif (this.m_action) {\n\t\t\tif (!icon) {\n\t\t\t\ticon = this.m_action.props.icon;\n\t\t\t}\n\n\t\t\tif (text === undefined) {\n\t\t\t\ttext = this.m_action.props.text;\n\t\t\t}\n\t\t}\n\n\t\tlet popIco = null;\n\t\tif (this.isPopup) {\n\t\t\tthis.addClass('@popup-menu-item');\n\t\t\tpopIco = new Icon({ icon: \"var( --x4-icon-chevron-right )\", cls: \"pop-mark\" });\n\t\t}\n\n\t\tif (!text && !icon) {\n\t\t\tthis.addClass('@separator');\n\t\t}\n\n\t\tif (props.cls) {\n\t\t\tthis.addClass(props.cls);\n\t\t}\n\n\t\tthis.setTag('a');\n\t\t//@bug: do not kill focus on click \n\t\t//\tthis.setAttribute( 'tabindex', '0' );\n\n\t\tthis.setContent([\n\t\t\ticon ? new Icon({ icon }) : null,\n\t\t\tnew Label({ flex: 1, text }),\n\t\t\tpopIco\n\t\t]);\n\t}\n\n\tget id(): any {\n\t\treturn this.m_props.itemId;\n\t}\n\n\tget text(): string {\n\t\treturn this.m_props.text;\n\t}\n\n\tget isPopup(): boolean {\n\t\treturn !!this.m_props.items;\n\t}\n\n\tpublic _close() {\n\t\tthis.removeClass('@opened');\n\t\tthis.m_isOpen = false;\n\t}\n\n\tprotected _click(ev: MouseEvent) {\n\t\tif (!this.isPopup) {\n\t\t\tthis.emit('click', EvClick());\n\t\t\tMenu._discardAll();\n\t\t}\n\t}\n\n\tprotected _mousedown(ev: MouseEvent) {\n\n\t\tif (this.isPopup) {\n\t\t\tif (!this.m_menu) {\n\t\t\t\tthis.m_menu = new Menu({ items: this.m_props.items }, this);\n\t\t\t}\n\n\t\t\tlet doClose = this.m_isOpen;\n\n\t\t\t// if parent menu has an opened sub menu, close it\n\t\t\tlet parent_menu = Component.getElement(this.dom, Menu);\n\n\t\t\tif (parent_menu) {\n\t\t\t\tparent_menu.hideSubMenu();\n\t\t\t}\n\n\t\t\tif (!doClose) {\n\t\t\t\tif (parent_menu) {\n\t\t\t\t\tparent_menu.setSubMenu(this.m_menu);\n\t\t\t\t}\n\n\t\t\t\tthis.m_isOpen = true;\n\n\t\t\t\tlet rc = this.getBoundingRect();\n\n\t\t\t\tthis.m_menu.lock(true);\n\t\t\t\tif (parent_menu) {\n\t\t\t\t\t// standard menu\n\t\t\t\t\tthis.m_menu.displayAt(rc.right, rc.top);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// menubar / menubutton\n\t\t\t\t\tthis.m_menu.displayAt(rc.left, rc.bottom);\n\t\t\t\t}\n\t\t\t\tthis.m_menu.lock(false);\n\t\t\t\tthis.addClass('@opened');\n\t\t\t}\n\n\t\t\tev.preventDefault();\n\t\t}\n\t}\n}\n\n/**\n * \n */\n\nexport class MenuBar extends HLayout {\n\tprotected m_items: MenuOrSep[];\n\n\tconstructor(props: MenuProps, opener?: MenuItem) {\n\t\tsuper(props);\n\n\t\tconsole.assert(false, 'not imp');\n\n\t\tthis.addClass('@shadow');\n\t\tthis.m_items = props.items;\n\t}\n\n\t/** @ignore */\n\trender() {\n\t\tthis.setContent(this.m_items);\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file listview.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\n\nimport { Container, Component, ContainerProps, ContainerEventMap, EvDblClick } from './component'\nimport { IconID } from './icon';\nimport { HLayout, VLayout } from './layout'\nimport { Popup, PopupEventMap, PopupProps } from './popup';\nimport { HtmlString, isFunction } from './tools';\nimport { Menu, MenuItem } from \"./menu\";\n\nimport { EvContextMenu, EvSelectionChange, EvClick, EventCallback, BasicEvent, EvChange } from \"./x4events\";\n\n/**\n * item definition\n */\n\nexport interface ListViewItem {\n\tid: any;\n\ttext?: string | HtmlString;\t\t// if you need pure text\n\thtml?: boolean;\t\t// if text is html\n\ticon?: IconID;\n\tdata?: any;\n};\n\n/**\n * callback to render item\n */\n\nexport interface RenderListItem {\n\t(item: ListViewItem): any;\n}\n\n/**\n * callback to fill the list\n */\nexport interface PopulateItems {\n\t( filter: string ): ListViewItem[];\n}\n\n/**\n * listview can generate these events\n */\n\nexport interface ListViewEventMap extends ContainerEventMap {\n\tclick?: EvClick;\n\tdblClick?: EvDblClick;\n\tcontextMenu?: EvContextMenu;\n\tselectionChange?: EvSelectionChange;\n\tcancel?: EvCancel;\n}\n\n\n/**\n * listview properties\n */\nexport interface ListViewProps<E extends ListViewEventMap = ListViewEventMap> extends ContainerProps<E> {\n\titems?: ListViewItem[];\n\tpopulate?: PopulateItems;\n\tgadgets?: Component[]; // gadgets to instert at bottom\n\n\tvirtual?: boolean;\t// if true, items will be rendered on demand\n\titemHeight?: number;\t// in case of a virtual list, item height\n\n\trenderItem?: RenderListItem;\n\n\tclick?: EventCallback<EvClick>;\t// shortcut to events: { click: ... }\n\tdblClick?: EventCallback<EvDblClick>;// shortcut to events: { dblClick: ... }\n\tcontextMenu?: EventCallback<EvContextMenu>;// shortcut to events: { contentMenu: ... }\n\tselectionChange?: EventCallback<EvSelectionChange>;// shortcut to events: { selectionChange: ... }\n\tcancel?: EventCallback<EvCancel>;\t// shortcut to events: { cancel: ... }\n}\n\n/**\n * Standard listview class\n */\n\nexport class ListView extends VLayout<ListViewProps,ListViewEventMap> {\n\n\tprotected m_selection: {\n\t\titem: ListViewItem;\n\t\tcitem: Component;\n\t}\n\n\tprotected m_defer_sel: any;\n\n\tprotected m_container: Container;\n\tprotected m_view: Container;\n\n\tprotected m_topIndex: number;\n\tprotected m_itemHeight: number;\n\n\tprotected m_cache: Map<number, Component>; // recycling elements\n\n\tconstructor(props: ListViewProps) {\n\t\tsuper(props);\n\n\t\tthis.setDomEvent('keydown', (e) => this.handleKey(e));\n\t\tthis.setDomEvent('click', (e) => this._handleClick(e));\n\t\tthis.setDomEvent('dblclick', (e) => this._handleClick(e));\n\t\tthis.setDomEvent('contextmenu', (e) => this._handleCtxMenu(e));\n\n\t\tthis._setTabIndex(props.tabIndex, 0);\n\t\tthis.mapPropEvents(props, 'click', 'dblClick', 'contextMenu', 'selectionChange', 'cancel' );\n\t}\n\n\tcomponentCreated() {\n\n\t\tif (this.m_props.virtual) {\n\t\t\tthis._buildItems();\n\t\t}\n\t\telse if( this.m_props.populate ) {\n\t\t\tthis.items = this.m_props.populate( null );\n\t\t}\n\t}\n\n\trender(props: ListViewProps) {\n\n\t\tprops.items = props.items || [];\n\t\tprops.gadgets = props.gadgets;\n\t\tprops.renderItem = props.renderItem;\n\t\tprops.virtual = props.virtual ?? false;\n\n\t\tthis.m_topIndex = 0;\n\n\t\tif (props.virtual) {\n\t\t\tconsole.assert(props.itemHeight !== undefined);\n\t\t\tthis.m_itemHeight = props.itemHeight;\n\t\t\tthis.m_cache = new Map<number, Component>();\n\t\t\tthis.addClass('virtual');\n\t\t}\n\t\telse {\n\t\t\tthis.m_itemHeight = undefined;\n\t\t\tthis.m_cache = undefined;\n\t\t}\n\n\t\tthis._buildContent();\n\t}\n\n\t/**\n\t * change the list of item displayed\n\t * @param items - new array of items\n\t * @deprecated\n\t */\n\n\tpublic set items(items: ListViewItem[]) {\n\t\tthis.setItems( items );\n\t}\n\n\tpublic get items( ) {\n\t\treturn this.m_props.items;\n\t}\n\n\t/**\n\t * change the list of item displayed\n\t * @param items - new array of items\n\t */\n\t\n\tpublic setItems( items: ListViewItem[], keepSel = true ) {\n\t\tthis.m_props.items = items;\n\n\t\tif( !keepSel ) {\n\t\t\tthis.m_selection = null;\n\t\t}\n\t\t\n\t\tif( !this.m_container ) {\n\t\t\tthis._buildContent( );\n\t\t}\n\t\telse {\n\t\t\tthis._buildItems( );\n\t\t}\n\t}\n\n\tpublic handleKey(ev: KeyboardEvent) {\n\n\t\tlet moveSel = (sens) => {\n\n\t\t\tlet items: ListViewItem[];\n\t\t\tif (isFunction(this.m_props.items)) {\n\t\t\t\titems = this.m_props.items();\n\t\t\t\tthis.m_props.items = items;\n\t\t\t}\n\t\t\telse {\n\t\t\t\titems = this.m_props.items;\n\t\t\t}\n\n\t\t\tlet newsel: ListViewItem;\n\t\t\tif (!this.m_selection) {\n\t\t\t\tif (items) {\n\t\t\t\t\tnewsel = items[0];\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet index = items.findIndex((item) => item === this.m_selection.item);\n\t\t\t\tif (sens > 0 && index < (items.length - 1)) {\n\t\t\t\t\tnewsel = items[index + 1];\n\t\t\t\t}\n\t\t\t\telse if (sens < 0 && index > 0) {\n\t\t\t\t\tnewsel = items[index - 1];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tnewsel = this.selection\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet citem = this._findItemWithId(newsel?.id);\n\t\t\tthis._selectItem(newsel, citem, true);\n\t\t}\n\n\t\tswitch (ev.key) {\n\t\t\tcase 'ArrowDown': {\n\t\t\t\tmoveSel(1);\n\t\t\t\tev.preventDefault( );\n\t\t\t\tev.stopPropagation();\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'ArrowUp': {\n\t\t\t\tmoveSel(-1);\n\t\t\t\tev.preventDefault( );\n\t\t\t\tev.stopPropagation();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/** @ignore */\n\tprivate _buildContent() {\n\n\t\tlet props = this.m_props;\n\n\t\tif (props.virtual) {\n\t\t\tthis.m_container = new Container({\n\t\t\t\tcls: '@scroll-container',\n\t\t\t\tcontent: []\n\t\t\t});\n\n\t\t\tthis.m_view = new Container({\n\t\t\t\tcls: '@scroll-view',\n\t\t\t\tflex: 1,\n\t\t\t\tcontent: this.m_container,\n\t\t\t\tdom_events: {\n\t\t\t\t\tsizechange: () => this._updateScroll(true),\n\t\t\t\t\tscroll: () => this._updateScroll(false),\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.setContent(\n\t\t\t\t[\n\t\t\t\t\tthis.m_view,\n\t\t\t\t\tprops.gadgets ? new HLayout({\n\t\t\t\t\t\tcls: 'gadgets',\n\t\t\t\t\t\tcontent: props.gadgets\n\t\t\t\t\t}) : null,\n\t\t\t\t]\n\t\t\t);\n\t\t}\n\t\telse {\n\t\t\tthis.m_view = undefined;\n\t\t\tthis.m_container = new VLayout({\n\t\t\t\tcls: '@scroll-container',\n\t\t\t\tcontent: []\n\t\t\t});\n\n\t\t\tthis.addClass('@scroll-view');\n\t\t\tthis.setContent(this.m_container, false);\n\t\t}\n\n\t\tif (props.virtual) {\n\t\t\tthis.m_container.setStyleValue('height', props.items.length * this.m_itemHeight);\n\t\t}\n\n\t\tif (this.dom || !props.virtual ) {\n\t\t\tthis._buildItems();\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _updateScroll(forceUpdate: boolean) {\n\n\t\tconst update = () => {\n\t\t\tlet newTop = Math.floor(this.m_view.dom.scrollTop / this.m_itemHeight);\n\n\t\t\tif (newTop != this.m_topIndex || forceUpdate) {\n\t\t\t\tthis.m_topIndex = newTop;\n\t\t\t\tthis._buildItems();\n\t\t\t}\n\t\t}\n\n\t\tif (forceUpdate) {\n\t\t\tthis.startTimer('scroll', 10, false, update);\n\t\t}\n\t\telse {\n\t\t\tupdate();\n\t\t}\n\t}\n\n\tprivate async _buildItems() {\n\t\tlet props = this.m_props;\n\t\tlet items: Component[] = [];\n\n\t\tlet list_items = props.items;\n\t\tif (isFunction(list_items)) {\n\t\t\tlist_items = list_items();\n\t\t}\n\n\t\tlet selId = this.m_selection?.item.id;\n\t\tlet selFnd = false;\n\n\t\tif (props.virtual) {\n\t\t\tlet rc = this.getBoundingRect();\n\t\t\tlet limit = 100;\n\n\t\t\tlet y = 0;\n\t\t\tlet top = this.m_topIndex * this.m_itemHeight;\n\t\t\tlet index = this.m_topIndex;\n\t\t\tlet height = rc.height;\n\t\t\tlet count = props.items.length;\n\n\t\t\tlet newels = [];\n\n\t\t\tlet cache = this.m_cache;\n\t\t\tthis.m_cache = new Map<number, Component>();\n\n\t\t\twhile (y < height && index < count && --limit > 0) {\n\n\t\t\t\tlet it = props.items[index];\n\t\t\t\tlet itm: Component;\n\n\t\t\t\tif (cache.has(it.id)) {\n\t\t\t\t\titm = cache.get(it.id);\t// reuse it\n\t\t\t\t\tcache.delete(it.id);\t\t// cache will contain only elements to remove\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\titm = this._renderItem(it);\n\t\t\t\t\tnewels.push(itm);\n\t\t\t\t}\n\n\t\t\t\tif (selId == it.id) {\n\t\t\t\t\titm.addClass('@selected');\n\t\t\t\t\tselFnd = true;\n\t\t\t\t}\n\n\t\t\t\titm.setStyleValue('top', top + y);\n\t\t\t\titems.push(itm);\n\n\t\t\t\tthis.m_cache.set(it.id, itm);\t// keep it for next time\n\n\t\t\t\ty += this.m_itemHeight;\n\t\t\t\tindex++;\n\t\t\t}\n\n\t\t\t// all element remaining here are to remove\n\t\t\tcache.forEach((c) => {\n\t\t\t\tc.dispose();\n\t\t\t});\n\n\t\t\t//\tappend new elements\n\t\t\tthis.m_container.appendChild(newels);\n\t\t\tthis.m_container.setStyleValue( 'height', count*this.m_itemHeight );\n\n\t\t\t// check that it's still existing\n\t\t\tif( !selFnd ) {\n\t\t\t\tif( !list_items.some( it => selId == it.id ) ) {\n\t\t\t\t\tthis.m_selection = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t\telse {\n\t\t\tlist_items.forEach((it) => {\n\t\t\t\tlet itm = this._renderItem(it);\n\t\t\t\tif (selId == it.id) {\n\t\t\t\t\titm.addClass('@selected');\n\t\t\t\t\tselFnd = true;\n\t\t\t\t}\n\n\t\t\t\titems.push(itm);\n\t\t\t});\n\n\t\t\tthis.m_container.setContent(items, false);\n\n\t\t\tif( !selFnd ) {\n\t\t\t\tthis.m_selection = null;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (this.m_defer_sel) {\n\t\t\tlet t = this.m_defer_sel;\n\t\t\tthis.m_defer_sel = undefined;\n\t\t\tthis.selection = t;\n\t\t}\n\t}\n\n\t/** @ignore \n\t * default rendering of an item\n\t */\n\n\tprivate _renderItem(item: ListViewItem): Component {\n\t\t\n\t\tconst newItem = this.onRenderItem( item );\n\n\t\tnewItem.setAttribute( 'data-id', item.id );\n\t\tnewItem.addClass('@list-item');\n\t\tnewItem.setData('item-id', item.id);\n\t\t\t\t\t\n\t\treturn newItem;\n\t}\n\n\tonRenderItem( item: ListViewItem): Component {\n\t\tif (this.m_props.renderItem) {\n\t\t\treturn this.m_props.renderItem(item);\n\t\t}\n\t\telse {\n\t\t\treturn new HLayout({ content: item.text });\n\t\t}\n\t}\n\n\t/** @ignore */\n\tprivate _handleClick(e: MouseEvent) {\n\n\t\te.stopImmediatePropagation();\n\t\te.preventDefault( );\n\t\t\n\t\tlet dom = e.target as HTMLElement,\n\t\t\tself = this.dom,\n\t\t\tlist_items = this.m_props.items as ListViewItem[];\t// already created by build\n\n\t\t// go up until we find something interesting\n\t\twhile (dom && dom != self) {\n\t\t\tlet itm = Component.getElement(dom),\n\t\t\t\tid = itm?.getData('item-id');\n\n\t\t\tif (id!==undefined) {\n\t\t\t\t// find the element\n\t\t\t\tlet item = list_items.find((item) => item.id == id);\n\t\t\t\tif (item) {\n\t\t\t\t\tlet event: BasicEvent;\n\t\t\t\t\tif (e.type == 'click') {\n\t\t\t\t\t\tevent = EvClick(item);\n\t\t\t\t\t\tthis.emit('click', event);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tevent = EvDblClick(item);\n\t\t\t\t\t\tthis.emit('dblClick', event);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!event.defaultPrevented) {\n\t\t\t\t\t\tthis._selectItem(item, itm);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis._selectItem(null, null);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdom = dom.parentElement;\n\t\t}\n\n\t\tthis._selectItem(null, null);\n\t}\n\n\t/** @ignore */\n\tprivate _handleCtxMenu(e: MouseEvent) {\n\n\t\te.preventDefault();\t\t\n\n\t\tlet dom = e.target as HTMLElement,\n\t\t\tself = this.dom,\n\t\t\tlist_items = this.m_props.items as ListViewItem[];\t// already created by build;\n\n\t\twhile (dom && dom != self) {\n\t\t\tlet itm = Component.getElement(dom),\n\t\t\t\tid = itm?.getData('item-id');\n\n\t\t\tif (id) {\n\n\t\t\t\t// find the element\n\t\t\t\tlet item = list_items.find((item) => item.id == id);\n\t\t\t\tif (item) {\n\t\t\t\t\tthis._selectItem(item, itm);\n\t\t\t\t\tthis.emit('contextMenu', EvContextMenu(e, item));\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdom = dom.parentElement;\n\t\t}\n\n\t\tthis.emit('contextMenu', EvContextMenu(e, null));\n\t}\n\n\t/**\n\t * @ignore\n\t * called when an item is selected by mouse\n\t */\n\n\tprotected _selectItem(item: ListViewItem, citem: Component, notify = true) {\n\n\t\tif (this.m_selection && this.m_selection.citem) {\n\t\t\tthis.m_selection.citem.removeClass('@selected');\n\t\t}\n\n\t\tthis.m_selection = item ? {\n\t\t\titem: item,\n\t\t\tcitem: citem\n\t\t} : null;\n\n\t\tif (this.m_selection && this.m_selection.citem) {\n\t\t\tthis.m_selection.citem.addClass('@selected');\n\t\t}\n\n\t\tif (notify) {\n\t\t\tthis.emit('selectionChange', EvSelectionChange(item));\n\t\t}\n\t}\n\n\t/**\n\t * return the current selection or null\n\t */\n\n\tpublic get selection() {\n\t\treturn this.m_selection ? this.m_selection.item : null;\n\t}\n\n\tpublic set selection(id: any) {\n\t\tif (id === null || id === undefined) {\n\t\t\tthis._selectItem(null, null);\n\t\t}\n\t\telse {\n\t\t\tif (isFunction(this.m_props.items)) {\n\t\t\t\tthis.m_defer_sel = id;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet item = this.m_props.items.find((item) => item.id == id);\n\t\t\t\tlet citem = this._findItemWithId(item.id);\n\t\t\t\tthis._selectItem(item, citem, false);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _findItemWithId(id: any) {\n\t\tlet citem: Component = null;\n\n\t\tif (this.dom) {\n\t\t\t// make the element visible to user\n\t\t\t// todo: problem with virtual listview\n\t\t\tthis.m_container.enumChilds((c: Component) => {\n\t\t\t\tif (c.getData('item-id') == id) {\n\t\t\t\t\tc.scrollIntoView();\n\t\t\t\t\tcitem = c;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\treturn citem;\n\t}\n\n\t/**\n\t * append or prepend a new item\n\t * @param item \n\t * @param prepend \n\t * @param select \n\t */\n\n\tappendItem( item: ListViewItem, prepend = false, select = true ) {\n\t\t\n\t\tif( prepend ) {\n\t\t\tthis.m_props.items.unshift( item );\n\t\t}\n\t\telse {\n\t\t\tthis.m_props.items.push( item );\n\t\t}\n\n\t\tif( select ) {\n\t\t\tthis.selection = null;\n\t\t}\n\n\t\tif( !this.m_container ) {\n\t\t\tthis._buildContent();\n\t\t}\n\t\telse {\n\t\t\tthis._buildItems();\n\t\t}\n\t\t\n\t\tif( select ) {\n\t\t\tthis.selection = item.id;\n\t\t}\n\t}\n\n\t/**\n\t * update an item\n\t */\n\n\t updateItem( id: any, item: ListViewItem ) {\n\n\t\t// find item\n\t\tconst idx = this.m_props.items.findIndex( itm => itm.id === id );\n\t\tif( idx<0 ) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t// take care of selection\n\t\tlet was_sel = false;\n\t\tif( this.m_selection && this.m_selection.item===this.m_props.items[idx] ) {\n\t\t\twas_sel = true;\n\t\t}\n\n\t\t// replace it in the list\n\t\tthis.m_props.items[idx] = item;\n\n\t\t// rebuild & replace it's line\n\t\tconst oldDOM = this.queryItem( `[data-id=\"${item.id}\"]` )?.dom;\n\t\tif( oldDOM ) {\n\t\t\tconst _new = this._renderItem( item );\n\n\t\t\tif( was_sel ) {\n\t\t\t\t_new.addClass( '@selected' );\n\t\t\t\tthis.m_selection.citem = _new;\n\t\t\t\tthis.m_selection.item = item;\n\t\t\t}\n\t\t\t\n\t\t\tconst newDOM = _new._build( );\n\t\t\tthis.m_container.dom.replaceChild( newDOM, oldDOM );\n\t\t}\n\t}\n\n\t\n}\n\n\n\n/**\n * Cancel Event\n */\n\nexport interface EvCancel extends BasicEvent {\n}\n\nexport function EvCancel( context = null ) {\n\treturn BasicEvent<EvCancel>({ context });\n}\n\ninterface PopupListViewEventMap extends PopupEventMap {\n\tcancel: EvCancel;\n}\n\ninterface PopupListViewProps extends PopupProps<PopupListViewEventMap> {\n\n}\n\n\n/**\n * \n */\n\nexport class PopupListView extends Popup<PopupListViewProps,PopupListViewEventMap> {\n\n\tm_list: ListView;\n\n\tconstructor(props: ListViewProps) {\n\t\tsuper({ tabIndex: false });\n\n\t\tthis.enableMask(false);\n\t\tthis.addClass( \"@non-maskable\" );\n\n\t\tprops.tabIndex = false;\n\t\tthis.m_list = new ListView(props);\n\t\t//this.m_list.addClass( '@fit' );\n\n\t\tthis.setContent(this.m_list);\n\t\tthis.mapPropEvents( props, 'cancel' );\n\t}\n\n\tset items( items: ListViewItem[] ) {\n\t\tthis.m_list.items = items;\n\t}\n\n\tpublic handleKey( ev: KeyboardEvent ) {\n\t\tthis.m_list.handleKey( ev );\n\t}\n\n\n\t// todo: move into popup\n\tprivate _handleClick = (e: MouseEvent) => {\n\t\tif (!this.dom) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet newfocus = <HTMLElement>e.target;\n\n\t\t// child of this: ok\n\t\tif (this.dom.contains(newfocus)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// menu: ok\n\t\tlet dest = Component.getElement(newfocus, MenuItem);\n\t\tif (dest) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.signal( 'cancel', EvCancel() );\n\t\tthis.close();\n\t}\n\n\t// todo: move into popup\n\tshow(modal?: boolean) {\n\t\tx4document.addEventListener('mousedown', this._handleClick);\n\t\tsuper.show(modal);\n\t}\n\n\thide( ) {\n\t\tx4document.removeEventListener('mousedown', this._handleClick);\n\t\tsuper.hide( );\n\t}\n\n\t// todo: move into popup\n\tclose() {\n\t\tx4document.removeEventListener('mousedown', this._handleClick);\n\t\tsuper.close();\n\t}\n\n\tget selection(): any {\n\t\treturn this.m_list.selection;\n\t}\n\n\tset selection(itemId: any) {\n\t\tthis.m_list.selection = itemId;\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file tooltips.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\n\nimport { Component } from './component'\nimport { Label } from './label'\nimport { Icon } from './icon'\nimport { isTouchDevice } from './tools'\n\n\nlet tipTmo;\nlet tooltip;\n\n/**\n * \n */\n\nexport class Tooltip extends Component {\n\n\tprivate m_text: Label;\n\n\tset text(text) {\n\t\tthis.m_text.text = text;\n\t}\n\n\t/** @ignore */\n\trender() {\n\t\tthis.setClass('@non-maskable', true);\n\t\tthis.setContent([\n\t\t\tnew Icon({ icon: 'var( --x4-icon-tip )' }),\n\t\t\tthis.m_text = new Label({ text: 'help' })\n\t\t]);\n\t}\n\n\t/**\n\t* display the menu at a specific position\n\t* @param x \n\t* @param y \n\t*/\n\n\tpublic displayAt(x: number, y: number, align: string = 'top left') {\n\n\t\tthis.show();\n\n\t\tlet halign = 'l',\n\t\t\tvalign = 't';\n\n\t\tif (align.indexOf('right') >= 0) {\n\t\t\thalign = 'r';\n\t\t}\n\n\t\tif (align.indexOf('bottom') >= 0) {\n\t\t\tvalign = 'b';\n\t\t}\n\n\t\t// @TODO: this is a minimal overflow problem solution\n\t\tlet rc = x4document.body.getBoundingClientRect(),\n\t\t\trm = this.getBoundingRect();\n\n\t\tif (halign == 'r') {\n\t\t\tx -= rm.width;\n\t\t}\n\n\t\tif (valign == 'b') {\n\t\t\ty -= rm.height;\n\t\t}\n\n\t\tif ((x + rm.width) > rc.right) {\n\t\t\tx = rc.right - rm.width;\n\t\t}\n\n\t\tif ((y + rm.height) > rc.bottom) {\n\t\t\ty = rc.bottom - rm.height - 17;\t// default cursor height\n\t\t}\n\n\t\tthis.setStyle({ left: x, top: y });\n\t}\n}\n\nexport type TooltipHandler = (text: string) => void;\n\nexport function initTooltips(cb?: TooltipHandler) {\n\n\tif (isTouchDevice()) {\n\t\treturn;\n\t}\n\n\tlet tipTarget = {\n\t\ttarget: null,\n\t\tx: 0,\n\t\ty: 0\n\t};\n\n\tfunction handle_mpos(event: MouseEvent) {\n\t\ttipTarget.x = event.pageX;\n\t\ttipTarget.y = event.pageY;\n\t}\n\n\tfunction handle_mouse(event: MouseEvent) {\n\n\t\tlet target: HTMLElement = <HTMLElement>event.target;\n\t\tlet tip = null;\n\n\t\ttipTarget.x = event.pageX + 10;\n\t\ttipTarget.y = event.pageY + 15;\n\n\t\twhile (target) {\n\t\t\ttip = target.getAttribute('tip');\n\t\t\tif (tip) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\ttarget = target.parentElement;\n\t\t}\n\n\t\tif (target == tipTarget.target || (tooltip && target == tooltip.dom)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!target || !tip) {\n\t\t\ttipTarget.target = null;\n\n\t\t\tif (cb) { cb(null); }\n\t\t\telse { _hideTip(); }\n\n\t\t\treturn;\n\t\t}\n\n\t\ttipTarget.target = target;\n\t\tif (cb) { cb(null); }\n\t\telse { _hideTip(); }\n\n\t\tif (cb) {\n\t\t\tcb(tip);\n\t\t}\n\t\telse {\n\t\t\ttipTmo = setTimeout(() => {\n\n\t\t\t\tif (tooltip === undefined) {\n\t\t\t\t\ttooltip = new Tooltip({});\n\t\t\t\t\tx4document.body.appendChild(tooltip._build());\n\t\t\t\t}\n\n\t\t\t\ttooltip.text = tip;\n\t\t\t\ttooltip.displayAt(tipTarget.x + 17, tipTarget.y + 17, 'top left');\n\t\t\t}, 700);\n\t\t}\n\n\t}\n\n\tfunction _hideTip() {\n\t\tif (tipTmo) {\n\t\t\tclearTimeout(tipTmo);\n\t\t}\n\n\t\tif (tooltip) {\n\t\t\ttooltip.hide();\n\t\t}\n\t}\n\n\tx4document.body.addEventListener('mouseover', handle_mouse);\n\tx4document.body.addEventListener('mouseout', handle_mouse);\n\tx4document.body.addEventListener('mousemove', handle_mpos);\n}", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file input.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\nimport { Tooltip } from './tooltips';\nimport { Component, CProps, CEventMap, EvFocus } from './component'\n//import { EvChange } from './x4_events';\n\nexport type EditType = 'text' | 'number' | 'email' | 'date' | 'password' | 'file' | 'checkbox' | 'radio';\n\nexport interface ValueHook {\n\tget( ) : any;\n\tset( v: any ) : void;\n}\n\nexport interface InputEventMap extends CEventMap {\n//\tchange?: EvChange;\n//\tfocus?: EvFocus;\n}\n\nexport interface InputProps<P extends InputEventMap = InputEventMap> extends CProps<P> {\n\tvalue?: string;\n\tname?: string;\n\ttype?: EditType\n\tplaceHolder?: string;\n\tautoFocus?: boolean;\n\treadOnly?: boolean;\n\ttabIndex?: number | boolean;\n\tpattern?: string;\n\tuppercase?: boolean;\n\tspellcheck?: boolean;\n\tvalue_hook?: ValueHook;\n\tmin?: number;\n\tmax?: number;\n\tautosel?: boolean;\n}\n\n\n/**\n * base class for elements implementing an input\n * CARE derived classes must set this.ui.input\n */\n\nexport class Input extends Component<InputProps,InputEventMap>\n{\n\tprivate m_error_tip: Tooltip;\n\n\tconstructor( props: InputProps ) {\n\t\tsuper( props );\n\t}\n\n\tcomponentDisposed() {\n\t\tif (this.m_error_tip) {\n\t\t\tthis.m_error_tip.dispose();\n\t\t}\n\n\t\tsuper.componentDisposed();\n\t}\n\n\t/** @ignore */\t\n\trender( props: InputProps ) {\n\n\t\tthis.setTag( 'input' );\n\t\tthis._setTabIndex( props.tabIndex );\n\n\t\tthis.setAttributes( {\n\t\t\tvalue: props.value,\n\t\t\ttype: props.type || 'text',\n\t\t\tname: props.name,\n\t\t\tplaceholder: props.placeHolder,\n\t\t\tautofocus: props.autoFocus,\n\t\t\treadonly: props.readOnly,\n\t\t\tautocomplete: 'off',\t// chrome ignore 'off' but not something else than 'on'\n\t\t\ttabIndex: props.tabIndex,\n\t\t\tspellcheck: props.spellcheck===false ? 'false' : undefined,\n\t\t\tmin: props.min,\n\t\t\tmax: props.max,\n\t\t\t...props.attrs\n\t\t});\n\n\t\tthis.m_props.autosel = props.autosel ?? true;\n\t\t\n\t\tif( props.uppercase ) {\n\t\t\tthis.setStyleValue( 'textTransform', 'uppercase' );\n\t\t}\n\n\t\tif( this.m_props.autosel ) {\n\t\t\tthis.setDomEvent( \"focus\", ( ) => {\n\t\t\t\tthis.selectAll( );\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic showError(text: string) {\n\n\t\tif (!this.m_error_tip) {\n\t\t\tthis.m_error_tip = new Tooltip({ cls: 'error' });\n\t\t\tx4document.body.appendChild(this.m_error_tip._build());\n\t\t}\n\n\t\tlet rc = this.getBoundingRect();\n\n\t\tthis.m_error_tip.text = text;\n\t\tthis.m_error_tip.displayAt(rc.right, rc.top-8, 'top right');\n\t\tthis.addClass('@error');\n\t}\n\n\tpublic clearError() {\n\n\t\tif (this.m_error_tip) {\n\t\t\tthis.m_error_tip.hide();\n\t\t\tthis.removeClass('@error');\n\t\t}\n\t}\n\n\tpublic getType( ) {\n\t\treturn this.m_props.type;\n\t}\n\n\t/**\n * return the current editor value\n */\n\n public get value( ) : string {\n\t\treturn this.getValue( );\n }\n\n\tpublic getValue( ): string {\n\t\tconst dom = this.dom as HTMLInputElement;\n\n\t\tif( this.dom ) {\n\t\t\tthis.m_props.value = dom.value;\n\t\t}\n\t\t\n\t\tif( this.m_props.uppercase ) {\n\t\t\tlet upper = this.m_props.value.toUpperCase( );\t// todo: locale ?\n\t\t\tif( dom && upper!=this.m_props.value ) {\n\t\t\t\tdom.value = upper; // update the input\n\t\t\t}\n\n\t\t\tthis.m_props.value = upper;\n\t\t}\n\t\t\n\t\treturn this.m_props.value;\n\t}\n\n /**\n * Change the editor value\n * @param value - new value to set\n */\n\t\n\tpublic set value( value: string ) {\n\t\tthis.setValue( value );\n\t}\n\t\n\tpublic setValue( value: string ) {\n\t\tthis.m_props.value = value;\n\n\t\tif( this.dom ) {\n\t\t\t(<HTMLInputElement>this.dom).value = value;\n\t\t}\n\t}\n\n\tpublic getStoreValue( ): any {\n\n\t\tif( this.m_props.value_hook ) {\n\t\t\treturn this.m_props.value_hook.get( );\n\t\t}\n\t\telse {\n\t\t\tlet type = this.getAttribute('type');\n\t\t\tif( type ) { type = type.toLowerCase( ); }\n\n\t\t\tlet value;\n\t\t\tconst dom = this.dom as HTMLInputElement;\n\n if( type === \"file\") {\n\t\t\t\tvalue = [];\n\t\t\t\t\n let files = dom.files;\n for( let file = 0; file < files.length; file++ ) {\n value.push( files[file].name );\n }\n }\n else if ( type === 'checkbox' ) {\n\t\t\t\tif( dom.checked ) {\n\t\t\t\t\tvalue = 1;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tvalue = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( type === 'radio' ) {\n\t\t\t\tif( dom.checked ) {\n\t\t\t\t\tvalue = this.value;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( type === 'date' ) {\n\t\t\t\tdebugger;\n\t\t\t}\n\t\t\telse if( type=='number' ) {\n\t\t\t\tvalue = this.value;\n\t\t\t\tif (value.indexOf(\",\") >= 0) {\n\t\t\t\t\tvalue = value.replace(\",\", \".\");\n\t\t\t\t} \n\t\t\t}\n\t\t\telse {\n\t\t\t\tvalue = this.value;\n\t\t\t}\n\n\t\t\treturn value;\n\t\t}\n\t}\n\n\tpublic setStoreValue( v: any ) {\n\t\tthis.clearError( );\n\t\tif( this.m_props.value_hook ) {\n\t\t\treturn this.m_props.value_hook.set( v );\n\t\t}\n\t\telse {\n\t\t\tlet type = this.getAttribute('type'),\n\t\t\t\tdom = (<HTMLInputElement>this.dom);\n\n\t\t\tif( type ) { type = type.toLowerCase( ); }\n\t\t\tif( type==='checkbox' ) {\n\t\t\t\tlet newval = v!==null && v!=='0' && v!==0 && v!==false;\n\t\t\t\tif( newval!==dom.checked ) {\n\t\t\t\t\tdom.setAttribute( 'checked', ''+newval );\n\t\t\t\t\tdom.dispatchEvent( new Event( 'change' ) );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.value = v;\n\t\t\t}\n\t\t}\n\t}\n\n\tset readOnly( ro: boolean ) {\n\t\tthis.setAttribute('readonly', ro );\n\t}\n\n\t/**\n\t * select all the text\n\t */\n\n\tpublic selectAll( ) {\n (<HTMLInputElement>this.dom).select(); \n\t}\n\t\n\t/**\n\t * select a part of the text\n\t * @param start \n\t * @param length \n\t */\n\n\tpublic select( start: number, length: number = 9999 ) : void {\n\t\t(<HTMLInputElement>this.dom).setSelectionRange( start, start+length );\n\t}\n\t\n\t/**\n\t * get the selection as { start, length }\n\t */\n\n\tpublic getSelection( ) {\n\t\tlet idom = (<HTMLInputElement>this.dom);\n\n\t\treturn {\n\t\t\tstart: idom.selectionStart,\n\t\t\tlength: idom.selectionEnd - idom.selectionStart,\n\t\t};\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file button.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\n\nimport { Component, CProps, CEventMap, HtmlString } from './component'\nimport { EventCallback, EvClick, EvChange } from './x4events'\n\nimport { Action } from './action'\nimport { Icon, IconID } from './icon'\nimport { Label } from './label'\nimport { Menu, MenuItem, MenuOrSep } from './menu'\nimport { isFunction } from './tools'\n\n/**\n * Button events\n */\n\ninterface ButtonEventMap extends CEventMap {\n\tclick: EvClick;\n}\n\ntype MenuCallBack = () => MenuOrSep[];\n\n/**\n * Button properties\n */\n\ninterface ButtonProps<E extends ButtonEventMap = ButtonEventMap> extends CProps<E> {\n\ttext?: string | HtmlString;\t// initial button text\n\ticon?: IconID;\t// optional icon id\n\trightIcon?: IconID;\t// optional icon id\n\talign?: 'center' | 'left' | 'right';\t// text alignment\n\tautoRepeat?: number; // time in ms or 0/undefined for none\n\tmenu?: MenuOrSep[] | MenuCallBack;\n\tclick?: EventCallback<EvClick>;\t// shortcut to events: { click: ... }\n\n\taction?: Action;\n}\n\n\n/**\n * Base button\n */\n\nexport class BaseButton<P extends ButtonProps = ButtonProps, E extends ButtonEventMap = ButtonEventMap> extends Component<P, E> {\n\n\tconstructor(props: P) {\n\t\tsuper(props);\n\n\t\tthis.setTag( 'button');\n\n\t\tthis.setDomEvent('click', (e) => this._handleClick(e));\n\t\tthis.setDomEvent('mousedown', () => { this._startAutoRep(true) });\n\t\tthis.setDomEvent('mouseup', () => { this._startAutoRep(false) });\n\t\tthis.setDomEvent('keydown', (e) => this._handleKeyDown(e));\n\n\t\tthis.mapPropEvents( props, 'click' );\t\t\n\t}\n\n\trender(props: ButtonProps) {\n\n\t\tconst action = props.action;\n\t\t\n\t\tlet icon = props.icon;\n\t\tlet text = props.text;\n\t\t\n\t\tif( action ) {\n\t\t\tif( !icon && action.props.icon ) {\n\t\t\t\ticon = action.props.icon;\n\t\t\t}\n\n\t\t\tif( text===undefined && action.props.text ) {\n\t\t\t\ttext = action.props.text;\n\t\t\t}\n\t\t}\n\n\t\tconst ui_icon = icon ? new Icon({ icon, cls: 'left', ref: 'l_icon' }) : null;\n\t\tconst ui_label = new Label({ flex: 1, text: text ?? '', align: props.align, ref: 'label' });\n\t\tconst ui_ricon = props.rightIcon ? new Icon({ icon: props.rightIcon, cls: 'right', ref: 'r_icon' }) : null;\n\n\t\tif( text===undefined ) {\n\t\t\tui_label.addClass( \"@hidden\" );\n\t\t}\n\t\t\n\t\tthis.setContent([ui_icon, ui_label, ui_ricon]);\n\t\tthis._setTabIndex(props.tabIndex);\n\t}\n\n\t/**\n\t * starts/stops the autorepeat\n\t */\n\n\tprivate _startAutoRep(start: boolean) {\n\n\t\tif (!this.m_props.autoRepeat) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (start) {\n\t\t\t// 1st timer 1s\n\t\t\tthis.startTimer('repeat', 700, false, () => {\n\t\t\t\t// auto click\n\t\t\t\tthis.startTimer('repeat', this.m_props.autoRepeat, true, this._sendClick);\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tthis.stopTimer('repeat');\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprotected _handleKeyDown(ev: KeyboardEvent) {\n\t\tif (!ev.ctrlKey && !ev.shiftKey && !ev.altKey) {\n\t\t\tif (ev.key == 'Enter' || ev.key == ' ') {\n\t\t\t\tthis._sendClick();\n\t\t\t\tev.preventDefault();\n\t\t\t\tev.stopPropagation();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * called by the system on click event\n\t */\n\n\tprotected _handleClick(ev: MouseEvent) {\n\n\t\tif (this.m_props.menu) {\n\t\t\tlet menu = new Menu({\n\t\t\t\titems: isFunction(this.m_props.menu) ? this.m_props.menu() : this.m_props.menu\n\t\t\t});\n\n\t\t\tlet rc = this.getBoundingRect();\n\t\t\tmenu.displayAt(rc.left, rc.bottom, 'tl');\n\t\t}\n\t\telse {\n\t\t\tthis._sendClick();\n\t\t}\n\n\t\tev.preventDefault();\n\t\tev.stopPropagation();\n\t}\n\n\t/**\n\t * sends a click to the observers\n\t */\n\n\tprotected _sendClick() {\n\t\tif (this.m_props.menu) {\n\t\t\tlet menu = new Menu({\n\t\t\t\titems: isFunction(this.m_props.menu) ? this.m_props.menu() : this.m_props.menu\n\t\t\t});\n\n\t\t\tlet rc = this.getBoundingRect();\n\t\t\tmenu.displayAt(rc.left, rc.bottom, 'tl');\n\t\t}\n\t\telse {\n\t\t\tthis.emit('click', EvClick());\n\t\t\tif( this.m_props.action ) {\n\t\t\t\tthis.m_props.action.fire( );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * change the button text\n\t * @example\n\t * ```ts\n\t * let btn = new Button( {\n\t * \ttext: 'hello'\n\t * });\n\t * \n\t * btn.text = 'world';\n\t * ```\n\t */\n\n\tpublic set text(text: string | HtmlString) {\n\t\tthis.m_props.text = text;\n\n\t\tlet label = this.itemWithRef<Label>('label');\n\t\tif (label) { label.text = text; label.removeClass(\"@hidden\") }\n\t}\n\n\tpublic get text(): string | HtmlString {\n\t\tlet label = this.itemWithRef<Label>('label');\n\t\treturn label?.text;\n\t}\n\n\t/**\n\t * change the button icon\n\t * todo: do nothing if no icon defined at startup\n\t *\n\t * @example\n\t * ```ts\n\t * let btn = new Button( {\n\t * \ttext: 'hello',\n\t * icon: 'close'\n\t * });\n\t * btn.setIcon( 'open' );\n\t * ```\n\t */\n\n\tpublic set icon(icon: IconID) {\n\t\tthis.m_props.icon = icon;\n\n\t\tlet ico = this.itemWithRef<Icon>('l_icon');\n\t\tif (ico) {\n\t\t\tico.icon = icon;\n\t\t}\n\t\telse {\n\t\t\tthis.update( );\n\t\t}\n\t}\n\n\tpublic get icon() {\n\t\tlet ico = this.itemWithRef<Icon>('l_icon');\n\t\treturn ico?.icon;\n\t}\n\n\t/**\n\t * change the button right icon\n\t * todo: do nothing if no icon defined at startup\n\t *\n\t * @example\n\t * ```ts\n\t * let btn = new Button( {\n\t * \ttext: 'hello',\n\t * icon: 'close'\n\t * });\n\t * btn.setIcon( 'open' );\n\t * ```\n\t */\n\n\tpublic set rightIcon(icon: IconID) {\n\t\tthis.m_props.rightIcon = icon;\n\t\tlet ico = this.itemWithRef<Icon>('r_icon');\n\t\tif (ico) {\n\t\t\tico.icon = icon;\n\t\t}\n\t}\n\n\tpublic get rightIcon() {\n\t\tlet ico = this.itemWithRef<Icon>('l_icon');\n\t\treturn ico?.icon;\n\t}\n\n\t/**\n\t * \n\t */\n\t\n\tset menu( items: MenuItem[] ) {\n\t\tthis.m_props.menu = items;\n\t}\n}\n\n// :: BUTTON ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\n/**\n * \n */\n\nexport class Button extends BaseButton<ButtonProps> {\n}\n\n// :: TOGGLE BUTTON ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\n\ninterface ToggleButtonEventMap extends ButtonEventMap {\n\tchange: EvChange;\n}\n\ninterface ToggleButtonProps extends ButtonProps<ToggleButtonEventMap> {\n\tchecked: boolean;\n\tcheckedIcon?: IconID;\n}\n\n/**\n * \n */\n\nexport class ToggleButton extends BaseButton<ToggleButtonProps, ToggleButtonEventMap> {\n\n\tconstructor(props: ToggleButtonProps) {\n\t\tsuper(props);\n\t}\n\n\t/**\n\t * \n\t */\n\n\trender(props: ToggleButtonProps) {\n\t\tsuper.render(props);\n\n\t\tif (props.checked) {\n\t\t\tthis.addClass('checked');\n\t\t\tthis._updateIcon( );\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprotected _sendClick() {\n\t\tsuper._sendClick();\n\n\t\tthis.m_props.checked = !this.m_props.checked;\n\t\tthis.setClass('checked', this.m_props.checked);\n\t\tthis.emit('change', EvChange(this.m_props.checked));\n\n\t\tthis._updateIcon( );\n\t}\n\n\tprivate _updateIcon( ) {\n\t\tif( this.m_props.checkedIcon ) {\n\t\t\tconst ic = this.m_props.checked ? this.m_props.checkedIcon : this.m_props.icon;\n\t\t\tlet ico = this.itemWithRef<Icon>('l_icon');\n\t\t\tif (ico) {\n\t\t\t\tico.icon = ic;\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file calendar.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\n\nimport { Button } from './button';\nimport { Popup } from './popup';\nimport { Component, CProps, ContainerEventMap, Flex } from './component'\nimport { EvChange, EventCallback } from './x4events'\nimport { Point } from \"./tools\"\n\nimport { _tr } from './i18n';\nimport { Label } from './label';\nimport { HLayout, VLayout } from './layout'\nimport { date_hash, date_clone, formatIntlDate } from './tools'\nimport { Menu, MenuItem } from './menu';\n\n\ninterface CalendarEventMap extends ContainerEventMap {\n\tchange?: EvChange;\n}\n\n\ninterface CalendarProps extends CProps<CalendarEventMap> {\n\tdate?: Date;\t// initial date to display\n\tminDate?: Date;\t// minimal date before the user cannot go\n\tmaxDate?: Date;\t// maximal date after the user cannot go\n\n\tchange?: EventCallback<EvChange>; // shortcut to events: { change: ... }\n}\n\n\n/**\n * default calendar control\n * \n * fires:\n * \tEventChange ( value = Date )\n */\n\nexport class Calendar extends VLayout<CalendarProps, CalendarEventMap>\n{\n\tprivate m_date: Date;\n\n\tconstructor(props: CalendarProps) {\n\t\tsuper(props);\n\n\t\tthis.mapPropEvents( props, 'change' );\n\t\tthis.m_date = props.date?.clone() ?? new Date();\n\t}\n\n\t/** @ignore */\n\n\trender(props: CalendarProps) {\n\n\t\tlet month_start = date_clone(this.m_date);\n\t\tmonth_start.setDate(1);\n\n\t\tlet day = month_start.getDay();\n\t\tif (day == 0) {\n\t\t\tday = 7;\n\t\t}\n\n\t\tmonth_start.setDate(-day + 1 + 1);\n\t\tlet dte = date_clone(month_start);\n\n\t\tlet today = this.m_date.hash();\n\n\t\tlet month_end = date_clone(this.m_date);\n\t\tmonth_end.setDate(1);\n\t\tmonth_end.setMonth(month_end.getMonth() + 1);\n\t\tmonth_end.setDate(0);\n\n\t\tlet end_of_month = date_hash(month_end);\n\n\t\tlet rows: HLayout[] = [];\n\n\t\t// month selector\n\t\tlet header = new HLayout({\n\t\t\tcls: 'month-sel',\n\t\t\tcontent: [\n\t\t\t\tnew Label({\n\t\t\t\t\tcls: 'month',\n\t\t\t\t\ttext: formatIntlDate(this.m_date, 'O'),\n\t\t\t\t\tdom_events: {\n\t\t\t\t\t\tclick: () => this._choose('month')\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\tnew Label({\n\t\t\t\t\tcls: 'year',\n\t\t\t\t\ttext: formatIntlDate(this.m_date, 'Y'),\n\t\t\t\t\tdom_events: {\n\t\t\t\t\t\tclick: () => this._choose('year')\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\tnew Flex(),\n\t\t\t\tnew Button({ text: '<', click: () => this._next(false) } ),\n\t\t\t\tnew Button({ text: '>', click: () => this._next(true) } )\n\t\t\t]\n\t\t});\n\n\t\trows.push(header);\n\n\t\t// calendar part\n\t\tlet day_names = [];\n\n\t\t// day names\n\t\t// empty week num\n\t\tday_names.push(new HLayout({\n\t\t\tcls: 'weeknum cell',\n\t\t}));\n\n\t\tfor (let d = 0; d < 7; d++) {\n\t\t\tday_names.push(new Label({\n\t\t\t\tcls: 'cell',\n\t\t\t\tflex: 1,\n\t\t\t\ttext: _tr.global.day_short[(d + 1) % 7]\n\t\t\t}));\n\t\t}\n\n\t\trows.push(new HLayout({\n\t\t\tcls: 'week header',\n\t\t\tcontent: day_names\n\t\t}));\n\n\t\tlet cmonth = this.m_date.getMonth();\n\n\t\t// weeks\n\t\tlet first = true;\n\t\twhile (date_hash(dte) <= end_of_month) {\n\n\t\t\tlet days = [\n\t\t\t\tnew HLayout({ cls: 'weeknum cell', content: new Component({ tag: 'span', content: formatIntlDate(dte, 'w') }) })\n\t\t\t];\n\n\t\t\t// days\n\t\t\tfor (let d = 0; d < 7; d++) {\n\n\t\t\t\tlet cls = 'cell day';\n\t\t\t\tif (dte.hash() == today) {\n\t\t\t\t\tcls += ' today';\n\t\t\t\t}\n\n\t\t\t\tif (dte.getMonth() != cmonth) {\n\t\t\t\t\tcls += ' out';\n\t\t\t\t}\n\n\t\t\t\tconst mkItem = ( dte: Date ) => {\n\t\t\t\t\treturn new HLayout({\n\t\t\t\t\t\tcls,\n\t\t\t\t\t\tflex: 1,\n\t\t\t\t\t\tcontent: new Component({\n\t\t\t\t\t\t\ttag: 'span',\n\t\t\t\t\t\t\tcontent: formatIntlDate(dte, 'd'),\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tdom_events: {\n\t\t\t\t\t\t\tclick: () => this.select(dte)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tdays.push( mkItem( dte.clone() ) );\n\n\t\t\t\tdte.setDate(dte.getDate() + 1);\n\t\t\t\tfirst = false;\n\t\t\t}\n\n\t\t\trows.push(new HLayout({\n\t\t\t\tcls: 'week',\n\t\t\t\tflex: 1,\n\t\t\t\tcontent: days\n\t\t\t}));\n\t\t}\n\n\t\tthis.setContent(rows);\n\t}\n\n\t/**\n\t * select the given date\n\t * @param date \n\t */\n\n\tprivate select(date: Date) {\n\t\tthis.m_date = date;\n\t\tthis.emit('change', EvChange(date));\n\t\tthis.update();\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _next(n: boolean) {\n\t\tthis.m_date.setMonth(this.m_date.getMonth() + (n ? 1 : -1));\n\t\tthis.update();\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _choose(type: 'month' | 'year') {\n\n\t\tlet items: MenuItem[] = [];\n\n\t\tif (type == 'month') {\n\t\t\tfor (let m = 0; m < 12; m++) {\n\t\t\t\titems.push(new MenuItem({\n\t\t\t\t\ttext: _tr.global.month_long[m],\n\t\t\t\t\tclick: () => { this.m_date.setMonth(m); this.update(); }\n\t\t\t\t}));\n\t\t\t}\n\t\t}\n\t\telse if (type == 'year') {\n\n\t\t\tlet min = this.m_props.minDate?.getFullYear() ?? 1900;\n\t\t\tlet max = this.m_props.maxDate?.getFullYear() ?? 2037;\n\n\t\t\tfor (let m = max; m >= min; m--) {\n\t\t\t\titems.push(new MenuItem({\n\t\t\t\t\ttext: '' + m,\n\t\t\t\t\tclick: () => { this.m_date.setFullYear(m); this.update(); }\n\t\t\t\t}));\n\t\t\t}\n\t\t}\n\n\t\tlet menu = new Menu({\n\t\t\titems\n\t\t});\n\n\t\tlet rc = this.getBoundingRect();\n\t\tmenu.displayAt(rc.left, rc.top);\n\t}\n\n\tget date() {\n\t\treturn this.m_date;\n\t}\n\n\tset date(date: Date) {\n\t\tthis.m_date = date;\n\t\tthis.update();\n\t}\n}\n\n/**\n * default popup calendar\n */\n\nexport class PopupCalendar extends Popup {\n\n\tm_cal: Calendar;\n\n\tconstructor(props: CalendarProps) {\n\t\tsuper({ tabIndex: 1 });\n\n\t\tthis.enableMask(false);\n\n\t\tthis.m_cal = new Calendar(props);\n\t\tthis.m_cal.addClass('@fit');\n\n\t\tthis.setContent(this.m_cal);\n\t}\n\n\t// binded\n\tprivate _handleClick = (e: MouseEvent) => {\n\t\tif (!this.dom) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet newfocus = <HTMLElement>e.target;\n\n\t\t// child of this: ok\n\t\tif (this.dom.contains(newfocus)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// menu: ok\n\t\tlet dest = Component.getElement(newfocus, MenuItem);\n\t\tif (dest) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.close();\n\t}\n\n\t/** @ignore */\n\tshow(modal?: boolean, at?: Point ) {\n\t\tx4document.addEventListener('mousedown', this._handleClick);\n\t\tif( at ) {\n\t\t\tsuper.displayAt( at.x, at.y, 'top left', undefined, modal );\n\t\t}\n\t\telse {\n\t\t\tsuper.show(modal);\n\t\t}\n\t}\n\n\t/** @ignore */\n\tclose() {\n\t\tx4document.removeEventListener('mousedown', this._handleClick);\n\t\tsuper.close();\n\t}\n\n}", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file textedit.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\n\nimport { Component, EvFocus, HtmlString } from './component'\nimport { Input, InputProps, InputEventMap, EditType } from './input'\nimport { IconID } from './icon'\nimport { Button } from './button'\nimport { HLayout } from './layout'\nimport { Label } from './label'\nimport { PopupCalendar } from './calendar'\nimport { sprintf, parseIntlDate, formatIntlDate } from './tools';\nimport { Tooltip } from './tooltips'\nimport { EvClick, EvChange, EventCallback } from './x4events';\n\nimport { _tr } from './i18n'\n\n// throw in case of error\n// return the corrected\ntype ValidationFunction = (value: string) => string;\n\n/** @ignore */\nconst reEmail = /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n\n// ============================================================================\n// [TEXTEDIT]\n// ============================================================================\n\ninterface TextEditEventMap extends InputEventMap {\n\tclick: EvClick;\n\tchange: EvChange;\n\tfocus: EvFocus;\n}\n\nexport interface TextEditProps extends InputProps<TextEditEventMap> {\n\tlabel?: string | HtmlString;\n\tlabelWidth?: number;\t// <0 for flex -> -3 mean flex: 3\n\tlabelAlign?: 'left' | 'right' | 'top';\n\trequired?: boolean;\n\tspellcheck?: boolean;\n\ticon?: IconID;\n\tpattern?: string;\n\tuppercase?: boolean;\n\tformat?: string | 'native'; // default store format on type date. \n\tautosel?: boolean;\t// select content on focus\n\n\t// by default mysql format without time 'YYYY-MM-DD'\n\t// use 'native' to work on real Date object (get/set value)\n\n\tgadgets?: Component[];\n\n\tvalidator?: ValidationFunction;\n\n\tchange?: EventCallback<EvChange>;\t// shortcut to events: { change: ... }\n\tclick?: EventCallback<EvClick>;\t\t// shortcut to events: { click: ... }\n\tfocus?: EventCallback<EvFocus>;\t\t// shortcut to events: { focus: ... }\n}\n\n\n\n/**\n * TextEdit is a single line editor, it can have a label and an error descriptor.\n */\n\nexport class TextEdit<T extends TextEditProps = TextEditProps, E extends TextEditEventMap = TextEditEventMap > extends Component<T, E> {\n\n\tprivate m_cal_popup: PopupCalendar;\n\tprotected m_ui_input: Input;\n\t\n\tconstructor(props: T) {\n\t\tsuper(props);\n\t\tthis.addClass( '@hlayout' );\n\t\tthis.mapPropEvents( props, 'change', 'click', 'focus' );\n\t}\n\n\tcomponentCreated() {\n\t\tsuper.componentCreated( );\n\n\t\tif (this.m_props.autoFocus) {\n\t\t\tthis.focus();\n\t\t}\n\t}\n\n\tfocus() {\n\t\tthis.m_ui_input.focus();\n\t}\n\n\t/** @ignore */\n\trender(props: TextEditProps) {\n\n\t\tlet eprops: InputProps = {\n\t\t\tflex: 1,\n\t\t\tdom_events: {\n\t\t\t\tfocus: ( ) => this._focus( ),\n\t\t\t\tfocusout: ( ) => this._blur( ),\n\t\t\t\tinput: ( ) => this._change( )\n\t\t\t},\n\t\t\tvalue: props.value,\n\t\t\tname: props.name,\n\t\t\ttype: props.type,\n\t\t\tplaceHolder: props.placeHolder,\n\t\t\tautoFocus: props.autoFocus,\n\t\t\treadOnly: props.readOnly,\n\t\t\tvalue_hook: props.value_hook,\n\t\t\tuppercase: props.uppercase,\n\t\t\tspellcheck: props.spellcheck,\n\t\t\ttabIndex: props.tabIndex === undefined ? true : props.tabIndex,\n\t\t\tattrs: props.attrs,\n\t\t\tmin: props.min,\n\t\t\tmax: props.max,\n\t\t\tautosel: props.autosel,\n\t\t};\n\n\t\t// date is handled manually with popupcalendar\n\n\t\tif (props.type == 'date') {\n\t\t\tprops.format = props.format ?? 'Y-M-D';\n\t\t\teprops.type = 'text';\n\n\t\t\tlet def_hook = {\n\t\t\t\tget: ( ) => this._date_get_hook(),\n\t\t\t\tset: (e) => this._date_set_hook(e)\n\t\t\t}\n\n\t\t\teprops.value_hook = props.value_hook ?? def_hook;\n\t\t}\n\n\t\tthis.m_ui_input = new Input(eprops);\n\n\t\t//\tbutton\n\t\tlet button = undefined;\n\t\tif (props.icon) {\n\t\t\tbutton = new Button({\n\t\t\t\ticon: props.icon,\n\t\t\t\tclick: () => this._btnClick(),\n\t\t\t\ttabIndex: false\n\t\t\t});\n\t\t}\n\t\telse if (props.type == 'date') {\n\n\t\t\tbutton = new Button({\n\t\t\t\tcls: 'gadget',\n\t\t\t\ticon: 'var( --x4-icon-calendar-days )',\n\t\t\t\ttabIndex: false,\n\t\t\t\tclick: () => this._showDatePicker(button)\n\t\t\t});\n\n\t\t\tif (!props.validator) {\n\t\t\t\tprops.validator = this._date_validator;\n\t\t\t}\n\t\t}\n\n\t\tlet ag = props.gadgets ?? [];\n\t\tag.forEach( b => {\n\t\t\tb.addClass( 'gadget' );\n\t\t});\n\n\t\tlet gadgets = [button, ...ag];\n\n\t\tthis.setClass('@required', props.required);\n\t\tif (props.gadgets && props.gadgets.length) {\n\t\t\tthis.addClass('with-gadgets');\n\t\t}\n\n\t\tlet width = undefined,\n\t\t\tflex = undefined,\n\t\t\tlabelWidth = props.labelWidth;\n\n\t\tif (labelWidth > 0) {\n\t\t\twidth = labelWidth;\n\t\t}\n\n\t\tif (labelWidth < 0) {\n\t\t\tflex = -labelWidth;\n\t\t}\n\n\t\tlet label = undefined;\n\t\tlet labelAlign = props.labelAlign;\n\t\tlet top = false;\n\n\t\tif (props.label) {\n\n\t\t\tif (labelAlign == 'top') {\n\t\t\t\tlabelAlign = 'left';\n\t\t\t\ttop = true;\n\t\t\t\tflex = 1;\n\t\t\t}\n\n\t\t\tlabel = new Label({\n\t\t\t\tref: 'label',\n\t\t\t\ttag: 'label',\n\t\t\t\tcls: 'label1' + (props.label ? '' : ' @hidden'),\t// todo: why 'label1' class name ?\n\t\t\t\ttext: props.label ?? '',\n\t\t\t\twidth,\n\t\t\t\tflex,\n\t\t\t\talign: labelAlign\n\t\t\t});\n\t\t}\n\n\t\tif (top) {\n\t\t\tthis.removeClass('@hlayout');\n\t\t\tthis.addClass('@vlayout vertical');\n\n\t\t\tthis.setContent([\n\t\t\t\tlabel,\n\t\t\t\tnew HLayout({ width, content: [this.m_ui_input, ...gadgets] })\n\t\t\t]);\n\t\t}\n\t\telse {\n\t\t\tthis.addClass('@hlayout');\n\t\t\tthis.setContent([label, this.m_ui_input, ...gadgets]);\n\t\t}\n\t}\n\n\tenable(ena?: boolean) {\n\t\tif (ena === true) {\n\t\t\tthis.m_ui_input.enable();\n\t\t}\n\n\t\tsuper.enable(ena);\n\t}\n\n\tdisable() {\n\t\tthis.m_ui_input.disable();\n\t\tsuper.disable();\n\t}\n\n\tprivate _btnClick() {\n\t\tthis.emit('click', EvClick(this.value) );\n\t}\n\n\t/**\n\t * select the value format for input/output on textedit of type date\n\t * cf. formatIntlDate / parseIntlDate\n\t * @param fmt \n\t */\n\tpublic setDateStoreFormat(fmt: string) {\n\t\tthis.m_props.format = fmt;\n\t}\n\n\tpublic setStoreValue(value: any) {\n\t\tthis.m_ui_input.setStoreValue(value);\n\t}\n\n\tpublic getStoreValue(): any {\n\t\treturn this.m_ui_input.getStoreValue();\n\t}\n\n\tprivate _date_get_hook() {\n\t\tlet date = parseIntlDate(this.value);\n\t\tlet props = this.m_props;\n\t\tif (props.format == 'native') {\n\t\t\treturn date;\n\t\t}\n\t\telse {\n\t\t\treturn date ? formatIntlDate(date, props.format) : null;\n\t\t}\n\t}\n\n\tprivate _date_set_hook(dte) {\n\t\tlet props = this.m_props;\n\n\t\tif (props.format == 'native') {\n\t\t\tthis.value = formatIntlDate(dte);\n\t\t}\n\t\telse if (dte) {\n\t\t\tlet date = parseIntlDate(dte, props.format);\n\t\t\tthis.value = formatIntlDate(date);\n\t\t}\n\t\telse {\n\t\t\tthis.value = '';\n\t\t}\n\t}\n\n\tpublic showError(text: string) {\n\t\tthis.m_ui_input.showError( text );\n\t}\n\n\tpublic clearError() {\n\t\tthis.m_ui_input.clearError( );\n\t}\n\n\tpublic get value(): string {\n\t\treturn this.getValue( );\n\t}\n\n\tpublic getValue( ) : string {\n\t\tif (this.m_ui_input) {\n\t\t\treturn this.m_ui_input.value;\n\t\t}\n\t\telse {\n\t\t\treturn this.m_props.value;\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic set value(value: string) {\n\t\tthis.setValue( value );\n\t}\n\n\tpublic setValue( value: string ) {\n\t\tif (this.m_ui_input) {\n\t\t\tthis.m_ui_input.value = value;\n\t\t}\n\t\telse {\n\t\t\tthis.m_props.value = value;\n\t\t}\n\t}\n\n\t/**\n\t * select all the text\n\t */\n\n\tpublic selectAll() {\n\t\tthis.m_ui_input.selectAll();\n\t}\n\n\tpublic select(start: number, length: number = 9999): void {\n\t\tthis.m_ui_input.select(start, length);\n\t}\n\n\tpublic getSelection() {\n\t\treturn this.m_ui_input.getSelection();\n\t}\n\n\tset readOnly(ro: boolean) {\n\t\tthis.m_ui_input.readOnly = ro;\n\t}\n\n\tget label() {\n\t\treturn this.itemWithRef<Label>('label')?.text;\n\t}\n\n\tset label(text) {\n\t\tthis.itemWithRef<Label>('label').text = text;\n\t}\n\n\t/**\n\t * content changed\n\t * todo: should move into Input\n\t */\n\n\tprivate _change() {\n\t\tlet value = this.m_ui_input.value;\n\t\tthis.emit('change', EvChange(value));\n\t}\n\n\t/**\n\t * getting focus\n\t */\n\n\tprivate _focus() {\n\t\tthis.clearError();\n\t\tthis.emit('focus', EvFocus(true));\n\t}\n\n\t/**\n\t * loosing focus\n\t * @param value \n\t */\n\n\tprivate _blur() {\n\t\tthis._validate(this.m_ui_input.value);\n\t\tthis.emit('focus', EvFocus(false));\n\t}\n\n\t/**\n\t * todo: should move into Input\n\t * @returns \n\t */\n\tpublic validate(): boolean {\n\t\treturn this._validate(this.value);\n\t}\n\n\tprotected _validate(value: string): boolean {\n\t\tlet props = this.m_props;\n\t\tlet update = false;\n\n\t\tif (props.required && value.length == 0) {\n\t\t\tthis.showError(_tr.global.required_field);\n\t\t\treturn false;\n\t\t}\n\n\t\tif (value != '') {\n\t\t\tlet pattern = this.getAttribute('pattern');\n\t\t\tif (pattern) {\n\t\t\t\tlet re = new RegExp(pattern);\n\t\t\t\tif (re && !re.test(value)) {\n\t\t\t\t\tthis.showError(_tr.global.invalid_format);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (props.type == 'email') {\n\t\t\t\tif (!reEmail.test(value.toLowerCase())) {\n\t\t\t\t\tthis.showError(_tr.global.invalid_email);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (props.type == 'number') {\n\n\t\t\t\tconst v = parseFloat(value);\n\t\t\t\tif (isNaN(v)) {\n\t\t\t\t\tthis.showError(_tr.global.invalid_number);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tlet min = parseFloat(this.m_ui_input.getAttribute('min'));\n\t\t\t\tif (min !== undefined && v < min) {\n\t\t\t\t\tvalue = '' + min;\n\t\t\t\t\tupdate = true;\n\t\t\t\t}\n\n\t\t\t\tlet max = parseFloat(this.m_ui_input.getAttribute('max'));\n\t\t\t\tif (max !== undefined && v > max) {\n\t\t\t\t\tvalue = '' + max;\n\t\t\t\t\tupdate = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\n\t\tif (props.validator) {\n\t\t\ttry {\n\t\t\t\tthis.value = props.validator(value);\n\t\t\t}\n\t\t\tcatch (err) {\n\t\t\t\tthis.showError(err instanceof Error ? err.message : err as string);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\telse if (update) {\n\t\t\tthis.value = value;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t_date_validator(value: string): string {\n\n\t\tvalue = value.trim();\n\t\tif (value == '') {\n\t\t\treturn '';\n\t\t}\n\n\t\tlet date: Date;\n\t\tif (value == '@') {\n\t\t\tdate = new Date();\n\t\t}\n\t\telse {\n\t\t\tdate = parseIntlDate(value);\n\t\t\tif (!date) {\n\t\t\t\tthrow sprintf(_tr.global.invalid_date, _tr.global.date_format);\n\t\t\t}\n\t\t}\n\n\t\treturn formatIntlDate(date);\n\t}\n\n\n\t//onKeyDown( e ) {\n\t// if( this.readOnly ) {\n\t// if( this.type=='date' && (e.key==' ' || e.key=='Enter') ) {\n\t// this.showDatePicker( );\n\t// e.stopPropagation( );\n\t// e.preventDefault( );\n\t// }\n\t// }\n\t//}\n\n\t//onClick( e ) {\n\t// if( this.readOnly ) {\n\t// if( this.type=='date' ) {\n\t// this.showDatePicker( );\n\t// e.stopPropagation( );\n\t// e.preventDefault( );\n\t// }\n\t// }\n\t//}\n\n\tprivate _showDatePicker(btn: Component) {\n\n\t\tif (!this.m_cal_popup) {\n\t\t\tthis.m_cal_popup = new PopupCalendar({\n\t\t\t\tchange: (ev: EvChange) => {\n\t\t\t\t\tthis.value = formatIntlDate(ev.value as Date);\n\t\t\t\t\tthis.m_cal_popup.close();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tlet rc = this.m_ui_input.getBoundingRect();\n\t\tthis.m_cal_popup.displayAt(rc.left, rc.bottom, 'top left');\n\t}\n\n\tget input() {\n\t\treturn this.m_ui_input;\n\t}\n\n\tget type(): EditType {\n\t\treturn this.m_props.type;\n\t}\n}\n", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file autocomplete.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { RenderListItem, ListViewItem, PopupListView } from \"./listview\";\nimport { TextEdit, TextEditProps } from './textedit';\n\n/**\n * \n */\n\ninterface AutoCompleteProps extends TextEditProps {\n\t// return an array of values to display in the popup list\n\tenumValues: ( filter: string ) => string[] | Promise<string[]>;\n\n\t// a way to change the real value vs displayed value in the popup list\n\tselectValue?: ( text: string ) => string;\n\trenderItem?: RenderListItem\n}\n\n/**\n * \n */\n\nexport class AutoComplete extends TextEdit<AutoCompleteProps> {\n\t\n\tprivate m_popup: PopupListView;\n\tprivate m_popvis: boolean;\n\tprivate m_needval: boolean;\n\tprivate m_lockpop: boolean;\n\t\n\tconstructor( props: AutoCompleteProps ) {\n\t\tsuper( props );\n\n\t\tthis.setDomEvent( \"input\", ( ) => this._onChange( ) );\n\t\tthis.setDomEvent( \"focusin\", ( ) => this._onFocus( ) );\n\t\tthis.startTimer( \"focus-check\", 100, true, () => this._checkFocus() );\n\n\t\tthis.m_popvis = false;\n\t\tthis.m_needval = false;\n\t\tthis.m_lockpop = false;\n\n\t\tthis.setDomEvent( \"keydown\", e => this._onKey(e) );\n\t}\n\n\t_onKey( e: KeyboardEvent ) {\n\t\tif( this.m_popvis ) {\n\t\t\tif( e.key==\"ArrowUp\" || e.key==\"ArrowDown\" ) {\n\t\t\t\tthis.m_lockpop = true;\n\t\t\t\tthis.m_popup.handleKey( e );\n\t\t\t\tthis.m_lockpop = false;\n\n\t\t\t\te.preventDefault( );\n\t\t\t\te.stopPropagation( );\n\t\t\t}\n\t\t\telse if( e.key==\"Escape\" ) {\n\t\t\t\tthis._hidePopup( );\n\n\t\t\t\te.preventDefault( );\n\t\t\t\te.stopPropagation( );\n\t\t\t}\n\t\t}\n\t\telse if( e.key==\"ArrowDown\" ) {\n\t\t\tthis._onChange( );\n\t\t\te.preventDefault( );\n\t\t\te.stopPropagation( );\n\t\t}\n\t}\n\n\tprivate async _onChange( ) {\n\t\tlet items = this.m_props.enumValues( this.value );\n\t\tif( items instanceof Promise ) {\n\t\t\titems = await items;\n\t\t}\n\t\t\n\t\tif( items.length==0 ) {\n\t\t\tthis._hidePopup( );\n\t\t\treturn;\n\t\t}\n\n\t\tthis._showPopup( items );\n\t}\n\n\tcomponentDisposed( ) {\n\t\tif( this.m_popup ) {\n\t\t\tthis._hidePopup( );\n\t\t}\n\n\t\tsuper.componentDisposed( );\n\t}\n\n\tshowPopup( show = true ) {\n\t\tif( show ) {\n\t\t\tthis._onChange( );\n\t\t}\n\t\telse {\n\t\t\tthis._hidePopup( );\n\t\t}\n\t}\n\n\t/** \n\t * display the popup \n\t */\n\n\tprivate _showPopup( items: string[] ) {\n\n\t\tlet props = this.m_props;\n\t\tif (props.readOnly || this.hasClass(\"@disable\") ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// need creation ?\n\t\t\n\t\tif( !this.m_popup ) {\n\t\t\tlet cstyle = this.getComputedStyle( );\n\t\t\tlet fontFamily = cstyle.value( 'fontFamily' );\n\t\t\tlet fontSize = cstyle.value( 'fontSize' );\n\n\t\t\t// prepare the combo listview\n\t\t\tthis.m_popup = new PopupListView({\n\t\t\t\tcls: '@combo-popup',\n\t\t\t\tattrs: {\n\t\t\t\t\ttabindex: 0\n\t\t\t\t},\n\t\t\t\tselectionChange: (e) => {\n\t\t\t\t\tlet value = (e.selection as ListViewItem).id\n\t\t\t\t\tif( this.m_props.selectValue ) {\n\t\t\t\t\t\tvalue = this.m_props.selectValue( value );\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.value = value;\n\t\t\t\t\tif( !this.m_lockpop ) {\n\t\t\t\t\t\tthis._hidePopup( );\n\t\t\t\t\t\tthis.focus( );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tstyle: {\n\t\t\t\t\tfontFamily,\n\t\t\t\t\tfontSize\n\t\t\t\t},\n\t\t\t\trenderItem: props.renderItem,\n\t\t\t});\n\t\t}\n\n\t\tif( items ) {\n\t\t\tthis.m_popup.items = items.map( c => ({ id: c, text: c }) );\n\t\t}\n\t\n\t\tlet r1 = this.m_ui_input.getBoundingRect();\n\t\tthis.m_popup.setStyle({\n\t\t\tminWidth: r1.width,\n\t\t});\n\n\t\tthis.m_popup.displayAt(r1.left, r1.bottom);\n\t\tthis.m_popvis = true;\n\t\t\n\t\t//if( this.value!==undefined ) {\n\t\t//\tthis.m_popup.selection = this.value;\n\t\t//}\n\t}\n\n\tprotected override _validate(value: string): boolean {\n\t\treturn true;\n\t}\n\n\toverride validate( ): boolean {\n\t\treturn super._validate( this.value );\n\t}\n\n\tprivate _checkFocus( ) {\n\t\tconst focus = document.activeElement;\n\t\tif( this.dom && this.dom.contains(focus) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif( this.m_popup && this.m_popup.dom && this.m_popup.dom.contains(focus) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._hidePopup( );\n\t}\n\n\tprivate _hidePopup( ) {\n\t\t\n\t\tif( this.m_popvis ) {\n\t\t\tthis.m_popup.close();\n\t\t\tthis.m_popvis = false;\n\t\t}\n\n\t\tif( this.m_needval ) {\n\t\t\tthis.validate( );\n\t\t\tthis.m_needval = false;\n\t\t}\n\t}\n\n\tprivate _onFocus( ) {\n\t\tif( this.value.length==0 ) {\n\t\t\tthis._onChange( );\n\t\t}\n\n\t\tthis.m_needval = true;\n\t}\n\n\tisPopupVisible( ) {\n\t\treturn this.m_popvis;\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file canvas.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Component, CProps, CEventMap, html } from './component'\nimport { BasicEvent, EventCallback } from './x4events'\n\ninterface IPoint {\n\tx: number;\n\ty: number;\n}\n\ninterface EvPaint extends BasicEvent {\n\tctx: CanvasPainter;\n}\n\nfunction EvPaint(ctx: CanvasPainter) {\n\treturn BasicEvent<EvPaint>({ ctx });\n}\n\ninterface CanvasEventMap extends CEventMap {\n\tpaint: EvPaint;\n}\n\ninterface CanvasProps extends CProps<CanvasEventMap> {\n\tautoClear?: boolean;\n\tpainter?: PaintHandler;\n\tpaint: EventCallback<EvPaint>\n}\n\n\n// ============================================================================\n// [CANVAS]\n// ============================================================================\n\n\n\n\nexport interface CanvasPainter extends CanvasRenderingContext2D {\n\twidth: number;\n\theight: number;\n\n\tsmoothLine(points: any[], path: CanvasPath, move: boolean): void;\n\tsmoothLineEx(_points: any[], tension: number, numOfSeg: number, path: CanvasPath, move?: boolean, close?: boolean): void;\n\tline(x1: number, y1: number, x2: number, y2: number, color: string, lineWidth: number): void;\n\troundRect(x: number, y: number, width: number, height: number, radius: number): void;\n\tcalcTextSize(text: string, rounded: boolean): { width: number, height: number };\n\tsetFontSize(fs: number): void;\n\tcircle(x: number, y: number, radius: number): void;\n}\n\nfunction mkPainter(c2d: CanvasRenderingContext2D, w: number, h: number): CanvasPainter {\n\n\tlet cp = c2d as CanvasPainter;\n\n\tcp.width = w;\n\tcp.height = h;\n\n\tcp.smoothLine = smoothLine;\n\tcp.smoothLineEx = smoothLineEx;\n\tcp.line = line;\n\tcp.roundRect = roundRect;\n\tcp.calcTextSize = calcTextSize;\n\tcp.setFontSize = setFontSize;\n\tcp.circle = circle;\n\n\treturn cp;\n}\n\nfunction smoothLine( this: CanvasRenderingContext2D, points: any[], path: CanvasPath = null, move = true) {\n\tif (points.length < 2) {\n\t\treturn;\n\t}\n\n\tif (!path) {\n\t\tpath = this;\n\t}\n\n\tif (points.length == 2) {\n\t\tif (move !== false) {\n\t\t\tpath.moveTo(points[0].x, points[0].y);\n\t\t}\n\t\telse {\n\t\t\tpath.lineTo(points[0].x, points[0].y);\n\t\t}\n\n\t\tpath.lineTo(points[1].x, points[1].y);\n\t\treturn;\n\t}\n\n\tfunction midPointBtw(p1: IPoint, p2: IPoint ) {\n\t\treturn {\n\t\t\tx: p1.x + (p2.x - p1.x) / 2,\n\t\t\ty: p1.y + (p2.y - p1.y) / 2\n\t\t};\n\t}\n\n\tfunction getQuadraticXY(t: number, sx: number, sy: number, cp1x: number, cp1y: number, ex: number, ey: number) : IPoint {\n\t\treturn {\n\t\t\tx: (1 - t) * (1 - t) * sx + 2 * (1 - t) * t * cp1x + t * t * ex,\n\t\t\ty: (1 - t) * (1 - t) * sy + 2 * (1 - t) * t * cp1y + t * t * ey\n\t\t};\n\t}\n\n\tlet p1 = points[0],\n\t\tp2 = points[1],\n\t\tp3 = p1;\n\n\tpath.moveTo(p1.x, p1.y);\n\n\tfor (let i = 1, len = points.length; i < len; i++) {\n\t\t// we pick the point between pi+1 & pi+2 as the\n\t\t// end point and p1 as our control point\n\t\tlet midPoint = midPointBtw(p1, p2);\n\t\t//this.quadraticCurveTo(p1.x, p1.y, midPoint.x, midPoint.y);\n\t\tfor (let i = 0; i < 8; i++) {\n\t\t\tlet { x, y } = getQuadraticXY(i / 8, p3.x, p3.y, p1.x, p1.y, midPoint.x, midPoint.y);\n\t\t\tpath.lineTo(x, y);\n\t\t}\n\n\t\tp1 = points[i];\n\t\tp2 = points[i + 1];\n\t\tp3 = midPoint;\n\t}\n\n\t// Draw last line as a straight line while\n\t// we wait for the next point to be able to calculate\n\t// the bezier control point\n\n\tpath.lineTo(p1.x, p1.y);\n}\n\nfunction smoothLineEx(this: CanvasRenderingContext2D, _points: any[], tension: number = 0.5, numOfSeg: number = 10, path: CanvasPath = null, move = true, close = false) {\n\n\tlet points = [];\n\n\t//pts = points.slice(0);\n\tfor (let p = 0, pc = _points.length; p < pc; p++) {\n\t\tpoints.push(_points[p].x);\n\t\tpoints.push(_points[p].y);\n\t}\n\n\tlet pts,\n\t\ti = 1,\n\t\tl = points.length,\n\t\trPos = 0,\n\t\trLen = (l - 2) * numOfSeg + 2 + (close ? 2 * numOfSeg : 0),\n\t\tres = new Float32Array(rLen),\n\t\tcache = new Float32Array((numOfSeg + 2) * 4),\n\t\tcachePtr = 4;\n\n\tpts = points.slice(0);\n\n\tif (close) {\n\t\tpts.unshift(points[l - 1]);\t\t\t\t// insert end point as first point\n\t\tpts.unshift(points[l - 2]);\n\t\tpts.push(points[0], points[1]); \t\t// first point as last point\n\t}\n\telse {\n\t\tpts.unshift(points[1]);\t\t\t\t\t// copy 1. point and insert at beginning\n\t\tpts.unshift(points[0]);\n\t\tpts.push(points[l - 2], points[l - 1]);\t// duplicate end-points\n\t}\n\n\t// cache inner-loop calculations as they are based on t alone\n\tcache[0] = 1;\t\t\t\t\t\t\t\t// 1,0,0,0\n\n\tfor (; i < numOfSeg; i++) {\n\n\t\tvar st = i / numOfSeg,\n\t\t\tst2 = st * st,\n\t\t\tst3 = st2 * st,\n\t\t\tst23 = st3 * 2,\n\t\t\tst32 = st2 * 3;\n\n\t\tcache[cachePtr++] = st23 - st32 + 1;\t// c1\n\t\tcache[cachePtr++] = st32 - st23;\t\t// c2\n\t\tcache[cachePtr++] = st3 - 2 * st2 + st;\t// c3\n\t\tcache[cachePtr++] = st3 - st2;\t\t\t// c4\n\t}\n\n\tcache[cachePtr] = 1;\t\t\t\t\t\t// 0,1,0,0\n\n\t// calc. points\n\tparse(pts, cache, l);\n\n\tif (close) {\n\t\t//l = points.length;\n\t\tpts = [];\n\t\tpts.push(points[l - 4], points[l - 3], points[l - 2], points[l - 1]); // second last and last\n\t\tpts.push(points[0], points[1], points[2], points[3]); // first and second\n\t\tparse(pts, cache, 4);\n\t}\n\n\tfunction parse(pts: number[], cache: Float32Array, l: number) {\n\n\t\tfor (var i = 2, t; i < l; i += 2) {\n\n\t\t\tvar pt1 = pts[i],\n\t\t\t\tpt2 = pts[i + 1],\n\t\t\t\tpt3 = pts[i + 2],\n\t\t\t\tpt4 = pts[i + 3],\n\n\t\t\t\tt1x = (pt3 - pts[i - 2]) * tension,\n\t\t\t\tt1y = (pt4 - pts[i - 1]) * tension,\n\t\t\t\tt2x = (pts[i + 4] - pt1) * tension,\n\t\t\t\tt2y = (pts[i + 5] - pt2) * tension;\n\n\t\t\tfor (t = 0; t < numOfSeg; t++) {\n\n\t\t\t\tvar c = t << 2, //t * 4;\n\n\t\t\t\t\tc1 = cache[c],\n\t\t\t\t\tc2 = cache[c + 1],\n\t\t\t\t\tc3 = cache[c + 2],\n\t\t\t\t\tc4 = cache[c + 3];\n\n\t\t\t\tres[rPos++] = c1 * pt1 + c2 * pt3 + c3 * t1x + c4 * t2x;\n\t\t\t\tres[rPos++] = c1 * pt2 + c2 * pt4 + c3 * t1y + c4 * t2y;\n\t\t\t}\n\t\t}\n\t}\n\n\t// add last point\n\tl = close ? 0 : points.length - 2;\n\tres[rPos++] = points[l];\n\tres[rPos] = points[l + 1];\n\n\tif (!path) {\n\t\tpath = this;\n\t}\n\n\t// add lines to path\n\tfor (let i = 0, l = res.length; i < l; i += 2) {\n\t\tif (i == 0 && move !== false) {\n\t\t\tpath.moveTo(res[i], res[i + 1]);\n\t\t}\n\t\telse {\n\t\t\tpath.lineTo(res[i], res[i + 1]);\n\t\t}\n\t}\n}\n\nfunction line(this: CanvasRenderingContext2D, x1: number, y1: number, x2: number, y2: number, color: string, lineWidth: number = 1) {\n\tthis.save();\n\tthis.beginPath();\n\tthis.moveTo(x1, y1);\n\tthis.lineTo(x2, y2);\n\tthis.lineWidth = lineWidth;\n\tthis.strokeStyle = color;\n\tthis.stroke();\n\tthis.restore();\n}\n\nfunction roundRect(this: CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number) {\n\t//this.beginPath( );\n\tthis.moveTo(x + radius, y);\n\tthis.lineTo(x + width - radius, y);\n\tthis.quadraticCurveTo(x + width, y, x + width, y + radius);\n\tthis.lineTo(x + width, y + height - radius);\n\tthis.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n\tthis.lineTo(x + radius, y + height);\n\tthis.quadraticCurveTo(x, y + height, x, y + height - radius);\n\tthis.lineTo(x, y + radius);\n\tthis.quadraticCurveTo(x, y, x + radius, y);\n\tthis.closePath();\n}\n\nfunction calcTextSize( this: CanvasRenderingContext2D, text: string, rounded = false): { width: number, height: number } {\n\n\tlet fh = this.measureText(text);\n\tlet lh = fh.fontBoundingBoxAscent + fh.fontBoundingBoxDescent;\n\n\tif (rounded) {\n\t\treturn { width: Math.round(fh.width), height: Math.round(lh) };\n\t}\n\telse {\n\t\treturn { width: fh.width, height: lh };\n\t}\n}\n\nfunction setFontSize( this: CanvasRenderingContext2D, fs: number) {\n\tlet fsize = Math.round(fs) + 'px';\n\tthis.font = this.font.replace(/\\d+px/, fsize);\n}\n\nfunction circle( this: CanvasRenderingContext2D, x: number, y: number, radius: number) {\n\tthis.moveTo(x + radius, y);\n\tthis.arc(x, y, radius, 0, Math.PI * 2);\n}\n\ntype PaintHandler = (ctx: CanvasPainter) => any;\n\n/**\n * \n */\n\n//export class CanvasProps extends CProps\n//{\n// low level handlers\n//mousedown?: (ev: MouseEvent) => any;\n//mousemove?: (ev: MouseEvent) => any;\n//mouseup?: (ev: MouseEvent) => any;\n//mouseleave?: (ev: MouseEvent) => any;\n//mousewheel?: (ev: WheelEvent) => any;\n//click?: (ev: MouseEvent) => any;\n//dblclick?: (ev: MouseEvent) => any;\n//touchstart?: (ev: TouchEvent) => any;\n//touchmove?: (ev: TouchEvent) => any;\n//touchend?: (ev: TouchEvent) => any;\n//keydown?: (ev: KeyboardEvent) => any;\n//keyup?: (ev: KeyboardEvent) => any;\n//}\n\n\n/**\n * Standard Canvas\n */\n\nexport class Canvas extends Component<CanvasProps, CanvasEventMap> {\n\n\tprivate m_iwidth: number = -1;\n\tprivate m_iheight: number = -1;\n\tprivate m_scale = 1.0;\n\tprivate m_canvas: Component;\n\n\tconstructor(props: CanvasProps) {\n\t\tsuper(props);\n\n\t\t//if( props.mousedown )\t{ this.setDomEvent( 'mousedown', props.mousedown ); }\n\t\t//if( props.mousemove )\t{ this.setDomEvent( 'mousemove', props.mousemove ); }\n\t\t//if( props.mouseup )\t\t{ this.setDomEvent( 'mouseup', props.mouseup ); }\n\t\t//if( props.mousewheel )\t{ this.setDomEvent( 'wheel', props.mousewheel ); }\n\t\t//if( props.mouseleave )\t{ this.setDomEvent( 'mouseleave', props.mouseleave ); }\n\t\t//if( props.click )\t\t{ this.setDomEvent( 'click', props.click ); }\n\t\t//if( props.dblclick )\t{ this.setDomEvent( 'dblclick', props.dblclick ); }\n\t\t//if( props.touchstart )\t{ this.setDomEvent( 'touchstart', props.touchstart ); }\n\t\t//if( props.touchmove )\t{ this.setDomEvent( 'touchmove', props.touchmove ); }\n\t\t//if( props.touchend )\t{ this.setDomEvent( 'touchend', props.touchend ); }\n\t\t//if( props.keydown )\t\t{ this.setDomEvent( 'keydown', props.keydown ); this.setAttribute( 'tabindex', 0 ); }\n\t\t//if( props.keyup )\t\t{ this.setDomEvent( 'keyup', props.keyup ); this.setAttribute( 'tabindex', 0 ); }\n\t\t//if( props.paint ) \t\t{ this.onPaint( props.paint ); }\n\n\t\tthis.setDomEvent('sizechange', () => { this._paint(); })\n\t\tthis.mapPropEvents( props, 'paint' );\n\t}\n\n\t/** @ignore */\n\trender() {\n\t\tthis.m_iwidth = -1;\n\t\tthis.m_iheight = -1;\n\t\tthis.m_canvas = new Component({\n\t\t\ttag: 'canvas'\n\t\t});\n\n\t\tthis.setContent( this.m_canvas );\n//\t\tthis.redraw(10);\n\t}\n\n\tupdate(delay=0 ) {\n\t\tthis.m_iheight = this.m_iwidth = -1;\n\t\tsuper.update( delay );\n\t}\n\n\t/**\n\t * scale the whole canvas\n\t */\n\n\tscale(scale: number) {\n\t\tthis.m_scale = scale;\n\t\tthis.m_iwidth = -1;\t// force recalc\n\t\tthis.redraw();\n\t}\n\n\t/**\n\t * return the internal canvas\n\t */\n\tget canvas(): Component {\n\t\treturn this.m_canvas;\n\t}\n\n\t/**\n\t * redraw the canvas (force a paint)\n\t */\n\n\tprivate $update_rep = 0;\n\tpublic redraw(wait?: number) {\n\n\t\tif (wait !== undefined) {\n\n\t\t\tif( ++this.$update_rep>=20 ) {\n\t\t\t\tthis.stopTimer( 'update' );\n\t\t\t\tthis._paint( );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.startTimer( 'update', wait, false, () => this._paint() );\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tthis.stopTimer( 'update' );\n\t\t\tthis._paint();\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\tprivate _paint() {\n\t\tthis.$update_rep = 0;\n\n\t\tlet dom = this.dom;\n\t\tif (!this.isUserVisible() ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet canvas = this.m_canvas.dom as HTMLCanvasElement,\n\t\t\tw = dom.clientWidth,\n\t\t\th = dom.clientHeight;\n\n\t\tlet ctx = <CanvasPainter>canvas.getContext('2d');\n\t\tif (w != this.m_iwidth || h != this.m_iheight) {\n\t\t\t// adjustment for HDPI\n\t\t\tlet devicePixelRatio = window.devicePixelRatio || 1;\n\t\t\tlet backingStoreRatio = (<any>ctx).webkitBackingStorePixelRatio ||\n\t\t\t\t(<any>ctx).mozBackingStorePixelRatio ||\n\t\t\t\t(<any>ctx).msBackingStorePixelRatio ||\n\t\t\t\t(<any>ctx).oBackingStorePixelRatio ||\n\t\t\t\t(<any>ctx).backingStorePixelRatio || 1;\n\n\t\t\tlet canvas = this.canvas;\n\n\t\t\tif (devicePixelRatio !== backingStoreRatio || this.m_scale != 1.0) {\n\t\t\t\tlet ratio = devicePixelRatio / backingStoreRatio,\n\t\t\t\t\trw = w * ratio,\n\t\t\t\t\trh = h * ratio;\n\n\t\t\t\tcanvas.setAttribute('width', '' + rw);\n\t\t\t\tcanvas.setAttribute('height', '' + rh);\n\t\t\t\tcanvas.setStyleValue('width', w);\n\t\t\t\tcanvas.setStyleValue('height', h);\n\n\t\t\t\tratio *= this.m_scale;\n\t\t\t\tctx.scale(ratio, ratio);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcanvas.setAttribute('width', '' + w);\n\t\t\t\tcanvas.setAttribute('height', '' + h);\n\t\t\t\tcanvas.setStyleValue('width', w);\n\t\t\t\tcanvas.setStyleValue('height', h);\n\t\t\t\tctx.scale(1, 1);\n\t\t\t}\n\n\t\t\tthis.m_iwidth = w;\n\t\t\tthis.m_iheight = h;\n\t\t}\n\n\t\tif (w && h) {\n\n\t\t\tlet cc = mkPainter(ctx, w, h);\n\n\t\t\tif (this.m_props.autoClear) {\n\t\t\t\tcc.clearRect(0, 0, w, h);\n\t\t\t}\n\n\t\t\tcc.save();\n\t\t\tcc.translate(-0.5, -0.5);\n\t\t\tthis.paint(cc);\n\t\t\tcc.restore();\n\t\t}\n\t}\n\n\tprotected paint(ctx: CanvasPainter) {\n\t\ttry {\n\t\t\tif (this.m_props.painter) {\n\t\t\t\tthis.m_props.painter(ctx);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.emit('paint', EvPaint(ctx));\n\t\t\t}\n\t\t}\n\t\tcatch (x) {\n\t\t\tconsole.assert(false, x);\n\t\t}\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file cardview.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Component, CProps, CEventMap } from './component'\nimport { EvChange } from './x4events'\n\nimport { IconID } from './icon'\nimport { asap, isFunction } from './tools'\n\nexport type PageOrCallback = Component | (() => Component);\n\nexport interface ICardViewItem {\n\ticon?: IconID;\n\tname: string,\n\ttitle: string;\n\tpage: PageOrCallback; // pre builded page\n}\n\n\ninterface CardViewEventMap extends CEventMap {\n\tchange?: EvChange;\t// value is page name\n}\n\nexport interface CardViewProps extends CProps<CardViewEventMap> {\n\tpages: ICardViewItem[];\n\tactive?: string;\n}\n\ninterface ICardItemEx extends ICardViewItem {\n\tselector: Component;\n\tactive: boolean;\n}\n\n/**\n * Standard CardView class\n * a card view is composed of multiples pages with only one visible at a time.\n * pages can be selected by a component (like tabs ou sidebar).\n * or by code.\n */\n\nexport class CardView<P extends CardViewProps = CardViewProps, E extends CardViewEventMap = CardViewEventMap> extends Component<P, E>\n{\n\tprotected m_cards: ICardItemEx[];\n\tprotected m_ipage: string;\t// initialy selected page\n\tprotected m_cpage: ICardItemEx;\t// currently selected page\n\n\tconstructor(props: P) {\n\t\tsuper(props);\n\n\t\tthis.m_cards = [];\n\t\tthis.m_ipage = props.active;\n\t\tthis.m_cpage = null;\n\n\t\tthis.singleShot(() => {\n\t\t\tthis.setPages(props.pages);\n\t\t});\n\t}\n\n\t/** @ignore */\n\trender() {\n\n\t\tlet pages: any[] = [];\n\t\tthis.m_cards.forEach((p) => {\n\t\t\tif (p.page) {\n\t\t\t\tpages.push(p.page);\n\t\t\t}\n\t\t});\n\n\t\tthis.setContent(pages);\n\t}\n\n\t/**\n\t * switch to a specific card\n\t * @param name - card name as define in constructor\n\t */\n\n\tpublic switchTo(name?: string) {\n\n\t\tif (this.m_cards.length == 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (name === undefined) {\n\t\t\tname = this.m_cards[0].name;\n\t\t}\n\n\t\tif (name === this.m_cpage?.name) {\n\t\t\treturn;\n\t\t}\n\n\t\t// hide old one\n\t\tif (this.m_cpage) {\n\t\t\tif (this.m_cpage.selector) {\n\t\t\t\tthis.m_cpage.selector.removeClass('@active');\n\t\t\t}\n\n\t\t\tif (this.m_cpage.page && !(this.m_cpage.page instanceof Function)) {\n\t\t\t\tlet page = <Component>this.m_cpage.page;\n\t\t\t\tpage.removeClass('@active');\n\t\t\t\tpage.addClass('@hidden');\n\t\t\t}\n\t\t}\n\n\t\tthis.m_cpage = this.m_cards.find((card) => card.name == name);\n\n\t\tif (this.m_cpage) {\n\t\t\tif (this.m_cpage.page) {\n\t\t\t\tif (isFunction(this.m_cpage.page)) {\n\t\t\t\t\tthis.m_cpage.page = this.m_cpage.page();\n\t\t\t\t\tconsole.assert(this.m_cpage.page != null, 'You must return a valid component');\n\t\t\t\t}\n\n\t\t\t\tlet page = this.m_cpage.page as Component;\n\t\t\t\tpage.addClass('@active');\n\t\t\t\tpage.removeClass('@hidden');\n\n\t\t\t\tif (!page.dom) {\n\t\t\t\t\tthis._preparePage(page);\n\t\t\t\t}\n\n\t\t\t\tif (this.m_cpage.selector) {\n\t\t\t\t\tthis.m_cpage.selector.addClass('@active');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.emit('change', EvChange(this.m_cpage.name));\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tsetPages(pages: ICardViewItem[]) {\n\t\tlet active = this._initTabs(pages);\n\t\tif (active) {\n\t\t\tasap(() => {\n\t\t\t\tthis.switchTo(active)\n\t\t\t\tthis.update();\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _initTabs(pages: ICardViewItem[] ): any {\n\n\t\tif (!pages) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet active = this.m_ipage;\n\n\t\tpages.forEach((p) => {\n\n\t\t\tif( !p ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet card: ICardItemEx = { \n\t\t\t\t...p,\n\t\t\t\tselector: this._prepareSelector(p),\n\t\t\t\tactive: false\n\t\t\t}\n\n\t\t\tthis.m_cards.push(card);\n\n\t\t\tif (!active) {\n\t\t\t\tactive = p.name;\n\t\t\t}\n\n\t\t\tif (card.active) {\n\t\t\t\tactive = p.name;\n\t\t\t}\n\t\t});\n\n\t\treturn active;\n\t}\n\n\tprotected _updateSelector() {\n\t}\n\n\t/**\n\t * prepare the cardinfo\n\t * can be used by derivations to create & set selectors\n\t */\n\n\tprotected _prepareSelector(card: ICardViewItem): Component {\n\t\treturn null;\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprotected _preparePage(page: Component) {\n\t\tpage.setStyleValue('flex', 1);\n\t\tpage.addClass('@tab-page');\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file checkbox.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { CEventMap, Component, CProps } from './component'\nimport { EvChange, EventCallback } from './x4events'\nimport { HtmlString } from './tools'\n\nimport { Input } from './input'\nimport { Label } from './label'\n\n// ============================================================================\n// [CHECKBOX]\n// ============================================================================\n\ninterface CheckBoxEventMap extends CEventMap {\n\tchange?: EvChange;\n}\n\ninterface CheckBoxProps extends CProps<CheckBoxEventMap> {\n\tname?: string;\n\n\ttext?: string | HtmlString;\n\n\tchecked?: boolean;\n\tvalue?: string;\n\tslider?: boolean;\n\n\tlabelWidth?: number; // <0 mean flex value\n\tlabelAlign?: 'left' | 'right';\n\talign?: 'left' | 'right';\n\n\tchange?: EventCallback<EvChange>;\n}\n\n/**\n * Standard CheckBox\n */\n\nexport class CheckBox extends Component<CheckBoxProps, CheckBoxEventMap> {\n\n\tconstructor(props: CheckBoxProps) {\n\n\t\tsuper(props);\n\n\t\tthis.setDomEvent('focus', () => this._setFocus());\n\t\tthis.mapPropEvents( props, 'change' );\n\n\t\tif( props.slider ) {\n\t\t\tthis.addClass( 'slider' );\n\t\t}\n\t}\n\n\t/** @ignore */\n\trender(props: CheckBoxProps) {\n\n\t\t// checkbox\n\n\t\tlet labelWidth = props.labelWidth ?? -1;\n\t\tlet uid = '__cb_' + this.uid;\n\n\t\tthis.setTag( 'label');\n\t\tthis.addClass('@hlayout');\n\t\tthis.addClass(props.align ?? 'left');\n\t\t\n\t\tthis.setContent([\n\t\t\tnew Input({\n\t\t\t\tref: 'input',\n\t\t\t\ttype: 'checkbox',\n\t\t\t\tname: props.name,\n\t\t\t\tid: uid,\n\t\t\t\ttabIndex: props.tabIndex,\n\t\t\t\tvalue: props.value ?? 'on',\n\t\t\t\tattrs: {\n\t\t\t\t\tchecked: props.checked ? '' : undefined\n\t\t\t\t},\n\t\t\t\tdom_events: {\n\t\t\t\t\tchange: this._change.bind(this),\n\t\t\t\t}\n\t\t\t}),\n\t\t\tprops.slider ? new Component( { cls: '@slide-el' } ) : null,\n\t\t\tnew Label({\n\t\t\t\ttext: props.text ?? '',\n\t\t\t\twidth: labelWidth < 0 ? undefined : labelWidth,\n\t\t\t\tflex: labelWidth < 0 ? -labelWidth : undefined,\n\t\t\t\talign: props.labelAlign ?? 'left',\n\t\t\t\tstyle: {\n\t\t\t\t\torder: props.align == 'right' ? -1 : 1,\n\t\t\t\t},\n\t\t\t\tattrs: {\n\t\t\t\t\t\"for\": uid\n\t\t\t\t}\n\t\t\t}),\n\t\t]);\n\t}\n\n\t/**\n\t * check state changed\n\t */\n\n\tprivate _change() {\n\t\tthis.emit('change', EvChange(this.check));\n\t}\n\n\t/**\n\t * focus gained/loosed\n\t */\n\n\tprivate _setFocus() {\n\t\tlet input = this.itemWithRef<Input>('input');\n\t\tinput.focus();\n\t}\n\n\t/**\n\t * @return the checked value\n\t */\n\n\tpublic get check() {\n\t\tif (this.dom) {\n\t\t\tlet input = this.itemWithRef<Input>('input');\n\t\t\tlet dom = input.dom as HTMLInputElement;\n\t\t\treturn dom.checked;\n\t\t}\n\n\t\treturn this.m_props.checked;\n\t}\n\n\t/**\n\t * change the checked value\n\t * @param {boolean} ck new checked value\t\n\t */\n\n\tpublic set check(ck: boolean) {\n\n\t\tif (this.dom) {\n\t\t\tlet input = this.itemWithRef<Input>('input');\n\t\t\tconst dom = input.dom as HTMLInputElement;\n\t\t\tif (dom) {\n\t\t\t\tdom.checked = ck;\n\t\t\t}\n\t\t}\n\n\t\tthis.m_props.checked = ck;\n\t\t//this._change();\t// todo: is it needed when changed by code ? -> no\n\t}\n\n\tget text() {\n\t\treturn this.itemWithRef<Label>('label').text;\n\t}\n\n\tset text(text) {\n\t\tthis.itemWithRef<Label>('label').text = text;\n\t}\n\n\t/**\n\t * toggle the checkbox\n\t */\n\n\tpublic toggle() {\n\t\tthis.check = !this.check;\n\t}\n}\n\n", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file color.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Stylesheet } from './styles'\n\n\nconst colorValues: any = {\n\t'lightsalmon': 0xFFFFA07A,\n\t'lightseagreen': 0xFF20B2AA,\n\t'lightskyblue': 0xFF87CEFA,\n\t'lightslategray': 0xFF778899,\n\t'lightsteelblue': 0xFFB0C4DE,\n\t'lightyellow': 0xFFFFFFE0,\n\t'lime': 0xFF00FF00,\n\t'limegreen': 0xFF32CD32,\n\t'linen': 0xFFFAF0E6,\n\t'magenta': 0xFFFF00FF,\n\t'maroon': 0xFF800000,\n\t'mediumaquamarine': 0xFF66CDAA,\n\t'mediumblue': 0xFF0000CD,\n\t'mediumorchid': 0xFFBA55D3,\n\t'mediumpurple': 0xFF9370DB,\n\t'mediumseagreen': 0xFF3CB371,\n\t'mediumslateblue': 0xFF7B68EE,\n\t'mediumspringgreen': 0xFF00FA9A,\n\t'mediumturquoise': 0xFF48D1CC,\n\t'mediumvioletred': 0xFFC71585,\n\t'midnightblue': 0xFF191970,\n\t'mintcream': 0xFFF5FFFA,\n\t'mistyrose': 0xFFFFE4E1,\n\t'moccasin': 0xFFFFE4B5,\n\t'navajowhite': 0xFFFFDEAD,\n\t'navy': 0xFF000080,\n\t'oldlace': 0xFFFDF5E6,\n\t'olive': 0xFF808000,\n\t'olivedrab': 0xFF6B8E23,\n\t'orange': 0xFFFFA500,\n\t'orangered': 0xFFFF4500,\n\t'orchid': 0xFFDA70D6,\n\t'palegoldenrod': 0xFFEEE8AA,\n\t'palegreen': 0xFF98FB98,\n\t'paleturquoise': 0xFFAFEEEE,\n\t'palevioletred': 0xFFDB7093,\n\t'papayawhip': 0xFFFFEFD5,\n\t'peachpuff': 0xFFFFDAB9,\n\t'peru': 0xFFCD853F,\n\t'pink': 0xFFFFC0CB,\n\t'plum': 0xFFDDA0DD,\n\t'powderblue': 0xFFB0E0E6,\n\t'purple': 0xFF800080,\n\t'red': 0xFFFF0000,\n\t'rosybrown': 0xFFBC8F8F,\n\t'royalblue': 0xFF4169E1,\n\t'saddlebrown': 0xFF8B4513,\n\t'salmon': 0xFFFA8072,\n\t'sandybrown': 0xFFFAA460,\n\t'seagreen': 0xFF2E8B57,\n\t'seashell': 0xFFFFF5EE,\n\t'sienna': 0xFFA0522D,\n\t'silver': 0xFFC0C0C0,\n\t'skyblue': 0xFF87CEEB,\n\t'slateblue': 0xFF6A5ACD,\n\t'slategray': 0xFF708090,\n\t'snow': 0xFFFFFAFA,\n\t'springgreen': 0xFF00FF7F,\n\t'steelblue': 0xFF4682B4,\n\t'tan': 0xFFD2B48C,\n\t'teal': 0xFF008080,\n\t'thistle': 0xFFD8BFD8,\n\t'tomato': 0xFFFF6347,\n\t'turquoise': 0xFF40E0D0,\n\t'violet': 0xFFEE82EE,\n\t'wheat': 0xFFF5DEB3,\n\t'white': 0xFFFFFFFF,\n\t'whitesmoke': 0xFFF5F5F5,\n\t'yellow': 0xFFFFFF00,\n\t'yellowgreen': 0xFF9ACD32,\n\t'aliceblue': 0xFFF0F8FF,\n\t'antiquewhite': 0xFFFAEBD7,\n\t'aqua': 0xFF00FFFF,\n\t'aquamarine': 0xFF7FFFD4,\n\t'azure': 0xFFF0FFFF,\n\t'beige': 0xFFF5F5DC,\n\t'bisque': 0xFFFFE4C4,\n\t'black': 0xFF000000,\n\t'blanchedalmond': 0xFFFFEBCD,\n\t'blue': 0xFF0000FF,\n\t'blueviolet': 0xFF8A2BE2,\n\t'brown': 0xFFA52A2A,\n\t'burlywood': 0xFFDEB887,\n\t'cadetblue': 0xFF5F9EA0,\n\t'chartreuse': 0xFF7FFF00,\n\t'chocolate': 0xFFD2691E,\n\t'coral': 0xFFFF7F50,\n\t'cornflowerblue': 0xFF6495ED,\n\t'cornsilk': 0xFFFFF8DC,\n\t'crimson': 0xFFDC143C,\n\t'cyan': 0xFF00FFFF,\n\t'darkblue': 0xFF00008B,\n\t'darkcyan': 0xFF008B8B,\n\t'darkgoldenrod': 0xFFB8860B,\n\t'darkgray': 0xFFA9A9A9,\n\t'darkgreen': 0xFF006400,\n\t'darkkhaki': 0xFFBDB76B,\n\t'darkmagenta': 0xFF8B008B,\n\t'darkolivegreen': 0xFF556B2F,\n\t'darkorange': 0xFFFF8C00,\n\t'darkorchid': 0xFF9932CC,\n\t'darkred': 0xFF8B0000,\n\t'darksalmon': 0xFFE9967A,\n\t'darkseagreen': 0xFF8FBC8F,\n\t'darkslateblue': 0xFF483D8B,\n\t'darkslategray': 0xFF2F4F4F,\n\t'darkturquoise': 0xFF00CED1,\n\t'darkviolet': 0xFF9400D3,\n\t'deeppink': 0xFFFF1493,\n\t'deepskyblue': 0xFF00BFFF,\n\t'dimgray': 0xFF696969,\n\t'dodgerblue': 0xFF1E90FF,\n\t'firebrick': 0xFFB22222,\n\t'floralwhite': 0xFFFFFAF0,\n\t'forestgreen': 0xFF228B22,\n\t'fuchsia': 0xFFFF00FF,\n\t'gainsboro': 0xFFDCDCDC,\n\t'ghostwhite': 0xFFF8F8FF,\n\t'gold': 0xFFFFD700,\n\t'goldenrod': 0xFFDAA520,\n\t'gray': 0xFF808080,\n\t'green': 0xFF008000,\n\t'greenyellow': 0xFFADFF2F,\n\t'honeydew': 0xFFF0FFF0,\n\t'hotpink': 0xFFFF69B4,\n\t'indianred': 0xFFCD5C5C,\n\t'indigo': 0xFF4B0082,\n\t'ivory': 0xFFFFFFF0,\n\t'khaki': 0xFFF0E68C,\n\t'lavender': 0xFFE6E6FA,\n\t'lavenderblush': 0xFFFFF0F5,\n\t'lawngreen': 0xFF7CFC00,\n\t'lemonchiffon': 0xFFFFFACD,\n\t'lightblue': 0xFFADD8E6,\n\t'lightcoral': 0xFFF08080,\n\t'lightcyan': 0xFFE0FFFF,\n\t'lightgoldenrodyellow': 0xFFFAFAD2,\n\t'lightgreen': 0xFF90EE90,\n\t'lightgrey': 0xFFD3D3D3,\n\t'lightpink': 0xFFFFB6C1,\n\t'none': 0,\n\t'transparent': 0,\n}\n\n\n\nexport class Color\n{\n\tprivate m_value:number;\n\tprivate static custom: Record<string,Color> = {};\n\n\t/**\n\t * @example\n\t * ```ts\n\t * let c = new Color( 255, 255, 255, 0.2 );\n\t * let d = new Color( \"fff\" );\n\t * let e = new Color( \"css:selection-color\" );\n\t * let f = new Color( \"rgba(255,0,255,0.6)\" );\n\t * ```\n\t */\n\n\tconstructor( );\n\tconstructor( value: number | string );\n\tconstructor( value: number | string, alpha: number );\n\tconstructor( r: number, g: number, b: number );\n\tconstructor( r: number, g: number, b: number, a: number );\n\tconstructor( r?: any, g?: any, b?: any, a?: any ) {\n\t\t\n\t\tlet argc = arguments.length;\n\t\tlet self = this;\n\n\t\tfunction _init( ) {\n\n\t\t\tif( !argc ) {\n\t\t\t\treturn 0xff000000;\n\t\t\t}\n\n\t\t\tif( argc==1 ) {\n\n\t\t\t\tif( Number.isSafeInteger(r) ) {\n\t\t\t\t\treturn 0xff000000|(r&0xffffff);\n\t\t\t\t}\n\n\t\t\t\treturn self._getCustomColor( r )\n\t\t\t}\n\t\t\telse if( argc==2 ) {\n\t\t\t\n\t\t\t\tlet base,\n\t\t\t\t\talpha = (((g*255)|0)&0xff)<<24;\n\t\t\t\n\t\t\t\tif( Number.isSafeInteger(r) ) {\n\t\t\t\t\tbase = r;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tbase = self._getCustomColor( r );\n\t\t\t\t}\n\n\t\t\t\treturn (base&0xffffff) | alpha;\n\t\t\t}\n\t\t\telse if( argc==4 && a!==undefined && a<=1.0 ) {\n\t\t\t\n\t\t\t\tif( a<=0 ) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\ta = a*255;\n\t\t\t\ta |= 0; \t// convert to int\n\t\t\t\t\t\n\t\t\t\treturn ((a&0xff)<<24) | ((r&0xff)<<16) | ((g&0xff)<<8) | (b&0xff);\n\t\t\t}\n\t\t\t\n\t\t\treturn 0xff000000 | ((r&0xff)<<16) | ((g&0xff)<<8) | (b&0xff);\n\t\t}\n\t\n\t\tthis.m_value = _init( );\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _shade( percent: number ) { \n\t\tlet t = percent < 0 ? 0 : 255,\n\t\t\tp = percent < 0 ? -percent : percent;\n\n\t\tlet v = this._split( );\n\t\t\t\n\t\treturn new Color( \n\t\t\tMath.round( (t-v.r) * p ) + v.r, \n\t\t\tMath.round( (t-v.g) * p ) + v.g, \n\t\t\tMath.round( (t-v.b) * p ) + v.b, \n\t\t\tv.a / 255 \n\t\t);\n\t}\n\n\t/**\n\t * return a color darken by percent\n\t * @param percent \n\t */\n\n\tdarken( percent: number ) {\n\n\t\tif( percent<0 ) percent = 0;\n\t\tif( percent>100 ) percent = 100;\n\n\t\treturn this._shade( -percent/100 );\n\t}\n\n\t/**\n\t * return a color lighten by percent\n\t * @param percent \n\t */\n\tlighten( percent: number ) {\n\n\t\tif( percent<0 ) percent = 0;\n\t\tif( percent>100 ) percent = 100;\n\n\t\treturn this._shade( percent/100 );\n\t}\n\n\t/**\n\t * mix 2 colors\n\t * @param {rgb} c1 - color 1\n\t * @param {rgb} c2 - color 2\n\t * @param {float} percent - 0.0 to 1.0\n\t * @example \n\t * ```js\n\t * let clr = Color.mix( color1, color2, 0.5 );\n\t * ```\n\t */\n\n\tstatic mix( c1: Color, c2: Color, p: number ) {\n\n\t\tlet e1 = c1._split( ),\n\t\t\te2 = c2._split( );\n\t\t\t\n\t\tlet A = e1.a===e2.a ? e1.a : Math.round( e2.a*p + e1.a*(1-p) ),\n\t\t\tR = e1.r===e2.r ? e1.r : Math.round( e2.r*p + e1.r*(1-p) ),\n\t\t\tG = e1.g===e2.g ? e1.g : Math.round( e2.g*p + e1.g*(1-p) ),\n\t\t\tB = e1.b===e2.b ? e1.b : Math.round( e2.b*p + e1.b*(1-p) );\n\n\t\treturn new Color( R, G, B, A/255 );\n\t}\n\n\t/**\n\t * split the color into it's base element r,g,b & a (!a 1-255)\n\t */\n\tprivate _split( ) {\n\t\tlet f = this.m_value;\n\n\t\treturn { \n\t\t\ta: (f >> 24) & 0xff, \n\t\t\tr: (f >> 16) & 0xff, \n\t\t\tg: (f >> 8) & 0xff, \n\t\t\tb: (f & 0xff)\n\t\t};\n\t}\n\n\t/**\n\t * change the alpha value\n\t */\n\n\tfadeout( percent: number ) {\n\t\tlet el = this._split();\n\t\tel.a = el.a / 255;\n\n\t\tel.a = el.a - el.a * percent / 100.0;\n\t\tif( el.a>1.0 ) {\n\t\t\tel.a = 1.0;\n\t\t}\n\t\telse if( el.a<=0.0 ) {\n\t\t\treturn Color.NONE;\n\t\t}\n\t\t\n\t\treturn new Color( el.r, el.g, el.b, el.a );\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic static fromHSV( h: number, s: number, v: number, a = 1 ) {\n\t\t\n\t\tlet i = Math.min(5, Math.floor(h * 6)),\n f = h * 6 - i,\n p = v * (1 - s),\n q = v * (1 - f * s),\n t = v * (1 - (1 - f) * s);\n\n\t\tlet R, G, B;\n\n switch (i) {\n case 0:\n R = v;\n G = t;\n B = p;\n break;\n case 1:\n R = q;\n G = v;\n B = p;\n break;\n case 2:\n R = p;\n G = v;\n B = t;\n break;\n case 3:\n R = p;\n G = q;\n B = v;\n break;\n case 4:\n R = t;\n G = p;\n B = v;\n break;\n case 5:\n R = v;\n G = p;\n B = q;\n break;\n }\n\n return new Color( R*255, G*255, B*255, a );\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic static toHSV( c: Color ) {\n\t\tlet el = c._split();\n\n\t\tel.r /= 255.0;\n\t\tel.g /= 255.0;\n\t\tel.b /= 255.0;\n\t\tel.a /= 255.0;\n\n\t\tlet max = Math.max(el.r, el.g, el.b),\n\t\t\tmin = Math.min(el.r, el.g, el.b),\n\t\t\tdelta = max - min,\n\t\t\tsaturation = (max === 0) ? 0 : (delta / max),\n\t\t\tvalue = max;\n\n\t\tlet hue;\n\n\t\tif (delta === 0) {\n\t\t\thue = 0;\n\t\t}\n\t\telse {\n\t\t\tswitch (max) {\n\t\t\tcase el.r:\n\t\t\t\thue = (el.g - el.b) / delta / 6 + (el.g < el.b ? 1 : 0);\n\t\t\t\tbreak;\n\n\t\t\tcase el.g:\n\t\t\t\thue = (el.b - el.r) / delta / 6 + 1 / 3;\n\t\t\t\tbreak;\n\n\t\t\tcase el.b:\n\t\t\t\thue = (el.r - el.g) / delta / 6 + 2 / 3;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn { h: hue, s: saturation, v: value, a: el.a };\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic static fromHLS( h: number, l: number, s: number ) {\n\t\n\t\tlet r, g, b;\n\t\tif( s == 0 ){\n\t\t\tr = g = b = l; // achromatic\n\t\t}\n\t\telse{\n\t\t\tfunction hue2rgb(p: number, q: number, t: number){\n\t\t\t\tif(t < 0) t += 1.0;\n\t\t\t\tif(t > 1) t -= 1.0;\n\t\t\t\tif(t < 1/6) return p + (q - p) * 6 * t;\n\t\t\t\tif(t < 1/2) return q;\n\t\t\t\tif(t < 2/3) return p + (q - p) * (2/3 - t) * 6;\n\t\t\t\treturn p;\n\t\t\t}\n\n\t\t\tlet q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n\t\t\tlet p = 2 * l - q;\n\t\t\t\n\t\t\tr = hue2rgb(p, q, h + 1/3);\n\t\t\tg = hue2rgb(p, q, h);\n\t\t\tb = hue2rgb(p, q, h - 1/3);\n\t\t}\n\t\t\n\t\tr = ((r*255) | 0) & 0xff;\n\t\tg = ((g*255) | 0) & 0xff;\n\t\tb = ((b*255) | 0) & 0xff;\n\n\t\treturn new Color( r, g, b );\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic static toHLS( color: Color ) {\n\n\t\tlet f = color.m_value,\n\t\t\tr = ((f >> 16) & 0xff) / 255,\n\t\t\tg = ((f >> 8) & 0xff) / 255,\n\t\t\tb = (f & 0xff) / 255;\n\n\t\tlet minval = r,\n\t\t\tmaxval = r;\n\t\t\n\t\tif (g < minval) {\n\t\t\tminval = g;\n\t\t}\n\n\t\tif (b < minval) {\n\t\t\tminval = b;\n\t\t}\n\t\t\n\t\tif (g > maxval) {\n\t\t\tmaxval = g;\n\t\t}\n\n\t\tif (b > maxval) {\n\t\t\tmaxval = b;\n\t\t}\n\n\t\tlet rnorm = 0,\n\t\t\tgnorm = 0,\n\t\t\tbnorm = 0;\n\n\t\tlet mdiff = maxval - minval;\n\t\tlet msum = maxval + minval;\n\t\tlet light = 0.5 * msum;\n\t\tlet satur, hue;\n\n\t\tif (maxval != minval) {\n\t\t\trnorm = (maxval - r)/mdiff;\n\t\t\tgnorm = (maxval - g)/mdiff;\n\t\t\tbnorm = (maxval - b)/mdiff;\n\t\t} \n\t\telse {\n\t\t\treturn { h: 0, l: light, s: 0 };\n\t\t}\n\n\t\tif( light < 0.5 ) {\n\t\t\tsatur = mdiff/msum;\n\t\t}\n\t\telse {\n\t\t\tsatur = mdiff/(2.0 - msum);\n\t\t}\n\n\t\tif (r == maxval) {\n\t\t\thue = 60.0 * (6.0 + bnorm - gnorm);\n\t\t}\n\t\telse if (g == maxval) {\n\t\t\thue = 60.0 * (2.0 + rnorm - bnorm);\n\t\t}\n\t\telse {\n\t\t\thue = 60.0 * (4.0 + gnorm - rnorm);\n\t\t}\n\n\t\tif (hue > 360) {\n\t\t\thue = hue - 360;\n\t\t}\n\n\t\treturn { h: hue/360.0, l: light, s: satur };\n\t}\n\n\t/**\n\t * get the red value of the color\n\t */\n\n\tred( ) {\n\t\treturn (this.m_value >> 16) & 0xff;\n\t}\n\n\t/**\n\t * get the green value of the color\n\t */\n\n\tgreen( ) {\n\t\treturn (this.m_value >> 8) & 0xff;\n\t}\n\n\t/**\n\t * get the blue value of the color\n\t */\n\n\tblue( ) {\n\t\treturn this.m_value & 0xff;\t \n\t}\n\n\t/**\n\t * get the alpha value of the color\n\t */\n\n\talpha( ) {\n\t\treturn ( (this.m_value >> 24) & 0xff ) / 255;\n\t}\n\n\t/**\n\t * \n\t */\n\n\tvalue( ) {\n\t\treturn this.m_value;\n\t}\n\n\t/**\n\t * convert the color into string value\n\t */\n\n\ttoString( ) {\n\n\t\tlet color = this.m_value;\n\t\tif( color===0 ) {\n\t\t\treturn 'transparent';\n\t\t}\n\n\t\tlet el = this._split( );\n\n\t\tif( el.a===0xff ) {\n\t\t\treturn `rgb(${el.r},${el.g},${el.b})`;\n\t\t}\n\t\telse {\n\t\t\tel.a /= 255;\n\t\t\tlet alpha = el.a.toFixed( 3 );\n\t\t\treturn `rgba(${el.r},${el.g},${el.b},${alpha})`;\n\t\t}\n\t}\n\n\ttoHex( with_alpha = true ) {\n\t\tlet color = this.m_value;\n\t\tif( color===0 ) {\n\t\t\treturn 'transparent';\n\t\t}\n\n\t\tlet el = this._split( );\n\n\t\tif( el.a===0xff || !with_alpha ) {\n\t\t\treturn `#${_hx(el.r)}${_hx(el.g)}${_hx(el.b)}`;\n\t\t}\n\t\telse {\n\t\t\treturn `#${_hx(el.r)}${_hx(el.g)}${_hx(el.b)}${_hx(el.a)}`;\n\t\t}\n\t}\n\n\tpublic static addCustomColor( name: string, value: Color ) {\n\t\tColor.custom[name] = value;\n\t}\n\n\tpublic static addCssColor( name: string ) {\n\t\tlet c = Stylesheet.getVar( name );\n\t\tColor.custom['css:'+name] = Color.parse( c.trim() );\n\t}\n\n\tpublic static parse( str: string ) : Color {\n\t\tlet m;\n\t\n\t\tif( str[0]=='#' ) {\n\t\t\tconst re1 = /#(?<r>[a-fA-F0-9]{2})(?<g>[a-fA-F0-9]{2})(?<b>[a-fA-F0-9]{2})(?<a>[a-fA-F0-9]{2})?/;\n\t\t\tif( (m=re1.exec(str))!==null ) {\n\t\t\t\tlet g = m.groups;\n\t\t\t\treturn new Color( parseInt(g.r,16), parseInt(g.g,16), parseInt(g.b,16), g.a!==undefined ? parseInt(g.a,16)/255.0 : 1.0 );\n\t\t\t}\n\n\t\t\tconst re4 = /#(?<r>[a-fA-F0-9])(?<g>[a-fA-F0-9])(?<b>[a-fA-F0-9])/;\n\t\t\tif( (m=re4.exec(str))!==null ) {\n\t\t\t\tlet gr = m.groups;\n\t\t\t\tconst r = parseInt(gr.r,16);\n\t\t\t\tconst g = parseInt(gr.g,16);\n\t\t\t\tconst b = parseInt(gr.b,16);\n\n\t\t\t\treturn new Color( r<<4|r, g<<4|g, b<<4|b, 1.0 );\n\t\t\t}\n\t\t}\n\n\t\tif( str[0]=='r' ) {\n\t\t\tconst re2 = /rgb\\(\\s*(?<r>\\d+)\\s*\\,\\s*(?<g>\\d+)\\s*\\,\\s*(?<b>\\d+)\\s*\\)/;\n\t\t\tif( (m=re2.exec(str))!==null ) {\n\t\t\t\tlet g = m.groups;\n\t\t\t\treturn new Color( parseInt(g.r,10), parseInt(g.g,10), parseInt(g.b,10), 1.0 );\n\t\t\t}\n\n\t\t\tconst re3 = /rgba\\(\\s*(?<r>\\d+)\\s*\\,\\s*(?<g>\\d+)\\s*\\,\\s*(?<b>\\d+)\\s*\\,\\s*(?<a>[0-9.]+)\\s*\\)/;\n\t\t\tif( (m=re3.exec(str))!==null ) {\n\t\t\t\tlet g = m.groups;\n\t\t\t\treturn new Color( parseInt(g.r,10), parseInt(g.g,10), parseInt(g.b,10), parseFloat(g.a) );\n\t\t\t}\n\t\t}\n\n\t\t\n\t\tconsole.log( \"invalid color value: \"+str );\n\t\treturn new Color(0);\n\t}\n\n\tprivate _getCustomColor( name: string ) : number {\n\n\t\tif( name===null ) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tlet std = colorValues[name];\n\t\tif( std!==undefined ) {\n\t\t\treturn std;\n\t\t}\n\t\t\t\n\t\tif( Color.custom[name]!==undefined ) {\n\t\t\treturn Color.custom[name].m_value;\n\t\t}\n\n\t\tif( name.substr(0,4)=='css:' ) {\n\t\t\tColor.addCssColor( name.substr(4) );\n\t\t\treturn Color.custom[name].m_value;\n\t\t}\n\n\t\treturn Color.parse( name ).m_value;\n\t}\n\t\n\n\tpublic static contrastColor( color: Color ) : Color {\n\t\tlet el = color._split( );\n\t\t \n\t\t// Calculate the perceptive luminance (aka luma) - human eye favors green color... \n \t\tlet luma = ((0.299 * el.r ) + (0.587 * el.g ) + (0.114 * el.b)) / 255;\n\n \t\t// Return black for bright colors, white for dark colors\n \t\treturn luma > 0.5 ? Color.BLACK : Color.WHITE;\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic static WHITE = new Color(255,255,255);\n\n\t/**\n\t * \n\t */\n\n\tpublic static BLACK = new Color(0,0,0);\n\n\t/**\n\t * \n\t */\n\n\tpublic static NONE = new Color(0,0,0,0);\n\n\tstatic valueFromColorName( name: string ): Color {\n\t\n\t\tlet v = colorValues[name];\n\t\t\n\t\tif( v ) {\n\t\t\treturn new Color( v );\n\t\t}\n\t\telse {\n\t\t\treturn null;\n\t\t}\n\t\t\n\t}\n\n\tstatic fromCssVar( varName: string ) {\n\t\treturn new Color( varName ).toString();\n\t}\n}\n\n\nfunction _hx( n: number ) {\n\treturn ('00'+n.toString(16)).substr(-2).toUpperCase();\n}\n\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file request.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\n\n/**\n * TODO: use fetch api\n * \n\nasync function xx( resp, cb ) {\n\tcb( await resp.json() ); \n}\n\nasync function getToto( cb ) {\n fetch('home/toto', { method: 'GET' }).then( (resp) => { xx(resp,cb); } );\n}\n\nfunction dump( resp ) {\n\tconsole.log( resp );\n}\n\ngetToto( dump );\n\n*/\n\n\nimport { isArray, isLiteralObject, isString, NetworkError } from './tools'\n\nconst DEFAULT_TIMEOUT = 10000;\n\nexport interface RequestProps\n{\n\turl: string;\n\tmethod?: 'GET' | 'POST';\n\theaders?: string[];\n\tparams?: any;\n\ttimeout?: number;\n\tresponseType?: 'text' | 'json' | 'arraybuffer';\n\tuserData?: any;\n\n\tsuccess: ( data: any, userData: any ) => void;\n\tfailure?: ( status: number, statusText: string, userData: any ) => void;\n\tprogress?: ( length: number, total: number, display: string ) => void;\n}\n\n\nexport function ajaxRequest( cfg: RequestProps ) : Function {\n\t\n\tlet params,\n\t\turl = cfg.url,\n\t\tmethod = cfg.method || 'GET',\n\t\tformdata = false;\n\n\tif( cfg.params instanceof FormData ) {\n\t\tparams = cfg.params;\n\t\tformdata = true;\n\t}\n\telse if( method=='POST' ) {\n\t\tparams = buildQuery( cfg.params, false );\n\t}\n\telse {\n\t\turl += buildQuery( cfg.params, true );\n\t}\n\n\turl = encodeURI( url );\n\n\tlet xhr = new XMLHttpRequest( );\n\txhr.open( method, url );\n\n\txhr.upload.addEventListener( 'progress', progress, false);\n\txhr.addEventListener( 'timeout', failure );\n\txhr.addEventListener( 'error', failure );\n\txhr.addEventListener( 'load', success );\n\t\n\tif( !formdata ) {\n\t\txhr.setRequestHeader( \"Content-type\", \"application/x-www-form-urlencoded; charset=UTF-8\" );\n\t}\n\t\n\tif( method!='POST' ) {\n\t\txhr.responseType = cfg.responseType || 'json';\n\t\txhr.timeout = cfg.timeout || DEFAULT_TIMEOUT;\n\t}\n\n\tif( cfg.headers ) {\n\t\tfor( let h in cfg.headers) {\n\t\t\txhr.setRequestHeader( h, cfg.headers[h] );\n\t\t}\n\t}\n\n\tfunction progress( ev: ProgressEvent<EventTarget> ) {\n\t\tconsole.log( ev );\n\t\tif( cfg.progress ) {\n\t\t\ttry {\n\t\t\t\tif( ev.lengthComputable ) {\n\t\t\t\t\tlet disp = humanSize( ev.loaded ) + ' / ' + humanSize( ev.total );\n\t\t\t\t\tcfg.progress( ev.loaded, ev.total, disp );\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch( e ) {\n\t\t\t\tconsole.error( 'unhandled exception:', e );\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction humanSize( bytes: number ) {\n\n\t\tlet unit, value: number;\n\n\t\tif( bytes>=1e9 ) {\n\t\t\tunit = 'Gb';\n\t\t\tvalue = bytes/1e9;\t\n\t\t}\n\t\telse if( bytes>=1e6 ) {\n\t\t\tunit = 'Mb';\n\t\t\tvalue = bytes/1e6;\t\n\t\t}\n\t\telse if( bytes>=1e3 ) {\n\t\t\tunit = 'Kb';\n\t\t\tvalue = bytes/1e3;\t\n\t\t}\n\t\telse {\n\t\t\tunit = 'bytes';\n\t\t\tvalue = bytes;\t\n\t\t}\n\n\t\treturn value.toFixed( 2 ) + unit;\n\t}\n\n\tfunction failure( ) {\n\t\tif( cfg.failure ) {\n\t\t\tcfg.failure( xhr.status, xhr.statusText, cfg.userData );\n\t\t}\n\t}\n\n\tfunction success( ) {\n\t\tif( xhr.status>=200 && xhr.status<300 ) {\n\t\t\tif( cfg.success ) {\n\t\t\t\ttry {\n\t\t\t\t\tcfg.success( xhr.response, cfg.userData );\n\t\t\t\t}\n\t\t\t\tcatch( e ) {\n\t\t\t\t\tconsole.error( 'unhandled exception:', e );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tfailure( );\n\t\t}\t\n\t}\n\n\tif( formdata || method=='POST' ) {\n\t\txhr.send( params );\n\t}\n\telse {\n\t\txhr.send( );\n\t}\n\n\treturn function( ) {\n\t\txhr.abort( );\n\t};\n}\n\nfunction buildQuery( params: any, getMethod: boolean ) {\n\n\tif( !params ) {\n\t\treturn '';\n\t}\n\n\tlet query = [];\n\tfor( let key in params ) {\n\n\t\tlet param = params[key];\n\n\t\t// array\n\t\tif( isArray(param) ) {\n\t\t\tfor( let i=0, n=param.length; i<n; i++ ) {\n\t\t\t\tquery.push( encodeURIComponent(key) + '[]=' + encodeURIComponent( ''+param[i] ) );\n\t\t\t}\n\t\t}\n\t\t// simple string ...\n\t\telse {\n\n\t\t\tif( param===undefined ) {\n\t\t\t\tparam = '';\n\t\t\t}\n\t\t\tquery.push( encodeURIComponent(key) + '=' + encodeURIComponent(''+param) );\n\t\t}\n\t}\n\n\tlet result = query.join( '&' );\n\tif( getMethod ) {\n\t\treturn '?' + result;\n\t}\n\telse {\n\t\treturn result;\n\t}\n}\n\n\n//type Identity<T> = { [P in keyof T]: T[P] }\n//type Replace<T, K extends keyof T, TReplace> = Identity<Pick<T, Exclude<keyof T, K>> & {\n// [P in K] : TReplace\n//}>\n//type AjaxRequestInit = Replace< RequestInit, 'body', BodyInit | null | object | undefined >;\n\n\ninterface AjaxRequestInit extends Omit<RequestInit,'body'> {\n\tbody?: BodyInit | null | object;\n\tnoGenX?: boolean;\t// donot generate exception on error\n}\n\n\nexport async function ajaxAsJSON( url: string, init?: AjaxRequestInit ) : Promise<any> {\n\tlet response = await ajax( url, init, 'application/json' );\n\treturn response.json( );\n}\n\nexport async function ajaxAsText( url: string, init?: AjaxRequestInit ) : Promise<any> {\n\tlet response = await ajax( url, init, 'text/plain' );\n\treturn response.text( );\n}\n\n/**\n * use encodeURIComponent for elements in url\n */\n\nexport async function ajax( url: string, init?: AjaxRequestInit, type?: string ) : Promise<Response> {\n\n\tlet options: AjaxRequestInit = { \n\t\tmethod: 'GET',\n\t\theaders: {\n\t\t\t'X-Requested-With': 'XMLHttpRequest'\n\t\t}\n\t}\n\n\tif( type ) {\n\t\toptions.headers['Content-Type'] = type;\n\t}\n\n\tif( init ) {\n\t\toptions = { ...options, ...init };\n\n\t\tif( init.body && !isString(init.body) ) {\n\t\t\tlet cvt = false;\n\t\t\tif( isLiteralObject(init.body) ) {\n\t\t\t\tcvt = true;\n\t\t\t}\n\t\t\telse if( !(init.body instanceof Blob) && !(init.body instanceof ArrayBuffer) && !(init.body instanceof FormData) &&\n\t\t\t\t!(init.body instanceof URLSearchParams) && !(init.body instanceof ReadableStream) )\n\t\t\t{\n\t\t\t\tcvt = true;\n\t\t\t}\n\n\t\t\tif( cvt ) {\n\t\t\t\toptions.body = JSON.stringify( init.body );\n\t\t\t}\n\t\t\telse {\n\t\t\t\toptions.body = init.body;\n\t\t\t}\n\t\t}\n\t}\n\n\tlet response = await fetch( url, options as RequestInit );\n\n\tif( init && init.noGenX ) {\n\t\treturn response;\n\t}\n\telse {\n\t\tif( !response.ok ) {\n\t\t\tthrow new NetworkError( response );\n\t\t}\n\n\t\treturn response;\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file datastore.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { ajaxRequest } from './request';\nimport { isArray, isString } from './tools';\nimport { BasicEvent, EvChange, EventSource, EventMap, MapEvents } from './x4events';\nimport { BaseComponent, BaseComponentEventMap, BaseComponentProps } from './base_component';\n\nexport type ChangeCallback = (type: string, id?: any) => void;\nexport type CalcCallback = () => string;\n\nexport type FieldType = 'string' | 'int' | 'float' | 'date' | 'bool' | 'array' | 'object' | 'any' | 'calc';\nexport type DataIndex = Uint32Array;\n\nexport interface EvDataChange extends BasicEvent {\n\ttype: string;\n\tid: any;\n}\n\nexport function EvDataChange( type: 'create' | 'update' | 'delete' | 'data' | 'change', id?: any ) {\n\treturn BasicEvent<EvDataChange>( { type, id } );\n}\n\n\n\n\n/**\n * fields definition\n * \tfield with index=0 is record id\n */\n\nexport interface MetaData {\n\ttype?: FieldType;\n\tprec?: number;\n\trequired?: boolean;\n\tcalc?: (rec: Record) => any;\n\tmodel?: Record;\t// in case of array of subtypes, the model\n}\n\nexport interface FieldInfo extends MetaData {\n\tname: string;\n}\n\n/**\n * \n */\n\nclass MetaInfos {\n\tname: string;\n\tid: string;\t\t\t\t// field name holding 'id' record info\n\tfields: FieldInfo[];\t// field list\n\n\tconstructor( name: string ) {\n\t\tthis.name = name;\n\t\tthis.id = undefined;\n\t\tthis.fields = [];\n\t}\n}\n\nconst metaFields = Symbol( 'metaField' );\n\nfunction _getMetas( obj: object, create = true ) : MetaInfos {\n\t\n\tlet ctor = obj.constructor;\n\tlet mfld = ctor.hasOwnProperty(metaFields) ? ctor[metaFields] : undefined;\n\t\n\tif( mfld===undefined ) {\n\t\tif( !create ) {\n\t\t\tconsole.assert( mfld!==undefined );\n\t\t}\n\t\t\n\t\t// construct our metas\n\t\tmfld = new MetaInfos( ctor.name );\n\n\t\t// merge with parent class metas\n\t\tlet pctor = Object.getPrototypeOf(ctor);\n\t\tif( pctor!=Record ) {\n\t\t\tlet pmetas = pctor[metaFields];\n\t\t\tmfld.fields = [...pmetas.fields, ...mfld.fields ]\n\t\t\t\n\t\t\tconsole.assert( mfld.id===undefined, 'cannot define mutiple record id' );\n\t\t\tif( !mfld.id ) {\n\t\t\t\tmfld.id = pmetas.id;\n\t\t\t}\n\t\t}\t\n\n\t\tobj.constructor[metaFields] = mfld;\n\t}\n\n\treturn mfld;\n}\n\nexport namespace data {\n\n/**\n * define a record id\n * @example\n *\t\\@data_id()\n * id: string; // this field is the record id\n **/\n\n\texport function id( ) {\n\treturn ( ownerCls, fldName ) => {\n\t\tlet metas = _getMetas( ownerCls );\n\t\tmetas.fields.push( {\n\t\t\tname: fldName,\n\t\t\ttype: 'any',\n\t\t\trequired: true,\n\t\t});\n\n\t\tmetas.id = fldName;\n\t}\n}\n\n/**\n * @ignore\n */\n\n\texport function field( data: MetaData ) {\n\n\treturn ( ownerCls, fldName ) => {\n\t\tlet metas = _getMetas( ownerCls );\n\t\tmetas.fields.push( {\n\t\t\tname: fldName,\n\t\t\t...data\n\t\t} );\n\t}\n}\n\n/**\n * following member is a string field\n * @example\n * \\@data_string()\n * my_field: string;\t// this field will be seen as a string\n */\n\n\texport function string( props?: MetaData ) {\n\t\treturn field( { ...props, type: 'string' } );\n}\n\n/**\n * following member is an integer field\n * @example\n * \\@data_string()\n * my_field: number;\t// this field will be seen as an integer\n */\n\n\texport function int( props?: MetaData ) {\n\t\treturn field( { ...props, type: 'int' } );\n}\n\n/**\n * following member is a float field\n * @example\n * \\@data_float()\n * my_field: number;\t// this field will be seen as a float\n */\n\n\texport function float( props?: MetaData ) {\n\t\treturn field( { ...props, type: 'float' } );\n}\n\n/**\n * following member is a boolean field\n * @example\n * \\@data_bool()\n * my_field: boolean;\t// this field will be seen as a boolean\n */\n\n\texport function bool( props?: MetaData ) {\n\t\treturn field( { ...props, type: 'bool' } );\n}\n\n/**\n * following member is a date field\n * @example\n * \\@data_date()\n * my_field: date;\t// this field will be seen as a date\n */\n\n\texport function date( props?: MetaData ) {\n\t\treturn field( { ...props, type: 'date' } );\n}\n\n/**\n * following member is a calculated field\n * @example\n * \\@data_calc( )\n * get my_field(): string => {\n * \treturn 'hello';\n * };\t\n */\n\n\texport function calc( props?: MetaData ) {\n\t\treturn field( { ...props, type: 'calc'} ) \n}\n\n\n\n/**\n * \n */\n\ninterface RecordConstructor {\n new ( data?: any, id?: any ): Record;\n}\n\n/**\n * following member is a record array\n * @example\n * \\@data_array( )\n * my_field(): TypedRecord[];\t\n */\n\n\texport function array( ctor: RecordConstructor, props?: MetaData ) {\n\t\treturn data.field( { ...props, type: 'array', model: ctor ? new ctor() : null } )\n\t}\n\n}\n\n\n\n\n/**\n * record model\n */\n\nexport class Record {\n\t\n\tconstructor( data?: any, id?: any ) {\n\n\t\tif( data!==undefined ) {\n\t\t\tthis.unSerialize( data, id );\n\t\t}\n\t}\n\n\tclone( source?: any ) {\n\t\tlet rec = new (this.constructor as any)( );\n\t\tif( source ) {\n\t\t\trec.unSerialize( source );\n\t\t}\n\t\treturn rec;\n\t}\n\n\t/**\n\t * get the record unique identifier\n\t * by default the return value is the first field\n\t * @return unique identifier\n\t */\n\n\tgetID(): any { \n\t\tlet metas = _getMetas( this, false );\n\t\treturn this[metas.id];\n\t}\n\n\t/**\n\t * MUST IMPLEMENT\n\t * @returns fields descriptors\n\t */\n\n\tgetFields(): FieldInfo[] { \n\t\tlet metas = _getMetas( this, false );\n\t\treturn metas.fields;\n\t}\n\n\t/**\n\t * \n\t */\n\n\tvalidate( ) : Error[] {\n\t\t\n\t\tlet errs: Error[] = null;\n\n\t\tlet fields = this.getFields( );\n\t\tfields.forEach( (fi) => {\n\t\t\tif( fi.required && !this.getField(fi.name) ) {\n\t\t\t\tif( errs ) {\n\t\t\t\t\terrs = [];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\terrs.push( new Error( `field ${fi.name} is required.` ) );\n\t\t\t}\n\t\t})\n\n\t\treturn errs;\n\t}\n\n\t//mapAnyFields() {\n\t//\tthis.getFields = ( ) => {\n\t//\t\treturn Object.keys( this ).map( (name) => {\n\t//\t\t\treturn <FieldInfo>{ name };\n\t//\t\t});\t\t\t\n\t//\t}\n\t//}\n\n\tgetFieldIndex( name: string ) : number {\n\t\tlet fields = this.getFields( );\n\t\treturn fields.findIndex( (fd) => fd.name == name );\n\t}\n\n\t/**\n\t * default serializer\n\t * @returns an object with known record values\n\t */\n\n\tserialize(): any { \n\t\tlet rec = {};\n\n\t\tthis.getFields().forEach((f) => {\n\t\t\tif( f.calc === undefined ) {\n\t\t\t\trec[f.name] = rec[f.name];\n\t\t\t}\n\t\t});\n\n\t\treturn rec;\n\t}\n\t\n\t/**\n\t * default unserializer\n\t * @param data - input data \n\t * @returns a new Record\n\t */\n\n\tunSerialize(data: any, id?: any) : Record { \n\n\t\tlet fields = this.getFields();\n\n\t\tfields.forEach( (sf) => {\n\t\t\tlet value = data[sf.name];\n\t\t\tif (value !== undefined) {\n\t\t\t\tthis[sf.name] = this._convertField( sf, value );\n\t\t\t}\n\t\t});\n\n\t\tif( id!==undefined ) {\n\t\t\tthis[fields[0].name] = id;\n\t\t}\n\t\telse {\n\t\t\tconsole.assert( this.getID()!==undefined ); // store do not have ID field\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * field conversion\n\t * @param field - field descriptor\n\t * @param input - value to convert\n\t * @returns the field value in it's original form\n\t */\n\n\tprotected _convertField( field: FieldInfo, input: any ) : any {\n\t\t\n\t\t//TODO: boolean\n\n\t\tswitch( field.type ) {\n\t\t\tcase 'float': {\n\t\t\t\tlet ffv: number = typeof (input) === 'number' ? input : parseFloat(input);\n\t\t\t\t\n\t\t\t\tif (field.prec !== undefined) {\n\t\t\t\t\tlet mul = Math.pow(10, field.prec);\n\t\t\t\t\tffv = Math.round(ffv * mul) / mul;\n\t\t\t\t}\n\t\t\t\n\t\t\t\treturn ffv;\n\t\t\t}\n\n\t\t\tcase 'int': {\n\t\t\t\treturn typeof (input) === 'number' ? input : parseInt(input);\n\t\t\t}\n\n\t\t\tcase 'date': {\n\t\t\t\treturn isString(input) ? new Date(input) : input;\n\t\t\t}\n\n\t\t\tcase 'array': {\n\t\t\t\tlet result = [];\n\t\t\t\n\t\t\t\tif( field.model ) {\n\t\t\t\t\tinput.forEach( ( v ) => {\n\t\t\t\t\t\tresult.push( field.model.clone( v ) );\n\t\t\t\t\t})\n\t\t\t\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn input;\n\t}\n\n\t/**\n\t * get raw value of a field\n\t * @param name - field name or field index\n\t */\n\n\tgetRaw( name: string | number ) : any {\n\t\t\n\t\tlet idx;\n\t\tlet fields = this.getFields( );\n\n\t\tif( typeof(name) === 'string' ) {\n\t\t\tidx = fields.findIndex( fi => fi.name == name );\n\t\t\tif( idx < 0 ) {\n\t\t\t\tconsole.assert( false, 'unknown field: '+name);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t}\n\t\telse if( name<fields.length ) {\n\t\t\tif( name<0 ) {\n\t\t\t\treturn undefined\n\t\t\t}\n\n\t\t\tidx = name;\n\t\t}\n\t\telse {\n\t\t\tconsole.assert( false, 'bad field name: '+name);\n\t\t\treturn undefined;\n\t\t}\n\n\t\tlet fld = fields[idx];\n\t\tif( fld.calc!==undefined ) {\n\t\t\treturn fld.calc( this );\n\t\t}\n\t\t\n\t\treturn this[fld.name];\n\t}\n\n\t/**\n\t * \n\t * @param name \n\t * @param data \n\t */\n\n\tsetRaw( name: string, data: string ) {\n\t\tthis[name] = data;\n\t}\n\n\t/**\n\t * get field value (as string)\n\t * @param name - field name\n\t * @example\n\t * let value = record.get('field1');\n\t */\n\n\tgetField( name: string ): string {\n\t\tlet v = this.getRaw( name );\n\t\treturn (v===undefined || v===null) ? '' : ''+v;\n\t}\n\n\t/**\n\t * set field value\n\t * @param name - field name\n\t * @param value - value to set\n\t * @example\n\t * record.set( 'field1', 7 );\n\t */\n\n\tsetField(name: string, value: any) {\n\t\tlet fields = this.getFields( );\n\t\tlet idx = fields.findIndex( fi => fi.name == name );\n\n\t\tif( idx < 0 ) {\n\t\t\tconsole.assert( false, 'unknown field: '+name);\n\t\t\treturn;\n\t\t}\n\n\t\tlet fld = fields[idx];\n\t\tif( fld.calc!==undefined ) {\n\t\t\tconsole.assert( false, 'cannot set calc field: '+name);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tthis.setRaw( fld.name, value );\n\t}\n}\n\n/**\n * by default, the field id is rhe first member or the record\n */\n\nexport class AutoRecord extends Record {\n\n\tprivate m_data;\n\tprivate m_fid: string;\n\n\tconstructor( data: any ) {\n\t\tsuper( );\n\n\t\tthis.m_data = data;\n\t}\n\n\tgetID( ) {\n\t\tif( !this.m_fid ) {\n\t\t\tlet fnames = Object.keys( this.m_data );\n\t\t\tthis.m_fid = fnames[0];\n\t\t}\n\n\t\treturn this.m_data[this.m_fid];\n\t}\n\n\tgetFields( ) : FieldInfo[] {\n\t\tlet fnames = Object.keys( this.m_data );\n\t\tlet fields: FieldInfo[] = fnames.map( (n) => {\n\t\t\treturn {\n\t\t\t\tname: n\n\t\t\t};\n\t\t})\n\n\t\treturn fields;\n\t}\n\n\tgetRaw( name: string ) : string {\n\t\treturn this.m_data[name];\n\t}\n\n\tsetRaw( name: string, data: string ) {\n\t\tthis.m_data[name] = data;\n\t}\n\n\tclone( data ) {\n\t\treturn new AutoRecord( {...data} );\n\t}\n}\n\n/**\n * \n */\n\ninterface DataEventMap extends BaseComponentEventMap {\n\tchange?: EvChange;\n}\n\ntype DataSolver = ( data: any ) => Record[];\n\nexport interface DataProxyProps extends BaseComponentProps<DataEventMap> {\n\turl: string;\n\tparams?: string[];\n\tsolver?: DataSolver;\n}\n\nexport class DataProxy extends BaseComponent<DataProxyProps,DataEventMap> {\n\n\tconstructor( props: DataProxyProps ) {\n\t\tsuper( props );\n\t}\n\n\tasync load( url?: string ) {\n\t\tif( url ) {\n\t\t\tthis.m_props.url = url;\n\t\t}\n\t\telse {\n\t\t\turl = this.m_props.url;\n\t\t}\n\n\t\tif( this.m_props.params ) {\n\t\t\turl += '?' + this.m_props.params.join( '&' );\n\t\t}\n\n\t\tconst r = await fetch( url );\n\t\tif( r.ok ) {\n\t\t\tconst raw = await r.json( );\n\t\t\t\n\t\t\tlet json = raw;\n\t\t\tif( this.m_props.solver ) {\n\t\t\t\tjson = this.m_props.solver( json );\n\t\t\t}\n\n\t\t\tthis.emit( 'change', EvChange(json,raw) );\n\t\t}\n\t}\n}\n\n\n/**\n * \n */\n\ninterface DataStoreProps<T extends Record> extends BaseComponentProps<DataStoreEventMap> {\n\tmodel: T;\n\tdata?: T[];\n\turl?: string;\n\tautoload?: false;\n}\n\n\ninterface DataStoreEventMap extends EventMap {\n\tdata_change: EvDataChange;\n}\n\n\n\n/**\n * \n */\n\nexport class DataStore<T extends Record = Record> extends EventSource<DataStoreEventMap> {\n\t\n\tprotected m_model: T;\n\tprotected m_fields: FieldInfo[];\n\tprotected m_records: T[];\n\n\tprotected m_proxy: DataProxy;\n\tprotected m_rec_index: DataIndex;\n\n\tconstructor(props: DataStoreProps<T> ) {\n\t\tsuper( );\n\n\t\tthis.m_fields = undefined;\n\t\tthis.m_records = [];\n\t\tthis.m_rec_index = null;\n\t\tthis.m_model = props.model;\n\t\tthis.m_fields = props.model.getFields();\n\n\t\tif (props.data) {\n\t\t\tthis.setRawData( props.data );\n\t\t}\n\t\telse if( props.url ) {\n\t\t\tthis.m_proxy = new DataProxy( {\n\t\t\t\turl: props.url,\n\t\t\t\tsolver: props.solver,\n\t\t\t\tevents: { change: (ev) => { this.setData( ev.value ); } }\n\t\t\t});\n\n\t\t\tif( props.autoload!=false ) {\n\t\t\t\tthis.m_proxy.load( );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * \n\t * @param records \n\t */\n\n\tasync load( url?: string ) {\n\t\treturn this.m_proxy.load( url );\n\t}\n\n\tasync reload( ) {\n\t\treturn this.m_proxy.load( );\n\t}\n\n\t/**\n\t * convert raw objects to real records from model\n\t * @param records \n\t */\n\n\tpublic setData( records: any[] ) {\n\n\t\tlet realRecords: T[] = [];\n\n\t\trecords.forEach( (rec) => {\n\t\t\trealRecords.push( this.m_model.clone(rec) );\n\t\t});\n\n\t\tthis.setRawData( realRecords );\n\t}\n\n\t/**\n\t * just set the records\n\t * @param records - must be of the same type as model\n\t */\n\n\tpublic setRawData(records: T[]) {\n\n\t\tthis.m_records = records;\n\t\tthis._rebuildIndex( );\n\t\tthis.emit( 'data_change', EvDataChange( 'change' ) );\n\t}\n\t\n\n\tprivate _rebuildIndex( ) {\n\t\tthis.m_rec_index = null; // null to signal that we have to run on records instead of index\n\t\tthis.m_rec_index = this.createIndex( null ); // prepare index (remove deleted)\n\t\tthis.m_rec_index = this.sortIndex( this.m_rec_index, null ); // sort by id\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic update( rec: T ) {\n\t\tlet id = rec.getID();\n\t\tlet index = this.indexOfId(id);\n\t\tif (index < 0) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.m_records[this.m_rec_index[index]] = rec;\n\t\tthis.emit( 'data_change', EvDataChange( 'update', id ) );\n\t\treturn true;\n\t}\n\n\t/**\n\t * \n\t * @param data \n\t */\n\n\tpublic append( rec: T | any ) {\n\n\t\tif( !(rec instanceof Record) ) {\n\t\t\tlet nrec = this.m_model.clone( );\n\t\t\trec = nrec.unSerialize( rec );\n\t\t}\n\n\t\tconsole.assert( rec.getID() );\n\n\t\tthis.m_records.push( rec );\n\t\tthis._rebuildIndex( );\n\t\tthis.emit( 'data_change', EvDataChange( 'create', rec.getID() ) );\n\t}\n\n\t/**\n\t * \n\t */\n\n\tgetMaxId( ) {\n\t\tlet maxID = undefined;\n\t\tthis.m_records.forEach( (r) => {\n\t\t\tlet rid = r.getID( );\n\t\t\tif( maxID===undefined || maxID<rid ) {\n\t\t\t\tmaxID = rid;\n\t\t\t}\n\t\t});\n\n\t\treturn maxID;\n\t}\n\n\t/**\n\t * \n\t * @param id \n\t */\n\n\tpublic delete(id: any): boolean {\n\n\t\tlet idx = this.indexOfId( id );\n\t\tif( idx<0 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tidx = this.m_rec_index[idx];\n\n\t\t// mark as deleted\n\t\tthis.m_records.splice( idx, 1 );\n\t\tthis._rebuildIndex( );\n\t\tthis.emit( 'data_change', EvDataChange( 'delete', id ) );\n\t\treturn true;\n\t}\n\n\t/**\n\t * return the number of records\n\t */\n\n\tget count( ) : number {\n\t\treturn this.m_rec_index ? this.m_rec_index.length : this.m_records.length;\n\t}\n\n\t/**\n\t * return the fields\n\t */\n\n\tget fields( ) : FieldInfo [] {\n\t\treturn this.m_fields;\n\t}\n\n\t/**\n\t * find the index of the element with the given id\n\t */\n\n\tpublic indexOfId(id: any ): number {\n\n\t\t//if( this.count<10 ) {\n\t\t//\tthis.forEach( (rec) => rec.getID() == id );\n\t\t//}\n\n\t\tfor( let lim = this.count, base = 0; lim != 0; lim >>= 1 ) {\n\t\t\t\n\t\t\tlet p = base + (lim >> 1); // int conversion\n\t\t\tlet idx = this.m_rec_index[p];\n\t\t\tlet rid = this.m_records[idx].getID( );\n\t\n\t\t\tif( rid==id ) {\n\t\t\t\treturn p;\n\t\t\t}\n\n\t\t\tif( rid<id ) {\n\t\t\t\tbase = p+1;\n\t\t\t\tlim--;\n\t\t\t}\n\t\t}\n\t\n\t\treturn -1;\n\t}\n\n\t/**\n\t * return the record by it's id \n\t * @returns record or null\n\t */\n\n\tpublic getById(id: any): T {\n\t\tlet idx = this.indexOfId( id );\n\t\tif( idx<0 ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tidx = this.m_rec_index[idx];\n\t\treturn this.m_records[idx];\n\t}\n\n\t/**\n\t * return a record by it's index\n\t * @returns record or null\n\t */\n\n\tpublic getByIndex( index: number ): T {\n\t\tlet idx = this.m_rec_index[index];\n\t\treturn this._getRecord( idx );\n\t}\n\n\tprivate _getRecord( index: number ) : T {\n\t\treturn this.m_records[index] ?? null;\n\t}\n\n\tpublic moveTo( other: DataStore<T> ) {\n\t\tother.setRawData( this.m_records );\n\t}\n\t\n\t/**\n\t * create a new view on the DataStore\n\t * @param opts \n\t */\n\n\tcreateView( opts?: DataViewProps<T> ) : DataView<T> {\n\t\tlet eopts = { ...opts, store: this };\n\t\treturn new DataView( eopts );\n\t}\n\n\t/**\n\t * \n\t */\n\n\tcreateIndex( filter: FilterInfo ) : DataIndex {\n\n\t\tif( filter && filter.op==='empty-result' ) {\n\t\t\treturn new Uint32Array(0);\n\t\t}\n\t\t\n\t\tlet index = new Uint32Array( this.m_records.length );\n\t\tlet iidx = 0;\n\t\t\t\n\t\tif( !filter ) {\n\t\t\t// reset filter\n\t\t\tthis.forEach( (rec, idx) => {\n\t\t\t\tindex[iidx++] = idx;\n\t\t\t} );\n\t\t}\n\t\telse {\n\t\t\tif( typeof(filter.op)==='function' ) {\n\n\t\t\t\tlet fn = <FilterFunc>filter.op;\n\n\t\t\t\t// scan all records and append only interesting ones\n\t\t\t\tthis.forEach( (rec, idx) => {\n\n\t\t\t\t\t// skip deleted\n\t\t\t\t\tif( !rec ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif( fn(rec) ) {\n\t\t\t\t\t\tindex[iidx++] = idx;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet filterFld = this.m_model.getFieldIndex( filter.field );\t // field index to filter on\n\t\t\t\tif( filterFld<0 ) {\n\t\t\t\t\t// unknown filter field, nothing inside\n\t\t\t\t\tconsole.assert( false, 'unknown field name in filter' )\n\t\t\t\t\treturn new Uint32Array(0);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tlet filterValue = filter.value;\n\t\t\t\tif( isString(filterValue) && !filter.caseSensitive ) {\n\t\t\t\t\tfilterValue = filterValue.toUpperCase( );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfunction _lt( recval: string ) : boolean {\n\t\t\t\t\treturn recval < filterValue;\n\t\t\t\t}\n\n\t\t\t\tfunction _le( recval: string ) : boolean {\n\t\t\t\t\treturn recval <= filterValue;\n\t\t\t\t}\n\n\t\t\t\tfunction _eq( recval: string ) : boolean {\n\t\t\t\t\treturn recval == filterValue;\n\t\t\t\t}\n\n\t\t\t\tfunction _neq( recval: string ) : boolean {\n\t\t\t\t\treturn recval != filterValue;\n\t\t\t\t}\n\n\t\t\t\tfunction _ge( recval: string ) : boolean {\n\t\t\t\t\treturn recval >= filterValue;\n\t\t\t\t}\n\n\t\t\t\tfunction _gt( recval: string ) : boolean {\n\t\t\t\t\treturn recval > filterValue;\n\t\t\t\t}\n\n\t\t\t\tfunction _re( recval: string ) : boolean {\n\t\t\t\t\tfilterRe.lastIndex = -1;\n\t\t\t\t\treturn filterRe.test( recval );\n\t\t\t\t}\n\n\t\t\t\tlet filterFn;\t// filter fn \n\t\t\t\tlet filterRe;\t// if fielter is regexp\n\t\t\t\tif( filterValue instanceof RegExp ) {\n\t\t\t\t\tfilterRe = filterValue;\n\t\t\t\t\tfilterFn = _re;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tswitch( filter.op ) {\n\t\t\t\t\t\tcase '<':\t{ filterFn = _lt; break; }\n\t\t\t\t\t\tcase '<=': \t{ filterFn = _le; break; }\n\t\t\t\t\t\tcase '=': \t{ filterFn = _eq; break; }\n\t\t\t\t\t\tcase '>=': \t{ filterFn = _ge; break; }\n\t\t\t\t\t\tcase '>': \t{ filterFn = _gt; break; }\n\t\t\t\t\t\tcase '<>': { filterFn = _neq; break; }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\n\t\t\t\t// scan all records and append only interesting ones\n\t\t\t\tthis.forEach( (rec, idx) => {\n\n\t\t\t\t\t// skip deleted\n\t\t\t\t\tif( !rec ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet field = rec.getRaw( filterFld );\n\t\t\t\t\tif( field===null || field===undefined ) {\n\t\t\t\t\t\tfield = '';\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfield = ''+field;\n\t\t\t\t\t\tif( !filter.caseSensitive ) {\n\t\t\t\t\t\t\tfield = field.toUpperCase( );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet keep = filterFn( field );\n\t\t\t\t\tif( keep ) {\n\t\t\t\t\t\tindex[iidx++] = idx;\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn index.slice( 0, iidx );\n\t}\n\n\tsortIndex( index: DataIndex, sort: SortProp[] ) {\n\t\t\n\t\tinterface sort_info {\n\t\t\tfidx: number,\n\t\t\tasc: boolean\n\t\t}\n\n\t\tlet bads = 0;\t\t// unknown fields\n\t\tlet fidxs: sort_info[] = [];\t\t// fields indexes\n\n\t\t// if no fields are given, reset sort by id\n\t\tif ( sort===null ) {\n\t\t\tfidxs.push( { fidx: 0, asc: true } );\n\t\t}\n\t\telse {\n\t\t\tfidxs = sort.map( (si) => {\n\t\t\t\t\n\t\t\t\tlet fi = this.m_model.getFieldIndex( si.field );\n\t\t\t\tif (fi == -1) {\n\t\t\t\t\tconsole.assert( false, 'unknown field name in sort' )\n\t\t\t\t\tbads++;\n\t\t\t\t}\n\n\t\t\t\treturn { fidx: fi, asc: si.ascending };\n\t\t\t});\n\t\t}\n\n\t\t// unknown field or nothing to sort on ??\n\t\tif( bads || fidxs.length==0 ) {\n\t\t\treturn index;\n\t\t}\n\n\t\t// sort only by one field : optimize it\n\t\tif( fidxs.length==1 ) {\n\n\t\t\tlet field = fidxs[0].fidx;\n\t\t\tindex.sort( ( ia, ib ) => {\n\n\t\t\t\tlet va = this.getByIndex(ia).getRaw( field ) ?? '';\n\t\t\t\tlet vb = this.getByIndex(ib).getRaw( field ) ?? '';\n\t\t\t\tif (va > vb) { return 1; }\n\t\t\t\tif (va < vb) { return -1; }\n\t\t\t\treturn 0;\n\t\t\t} );\n\n\t\t\t// just reverse if \n\t\t\tif( !fidxs[0].asc ) {\n\t\t\t\tindex.reverse( );\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tindex.sort( ( ia, ib ) => {\n\n\t\t\t\tfor( let fi=0; fi<fidxs.length; fi++ ) {\n\n\t\t\t\t\tlet fidx = fidxs[fi].fidx;\n\t\t\t\t\tlet mul = fidxs[fi].asc ? 1 : -1;\n\n\t\t\t\t\tlet va = this.getByIndex(ia).getRaw( fidx ) ?? '';\n\t\t\t\t\tlet vb = this.getByIndex(ib).getRaw( fidx ) ?? '';\n\t\t\t\t\tif (va > vb) { return mul; }\n\t\t\t\t\tif (va < vb) { return -mul; }\n\t\t\t\t}\n\n\t\t\t\treturn 0;\n\t\t\t} );\n\t\t}\n\n\t\treturn index\t\n\t}\n\n\t/**\n\t * \n\t */\n\n\tforEach( cb: ( rec:T, index: number ) => any ) {\n\t\t\n\t\tif( this.m_rec_index ) {\n\t\t\tthis.m_rec_index.some( (ri,index) => {\n\t\t\t\tif( cb( this.m_records[ri], index ) ) {\n\t\t\t\t\treturn index;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tthis.m_records.some( ( rec, index ) => {\n\t\t\t\tif( rec ) {\n\t\t\t\t\tif( cb( rec, index ) ) {\n\t\t\t\t\t\treturn index;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t}\n\n\texport( ) {\n\t\treturn this.m_records;\n\t}\n\n\tchanged( ) {\n\t\tthis.emit( 'data_change', EvDataChange('change') );\n\t}\n}\n\n\n// :: VIEWS ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\nexport interface EvViewChange extends BasicEvent {\n\taction: string;\n}\n\nexport function EvViewChange( action: 'filter' | 'sort' | 'change' ) {\n\treturn BasicEvent<EvViewChange>( { action } );\n}\n\ninterface DataViewEventMap extends BaseComponentEventMap {\n\tview_change: EvViewChange;\n}\n\ninterface DataViewProps<T extends Record> extends BaseComponentProps<DataViewEventMap> {\n\tstore?: DataStore<T>;\n\tfilter?: FilterInfo;\n\torder?: string | SortProp[] | SortProp;\n}\n\nexport type FilterFunc = ( rec: Record ) => boolean;\n\nexport interface FilterInfo {\n\top: '<' | '<=' | '=' | '>=' | '>' | '<>' | 'empty-result' | FilterFunc,\t// emptydb mean return an empty result always\n\tfield?: string;\n\tvalue?: string | RegExp; // if regexp then operator is =\n\tcaseSensitive?: boolean;\n}\n\n\nexport interface SortProp {\n\tfield: string; \t\t\t// \n\tascending: boolean;\t\t// \n}\n\n\n\n/**\n * Dataview allow different views of the DataStore.\n * You can sort the columns & filter data\n * You can have multiple views for a single DataStore\n */\n\nexport class DataView<T extends Record = Record> extends BaseComponent<DataViewProps<T>,DataViewEventMap>\n{\n\tprotected m_index: DataIndex;\n\tprotected m_store: DataStore<T>;\t\n\n\tprotected m_sort: SortProp[];\n\tprotected m_filter: FilterInfo;\n\n\tconstructor( props: DataViewProps<T> ) {\n\t\tsuper( props );\n\n\t\tthis.m_store = props.store;\n\t\tthis.m_index = null;\n\t\tthis.m_filter = null;\n\t\tthis.m_sort = null;\n\n\t\tthis.filter( props.filter );\n\t\t\n\t\tif( props.order ) {\n\t\t\tif( isString(props.order) ) {\n\t\t\t\tthis.sort( [ { field: props.order, ascending: true } ] );\n\t\t\t}\n\t\t\telse if( isArray(props.order) ) {\n\t\t\t\tthis.sort( props.order );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.sort( [props.order] );\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tthis.sort( null );\n\t\t}\n\n\t\tthis.m_store.on( 'data_change', ( e ) => this._storeChange(e) );\n\t}\n\n\tprivate _storeChange( ev: EvDataChange ) {\n\t\t\n\t\tthis._filter( this.m_filter, ev.type!='change' );\n\t\tthis._sort( this.m_sort, ev.type!='change' );\n\t\t\n\t\tthis.emit( 'view_change', EvViewChange( 'change' ) );\n\t}\n\n\t/**\n\t * \n\t * @param filter \n\t */\n\n\tpublic filter( filter?: FilterInfo ) : number {\n\n\t\tthis.m_index = null; // null to signal that we have to run on records instead of index\n\t\treturn this._filter( filter, true );\n\t}\n\n\tprivate _filter( filter: FilterInfo, notify: boolean) : number {\n\n\t\tthis.m_index = this.m_store.createIndex( filter );\n\t\tthis.m_filter = filter;\n\n\t\t// need to sort again:\n\t\tif( this.m_sort ) {\n\t\t\tthis.sort( this.m_sort );\n\t\t}\n\t\t\n\t\tif( notify ) {\n\t\t\tthis.emit( 'view_change', EvViewChange( 'filter' ) );\n\t\t}\n\n\t\treturn this.m_index.length;\n\t}\n\n\t/**\n\t * \n\t * @param columns \n\t * @param ascending \n\t */\n\n\tpublic sort( props: SortProp[] ) {\n\t\tthis._sort( props, true );\n\t}\n\n\tprivate _sort( props: SortProp[], notify: boolean ) {\n\t\tthis.m_index = this.m_store.sortIndex( this.m_index, props );\n\t\tthis.m_sort = props;\n\n\t\tif( notify ) {\n\t\t\tthis.emit( 'view_change', EvViewChange( 'sort' ) );\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tget store ( ) {\n\t\treturn this.m_store;\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic get count() {\n\t\treturn this.m_index.length;\n\t}\n\n\t/**\n\t * \n\t * @param id \n\t */\n\n\tpublic indexOfId(id): number {\n\t\tlet ridx = this.m_store.indexOfId( id );\n\t\treturn this.m_index.findIndex( (rid) => rid === ridx );\n\t}\n\n\t/**\n\t * \n\t * @param index \n\t */\n\n\tpublic getByIndex(index: number): T {\n\t\t\n\t\tif (index >= 0 && index < this.m_index.length) {\n\t\t\tlet rid = this.m_index[index];\n\t\t\treturn this.m_store.getByIndex( rid );\n\t\t}\t\n\t\t\n\t\treturn null;\n\t}\n\n\t/**\n\t * \n\t * @param id \n\t */\n\n\tpublic getById( id: any): T {\n\t\treturn this.m_store.getById( id );\n\t}\n\n\tchanged( ) {\n\t\tthis.emit( 'view_change', EvViewChange('change') );\n\t}\n\n\t/**\n\t * \n\t */\n\n\t forEach( cb: ( rec:T, index: number ) => any ) {\n\t\tthis.m_index.some( ( index ) => {\n\t\t\tlet rec = this.m_store.getByIndex( index );\n\t\t\tif( rec ) {\n\t\t\t\tif( cb( rec, index ) ) {\n\t\t\t\t\treturn index;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t}\n}\n\n\n\n", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file combobox.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\n/**\n * TODO: replace custom combo list by listview or gridview\n */\n\nimport { x4document } from './x4dom'\n\nimport { Component, CProps, ContainerEventMap } from './component'\nimport { EvChange, EvSelectionChange, EventCallback } from './x4events'\n\nimport { Input } from './input'\nimport { Label } from './label'\nimport { Button } from './button'\nimport { HLayout } from './layout'\nimport { PopupListView, ListViewItem, EvCancel, PopulateItems } from './listview';\nimport { DataStore, DataView, Record } from './datastore'\nimport { isFunction, HtmlString } from './tools'\nimport { Tooltip } from './tooltips'\nimport { _tr } from './i18n'\n\nexport interface ComboStoreProxyProps {\n\tstore: DataView | DataStore;\n\tdisplay: ( rec: Record ) => string | HtmlString;\n}\n\n// ============================================================================\n// [COMBOBOX]\n// ============================================================================\n\nexport interface ComboItemRender {\n\t( itm: ListViewItem ) : Component;\n}\n\ninterface ComboBoxEventMap extends ContainerEventMap {\n\treadonly change: EvChange;\t// value change (event.value = new value as id)\n\treadonly selectionChange?: EvSelectionChange; // ( event.value = new value as ListItem)\n\treadonly cancel?: EvCancel;\n}\n\nexport interface ComboBoxProps extends CProps<ComboBoxEventMap> {\n\ttabIndex?: number | boolean;\n\tname?: string;\n\treadOnly?: boolean;\n\trequired?: true;\n\t\n\tlabel?: string;\t\t\t\t\t\t\t\n\tlabelWidth?: number; // < 0 for flex \n\t\t\t\t\t\t // =0 to adjust label width \n\t\t\t\t\t\t // > 0 to specify a width\n\n\tlabelAlign?: 'left' | 'right';\t\n\n\titems?: ListViewItem[] | PopulateItems;\n\tvalue?: any; // shown value at init\n\n\trenderer?: ComboItemRender;\n\tselectionChange?: EventCallback<EvSelectionChange>;// shortcut to events: { selectionChange: ... }\n\teditable?: boolean;\n}\n\nabstract class InputLike extends Component {\n\tabstract setValue( text: string ): void;\n\tabstract getValue( ): string;\n\tabstract showError( text: string ): void;\n\tabstract clearError( ): void;\n}\n\n\n/**\n * @review use textedit\n */\n\nexport class ComboBox extends HLayout<ComboBoxProps,ComboBoxEventMap> {\n\t\n\tprivate m_ui_input: Input | InputLike;\n\tprivate m_ui_button: Button;\n\tprivate m_popup: PopupListView;\n\tprivate m_lockpop: boolean;\n\tprivate m_lockchg: boolean;\n\tprivate m_popvis: boolean;\n\tprivate m_selection: ListViewItem;\n\t\t\n\tconstructor(props: ComboBoxProps) {\n\t\tsuper(props);\n\n\t\tif( !props.editable ) {\n\t\t\tthis.setDomEvent( 'keypress', () => this.showPopup() );\n\t\t}\n\n\t\tthis.setDomEvent( 'click', () => {\n\t\t\tif( this.m_props.editable ) {\n\t\t\t\tthis.m_ui_input.focus( );\n\t\t\t}\n\t\t\t\n\t\t\tthis.showPopup();\n\t\t} );\n\n\t\tthis.setDomEvent(\"keydown\", e => this._onKey(e));\n\t\tthis.mapPropEvents(props, 'selectionChange' );\n\t\t\n\t\tthis.m_popvis = false;\n\t\tthis.m_lockpop = false;\n\t\tthis.m_lockchg = false;\n\t}\n\n\t_onKey(e: KeyboardEvent ) {\n if (this.m_popvis) {\n if (e.key == \"ArrowUp\" || e.key == \"ArrowDown\") {\n\t\t\t\tthis.m_lockpop = true;\n this.m_popup.handleKey(e);\n this.m_lockpop = false;\n e.preventDefault();\n e.stopPropagation();\n }\n else if (e.key == \"Escape\") {\n this._hidePopup();\n e.preventDefault();\n e.stopPropagation();\n }\n }\n }\n\n\tset items( items: ListViewItem[] ) {\n\t\tthis.m_props.items = items;\n\t\tif( this.m_popup ) {\n\t\t\tthis.m_popup.items = items;\n\t\t}\n\t}\n\t\n\t/** @ignore */\t\n\trender( props: ComboBoxProps ) {\n\n\t\tif( !props.renderer ) {\n\t\t\t\n\t\t\tthis.setClass('@required', props.required);\n\n\t\t\tconst input = new Input( {\n\t\t\t\tflex \t: 1,\n\t\t\t\treadOnly : this.m_props.editable ? false : true,\n\t\t\t\ttabIndex : 0,\n\t\t\t\tname: props.name,\n\t\t\t\tvalue_hook: {\n\t\t\t\t\tget: (): string => { return this.value; },\n\t\t\t\t\tset: (v: string) => { this.value = v; }\n\t\t\t\t},\n\t\t\t\tdom_events: {\n\t\t\t\t\tfocus: () => {\n\t\t\t\t\t\tthis.clearError();\n\t\t\t\t\t\tif( this.m_props.editable && input.value.length==0 ) {\n\t\t\t\t\t\t\tthis.showPopup( );\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tinput: ( ) => {\n\t\t\t\t\t\tif( this.m_lockchg ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst text = input.value;\n\t\t\t\t\t\tthis.m_selection = { id: undefined, text };\n\t\t\t\t\t\tlet items = this.showPopup( );\n\t\t\t\t\t\tif( items && items.length && items[0].text==text ) {\n\t\t\t\t\t\t\tthis.m_selection = { id: items[0].id, text };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.m_ui_input = input;\n\t\t}\n\t\telse {\n\t\t\tthis.m_ui_input = new Component( { \n\t\t\t\tflex: 1, \n\t\t\t\tcls: '@fake-input @hlayout', \n\t\t\t\ttabIndex: 1 \n\t\t\t} ) as any;\n\t\t}\n\n\t\tlet width = undefined,\n\t\t\tflex = undefined;\n\n\t\tlet labelWidth = props.labelWidth ?? 0;\n\t\t\t\t\n\t\tif( labelWidth>0 ) {\n\t\t\twidth = labelWidth;\n\t\t}\n\t\telse if( labelWidth<0 ) {\n\t\t\tflex = -labelWidth;\n\t\t}\n\n\t\tthis.setContent([\n\t\t\t// todo: why 'label1' class name\n\t\t\tnew Label({\n\t\t\t\tcls: 'label1' + (props.label ? '' : ' @hidden'),\t\n\t\t\t\ttext: props.label,\n\t\t\t\twidth,\n\t\t\t\tflex,\n\t\t\t\talign: props.labelAlign\n\t\t\t}),\n\t\t\tnew HLayout({\n\t\t\t\tflex: 1,\n\t\t\t\tcontent: [\n\t\t\t\t\tthis.m_ui_input,\n\t\t\t\t\tthis.m_ui_button = new Button({\n\t\t\t\t\t\tcls: 'gadget',\n\t\t\t\t\t\ticon: 'var( --x4-icon-angle-down )',\n\t\t\t\t\t\ttabIndex: false,\n\t\t\t\t\t\tclick: () => {\n\t\t\t\t\t\t\tthis.showPopup( false )\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdom_events: {\n\t\t\t\t\t\t\tfocus: () => { \n\t\t\t\t\t\t\t\tthis.clearError();\n\t\t\t\t\t\t\t\tthis.dom.focus(); \n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t]\n\t\t\t}),\n\t\t]);\n\n\t\tif (props.value !== undefined) {\n\t\t\tthis.value = props.value;\n\t\t}\n\t}\n\n\tcomponentDisposed( ) {\n\t\tif( this.m_popup ) {\n\t\t\tthis.m_popup.close( );\n\t\t}\n\n\t\tsuper.componentDisposed( );\n\t}\n\n\t/** \n\t * display the popup \n\t */\n\n\tshowPopup( filter_items: boolean = true ) {\n\n\t\tlet props = this.m_props;\n\t\tif (props.readOnly || this.hasClass(\"@disable\") ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tlet items = props.items;\n\t\tif( isFunction( items ) ) {\n\t\t\tconst filter = filter_items ? (this.m_ui_input as Input).value : null;\n\t\t\titems = items( filter );\n\t\t}\n\t\t\n\t\tif( items.length==0 ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// need creation ?\n\t\t\n\t\tif( !this.m_popup ) {\n\t\t\tlet cstyle = this.getComputedStyle( );\n\t\t\tlet fontFamily = cstyle.value( 'fontFamily' );\n\t\t\tlet fontSize = cstyle.value( 'fontSize' );\n\n\t\t\t// prepare the combo listview\n\t\t\tthis.m_popup = new PopupListView({\n\t\t\t\tcls: '@combo-popup',\n\t\t\t\tpopulate: props.populate,\n\t\t\t\trenderItem: this.m_props.renderer,\n\t\t\t\tselectionChange: (e) => {\n\n\t\t\t\t\tthis._selectItem(e);\n\t\t\t\t\t\n\t\t\t\t\tif (!this.m_lockpop) {\n this._hidePopup();\n this.focus();\n }\n\t\t\t\t},\n\t\t\t\tcancel: ( e ) => this.signal( 'cancel', e ),\n\t\t\t\tstyle: {\n\t\t\t\t\tfontFamily,\n\t\t\t\t\tfontSize\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.m_popup.items = items;\n\t\n\t\tlet r1 = this.m_ui_button.getBoundingRect(),\n\t\t\tr2 = this.m_ui_input.getBoundingRect();\n\n\t\tthis.m_popup.setStyle({\n\t\t\tminWidth: r1.right - r2.left,\n\t\t});\n\n\t\tthis.m_popup.displayAt(r2.left, r2.bottom);\n\t\tthis.m_popvis = true;\n\t\tthis.startTimer(\"focus-check\", 100, true, () => this._checkFocus());\n\n\t\tif( this.value!==undefined ) {\n\t\t\tthis.m_popup.selection = this.value;\n\t\t}\n\n\t\treturn items;\n\t}\n\n\t/**\n\t * \n\t */\n\n\tvalidate( ) {\n\t\tif( this.m_props.required && !this.m_selection ) {\n\t\t\tthis.showError(_tr.global.required_field);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic showError(text: string) {\n\t\tthis.m_ui_input.showError( text );\n\t}\n\n\tpublic clearError() {\n\t\tthis.m_ui_input.clearError( );\n\t}\n\n\t/** @ignore\n\t */\n\n\tprivate _selectItem( ev: EvSelectionChange ) {\n\n\t\tlet item: ListViewItem = ev.selection as ListViewItem;\n\t\tif( !item ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.m_lockchg = true;\n\t\tthis._setInput( item, true );\n\t\tthis.m_lockchg = false;\n\t\t\t\t\t\n\t\tthis.m_selection = {\n\t\t\tid: \titem.id,\n\t\t\ttext: \titem.text\n\t\t};\n\n\t\tthis.emit( 'selectionChange', EvSelectionChange( item ) );\n\t\tthis.emit( 'change', EvChange(item.id) );\n\t\t//this.m_ui_input.focus( );\n\t\t//this.m_popup.hide( );\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _setInput( item: ListViewItem, fireEv = false ) {\n\n\t\tif( item ) {\n\t\t\tif( this.m_ui_input ) {\n\t\t\t\tif( this.m_ui_input instanceof Input ) {\n\t\t\t\t\tthis.m_ui_input.value = item.text as string;\n\t\t\t\t\t// fires a change event\n\t\t\t\t\tif( fireEv ) {\n\t\t\t\t\t\tthis.m_ui_input.dom.dispatchEvent( new Event('input') );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.m_ui_input.setContent( this.m_props.renderer( item ) );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.m_props.value = item.id;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif( this.m_ui_input && this.m_ui_input instanceof Input ) {\n\t\t\t\tthis.m_ui_input.value = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic get value() {\n\t\treturn this.m_selection ? this.m_selection.id : undefined;\n\t}\n\n\tpublic get valueText( ) {\n\t\tif( this.m_selection ) {\n\t\t\treturn this.m_selection.text;\n\t\t}\n\n\t\tif( this.m_props.editable ) {\n\t\t\treturn (this.m_ui_input as Input).value;\n\t\t}\n\n\t\treturn '';\n\t}\n\n\t/**\n\t * \n\t */\n\t\n\tpublic set value(id) {\n\t\tlet items = this.m_props.items;\n\n\t\tif( isFunction(items) ) {\n\t\t\titems = items( null );\n\t\t}\n\t\t\n\t\tconst found = items.some( (v) => {\n\t\t\tif (v.id === id) {\n\t\t\t\tthis._setInput( v );\n\t\t\t\tthis.m_selection = v;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t});\n\n\t\tif( !found ) {\n\t\t\tthis._setInput( null );\n\t\t\tthis.m_selection = null;\n\t\t}\n\t}\n\n\tget input( ) : Input {\n\t\treturn this.m_ui_input instanceof Input ? this.m_ui_input : null;\n\t}\n\n\t_checkFocus() {\n const focus = document.activeElement;\n if (this.dom && this.dom.contains(focus) || focus==document.body ) {\n return;\n }\n\n if (this.m_popup && this.m_popup.dom && this.m_popup.dom.contains(focus)) {\n return;\n }\n\n this._hidePopup();\n }\n\n\t_hidePopup() {\n if (this.m_popvis) {\n this.m_popup.close();\n this.m_popvis = false;\n\t\t\tthis.stopTimer(\"focus-check\");\n }\n }\n\t\n\tstatic storeProxy( props: ComboStoreProxyProps ): PopulateItems { \n\n\t\tlet view: DataView = props.store instanceof DataStore ? props.store.createView() : props.store;\n\t\t\n\t\treturn ( ) => {\n\t\t\tlet result: ListViewItem[] = new Array( props.store.count );\n\t\t\t\n\t\t\tprops.store.forEach( ( rec, index ) => {\n\t\t\t\tresult[index] = {\n\t\t\t\t\tid: rec.getID( ),\n\t\t\t\t\ttext: props.display( rec )\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn result;\n\t\t};\n\t} \n\n\tfocus( ) {\n\t\tif( this.m_props.editable ) {\n\t\t\tthis.m_ui_input.focus( );\n\t\t}\n\t\telse {\n\t\t\tsuper.focus( );\n\t\t}\n\t}\n}\n\n", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file form.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Component, Container, CProps, ContainerEventMap, ComponentContent, flyWrap, EventHandler } from './component'\nimport { HLayout, VLayout } from './layout'\nimport { Button } from './button'\nimport { Input } from './input'\nimport { TextEdit } from './textedit'\nimport { ajaxRequest, RequestProps } from './request'\nimport { BasicEvent } from './x4events'\nimport { EvBtnClick } from './dialog'\nimport { ComboBox } from './combobox'\n\nimport { _tr } from './i18n'\n\n\nexport interface EvDirty extends BasicEvent {\n\tdirty: boolean;\n}\n\n// ============================================================================\n// [FORM]\n// ============================================================================\n\nexport type FormBtn = 'ok' | 'cancel' | 'ignore' | 'yes' | 'no' | 'close' | 'save' | 'dontsave';\nexport type FormButtons = (FormBtn | Button | Component)[];\n\nexport interface FormEventMap extends ContainerEventMap {\n\tbtnClick?: EvBtnClick;\n\tdirty?: EvDirty;\n}\n\nexport interface FormProps extends CProps<FormEventMap> {\n\tdisableSuggestions?: boolean;\n\tbuttons?: FormButtons;\n\tbtnClick?: EventHandler<EvBtnClick>;\t// shortcut for events: { btnClick: ... }\n\tdirty?: EventHandler<EvDirty>;\n}\n\n/**\n * \n */\n\nexport class Form<T extends FormProps = FormProps, E extends FormEventMap = FormEventMap> extends VLayout<T, E>\n{\n\tprotected m_height: string | number;\n\tprotected m_container: Container;\n\tprotected m_buttons: HLayout;\n\tprotected m_dirty: boolean;\n\tprotected m_watchChanges: boolean;\n\n\tconstructor(props: T) {\n\n\t\tlet content = props.content;\n\t\tprops.content = null;\n\n\t\t// save height, because real form height is 'height' PLUS button bar height\n\t\tlet height = props.height;\n\t\tprops.height = undefined;\n\n\t\tsuper(props);\n\n\t\tthis.setTag( props.disableSuggestions ? 'section' : 'form');\n\t\tthis.mapPropEvents(props, 'btnClick', 'dirty');\n\t\tthis.updateContent(content, props.buttons, height);\n\n\t\tthis.m_dirty = false;\n\t\tthis.m_watchChanges = false;\n\t}\n\n\t/**\n\t * returns the container object\n\t */\n\n\tget container(): Container {\n\t\treturn this.m_container;\n\t}\n\n\t/**\n\t * \n\t */\n\n\toverride componentCreated(): void {\n\t\tsuper.componentCreated()\n\t\tif (this.m_watchChanges) {\n\t\t\tthis.watchChanges();\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic updateContent(items: ComponentContent, buttons: FormButtons, height: string | number = 0) {\n\n\t\tif (height) {\n\t\t\t// keep height for next time\n\t\t\tthis.m_height = height;\n\t\t}\n\n\t\tthis._makeButtons(buttons);\n\n\t\tlet content = [\n\t\t\tthis.m_container = new VLayout({\n\t\t\t\tcls: 'container',\n\t\t\t\theight: this.m_height,\n\t\t\t\tcontent: items\n\t\t\t}),\n\t\t\tthis.m_buttons,\n\t\t];\n\n\t\tsuper.setContent(content);\n\t}\n\n\t/**\n\t * \n\t * @param els \n\t * @param refreshAll \n\t */\n\n\tsetContent(els: ComponentContent, refreshAll = true) {\n\t\tthis.m_container.setContent(els, refreshAll);\n\t}\n\n\t/**\n\t * \n\t * @param buttons \n\t */\n\tsetButtons(buttons: FormButtons) {\n\t\tthis._makeButtons(buttons);\n\t}\n\n\t/**\n\t * enable a button by it's name\n\t */\n\n\tenableButton(name: string, enable = true) {\n\t\tlet button = this.getButton(name);\n\t\tif (button) {\n\t\t\tbutton.enable(enable);\n\t\t}\n\t}\n\n\t/**\n\t * return a button by it's name\n\t * @param name \n\t */\n\n\tgetButton(name: string) {\n\t\tlet button = this.m_buttons?.itemWithRef<Button>('@' + name);\n\t\treturn button;\n\t}\n\n\n\t/**\n\t * \n\t */\n\n\tprivate _makeButtons(buttons?: FormButtons): void {\n\n\t\tif (!this.m_buttons) {\n\t\t\tthis.m_buttons = new HLayout({\n\t\t\t\tcls: 'footer',\n\t\t\t\tref: 'buttons',\n\t\t\t});\n\t\t}\n\n\t\tlet btns: Component[] = [];\n\n\t\tif (buttons) {\n\t\t\tfor (let b of buttons) {\n\t\t\t\tif (b instanceof Component) {\n\t\t\t\t\tbtns.push(b);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tswitch (b) {\n\t\t\t\t\t\tcase 'ok': { btns.push(new Button({ ref: '@' + b, text: _tr.global.ok, click: () => { this._click(<FormBtn>b); } })); break; }\n\t\t\t\t\t\tcase 'cancel': { btns.push(new Button({ ref: '@' + b, text: _tr.global.cancel, click: () => { this._click(<FormBtn>b); } })); break; }\n\t\t\t\t\t\tcase 'ignore': { btns.push(new Button({ ref: '@' + b, text: _tr.global.ignore, click: () => { this._click(<FormBtn>b); } })); break; }\n\t\t\t\t\t\tcase 'yes': { btns.push(new Button({ ref: '@' + b, text: _tr.global.yes, click: () => { this._click(<FormBtn>b); } })); break; }\n\t\t\t\t\t\tcase 'no': { btns.push(new Button({ ref: '@' + b, text: _tr.global.no, click: () => { this._click(<FormBtn>b); } })); break; }\n\t\t\t\t\t\tcase 'close': { btns.push(new Button({ ref: '@' + b, text: _tr.global.close, click: () => { this._click(<FormBtn>b); } })); break; }\n\t\t\t\t\t\tcase 'save': { btns.push(new Button({ ref: '@' + b, text: _tr.global.save, click: () => { this._click(<FormBtn>b); } })); break; }\n\t\t\t\t\t\tcase 'dontsave': { btns.push(new Button({ ref: '@' + b, text: _tr.global.dontsave, click: () => { this._click(<FormBtn>b); } })); break; }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (btns.length == 1) {\n\t\t\tbtns[0].setAttribute('autofocus', true);\n\t\t}\n\n\t\tthis.m_buttons.setContent(btns);\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic validate() {\n\t\tlet inputs = this.queryAll('input'),\n\t\t\tresult = true;\n\n\t\tfor (let i = 0; i < inputs.length; i++) {\n\t\t\tconst input = Component.getElement(inputs[i], TextEdit);\n\t\t\tif (input && !input.validate()) {\n\t\t\t\tresult = false;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst combo = Component.getElement(inputs[i], ComboBox);\n\t\t\t\tif( combo && !combo.validate() ) {\n\t\t\t\t\tresult = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _click(btn: FormBtn) {\n\t\tthis.emit('btnClick', EvBtnClick(btn));\n\t}\n\n\t/**\n\t * replacement for HTMLFormElement.elements\n\t * as chrome shows suggestions on form elements even if we ask him (not to do that)\n\t * we removed <form> element.\n\t * so we have to get children by hand\n\t */\n\n\tprivate _getElements() {\n\t\tconsole.assert(!!this.dom);\n\t\tconst els = this.queryAll('[name]');\n\t\treturn els;\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic setValues(values: any) {\n\n\t\tlet elements = this._getElements();\n\t\tfor (let e = 0; e < elements.length; e++) {\n\n\t\t\tlet input = <HTMLInputElement>elements[e];\n\n\t\t\tlet item = Component.getElement(input);\n\t\t\tif (!item.hasAttribute(\"name\")) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet name = item.getAttribute('name'),\n\t\t\t\ttype = item.getAttribute('type');\n\n\t\t\tif (values[name] !== undefined) {\n\t\t\t\t(<Input>item).setStoreValue(values[name]);\n\t\t\t}\n\t\t}\n\n\t\tthis.setDirty(false);\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic clearValues() {\n\n\t\tlet elements = this._getElements();\n\t\tfor (let e = 0; e < elements.length; e++) {\n\n\t\t\tlet input = <HTMLInputElement>elements[e];\n\n\t\t\tlet item = Component.getElement(input);\n\t\t\tif (!item.hasAttribute(\"name\")) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t(<Input>item).setStoreValue( null );\n\t\t}\n\n\t\tthis.setDirty(false);\n\t}\n\n\n\t/**\n\t * values are not escaped\n\t * checkbox set true when checked\n\t * radio set value when checked\n\t */\n\n\tpublic getValues(): any {\n\t\tlet elements = this._getElements();\n\t\tlet result: Record<string,any> = {};\n\n\t\tfor (let e = 0; e < elements.length; e++) {\n\n\t\t\tlet el = <HTMLElement>elements[e];\n\t\t\tlet item = <Input>Component.getElement(el);\n\t\t\tif (!item.hasAttribute(\"name\")) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet name = item.getAttribute('name'),\n\t\t\t\tvalue = item.getStoreValue();\n\n\t\t\tif (value !== undefined) {\n\t\t\t\tresult[name] = value;\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * send the query to the desired handler\n\t */\n\n\tpublic submit(cfg: RequestProps, cbvalidation: Function) {\n\n\t\tif (!this.validate()) {\n\t\t\treturn false;\n\t\t}\n\n\t\tlet values = this.getValues();\n\t\tif (cbvalidation) {\n\t\t\tif (!cbvalidation(values)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tlet form = new FormData();\n\t\tfor (let n in values) {\n\t\t\tif (values.hasOwnProperty(n)) {\n\t\t\t\tform.append(n, values[n] === undefined ? '' : values[n]);\n\t\t\t}\n\t\t}\n\n\t\tcfg.params = form;\n\t\treturn ajaxRequest(cfg);\n\t}\n\n\t/**\n\t * to be abble to see the dirty flag, you need to call this method\n\t * cf. isDirty, setDirty\n\t */\n\n\twatchChanges() {\n\t\tif (this.dom) {\n\t\t\tconst els = this.queryAll('input[name], textarea[name]');\n\t\t\tels.forEach(el => {\n\t\t\t\tflyWrap<Input>(el).setDomEvent('input', () => {\n\t\t\t\t\tthis.setDirty();\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tthis.m_watchChanges = false;\n\t\t}\n\t\telse {\n\t\t\tthis.m_watchChanges = true;\n\t\t}\n\t}\n\n\t/**\n\t * cf. watchChanges\n\t */\n\n\tsetDirty(set = true) {\n\t\tthis.m_dirty = set;\n\t\tthis.emit( 'dirty', { dirty: set } );\n\t}\n\n\t/**\n\t * cf. watchChanges\n\t */\n\n\tisDirty() {\n\t\treturn this.m_dirty;\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file dialog.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\n\nimport { Popup, PopupProps, PopupEventMap, EvMove } from './popup'\nimport { Icon, IconID } from './icon'\nimport { HLayout } from './layout'\nimport { Label } from './label'\nimport { Form, FormButtons } from './form'\nimport { Component, ComponentContent, EvSize, flyWrap } from './component'\nimport { BasicEvent, EventCallback } from './x4events'\nimport { Rect, getMousePos, isFunction, isTouchDevice, isString, Size } from './tools'\n\ninterface Geometry {\n\tleft: number;\n\ttop: number;\n\twidth: number;\n\theight: number;\n\tminimized: boolean;\n\tmaximized: boolean;\n}\n\n// ============================================================================\n// [DIALOG]\n// ============================================================================\n\n\nexport interface EvClose extends BasicEvent {\n}\n\nexport interface EvBtnClick extends BasicEvent {\n\tbutton: string;\n}\n\nexport function EvBtnClick(button: string) {\n\treturn BasicEvent<EvBtnClick>({ button });\n}\n\n\nexport interface DialogBoxEventMap extends PopupEventMap {\n\tclose: EvClose;\n\tbtnClick: EvBtnClick;\n}\n\nexport type InitFormCallback = () => Form;\n\nexport interface DialogProps<E extends DialogBoxEventMap = DialogBoxEventMap> extends PopupProps<E> {\n\ttitle?: string;\n\ticon?: IconID;\n\tbuttons?: FormButtons;\n\t\n\tbtnClick?: EventCallback<EvBtnClick>;\n\n\tclosable?: boolean;\n\tmovable?: boolean;\n\tmaximized?: boolean;\n\tmaximizable?: boolean;\n\tminimizable?: boolean;\n\tautoClose?: boolean;\t// if true, close the dialog when a button is clicked\n\n\twidth?: number;\t\t\t// when you specify a width here, this is the minimal FORM content width\n\theight?: number;\t\t// when you specify a width here, this is the minimal FORM content heigt\n\tdlgWidth?: number;\t\t// this is the prefered initial dialog width in percent of screen\n\tdlgHeight?: number;\t\t// this is the prefered initial dialog height in percent of screen\n\n\tform?: Form | InitFormCallback;\n\tdisableSuggestions?: boolean;\n}\n\n/**\n * Standard dialog class\n */\n\nexport class Dialog<P extends DialogProps = DialogProps, E extends DialogBoxEventMap = DialogBoxEventMap> extends Popup<P, E>\n{\n\tprotected m_icon: IconID;\n\tprotected m_title: string;\n\tprotected m_form: Form;\n\tprotected m_buttons: FormButtons;\n\tprotected m_closable: boolean;\n\tprotected m_movable: boolean;\n\tprotected m_maximized: boolean;\n\tprotected m_minimized: boolean;\n\tprotected m_maximizable: boolean;\n\tprotected m_minimizable: boolean;\n\n\tprotected m_minFormSize: Size;\n\n\tprotected m_rc_max: Rect;\n\tprotected m_rc_min: Rect;\n\n\tprotected m_el_title: Component;\n\tprotected m_last_down: number;\n\tprotected m_auto_close: boolean;\n\n\tprotected m_ui_title: Label;\n\tprotected m_form_cb: InitFormCallback;\n\n\tconstructor(props: P) {\n\n\t\tlet content = props.content;\n\t\tprops.content = null;\n\n\t\tlet width = props.width;\n\t\tlet height = props.height;\n\n\t\tprops.width = undefined;\n\t\tprops.height = undefined;\n\n\t\tsuper(props);\n\n\t\tthis.m_minFormSize = { width, height };\n\n\t\tthis.enableMask(true);\n\n\t\tif (props.form) {\n\t\t\tif (!isFunction(props.form)) {\n\t\t\t\tthis.m_form = props.form;\n\t\t\t\tthis.m_form.on('btnClick', (e) => this._handleClick(e));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.m_form_cb = props.form;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tthis.m_form = new Form({\n\t\t\t\tcontent,\n\t\t\t\tbuttons: props.buttons,\n\t\t\t\tdisableSuggestions: props.disableSuggestions,\n\t\t\t\tbtnClick: (e) => this._handleClick(e)\n\t\t\t});\n\t\t}\n\n\t\tthis.m_movable = props.movable;\n\t\tthis.m_auto_close = props.autoClose ?? true;\n\n\t\tthis.m_icon = props.icon;\n\t\tthis.m_title = props.title;\n\t\tthis.m_buttons = props.buttons ?? null;\n\t\tthis.m_closable = props.closable ?? false;\n\t\tthis.m_last_down = 0;\n\n\t\tthis.on('size', (ev: EvSize) => {\n\t\t\tthis.addClass('@resized');\n\t\t\tthis.m_form.setStyleValue('width', null);\n\t\t\tthis.m_form.setStyleValue('height', null);\n\t\t});\n\n\t\tthis.m_maximized = false;\n\t\tthis.m_minimized = false;\n\t\tthis.m_maximizable = false;\n\t\tthis.m_minimizable = false;\n\n\t\tif (props.maximizable !== undefined) {\n\t\t\tthis.m_maximizable = props.maximizable;\n\t\t}\n\n\t\tif (props.minimizable !== undefined) {\n\t\t\tthis.m_minimizable = props.minimizable;\n\t\t}\n\n\t\tif (props.maximized == true) {\n\t\t\tthis.m_maximizable = true;\n\t\t}\n\n\t\tif( props.btnClick ) {\n\t\t\tthis.on( 'btnClick', props.btnClick );\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\t\n\tcomponentCreated() // override\n\t{\n\t\tsuper.componentCreated();\n\n\t\tif( this.m_minFormSize.width ) {\n\t\t\tthis.m_form.setStyle( {\n\t\t\t\tminWidth: this.m_minFormSize.width,\n\t\t\t\twidth: this.m_minFormSize.width \n\t\t\t} );\n\t\t}\n\n\t\tif( this.m_minFormSize.height ) {\n\t\t\tthis.m_form.setStyle( {\n\t\t\t\tminHeight: this.m_minFormSize.height,\n\t\t\t\theight: this.m_minFormSize.height \n\t\t\t});\n\t\t}\n\t\t\t\n\t\tconst rc = this.getBoundingRect( );\n\t\tthis.setStyleValue( 'min-width', rc.width );\n\t\tthis.setStyleValue( 'min-height', rc.height );\n\n\t\tthis.setStyleValue( 'width', rc.width );\n\t\tthis.setStyleValue( 'height', rc.height );\n\t\t\n\t\tif( this.m_props.dlgWidth ) {\n\t\t\tthis.setStyleValue( 'width', this.m_props.dlgWidth+'%' );\n\t\t}\n\n\t\tif( this.m_props.dlgHeight ) {\n\t\t\tthis.setStyleValue( 'height', this.m_props.dlgHeight+'%' );\n\t\t}\n\t\t\n\t\tthis.addClass('@resized');\n\n\t\tif( this.m_el_title ) {\n\t\t\tthis.m_el_title.setStyleValue( \"width\", \"auto\" );\n\t\t}\n\n\t\tif (this.m_props.maximized) {\n\t\t\tthis._maximize();\n\t\t\tthis.emit('size', EvSize(null));\n\t\t}\n\t\telse {\n\t\t\tthis.centerOnScreen( );\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _handleClick(ev: EvBtnClick) {\n\t\tthis.emit('btnClick', ev);\n\t\tif (!ev.defaultPrevented) {\n\t\t\tthis.close();\n\t\t}\n\t}\n\n\t/**\n\t * restore the geometry\n\t */\n\n\tsetGeometry(geom: Geometry) {\n\n\t\tif (geom.minimized && this.m_minimizable) {\n\t\t\tthis._minimize(false);\n\t\t\tthis.m_rc_min = new Rect(geom.left, geom.top, geom.width, geom.height);\n\t\t\tthis.displayAt(geom.left, geom.top, 'top-left');\n\t\t}\n\t\telse if (geom.maximized && this.m_maximizable) {\n\t\t\tthis._maximize(false);\n\t\t\tthis.m_rc_max = new Rect(geom.left, geom.top, geom.width, geom.height);\n\t\t}\n\t\telse {\n\t\t\tthis.setSize(geom.width, geom.height);\n\t\t\tthis.displayAt(geom.left, geom.top, 'top-left');\n\t\t}\n\t}\n\n\t/**\n\t * return the geometry (usefull to save state)\n\t */\n\n\tgetGeometry(): Geometry {\n\n\t\tif (this.m_minimized) {\n\t\t\treturn {\n\t\t\t\tleft: this.m_rc_min.left,\n\t\t\t\ttop: this.m_rc_min.top,\n\t\t\t\twidth: this.m_rc_min.width,\n\t\t\t\theight: this.m_rc_min.height,\n\t\t\t\tminimized: true,\n\t\t\t\tmaximized: false\n\t\t\t}\n\t\t}\n\t\telse if (this.m_maximized) {\n\t\t\treturn {\n\t\t\t\tleft: this.m_rc_max.left,\n\t\t\t\ttop: this.m_rc_max.top,\n\t\t\t\twidth: this.m_rc_max.width,\n\t\t\t\theight: this.m_rc_max.height,\n\t\t\t\tminimized: false,\n\t\t\t\tmaximized: true\n\t\t\t}\n\t\t}\n\n\t\tlet rc = this.getBoundingRect();\n\n\t\treturn {\n\t\t\tleft: rc.left,\n\t\t\ttop: rc.top,\n\t\t\twidth: rc.width,\n\t\t\theight: rc.height,\n\t\t\tminimized: false,\n\t\t\tmaximized: false\n\t\t};\n\t}\n\n\t/**\n\t * resize the dialog\n\t * @param width \n\t * @param height \n\t */\n\tsetSize(width: number, height: number) {\n\t\tthis.setStyle({ width, height });\n\t\tthis.emit('size', EvSize({ width, height }));\n\t}\n\n\t/** @ignore */\n\trender() {\n\n\t\tif (this.m_form_cb) {\n\t\t\tthis.m_form = this.m_form_cb();\n\t\t\tthis.m_form.on('btnClick', (e) => this._handleClick(e));\n\t\t\tthis.m_form_cb = null;\n\t\t}\n\n\t\tlet hasTitle = this.m_icon !== undefined || this.m_closable || this.m_title !== undefined || this.m_movable;\n\t\tthis.m_el_title = null;\n\n\t\tif (hasTitle) {\n\t\t\tthis.m_el_title = new HLayout({\n\t\t\t\tcls: 'title',\n\t\t\t\tcontent: [\n\t\t\t\t\tthis.m_icon ? new Icon({ icon: this.m_icon }) : null,\n\t\t\t\t\tthis.m_ui_title = new Label({ flex: 1, text: this.m_title }),\n\t\t\t\t\tthis.m_minimizable ? new Icon({ cls: 'min-btn', icon: 'var( --x4-icon-window-minimize )', dom_events: { click: () => this._toggleMin() } }) : null,\n\t\t\t\t\tthis.m_maximizable ? new Icon({ cls: 'max-btn', icon: 'var( --x4-icon-window-maximize )', dom_events: { click: () => this._toggleMax() } }) : null,\n\t\t\t\t\tthis.m_maximizable ? new Icon({ cls: 'res-btn', icon: 'var( --x4-icon-window-restore )', dom_events: { click: () => this._toggleMax() } }) : null,\n\t\t\t\t\tthis.m_closable ? new Icon({ cls: 'close-btn', icon: 'var( --x4-icon-rectangle-times )', dom_events: { click: () => this.close() } }) : null,\n\t\t\t\t]\n\t\t\t});\n\n\t\t\tif (this.m_movable) {\n\t\t\t\tif( isTouchDevice() ) {\n\t\t\t\t\tthis.m_el_title.setDomEvent('touchstart', (e) => this._mouseDown(e));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.m_el_title.setDomEvent('mousedown', (e) => this._mouseDown(e));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tsuper.setContent([\n\t\t\tthis.m_el_title,\n\t\t\tthis.m_form\n\t\t]);\n\t}\n\n\t/**\n\t * change the dialog content\n\t * @param els \n\t * @param refreshAll \n\t */\n\n\tsetContent( els: ComponentContent, refreshAll = true ) {\n\t\tthis.m_form.setContent( els, refreshAll );\n\t}\n\n\t/**\n\t * change the dialog buttons\n\t * @param buttons \n\t */\n\n\tsetButtons( buttons: FormButtons ) {\n\t\tthis.m_form.setButtons( buttons );\n\t}\n\n\t/**\n\t * return the dialog form\n\t */\n\n\tpublic get form(): Form {\n\t\treturn this.m_form;\n\t}\n\n\t/**\n\t * close the dialog\n\t */\n\n\tpublic close() {\n\t\tthis.emit( 'close', {} );\n\t\tsuper.close();\n\t}\n\n\t/**\n\t * \n\t */\n\tprivate _toggleMax() {\n\t\tif (!this.m_maximizable) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.m_maximized) {\n\t\t\tthis.removeClass('maximized');\n\t\t\tthis.setStyle({\n\t\t\t\tleft: this.m_rc_max.left,\n\t\t\t\ttop: this.m_rc_max.top,\n\t\t\t\twidth: this.m_rc_max.width,\n\t\t\t\theight: this.m_rc_max.height,\n\t\t\t});\n\t\t\tthis.m_maximized = false;\n\t\t\tthis.emit( 'size', EvSize(null, 'restore'));\n\t\t}\n\t\telse {\n\t\t\tthis._maximize();\n\t\t\tthis.emit( 'size', EvSize(null, 'maximize'));\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _toggleMin() {\n\t\tif (!this.m_minimizable) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.m_minimized) {\n\t\t\tthis.removeClass('minimized');\n\t\t\tthis.setStyle({\n\t\t\t\t//left: \tthis.m_rc_min.left,\n\t\t\t\t//top: \tthis.m_rc_min.top,\n\t\t\t\twidth: this.m_rc_min.width,\n\t\t\t\theight: this.m_rc_min.height,\n\t\t\t});\n\t\t\tthis.m_minimized = false;\n\t\t\tthis.emit('size', EvSize(null, 'restore'));\n\t\t}\n\t\telse {\n\t\t\tthis._minimize();\n\t\t\tthis.emit('size', EvSize(null, 'minimize'));\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _mouseDown(event: UIEvent) {\n\n\t\tlet { x, y } = getMousePos(event, true);\n\n\t\tlet wrc = flyWrap(x4document.body).getBoundingRect();\n\t\tlet rc = this.getBoundingRect(true);\n\t\t///let trc = this.m_el_title.getBoundingRect();\n\n\t\tlet dx = x - rc.left,\n\t\t\tdy = y - rc.top;\n\n\t\t//let cstyle = this.getComputedStyle();\n\t\t//let topw = cstyle.parse('marginTop') + cstyle.parse('paddingTop') + cstyle.parse('borderTopWidth');\n\t\t//let botw = cstyle.parse('marginBottom') + cstyle.parse('paddingBottom') + cstyle.parse('borderBottomWidth');\n\t\t//let lftw = cstyle.parse('marginLeft') + cstyle.parse('paddingLeft') + cstyle.parse('borderLeftWidth');\n\t\t//let rgtw = cstyle.parse('marginRight') + cstyle.parse('paddingRight') + cstyle.parse('borderRightWidth');\n\n\t\t//wrc.top += topw - trc.height;\n\t\t//wrc.height -= topw + botw - trc.height;\n\n\t\t//wrc.left += lftw;\n\t\t//wrc.width -= lftw + rgtw;\n\n\t\t// custom handling double click\n\t\tconst now = Date.now();\n\t\tconst delta = now - this.m_last_down;\n\t\t\n\t\tif ( this.m_maximizable && delta < 700) {\n\t\t\tthis._toggleMax();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.m_last_down = now;\n\t\tif (this.m_maximized) {\n\t\t\t// cannot move in max state\n\t\t\treturn;\n\t\t}\n\n\t\tlet __move = (ex: number, ey: number) => {\n\t\t\t\n\t\t\tif( ex>wrc.right ) {\n\t\t\t\tex = wrc.right;\n\t\t\t}\n\t\t\telse if( ex<wrc.left ) {\n\t\t\t\tex = wrc.left;\n\t\t\t}\n\n\t\t\tif( ey>wrc.bottom ) {\n\t\t\t\tey = wrc.bottom;\n\t\t\t}\n\t\t\telse if( ey<wrc.top ) {\n\t\t\t\tey = wrc.top;\n\t\t\t}\n\n\t\t\tlet x = ex - dx,\n\t\t\t\ty = ey - dy;\n\n\t\t\t//if (x + rc.width < wrc.left) {\n\t\t\t//\tx = wrc.left - rc.width;\n\t\t\t//}\n\t\t\t//else if (x > wrc.right) {\n\t\t\t//\tx = wrc.right;\n\t\t\t//}\n\t\t\t//\n\t\t\t//if (y < wrc.top) { // title grip is on top\n\t\t\t//\ty = wrc.top;\n\t\t\t//}\n\t\t\t//else if (y > wrc.bottom) {\n\t\t\t//\ty = wrc.bottom;\n\t\t\t//}\n\n\t\t\tthis.setStyle({\n\t\t\t\tleft: x,\n\t\t\t\ttop: y\n\t\t\t});\n\t\t}\n\n\t\tComponent.setCapture(this, (ev) => {\n\n\t\t\tif (ev.type == 'mousemove') {\n\t\t\t\tlet mev = ev as MouseEvent;\n\t\t\t\t__move(mev.clientX, mev.clientY);\n\t\t\t}\n\t\t\telse if (ev.type == 'touchmove') {\n\t\t\t\tlet tev = ev as TouchEvent;\n\n\t\t\t\tif (tev.touches.length == 1) {\n\t\t\t\t\t__move(tev.touches[0].clientX, tev.touches[0].clientY);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ev.type == 'mouseup' || ev.type == 'touchend') {\n\t\t\t\tComponent.releaseCapture();\n\t\t\t\tthis.emit( 'move', EvMove(null));\n\t\t\t}\n\t\t\telse if (ev.type == 'mousedown' || ev.type == 'touchstart') {\n\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * maximize the dialog\n\t */\n\n\tpublic maximize() {\n\t\tif (!this.m_maximizable || this.m_maximized) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._maximize();\n\t\tthis.emit('size', EvSize(null));\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _maximize(saveRect = true) {\n\n\t\tif (saveRect) {\n\t\t\tthis.m_rc_max = this.getBoundingRect(false);\n\t\t}\n\n\t\tthis.addClass('maximized');\n\t\tthis.m_maximized = true;\n\n\t\tthis.setStyle({\n\t\t\tleft: undefined,\n\t\t\ttop: undefined,\n\t\t\twidth: undefined,\n\t\t\theight: undefined,\n\t\t});\n\t}\n\n\t/**\n\t * minimize the dialog\n\t */\n\n\tpublic minimize() {\n\t\tif (!this.m_minimizable || this.m_minimized) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._minimize();\n\t\tthis.emit('size', EvSize(null));\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _minimize(saveRect = true) {\n\n\t\tif (saveRect) {\n\t\t\tthis.m_rc_min = this.getBoundingRect(false);\n\t\t}\n\n\t\tthis.addClass('minimized');\n\t\tthis.m_minimized = true;\n\n\t\tthis.setStyle({\n\t\t\t//left: undefined,\n\t\t\t//top: undefined,\n\t\t\twidth: undefined,\n\t\t\theight: undefined,\n\t\t});\n\n\n\t}\n\n\t/**\n\t * change the dialog title\n\t */\n\n\tset title(title: string) {\n\t\tthis.m_title = title;\n\t\tif (this.m_ui_title) {\n\t\t\tthis.m_ui_title.text = title;\n\t\t}\n\t}\n\n\titemWithName<T extends Component>( name: string ): T {\n\t\tlet result = <HTMLElement>this.dom.querySelector( `[name=\"${name}\"]` );\n\t\treturn result ? Component.getElement<T>(result) : null;\n\t}\n\n\tgetValues( ) {\n\t\treturn this.m_form.getValues( );\n\t}\n\n\tvalidate( ) {\n\t\treturn this.m_form.validate( );\n\t}\n}\n", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file colorpicker.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\n/**\n * ARGH this code is awfull\n */\n\n\nimport { Container, Component, ContainerProps, ContainerEventMap } from './component'\nimport { CheckBox } from './checkbox'\nimport { Dialog, DialogBoxEventMap, DialogProps } from './dialog'\nimport { EvChange, EventCallback } from './x4events'\nimport { VLayout, HLayout } from './layout'\nimport { Label } from './label'\nimport { Color } from './color'\nimport { isString, getMousePos, clamp, classNames } from './tools'\nimport { TextEdit } from './textedit'\nimport { Menu, MenuItem } from './menu'\n\ninterface ColorPickerEventMap extends ContainerEventMap {\n\tchange: EvChange;\n}\n\nexport interface ColorPickerProps extends ContainerProps<ColorPickerEventMap> {\n\tcolor: Color;\n\thasAlpha?: boolean;\n}\n\nconst pal_colors = {\n\tblue: [0x0e5a8a, 0x106ba3, 0x137cbd, 0x2b95d6, 0x48aff0,],\n\tgreen: [0x0a6640, 0x0d8050, 0x0f9960, 0x15b371, 0x3dcc91,],\n\torange: [0xa66321, 0xbf7326, 0xd9822b, 0xf29d49, 0xffb366,],\n\tred: [0xa82a2a, 0xc23030, 0xdb3737, 0xf55656, 0xff7373,],\n\tvermilion: [0x9e2b0e, 0xb83211, 0xd13913, 0xeb532d, 0xff6e4a,],\n\trose: [0xa82255, 0xc22762, 0xdb2c6f, 0xf5498b, 0xff66a1,],\n\tviolet: [0x5c255c, 0x752f75, 0x8f398f, 0xa854a8, 0xc274c2,],\n\tindigo: [0x5642a6, 0x634dbf, 0x7157d9, 0x9179f2, 0xad99ff,],\n\tcobalt: [0x1f4b99, 0x2458b3, 0x2965cc, 0x4580e6, 0x669eff,],\n\tturquoise: [0x008075, 0x00998c, 0x00b3a4, 0x14ccbd, 0x2ee6d6,],\n\tforest: [0x1d7324, 0x238c2c, 0x29a634, 0x43bf4d, 0x62d96b,],\n\tlime: [0x728c23, 0x87a629, 0x9bbf30, 0xb6d94c, 0xd1f26d,],\n\tgold: [0xa67908, 0xbf8c0a, 0xd99e0b, 0xf2b824, 0xffc940,],\n\tsepia: [0x63411e, 0x7d5125, 0x96622d, 0xb07b46, 0xc99765,],\n\tbw: [0x000000, 0x444444, 0x666666, 0xcccccc, 0xffffff,],\n};\n\n\n\nexport class ColorPicker extends Container<ColorPickerProps, ColorPickerEventMap> {\n\n\tprivate m_colorSel: Component;\n\tprivate m_colorHue: Component;\n\tprivate m_colorAlpha: Component;\n\tprivate m_sample: Component;\n\tprivate m_selMark: Component;\n\tprivate m_hueMark: Component;\n\tprivate m_alphaMark: Component;\n\n\tprivate m_baseHSV: { h: number, s: number, v: number, a: number };\n\tprivate m_baseColor: Color;\n\tprivate m_transpCk: CheckBox;\n\tprivate m_colorEdit: TextEdit;\n\n\tprivate m_palmode: boolean;\n\n\tstatic last_palmode = false;\n\n\tconstructor(props: ColorPickerProps) {\n\t\tsuper(props);\n\t\tthis.m_palmode = ColorPicker.last_palmode;\n\t\tthis.setDomEvent('contextmenu', (e) => this._showCtx(e));\n\t}\n\n\tprivate _showCtx(e: UIEvent) {\n\t\tconst menu = new Menu({\n\t\t\titems: [\n\t\t\t\tnew MenuItem({\n\t\t\t\t\ttext: 'Palette', checked: this.m_palmode, click: () => {\n\t\t\t\t\t\tthis.m_palmode = !this.m_palmode;\n\t\t\t\t\t\tColorPicker.last_palmode = this.m_palmode;\n\t\t\t\t\t\tthis.update();\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t]\n\t\t})\n\n\t\tlet pt = getMousePos(e, true);\n\t\tmenu.displayAt(pt.x, pt.y);\n\t}\n\n\trender(props: ColorPickerProps) {\n\n\t\tthis.m_baseColor = props.color;\n\t\tthis.m_baseHSV = Color.toHSV(this.m_baseColor);\n\n\t\tif (this.m_palmode) {\n\n\t\t\tthis.addClass(\"pal-mode\");\n\n\t\t\tlet selector: VLayout = null;\n\t\t\tlet cur: Component = null;\n\n\t\t\tlet main_sel: Component[] = [];\n\t\t\tlet sub_sel: Component[] = [];\n\n\t\t\tconst ccolor = this.m_baseColor.value();\n\n\t\t\tmaterialColors.forEach(mc => {\n\t\t\t\tconst color = mc.variations[4].hex;\n\t\t\t\t\n\t\t\t\tlet selected = color === ccolor;\n\t\t\t\tif( !selected ) {\n\t\t\t\t\tselected = mc.variations.some( c => {\n\t\t\t\t\t\tconst cc = new Color(c.hex).value();\n\t\t\t\t\t\tif( cc===ccolor ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tlet cls = classNames('clr-box xbox', { selected });\n\t\t\t\tlet el = new Component({ \n\t\t\t\t\tcls, \n\t\t\t\t\tstyle: { backgroundColor: new Color(color).toHex() }, \n\t\t\t\t\tdata: { color, main: mc.variations } \n\t\t\t\t});\n\n\t\t\t\tif( selected ) {\n\t\t\t\t\tfillSubs( mc.variations );\n\t\t\t\t}\n\n\t\t\t\tmain_sel.push(el);\n\t\t\t});\n\n\t\t\tfunction fillSubs( colors: Variation[] ) {\n\t\t\t\tsub_sel = [];\n\t\t\t\tcolors.forEach(mc => {\n\t\t\t\t\tlet clr = new Color(mc.hex);\n\t\t\t\t\tconst selected = clr.value() == ccolor;\n\n\t\t\t\t\tlet cls = classNames('hclr-box xbox', { selected });\n\t\t\t\t\t\n\t\t\t\t\tlet el = new Component({ \n\t\t\t\t\t\tcls, \n\t\t\t\t\t\tstyle: { backgroundColor: clr.toHex(), color: Color.contrastColor(clr).toHex() }, \n\t\t\t\t\t\tdata: { color: clr.value() } ,\n\t\t\t\t\t\tcontent: clr.toHex()\n\t\t\t\t\t});\n\n\t\t\t\t\tsub_sel.push(el);\n\n\t\t\t\t\tif( selected ) {\n\t\t\t\t\t\tcur = el;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif( selector ) {\n\t\t\t\t\tselector.itemWithId('vsel').setContent( sub_sel );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tselector = new VLayout({\n\t\t\t\tcontent: [\n\t\t\t\t\tnew HLayout({\n\t\t\t\t\t\tid: 'hsel',\n\t\t\t\t\t\tcontent: main_sel\n\t\t\t\t\t}),\n\t\t\t\t\tnew VLayout({\n\t\t\t\t\t\tid: 'vsel',\n\t\t\t\t\t\tflex: 1,\n\t\t\t\t\t\tcontent: sub_sel\n\t\t\t\t\t})\n\t\t\t\t]\n\t\t\t});\n\n\n\t\t\t/*\n\t\t\tlet cur = null;\n\t\t\tconst buildCol = ( colors: number[] ) => {\n\t\t\t\t\n\t\t\t\tconst ccolor = this.m_baseColor.value();\n\t\t\t\tconst els = colors.map( x => {\n\t\t\t\t\tconst selected = x==ccolor;\n\n\t\t\t\t\tlet cls = classNames( 'clr-box', { selected } );\n\t\t\t\t\tlet el = new Component( { cls, style: { backgroundColor: new Color(x).toHex() }, data: { color: x } } );\n\n\t\t\t\t\tif( selected ) {\n\t\t\t\t\t\tcur = el;\n\t\t\t\t\t}\n\t\t\t\t\treturn el;\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\treturn new VLayout( {\n\t\t\t\t\tcls: 'vcol',\n\t\t\t\t\tcontent: els\n\t\t\t\t});\n\t\t\t}\n\t\t\t\n\t\t\tlet rows = new HLayout( {\n\t\t\t\tcls: 'hcol',\n\t\t\t\tcontent: [\n\t\t\t\t\t\tbuildCol( pal_colors.blue ),\n\t\t\t\t\t\tbuildCol( pal_colors.green ),\n\t\t\t\t\t\tbuildCol( pal_colors.orange ),\n\t\t\t\t\t\tbuildCol( pal_colors.red ),\n\t\t\t\t\t\tbuildCol( pal_colors.vermilion ),\n\t\t\t\t\t\tbuildCol( pal_colors.rose ),\n\t\t\t\t\t\tbuildCol( pal_colors.violet ),\n\t\t\t\t\t\tbuildCol( pal_colors.indigo ),\n\t\t\t\t\t\tbuildCol( pal_colors.cobalt ),\n\t\t\t\t\t\tbuildCol( pal_colors.turquoise ),\n\t\t\t\t\t\tbuildCol( pal_colors.forest ),\n\t\t\t\t\t\tbuildCol( pal_colors.lime ),\n\t\t\t\t\t\tbuildCol( pal_colors.gold ),\n\t\t\t\t\t\tbuildCol( pal_colors.sepia ),\n\t\t\t\t\t\tbuildCol( pal_colors.bw ),\n\t\t\t\t]\n\t\t\t});\n\t\t\t*/\n\n\n\t\t\tthis.m_colorEdit = new TextEdit({\n\t\t\t\tcls: 'hexv',\n\t\t\t\tvalue: '',\n\t\t\t\tattrs: {\n\t\t\t\t\tspellcheck: false,\n\t\t\t\t},\n\t\t\t\tchange: (ev) => {\n\t\t\t\t\tconst clr = new Color(ev.value);\n\t\t\t\t\tif (clr) {\n\t\t\t\t\t\tthis.m_baseColor = clr;\n\t\t\t\t\t\tthis.m_baseHSV = Color.toHSV(clr);\n\t\t\t\t\t\tthis._updateColor(false);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.m_transpCk = new CheckBox({\n\t\t\t\tcls: 'transp',\n\t\t\t\ttext: 'transparent',\n\t\t\t\tchange: (ev) => {\n\t\t\t\t\tthis.m_baseHSV.a = ev.value ? 0 : 1;\n\t\t\t\t\tthis._updateColor();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.setContent([selector, this.m_transpCk, this.m_colorEdit]);\n\n\t\t\t// globally handle click\n\n\t\t\tselector.setDomEvent('click', (ev) => {\n\n\t\t\t\tif (cur) {\n\t\t\t\t\tcur.removeClass('selected');\n\t\t\t\t\tcur = null;\n\t\t\t\t}\n\n\t\t\t\tlet cell = Component.getElement(ev.target as HTMLElement, 'xbox');\n\t\t\t\tif (cell) {\n\t\t\t\t\tconst subs = cell.getData('main');\n\t\t\t\t\tif( subs ) {\n\t\t\t\t\t\tfillSubs( subs );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tconst clr = new Color(cell.getData('color'));\n\t\t\t\t\t\tthis.m_baseColor = clr;\n\t\t\t\t\t\tthis.m_baseHSV = Color.toHSV(clr);\n\t\t\t\t\t\tthis._updateColor();\n\n\t\t\t\t\t\tcur = cell;\n\t\t\t\t\t\tcell.addClass('selected');\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tthis.removeClass(\"pal-mode\");\n\n\t\t\tthis.m_selMark = new Component({ cls: 'marker' });\n\t\t\tthis.m_colorSel = new Component({\n\t\t\t\tcls: 'sel',\n\t\t\t\tcontent: [\n\t\t\t\t\tnew Component({ cls: '@fit light' }),\n\t\t\t\t\tnew Component({ cls: '@fit dark' }),\n\t\t\t\t\tthis.m_selMark,\n\t\t\t\t]\n\t\t\t});\n\n\t\t\tthis.m_hueMark = new Component({ cls: 'marker' });\n\t\t\tthis.m_colorHue = new Component({\n\t\t\t\tcls: 'hue',\n\t\t\t\tcontent: [\n\t\t\t\t\tthis.m_hueMark\n\t\t\t\t]\n\t\t\t});\n\t\t\tthis.m_sample = new Component({ cls: 'sample' });\n\n\t\t\tif (props.hasAlpha) {\n\t\t\t\tthis.addClass('with-alpha');\n\t\t\t\tthis.m_alphaMark = new Component({ cls: 'marker' });\n\t\t\t\tthis.m_colorAlpha = new Component({\n\t\t\t\t\tcls: 'alpha',\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\tnew Component({ cls: 'bk @fit', ref: 'color' }),\n\t\t\t\t\t\tthis.m_alphaMark\n\t\t\t\t\t]\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.removeClass('with-alpha');\n\t\t\t\tthis.m_transpCk = new CheckBox({\n\t\t\t\t\tcls: 'transp',\n\t\t\t\t\ttext: 'transparent',\n\t\t\t\t\tchange: (ev) => {\n\t\t\t\t\t\tthis.m_baseHSV.a = ev.value ? 0 : 1;\n\t\t\t\t\t\tthis._updateColor();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.m_colorEdit = new TextEdit({\n\t\t\t\tcls: 'hexv',\n\t\t\t\tvalue: '',\n\t\t\t\tattrs: {\n\t\t\t\t\tspellcheck: false,\n\t\t\t\t},\n\t\t\t\tchange: (ev) => {\n\t\t\t\t\tconst clr = new Color(ev.value);\n\t\t\t\t\tif (clr) {\n\t\t\t\t\t\tthis.m_baseColor = clr;\n\t\t\t\t\t\tthis.m_baseHSV = Color.toHSV(clr);\n\t\t\t\t\t\tthis._updateColor(false);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.setContent([\n\t\t\t\tthis.m_colorSel,\n\t\t\t\tthis.m_colorHue,\n\t\t\t\tthis.m_colorAlpha,\n\t\t\t\tthis.m_transpCk,\n\t\t\t\tthis.m_colorEdit,\n\t\t\t\tthis.m_sample,\n\t\t\t]);\n\n\t\t\tthis.m_colorSel.setDomEvent('mousedown', (ev: MouseEvent) => {\n\t\t\t\tComponent.setCapture(this, (e) => this._selChange(e));\n\t\t\t});\n\n\t\t\tthis.m_colorHue.setDomEvent('mousedown', (ev: MouseEvent) => {\n\t\t\t\tComponent.setCapture(this, (e) => this._hueChange(e));\n\t\t\t});\n\n\t\t\tif (props.hasAlpha) {\n\t\t\t\tthis.m_colorAlpha.setDomEvent('mousedown', (ev: MouseEvent) => {\n\t\t\t\t\tComponent.setCapture(this, (e) => this._alphaChange(e));\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis._updateColor();\n\t\t}\n\t}\n\n\tset color(clr: Color) {\n\t\tthis.m_baseColor = clr;\n\t\tthis.m_baseHSV = Color.toHSV(this.m_baseColor);\n\n\t\tthis._updateColor();\n\t}\n\n\tget color() {\n\t\treturn this.m_baseColor;\n\t}\n\n\tprivate _selChange(ev: UIEvent) {\n\t\tlet pt = getMousePos(ev, true);\n\t\tconsole.log(pt);\n\t\tlet rc = this.m_colorSel.getBoundingRect();\n\n\t\tif (!this.m_props.hasAlpha) {\n\t\t\tthis.m_baseHSV.a = 1;\n\t\t}\n\n\t\tthis.m_baseHSV.s = clamp((pt.x - rc.left) / rc.width, 0, 1);\n\t\tthis.m_baseHSV.v = 1 - clamp((pt.y - rc.top) / rc.height, 0, 1);\n\t\tthis._updateColor();\n\n\t\tif (ev.type == 'mouseup' || ev.type == 'touchend') {\n\t\t\tComponent.releaseCapture();\n\t\t}\n\t}\n\n\tprivate _hueChange(ev: UIEvent) {\n\t\tlet pt = getMousePos(ev, true);\n\t\tlet rc = this.m_colorHue.getBoundingRect();\n\n\t\tthis.m_baseHSV.h = clamp((pt.y - rc.top) / rc.height, 0, 1);\n\t\tthis._updateColor();\n\n\t\tif (ev.type == 'mouseup' || ev.type == 'touchend') {\n\t\t\tComponent.releaseCapture();\n\t\t}\n\t}\n\n\tprivate _alphaChange(ev: UIEvent) {\n\t\tlet pt = getMousePos(ev, true);\n\t\tlet rc = this.m_colorAlpha.getBoundingRect();\n\n\t\tthis.m_baseHSV.a = clamp((pt.x - rc.left) / rc.width, 0, 1);\n\t\tthis._updateColor();\n\n\t\tif (ev.type == 'mouseup' || ev.type == 'touchend') {\n\t\t\tComponent.releaseCapture();\n\t\t}\n\t}\n\n\tprivate _updateColor(edit = true) {\n\n\t\tlet color: Color;\n\n\t\tif (!this.m_palmode) {\n\n\t\t\tcolor = Color.fromHSV(this.m_baseHSV.h, 1, 1, 1);\n\t\t\tthis.m_colorSel.setStyleValue('backgroundColor', color.toString());\n\n\t\t\tcolor = Color.fromHSV(this.m_baseHSV.h, this.m_baseHSV.s, this.m_baseHSV.v, 1);\n\t\t\tthis.m_sample.setStyleValue('backgroundColor', color.toString());\n\n\t\t\tif (this.m_props.hasAlpha) {\n\t\t\t\tlet gradient = `linear-gradient(to right, rgba(0,0,0,0) 0%, ${color.toString()} 100%)`;\n\t\t\t\tthis.m_colorAlpha.itemWithRef<Component>('color').setStyleValue('backgroundImage', gradient);\n\t\t\t}\n\n\t\t\tthis.m_selMark.setStyle({\n\t\t\t\tleft: (this.m_baseHSV.s * 100) + '%',\n\t\t\t\ttop: (100 - this.m_baseHSV.v * 100) + '%',\n\t\t\t});\n\n\t\t\tthis.m_hueMark.setStyle({\n\t\t\t\ttop: (this.m_baseHSV.h * 100) + '%',\n\t\t\t});\n\n\t\t\tif (this.m_props.hasAlpha) {\n\t\t\t\tthis.m_alphaMark.setStyle({\n\t\t\t\t\tleft: (this.m_baseHSV.a * 100) + '%',\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.m_transpCk.check = this.m_baseHSV.a == 0;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tthis.m_transpCk.check = this.m_baseHSV.a == 0;\n\t\t}\n\n\t\tcolor = Color.fromHSV(this.m_baseHSV.h, this.m_baseHSV.s, this.m_baseHSV.v, this.m_baseHSV.a);\n\t\tthis.m_baseColor = color;\n\n\t\tif (edit) {\n\t\t\tthis.m_colorEdit.value = color.alpha() == 1 ? color.toHex() : color.toString()\t//color.toHex();\n\t\t}\n\n\t\tthis._change();\n\t}\n\n\tprivate _change() {\n\t\tthis.emit('change', EvChange(this.m_baseColor));\n\t}\n}\n\n// :: color dialog ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\ninterface ColorPickerBoxEventMap extends DialogBoxEventMap {\n\tchange: EvChange;\n}\n\nexport interface ColorPickerBoxProps extends DialogProps<ColorPickerBoxEventMap> {\n\tcolor: Color;\n\thasAlpha?: boolean;\n\tcust_colors?: Color[];\n\n\tchange?: EventCallback<EvChange>;\t// shortcut to { event: change: ... }\n}\n\n\nexport class ColorPickerBox extends Dialog<ColorPickerBoxProps, ColorPickerBoxEventMap>\n{\n\tprivate m_picker: ColorPicker;\n\n\tconstructor(props: ColorPickerBoxProps) {\n\n\t\tprops.icon = undefined;\n\t\tprops.buttons = undefined;\n\n\t\tsuper(props);\n\n\t\tthis.mapPropEvents(props, 'change');\n\n\t\tthis.m_picker = new ColorPicker({\n\t\t\tcolor: props.color,\n\t\t\thasAlpha: props.hasAlpha,\n\t\t\tstyle: { padding: 8 },\n\t\t\twidth: 250,\n\t\t\theight: 250,\n\t\t});\n\n\t\tlet customs = this._makeCustoms(props.cust_colors);\n\n\t\tthis.form.updateContent([\n\t\t\tnew VLayout({\n\t\t\t\tcontent: [\n\t\t\t\t\tthis.m_picker,\n\t\t\t\t\tcustoms\n\t\t\t\t]\n\t\t\t})\n\t\t], ['ok', 'cancel']);\n\n\t\tthis.on('btnClick', (ev) => {\n\t\t\tif (ev.button == 'ok') {\n\t\t\t\tthis.emit('change', EvChange(this.m_picker.color));\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate _makeCustoms(cc: Color[] ) {\n\n\t\tlet custom = null;\n\n\t\tif (cc && cc.length > 0) {\n\n\t\t\tlet els = [];\n\n\t\t\tfor (let i = 0; i < cc.length; i += 8) {\n\n\t\t\t\tlet lne = [];\n\n\t\t\t\tfor (let j = 0; j < 8; j++) {\n\n\t\t\t\t\tlet idx = i + j,\n\t\t\t\t\t\tclr = cc[idx];\n\n\t\t\t\t\tlne.push(new Label({\n\t\t\t\t\t\tcls: 'cust-cc',\n\t\t\t\t\t\ttext: '',\n\t\t\t\t\t\tflex: 1,\n\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\tbackgroundColor: clr ? clr.toString() : 'transparent'\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttooltip: clr ? clr.toString() : undefined,\n\t\t\t\t\t\tdom_events: {\n\t\t\t\t\t\t\tclick: () => {\n\t\t\t\t\t\t\t\tif (clr) {\n\t\t\t\t\t\t\t\t\tthis.m_picker.color = clr;\n\t\t\t\t\t\t\t\t\tthis.emit('change', EvChange(clr));\n\t\t\t\t\t\t\t\t\tthis.close();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}));\n\t\t\t\t}\n\n\t\t\t\tels.push(new HLayout({ cls: 'line', content: lne }));\n\t\t\t}\n\n\t\t\tcustom = new VLayout({ cls: 'customs', content: els });\n\t\t}\n\n\t\treturn custom;\n\t}\n\n\tset color(clr: Color) {\n\t\tthis.m_picker.color = clr;\n\t}\n\n\tget color() {\n\t\treturn this.m_picker.color;\n\t}\n\n\t/**\n\t * display a messagebox\n\t */\n\n\tstatic show(props: string | ColorPickerBoxProps): ColorPickerBox {\n\n\t\tlet msg;\n\n\t\tif (isString(props)) {\n\t\t\tmsg = new ColorPickerBox({ color: new Color(props) });\n\t\t}\n\t\telse {\n\t\t\tmsg = new ColorPickerBox(props);\n\t\t}\n\n\t\tmsg.show();\n\t\treturn msg;\n\t}\n}\n\n// :: PickerEditor ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\nexport interface ColorPickerEditorProps extends ColorPickerProps {\n\tlabel?: string;\n\tlabelWidth?: number;\n\tcust_colors?: Color[];\n\tdisplayValue?: false,\n\tchange?: EventCallback<EvChange>;\n\tname?: string;\n}\n\nexport class ColorPickerEditor extends HLayout<ColorPickerEditorProps, ColorPickerEventMap> {\n\n\tconstructor(props: ColorPickerEditorProps) {\n\t\tsuper(props);\n\n\t\tthis.mapPropEvents(props, 'change');\n\t}\n\n\trender(props: ColorPickerEditorProps) {\n\n\t\tlet color = props.color;\n\t\tlet tcolor: string;\n\n\t\tif (this._isTransp(color)) {\n\t\t\tcolor = Color.NONE;\n\t\t\ttcolor = 'black';\n\t\t}\n\t\telse {\n\t\t\ttcolor = Color.contrastColor(color).toString();\n\t\t}\n\n\t\tthis.setContent([\n\t\t\tprops.label ? new Label({\n\t\t\t\tcls: 'label',\n\t\t\t\ttext: props.label,\n\t\t\t\tflex: props.labelWidth < 0 ? -props.labelWidth : undefined,\n\t\t\t\twidth: props.labelWidth >= 0 ? props.labelWidth : undefined,\n\t\t\t}) : null,\n\t\t\tnew Component( {\n\t\t\t\tflex: 1,\n\t\t\t\tcontent: [\n\t\t\t\t\tnew Label({\n\t\t\t\t\t\tcls: 'alpha @fit',\n\t\t\t\t\t\ttext: ''\n\t\t\t\t\t}),\n\t\t\t\t\tnew Label({\n\t\t\t\t\t\tcls: 'value @fit',\n\t\t\t\t\t\ttext: props.displayValue===false ? '' : color.toHex(),\n\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\tbackgroundColor: color.toString(),\n\t\t\t\t\t\t\tcolor: tcolor\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdom_events: {\n\t\t\t\t\t\t\tclick: () => this._showPicker()\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t],\n\t\t\t} )\n\t\t]);\n\n\t\tif( props.displayValue===false ) {\n\t\t\tthis.setStyleValue( 'background-image', \"url( 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAEsmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEwIgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iMTAiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSIKICAgdGlmZjpJbWFnZVdpZHRoPSIxMCIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTAiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLjAiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLjAiCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgeG1wOk1vZGlmeURhdGU9IjIwMjEtMDMtMjJUMTU6NTE6NDkrMDE6MDAiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMDMtMjJUMTU6NTE6NDkrMDE6MDAiPgogICA8eG1wTU06SGlzdG9yeT4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJwcm9kdWNlZCIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWZmaW5pdHkgRGVzaWduZXIgMS45LjAiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMDMtMjJUMTU6NTE6NDkrMDE6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/Pn8+b7YAAAGCaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRy0tCQRSHv7Qwyh5gRIsWEtZKwwyiNi2UXlAt1CCrjV5fgdrlXiOibdBWKIja9FrUX1DboHUQFEUQ7YLWRW0qbueqoESe4cz55jdzDjNnwBLOKFm93gvZXF4LTvid85EFp+0FK5204sURVXR1JjQepqZ93lNnxluPWav2uX+tOZ7QFahrFB5VVC0vPCk8vZZXTd4R7lDS0bjwmbBbkwsK35l6rMSvJqdK/G2yFg4GwNIu7ExVcayKlbSWFZaX48pmVpXyfcyX2BO5uZDEHvFudIJM4MfJFGMEGGKAEZmH8OCjX1bUyPcW82dZkVxFZpV1NJZJkSaPW9RVqZ6QmBQ9ISPDutn/v33Vk4O+UnW7HxqeDeO9F2zb8FMwjK8jw/g5BusTXOYq+SuHMPwheqGiuQ6gbRPOrypabBcutqDrUY1q0aJkFbckk/B2Ci0RcNxA02KpZ+V9Th4gvCFfdQ17+9An59uWfgF7Hmfv4QYbGAAAAAlwSFlzAAALEwAACxMBAJqcGAAAACdJREFUGJVjbGhoYEAC9fX1yFwmBryAptKM////R+Y3NjbSzW4C0gAo9QeQBmhTIwAAAABJRU5ErkJggg=='\" );\n\t\t}\n\n\t\tthis._setTabIndex(props.tabIndex);\n\t}\n\n\tset value(color: Color) {\n\t\tthis.m_props.color = color;\n\t\tthis.update();\n\t}\n\n\tget value() {\n\t\treturn this.m_props.color;\n\t}\n\n\tset custom_colors(v: Color[]) {\n\t\tthis.m_props.cust_colors = v;\n\t}\n\n\tprivate _showPicker() {\n\t\tlet dlg = new ColorPickerBox({\n\t\t\tcolor: this.m_props.color,\n\t\t\tcust_colors: this.m_props.cust_colors,\n\t\t\thasAlpha: this.m_props.hasAlpha,\n\t\t\tevents: {\n\t\t\t\tchange: (e) => {\n\t\t\t\t\tthis.m_props.color = e.value as Color;\n\t\t\t\t\tthis._change();\n\t\t\t\t\tthis.update();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tlet rc = this.getBoundingRect();\n\t\tdlg.displayAt(rc.left, rc.bottom, 'tl');\n\t}\n\n\tprivate _change() {\n\t\tthis.emit('change', EvChange(this.m_props.color));\n\t}\n\n\tprivate _isTransp(color: Color) {\n\t\treturn !color.alpha();\n\t}\n}\n\n\n// :: Material colors scheme ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\ninterface Variation {\n\tweight: number;\n\thex: number;\n}\n\ninterface Variations {\n\tcolor: string;\n\tvariations: Variation[];\n};\n\nconst materialColors: Variations[] = [\n\t{\n\t\tcolor: \"Red\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xFFEBEE\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xFFCDD2\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xEF9A9A\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0xE57373\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0xEF5350\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0xF44336\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0xE53935\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0xD32F2F\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0xC62828\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0xB71C1C\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Pink\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xFCE4EC\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xF8BBD0\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xF48FB1\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0xF06292\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0xEC407A\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0xE91E63\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0xD81B60\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0xC2185B\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0xAD1457\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x880E4F\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Purple\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xF3E5F5\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xE1BEE7\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xCE93D8\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0xBA68C8\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0xAB47BC\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0x9C27B0\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0x8E24AA\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0x7B1FA2\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0x6A1B9A\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x4A148C\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Deep Purple\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xEDE7F6\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xD1C4E9\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xB39DDB\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0x9575CD\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0x7E57C2\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0x673AB7\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0x5E35B1\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0x512DA8\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0x4527A0\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x311B92\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Indigo\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xE8EAF6\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xC5CAE9\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0x9FA8DA\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0x7986CB\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0x5C6BC0\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0x3F51B5\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0x3949AB\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0x303F9F\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0x283593\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x1A237E\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Blue\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xE3F2FD\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xBBDEFB\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0x90CAF9\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0x64B5F6\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0x42A5F5\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0x2196F3\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0x1E88E5\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0x1976D2\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0x1565C0\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x0D47A1\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Light Blue\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xE1F5FE\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xB3E5FC\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0x81D4FA\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0x4FC3F7\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0x29B6F6\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0x03A9F4\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0x039BE5\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0x0288D1\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0x0277BD\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x01579B\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Cyan\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xE0F7FA\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xB2EBF2\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0x80DEEA\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0x4DD0E1\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0x26C6DA\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0x00BCD4\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0x00ACC1\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0x0097A7\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0x00838F\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x006064\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Teal\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xE0F2F1\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xB2DFDB\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0x80CBC4\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0x4DB6AC\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0x26A69A\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0x009688\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0x00897B\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0x00796B\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0x00695C\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x004D40\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Green\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xE8F5E9\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xC8E6C9\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xA5D6A7\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0x81C784\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0x66BB6A\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0x4CAF50\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0x43A047\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0x388E3C\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0x2E7D32\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x1B5E20\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Light Green\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xF1F8E9\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xDCEDC8\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xC5E1A5\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0xAED581\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0x9CCC65\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0x8BC34A\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0x7CB342\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0x689F38\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0x558B2F\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x33691E\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Lime\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xF9FBE7\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xF0F4C3\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xE6EE9C\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0xDCE775\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0xD4E157\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0xCDDC39\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0xC0CA33\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0xAFB42B\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0x9E9D24\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x827717\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Yellow\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xFFFDE7\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xFFF9C4\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xFFF59D\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0xFFF176\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0xFFEE58\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0xFFEB3B\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0xFDD835\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0xFBC02D\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0xF9A825\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0xF57F17\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Amber\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xFFF8E1\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xFFECB3\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xFFE082\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0xFFD54F\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0xFFCA28\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0xFFC107\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0xFFB300\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0xFFA000\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0xFF8F00\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0xFF6F00\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Orange\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xFFF3E0\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xFFE0B2\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xFFCC80\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0xFFB74D\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0xFFA726\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0xFF9800\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0xFB8C00\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0xF57C00\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0xEF6C00\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0xE65100\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Deep Orange\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xFBE9E7\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xFFCCBC\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xFFAB91\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0xFF8A65\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0xFF7043\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0xFF5722\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0xF4511E\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0xE64A19\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0xD84315\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0xBF360C\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Brown\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xEFEBE9\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xD7CCC8\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xBCAAA4\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0xA1887F\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0x8D6E63\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0x795548\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0x6D4C41\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0x5D4037\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0x4E342E\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x3E2723\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Grey\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xFAFAFA\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xF5F5F5\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xEEEEEE\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0xE0E0E0\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0xBDBDBD\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0x9E9E9E\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0x757575\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0x616161\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0x424242\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x212121\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Blue Grey\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xECEFF1\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xCFD8DC\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xB0BEC5\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0x90A4AE\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0x78909C\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0x607D8B\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0x546E7A\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0x455A64\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0x37474F\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x263238\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tcolor: \"Grey\",\n\t\tvariations: [\n\t\t\t{\n\t\t\t\tweight: 50,\n\t\t\t\thex: 0xFFFFFF\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 100,\n\t\t\t\thex: 0xe0e0e0\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 200,\n\t\t\t\thex: 0xc4c4c4\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 300,\n\t\t\t\thex: 0xa8a8a8\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 400,\n\t\t\t\thex: 0x8c8c8c\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 500,\n\t\t\t\thex: 0x707070\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 600,\n\t\t\t\thex: 0x545454\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 700,\n\t\t\t\thex: 0x383838\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 800,\n\t\t\t\thex: 0x1c1c1c\n\t\t\t},\n\t\t\t{\n\t\t\t\tweight: 900,\n\t\t\t\thex: 0x00000\n\t\t\t}\n\t\t]\n\t}\n];", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file drag_manager.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\n\nimport { Component } from './component';\nimport { Point } from './tools';\n\nconst x_drag_cb = Symbol( 'x-drag-cb' );\n\ninterface DropInfo {\n\tpt: Point;\n\tdata: DataTransfer;\n}\n\ntype DropCallback = ( command: 'enter' | 'leave' | 'drag' | 'drop', el: Component, infos: DropInfo ) => void;\ntype FilterCallback = ( el: Component ) => boolean;\n\n/**\n * \n */\n\n\nclass DragManager {\n\n\tdragSource: Component;\n\tdragGhost: HTMLElement;\n\tdropTarget: Component;\n\t\n\tnotified: Component;\n\t\n\ttimer: any; // pb with name of settimeout return\n\n\t/**\n\t * \n\t */\n\n\tregisterDraggableElement(el: Component) {\n\n\t\tel.setDomEvent('dragstart', (ev: DragEvent) => {\n\n\t\t\tthis.dragSource = el;\n\t\t\tthis.dragGhost = el.dom.cloneNode(true) as HTMLElement;\n\t\t\t\n\t\t\tthis.dragGhost.classList.add('dragged');\n\t\t\tx4document.body.appendChild(this.dragGhost);\n\n\t\t\tel.addClass( 'dragging' );\n\n\t\t\tev.dataTransfer.setData('text/string', '1');\n\t\t\tev.dataTransfer.setDragImage(new Image(), 0, 0);\n\n\t\t\tev.stopPropagation( );\n\t\t});\n\n\t\tel.setDomEvent('drag', (ev: DragEvent) => {\n\t\t\tthis.dragGhost.style.left = ev.pageX + \"px\";\n\t\t\tthis.dragGhost.style.top = ev.pageY + \"px\";\n\t\t});\n\n\t\tel.setDomEvent('dragend', (ev: DragEvent) => {\n\t\t\tel.removeClass( 'dragging' );\n\t\t\tthis.dragGhost.remove();\n\t\t});\n\n\t\tel.setAttribute('draggable', \"true\");\n\t}\n\n\t/**\n\t * \n\t */\n\n\tregisterDropTarget(el: Component, cb: DropCallback, filterCB?: FilterCallback ) {\n\n\t\tconst dragEnter = (ev: DragEvent) => {\n\t\t\tif( filterCB && !filterCB(this.dragSource) ) {\n\t\t\t\tconsole.log( 'reject ', el );\n\t\t\t\tev.dataTransfer.dropEffect = 'none';\t\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconsole.log( 'accepted ', el );\n\t\t\tev.preventDefault();\n\t\t\tev.dataTransfer.dropEffect = 'copy';\n\t\t};\n\n\t\tconst dragOver = (ev: DragEvent) => {\n\t\t\t//console.log( \"dragover\", ev.target );\n\t\t\t\n\t\t\tif( filterCB && !filterCB(this.dragSource) ) {\n\t\t\t\tconsole.log( 'reject ', el );\n\t\t\t\tev.dataTransfer.dropEffect = 'none';\t\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tev.preventDefault();\n\t\t\t\t\t\t\t\t\t\n\t\t\tif (this.dropTarget != el) {\n\t\t\t\tthis.dropTarget = el;\n\t\t\t\tthis._startCheck();\n\t\t\t}\n\n\t\t\tif( this.dropTarget ) {\n\t\t\t\tconst infos = {\n\t\t\t\t\tpt: new Point( ev.pageX, ev.pageY ),\n\t\t\t\t\tdata: ev.dataTransfer,\n\t\t\t\t}\n\n\t\t\t\tcb( 'drag', this.dragSource, infos );\n\t\t\t}\n\n\t\t\tev.dataTransfer.dropEffect = 'copy';\n\t\t};\n\n\t\tconst dragLeave = (ev: DragEvent) => {\n\t\t\t//console.log( \"dragleave\", ev.target );\n\t\t\tthis.dropTarget = null;\n\t\t\tev.preventDefault();\n\t\t};\n\n\t\tconst drop = (ev: DragEvent) => {\n\t\t\tconst infos = {\n\t\t\t\tpt: new Point( ev.pageX, ev.pageY ),\n\t\t\t\tdata: ev.dataTransfer,\n\t\t\t}\n\n\t\t\tcb('drop', this.dragSource, infos );\n\t\t\t\n\t\t\tthis.dropTarget = null;\n\t\t\tel.removeClass('drop-over');\n\n\t\t\tev.preventDefault();\n\t\t}\n\n\t\tel.setDomEvent('dragenter', dragEnter);\n\t\tel.setDomEvent('dragover', dragOver);\n\t\tel.setDomEvent('dragleave', dragLeave);\n\t\tel.setDomEvent('drop', drop);\n\n\t\tel.setData( x_drag_cb, cb );\n\t}\n\n\t_startCheck() {\n\n\t\tif (this.timer) {\n\t\t\tclearInterval(this.timer);\n\t\t\tthis._check( );\n\t\t}\n\n\t\tthis.timer = setInterval( () => this._check(), 300 );\n\t}\n\n\t_check( ) {\n\n\t\tconst leaving = ( x: Component ) => {\n\t\t\tx.removeClass('drop-over');\n\n\t\t\tconst cb = x.getData( x_drag_cb );\n\t\t\tcb( 'leave', this.dragSource );\n\t\t}\n\n\t\tconst entering = ( x: Component ) => {\n\t\t\tx.addClass('drop-over');\n\t\t\tconst cb = x.getData( x_drag_cb );\n\t\t\tcb( 'enter', this.dragSource );\n\t\t}\n\t\n\t\tif (this.dropTarget) {\n\t\t\tif (!this.notified || this.notified != this.dropTarget) {\n\n\t\t\t\tif( this.notified ) {\n\t\t\t\t\tleaving( this.notified );\n\t\t\t\t}\n\t\t\n\t\t\t\tthis.notified = this.dropTarget;\n\t\t\t\tentering( this.notified );\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif (this.notified) {\n\t\t\t\tleaving( this.notified );\n\t\t\t\tthis.notified = null;\n\n\t\t\t\tclearInterval(this.timer);\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport const dragManager = new DragManager();", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file drawtext.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { deferCall, Point, Rect, roundTo } from './tools'\n\n// adapted & modified from Canvas-txt: \n// https://github.com/geongeorge/Canvas-Txt/blob/master/src/index.js\n\n// Hair space character for precise justification\nconst SPACE = '\\u200a';\n\nexport interface DrawTextStyle {\n\talign?: 'left' | 'center' | 'right' | 'justify',\n\tvAlign?: 'top' | 'middle' | 'bottom',\n\tfontSize?: number,\t\t\t\t// in pixels\n\tfontWeight?: number | 'bold' | 'light' | 'normal',\t// in em (fontHeight)\n\tfontStyle?: string,\n\tfontVariant?: string,\n\tfontFamily?: string,\n\tlineHeight?: number,\n\tclip?: boolean,\n\tcolumns?: number;\n\tcolumnGap?: number;\n\tlineBreak?: boolean;\n\trotation?: number;\n}\n\nconst defStyle: DrawTextStyle = {\n\talign: 'center',\n\tvAlign: 'middle',\n\tfontSize: 14,\n\tfontWeight: null,\n\tfontStyle: '',\n\tfontVariant: '',\n\tfontFamily: 'Arial',\n\tlineHeight: 0,\n\tclip: true,\n\tcolumns: 1,\n\tcolumnGap: 0,\n\tlineBreak: true,\n};\n\n/**\n *\n */\n\ninterface ITextWord {\n\twidth: number; // word width\n\ttext: string;\t// text to print\n}\n\ninterface ITextLine {\n\twidth: number;\t\t// line width\n\twords: ITextWord[];\t// words in line\n\tspace: number;\t\t// space between words\n\tlast?: boolean;\n}\n\nexport function drawText(ctx: CanvasRenderingContext2D, input_Text: string, rc: Rect, drawStyle: DrawTextStyle) {\n\n\tif (rc.width <= 0 || rc.height <= 0) {\n\t\t//width or height or font size cannot be 0\n\t\treturn\n\t}\n\n\t//console.time( 'drawtext' );\n\n\tdrawStyle = { ...defStyle, ...drawStyle };\n\n\tctx.save();\n\n\tif (drawStyle.clip) {\n\t\tctx.beginPath();\n\t\tctx.rect(rc.left, rc.top, rc.width, rc.height);\n\t\tctx.clip();\n\t}\n\n\tif( drawStyle.rotation ) {\n\t\tconst center = new Point(rc.left+rc.width/2, rc.top+rc.height/2);\n\t\tconst rad = drawStyle.rotation / 180 * Math.PI;\n\n\t\tctx.translate( center.x, center.y );\n\t\tctx.rotate( rad );\n\t\tctx.translate( -center.x, -center.y );\n\t\t\n\t\t//ctx.beginPath();\n\t\t//ctx.rect( rc.left, rc.top, rc.width, rc.height );\n\t\t//ctx.stroke( );\n\t}\n\n\tctx.textBaseline = 'bottom';\n\n\t// End points\n\tlet fontSize = roundTo(drawStyle.fontSize, 2) ?? 12;\n\t//let style = `${drawStyle.fontStyle ?? ''} ${drawStyle.fontVariant ?? ''} ${drawStyle.fontWeight ?? ''} ${fontSize}px ${drawStyle.fontFamily ?? 'arial'}`;\n\tlet style = '';\n\n\tif( drawStyle.fontStyle ) {style += drawStyle.fontStyle + ' ';}\n\tif( drawStyle.fontVariant ) {style += drawStyle.fontVariant + ' ';}\n\tif( drawStyle.fontWeight ) {style += drawStyle.fontWeight + ' ';}\n\tstyle += fontSize + 'px ';\n\n\tlet family = drawStyle.fontFamily ?? 'sans-serif';\n\tif( family.indexOf('.')>0 ) {\n\t\tfamily = '\"'+family+'\"';\n\t}\n\n\tstyle += family;\n\tctx.font = style.trim();\n\n\tlet textarray: ITextLine[] = [];\n\tlet lines = input_Text.split('\\n');\n\n\tconst columns = drawStyle.columns < 1 ? 1 : drawStyle.columns;\n\tconst gap = drawStyle.columnGap;\n\n\tlet col_width = (rc.width - gap * (columns - 1)) / columns;\n\tlet col_left = rc.left;\n\tlet hlimit = col_width;\n\n\tif( !drawStyle.lineBreak ) {\n\t\thlimit = 99999999;\n\t}\n\n\tconst spaceW = _measureText(ctx, ' ' );\n\n\tlines.forEach((text) => {\n\n\t\tlet line: ITextLine = { width: 0, words: [], space: 0 };\n\n\t\t// fit in width ?\n\t\tlet lwidth = _measureText(ctx, text);\n\t\tif (lwidth < hlimit) {\n\t\t\tline.width = lwidth;\n\t\t\tline.words.push({ width: lwidth, text });\n\t\t\ttextarray.push(line);\n\t\t}\n\t\t// break line to fit in width\n\t\telse {\n\t\t\t// make word list & measure them\n\t\t\tlet twords = text.split(/\\s/).filter(w => w !== '');\n\t\t\t\n\t\t\tlet words: ITextWord[] = twords.map( w => {\n\t\t\t\tconst wwidth = _measureText(ctx, w );\n\t\t\t\tconst word: ITextWord = {\n\t\t\t\t\twidth: wwidth,\n\t\t\t\t\ttext: w\n\t\t\t\t};\n\t\t\t\treturn word;\n\t\t\t});\n\n\t\t\t// then compute lines \n\t\t\tlet n = 0;\n\t\t\tlet e = 0;\n\n\t\t\twhile (n < words.length) {\n\n\t\t\t\tconst word = words[n];\n\t\t\t\tlet test = line.width;\n\t\t\t\tif( test ) {\n\t\t\t\t\ttest += spaceW;\n\t\t\t\t}\n\t\t\t\ttest += word.width;\n\n\t\t\t\t//console.log( word, test, col_width );\n\t\t\t\tif (test > col_width && e > 0) {\n\t\t\t\t\ttextarray.push(line);\n\n\t\t\t\t\t// restart\n\t\t\t\t\te = 0;\n\t\t\t\t\tlwidth = 0;\n\t\t\t\t\tline = { width: 0, words: [], space: 0 };\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tline.words.push(word);\n\t\t\t\t\tline.width = test;\n\t\t\t\t\tn++;\n\t\t\t\t\te++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (e) {\n\t\t\t\ttextarray.push(line);\n\t\t\t\tline.last = true;\n\t\t\t}\n\t\t}\n\t});\n\n\tconst textSize = _calcTextHeight(ctx, \"Ag\");\n\tlet lineHeight = (drawStyle.lineHeight??1.3) * textSize; \t// * 1.2 = map to pdf \n\tconst nlines = textarray.length;\n\n\t// calc vertical Align\n\tlet col_top = rc.top;\n\n\tif (columns == 1) {\n\t\t\n\t\tlet fullHeight = lineHeight * nlines;\n\t\tif( nlines==1 ) {\n\t\t\tlineHeight = textSize;\n\t\t\tfullHeight = textSize;\n\t\t}\n\t\t\n\t\tif (drawStyle.vAlign === 'middle') {\n\t\t\tcol_top = rc.top + rc.height / 2 - fullHeight / 2;\n\t\t\tcol_top += lineHeight / 2;\n\t\t\tctx.textBaseline = 'middle';\n\t\t}\n\t\telse if (drawStyle.vAlign === 'bottom') {\n\t\t\tif (fullHeight < rc.height) {\n\t\t\t\tcol_top = rc.top + rc.height - fullHeight + lineHeight;\n\t\t\t}\n\t\t}\n\t\telse { \n\t\t\tcol_top = rc.top;\n\t\t\tctx.textBaseline = 'top';\n\t\t}\n\t}\n\telse {\n\t\t// always top, cannot justify multi-columns vertically\n\t\t// todo: for now\n\t\tcol_top += textSize;\n\t}\n\n\tconst justify = drawStyle.align == 'justify';\n\n\tlet column = columns;\n\tlet y = col_top;\n\tlet align = 0;\n\n\t// faster test..\n\tswitch (drawStyle.align) {\n\t\tcase 'right': align = 1; break;\n\t\tcase 'center': align = 2; break;\n\t}\n\n\t//print all lines of text\n\t//let idx = 1, yy = 0;\n\n\tlet maxw = 0;\n\ttextarray.some( line => {\n\n\t\t//console.log( idx++, yy );\n\n\t\tline.space = spaceW;\n\t\tif (justify && !line.last) {\n\t\t\t_justify(line, col_width, spaceW);\n\t\t}\n\n\t\tlet x = col_left;\n\t\tlet cw = 0;\n\n\t\tif (align == 1) { \n\t\t\tx += col_width - line.width; \n\t\t}\n\t\telse if (align == 2) { \n\t\t\tx += col_width / 2 - line.width / 2; \n\t\t}\n\n\t\t// ...debug\n\t\t/*ctx.lineWidth = 1;\n\t\tctx.beginPath( );\n\t\tctx.moveTo( rc.left, y );\n\t\tctx.lineTo( rc.right, y );\n\t\tctx.strokeStyle = 'white';\n\t\tctx.stroke( );*/\n\n\t\tline.words.forEach(w => {\n\t\t\t/*ctx.beginPath( );\n\t\t\tctx.moveTo( x, y );\n\t\t\tctx.lineTo( x, y-40 );\n\t\t\tctx.strokeStyle = 'red';\n\t\t\tctx.stroke( );*/\n\n\t\t\t/*ctx.beginPath( );\n\t\t\tctx.moveTo( x+w.width, y );\n\t\t\tctx.lineTo( x+w.width, y-40 );\n\t\t\tctx.strokeStyle = 'green';\n\t\t\tctx.stroke( );*/\n\n\t\t\tctx.fillText(w.text, x, y);\n\t\t\tx += w.width + line.space;\n\t\t\tcw += w.width + line.space;\n\t\t});\n\n\t\ty += lineHeight;\n\t\t//yy += lineHeight;\n\n\t\tif( maxw<cw ) {\n\t\t\tmaxw = cw;\n\t\t}\n\n\t\tif (y > (rc.bottom+lineHeight) ) {\n\t\t\ty = col_top;\n\t\t\tcol_left += col_width + gap;\n\t\t\tif( --column==0 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t} )\n\n\tctx.restore();\n\n\t//console.timeEnd( 'drawtext' );\n\n\t// todo autogrow + multi-columns\n\treturn { width: maxw, height: (textarray.length+0.3) * lineHeight };\n}\n\n// Calculate Height of the font\nfunction _calcTextHeight(ctx: CanvasRenderingContext2D, text: string) {\n\tconst size = ctx.measureText(text);\n\treturn size.actualBoundingBoxAscent+size.actualBoundingBoxDescent;\n}\n\nfunction _measureText(ctx: CanvasRenderingContext2D, text: string) {\n\treturn roundTo(ctx.measureText(text).width,2);\n}\n\nfunction _justify(line: ITextLine, width: number, spaceW: number ) {\n\n\tlet delta = (width - line.width) / (line.words.length - 1) + spaceW;\n\tif (delta <= 0) {\n\t\treturn;\n\t}\n\n\tline.width = width;\n\tline.space = delta;\n}", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file image.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\nimport { Component, CProps, html } from './component'\n\ninterface LazyLoad {\n\tel: Component;\n\tsrc: string;\n}\n\n// ============================================================================\n// [IMAGE]\n// ============================================================================\n\nexport interface ImageProps extends CProps\n{\n\tsrc: string;\n\talt?: string;\n\tlazy?: boolean;\t// mark image as lazy loading\n\talignment?: 'fill' | 'contain' | 'cover' | 'scale-down' | 'none';\n\toverlays?: Component[];\n}\n\nconst emptyImageSrc = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\n\nfunction _isStaticImage( src: string ) {\n\treturn src.substring(0,5)=='data:';\n}\n\n\n\n/**\n * Standard image class\n */\nexport class Image extends Component<ImageProps>\n{\n\tprotected m_created: boolean;\n\tprotected m_lazysrc: string;\t\t// expected \n\tprivate m_img: Component;\n\t\n\tconstructor(props: ImageProps) {\n\t\tsuper(props);\n\n\t\tthis.m_created = false;\n\t\t\n\t\tthis.m_props.lazy = props.lazy===false ? false : true;\n\t\tthis.m_props.alt = props.alt;\n\t\t\n\t\tif( props.lazy!==false ) {\n\t\t\tthis.m_lazysrc = props.src;\n\t\t\tprops.src = emptyImageSrc;\n\t\t}\n\t\t\n\t\tthis.setDomEvent( 'create', ( ) => {\n\t\t\tif( props.lazy ) {\n\t\t\t\tthis.setImage( this.m_lazysrc, true );\n\t\t\t}\n\t\t});\n\t}\n\n\t/** @ignore */\n\trender( ) {\n\t\tlet mp = this.m_props;\n\n\t\tthis.m_img = new Component( {\n\t\t\ttag: 'img',\n\t\t\tattrs: {\n\t\t\t\tdraggable: false,\n\t\t\t\talt: mp.alt ?? '',\n\t\t\t\tdecoding: mp.lazy ? 'async' : undefined,\n\t\t\t},\n\t\t\tstyle: {\n\t\t\t\tobjectFit: mp.alignment ? mp.alignment : undefined\n\t\t\t}\n\t\t});\n\n\t\tif( mp.overlays ) {\n\t\t\tmp.overlays.forEach( x => x.addClass('@fit') );\n\t\t\tthis.setContent( [this.m_img,...mp.overlays] );\n\t\t}\n\t\telse {\n\t\t\tthis.setContent( this.m_img );\n\t\t}\n\t}\n\t\n\t/**\n\t * change the image\n\t * @param src - image path\n\t */\n\n\tpublic setImage( src: string, force?: boolean ) {\n\n\t\tif( !src ) {\n\t\t\tsrc = emptyImageSrc;\n\t\t\tthis.addClass( 'empty' );\n\t\t}\n\t\telse {\n\t\t\tthis.removeClass( 'empty' );\n\t\t}\n\t\t\n\t\tif( !this.m_props.lazy ) {\n\t\t\tthis.m_props.src = src;\n\t\t\tthis.m_lazysrc = src;\n\n\t\t\tif( this.m_img.dom ) {\n\t\t\t\tthis.m_img.dom.setAttribute( 'src', src );\n\t\t\t}\n\t\t}\n\t\telse if( force || this.m_lazysrc!=src ) {\n\t\t\tif( _isStaticImage(src) ) {\n\t\t\t\t// not to download -> direct display\n\t\t\t\tthis.m_props.src = src;\n\t\t\t\tthis.m_lazysrc = src;\n\n\t\t\t\tif( this.m_img.dom ) {\n\t\t\t\t\tthis.m_img.dom.setAttribute( 'src', this.m_props.src );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// clear current image while waiting\n\t\t\t\tthis.m_props.src = emptyImageSrc;\n\t\t\t\tif( this.m_img.dom ) {\n\t\t\t\t\tthis.m_img.dom.setAttribute( 'src', this.m_props.src );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.m_lazysrc = src;\n\t\t\t\tif( this.dom ) {\n\t\t\t\t\tthis._update_image( );\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _update_image( ) {\n\n\t\tconsole.assert( !!this.dom );\n\n\t\tif( this.m_lazysrc && !_isStaticImage(this.m_lazysrc) ) {\n\t\t\t// we do not push Components in a static array...\n\t\t\tImage.lazy_images_waiting.push( { \n\t\t\t\tel: this, \n\t\t\t\tsrc: this.m_lazysrc \n\t\t\t} );\n\n\t\t\tif( Image.lazy_image_timer===undefined ) {\n\t\t\t\tImage.lazy_image_timer = setInterval( Image.lazyWatch as TimerHandler, 10 );\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate static lazy_images_waiting: LazyLoad[] = [];\n\tprivate static lazy_image_timer: number = undefined;\n\n\tprivate static lazyWatch( ) {\n\n\t\tlet newList = [];\n\t\tlet done = 0;\n\t\t\t\n\t\tImage.lazy_images_waiting.forEach( ( lazy ) => {\n\n\t\t\tlet dom = lazy.el.dom,\n\t\t\t\tsrc = lazy.src;\n\t\t\t\t\n\t\t\t// skip deleted elements\n\t\t\tif( !dom || dom.offsetParent === null ) {\n\t\t\t\t// do not append to newList\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet rc = dom.getBoundingClientRect();\n\n\t\t\t// if it is visible & inserted inside the document\n\t\t\tif( !done && dom.offsetParent!==null && \n\t\t\t\trc.bottom >= 0 && rc.right >= 0 && \n\t\t\t\trc.top <= (window.innerHeight || x4document.documentElement.clientHeight) && \n\t\t\t\trc.left <= (window.innerWidth || x4document.documentElement.clientWidth) ) {\n\n\t\t\t\t// ok, we load the image\n\t\t\t\tlet img = <HTMLElement>dom.firstChild;\n\t\t\t\timg.setAttribute( 'src', src );\n\t\t\t\tlazy.el.removeClass( 'empty' );\n\t\t\t\tdone++;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// still not visible: may be next time\n\t\t\t\tnewList.push( lazy );\n\t\t\t}\n\t\t} );\n\n\t\tImage.lazy_images_waiting = newList;\n\n\t\t// no more elements to watch...\n\t\tif( newList.length==0 ) {\n\t\t\tclearInterval( Image.lazy_image_timer );\n\t\t\tImage.lazy_image_timer = undefined;\n\t\t}\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file fileupload.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\nimport { Component, CProps } from './component'\n\nimport { HLayout } from './layout'\nimport { Input } from './input'\nimport { Image } from './image'\n\n// ============================================================================\n// [FILEUPLOAD]\n// ============================================================================\n\nexport interface FileUploadProps extends CProps {\n\tname: string;\n\tvalue: string;\n}\n\nexport class FileUpload extends HLayout<FileUploadProps> {\n\tconstructor(props: FileUploadProps) {\n\t\tsuper(props);\n\t}\n\n\tclear() {\n\t\tthis.m_props.value = '';\n\t}\n}\n\n/**\n * \n */\n\nexport class ImageUpload extends FileUpload {\n\n\tprivate m_path: any;\n\tprivate m_ui_img: Image;\n\tprivate m_ui_input: Input;\n\n\t/** @ignore */\n\trender(props: FileUploadProps) {\n\n\t\tlet ename = \"up\" + this.uid;\n\n\t\tthis.setContent([\n\n\t\t\tnew Component({\n\t\t\t\ttag: 'label', attrs: { for: ename }, content: [\n\t\t\t\t\tthis.m_ui_img = new Image({ src: this.m_props.value }),\n\t\t\t\t]\n\t\t\t}),\n\n\t\t\tthis.m_ui_input = new Input({\n\t\t\t\tcls: '@hidden',\n\t\t\t\tid: ename,\n\t\t\t\ttype: 'file',\n\t\t\t\tname: this.m_props.name,\n\t\t\t\tvalue_hook: {\n\t\t\t\t\tget: () => { return this._get_value() },\n\t\t\t\t\tset: (v) => { this._set_value(v); }\n\t\t\t\t},\n\t\t\t\tattrs: {\n\t\t\t\t\taccept: 'image/*'\n\t\t\t\t},\n\t\t\t\tdom_events: {\n\t\t\t\t\tchange: (e) => { this._handleChange(e) }\n\t\t\t\t}\n\t\t\t}),\n\t\t]);\n\t}\n\n\tclear() {\n\t\tsuper.clear();\n\t\t(<HTMLInputElement>this.m_ui_input.dom).value = '';\n\t\tthis.m_ui_img.setImage(null, false);\n\t}\n\n\tprivate _get_value() {\n\t\treturn this.m_path;\n\t}\n\n\tprivate _set_value(v: any) {\n\t\tdebugger;\n\t}\n\n\tprivate _handleChange(e: any) {\n\n\t\tlet self = this;\n\t\tfunction createThumbnail(file: Blob) {\n\n\t\t\tlet reader = new FileReader();\n\t\t\treader.addEventListener('load', (e) => {\n\t\t\t\tself.m_ui_img.setImage(reader.result.toString());\n\t\t\t});\n\n\t\t\treader.readAsDataURL(file);\n\t\t}\n\n\t\tconst allowedTypes = ['png', 'jpg', 'jpeg', 'gif'];\n\n\t\tlet files = e.target.files,\n\t\t\tfilesLen = files.length;\n\n\t\tfor (let i = 0; i < filesLen; i++) {\n\n\t\t\tlet imgType: string = files[i].name.split('.');\n\t\t\timgType = imgType[imgType.length - 1];\n\t\t\timgType = imgType.toLowerCase();\n\n\t\t\tif (allowedTypes.indexOf(imgType) != -1) {\n\t\t\t\tcreateThumbnail(files[i]);\n\t\t\t\tthis.m_path = files[i];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\nlet g_file_input: Component = null;\n\nfunction _createFileInput() {\n\tif (!g_file_input) {\n\t\tg_file_input = new Component({\n\t\t\ttag: 'input',\n\t\t\tstyle: {\n\t\t\t\tdisplay: 'none',\n\t\t\t\tid: 'fileDialog',\n\t\t\t},\n\t\t\tattrs: {\n\t\t\t\ttype: 'file'\n\t\t\t}\n\t\t});\n\n\t\t// ajoute un input type:file cach\u00E9 pour pouvoir choir un fichier a ouvrir\n\t\tx4document.body.appendChild(g_file_input._build());\n\t}\n\n\tg_file_input.clearDomEvent('change');\n\treturn g_file_input;\n}\n\n/**\n * show openfile dialog\n * @param extensions - string - ex: '.doc,.docx'\n * @param cb - callback to call when user select a file\n */\n\nexport function openFileDialog(extensions: string, cb: (filename: FileList) => void, multiple = false) {\n\n\tlet fi = _createFileInput();\n\n\tfi.removeAttribute('nwsaveas');\n\tfi.setAttribute('accept', extensions);\n\tfi.setAttribute('multiple', multiple);\n\n\t// Set up the file chooser for the on change event\n\tfi.setDomEvent(\"change\", (evt) => {\n\t\t// When we reach this point, it means the user has selected a file,\n\t\tlet files = (<HTMLInputElement>fi.dom).files\n\t\tcb(files);\n\t});\n\n\tfi.dom.click();\n}\n\n/**\n * open saveas dialog\n * @param defFileName - string - proposed filename \n * @param cb - callback to call when user choose the destination\n */\n\nexport function saveFileDialog(defFileName: string, extensions: string, cb: (filename: File) => void) {\n\n\tlet fi = _createFileInput();\n\tfi.setAttribute('nwsaveas', defFileName);\n\tfi.setAttribute('accept', extensions);\n\n\t// Set up the file chooser for the on change event\n\tfi.setDomEvent(\"change\", (evt) => {\n\t\t// When we reach this point, it means the user has selected a file,\n\t\tlet files = (<HTMLInputElement>fi.dom).files\n\t\tcb(files[0]);\n\t});\n\n\tfi.dom.click();\n}\n\n", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file formatters.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { formatIntlDate, roundTo } from './tools'\n\nexport type FormatFunc = (input: any, rec: any) => string;\n\nlet locale: string;\nlet moneyFmt: Intl.NumberFormat;\n\nexport function setCurrencySymbol( symbol: string | null ) {\n\n\tif( symbol ) {\n\t\tmoneyFmt = new Intl.NumberFormat( locale, { style: 'currency', currency: symbol /*, currencyDisplay: 'symbol'*/ } );\n\t}\n\telse {\n\t\tmoneyFmt = new Intl.NumberFormat( locale, { style: 'decimal', useGrouping: true, minimumFractionDigits: 2, maximumFractionDigits: 2 } );\n\t}\n}\n\nexport function sql_date_formatter(input: any): string {\n\n\tif (input === null || input === undefined || input === '') {\n\t\treturn '';\n\t}\n\n\tlet dte = new Date(Date.parse(input));\n\n\t//todo: better implementation\n\tconst options: Intl.DateTimeFormatOptions = { /*weekday: 'short',*/ month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' };\n\treturn dte.toLocaleDateString(locale, options)\n}\n\nexport function date_formatter(input: any): string {\n\n\tif (input === null || input === undefined || input === '') {\n\t\treturn '';\n\t}\n\n\tlet dte: Date = typeof (input) == 'string' ? new Date(Date.parse(input)) : input;\n\treturn formatIntlDate(dte);\n}\n\nexport function money_formatter(input: any): string {\n\n\tif (input === null || input === undefined || input === '') {\n\t\treturn '';\n\t}\n\n\tlet val: number = roundTo(typeof (input) == 'string' ? parseFloat(input) : input, 2);\n\tif (Object.is(val, -0.00)) {\n\t\tval = 0.00;\n\t}\n\n\tlet res = moneyFmt.format(val);\n\treturn res;\n}\n\nexport function money_formatter_nz(input: any): string {\n\n\tif (input === null || input === undefined || input === '') {\n\t\treturn '';\n\t}\n\n\tlet val: number = roundTo(typeof (input) == 'string' ? parseFloat(input) : input, 2);\n\tif (!val) {\t// do not show zeros\n\t\treturn '';\n\t}\n\n\tlet res = moneyFmt.format(val);\n\treturn res;\n}\n\nexport function bool_formatter(input: any): string {\n\treturn input ? 'oui' : '-';\n}\n\n\nsetCurrencySymbol( null );", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file gridview.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nconst T_UPDATE = Symbol('update');\n\n/**\n * todo: sizable column\n * todo: button in a column\n */\n\nimport { x4document } from './x4dom'\n\nimport { HLayout, VLayout } from './layout'\nimport { Component, ContainerEventMap, EvSize, EvDblClick, CProps, flyWrap, html, HtmlString, SizerOverlay, Flex } from './component'\nimport { Label } from './label'\nimport { _tr } from './i18n'\nimport { FormatFunc } from './formatters'\nimport { downloadData, isFunction } from './tools'\nimport { DataView, DataStore, Record } from './datastore'\n\nimport { EvContextMenu, EvSelectionChange, BasicEvent, EventDisposer } from \"./x4events\";\nimport { Icon } from './icon.js';\n\nexport interface EvGridCheck extends BasicEvent {\n\trec: Record;\n\tchk: boolean;\n}\n\nexport function EvGridCheck(rec: Record, chk: boolean) {\n\treturn BasicEvent<EvGridCheck>( { rec, chk } );\n}\n\n\n\n\n\n/**\n * \n */\n\nexport interface GridColumn {\n\tid: any;\n\ttitle: string;\n\twidth: number;\n\tflex?: number;\n\talign?: 'left' | 'center' | 'right';\n\trenderer?: CellRenderer;\n\tformatter?: FormatFunc;\n\tcls?: string;\n\tsortable?: boolean;\n}\n\ninterface GridColumnInternal extends GridColumn {\n\t$hdr: ColHeader;\n\t$ftr: Component;\n}\n\n\n\nexport type CellRenderer = (rec: Record) => Component;\nexport type RowClassifier = (rec: Record, Row: Component) => void;\nexport type ContextMenuGridItem = (event: MouseEvent, item: Record, grid: GridView) => any;\n\ntype emptyFn = () => string;\n\ninterface GridViewEventMap extends ContainerEventMap {\n\tdblClick?: EvDblClick;\n\tselectionChange?: EvSelectionChange;\n\tcontextMenu?: EvContextMenu;\n\tgridCheck?: EvGridCheck;\n}\n\nexport interface GridViewProps extends CProps<GridViewEventMap> {\n\tstore: DataStore | DataView;\n\tcolumns: GridColumn[];\n\tcalcRowClass?: RowClassifier;\n\tempty_text?: string | emptyFn;\t// set or return '' to avoid message\n\thasMarks?: boolean;\t// if true add a checkbox on left side cf. clearMarks, getMarksIds\n\thasFooter?: boolean;\n}\n\n\nclass ColHeader extends Component {\n\n\tprivate m_sens: \"up\" | \"dn\";\n\tprivate m_sorted: boolean;\n\t\n\tconstructor( props, title ) {\n\t\tsuper( props );\n\n\t\tthis.m_sorted = false;\n\t\tthis.m_sens = 'dn';\n\t\n\t\tthis.setContent( [\n\t\t\tnew Component({\n\t\t\t\ttag: 'span',\n\t\t\t\tcontent: title\n\t\t\t}),\n\t\t\tnew Icon( {\n\t\t\t\tref: 'sorter',\n\t\t\t\tcls: '@hidden sort',\n\t\t\t\ticon: 'var( --x4-icon-arrow-down )'\n\t\t\t})\n\t\t]);\n\t}\n\n\tget sorted( ) {\n\t\treturn this.m_sorted;\n\t}\n\n\t//set sorted( v ) {\n\t//\tthis.m_sorted = v;\n\t//\tthis.m_sens = 'dn';\n\t//\tthis.itemWithRef<Icon>( 'sorter' ).show( v );\n\t//}\n\n\tsort( v: boolean, sens: \"up\" | \"dn\" ) {\n\t\tthis.m_sorted = v;\n this.m_sens = sens;\n\n\t\tconst ic = this.itemWithRef<Icon>('sorter');\n ic.icon = this.m_sens == 'up' ? 'var( --x4-icon-arrow-down )' : 'var( --x4-icon-arrow-up )';\n\t\tic.show(v);\n\t}\n\n\tget sens( ) {\n\t\treturn this.m_sens;\n\t}\n\n\ttoggleSens( ) {\n\t\tthis.m_sens = this.m_sens=='up' ? 'dn' : 'up';\n\t\tthis.itemWithRef<Icon>( 'sorter' ).icon = this.m_sens=='up' ? 'var( --x4-icon-arrow-down )' : 'var( --x4-icon-arrow-up )';\n\t}\n}\n\n\n\n/**\n * gridview class\n */\n\nexport class GridView extends VLayout<GridViewProps, GridViewEventMap> {\n\n\tprotected m_dataview: DataView;\n\tprotected m_data_cx: EventDisposer;\n\n\tprotected m_columns: GridColumn[];\n\n\tprotected m_view_el: Component;\n\tprotected m_container: Component;\n\tprotected m_header: Component;\n\n\tprotected m_footer: Component;\n\t\n\tprotected m_empty_msg: Label;\n\tprotected m_empty_text: string | emptyFn;\n\n\tprotected m_selection: any;\n\tprivate m_itemHeight: number;\n\tprivate m_topIndex: number;\n\tprotected m_visible_rows: Component[];\t\t// shown elements\n\n\tprotected m_hasMarks: boolean;\n\tprotected m_marks: Set<any>;\t// checked elements\n\n\tprivate m_recycler: Component[];\n\n\tprivate m_rowClassifier: RowClassifier;\n\n\tconstructor(props: GridViewProps) {\n\t\tsuper(props);\n\n\t\tthis.m_columns = props.columns;\n\t\tthis.m_hasMarks = props.hasMarks ?? false;\n\t\tthis.m_marks = new Set<any>();\n\n\t\t// prepend the checkable column\n\t\tif (this.m_hasMarks) {\n\t\t\tthis.m_columns.unshift({\n\t\t\t\tid: 'id',\n\t\t\t\ttitle: '',\n\t\t\t\twidth: 30,\n\t\t\t\trenderer: (e) => this._renderCheck( e )\n\t\t\t});\n\t\t}\n\n\t\tthis.setAttribute('tabindex', 0);\n\n\t\tthis.m_topIndex = 0;\n\t\tthis.m_itemHeight = 0;\n\t\tthis.m_recycler = [];\n\t\tthis.m_rowClassifier = props.calcRowClass;\n\n\t\tthis.m_empty_text = props.empty_text ?? _tr.global.empty_list;\n\n\t\t//this.setDomEvent('create', this._handleCreate, this);\n\t\tthis.setDomEvent('click', (e)=>this._itemClick(e));\n\t\tthis.setDomEvent('dblclick', (e)=>this._itemDblClick(e));\n\t\tthis.setDomEvent('contextmenu', (e)=>this._itemMenu(e));\n\t\tthis.setDomEvent('keydown', (e)=>this._handleKey(e));\n\n\t\tthis.setStore(props.store);\n\t}\n\n\tcomponentCreated() {\n\t\tthis._updateScroll(true);\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _moveSel(sens: number, select = true) {\n\n\t\tlet sel = this.m_selection;\n\t\tlet scrolltype = null;\n\n\t\tif (sel === undefined) {\n\t\t\tsel = this.m_dataview.getByIndex(0).getID();\n\t\t}\n\t\telse {\n\n\t\t\tlet index = this.m_dataview.indexOfId(this.m_selection);\n\n\t\t\tif (sens == 1) {\n\t\t\t\tindex++;\n\t\t\t}\n\t\t\telse if (sens == -1) {\n\t\t\t\tindex--;\n\t\t\t}\n\t\t\telse if (sens == 2) {\n\t\t\t\tindex += this.m_visible_rows.length - 1;\n\t\t\t}\n\t\t\telse if (sens == -2) {\n\t\t\t\tindex -= this.m_visible_rows.length - 1;\n\t\t\t}\n\n\t\t\tif (sens < 0) {\n\t\t\t\tscrolltype = 'start';\n\t\t\t}\n\t\t\telse {\n\t\t\t\tscrolltype = 'end';\n\t\t\t}\n\n\t\t\tif (index < 0) {\n\t\t\t\tindex = 0;\n\t\t\t}\n\t\t\telse if (index >= this.m_dataview.count) {\n\t\t\t\tindex = this.m_dataview.count - 1;\n\t\t\t}\n\n\t\t\tsel = this.m_dataview.getByIndex(index).getID();\n\t\t}\n\n\t\tif (this.m_selection != sel && select) {\n\t\t\tthis._selectItem(sel, null, scrolltype);\n\t\t}\n\n\t\treturn sel;\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _handleKey(event: KeyboardEvent) {\n\t\tif (!this.m_dataview || this.m_dataview.count == 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowDown':\n\t\t\tcase 'Down': {\n\t\t\t\tthis._moveSel(1);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'ArrowUp':\n\t\t\tcase 'Up': {\n\t\t\t\tthis._moveSel(-1);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'PageUp': {\n\t\t\t\tthis._moveSel(-2);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'PageDown': {\n\t\t\t\tthis._moveSel(2);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tgetNextSel(sens: number) {\n\t\treturn this._moveSel(sens, false);\n\t}\n\n\tprivate _scrollIntoView(id: any, sens?: string) {\n\n\t\tlet itm = this._findItem(id);\n\t\tif (itm) {\n\t\t\titm.scrollIntoView({\n\t\t\t\tblock: 'center'\t//<ScrollLogicalPosition>sens ?? 'nearest'\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tthis.m_topIndex = this.m_dataview.indexOfId(id);\n\t\t\tthis.m_view_el.dom.scrollTop = this.m_topIndex * this.m_itemHeight;\n\t\t\tthis._buildItems();\n\n\t\t\tthis._scrollIntoView(id);\n\t\t}\n\n\t}\n\n\t/**\n\t * change the list of item displayed\n\t * @param items - new array of items\n\t */\n\n\tpublic setStore(store: DataStore | DataView) {\n\n\t\tthis.m_selection = undefined;\n\n\t\tif (store instanceof DataStore) {\n\t\t\tthis.m_dataview = store.createView();\n\t\t}\n\t\telse {\n\t\t\tthis.m_dataview = store;\n\t\t}\n\n\t\tif( this.m_hasMarks ) {\n\t\t\tthis.clearMarks( );\n\t\t}\n\n\t\t// unlink previous observer\n\t\tif (this.m_data_cx) {\n\t\t\tthis.m_data_cx.dispose( );\n\t\t}\n\n\t\tif (this.m_dataview) {\n\n\t\t\tthis.m_data_cx = this.m_dataview.on( 'view_change', ( ev ) => {\n\t\t\t\tif (ev.action == 'change') {\n\t\t\t\t\tthis.m_selection = undefined;\n\t\t\t\t}\n\n\t\t\t\tthis._updateScroll(true);\n\t\t\t});\n\n\t\t\t//this.update( );\n\t\t\tthis._updateScroll(true);\n\t\t}\n\t}\n\n\tpublic getView(): DataView {\n\t\treturn this.m_dataview;\n\t}\n\n\t/**\n\t * return the current selection (row id) or null \n\t */\n\n\tpublic getSelection(): any {\n\t\treturn this.m_selection;\n\t}\n\n\tpublic getSelRec(): Record {\n\t\tif (this.m_selection) {\n\t\t\treturn this.m_dataview.getById(this.m_selection);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic setSelection(recId: any) {\n\t\tthis._selectItem(recId, null, 'center');\n\t}\n\n\t/** @ignore */\n\trender() {\n\n\t\tthis.m_recycler = [];\n\t\tthis.m_container = new Component({\n\t\t\tcls: 'content',\n\t\t});\n\n\t\tthis.m_empty_msg = new Label({\n\t\t\tcls: 'empty-msg',\n\t\t\ttext: ''\n\t\t});\n\n\t\tthis.m_view_el = new Component({\n\t\t\tcls: '@scroll-view',\n\t\t\tflex: 1,\n\t\t\tdom_events: {\n\t\t\t\tsizechange: ( ) => this._updateScroll(true),\n\t\t\t\tscroll: ( ) => this._updateScroll(false)\n\t\t\t},\n\t\t\tcontent: this.m_container\n\t\t});\n\n\t\tlet flex = false;\n\t\tlet cols = this.m_columns.map((col, index) => {\n\n\t\t\tlet cls = '@cell';\n\t\t\tif (col.cls) {\n\t\t\t\tcls += ' ' + col.cls;\n\t\t\t}\n\n\t\t\tlet comp = new ColHeader({\n\t\t\t\tcls,\n\t\t\t\tflex: col.flex,\n\t\t\t\tsizable: 'right',\n\t\t\t\tstyle: {\n\t\t\t\t\twidth: col.width\n\t\t\t\t},\n\t\t\t\tdom_events: {\n\t\t\t\t\tclick: (ev: MouseEvent) => {\n\t\t\t\t\t\tlet t = flyWrap(<HTMLElement>ev.target);\n\t\t\t\t\t\tif (!t.hasClass('@sizer-overlay')) { // avoid sizer click\n\t\t\t\t\t\t\tthis._sortCol(col);\n\t\t\t\t\t\t\tev.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, col.title );\n\n\t\t\tconst resizeCol = ( ev: EvSize ) => {\n\t\t\t\tthis._on_col_resize(index, ev.size.width);\n\n\t\t\t\tif( this.m_footer ) {\n\t\t\t\t\tlet col = Component.getElement( this.m_footer.dom.childNodes[index] as HTMLElement );\n\t\t\t\t\tif( col ) {\n\t\t\t\t\t\tcol.setStyleValue( 'width', ev.size.width ); \n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tnew SizerOverlay({\n\t\t\t\ttarget: comp,\n\t\t\t\tsens: 'right',\n\t\t\t\tevents: {resize: ( e ) => resizeCol(e )}\n\t\t\t});\n\n\t\t\tif( col.flex ) {\n\t\t\t\tflex = true;\n\t\t\t}\n\n\t\t\t(<any>col).$hdr = comp;\n\t\t\treturn comp;\n\t\t});\n\n\t\t(cols as any).push( new Flex( {\n\t\t\tref: 'flex',\n\t\t\tcls: flex ? '@hidden' : ''\n\t\t} ) );\n\t\t\n\t\t// compute full width\n\t\tlet full_width = 0;\n\t\tthis.m_columns.forEach((col) => {\n\t\t\tfull_width += col.width ?? 0;\n\t\t});\n\n\t\tthis.m_header = new HLayout({\n\t\t\tcls: '@header',\n\t\t\tcontent: <any>cols,\n\t\t\tstyle: {\n\t\t\t\tminWidth: full_width\n\t\t\t}\n\t\t});\t\n\n\t\tif( this.m_props.hasFooter ) {\n\t\t\tlet foots = this.m_columns.map((col, index) => {\n\n\t\t\t\tlet cls = '@cell';\n\n\t\t\t\tif (col.align) {\n\t\t\t\t\tcls += ' ' + col.align;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (col.cls) {\n\t\t\t\t\tcls += ' ' + col.cls;\n\t\t\t\t}\n\n\t\t\t\tlet comp = new Component({\n\t\t\t\t\tcls,\n\t\t\t\t\tdata: { col: index },\n\t\t\t\t\tflex: col.flex,\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\twidth: col.width\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t(col as GridColumnInternal).$ftr = comp;\n\t\t\t\treturn comp;\n\t\t\t});\n\n\t\t\t(foots as any).push( new Flex( {\n\t\t\t\tref: 'flex',\n\t\t\t\tcls: flex ? '@hidden' : ''\n\t\t\t} ) );\n\t\t\t\n\t\t\tthis.m_footer = new HLayout({\n\t\t\t\tcls: '@footer',\n\t\t\t\tcontent: <any>foots,\n\t\t\t\tstyle: {\n\t\t\t\t\tminWidth: full_width\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tthis.m_footer = null;\n\t\t}\n\n\t\tthis.setContent([\n\t\t\tthis.m_header,\n\t\t\tthis.m_view_el,\n\t\t\tthis.m_footer,\n\t\t\tthis.m_empty_msg,\n\t\t]);\n\n\t}\n\n\tprivate _on_col_resize(col: number, width: number) {\n\n\t\tconst _col = this.m_columns[col] as GridColumnInternal;\n\n\t\tlet updateFlex = false;\n\t\t\t\t\n\t\tif( width>=0 ) {\n\t\t\t_col.width = width;\n\t\t\tif( _col.flex ) {\n\t\t\t\t_col.$hdr.removeClass( '@flex' );\n\t\t\t\t_col.$ftr?.removeClass( '@flex' );\n\t\t\t\t_col.flex = undefined;\n\t\t\t\tupdateFlex = true;\n\t\t\t}\n\t\t}\n\t\telse if( width<0 && !_col.flex ) {\n\t\t\t_col.$hdr.addClass( '@flex' );\n\t\t\t_col.$ftr?.addClass( '@flex' );\n\t\t\t_col.flex = 1;\n\t\t\tupdateFlex = true;\n\t\t}\n\n\t\tif( updateFlex ) {\n\t\t\tlet flex = false;\n\t\t\tthis.m_columns.forEach( c => {\n\t\t\t\tif( c.flex ) {\n\t\t\t\t\tflex = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\t\t\n\t\t\tthis.m_header.itemWithRef( 'flex' )?.show( flex ? false : true );\n\t\t\tif( this.m_footer ) {\n\t\t\t\tthis.m_footer.itemWithRef( 'flex' )?.show( flex ? false : true );\n\t\t\t}\n\t\t}\n\n\t\tthis._updateScroll(true);\n\t}\n\n\t/**\n\t * \n\t */\n\n\tsortCol( name: string, asc = true ) {\n\t\tconst col = this.m_columns.find(c => c.id==name );\n\t\tif( col===undefined ) {\n\t\t\tconsole.assert( false, \"unknown field \"+name+\" in grid.sortCol\" );\n\t\t\treturn;\n\t\t}\n\n\t\tthis._sortCol( col, asc ? \"dn\" : \"up\" );\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _sortCol(col: GridColumn, sens: \"up\" | \"dn\" = \"up\" ) {\n\n\t\tif (col.sortable === false) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.m_columns.forEach((c) => {\n\t\t\tif (c !== col) {\n\t\t\t\t(c as GridColumnInternal).$hdr.sort( false, \"dn\" );\n\t\t\t}\n\t\t});\n\n\t\tconst $hdr = (col as GridColumnInternal).$hdr;\n\n\t\tif ($hdr.sorted) {\n\t\t\t$hdr.toggleSens( );\n\t\t}\n\t\telse {\n\t\t\t$hdr.sort( true, sens );\n\t\t}\n\n\t\tif (this.m_dataview) {\n\t\t\tthis.m_dataview.sort([\n\t\t\t\t{ field: col.id, ascending: $hdr.sens=='dn' ? false : true }\n\t\t\t]);\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _computeItemHeight() {\n\t\tlet gr = x4document.createElement('div');\n\t\tgr.classList.add('x-row');\n\n\t\tlet gv = x4document.createElement('div');\n\t\tgv.classList.add('x-grid-view');\n\t\tgv.style.position = 'absolute';\n\t\tgv.style.top = '-1000px';\n\t\tgv.appendChild(gr);\n\n\t\tthis.dom.appendChild(gv);\n\t\tlet rc = gr.getBoundingClientRect();\n\t\tthis.dom.removeChild(gv);\n\n\t\tthis.m_itemHeight = rc.height;\n\t}\n\n\tprivate _createRow( props: CProps ): Component {\n\n\t\tlet row: Component;\n\t\tif (this.m_recycler.length) {\n\t\t\trow = this.m_recycler.pop();\n\t\t\trow.clearClasses();\n\t\t\trow.addClass( props.cls );\n\t\t\trow.setContent( props.content );\n\t\t\trow.setStyle( props.style );\n\n\t\t\tfor( let n in props.data ) {\n\t\t\t\trow.setData( n, props.data[n] );\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\trow = new HLayout( props );\n\t\t}\n\n\t\tif (!row.dom) {\n\t\t\tthis.m_container.appendChild(row);\n\t\t}\n\n\t\treturn row;\n\t}\n\n\tprivate _buildItems( canOpt = true ) {\n\t\tlet rc = this.getBoundingRect();\n\t\tlet rh = this.m_header.getBoundingRect();\n\t\tlet height = rc.height - rh.height + this.m_itemHeight;\n\n\t\tif (this.m_itemHeight == 0) {\n\t\t\tthis._computeItemHeight();\n\t\t}\n\n\t\tlet top = this.m_topIndex * this.m_itemHeight;\n\t\tlet y = 0;\n\t\tlet cidx = 0;\n\t\tlet index = this.m_topIndex;\n\t\tlet count = this.m_dataview ? this.m_dataview.count : 0;\n\t\t\n\t\tlet full_width = 0; // todo: +4 pixel of left border\n\t\tlet even = this.m_topIndex & 1 ? true : false;\n\n\t\t// compute full width\n\t\tthis.m_columns.forEach((col) => {\n\t\t\tfull_width += col.width ?? 0;\n\t\t});\n\n\t\t// if items height make scroll visible, update header width\n\t\tif (((count + 1) * this.m_itemHeight) >= height) {\n\t\t\tlet w = Component.getScrollbarSize();\n\t\t\tthis.m_header.setStyleValue(\"paddingRight\", w);\n\t\t\tthis.m_footer?.setStyleValue(\"paddingRight\", w);\n\t\t}\n\t\telse {\n\t\t\tthis.m_header.setStyleValue(\"paddingRight\", 0);\n\t\t\tthis.m_footer?.setStyleValue(\"paddingRight\", 0);\n\t\t}\n\n\t\t// passe 0 - all created cells are moved to the recycler\n\t\tif( this.m_visible_rows ) {\n\t\t\tthis.m_visible_rows.forEach((c) => {\n\t\t\t\tthis.m_recycler.push(c);\n\t\t\t});\n\t\t}\n\n\t\tthis.m_visible_rows = [];\n\t\tlet limit = 100;\n\t\twhile (y < height && index < count && --limit > 0) {\n\n\t\t\tlet rec = this.m_dataview.getByIndex(index);\n\t\t\tlet rowid = rec.getID();\n\n\t\t\tlet crow = canOpt ? this.m_recycler.findIndex( ( r ) => r.getData('row-id')==rowid ) : -1;\n\t\t\tif( crow>=0 ) {\n\t\t\t\tlet rrow = this.m_recycler.splice( crow, 1 )[ 0 ];\n\t\t\t\trrow.setStyle( {\n\t\t\t\t\ttop: y + top,\n\t\t\t\t\tminWidth: full_width,\n\t\t\t\t} );\n\n\t\t\t\tif (this.m_hasMarks) {\n\t\t\t\t\trrow.setClass( '@marked', this.m_marks.has(rowid) );\n\t\t\t\t}\n\n\t\t\t\trrow.removeClass( '@hidden' );\n\t\t\t\trrow.setClass( '@selected', this.m_selection === rowid );\n\n\t\t\t\tthis.m_visible_rows[cidx] = rrow;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet cols = this.m_columns.map( col => {\n\n\t\t\t\t\tlet cls = '@cell';\n\t\t\t\t\tif (col.align) {\n\t\t\t\t\t\tcls += ' ' + col.align;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (col.cls) {\n\t\t\t\t\t\tcls += ' ' + col.cls;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet cell: Component;\n\t\t\t\t\tif (col.renderer) {\n\t\t\t\t\t\tcell = col.renderer(rec);\n\t\t\t\t\t\tif (cell) {\n\t\t\t\t\t\t\tcell.addClass(cls);\n\t\t\t\t\t\t\tcell.setStyleValue('width', col.width);\n\t\t\t\t\t\t\tif (col.flex !== undefined) {\n\t\t\t\t\t\t\t\tcell.addClass('@flex');\n\t\t\t\t\t\t\t\tcell.setStyleValue('flex', col.flex);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\n\t\t\t\t\t\tlet fmt = col.formatter;\n\t\t\t\t\t\tlet text;\n\n\t\t\t\t\t\tif (fmt && fmt instanceof Function) {\n\t\t\t\t\t\t\ttext = fmt(rec.getRaw(col.id), rec);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\ttext = rec.getField(col.id);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcell = new Component({\n\t\t\t\t\t\t\tcls,\n\t\t\t\t\t\t\twidth: col.width,\n\t\t\t\t\t\t\tcontent: html`<span>${text}</span>`,\n\t\t\t\t\t\t\tflex: col.flex\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\n\t\t\t\t\treturn cell;\n\t\t\t\t});\n\n\t\t\t\tlet cls = '@row @hlayout center';\n\t\t\t\tif (this.m_hasMarks) {\n\t\t\t\t\tif (this.m_marks.has(rowid)) {\n\t\t\t\t\t\tcls += ' @marked';\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this.m_selection === rowid) {\n\t\t\t\t\tcls += ' @selected';\n\t\t\t\t}\n\n\t\t\t\tlet row = this.m_visible_rows[cidx] = this._createRow( {\n\t\t\t\t\tcls,\n\t\t\t\t\tcontent: <any>cols,\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\ttop: y + top,\n\t\t\t\t\t\tminWidth: full_width,\n\t\t\t\t\t},\n\t\t\t\t\tdata: {\n\t\t\t\t\t\t'row-id': rowid,\n\t\t\t\t\t\t'row-idx': index\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\trow.addClass(even ? 'even' : 'odd');\n\t\t\t\teven = !even;\n\n\t\t\t\tif (this.m_rowClassifier) {\n\t\t\t\t\tthis.m_rowClassifier(rec, row);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ty += this.m_itemHeight;\n\n\t\t\tindex++;\n\t\t\tcidx++;\n\t\t}\n\n\t\t// if some cells are still in cache, hide them\n\t\tthis.m_recycler.forEach((c) => {\n\t\t\tc.addClass('@hidden');\n\t\t})\n\n\t\t//this.m_container.setContent(<ComponentContent>this.m_visible_rows);\n\n\t\tlet show = !count;\n\t\tlet msg = (this.m_empty_text instanceof Function) ? this.m_empty_text() : this.m_empty_text;\n\t\tthis.m_empty_msg.text = msg;\n\n\t\tif (show && msg.length == 0) {\n\t\t\tshow = false;\n\t\t}\n\n\t\tthis.m_empty_msg.show(show);\n\n\t\tif (full_width < rc.width) {\n\t\t\tthis.m_header.setStyleValue('width', null);\n\t\t\tthis.m_footer?.setStyleValue('width', null);\n\t\t\tthis.m_container.setStyle({\n\t\t\t\theight: count * this.m_itemHeight,\n\t\t\t\twidth: null\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tthis.m_header.setStyleValue('width', full_width + 1000 );\n\t\t\tthis.m_footer?.setStyleValue('width', full_width + 1000 );\n\t\t\tthis.m_container.setStyle({\n\t\t\t\theight: count * this.m_itemHeight,\n\t\t\t\twidth: full_width\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _updateScroll(forceUpdate) {\n\t\tif (!this.m_view_el || !this.m_view_el.dom) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst update = () => {\n\n\t\t\t// element destroyed between updateScroll and now\n\t\t\tif( !this.dom ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet newTop = Math.floor(this.m_view_el.dom.scrollTop / (this.m_itemHeight || 1));\n\n\t\t\tif (newTop != this.m_topIndex || forceUpdate) {\n\t\t\t\tthis.m_topIndex = newTop;\n\t\t\t\tthis._buildItems( !forceUpdate );\n\t\t\t}\n\n\t\t\tlet newLeft = this.m_view_el.dom.scrollLeft;\n\t\t\tthis.m_header.setStyleValue('left', -newLeft);\n\t\t\tthis.m_footer?.setStyleValue('left', -newLeft);\n\t\t}\n\n\t\tif (forceUpdate) {\n\t\t\tthis.singleShot( update, 10 );\n\t\t}\n\t\telse {\n\t\t\tupdate();\n\t\t}\n\t}\n\n\t/** @ignore */\n\n\tprivate _rowFromTarget(dom) {\n\t\tlet self = this.dom;\n\n\t\twhile (dom && dom != self) {\n\t\t\tlet itm = Component.getElement(dom);\n\n\t\t\tif (itm) {\n\t\t\t\tlet id = itm.getData('row-id');\n\t\t\t\tif (id !== undefined) {\n\t\t\t\t\treturn { id, itm };\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdom = dom.parentElement;\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tprivate _itemClick(e: MouseEvent) {\n\t\tlet hit = this._rowFromTarget(e.target);\n\t\tif (hit) {\n\t\t\tthis._selectItem(hit.id, hit.itm);\n\t\t}\n\t\telse {\n\t\t\tthis._selectItem(undefined, undefined);\n\t\t}\n\t}\n\n\tprivate _itemDblClick(e: MouseEvent) {\n\t\tlet hit = this._rowFromTarget(e.target);\n\t\tif (hit) {\n\t\t\tthis._selectItem(hit.id, hit.itm);\n\n\t\t\tlet rec = this.m_dataview.getById(hit.id);\n\t\t\tthis.emit( 'dblClick', EvDblClick(rec) );\n\n\t\t\tif (this.m_hasMarks) {\n\t\t\t\tthis._toggleMark(rec);\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/** @ignore */\n\tprivate _itemMenu(e: MouseEvent) {\n\n\t\tlet dom = e.target as HTMLElement,\n\t\t\tself = this.dom;\n\n\t\twhile (dom && dom != self) {\n\t\t\tlet itm = Component.getElement(dom),\n\t\t\t\tid = itm?.getData('row-id');\n\n\t\t\tif (id !== undefined) {\n\t\t\t\tthis._selectItem(id, itm);\n\n\t\t\t\tlet idx = itm.getData('row-idx');\n\t\t\t\tlet rec = this.m_dataview.getByIndex(idx);\n\n\t\t\t\tthis._showItemContextMenu(e, rec);\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdom = dom.parentElement;\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _findItem(id): Component {\n\n\t\tfor (let i = 0; i < this.m_visible_rows.length; i++) {\n\t\t\tlet itm = this.m_visible_rows[i];\n\t\t\tif (itm.getData('row-id') === id) {\n\t\t\t\treturn itm;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * @ignore\n\t * called when an item is selected by mouse\n\t */\n\n\tprotected _selectItem(item: any, dom_item: Component, scrollIntoView?: string) {\n\n\t\tif (this.m_selection !== undefined) {\n\t\t\tlet old = this._findItem(this.m_selection);\n\t\t\tif (old) {\n\t\t\t\told.removeClass('@selected');\n\t\t\t}\n\t\t}\n\n\t\tthis.m_selection = item;\n\n\t\tif (item) {\n\t\t\tif (scrollIntoView) {\n\t\t\t\tthis._scrollIntoView(item, scrollIntoView);\n\t\t\t}\n\n\t\t\tif (!dom_item) {\n\t\t\t\tdom_item = this._findItem(item);\n\t\t\t}\n\n\t\t\tif (dom_item) {\n\t\t\t\tdom_item.addClass('@selected');\n\t\t\t}\n\n\t\t\tlet rec = this.m_dataview.getById(item);\n\t\t\tthis.emit( 'selectionChange', EvSelectionChange(rec));\n\t\t}\n\t\telse {\n\t\t\tthis.emit( 'selectionChange', EvSelectionChange(null));\n\t\t}\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprotected _showItemContextMenu(event: MouseEvent, item: Record) {\n\t\tthis.emit( 'contextMenu', EvContextMenu(event,item));\n\t}\n\n\t/**\n\t * \n\t */\n\n\tpublic clearSelection() {\n\t\tthis._selectItem(null, null);\n\t}\n\n\t/**\n\t * todo: moveto datastore\n\t */\n\n\tpublic exportData(filename) {\n\n\t\tlet data = '';\n\t\tconst fsep = '\\t';\n\t\tconst lsep = '\\r\\n';\n\n\t\tlet rec = '';\n\t\tthis.m_columns.map((col) => {\n\n\t\t\tif (rec.length) {\n\t\t\t\trec += fsep;\n\t\t\t}\n\n\t\t\trec += col.title;\n\t\t});\n\n\t\tdata += rec + lsep;\n\n\t\tlet count = this.m_dataview.count;\n\n\t\tfor (let i = 0; i < count; i++) {\n\n\t\t\tlet record = this.m_dataview.getByIndex(i);\n\n\t\t\trec = '';\n\t\t\tlet cols = this.m_columns.map((col) => {\n\n\t\t\t\tlet text = record.getField(col.id);\n\t\t\t\tlet fmt = col.formatter;\n\n\t\t\t\tif (fmt && fmt instanceof Function) {\n\t\t\t\t\ttext = fmt(text, record);\n\t\t\t\t}\n\n\t\t\t\tif (rec.length > 0) {\n\t\t\t\t\trec += fsep;\n\t\t\t\t}\n\n\t\t\t\trec += text;\n\t\t\t});\n\n\t\t\tdata += rec + lsep;\n\t\t}\n\n\t\t//todo: review that\n\t\tdata = data.replace(/[\u00E0\u00E2\u00E4]/gm, 'a');\n\t\tdata = data.replace(/[\u00E9\u00E8\u00EA]/gm, 'e');\n\t\tdata = data.replace(/[\u00EE\u00EF]/gm, 'i');\n\t\tdata = data.replace(/[\u00FB\u00FC\u00F9]/gm, 'u');\n\t\tdata = data.replace(/\u202F/gm, ' '); \t// non breaking space\n\n\t\tdownloadData(data, 'text/csv', filename);\n\t}\n\n\tset empty_text(text: string | HtmlString) {\n\t\tthis.m_empty_msg.text = text;\n\t}\n\n\tprivate _renderCheck(rec: Record) {\n\t\tlet icon = '--x4-icon-square';\n\t\tif (this.m_marks.has(rec.getID())) {\n\t\t\ticon = '--x4-icon-square-check';\n\t\t}\n\n\t\treturn new Icon({ icon: `var(${icon})` });\n\t}\n\n\tprivate _toggleMark(rec: Record) {\n\n\t\tlet id = rec.getID();\n\t\tlet chk = false;\n\n\t\tif (this.m_marks.has(id)) {\n\t\t\tthis.m_marks.delete(id);\n\t\t}\n\t\telse {\n\t\t\tthis.m_marks.add(id);\n\t\t\tchk = true;\n\t\t}\n\n\t\tthis.emit( 'gridCheck', EvGridCheck(rec, chk));\n\t\tthis._buildItems( false );\n\t}\n\n\tpublic getMarks(): any[] {\n\t\tlet ids = [];\n\t\tfor (const v of this.m_marks.values()) {\n\t\t\tids.push(v);\n\t\t}\n\n\t\treturn ids;\n\t}\n\n\tpublic clearMarks() {\n\t\tif (this.m_marks.size) {\n\t\t\tthis.m_marks = new Set<any>();\n\t\t\tthis._buildItems( false );\n\t\t}\n\t}\n\n\tpublic setFooterData( rec: any ) {\n\t\tif( !this.m_footer ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.m_footer.enumChilds( (c) => {\n\t\t\tlet cid = c.getData( 'col' );\n\t\t\tif( cid ) {\n\t\t\t\tlet col = this.m_columns[cid];\n\n\t\t\t\tlet value = rec[col.id];\n\t\t\t\tif( value!==undefined ) {\n\t\t\t\t\tif( isFunction(value) ) {\t// FooterRenderer\n\t\t\t\t\t\tvalue( c );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tlet text;\n\t\t\t\t\t\tconst fmt = col.formatter;\n\t\t\t\t\t\tif (fmt && fmt instanceof Function) {\n\t\t\t\t\t\t\ttext = fmt(value, rec);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\ttext = value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tc.setContent( text, false );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n\n", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file link.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Component, CProps, CEventMap, isHtmlString, HtmlString, html } from './component'\nimport { EvClick, EventCallback } from './x4events'\n\n// ============================================================================\n// [LINK]\n// ============================================================================\n\ninterface LinkEventMap extends CEventMap {\n\tclick: EvClick;\n}\n\nexport interface LinkProps extends CProps<LinkEventMap> {\n\ttext?: string | HtmlString;\n\thref?: string;\n\ttarget?: string;\n\tclick?: EventCallback<EvClick>;\t// shortcut to event { click: ... }\n}\n\n\n/**\n * Standard Link\n */\n\nexport class Link extends Component<LinkProps, LinkEventMap>\n{\n\tconstructor(props?: LinkProps) {\n\t\tsuper(props);\n\n\t\tthis.setDomEvent('click', () => this._handleClick());\n\t\tthis.mapPropEvents(props, 'click');\n\t}\n\n\tprivate _handleClick() {\n\t\tthis.emit('click', EvClick());\n\t}\n\n\t/** @ignore */\n\trender(props: LinkProps) {\n\n\t\tlet text = props.text ?? '';\n\t\tlet href = props.href ?? '#';\n\n\t\tthis.setTag( 'a');\n\t\tthis.setAttribute('tabindex', 0);\n\t\tthis.setAttribute('href', href);\n\t\tthis.setAttribute('target', props.target);\n\n\t\tif( text ) {\n\t\t\tthis.setContent(isHtmlString(text) ? text : html`<span>${text}</span>`);\n\t\t}\n\t}\n\n\tset text( text: string | HtmlString ) {\n\t\tthis.m_props.text = text;\n\t\tthis.update( );\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file md5.ts\n* @author Etienne Cochard \n* @license\n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\n/*\nTypeScript Md5\n==============\nBased on work by\n* Joseph Myers: http://www.myersdaily.org/joseph/javascript/md5-text.html\n* Andr\u00E9 Cruz: https://github.com/satazor/SparkMD5\n* Raymond Hill: https://github.com/gorhill/yamd5.js\nEffectively a TypeScrypt re-write of Raymond Hill JS Library\nThe MIT License (MIT)\nCopyright (C) 2014 Raymond Hill\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n\nexport class Md5 {\n\n // One time hashing functions\n public static hashStr(str: string, raw?: false): string\n public static hashStr(str: string, raw?: true): Int32Array\n public static hashStr(str: string, raw: boolean = false) {\n return this.onePassHasher\n .start()\n .appendStr(str)\n .end(raw);\n }\n\n public static hashAsciiStr(str: string, raw?: false): string\n public static hashAsciiStr(str: string, raw?: true): Int32Array\n public static hashAsciiStr(str: string, raw: boolean = false) {\n return this.onePassHasher\n .start()\n .appendAsciiStr(str)\n .end(raw);\n }\n // Private Static Variables\n private static stateIdentity = new Int32Array([1732584193, -271733879, -1732584194, 271733878]);\n private static buffer32Identity = new Int32Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);\n private static hexChars = '0123456789abcdef';\n private static hexOut: string[] = [];\n\n // Permanent instance is to use for one-call hashing\n private static onePassHasher = new Md5();\n\n private static _hex(x: any): string {\n const hc = Md5.hexChars;\n const ho = Md5.hexOut;\n let n;\n let offset;\n let j;\n let i;\n\n for (i = 0; i < 4; i += 1) {\n offset = i * 8;\n n = x[i];\n for (j = 0; j < 8; j += 2) {\n ho[offset + 1 + j] = hc.charAt(n & 0x0F);\n n >>>= 4;\n ho[offset + 0 + j] = hc.charAt(n & 0x0F);\n n >>>= 4;\n }\n }\n return ho.join('');\n }\n\n private static _md5cycle(x: Int32Array|Uint32Array, k: Int32Array|Uint32Array) {\n let a = x[0];\n let b = x[1];\n let c = x[2];\n let d = x[3];\n // ff()\n a += (b & c | ~b & d) + k[0] - 680876936 | 0;\n a = (a << 7 | a >>> 25) + b | 0;\n d += (a & b | ~a & c) + k[1] - 389564586 | 0;\n d = (d << 12 | d >>> 20) + a | 0;\n c += (d & a | ~d & b) + k[2] + 606105819 | 0;\n c = (c << 17 | c >>> 15) + d | 0;\n b += (c & d | ~c & a) + k[3] - 1044525330 | 0;\n b = (b << 22 | b >>> 10) + c | 0;\n a += (b & c | ~b & d) + k[4] - 176418897 | 0;\n a = (a << 7 | a >>> 25) + b | 0;\n d += (a & b | ~a & c) + k[5] + 1200080426 | 0;\n d = (d << 12 | d >>> 20) + a | 0;\n c += (d & a | ~d & b) + k[6] - 1473231341 | 0;\n c = (c << 17 | c >>> 15) + d | 0;\n b += (c & d | ~c & a) + k[7] - 45705983 | 0;\n b = (b << 22 | b >>> 10) + c | 0;\n a += (b & c | ~b & d) + k[8] + 1770035416 | 0;\n a = (a << 7 | a >>> 25) + b | 0;\n d += (a & b | ~a & c) + k[9] - 1958414417 | 0;\n d = (d << 12 | d >>> 20) + a | 0;\n c += (d & a | ~d & b) + k[10] - 42063 | 0;\n c = (c << 17 | c >>> 15) + d | 0;\n b += (c & d | ~c & a) + k[11] - 1990404162 | 0;\n b = (b << 22 | b >>> 10) + c | 0;\n a += (b & c | ~b & d) + k[12] + 1804603682 | 0;\n a = (a << 7 | a >>> 25) + b | 0;\n d += (a & b | ~a & c) + k[13] - 40341101 | 0;\n d = (d << 12 | d >>> 20) + a | 0;\n c += (d & a | ~d & b) + k[14] - 1502002290 | 0;\n c = (c << 17 | c >>> 15) + d | 0;\n b += (c & d | ~c & a) + k[15] + 1236535329 | 0;\n b = (b << 22 | b >>> 10) + c | 0;\n // gg()\n a += (b & d | c & ~d) + k[1] - 165796510 | 0;\n a = (a << 5 | a >>> 27) + b | 0;\n d += (a & c | b & ~c) + k[6] - 1069501632 | 0;\n d = (d << 9 | d >>> 23) + a | 0;\n c += (d & b | a & ~b) + k[11] + 643717713 | 0;\n c = (c << 14 | c >>> 18) + d | 0;\n b += (c & a | d & ~a) + k[0] - 373897302 | 0;\n b = (b << 20 | b >>> 12) + c | 0;\n a += (b & d | c & ~d) + k[5] - 701558691 | 0;\n a = (a << 5 | a >>> 27) + b | 0;\n d += (a & c | b & ~c) + k[10] + 38016083 | 0;\n d = (d << 9 | d >>> 23) + a | 0;\n c += (d & b | a & ~b) + k[15] - 660478335 | 0;\n c = (c << 14 | c >>> 18) + d | 0;\n b += (c & a | d & ~a) + k[4] - 405537848 | 0;\n b = (b << 20 | b >>> 12) + c | 0;\n a += (b & d | c & ~d) + k[9] + 568446438 | 0;\n a = (a << 5 | a >>> 27) + b | 0;\n d += (a & c | b & ~c) + k[14] - 1019803690 | 0;\n d = (d << 9 | d >>> 23) + a | 0;\n c += (d & b | a & ~b) + k[3] - 187363961 | 0;\n c = (c << 14 | c >>> 18) + d | 0;\n b += (c & a | d & ~a) + k[8] + 1163531501 | 0;\n b = (b << 20 | b >>> 12) + c | 0;\n a += (b & d | c & ~d) + k[13] - 1444681467 | 0;\n a = (a << 5 | a >>> 27) + b | 0;\n d += (a & c | b & ~c) + k[2] - 51403784 | 0;\n d = (d << 9 | d >>> 23) + a | 0;\n c += (d & b | a & ~b) + k[7] + 1735328473 | 0;\n c = (c << 14 | c >>> 18) + d | 0;\n b += (c & a | d & ~a) + k[12] - 1926607734 | 0;\n b = (b << 20 | b >>> 12) + c | 0;\n // hh()\n a += (b ^ c ^ d) + k[5] - 378558 | 0;\n a = (a << 4 | a >>> 28) + b | 0;\n d += (a ^ b ^ c) + k[8] - 2022574463 | 0;\n d = (d << 11 | d >>> 21) + a | 0;\n c += (d ^ a ^ b) + k[11] + 1839030562 | 0;\n c = (c << 16 | c >>> 16) + d | 0;\n b += (c ^ d ^ a) + k[14] - 35309556 | 0;\n b = (b << 23 | b >>> 9) + c | 0;\n a += (b ^ c ^ d) + k[1] - 1530992060 | 0;\n a = (a << 4 | a >>> 28) + b | 0;\n d += (a ^ b ^ c) + k[4] + 1272893353 | 0;\n d = (d << 11 | d >>> 21) + a | 0;\n c += (d ^ a ^ b) + k[7] - 155497632 | 0;\n c = (c << 16 | c >>> 16) + d | 0;\n b += (c ^ d ^ a) + k[10] - 1094730640 | 0;\n b = (b << 23 | b >>> 9) + c | 0;\n a += (b ^ c ^ d) + k[13] + 681279174 | 0;\n a = (a << 4 | a >>> 28) + b | 0;\n d += (a ^ b ^ c) + k[0] - 358537222 | 0;\n d = (d << 11 | d >>> 21) + a | 0;\n c += (d ^ a ^ b) + k[3] - 722521979 | 0;\n c = (c << 16 | c >>> 16) + d | 0;\n b += (c ^ d ^ a) + k[6] + 76029189 | 0;\n b = (b << 23 | b >>> 9) + c | 0;\n a += (b ^ c ^ d) + k[9] - 640364487 | 0;\n a = (a << 4 | a >>> 28) + b | 0;\n d += (a ^ b ^ c) + k[12] - 421815835 | 0;\n d = (d << 11 | d >>> 21) + a | 0;\n c += (d ^ a ^ b) + k[15] + 530742520 | 0;\n c = (c << 16 | c >>> 16) + d | 0;\n b += (c ^ d ^ a) + k[2] - 995338651 | 0;\n b = (b << 23 | b >>> 9) + c | 0;\n // ii()\n a += (c ^ (b | ~d)) + k[0] - 198630844 | 0;\n a = (a << 6 | a >>> 26) + b | 0;\n d += (b ^ (a | ~c)) + k[7] + 1126891415 | 0;\n d = (d << 10 | d >>> 22) + a | 0;\n c += (a ^ (d | ~b)) + k[14] - 1416354905 | 0;\n c = (c << 15 | c >>> 17) + d | 0;\n b += (d ^ (c | ~a)) + k[5] - 57434055 | 0;\n b = (b << 21 | b >>> 11) + c | 0;\n a += (c ^ (b | ~d)) + k[12] + 1700485571 | 0;\n a = (a << 6 | a >>> 26) + b | 0;\n d += (b ^ (a | ~c)) + k[3] - 1894986606 | 0;\n d = (d << 10 | d >>> 22) + a | 0;\n c += (a ^ (d | ~b)) + k[10] - 1051523 | 0;\n c = (c << 15 | c >>> 17) + d | 0;\n b += (d ^ (c | ~a)) + k[1] - 2054922799 | 0;\n b = (b << 21 | b >>> 11) + c | 0;\n a += (c ^ (b | ~d)) + k[8] + 1873313359 | 0;\n a = (a << 6 | a >>> 26) + b | 0;\n d += (b ^ (a | ~c)) + k[15] - 30611744 | 0;\n d = (d << 10 | d >>> 22) + a | 0;\n c += (a ^ (d | ~b)) + k[6] - 1560198380 | 0;\n c = (c << 15 | c >>> 17) + d | 0;\n b += (d ^ (c | ~a)) + k[13] + 1309151649 | 0;\n b = (b << 21 | b >>> 11) + c | 0;\n a += (c ^ (b | ~d)) + k[4] - 145523070 | 0;\n a = (a << 6 | a >>> 26) + b | 0;\n d += (b ^ (a | ~c)) + k[11] - 1120210379 | 0;\n d = (d << 10 | d >>> 22) + a | 0;\n c += (a ^ (d | ~b)) + k[2] + 718787259 | 0;\n c = (c << 15 | c >>> 17) + d | 0;\n b += (d ^ (c | ~a)) + k[9] - 343485551 | 0;\n b = (b << 21 | b >>> 11) + c | 0;\n\n x[0] = a + x[0] | 0;\n x[1] = b + x[1] | 0;\n x[2] = c + x[2] | 0;\n x[3] = d + x[3] | 0;\n }\n\n private _dataLength: number;\n private _bufferLength: number;\n\n private _state: Int32Array = new Int32Array(4);\n private _buffer: ArrayBuffer = new ArrayBuffer(68);\n private _buffer8: Uint8Array;\n private _buffer32: Uint32Array;\n\n constructor() {\n this._buffer8 = new Uint8Array(this._buffer, 0, 68);\n this._buffer32 = new Uint32Array(this._buffer, 0, 17);\n this.start();\n }\n\n public start() {\n this._dataLength = 0;\n this._bufferLength = 0;\n this._state.set(Md5.stateIdentity);\n return this;\n }\n\n // Char to code point to to array conversion:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt\n // #Example.3A_Fixing_charCodeAt_to_handle_non-Basic-Multilingual-Plane_characters_if_their_presence_earlier_in_the_string_is_unknown\n public appendStr(str: string) {\n const buf8 = this._buffer8;\n const buf32 = this._buffer32;\n let bufLen = this._bufferLength;\n let code;\n let i;\n\n for (i = 0; i < str.length; i += 1) {\n code = str.charCodeAt(i);\n if (code < 128) {\n buf8[bufLen++] = code;\n } else if (code < 0x800) {\n buf8[bufLen++] = (code >>> 6) + 0xC0;\n buf8[bufLen++] = code & 0x3F | 0x80;\n } else if (code < 0xD800 || code > 0xDBFF) {\n buf8[bufLen++] = (code >>> 12) + 0xE0;\n buf8[bufLen++] = (code >>> 6 & 0x3F) | 0x80;\n buf8[bufLen++] = (code & 0x3F) | 0x80;\n } else {\n code = ((code - 0xD800) * 0x400) + (str.charCodeAt(++i) - 0xDC00) + 0x10000;\n if (code > 0x10FFFF) {\n throw new Error('Unicode standard supports code points up to U+10FFFF');\n }\n buf8[bufLen++] = (code >>> 18) + 0xF0;\n buf8[bufLen++] = (code >>> 12 & 0x3F) | 0x80;\n buf8[bufLen++] = (code >>> 6 & 0x3F) | 0x80;\n buf8[bufLen++] = (code & 0x3F) | 0x80;\n }\n if (bufLen >= 64) {\n this._dataLength += 64;\n Md5._md5cycle(this._state, buf32);\n bufLen -= 64;\n buf32[0] = buf32[16];\n }\n }\n this._bufferLength = bufLen;\n return this;\n }\n\n public appendAsciiStr(str: string) {\n const buf8 = this._buffer8;\n const buf32 = this._buffer32;\n let bufLen = this._bufferLength;\n let i;\n let j = 0;\n\n for (; ;) {\n i = Math.min(str.length - j, 64 - bufLen);\n while (i--) {\n buf8[bufLen++] = str.charCodeAt(j++);\n }\n if (bufLen < 64) {\n break;\n }\n this._dataLength += 64;\n Md5._md5cycle(this._state, buf32);\n bufLen = 0;\n }\n this._bufferLength = bufLen;\n return this;\n }\n\n public appendByteArray(input: Uint8Array) {\n const buf8 = this._buffer8;\n const buf32 = this._buffer32;\n let bufLen = this._bufferLength;\n let i;\n let j = 0;\n\n for (; ;) {\n i = Math.min(input.length - j, 64 - bufLen);\n while (i--) {\n buf8[bufLen++] = input[j++];\n }\n if (bufLen < 64) {\n break;\n }\n this._dataLength += 64;\n Md5._md5cycle(this._state, buf32);\n bufLen = 0;\n }\n this._bufferLength = bufLen;\n return this;\n }\n\n public getState() {\n const self = this;\n const s = self._state;\n\n return {\n\t\t\t//@ts-ignore\n buffer: String.fromCharCode.apply(null, self._buffer8),\n buflen: self._bufferLength,\n length: self._dataLength,\n state: [s[0], s[1], s[2], s[3]]\n };\n }\n\n public setState(state: any) {\n const buf = state.buffer;\n const x = state.state;\n const s = this._state;\n let i;\n\n this._dataLength = state.length;\n this._bufferLength = state.buflen;\n s[0] = x[0];\n s[1] = x[1];\n s[2] = x[2];\n s[3] = x[3];\n\n for (i = 0; i < buf.length; i += 1) {\n this._buffer8[i] = buf.charCodeAt(i);\n }\n }\n\n public end(raw: boolean = false) {\n const bufLen = this._bufferLength;\n const buf8 = this._buffer8;\n const buf32 = this._buffer32;\n const i = (bufLen >> 2) + 1;\n let dataBitsLen;\n\n this._dataLength += bufLen;\n\n buf8[bufLen] = 0x80;\n buf8[bufLen + 1] = buf8[bufLen + 2] = buf8[bufLen + 3] = 0;\n buf32.set(Md5.buffer32Identity.subarray(i), i);\n\n if (bufLen > 55) {\n Md5._md5cycle(this._state, buf32);\n buf32.set(Md5.buffer32Identity);\n }\n\n // Do the final computation based on the tail and length\n // Beware that the final length may not fit in 32 bits so we take care of that\n dataBitsLen = this._dataLength * 8;\n if (dataBitsLen <= 0xFFFFFFFF) {\n buf32[14] = dataBitsLen;\n } else {\n const matches = dataBitsLen.toString(16).match(/(.*?)(.{0,8})$/);\n if (matches === null) {\n return;\n }\n\n const lo = parseInt(matches[2], 16);\n const hi = parseInt(matches[1], 16) || 0;\n\n buf32[14] = lo;\n buf32[15] = hi;\n }\n\n Md5._md5cycle(this._state, buf32);\n\n return raw ? this._state : Md5._hex(this._state);\n }\n}\n\n/*\nif (Md5.hashStr('hello') !== '5d41402abc4b2a76b9719d911017c592') {\n console.error('Md5 self test failed.');\n}\n*/", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file messagebox.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Dialog, DialogProps, EvBtnClick } from './dialog'\nimport { FormButtons } from './form'\nimport { asap, HtmlString, isHtmlString, isString } from './tools'\nimport { HLayout } from './layout'\nimport { Icon, IconID } from './icon'\nimport { Label } from './label'\nimport { TextEdit } from './textedit'\n\n/**\n * [ MESSAGEBOX ] -----------------------------------------------------------------\n */\n\nexport interface MessageBoxProps extends DialogProps {\n\tmessage: string | HtmlString;\t// always allow html\n\tclick: (button: string) => void;\n}\n\nexport class MessageBox extends Dialog<MessageBoxProps>\n{\n\tm_label: Label;\n\n\tconstructor(props: MessageBoxProps) {\n\n\t\t// remove overloaded elements from DialogBoxProps\n\t\tlet icon = props.icon ?? 'var( --x4-icon-exclamation )';\t// todo: resolve that\n\t\tprops.icon = undefined;\n\n\t\tlet buttons: FormButtons = props.buttons === undefined ? ['ok'] : props.buttons;\n\t\tprops.buttons = undefined;\n\n\t\tsuper(props);\n\n\t\tlet msg = props.message;\n\n\t\tthis.form.updateContent(new HLayout({\n\t\t\tstyle: { padding: 8 },\n\t\t\tcontent: [\n\t\t\t\ticon ? new Icon({ cls: 'icon', icon }) : null,\n\t\t\t\tthis.m_label = new Label({ cls: 'text', text: msg, multiline: true })\n\t\t\t]\n\t\t}), buttons);\n\n\t\tthis.on('btnClick', (ev: EvBtnClick) => {\n\t\t\t// no prevent default -> always close the messagebox\n\t\t\tif (!this.m_props.click) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tasap(() => {\n\t\t\t\tthis.m_props.click( ev.button );\n\t\t\t});\n\t\t});\n\t}\n\n\tset text(txt: string | HtmlString) {\n\t\tthis.m_label.text = txt;\n\t}\n\n\n\t/**\n\t * display a messagebox\n\t */\n\n\tstatic show(props: string | HtmlString | MessageBoxProps): MessageBox {\n\n\t\tlet msg;\n\n\t\tif (isString(props) || isHtmlString(props)) {\n\t\t\tmsg = new MessageBox({ message: props, click: () => { } });\n\t\t}\n\t\telse {\n\t\t\tmsg = new MessageBox(props);\n\t\t}\n\n\t\tmsg.show();\n\t\treturn msg;\n\t}\n\n\tstatic async showAsync( props: string | HtmlString | MessageBoxProps): Promise<string> {\n\t\treturn new Promise( (resolve, reject ) => {\n\t\t\t\n\t\t\tlet _props: MessageBoxProps;\n\n\t\t\tconst cb = ( btn: string ) => {\n\t\t\t\tresolve( btn );\n\t\t\t}\n\n\t\t\tif (isString(props) || isHtmlString(props)) {\n\t\t\t\t_props = { message: props, click: cb };\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_props = { ...props, click: cb };\n\t\t\t}\n\n\t\t\tconst msg = new MessageBox(_props);\n\t\t\tmsg.show();\n\t\t});\n\t}\n\n\t/**\n\t * display an alert message\n\t */\n\n\tstatic alert(text: string | HtmlString, title: string = null) {\n\t\tnew MessageBox({\n\t\t\tcls: 'warning',\n\t\t\ttitle,\n\t\t\tmessage: text,\n\t\t\tbuttons: ['ok'],\n\t\t\tclick: () => { },\n\t\t}).show();\n\t}\n}\n\n\n// :: PrompDialogBox ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\nexport interface PromptBoxProps extends DialogProps {\n\tmessage: string | HtmlString;\n\tvalue?: string;\t\t// default input value\n\ticon?: IconID;\n\n\tclick: (value: string) => void;\n}\n\nexport class PromptDialogBox extends Dialog<PromptBoxProps> {\n\n\tm_edit: TextEdit;\n\n\tconstructor(props: PromptBoxProps) {\n\n\t\t// remove overloaded elements from DialogBoxProps\n\t\t//let icon = props.icon;\t// ?? 'cls(far fa-comment-check)';\t// todo: resolve that\n\t\t//props.icon = undefined;\n\t\tprops.buttons = undefined;\n\n\t\tprops.width = props.width ?? 500;\n\t\tsuper(props);\n\n\t\tthis.form.updateContent(\n\t\t\tnew HLayout({\n\t\t\t\tcls: 'panel',\n\t\t\t\tcontent: [\n\t\t\t\t\t//icon ? new Icon({\n\t\t\t\t\t//\tcls: 'icon',\n\t\t\t\t\t//\ticon: icon\n\t\t\t\t\t//}) : null,\n\t\t\t\t\tthis.m_edit = new TextEdit({\n\t\t\t\t\t\tflex: 1,\n\t\t\t\t\t\tautoFocus: true,\n\t\t\t\t\t\tlabel: props.message,\n\t\t\t\t\t\tvalue: props.value\n\t\t\t\t\t}),\n\t\t\t\t]\n\t\t\t}),\n\t\t\t['ok', 'cancel']\n\t\t);\n\n\t\tif (props.click) {\n\t\t\tthis.on('btnClick', (ev: EvBtnClick) => {\n\n\t\t\t\tif (ev.button === 'ok') {\n\t\t\t\t\t// no prevent default -> always close the messagebox\n\t\t\t\t\t// asap to allow\n\t\t\t\t\tasap(() => {\n\t\t\t\t\t\tthis.m_props.click(this.m_edit.value);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tset text(txt: string | HtmlString) {\n\t\tthis.m_edit.label = txt;\n\t}\n\n\t/**\n\t * display a messagebox\n\t */\n\n\tstatic show(props: string | HtmlString | PromptBoxProps, inputCallback?: (input: string) => void): PromptBoxProps {\n\n\t\tlet msg;\n\n\t\tif (isString(props) || isHtmlString(props)) {\n\t\t\tmsg = new PromptDialogBox({ message: props, click: inputCallback });\n\t\t}\n\t\telse {\n\t\t\tmsg = new PromptDialogBox(props);\n\t\t}\n\n\t\tmsg.show();\n\t\treturn msg;\n\t}\n}\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file panel.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Component, CProps, ComponentContent, ContainerProps, ContainerEventMap } from './component'\nimport { VLayout, HLayout } from './layout'\nimport { Label } from './label'\nimport { Icon, IconID } from './icon';\n\n// ============================================================================\n// [PANEL]\n// ============================================================================\n\nexport interface PanelProps<E extends ContainerEventMap = ContainerEventMap> extends ContainerProps<E> {\n\ticon?: IconID;\n\ttitle: string;\n\tgadgets?: Component[];\n\tsens?: 'horizontal' | 'vertical';\t// vertical by default\n\tbodyStyle?: any;\n}\n\nexport class Panel<T extends PanelProps = PanelProps, E extends ContainerEventMap = ContainerEventMap> extends VLayout<T,E> {\n\tprivate m_ui_title: Label;\n\tprivate m_ui_body: Component;\n\t\n\tconstructor( props: T ) {\n\t\tsuper( props );\n\n\t\tconst sens = props?.sens=='horizontal' ? '@hlayout' : '@vlayout';\n\n\t\t//todo: cannot be called twice do to content overload\n\t\tthis.m_ui_title = new Label({cls: 'title', text: this.m_props.title});\n\t\tthis.m_ui_body = new Component( { cls: 'body '+sens, content: this.m_props.content, style: props.bodyStyle } );\n\t}\n\n\t/** @ignore */\t\n\trender( ) {\n\t\tconst gadgets = this.m_props.gadgets ?? [];\n\t\tconst icon = this.m_props.icon ? new Icon( { icon: this.m_props.icon}) : null;\n\n\t\tsuper.setContent( [ \n\t\t\tnew HLayout( {\n\t\t\t\tcls: 'title',\n\t\t\t\tcontent: [\n\t\t\t\t\ticon,\n\t\t\t\t\tthis.m_ui_title, \n\t\t\t\t\t...gadgets\n\t\t\t\t]\n\t\t\t}),\n\t\t\tthis.m_ui_body\n\t\t] );\n\t}\n\n\tsetContent( els: ComponentContent ) {\n\t\tthis.m_ui_body.setContent( els );\n\t}\n\n\tset title( text: string ) {\n\t\tthis.m_ui_title.text = text;\n\t}\n}\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file spreadsheet.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\n\nimport { Component, SizerOverlay, EvDblClick, EvSize, ContainerEventMap, ContainerProps } from './component'\nimport { Input, InputProps } from './input';\nimport { HLayout, VLayout } from './layout';\nimport { TextEditProps, TextEdit } from './textedit';\nimport { FormatFunc } from './formatters'\nimport { asap, parseIntlFloat } from './tools';\nimport { deferCall } from './tools';\nimport { EvContextMenu, EvChange, EvSelectionChange, EventCallback } from './x4events'\nimport { ComboBox } from './combobox';\n\n\nexport interface EditorFactory {\n\t(props: InputProps, row: number, col: number) : Component;\n}\n\n\n\n/**\n * \n */\nexport interface ColProp {\n\ttitle: string;\n\twidth: number;\n\tformatter?: string;\n\talign?: string;\n\tcls?: string;\n\tmin_width?: number;\n\trenderer?: FormatFunc;\n\tcreateEditor?: EditorFactory;\t\t// null => disable edition\n}\n\nclass CellData {\n\ttext: string;\n\tcls?: string;\n\n\tstatic empty_cell: CellData = {\n\t\ttext: ''\n\t}\n}\n\n/**\n * \n */\n\nexport interface SpreadsheetEventSet extends ContainerEventMap {\n\tchange?: EvChange;\n\tdblClick?: EvDblClick;\n\tselectionChange?: EvSelectionChange;\n\tcontextMenu?: EvContextMenu;\n}\n\n\n/**\n * \n */\n\nexport interface SpreadsheetProps extends ContainerProps {\n\tcolumns: ColProp[];\n\tmaxrows?: number;\n\tautoedit?: boolean;\n\n\tchange?: EventCallback<EvChange>;\t// shortcut to event { change: ... }\n\tdblClick?: EventCallback<EvDblClick>;// shortcut to event { dblclick: ... }\n\tselectionChange?: EventCallback<EvSelectionChange>;// shortcut to event { selectionChange: ... }\n\tcontextMenu?: EventCallback<EvContextMenu>;// shortcut to event { contextMenu: ... }\n}\n\n\n/**\n * \n */\n\nexport class Spreadsheet extends VLayout<SpreadsheetProps, SpreadsheetEventSet> {\n\n\tprivate m_columns: ColProp[];\n\tprivate m_row_limit: number;\n\tprivate m_cells_data: Map<number, CellData>;\n\tprivate m_rows_data: Map<number, string>;\n\n\tprotected m_view: Component;\n\tprotected m_container: Component;\n\tprotected m_header: Component;\n\n\tprivate m_itemHeight: number;\n\tprivate m_topIndex: number;\n\n\tprivate m_visible_cells: Map<number, Component>;\n\tprivate m_row_count: number;\t// visible row count\n\n\tprivate m_selection: { row: number, col: number };\n\tprivate m_editor: Component;\n\tprivate m_autoedit: boolean;\n\tprivate m_lockupdate: number;\n\tprivate m_auto_row_count: boolean;\n\n\tprivate m_recycler: Component[];\n\tprivate m_used_cells: Component[];\n\n\tconstructor(props: SpreadsheetProps) {\n\t\tsuper(props);\n\n\t\tthis.m_columns = props.columns;\n\t\tthis.m_autoedit = props.autoedit;\n\t\tthis.m_lockupdate = 0;\n\n\t\tthis.m_cells_data = new Map<number, CellData>();\n\t\tthis.m_rows_data = new Map<number, string>();\n\t\tthis.m_itemHeight = 0;\n\t\tthis.m_selection = { row: 0, col: 0 };\n\t\tthis.m_row_count = 0;\n\t\tthis.m_auto_row_count = false;\n\t\tthis.m_recycler = [];\n\t\tthis.m_used_cells = [];\n\n\t\tif (props.maxrows === undefined) {\n\t\t\tthis.m_row_limit = 0;\n\t\t\tthis.m_auto_row_count = true;\n\t\t}\n\t\telse if (props.maxrows < 0) {\n\t\t\tthis.m_row_limit = 0;\n\t\t\tthis.m_auto_row_count = true;\n\t\t}\n\t\telse {\n\t\t\tthis.m_row_limit = props.maxrows;\n\t\t}\n\n\t\tthis.setAttribute('tabindex', 0);\n\n\t\tthis.setDomEvent('click', (e) => this._itemClick(e) );\n\t\tthis.setDomEvent('dblclick', (e) => this._itemDblClick(e) );\n\t\tthis.setDomEvent('keydown', (e) => this._handleKey(e) );\n\t\tthis.setDomEvent('keypress', (e) => this._keyPress(e) );\n\t\tthis.setDomEvent('focus', () => this._focus(true));\n\t\tthis.setDomEvent('focusout', () => this._focus(false));\n\t\tthis.setDomEvent('contextmenu', (e) => this._ctxMenu(e));\n\t\t\n\t\tthis.mapPropEvents( props, 'dblClick', 'selectionChange', 'contextMenu', 'change' );\n\t}\n\n\tcomponentCreated() {\n\t\tsuper.componentCreated( );\n\t\tthis._updateScroll(true);\n\t}\n\n\tsetColWidth(col: number, width: number) {\n\t\tthis._on_col_resize(col, width);\n\t\tthis.update(10);\n\t}\n\n\tgetColWidth(col: number): number {\n\t\tif (!this.m_columns[col]) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this.m_columns[col].width;\n\t}\n\n\tsetColTitle(col: number, title: string) {\n\t\tconsole.assert(this.m_columns[col] !== undefined); // what ?\n\t\tthis.m_columns[col].title = title;\n\t\tthis.update(10);\n\t}\n\n\t/**\n\t * reset the spreadsheet\n\t * @param columns \n\t */\n\treset(columns?: ColProp[]) {\n\t\tif( columns ) {\n\t\t\tthis.m_columns = columns;\n\t\t}\n\t\t\n\t\tthis.m_cells_data = new Map<number, CellData>();\n\t\tthis.m_rows_data = new Map<number, string>();\n\t\tthis.update(10);\n\t}\n\n\t/**\n\t * insert a row\n\t * @param before row number before wich insert the new row \n\t */\n\n\tpublic insertRow(before: number) {\n\n\t\tlet new_cells_data = new Map<number, CellData>();\n\t\tthis.m_cells_data.forEach((celldata, key) => {\n\n\t\t\tlet { row, col } = _getid(key);\n\n\t\t\tif (row >= before) {\n\t\t\t\tnew_cells_data.set(_mkid(row + 1, col), celldata);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tnew_cells_data.set(key, celldata);\n\t\t\t}\n\t\t});\n\n\t\tlet new_rows_data = new Map<number, string>();\n\t\tthis.m_rows_data.forEach((rowdata, row) => {\n\n\t\t\tif (row >= before) {\n\t\t\t\tnew_rows_data.set(row + 1, rowdata);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tnew_rows_data.set(row, rowdata);\n\t\t\t}\n\t\t});\n\n\t\tthis.m_cells_data = new_cells_data;\n\t\tthis.m_rows_data = new_rows_data;\n\n\t\tthis._buildItems();\n\t}\n\n\t/**\n\t * remove a row\n\t * @param rowtodel row number to remove\n\t */\n\n\tpublic deleteRow(rowtodel: number) {\n\t\tlet new_cells_data = new Map<number, CellData>();\n\t\tlet new_rows_data = new Map<number, string>();\n\n\t\tthis.m_cells_data.forEach((celldata, key) => {\n\n\t\t\tlet { row, col } = _getid(key);\n\n\t\t\tif (row > rowtodel) {\n\t\t\t\tnew_cells_data.set(_mkid(row - 1, col), celldata);\n\t\t\t}\n\t\t\telse if (row < rowtodel) {\n\t\t\t\tnew_cells_data.set(key, celldata);\n\t\t\t}\n\t\t});\n\n\t\tthis.m_rows_data.forEach((rowdata, row) => {\n\n\t\t\tif (row > rowtodel) {\n\t\t\t\tnew_rows_data.set(row - 1, rowdata);\n\t\t\t}\n\t\t\telse if (row < rowtodel) {\n\t\t\t\tnew_rows_data.set(row, rowdata);\n\t\t\t}\n\t\t});\n\n\t\tthis.m_cells_data = new_cells_data;\n\t\tthis.m_rows_data = new_rows_data;\n\n\t\tthis._buildItems();\n\t}\n\n\t/**\n\t * insert a new column\n\t * @param before column index before to insert the new column or <0 to append\n\t */\n\n\tpublic insertCol(before: number, column: ColProp) {\n\n\t\tlet inspos = before;\n\t\tif (inspos < 0) {\n\t\t\tinspos = this.m_columns.length + 1;\n\t\t}\n\n\t\t// insert the col at the right place\n\t\tthis.m_columns.splice(inspos, 0, column);\n\n\t\tif (before >= 0) {\n\t\t\tlet new_cells_data = new Map<number, CellData>();\n\n\t\t\tthis.m_cells_data.forEach((celldata, key) => {\n\n\t\t\t\tlet { row, col } = _getid(key);\n\n\t\t\t\tif (col >= before) {\n\t\t\t\t\tnew_cells_data.set(_mkid(row, col + 1), celldata);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tnew_cells_data.set(key, celldata);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.m_cells_data = new_cells_data;\n\t\t}\n\n\t\tthis.update();\n\t}\n\n\t/**\n\t * remove a column\n\t * @param coltodel \n\t */\n\n\tpublic deleteCol(coltodel: number) {\n\n\t\t// insert the col at the right place\n\t\tthis.m_columns.splice(coltodel, 1);\n\n\t\tlet new_cells_data = new Map<number, CellData>();\n\t\tthis.m_cells_data.forEach((celldata, key) => {\n\n\t\t\tlet { row, col } = _getid(key);\n\n\t\t\tif (col > coltodel) {\n\t\t\t\tnew_cells_data.set(_mkid(row, col - 1), celldata);\n\t\t\t}\n\t\t\telse if (col < coltodel) {\n\t\t\t\tnew_cells_data.set(key, celldata);\n\t\t\t}\n\t\t});\n\n\t\tthis.m_cells_data = new_cells_data;\n\t\tthis.update();\n\t}\n\n\t/**\n\t * \n\t * @param row \n\t * @param col \n\t */\n\n\tprivate _getCellData(row: number, col: number, raw: boolean = false): CellData {\n\t\tlet value = this.m_cells_data.get(_mkid(row, col));\n\t\tif (value === undefined) {\n\t\t\treturn raw ? null : CellData.empty_cell;\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tprivate _focus(focus: boolean) {\n\t\tthis.setClass('@focus', focus);\n\t}\n\n\tprivate _ctxMenu(e) {\n\n\t\tlet dom = e.target,\n\t\t\tself = this.dom;\n\n\t\twhile (dom && dom != self) {\n\t\t\tlet itm = Component.getElement(dom),\n\t\t\t\trow = itm.getData('row-id'),\n\t\t\t\tcol = itm.getData('col-id');\n\n\t\t\tif (row !== undefined) {\n\t\t\t\tthis._selectItem(row, col);\n\t\t\t\tthis.emit( 'contextMenu', EvContextMenu(e, { row, col, item: itm }));\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdom = dom.parentElement;\n\t\t}\n\t}\n\n\t/** @ignore */\n\n\trender() {\n\n\t\tthis.m_recycler = [];\n\t\tthis.m_container = new Component({\n\t\t\tcls: 'content',\n\t\t});\n\n\t\tthis.m_view = new Component({\n\t\t\tcls: '@scroll-view',\n\t\t\tflex: 1,\n\t\t\tdom_events: {\n\t\t\t\tsizechange: ( ) => this._updateScroll(true),\n\t\t\t\tscroll: ( ) => this._updateScroll(false)\n\t\t\t},\n\t\t\tcontent: this.m_container\n\t\t});\n\n\t\tlet cols = this.m_columns.map((col, index) => {\n\n\t\t\tlet comp = new Component({\n\t\t\t\tcls: '@cell c'+index,\n\t\t\t\tcontent: col.title ? col.title : '&nbsp',\n\t\t\t\tflex: col.width < 0 ? -col.width : undefined,\n\t\t\t\tattrs: {\n\t\t\t\t\ttitle: col.title\n\t\t\t\t},\n\t\t\t\tstyle: {\n\t\t\t\t\twidth: col.width >= 0 ? col.width : undefined,\n\t\t\t\t\tminWidth: col.min_width\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tnew SizerOverlay({\n\t\t\t\ttarget: comp,\n\t\t\t\tsens: 'right',\n\t\t\t\tresize: (ev: EvSize) => {\n\t\t\t\t\tthis._on_col_resize(index, ev.size.width);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t(<any>col).$col = comp;\n\t\t\treturn comp;\n\t\t});\n\n\t\tthis.m_header = new HLayout({\n\t\t\tcls: '@header',\n\t\t\tcontent: <any>cols,\n\t\t});\n\n\t\tthis.setContent([\n\t\t\tthis.m_header,\n\t\t\tthis.m_view\n\t\t]);\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _on_col_resize(col, width) {\n\n\t\tif (!this.m_columns[col]) {\n\t\t\treturn;\n\t\t}\n\n\t\t// -> flex\n\t\tif (width <= 0) {\n\t\t\tthis.m_columns[col].width = -1;\t// flex default\n\t\t}\n\t\telse {\n\t\t\tthis.m_columns[col].width = width;\n\t\t}\n\n\t\tthis._updateScroll(true);\n\t}\n\n\t/**\n\t * compute misc dimensions\n\t * - item height\n\t * - scroll width\n\t */\n\n\tprivate _computeItemHeight() {\n\t\tlet g1 = x4document.createElement('div');\n\t\tg1.classList.add('x-spreadsheet');\n\n\t\tlet g2 = x4document.createElement('div');\n\t\tg2.classList.add('content');\n\n\t\tlet g3 = x4document.createElement('div');\n\t\tg3.classList.add('x-cell');\n\t\tg3.append( '&nbsp;' )\n\n\t\tg2.appendChild(g3);\n\t\tg1.appendChild(g2);\n\n\t\tthis.dom.appendChild(g1);\n\t\tlet rc = g3.getBoundingClientRect();\n\t\tthis.dom.removeChild(g1);\n\n\t\tthis.m_itemHeight = rc.height;\n\t}\n\n\t/**\n\t * compute columns widths \n\t * use col.width for fixed size columns\n\t * if col.width < 0 that mean that this is a proportion of the remaining space\n\t */\n\n\tprivate _calcColWidths(width: number) {\n\n\t\tlet fullw = 0;\n\t\tlet nwide = 0;\n\n\t\tlet calcw = new Int32Array(this.m_columns.length);\n\t\tlet calcz = new Int32Array(this.m_columns.length);\n\t\tlet calcm = new Int32Array(this.m_columns.length);\n\n\t\tthis.m_columns.forEach((col, colIdx) => {\n\n\t\t\tlet minw = Math.max(10, col.min_width ?? 0);\n\n\t\t\tif (col.width > 0) {\n\t\t\t\tlet cw = Math.max(col.width, minw);\n\t\t\t\tfullw += cw;\n\t\t\t\tcalcw[colIdx] = cw;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet z = -col.width;\n\t\t\t\tcalcz[colIdx] = z;\n\t\t\t\tnwide += z;\n\t\t\t}\n\n\t\t\tcalcm[colIdx] = minw;\n\t\t});\n\n\t\tif (nwide) {\n\t\t\tlet restw = width - fullw;\n\n\t\t\tfor (let i = 0; i < this.m_columns.length && nwide; i++) {\n\n\t\t\t\tif (!calcw[i]) {\n\t\t\t\t\tlet rest = Math.round(restw / nwide) * calcz[i];\n\t\t\t\t\tif (rest < calcm[i]) {\n\t\t\t\t\t\trest = calcm[i];\n\t\t\t\t\t}\n\n\t\t\t\t\tcalcw[i] = rest;\n\t\t\t\t\trestw -= rest;\n\t\t\t\t\tnwide -= calcz[i];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn calcw;\n\t}\n\n\t/**\n\t * create a cell (component)\n\t * and append it to the parent view\n\t * if a cell was reviously recyled, use it\n\t */\n\tprivate _createCell(): Component {\n\n\t\tlet cell;\n\t\tif (this.m_recycler.length) {\n\t\t\tcell = this.m_recycler.pop();\n\t\t\tcell.clearClasses();\n\t\t\tcell.addClass( '@comp' );\t// todo: find better to reset to default\n\t\t}\n\t\telse {\n\t\t\tcell = new Component({\n\t\t\t\tcls: '@cell'\n\t\t\t});\n\t\t}\n\n\t\tif (!cell.dom) {\n\t\t\tthis.m_container.appendChild(cell);\n\t\t}\n\n\t\treturn cell;\n\t}\n\n\t/**\n\t * build cells of the spreadsheet\n\t * cells are recycled when scrolling,\n\t * only visibles cells exists\n\t */\n\n\tprivate _buildItems() {\n\n\t\tlet rc = this.getBoundingRect();\n\t\tlet rh = this.m_header.getBoundingRect();\n\t\tlet height = rc.height - rh.height;\n\n\t\tif (this.m_itemHeight == 0) {\n\t\t\tthis._computeItemHeight();\n\t\t}\n\n\t\tlet top = this.m_topIndex * this.m_itemHeight;\n\t\tlet y = 0;\n\t\tlet cidx = 0;\n\t\tlet rowIdx = this.m_topIndex;\n\t\tlet count = this.m_row_limit;\n\n\t\tif (this.m_auto_row_count) {\n\t\t\t//@review should be evaluated only when row count change\n\t\t\tthis.m_row_limit = count = this.getMaxRowCount();\n\t\t}\n\n\t\tlet right_pos = 0;\n\t\tif ((count * this.m_itemHeight) > height) {\n\t\t\tlet w = Component.getScrollbarSize();\n\t\t\trc.width -= w;\n\t\t\tright_pos = w;\n\t\t}\n\n\t\tlet even = this.m_topIndex & 1 ? true : false;\n\t\tthis.m_visible_cells = new Map<number, Component>();\n\n\t\t// passe 0 - all created cells are moved to the recycler\n\t\tthis.m_used_cells.forEach((c) => {\n\t\t\tthis.m_recycler.push(c);\n\t\t});\n\n\t\tthis.m_used_cells = [];\n\n\t\t// pass 1 - compute column widths\n\t\tlet calcw = this._calcColWidths(rc.width);\n\n\t\t//\n\t\tlet full_width = 0;\n\t\tfor (let i = 0; i < calcw.length; i++) {\n\t\t\tfull_width += calcw[i];\n\t\t}\n\n\t\tif (full_width <= rc.width) {\n\n\t\t\tthis.m_view.setStyleValue('overflow-x', 'hidden');\n\t\t\tthis.m_header.setStyleValue('width', rc.width);\n\t\t\tthis.m_container.setStyleValue('width', rc.width);\n\n\t\t\tthis.m_container.setStyle({\n\t\t\t\theight: count * this.m_itemHeight,\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tthis.m_header.setStyleValue('width', full_width);\n\t\t\tthis.m_container.setStyleValue('width', full_width);\n\t\t\tthis.m_view.setStyleValue('overflow-x', 'visible');\n\n\t\t\tthis.m_container.setStyle({\n\t\t\t\theight: count * this.m_itemHeight,\n\t\t\t\twidth: full_width\n\t\t\t});\n\t\t}\n\n\t\tthis.m_view.addClass('@hidden');\n\n\t\t// pass 2 - build cells\n\t\tlet limit = 100;\n\t\twhile (y < height && rowIdx < count && --limit > 0) {\n\n\t\t\tlet rowdata = this.m_rows_data.get(rowIdx);\n\t\t\tlet x = 0;\n\n\t\t\tlet cols = this.m_columns.map((col, colIdx) => {\n\n\t\t\t\tlet cls = '@cell c'+colIdx ;\n\t\t\t\tif (col.align) {\n\t\t\t\t\tcls += ' ' + col.align;\n\t\t\t\t}\n\n\t\t\t\tif (col.cls) {\n\t\t\t\t\tcls += ' ' + col.cls;\n\t\t\t\t}\n\n\t\t\t\tlet cell: Component;\n\t\t\t\tlet celldata = this._getCellData(rowIdx, colIdx);\n\n\t\t\t\tlet text: string = celldata.text;\n\n\t\t\t\tif (col.renderer && text.length) {\n\t\t\t\t\ttext = col.renderer(text, { row: rowIdx, col: colIdx });\n\t\t\t\t}\n\n\t\t\t\t//if( text.length==0 ) {\n\t\t\t\t//\ttext = '&nbsp;'\n\t\t\t\t//}\n\n\t\t\t\tcls += (even ? ' even' : ' odd');\n\t\t\t\tif (rowdata) {\n\t\t\t\t\tcls += ' ' + rowdata;\n\t\t\t\t}\n\n\t\t\t\tcell = this._createCell();\n\t\t\t\tthis.m_used_cells.push(cell);\n\n\t\t\t\tcell.setContent(text);\t// always because cell reuse\n\n\t\t\t\tcell.addClass(cls);\n\t\t\t\tcell.setStyle({\n\t\t\t\t\tleft: x,\n\t\t\t\t\ttop: top + y,\n\t\t\t\t\twidth: calcw[colIdx],\n\t\t\t\t\theight: this.m_itemHeight\n\t\t\t\t});\n\n\t\t\t\tif (this.m_selection.row == rowIdx && this.m_selection.col == colIdx) {\n\t\t\t\t\tcell.addClass('@selected');\n\t\t\t\t}\n\n\t\t\t\tcell.setData('row-id', rowIdx);\n\t\t\t\tcell.setData('col-id', colIdx);\n\n\t\t\t\tif (celldata.cls) {\n\t\t\t\t\tcell.addClass(celldata.cls);\n\t\t\t\t}\n\n\t\t\t\tthis.m_visible_cells.set(_mkid(rowIdx, colIdx), cell);\n\n\t\t\t\tx += calcw[colIdx];\n\t\t\t\treturn cell;\n\t\t\t});\n\n\t\t\teven = !even;\n\n\t\t\ty += this.m_itemHeight;\n\n\t\t\trowIdx++;\n\t\t\tcidx++;\n\n\t\t\t//rows.splice( rows.length, 0, ...cols );\n\t\t}\n\n\t\t// if some cells are still in cache, hide them\n\t\tthis.m_recycler.forEach((c) => {\n\t\t\tc.addClass('@hidden');\n\t\t})\n\n\t\tthis.m_row_count = cidx;\n\t\t//this.m_container.setContent( <ComponentContent>rows);\n\n\t\tthis.m_view.removeClass('@hidden');\n\t\tthis.setClass('empty', count == 0);\n\t}\n\n\t/** @ignore */\n\tprivate _itemClick(e: MouseEvent) {\n\t\tlet dom = e.target as HTMLElement;\n\t\tif (this.m_editor && this.m_editor.dom.contains(dom)) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet itm = Component.getElement(dom, Component);\n\n\t\tif (!itm) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet rowIdx = itm.getData('row-id'),\n\t\t\tcolIdx = itm.getData('col-id');\n\n\t\tif (rowIdx === undefined || colIdx === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._selectItem(rowIdx, colIdx);\n\t}\n\n\tprivate _itemDblClick(e: MouseEvent) {\n\t\tlet dom = e.target as HTMLElement;\n\t\tif (this.m_editor && this.m_editor.dom.contains(dom)) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet itm = Component.getElement(dom),\n\t\t\trowIdx = itm.getData('row-id'),\n\t\t\tcolIdx = itm.getData('col-id');\n\n\t\tif (rowIdx === undefined || colIdx === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.emit( 'dblClick', EvDblClick({ row: rowIdx, col: colIdx }));\n\t\tthis.editCell(rowIdx, colIdx);\n\t}\n\n\t/**\n\t * \n\t * @param rowIdx \n\t * @param colIdx \n\t * @param scrollIntoView \n\t */\n\n\tprotected _selectItem(rowIdx: number, colIdx: number, scrollIntoView?: boolean) {\n\n\t\tif (rowIdx < 0) {\n\t\t\trowIdx = 0;\n\t\t}\n\n\t\tif (rowIdx > this.m_row_limit - 1) {\n\t\t\trowIdx = this.m_row_limit - 1;\n\t\t}\n\n\t\tif (colIdx < 0) {\n\t\t\tcolIdx = 0;\n\t\t}\n\n\t\tlet lastcol = this.m_columns.length - 1;\n\t\tif (colIdx > lastcol) {\n\t\t\tcolIdx = lastcol;\n\t\t}\n\n\t\tif (this.m_selection.row == rowIdx && this.m_selection.col == colIdx) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.select(rowIdx, colIdx, scrollIntoView);\n\t}\n\n\tprivate _scrollIntoView(row: number, col: number) {\n\n\t\tlet doscroll = (itm: Component, mode: string = 'nearest') => {\n\t\t\titm.scrollIntoView({\n\t\t\t\tblock: <ScrollLogicalPosition>mode\t//<ScrollLogicalPosition>sens ?? 'nearest'\n\t\t\t});\n\t\t}\n\n\t\tlet last = this.m_topIndex + this.m_row_count - 1;\n\n\t\tif (row < this.m_topIndex) {\n\t\t\tthis.m_topIndex = row;\n\t\t\tthis.m_view.dom.scrollTop = this.m_topIndex * this.m_itemHeight;\n\t\t\tthis._buildItems();\n\t\t\tdoscroll(this._findItem(row, col), 'start');\n\t\t}\n\t\telse if (row > last) {\n\t\t\tthis.m_topIndex = row - this.m_row_count + 1;\n\t\t\tthis.m_view.dom.scrollTop = this.m_topIndex * this.m_itemHeight;\n\t\t\tthis._buildItems();\n\t\t\tdoscroll(this._findItem(row, col), 'end');\n\t\t}\n\t\telse {\n\t\t\tdoscroll(this._findItem(row, col));\n\t\t}\n\t}\n\n\t/**\n\t * \n\t * @param row \n\t * @param col \n\t */\n\n\tprivate _findItem(row, col): Component {\n\t\tif (!this.m_visible_cells) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this.m_visible_cells.get(_mkid(row, col));\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _updateScroll(forceUpdate) {\n\t\tif (!this?.m_view?.dom) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet newTop = Math.floor(this.m_view.dom.scrollTop / (this.m_itemHeight || 1));\n\n\t\tif (newTop != this.m_topIndex || forceUpdate) {\n\t\t\tthis.m_topIndex = newTop;\n\t\t\tthis._buildItems();\n\t\t}\n\n\t\tlet newLeft = this.m_view.dom.scrollLeft;\n\t\tthis.m_header.setStyleValue('left', -newLeft);\n\t}\n\n\t/**\n\t * \n\t * @param event \n\t * @param t \n\t */\n\n\tprivate _moveSel(sensy: number, sensx: number) {\n\n\t\tlet sel = this.m_selection;\n\n\t\tlet newRow = sel.row ?? 0;\n\t\tlet newCol = sel.col ?? 0;\n\n\t\tif (sensy == 1) {\n\t\t\tnewRow++;\n\t\t}\n\t\telse if (sensy == -1) {\n\t\t\tnewRow--;\n\t\t}\n\t\telse if (sensy == 2) {\n\t\t\tnewRow += this.m_row_count - 1;\n\t\t}\n\t\telse if (sensy == -2) {\n\t\t\tnewRow -= this.m_row_count - 1;\n\t\t}\n\t\telse if (sensy == 3) {\n\t\t\tnewRow = this.m_row_limit - 1;\n\t\t}\n\t\telse if (sensy == -3) {\n\t\t\tnewRow = 0;\n\t\t}\n\n\t\tif (sensx == 1) {\n\t\t\tnewCol++;\n\t\t}\n\t\telse if (sensx == -1) {\n\t\t\tnewCol--;\n\t\t}\n\t\telse if (sensx == 2) {\n\t\t\tnewCol = this.m_columns.length - 1;\n\t\t}\n\t\telse if (sensx == -2) {\n\t\t\tnewCol = 0;\n\t\t}\n\t\telse if (sensx == 3) { // new editable cell skip line if needed\n\t\t\tnewCol++;\n\n\t\t\tlet lastcol = this.m_columns.length - 1;\n\n\t\t\tl1: for (let trys = 0; trys < 2; trys++) {\n\t\t\t\twhile (newCol < lastcol) {\n\t\t\t\t\tif (this.m_columns[newCol].createEditor !== null) {\n\t\t\t\t\t\tbreak l1;\n\t\t\t\t\t}\n\n\t\t\t\t\tnewCol++;\n\t\t\t\t}\n\n\t\t\t\tif (newCol > lastcol) {\n\t\t\t\t\tnewRow++;\n\t\t\t\t\tnewCol = 0;\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t}\n\t\telse if (sensx == -3) {\n\t\t\tnewCol--;\n\n\t\t\tlet lastcol = this.m_columns.length - 1;\n\n\t\t\tl2: for (let trys = 0; trys < 2; trys++) {\n\t\t\t\twhile (newCol >= 0) {\n\t\t\t\t\tif (this.m_columns[newCol].createEditor !== null) {\n\t\t\t\t\t\tbreak l2;\n\t\t\t\t\t}\n\n\t\t\t\t\tnewCol--;\n\t\t\t\t}\n\n\t\t\t\tif (newCol < 0) {\n\t\t\t\t\tnewRow--;\n\t\t\t\t\tnewCol = lastcol;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis._selectItem(newRow, newCol, true);\n\t}\n\n\tprivate _handleKey(event: KeyboardEvent) {\n\t\tlet dom = <Node>event.target;\n\t\tif (this.m_editor && this.m_editor.dom.contains(dom)) {\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowDown':\n\t\t\tcase 'Down': {\n\t\t\t\tthis._moveSel(1, 0);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'ArrowUp':\n\t\t\tcase 'Up': {\n\t\t\t\tthis._moveSel(-1, 0);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'PageUp': {\n\t\t\t\tthis._moveSel(-2, 0);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'PageDown': {\n\t\t\t\tthis._moveSel(2, 0);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'ArrowLeft':\n\t\t\tcase 'Left': {\n\t\t\t\tthis._moveSel(0, -1);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'ArrowRight':\n\t\t\tcase 'Right': {\n\t\t\t\tthis._moveSel(0, 1);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'Home': {\n\t\t\t\tif (event.ctrlKey) {\n\t\t\t\t\tthis._moveSel(-3, 0);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis._moveSel(0, -2);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'End': {\n\t\t\t\tif (event.ctrlKey) {\n\t\t\t\t\tthis._moveSel(3, 0);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis._moveSel(0, 2);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'Enter': {\n\t\t\t\tthis.editCurCell();\n\t\t\t\tevent.stopPropagation( );\n\t\t\t\tevent.preventDefault( );\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'Delete': {\n\t\t\t\tthis.clearCell(this.m_selection.row, this.m_selection.col);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\t//console.log( \"unknown key: \", event.key);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _keyPress(event: KeyboardEvent) {\n\t\tlet dom = <Node>event.target;\n\t\tif (this.m_editor && this.m_editor.dom.contains(dom)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.ctrlKey || event.altKey) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.editCurCell(event.key);\n\t}\n\n\t/**\n\t * return the selection\n\t * { row, col }\n\t */\n\n\tgetSelection() {\n\t\treturn this.m_selection;\n\t}\n\n\tselect(row: number, col: number, scrollIntoView: boolean = true) {\n\n\t\tif (this.m_selection.row == row && this.m_selection.col == col) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet oldSel = this._findItem(this.m_selection.row, this.m_selection.col);\n\t\tif (oldSel) {\n\t\t\toldSel.removeClass('@selected');\n\t\t}\n\n\t\tthis.m_selection = { row, col };\n\n\t\tif (scrollIntoView) {\n\t\t\tthis._scrollIntoView(row, col);\n\t\t}\n\n\t\tlet newSel = this._findItem(row, col);\n\t\tif (newSel) {\n\t\t\tnewSel.addClass('@selected');\n\t\t}\n\n\t\tthis.emit( 'selectionChange', EvSelectionChange({ row, col }));\n\t}\n\n\t/**\n\t * return the row count\n\t */\n\n\trowCount() {\n\t\treturn this.m_row_limit;\n\t}\n\n\t/**\n\t * return the maximum row index filled with something\n\t */\n\n\tgetMaxRowCount() {\n\n\t\tlet max_row = 0;\n\n\t\tthis.m_cells_data.forEach((c, uid) => {\n\t\t\tlet row = Math.round(uid / 1000) + 1;\n\t\t\tif (max_row < row) {\n\t\t\t\tmax_row = row;\n\t\t\t}\n\t\t});\n\n\t\treturn max_row;\n\t}\n\n\tgetColCount() {\n\t\treturn this.m_columns.length;\n\t}\n\n\tsetRowStyle(row: number, cls: string) {\n\t\tthis.m_rows_data.set(row, cls);\n\n\t\tif (this.m_lockupdate == 0) {\n\t\t\tthis._buildItems();\n\t\t}\n\t}\n\n\tgetRowStyle(row: number) {\n\t\treturn this.m_rows_data.get(row);\n\t}\n\n\tsetCellStyle(row: number, col: number, cls: string) {\n\t\tlet cell = this._getCellData(row, col, true);\n\t\tif (!cell) {\n\t\t\tcell = { text: '' };\n\t\t\tthis.m_cells_data.set(_mkid(row, col), cell);\n\t\t}\n\n\t\tcell.cls = cls;\n\n\t\tif (this.m_lockupdate == 0 && this.m_visible_cells) {\n\t\t\tlet itm = this._findItem(row, col);\n\t\t\tif (itm) {\n\t\t\t\titm.setClass(cls, true); //todo: pb when changing classes\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._buildItems();\n\t\t\t}\n\t\t}\n\t}\n\n\tgetCellText(row: number, col: number): string {\n\t\treturn this._getCellData(row, col).text;\n\t}\n\n\tgetCellNumber(row: number, col: number): number {\n\t\tlet text = this._getCellData(row, col).text;\n\t\treturn parseIntlFloat(text);\n\t}\n\n\tclearRow(row: number) {\n\t\tfor (let c = 0; c < this.m_columns.length; c++) {\n\t\t\tthis.clearCell(row, c);\n\t\t}\n\t\tthis.update(10);\n\t}\n\n\tclearCell(row: number, col: number) {\n\t\tthis.setCellText(row, col, null);\n\t}\n\n\teditCurCell(forceText?: string) {\n\t\tthis.editCell(this.m_selection.row, this.m_selection.col, forceText);\n\t}\n\n\teditCell(row: number, col: number, forcedText?: string) {\n\n\t\tif (!this.m_autoedit) {\n\t\t\treturn;\n\t\t}\n\n\t\t// disable edition\n\t\tif (this.m_columns[col].createEditor === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._scrollIntoView(row, col);\n\n\t\tlet item = this._findItem(row, col);\n\t\tlet place = item.dom;\n\t\tlet parent = place.parentElement;\n\n\t\tlet rc = place.getBoundingClientRect();\n\t\tlet prc = parent.getBoundingClientRect();\n\n\t\tlet cell = this._getCellData(row, col, true);\n\n\t\tlet edtBuilder = (props: TextEditProps, col, row): Component => {\n\t\t\treturn new TextEdit(props);\n\t\t}\n\n\t\tif (this.m_columns[col].createEditor) {\n\t\t\tedtBuilder = this.m_columns[col].createEditor;\n\t\t}\n\n\t\tlet cellvalue = forcedText ? forcedText : (cell ? cell.text : '');\n\n\t\tthis.m_editor = edtBuilder({\n\t\t\tcls: '@editor',\n\t\t\tstyle: {\n\t\t\t\tleft: rc.left - prc.left,\n\t\t\t\ttop: rc.top - prc.top,\n\t\t\t\twidth: rc.width - 1,\n\t\t\t\theight: rc.height - 1\n\t\t\t},\n\t\t\ttabIndex: false,\n\t\t\tvalue: cellvalue,\n\t\t\tdata: {\n\t\t\t\trow,\n\t\t\t\tcol\n\t\t\t},\n\t\t}, row, col);\n\n\t\tif( !this.m_editor ) {\n\t\t\treturn;\n\t\t}\n\n\t\tparent.appendChild(this.m_editor._build());\n\n\t\tthis._setupEditor( );\n\t\t\n\t\tthis.m_editor.setData('old-value', cellvalue);\n\t\tthis.m_editor.focus();\n\n\t\tif (this.m_editor instanceof TextEdit) {\n\t\t\tthis.m_editor.selectAll();\n\t\t}\n\t}\n\n\t_setupEditor( ) {\n\t\t\n\t\tlet movesel = (sensy, sensx) => {\n\t\t\tdeferCall(() => {\n\t\t\t\tthis.killEditor(true);\n\t\t\t\tthis._moveSel(sensy, sensx);\n\t\t\t\tthis.editCurCell();\n\t\t\t});\n\t\t}\n\n\t\t// todo: better\n\t\tif( this.m_editor instanceof TextEdit ) {\n\t\t\tlet editor = this.m_editor as TextEdit;\n\t\t\tlet input: Input = editor.input;\n\n\t\t\tinput.setDomEvent( 'blur', () => {\n\t\t\t\tthis.killEditor(true);\n\t\t\t} );\n\n\t\t\tinput.setDomEvent( 'keydown', (e: KeyboardEvent) => {\n\t\t\t\t// prevented by edit...\n\t\t\t\tif( e.defaultPrevented ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tswitch (e.key) {\n\t\t\t\t\tcase 'Escape': {\n\t\t\t\t\t\tthis.killEditor(false);\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\te.preventDefault( );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 'Enter':\n\t\t\t\t\tcase 'Tab': {\n\t\t\t\t\t\tlet sens = 3;\n\t\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\t\tsens = -3;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmovesel(0, sens);\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\te.preventDefault( );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 'ArrowUp':\n\t\t\t\t\tcase 'Up': {\n\t\t\t\t\t\tmovesel(-1, 0);\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\te.preventDefault( );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 'ArrowDown':\n\t\t\t\t\tcase 'Down': {\n\t\t\t\t\t\tmovesel(1, 0);\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\te.preventDefault( );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\telse if( this.m_editor instanceof ComboBox ) {\n\t\t\t\n\t\t\tlet input: Input = (this.m_editor as ComboBox).input;\n\t\t\tinput.setDomEvent( 'blur', () => {\n\t\t\t\tthis.killEditor(true);\n\t\t\t} );\n\n\t\t\tinput.setDomEvent( 'keydown', (e: KeyboardEvent) => {\n\t\t\t\t\n\t\t\t\tswitch (e.key) {\n\t\t\t\t\tcase 'Escape': {\n\t\t\t\t\t\tthis.killEditor(false);\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\te.preventDefault( );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 'Enter':\n\t\t\t\t\tcase 'Tab': {\n\t\t\t\t\t\tlet sens = 3;\n\t\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\t\tsens = -3;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmovesel(0, sens);\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\te.preventDefault( );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.m_editor.showPopup( );\n\t\t\tthis.m_editor.on( 'change', ( ev ) => {\n\t\t\t\tthis.killEditor(true);\n\t\t\t});\n\n\t\t\tthis.m_editor.on( 'cancel', ( ev ) => {\n\t\t\t\tthis.killEditor(false);\n\t\t\t});\n\t\t}\n\t}\n\n\tkillEditor(save: boolean) {\n\t\tif (this.m_editor) {\n\t\t\tif (save) {\n\t\t\t\t\n\t\t\t\tlet text, id;\n\t\t\t\t\n\t\t\t\tif( this.m_editor instanceof TextEdit ) {\n\t\t\t\t\ttext = (this.m_editor as TextEdit).value;\n\t\t\t\t}\n\t\t\t\telse if( this.m_editor instanceof ComboBox ) {\n\t\t\t\t\tid = (this.m_editor as ComboBox).value;\n\t\t\t\t\ttext = (this.m_editor as ComboBox).valueText;\n\t\t\t\t}\n\n\t\t\t\tlet row = this.m_editor.getData('row');\n\t\t\t\tlet col = this.m_editor.getData('col');\n\t\t\t\tlet old = this.m_editor.getData('old-value');\n\n\t\t\t\tthis.setCellText(row, col, text);\n\t\t\t\tconst ev = EvChange(text, { row, col, oldValue: old, id });\n\t\t\t\tthis.emit('change', ev );\n\n\t\t\t\tif( ev.defaultPrevented ) {\n\t\t\t\t\tthis.setCellText(row, col, old);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// cannot dipose while handling blur event, so we defer...\n\t\t\tlet t = this.m_editor;\n\t\t\tasap( ( ) => {\n\t\t\t\tt.dispose();\n\t\t\t})\n\t\t\t\n\t\t\tthis.m_editor = null;\n\t\t\tthis.focus();\n\t\t}\n\t}\n\n\tclearData() {\n\t\tthis.m_cells_data = new Map<number, CellData>();\n\t\tthis.m_rows_data = new Map<number, string>();\n\t}\n\n\tsetCellText(row: number, col: number, value: string) {\n\n\t\tif (value == null || value.length == 0) {\n\t\t\tthis.m_cells_data.delete(_mkid(row, col));\n\t\t\tvalue = '';\t//'&nbsp';\n\t\t}\n\t\telse {\n\t\t\tlet cell: any = this._getCellData(row, col, true);\n\t\t\tif (!cell) {\n\t\t\t\tcell = {};\n\t\t\t}\n\n\t\t\tcell.text = value;\n\t\t\tthis.m_cells_data.set(_mkid(row, col), cell);\n\t\t}\n\n\t\tif (this.m_lockupdate == 0 && this.m_visible_cells) {\n\t\t\tlet itm = this._findItem(row, col);\n\t\t\tif (itm) {\n\n\t\t\t\tif (this.m_columns[col].renderer) {\n\t\t\t\t\tvalue = this.m_columns[col].renderer(value, { row, col });\n\t\t\t\t}\n\n\t\t\t\titm.setContent(value);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._buildItems();\n\t\t\t}\n\t\t}\n\t}\n\n\tlockUpdate(start: boolean) {\n\t\tif (start) {\n\t\t\tthis.m_lockupdate++;\n\t\t}\n\t\telse {\n\t\t\tif (--this.m_lockupdate == 0) {\n\t\t\t\tthis._updateScroll(true);\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * @ignore\n */\n\nfunction _mkid(row: number, col: number): number {\n\treturn row * 1000 + col;\n}\n\n/**\n * @ignore\n */\n\nfunction _getid(key: number) {\n\treturn {\n\t\trow: Math.floor(key / 1000) | 0,\n\t\tcol: (key % 1000) | 0\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file propertyeditor.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { CEventMap, Component, CProps } from './component'\nimport { EvChange, EventCallback } from './x4events'\n\nimport { InputProps, Input } from './input'\nimport { TextEdit } from './textedit'\nimport { CheckBox } from './checkbox'\nimport { Spreadsheet } from './spreadsheet'\nimport { DataView, Record } from './datastore'\nimport { _tr } from './i18n'\n\n\n//@TODO: review all\n\nexport interface SaveCallback {\n\t(id: any, record: any[]) : void;\n}\n\nexport type IPropertyField = {\n\tid: any;\n\ttitle: string;\n\ttype: Function | \"string\" | 'number' | 'boolean' | 'choice' | 'password' | 'button' | 'color';\n\tvalue?: any;\n\n\tdata?: any;\t// associated data if needed\n\teditorProps?: InputProps;\n\treadOnly?: boolean;\n\t//values?: any[] | DataView;\n}\n\ninterface PropertyEditorEventMap extends CEventMap {\n\tchange: EvChange;\n}\n\nexport interface PropertyEditorProps extends CProps<PropertyEditorEventMap> {\n\tfields: IPropertyField[];\n\tlabelWidth?: number;\n\trecord?: Record;\n\tchange: EventCallback<EvChange>;\n}\n\n\nexport class PropertyEditor extends Component<PropertyEditorProps, PropertyEditorEventMap> {\n\n\tm_fields: IPropertyField[];\n\tm_record: Record;\n\tm_sheet: Spreadsheet;\n\tm_label_w: number;\n\n\tconstructor(props: PropertyEditorProps) {\n\t\tsuper(props);\n\t\tthis.mapPropEvents( props, 'change' );\n\t}\n\n\trender(props: PropertyEditorProps) {\n\n\t\tthis.m_record = props.record;\n\t\tthis.m_fields = props.fields ?? [];\n\t\tthis.m_label_w = props.labelWidth;\n\n\t\tthis.m_sheet = new Spreadsheet({\n\t\t\tcls: '@fit',\n\t\t\tcolumns: [\n\t\t\t\t{ \n\t\t\t\t\ttitle: _tr.global.property, \n\t\t\t\t\twidth: this.m_label_w > 0 ? this.m_label_w : -1, \n\t\t\t\t\tcls: 'property' \n\t\t\t\t},\n\t\t\t\t{ \n\t\t\t\t\ttitle: _tr.global.value, \n\t\t\t\t\twidth: -1, \n\t\t\t\t\tcreateEditor: ( ...a ) => this._editCell(...a), \n\t\t\t\t\trenderer: (...a) => this._renderCell(...a) \n\t\t\t\t},\n\t\t\t],\n\t\t\tautoedit: true,\n\t\t\tchange: ( e ) => this._cellChange(e)\n\t\t});\n\n\t\tthis._updateProperties();\n\t\tthis.setContent( this.m_sheet );\n\t}\n\n\tsetFields(fields: IPropertyField[]) {\n\t\tif (fields) {\n\t\t\tthis.m_fields = fields;\n\t\t\tthis._updateProperties();\n\t\t}\n\t\telse {\n\t\t\tthis.m_sheet.clearData();\n\t\t}\n\t}\n\n\tsetRecord(record: Record) {\n\t\tthis.m_record = record;\n\t\tthis._updateProperties();\n\t}\n\n\tprivate _updateProperties() {\n\t\tthis.m_sheet.lockUpdate(true);\n\t\tthis.m_sheet.clearData();\n\n\t\tthis.m_fields.forEach((fld, lno) => {\n\t\t\tthis.m_sheet.setCellText(lno, 0, fld.title);\n\n\t\t\tif (this.m_record) {\n\t\t\t\tthis.m_sheet.setCellText(lno, 1, this.m_record.getField(fld.id));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.m_sheet.setCellText(lno, 1, fld.value);\n\t\t\t}\n\t\t});\n\n\t\tthis.m_sheet.lockUpdate(false);\n\t}\n\n\n\tprivate _cellChange(ev: EvChange) {\n\n\t\tlet ctx: { row: number, col: number } = ev.context;\n\t\tlet text: number = ev.value as number;\n\n\t\tif (ctx.col != 1) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet fld = this.m_fields[ctx.row];\n\n\t\tswitch (fld.type) {\n\t\t\tdefault:\n\t\t\tcase 'string': {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'number': {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'password': {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'boolean': {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'choice': {\n\t\t\t\t/*\n\t\t\t\tlet cprops = <ComboBoxProps>fprops;\n\t\t\t\tif( cprops!==fld.props ) {\n\t\t\t\t\t\n\t\t\t\t\tlet choices;\n\t\t\t\t\tif( isArray(fld.values) ) {\n\t\t\t\t\t\tchoices = this._choicesFromArray( fld.values );\n\t\t\t\t\t}\n\t\t\t\t\telse if( fld.values instanceof DataStore ) {\n\t\t\t\t\t\tchoices = this._choicesFromStore( fld.values, 'name' );\n\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tcprops.items = choices;\n\t\t\t\t}\n\n\t\t\t\teditor = new ComboBox( cprops ); \n\t\t\t\t*/\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (this.m_record) {\n\t\t\tthis.m_record.setField(fld.id, text);\n\t\t}\n\t\telse {\n\t\t\tfld.value = text;\n\t\t}\n\n\t\tthis.emit( 'change', EvChange(text, fld) );\n\t}\n\n\t_renderCell(text, rec) {\n\n\t\tlet fld = this.m_fields[rec.row];\n\n\t\tswitch (fld.type) {\n\t\t\tdefault:\n\t\t\tcase 'string': {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'number': {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'password': {\n\t\t\t\ttext = '\u25CF\u25CF\u25CF\u25CF\u25CF\u25CF';\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'boolean': {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'choice': {\n\t\t\t\t/*\n\t\t\t\tlet cprops = <ComboBoxProps>fprops;\n\t\t\t\tif( cprops!==fld.props ) {\n\t\t\t\t\t\n\t\t\t\t\tlet choices;\n\t\t\t\t\tif( isArray(fld.values) ) {\n\t\t\t\t\t\tchoices = this._choicesFromArray( fld.values );\n\t\t\t\t\t}\n\t\t\t\t\telse if( fld.values instanceof DataStore ) {\n\t\t\t\t\t\tchoices = this._choicesFromStore( fld.values, 'name' );\n\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tcprops.items = choices;\n\t\t\t\t}\n\n\t\t\t\teditor = new ComboBox( cprops ); \n\t\t\t\t*/\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn text;\n\t}\n\n\t_editCell(props, row: number, col: number) {\n\n\t\tlet fld = this.m_fields[row];\n\n\t\tlet editor: Component;\n\t\tswitch (fld.type) {\n\t\t\tdefault:\n\t\t\tcase 'string': {\n\t\t\t\teditor = new TextEdit(props);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'number': {\n\t\t\t\teditor = new TextEdit(props);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'password': {\n\t\t\t\tprops.type = 'password';\n\t\t\t\tprops.value = this.m_record.getField(fld.id);\n\t\t\t\teditor = new Input(props);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'boolean': {\n\t\t\t\teditor = new CheckBox(props);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'choice': {\n\t\t\t\t/*let cprops = <ComboBoxProps>props;\n\t\t\t\tif( cprops!==fld.props ) {\n\t\t\t\t\t\n\t\t\t\t\tlet choices;\n\t\t\t\t\tif( isArray(fld.values) ) {\n\t\t\t\t\t\tchoices = this._choicesFromArray( fld.values );\n\t\t\t\t\t}\n\t\t\t\t\telse if( fld.values instanceof DataStore ) {\n\t\t\t\t\t\tchoices = this._choicesFromStore( fld.values, 'name' );\n\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tcprops.items = choices;\n\t\t\t\t}\n\n\t\t\t\teditor = new ComboBox( cprops ); \n\t\t\t\t*/\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn editor;\n\t}\n\n\tprivate _choicesFromArray(values): any[] {\n\t\tlet choices = values.map((e) => {\n\n\t\t\tif (typeof (e) == 'object') {\n\t\t\t\treturn { id: e.id, text: e.value };\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn { id: e, text: '' + e };\n\t\t\t}\n\t\t});\n\n\t\treturn choices;\n\t}\n\n\tprivate _choicesFromStore(view: DataView, field: string): any[] {\n\n\t\tlet choices = [];\n\n\t\tfor (let i = 0, n = view.count; i < n; i++) {\n\t\t\tlet rec = view.getByIndex(i);\n\t\t\tchoices.push({ id: rec.getID(), text: rec.getField(field) });\n\t\t}\n\n\t\treturn choices;\n\t}\n\n\n}\n\n\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file radiobtn.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { x4document } from './x4dom'\nimport { HtmlString } from './tools'\n\nimport { Component, CProps, CEventMap } from './component'\nimport { EvChange, EventCallback } from './x4events'\n\nimport { IconID } from './icon';\nimport { Input } from './input'\nimport { Label } from './label'\n\n// ============================================================================\n// [RADIOBTN]\n// ============================================================================\n\ninterface RadioBtnEventMap extends CEventMap {\n\tchange?: EvChange;\n}\n\nexport interface RadioBtnProps extends CProps {\n\n\tgroup: string;\t// same as 'name' but required\n\tvalue: string;\n\t\n\ttabIndex?: number | boolean;\n\tname?: string;\n\n\ticon?: IconID;\n\ttext?: string;\n\tchecked?: boolean;\n\tlabelWidth?: number | 'flex';\t// flex | value\n\talign?: 'left' | 'right';\n\n\tchange?: EventCallback<EvChange>; // shortcut to events: { change: xxx }\n}\n\n\n/**\n * Standard RadioBtn\n */\n\nexport class RadioBtn extends Component<RadioBtnProps,RadioBtnEventMap> {\n\n\tprotected m_ui_input: Input;\t// todo: remove that / use ref\n\n\tconstructor(props: RadioBtnProps) {\n\n\t\tsuper( props );\n\t\tthis.mapPropEvents( props, 'change' );\n\t}\n\n\t/** @ignore */\n\trender( props: RadioBtnProps) {\n\n\t\tlet text = props.text ?? '';\n\t\tlet name = props.name ?? props.group;\n\t\tlet labelWidth = props.labelWidth ?? -1;\n\t\tlet checked = props.checked ?? false;\n\t\tlet align = props.align ?? 'left';\n\t\tlet value = props.value;\n\t\tlet icon = props.icon;\n\t\t\n\t\tthis.setTag( 'label' );\n\t\tthis.addClass( '@hlayout' );\n\t\t\n\t\tthis.addClass( align );\n\t\tthis._setTabIndex( props.tabIndex );\n\n\t\tif( checked ) {\n\t\t\tthis.addClass( 'checked' );\n\t\t}\n\n\t\tthis.setContent( [\n\t\t\tthis.m_ui_input = new Input({\n\t\t\t\ttype: 'radio',\t\t\t\t\n\t\t\t\tname: name,\n\t\t\t\ttabIndex: props.tabIndex,\n\t\t\t\tvalue: value,\n\t\t\t\tattrs: {\n\t\t\t\t\tchecked: checked ? '' : undefined\n\t\t\t\t},\n\t\t\t\tdom_events: {\n\t\t\t\t\tchange: ( ) => this._change( ),\n\t\t\t\t\tfocus: \t( ) => this.m_ui_input.focus( ),\n\t\t\t\t}\n\t\t\t}),\n\t\t\tnew Label( {\n\t\t\t\tref: 'label',\n\t\t\t\ticon: icon,\n\t\t\t\ttext: text,\n\t\t\t\twidth: labelWidth==='flex' ? undefined : labelWidth,\n\t\t\t\tflex: labelWidth==='flex' ? 1 : undefined,\n\t\t\t\tstyle: {\n\t\t\t\t\torder: align=='right' ? -1 : undefined,\n\t\t\t\t},\t\t\n\t\t\t} )\n\t\t] );\n\t}\n\n\t/**\n\t * check state changed\n\t */\n\n\tprivate _change( ) {\n\n\t\tlet props = this.m_props;\n\n\t\tlet query = '.x-input[name='+props.name+']';\n\t\tlet nlist = x4document.querySelectorAll( query );\t\t//todo: document ?\n\n\t\tnlist.forEach( (dom) => {\n\t\t\tlet radio = Component.getElement( <HTMLElement>dom, RadioBtn );\n\t\t\tradio.removeClass( 'checked' );\n\t\t});\n\n\t\tlet dom = (<HTMLInputElement>this.m_ui_input.dom);\n\t\tthis.setClass( 'checked', dom.checked )\n\n\t\tthis.emit( 'change', EvChange( true ) );\n\t}\n\n\t/**\n * @return the checked value\n */\n\n public get check( ) {\n\t\tif( this.m_ui_input ) {\n\t\t\treturn (<HTMLInputElement>this.m_ui_input.dom).checked;\n\t\t}\n\t\t\n\t\treturn this.m_props.checked;\n }\n\n /**\n * change the checked value\n * @param {boolean} ck new checked value\t\n */\n\n public set check( ck ) {\n\n\t\tlet dom = (<HTMLInputElement>this.m_ui_input.dom);\n\t\t\n if ( ck ) {\n\t\t\t//this.addClass( 'checked' );\n\t\t\tif( dom ) {\n\t\t\t\tdom.checked = true;\n\t\t\t}\n\t\t\t\n\t\t\tthis.m_props.checked = true;\n }\n else {\n\t\t\t//this.removeClass( 'checked' );\n if( dom ) {\n\t\t\t\tdom.checked = false;\n\t\t\t}\n\n\t\t\tthis.m_props.checked = false;\n\t\t}\n\t}\n\n\tget text( ): HtmlString | string {\n\t\treturn this.itemWithRef<Label>('label').text;\n\t}\n\n\tset text( text: HtmlString | string ) {\n\t\tthis.itemWithRef<Label>('label').text = text;\n\t}\n}\n\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file rating.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { CProps, Component, ContainerEventMap } from './component'\nimport { HLayout } from './layout';\nimport { Input } from './input'\nimport { EvChange, EventCallback } from './x4events';\n\ninterface RatingEventMap extends ContainerEventMap {\n\tchange: EvChange;\n}\n\nexport interface RatingProps extends CProps<RatingEventMap> {\n\tsteps?: number;\n\tvalue?: number;\n\tshape?: string;\n\tname?: string; \n\n\tchange?: EventCallback<EvChange>;\n}\n\n\nexport class Rating extends HLayout<RatingProps,RatingEventMap> {\n\n\tprivate m_els: Component[];\n\tprivate m_input: Input;\n\t\n\tconstructor( props: RatingProps ) {\n\t\tsuper( props );\n\n\t\tprops.steps = props.steps ?? 5;\n\t}\n\n\trender( props: RatingProps ) {\n\t\t\n\t\tlet shape = props.shape ?? 'star';\n\t\tlet value = props.value ?? 0;\n\n\t\tthis.m_input = new Input( {\n\t\t\tcls: '@hidden',\n\t\t\tname: props.name,\n\t\t\tvalue: ''+value\n\t\t} );\n\n\t\tthis.addClass( shape );\n\t\tthis.setDomEvent( 'click', (e) => this._onclick(e) );\n\n\t\tthis.m_els = [];\n\t\tfor( let i=0; i<props.steps; i++ ) {\n\t\t\t\n\t\t\tlet cls = 'item';\n\t\t\tif( i+1 <= value ) {\n\t\t\t\tcls += ' checked';\n\t\t\t}\n\n\t\t\tlet c = new Component( { \n\t\t\t\ttag: 'option',\n\t\t\t\tcls,\n\t\t\t\tdata: { value: i+1 }\n\t\t\t} );\n\n\t\t\tthis.m_els.push( c );\n\t\t}\n\n\t\tthis.m_els.push( this.m_input );\n\t\tthis.setContent( this.m_els );\n\t}\n\n\tgetValue( ) {\n\t\treturn this.m_props.value ?? 0;\n\t}\n\n\tset value( v: number ) {\n\t\tthis.m_props.value = v;\n\n\t\tfor( let c=0; c<this.m_props.steps; c++ ) {\n\t\t\tthis.m_els[c].setClass( 'checked', this.m_els[c].getData('value')<=v );\n\t\t}\n\n\t\tthis.m_input.value = ''+this.m_props.value;\n\t}\n\n\tset steps( n: number ) {\n\t\tthis.m_props.steps = n;\n\t\tthis.update( );\n\t}\n\n\tset shape( shape: string ) {\n\t\tthis.removeClass( this.m_props.shape );\n\t\tthis.m_props.shape = shape;\n\t\tthis.addClass( this.m_props.shape );\n\t}\n\n\tprivate _onclick( ev: MouseEvent ) {\n\n\t\tlet on = true;\n\t\tfor( let el=this.dom.firstChild; el; el = el.nextSibling ) {\n\t\t\tlet comp = Component.getElement( <HTMLElement>el );\n\t\t\tcomp.setClass( 'checked', on )\n\n\t\t\tif( el==ev.target ) {\n\t\t\t\tthis.m_input.value = comp.getData( 'value' );\n\t\t\t\ton = false;\n\t\t\t}\n\t\t}\n\n\t\tthis.emit( 'change', EvChange( this.m_props.value) );\n\t} \n}\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file sidebarview.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Component, CProps, Flex, Separator } from './component'\nimport { HLayout, VLayout } from './layout'\nimport { Button } from './button'\nimport { CardView, CardViewProps, ICardViewItem } from './cardview'\nimport { Image } from './image';\n\nexport interface SideBarItem extends ICardViewItem {\n}\n\nexport interface SideBarProps extends CardViewProps {\n\tbar_sizable?: boolean;\n\tbar_width?: number;\n\tlogo?: Image;\n}\n\n/**\n * \n */\n\nexport class SideBarView extends CardView<SideBarProps> {\n\tm_sidebar: VLayout;\n\tm_content: Component;\n\n\tconstructor( props: SideBarProps ) {\n\n\t\tsuper( props );\n\n\t\tthis.addClass( '@hlayout' );\n\n\t\tthis.m_sidebar = new VLayout( {\n\t\t\tcls: '@side-bar',\n\t\t\twidth: props.bar_width ?? undefined,\n\t\t});\n\n\t\tthis.m_content = new HLayout( { flex: 1, cls: '@tab-container' } );\n\t}\n\n\t/** @ignore */\n\trender() {\n\n\t\tlet tabs = [];\n\t\t\n\t\tthis.m_cards.forEach( (p) => {\n\t\t\ttabs.push( p.selector );\n\t\t} );\n\n\t\tthis.m_sidebar.setContent( new VLayout( {\n\t\t\tflex: 1,\n\t\t\tcls: 'content',\n\t\t\tcontent: [\n\t\t\t\tthis.m_props.logo,\n\t\t\t\t...tabs\n\t\t\t]\n\t\t}) );\n\n\t\tthis.setContent( [\n\t\t\tthis.m_sidebar,\n\t\t\tthis.m_props.bar_sizable ? new Separator( { orientation: \"horizontal\", sizing: \"before\" }) : undefined,\n\t\t\tthis.m_content\n\t\t] );\n\t}\n\n\tprotected _prepareSelector( card: ICardViewItem ): Component {\n\t\treturn new Button( {\n\t\t\ttext: card.title,\n\t\t\ticon: card.icon,\n\t\t\ttooltip: card.title,\n\t\t\tclick: ( ) => { this.switchTo( card.name); }\n\t\t});\n\t}\n\n\tprotected _preparePage( page: Component ) {\n\t\tsuper._preparePage( page );\n\t\t\n\t\tif( !page.dom ) {\n\t\t\tthis.m_content.appendChild( page );\n\t\t}\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file svgcomponent.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Component, CProps, _x4_unitless } from './component'\nimport { isNumber, isString } from \"./tools\"\n\nconst reNumber = /^-?\\d+(\\.\\d+)?$/;\n\n// degrees to radian\nfunction d2r( d: number ): number {\n\treturn d * Math.PI / 180.0;\n}\n\n// polar to cartesian\nfunction p2c( x: number, y: number, r: number, deg: number ): {x: number,y: number} {\n\tconst rad = d2r( deg );\n\treturn {\n\t\tx: x + r * Math.cos( rad ),\n\t\ty: y + r * Math.sin( rad )\n\t};\n}\n\nfunction num( x: number ): number {\n\treturn Math.round( x * 1000 ) / 1000;\n}\n\nfunction clean( a: any, ...b: any ) {\n\n\t// just round number values to 3 digits\n\tb = b.map( ( v: any ) => {\n\t\tif( typeof v === 'number' && isFinite(v) ) {\n\t\t\treturn num(v);\n\t\t}\n\n\t\treturn v;\n\t});\n\n\treturn String.raw( a, ...b );\n}\n\n/**\n * \n */\n\nexport abstract class SVGItem {\n\tprivate m_tag: string\n\tprivate m_attrs: Map<string,string>;\n\tprivate m_style: Map<string,string>;\n\n\tconstructor( tag: string ) {\n\t\tthis.m_tag = tag;\n\t\tthis.m_attrs = new Map( );\n\t\tthis.m_style = new Map( );\n\t}\n\n\tsetTag( t: string ) {\n\t\tthis.m_tag = t;\n\t}\n\n\t/**\n\t * render the item\n\t * @returns \n\t */\n\n\trender( ) : string {\n\t\treturn `<${this.m_tag} ${this.renderAttrs()} ${this.renderStyle()}>${this.renderContent( )}</${this.m_tag}>`;\n\t}\n\n\t/**\n\t * change the stroke color\n\t * @param color \n\t */\n\n\tstroke( color: string, width?: number ): this {\n\t\tthis.attr( 'stroke', color );\n\t\tif( width!==undefined ) {\n\t\t\tthis.attr( 'stroke-width', width+'px' );\t\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * change the stroke width\n\t * @param width \n\t */\n\tstrokeWidth( width: number ): this {\n\t\tthis.attr( 'stroke-width', width+'px' );\n\t\treturn this;\n\t}\n\n\t/**\n\t * change the fill color\n\t * @param color \n\t */\n\n\tfill( color: string ): this {\n\t\tthis.attr( 'fill', color );\n\t\treturn this;\n\t}\n\n\t/**\n\t * define a new attribute\n\t * @param name attibute name\n\t * @param value attribute value\n\t * @returns this\n\t */\n\n\tattr( name: string, value: string ) : this {\n\t\tthis.m_attrs.set( name, value );\n\t\treturn this;\n\t}\n\n\tstyle( name: string, value: string | number ) : this {\n\t\t\n\t\tif (value === undefined || value==='' || value===undefined ) {\n\t\t\tthis.m_style.delete( name );\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\tif (!_x4_unitless[name] && (isNumber(value) || reNumber.test(value))) {\n\t\t\tvalue = value + 'px';\n\t\t}\n\n\t\tthis.m_style.set( name, ''+value );\n\t\treturn this;\n\t}\n\n\t/**\n\t * add a class\n\t * @param name class name to add \n\t */\n\t\n\tclass( name: string ): this {\n\t\tlet c = this.m_attrs.get( 'class' );\n\t\tthis.m_attrs.set( 'class', (c??'' + ' ' + name).trim() );\n\t\treturn this;\n\t}\n\t\n\t/**\n\t * \n\t */\n\t\n\trenderAttrs( ): string {\n\t\tif( !this.m_attrs.size ) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tlet result = '';\n\t\tthis.m_attrs.forEach( (v,k) => {\n\t\t\tresult += ` ${k} = \"${v}\"`\n\t\t});\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * \n\t */\n\t\n\t renderStyle( ): string {\n\n\t\tif( !this.m_style.size ) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tlet result = 'style=\"';\n\t\tthis.m_style.forEach( (v,k) => {\n\t\t\tresult += `${k}:${v};`\n\t\t});\n\n\t\treturn result+'\"';\n\t}\n\t\n\t/**\n\t * \n\t */\n\n\trenderContent( ): string {\n\t\treturn '';\n\t}\n\n\t/**\n\t * \n\t */\n\n\tclip( id: string ): this {\n\t\tthis.attr( \"clip-path\", `url(#${id})` );\n\t\treturn this;\n\t}\n\n\t/**\n\t * \n\t */\n\n\ttransform( tr: string ): this {\n\t\tthis.attr( \"transform\", tr );\n\t\treturn this;\n\t}\n\n\t/**\n\t * \n\t */\n\n\trotate( deg: number, cx: number, cy: number ): this {\n\t\tthis.transform( `rotate( ${deg} ${cx} ${cy} )` );\n\t\treturn this;\n\t}\n\n\ttranslate( dx: number, dy: number ): this {\n\t\tthis.transform( `translate( ${dx} ${dy} )` );\n\t\treturn this;\n\t}\n\n\tscale( x: number ): this {\n\t\tthis.transform( `scale( ${x} )` );\n\t\treturn this;\n\t}\n}\n\n/**\n * \n */\n\nexport class SVGPath extends SVGItem {\n\tprivate m_path: string;\n\n\tconstructor( ) {\n\t\tsuper( 'path' );\n\t\tthis.m_path = '';\n\t}\n\n\toverride renderAttrs(): string {\n\t\tthis.attr( 'd', this.m_path );\n\t\treturn super.renderAttrs( );\n\t}\n\n\t/**\n\t * move the current pos\n\t * @param x new pos x\n\t * @param y new pos y\n\t * @returns this\n\t */\n\n\tmoveTo( x: number, y: number ) : this {\n\t\tthis.m_path += clean`M${x},${y}`;\n\t\treturn this;\n\t}\n\n\t/**\n\t * draw aline to the given point\n\t * @param x end x\n\t * @param y end y\n\t * @returns this\n\t */\n\n\tlineTo( x: number, y: number ): this {\n\t\tthis.m_path += clean`L${x},${y}`;\n\t\treturn this;\n\t}\n\n\t/**\n\t * close the currentPath\n\t */\n\n\tclosePath( ): this {\n\t\tthis.m_path += 'Z';\n\t\treturn this;\n\t}\n\n\t/**\n\t * draw an arc\n\t * @param x center x\n\t * @param y center y\n\t * @param r radius\n\t * @param start angle start in degrees\n\t * @param end angle end in degrees\n\t * @returns this\n\t */\n\n\tarc( x: number, y: number, r: number, start: number, end: number ): this {\n\n\t\tconst st = p2c( x, y, r, start-90 );\n\t\tconst en = p2c( x, y, r, end-90 );\n\n\t\tconst flag = end - start <= 180 ? \"0\" : \"1\";\n\t\tthis.m_path += clean`M${st.x},${st.y}A${r},${r} 0 ${flag} 1 ${en.x},${en.y}`;\n\t\t\n\t\treturn this;\n\t}\n}\n\n/**\n * \n */\n\nexport class SVGText extends SVGItem {\n\n\tprivate m_text;\n\n\tconstructor( x: number, y: number, txt: string ) {\n\t\tsuper( 'text' );\n\t\tthis.m_text = txt;\n\t\tthis.attr( 'x', num(x)+'' );\n\t\tthis.attr( 'y', num(y)+'' );\n\t}\n\n\tfont( font: string ): this {\n\t\tthis.attr( 'font-family', font );\n\t\treturn this;\n\t}\n\n\tfontSize( size: number | string ): this {\n\t\tthis.attr( 'font-size', size+'' );\n\t\treturn this;\n\t}\n\n\tfontWeight( weight: 'light' | 'normal' | 'bold' ): this {\n\t\tthis.attr( 'font-weight', weight );\n\t\treturn this;\n\t}\n\n\ttextAlign( align: 'left' | 'center' | 'right' ): this {\n\n\t\tlet al;\n\t\tswitch( align ) {\n\t\t\tcase 'left': al = 'start'; break;\n\t\t\tcase 'center': al = 'middle'; break;\n\t\t\tcase 'right': al = 'end'; break;\n\t\t\tdefault: return this;\n\t\t}\n\n\t\tthis.attr( 'text-anchor', al );\n\t\treturn this;\n\t}\n\n\tverticalAlign( align: 'top' | 'center' | 'bottom' ): this {\n\n\t\tlet al;\n\t\tswitch( align ) {\n\t\t\tcase 'top': al = 'hanging'; break;\n\t\t\tcase 'center': al = 'middle'; break;\n\t\t\tcase 'bottom': al = 'baseline'; break;\n\t\t\tdefault: return;\n\t\t}\n\n\t\tthis.attr( 'alignment-baseline', al );\n\t\treturn this;\n\t}\n\n\toverride renderContent( ) {\n\t\treturn this.m_text;\n\t}\n}\n\n/**\n * \n */\n\nexport class SVGShape extends SVGItem {\n\tconstructor( tag: string ) {\n\t\tsuper( tag );\n\t}\n}\n\n/**\n * \n */\n\ntype number_or_perc = number | `${string}%`\n\nexport class SVGGradient extends SVGItem {\n\n\tprivate static g_id = 1;\n\n\tprivate m_id: string;\n\tprivate m_stops: { offset: number_or_perc, color: string } [];\n\n\tconstructor( x1: number_or_perc, y1: number_or_perc, x2: number_or_perc, y2: number_or_perc ) {\n\t\tsuper( 'linearGradient')\n\t\t\n\t\tthis.m_id = 'gx-'+SVGGradient.g_id;\n\t\tthis.attr( 'id', this.m_id );\n\t\tthis.attr( 'x1', isString(x1) ? x1 : num(x1)+'' );\n\t\tthis.attr( 'x2', isString(x2) ? x2 : num(x2)+'' );\n\t\tthis.attr( 'y1', isString(y1) ? y1 : num(y1)+'' );\n\t\tthis.attr( 'y2', isString(y2) ? y2 : num(y2)+'' );\n\n\t\tthis.m_stops = [];\n\t\tSVGGradient.g_id++;\n\t}\n\n\tget id( ) {\n\t\treturn 'url(#'+this.m_id+')';\n\t}\n\n\taddStop( offset: number_or_perc, color: string ): this {\n\t\tthis.m_stops.push( {offset,color} );\n\t\treturn this;\n\t}\n\n\toverride renderContent(): string {\n\n\t\tconst result: string[] = [];\n\t\tthis.m_stops.forEach( s => {\n\t\t\tresult.push( `<stop offset=\"${s.offset}%\" stop-color=\"${s.color}\"></stop>`);\n\t\t});\n\n\t\treturn result.join('\\n' );\n\t}\n}\n\n/**\n * \n */\n\nexport class SVGGroup extends SVGItem {\n\tprotected m_items: SVGItem[];\n\n\tconstructor( tag = \"g\" ) {\n\t\tsuper( tag )\n\n this.m_items = [];\n\t}\n\n\tpath( ) {\n\t\tconst path = new SVGPath( );\n\t\tthis.m_items.push( path );\n\t\treturn path;\n\t}\n\n\ttext( x: number, y: number, txt: string ) {\n\t\tconst text = new SVGText( x, y, txt );\n\t\tthis.m_items.push( text );\n\t\treturn text;\n\t}\n\n\tellipse( x: number, y: number, r1: number, r2 = r1 ): SVGShape {\n\t\tconst shape = new SVGShape( 'ellipse' );\n\t\tshape.attr( 'cx', num(x)+'' );\n\t\tshape.attr( 'cy', num(y)+'' );\n\t\tshape.attr( 'rx', num(r1)+'' );\n\t\tshape.attr( 'ry', num(r2)+'' );\n\t\tthis.m_items.push( shape );\n\t\treturn shape;\n\t}\n\n\trect( x: number, y: number, w: number, h: number ): SVGShape {\n\t\tconst shape = new SVGShape( 'rect' );\n\t\tshape.attr( 'x', num(x)+'' );\n\t\tshape.attr( 'y', num(y)+'' );\n\t\tshape.attr( 'width', num(w)+'' );\n\t\tshape.attr( 'height', num(h)+'' );\n\t\tthis.m_items.push( shape );\n\t\treturn shape;\n\t}\n\n\tgroup( ) {\n\t\tconst group = new SVGGroup( );\n\t\tthis.m_items.push( group );\n\t\treturn group;\n\t}\n\n\t/**\n\t * \n\t * example\n\t * ```ts\n\t * const g = c.linear_gradient( '0%', '0%', '0%', '100%' )\n\t * \t\t\t\t.addStop( 0, 'red' )\n\t * \t\t\t\t.addStop( 100, 'green' );\n\t * \n\t * p.rect( 0, 0, 100, 100 )\n\t * \t\t.stroke( g.id );\n\t * \n\t * ```\n\t */\n\n\tlinear_gradient( x1: number_or_perc, y1: number_or_perc, x2: number_or_perc, y2: number_or_perc ) {\n\t\tconst grad = new SVGGradient( x1, y1, x2, y2 );\n\t\tthis.m_items.push( grad );\n\t\treturn grad;\n\t}\n\n\t/**\n\t * clear \n\t */\n\n\tclear( ) {\n\t\tthis.m_items = [];\n\t}\n\n\trenderContent( ) {\n\t\tlet result: string[] = [];\n\t\tthis.m_items.forEach( i => {\n\t\t\tresult.push( i.render() );\n\t\t});\n\n\t\treturn result.join( '\\n' );\n\t}\n}\n\n\n/**\n * \n */\n\nexport class SVGPathBuilder extends SVGGroup\n{\n\tprivate static g_clip_id = 1;\n\t\n\tconstructor( ) {\n\t\tsuper( '' );\n\t}\n\n\taddClip( x: number, y: number, w: number, h: number ) {\n \n\t\tconst id = 'c-'+SVGPathBuilder.g_clip_id++;\n\t\tconst clip = new SVGGroup( 'clipPath' );\n\t\tclip.attr('id', id );\n\t\tclip.rect( x, y, w, h );\n\n\t\tthis.m_items.push(clip);\n return id;\n }\n \n render() {\n\n\t\tlet result: string[] = [];\n this.m_items.forEach(i => {\n result.push(i.render());\n });\n\n\t\treturn result.join('\\n');\n }\n}\n\n/**\n * \n */\n\n\nexport interface SVGProps extends CProps {\n\tviewBox?: string;\n\tpath?: string;\n}\n\n\nexport class SVGComponent<P extends SVGProps = SVGProps> extends Component<P> {\n\n\tconstructor( props: P ) {\n\t\tsuper( props );\n\n\t\tthis.setTag('svg','http://www.w3.org/2000/svg');\n\t\tthis.setAttribute('xmlns','http://www.w3.org/2000/svg');\n\n\t\tthis.setAttributes( {\n\t\t\tviewBox: props.viewBox,\n\t\t});\n\n\t\tthis.setContent( props.path );\n\t}\n\n\t\n}\n\n\n\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file tabbar.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Component, Container, ContainerEventMap, CProps, EventHandler } from './component';\nimport { Button } from './button';\nimport { EvChange } from './x4events';\nimport { IconID } from './icon.js';\n\ninterface TabBarEventMap extends ContainerEventMap {\n\tchange: EvChange;\n}\n\ninterface TabBarProps extends CProps<TabBarEventMap> {\n\tpages?: ITabPage[];\n\tdefault?: string;\n\tvertical?: boolean;\n\tchange: EventHandler<EvChange>;\n}\n\nexport interface ITabPage {\n\tid: string;\n\ttitle?: string;\n\ticon?: IconID;\n\tpage: Component;\n}\n\ninterface TabPage extends ITabPage {\n\tbtn?: Component;\n}\n\nexport class TabBar extends Container<TabBarProps,TabBarEventMap> {\n\n\tprivate m_pages: TabPage[];\n\tprivate m_curPage: TabPage;\n\n\tconstructor( props: TabBarProps ) {\n\t\tsuper( props );\n\n\t\tthis.m_pages = [];\n\t\tthis.m_curPage = null;\n\n\t\tthis.mapPropEvents( props, 'change' );\n\n\t\tif( props.vertical ) {\n\t\t\tthis.addClass( '@vlayout')\n\t\t}\n\t\telse {\n\t\t\tthis.addClass( '@hlayout')\n\t\t}\n\n\t\tthis.m_props.pages?.forEach( p => this.addPage(p) );\n\t}\n\n\tcomponentCreated(): void {\n\t\tif( this.m_props.default ) {\n\t\t\tthis.select( this.m_props.default, true );\n\t\t}\t\t\n\t}\n\n\taddPage( page: ITabPage ) {\n\t\tthis.m_pages.push( { ...page } );\n\t\tthis._updateContent( );\n\t}\n\n\trender( ) {\n\t\tlet buttons = [];\n\t\tthis.m_pages.forEach( p => {\n\t\t\tp.btn = new Button( { cls: p===this.m_curPage ? 'selected' : '', text: p.title, icon: p.icon, click: () => this._select(p,true) } );\n\t\t\tbuttons.push( p.btn );\n\t\t});\n\n\t\tthis.setContent( buttons );\n\t}\n\n\tselect( id: string | null, notify = false ): boolean {\n\t\tif( !id ) {\n\t\t\tthis._select( null, notify );\n\t\t\treturn true;\n\t\t}\n\t\telse {\n\t\t\tlet page = this.m_pages.find( x => x.id===id );\n\t\t\tif( page ) {\n\t\t\t\tthis._select( page, notify );\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tprivate _select( p: TabPage, notify: boolean ) {\n\n\t\tif( this.m_curPage==p ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif( !this.dom ) {\n\t\t\tthis.m_props.default = p.id;\n\t\t\treturn;\n\t\t}\n\n\t\tif( this.m_curPage ) {\n\t\t\tthis.m_curPage.btn.removeClass( 'selected' );\n\t\t\tif( this.m_curPage.page ) {\n\t\t\t\tthis.m_curPage.page.hide( );\n\t\t\t}\n\t\t}\n\n\t\tthis.m_curPage = p;\n\n\t\tif( notify ) {\n\t\t\tthis.signal( 'change', EvChange(p ? p.id : null) );\n\t\t}\n\n\t\tif( this.m_curPage ) {\n\t\t\tthis.m_curPage.btn.addClass( 'selected' );\n\t\t\tif( this.m_curPage.page ) {\n\t\t\t\tthis.m_curPage.page.show( );\n\t\t\t}\n\t\t}\n\t}\n\n\tget selection( ): Component {\n\t\treturn this.m_curPage?.page;\n\t}\n}\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file tabview.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Component, CProps } from './component'\nimport { HLayout } from './layout'\nimport { Button } from './button'\nimport { CardView, CardViewProps, ICardViewItem } from './cardview'\nimport { MenuItem } from './menu'\n\ninterface TabProps extends CardViewProps\n{\n\ttab_selector?: boolean;\n\tmenu?: MenuItem;\n}\n\n/**\n * Standard TabView class\n */\n\nexport class TabView extends CardView<TabProps>\n{\n\tprotected m_tab_selector: boolean;\n\tprotected m_menu: MenuItem;\n\t\n\tconstructor( props: TabProps ) {\n\t\tsuper( props );\n\n\t\tthis.m_tab_selector = props.tab_selector ? true : false;\n\t\tthis.m_menu = props.menu;\n\n\t\tthis.addClass( '@vlayout' );\n\t}\n\t\n\t/** @ignore */\n\trender() {\n\n\t\tlet tabs = [];\n\t\tlet pages = [];\n\n\t\tif( this.m_menu ) {\n\t\t\tthis.m_menu.addClass( '@button @tab-btn' );\n\t\t\tthis.m_menu.removeClass( '@menu-item' );\n\t\t\ttabs.push( this.m_menu );\n\t\t}\n\n\t\tthis.m_cards.forEach( (p) => {\n\t\t\ttabs.push( p.selector );\n\t\t\tif( !(p.page instanceof Function) ) {\n\t\t\t\tpages.push( p.page );\n\t\t\t}\n\t\t} );\n\n\t\tif( this.m_tab_selector ) {\n\t\t\tpages.unshift( new HLayout( {\n\t\t\t\tcls: '@tab-switch',\n\t\t\t\tcontent: tabs\n\t\t\t}) );\n\t\t}\n\n\t\tthis.setContent( pages );\n\t}\n\n\tprotected _updateSelector( ) {\n\t\n\t}\n\n\tprotected _prepareSelector( card: ICardViewItem ): Component {\n\t\t\n\t\treturn new Button( {\n\t\t\tcls: '@tab-btn',\n\t\t\ttext: card.title,\n\t\t\ticon: card.icon,\n\t\t\tclick: ( ) => { this.switchTo(card.name); }\n\t\t});\n\t}\n\n\tprotected _preparePage( page: Component ) {\n\t\tsuper._preparePage( page );\n\n\t\tif( !page.dom ) {\n\t\t\tthis.appendChild( page );\n\t\t}\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file textarea.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Component, CProps, CEventMap } from './component'\nimport { EvChange, EventCallback } from './x4events'\nimport { asap } from './tools'\n\ninterface TextAreaEventMap extends CEventMap {\n\tchange: EvChange;\n}\n\ninterface Selection {\n\tstart: number;\n\tend: number;\n}\n\nexport interface TextAreaProps extends CProps {\n\ttext?: string;\n\treadOnly?: boolean;\n\ttabIndex?: number;\n\tplaceHolder?: string;\n\tname?: string;\n\trows?: number;\n\tautoGrow?: boolean;\n\tautoFocus?: boolean;\n\tspellcheck?: boolean;\n\n\tchange?: EventCallback<EvChange>;\n}\n\nexport class TextArea extends Component<TextAreaProps, TextAreaEventMap> {\n\n\tconstructor(props: TextAreaProps) {\n\t\tsuper(props);\n\n\t\tthis.mapPropEvents( props, 'change' );\n\t}\n\n\t\n\t/** @ignore */\n\trender(props: TextAreaProps) {\n\n\t\tprops.text = props.text ?? '';\n\n\t\tthis.setAttribute('tabindex', props.tabIndex ?? 0);\n\t\tif( props.spellcheck===false ) {\n\t\t\tthis.setAttribute('spellcheck', 'false' );\n\t\t}\n\n\t\tif (props.readOnly !== undefined) {\n\t\t\tthis.setAttribute('readonly', props.readOnly);\n\t\t}\n\n\t\tif (props.rows) {\n\t\t\tthis.setAttribute('rows', props.rows);\n\t\t}\n\n\t\tif (props.placeHolder) {\n\t\t\tthis.setAttribute('placeholder', props.placeHolder);\n\t\t}\n\n\t\tif (props.autoFocus) {\n\t\t\tthis.setAttribute('autofocus', props.autoFocus);\n\t\t}\n\n\t\tif (props.name) {\n\t\t\tthis.setAttribute('name', props.name);\n\t\t}\n\n\t\tif (props.autoGrow) {\n\t\t\tthis.m_props.autoGrow = true;\n\t\t\tthis.setAttribute('rows', this._calcHeight(props.text));\n\t\t\tthis.setDomEvent('keydown', () => {\n\t\t\t\tasap( ()=>this._updateHeight());\n\t\t\t});\n\t\t}\n\n\t\t// avoid going to next element on enter\n\t\tthis.setDomEvent('keydown', (e: KeyboardEvent) => {\n\t\t\te.stopPropagation();\n\t\t});\n\n\t\tthis.setTag( 'textarea');\n\t\tthis.setDomEvent('input', () => this._change());\n\t}\n\n\tprivate _change() {\n\t\tthis.emit('change', EvChange(this.value));\n\t}\n\n\tcomponentCreated() {\n\t\tthis.value = this.m_props.text;\n\t}\n\n\tget value(): string {\n\n\t\tif (this.dom) {\n\t\t\treturn (<HTMLTextAreaElement>this.dom).value;\n\t\t}\n\n\t\treturn this.m_props.text;\n\t}\n\n\tset value(t: string) {\n\t\tthis.m_props.text = t ?? '';\n\n\t\tif (this.dom) {\n\t\t\t(<HTMLTextAreaElement>this.dom).value = this.m_props.text;\n\n\t\t\tif (this.m_props.autoGrow) {\n\t\t\t\tthis.setAttribute('rows', this._calcHeight(this.m_props.text));\n\t\t\t}\n\t\t}\n\t}\n\t\n\tget text( ): string {\n\t\treturn this.value;\n\t}\n\n\tset text( text: string ) {\n\t\tthis.value = text;\n\t}\n\n\tprivate _calcHeight(text: string): number {\n\t\treturn 1 + (text.match(/\\n/g) || []).length;\n\t}\n\n\tprivate _updateHeight() {\n\t\tconst text = this.value;\n\t\tconst lines = this._calcHeight(text);\n\n\t\tif (this.getData('lines') != lines) {\n\t\t\tthis.setAttribute('rows', lines);\n\t\t\tthis.setData('lines', lines);\n\t\t}\n\t}\n\n\t/**\n\t * @deprected use appendText\n\t * insert text at cursor position\n\t */\n\n\tpublic insertText(text) {\n\t\tthis.appendText( text );\n\t}\n\n\t/**\n\t * append the text\n\t */\n\n\tpublic appendText( text ) {\n\t\tif (this.dom) {\n\t\t\tlet dom = (<HTMLTextAreaElement>this.dom);\n\t\t\tlet end = dom.selectionEnd;\n\t\t\tdom.setRangeText(text,end,end,\"end\");\n\t\t}\n\t}\n\n\tpublic replaceText( text ) {\n\t\tif (this.dom) {\n\t\t\tlet dom = (<HTMLTextAreaElement>this.dom);\n\t\t\tdom.setRangeText(text);\n\t\t}\n\t}\n\n\tpublic getSelection( ) : Selection {\n\t\tif (this.dom) {\n\t\t\tlet dom = (<HTMLTextAreaElement>this.dom);\n\t\t\treturn { start: dom.selectionStart, end: dom.selectionEnd };\n\t\t}\n\t\telse {\n\t\t\treturn {start: 0, end: 0 };\n\t\t}\n\t}\n\n\tpublic setSelection( sel : Selection ) {\n\t\tif (this.dom) {\n\t\t\tlet dom = (<HTMLTextAreaElement>this.dom);\n\t\t\tif( sel.start!==undefined ) {\n\t\t\t\tdom.selectionStart = sel.start;\n\t\t\t}\n\n\t\t\tif( sel.end!==undefined ) {\n\t\t\t\tdom.selectionEnd = sel.end;\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic getStoreValue( ): any {\n\t\treturn this.value;\n\t}\n\n\tpublic setStoreValue( value: any ) {\n\t\tthis.value = value;\n\t}\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file toaster.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { IconID } from './icon';\nimport { Label } from \"./label\";\nimport { Popup, PopupProps} from './popup';\n\n\nexport interface ToasterProps extends PopupProps {\n\tmessage: string;\n\ticon?: IconID;\n}\n\nexport class Toaster extends Popup<ToasterProps> {\n\n\tprivate m_message: string;\n\tprivate m_icon: IconID;\n\n\tconstructor( props: ToasterProps ) {\n\t\tsuper( props );\n\n\t\tthis.m_message = props.message;\n\t\tthis.m_icon = props.icon;\n\t\tthis.enableMask( false );\n\t\tthis.addClass( '@non-maskable' );\n\t}\n\n\t/** @ignore */\t\n\trender( ) {\n\t\tthis.addClass( '@hlayout' );\n\t\tthis.setContent( [\n\t\t\tnew Label( { icon: this.m_icon, text: this.m_message } )\n\t\t]);\n\t}\n\n\tshow( ) {\n\t\tthis.show = super.show;\n\t\tthis.displayAt( 9999, 9999, 'br', {x:0,y:-24} );\n\n\t\tlet opacity = 1.0;\n\n\t\tthis.startTimer( 'fadeout', 2000, false, ( ) => {\n\t\t\t\n\t\t\tthis.startTimer( 'opacity', 100, true, ( ) => {\n\t\t\t\tthis.setStyleValue( 'opacity', opacity );\n\t\t\t\topacity -= 0.1;\n\t\t\t\n\t\t\t\tif( opacity<0 ) {\n\t\t\t\t\tthis.dispose( );\n\t\t\t\t}\n\t\t\t});\n\t\t} );\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file treeview.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Component, Container, ContainerEventMap, ContainerProps, EvDblClick, EventHandler } from './component';\nimport { HtmlString, Rect } from './tools';\nimport { Icon, IconID } from './icon';\nimport { Label } from './label';\nimport { HLayout, VLayout } from './layout';\nimport { EvClick, BasicEvent, EvDrag, EvSelectionChange, EvContextMenu } from './x4events';\n\nexport interface EvExpand extends BasicEvent {\n\tnode: TreeNode;\n}\n\nfunction EvExpand(node: TreeNode) {\n\treturn BasicEvent<EvExpand>({ node });\n}\n\nexport interface HierarchicalNode {\n\tid: number;\n\tname: string;\n\tparent?: number;\n\tcls?: string;\n\tleaf?: boolean\n\ticon?: string;\n\tdata?: any;\n}\n\nexport interface TreeNode {\n\tid: any;\n\ttext?: string | HtmlString;\n\ticon?: IconID;\n\tchildren?: TreeNode[];\n\topen?: boolean;\n\tdata?: any;\n\tparent?: number;\n\tcls?: string;\n}\n\ninterface TreeViewEventMap extends ContainerEventMap {\n\tclick: EvClick;\n\tdblclick: EvDblClick;\n\texpand: EvExpand;\n\tdrag: EvDrag;\n\tselectionchange: EvSelectionChange;\n\tcontextMenu: EvContextMenu;\n}\n\nexport interface TreeViewProps extends ContainerProps<TreeViewEventMap> {\n\troot: TreeNode;\t\t\t// root node\n\tindent?: number;\t\t// items indentation\n\tgadgets?: Component[];\n\tsort?: boolean;\t// sort items\n\tcanDragItems?: boolean;\n\trenderItem?: ( itm: TreeNode ) => Component;\n\n\tdblclick?: EventHandler<EvDblClick>;\n\tselectionchange?: EventHandler<EvSelectionChange>;\n\tdrag?: EventHandler<EvDrag>;\n\tcontextMenu?: EventHandler<EvContextMenu>;\t\n}\n\n\n/**\n * \n */\n\nexport class TreeView extends VLayout<TreeViewProps, TreeViewEventMap> {\n\n\tm_view: Container;\n\tm_container: Container;\n\tm_selection: {\n\t\tid: any;\n\t\tel: Component\n\t};\n\n\tconstructor(props: TreeViewProps) {\n\t\tsuper(props);\n\n\t\tprops.root = props.root;\n\t\tprops.indent = props.indent ?? 8;\n\t\tprops.gadgets = props.gadgets;\n\t\tprops.sort = props.sort ?? false;\n\n\t\tthis.m_selection = null;\n\n\t\tthis.m_container = new Container({ cls: '@scroll-container' });\n\t\tthis.m_view = new Container({\n\t\t\tcls: '@scroll-view',\n\t\t\tflex: 1,\n\t\t\tcontent: this.m_container\n\t\t});\n\n\t\tthis.setContent([\n\t\t\tthis.m_view,\n\t\t\tprops.gadgets ? new HLayout({\n\t\t\t\tcls: 'gadgets',\n\t\t\t\tcontent: props.gadgets\n\t\t\t}) : null,\n\t\t])\n\n\t\tthis.setDomEvent( 'click', (e) => this._click(e) );\n\t\tthis.setDomEvent( 'dblclick', (e) => this._click(e) );\n\t\tthis.setDomEvent('contextmenu', (e) => this._handleCtxMenu(e));\n\t\t\n\t\tif (props.canDragItems) {\n\t\t\tthis.setDomEvent('dragstart', (ev: DragEvent) => {\n\t\t\t\tlet hit = Component.getElement(ev.target as HTMLElement, Component);\n\t\t\t\tlet node = hit?.getData(\"node\");\n\n\t\t\t\tif (node) {\n\t\t\t\t\tev.dataTransfer.effectAllowed = 'move';\n\t\t\t\t\tev.dataTransfer.items.add(JSON.stringify({\n\t\t\t\t\t\ttype: 'treeview',\n\t\t\t\t\t\tid: node.id\n\t\t\t\t\t}), 'string');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tev.preventDefault();\n\t\t\t\t\tev.stopPropagation();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.setDomEvent('dragover', ev => this._dragEnter(ev));\n\t\t\tthis.setDomEvent('dragenter', ev => this._dragEnter(ev));\n\n\t\t\tthis.setDomEvent('dragend', ev => this._dragLeave(ev));\n\t\t\tthis.setDomEvent('dragleave', ev => this._dragLeave(ev));\n\t\t\tthis.setDomEvent('drop', ev => this._dragLeave(ev));\n\n\t\t\tthis.setDomEvent('drop', ev => this._drop(ev) );\n\t\t}\n\n\t\tthis.mapPropEvents(props, 'dblclick', 'drag', 'selectionchange', 'contextMenu' );\n\t}\n\n\tprivate _dragEnter(ev: DragEvent) {\n\t\tev.preventDefault();\n\n\t\tlet hit = Component.getElement(ev.target as HTMLElement, Component);\n\t\tlet node = hit?.getData(\"node\");\n\n\t\tif (node) {\n\t\t\thit.addClass('@drag-over');\n\t\t\tev.dataTransfer.dropEffect = 'move';\n\t\t}\n\t}\n\n\tprivate _dragLeave(ev: Event) {\n\n\t\tlet hit = Component.getElement(ev.target as HTMLElement, Component);\n\t\tlet node = hit?.getData(\"node\");\n\n\t\tif (node) {\n\t\t\thit.removeClass('@drag-over');\n\t\t}\n\t}\n\n\tprivate _drop(ev: DragEvent) {\n\t\tlet hit = Component.getElement(ev.target as HTMLElement, Component);\n\t\tlet node = hit?.getData(\"node\");\n\n\t\tif (!node) {\n\t\t\tnode = this.m_props.root;\n\t\t}\n\n\t\tif (node) {\n\t\t\tlet parent: TreeNode;\n\n\t\t\t// is a folder\n\t\t\tif (node.children) {\n\t\t\t\tparent = node;\n\t\t\t}\n\t\t\t// in it's parent node\n\t\t\telse {\n\t\t\t\tparent = hit.getData(\"parent\");\n\t\t\t}\n\n\t\t\tfor (let i = 0; i < ev.dataTransfer.items.length; i++) {\n\t\t\t\tev.dataTransfer.items[0].getAsString((value) => {\n\t\t\t\t\tlet data = JSON.parse(value);\n\t\t\t\t\tthis.emit('drag', EvDrag( node, data, parent) );\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\trender() {\n\t\tthis.__update( );\n\t}\n\n\tprivate __update( ) {\n\t\tif (this.m_props.root) {\n\t\t\tlet items = [];\n\t\t\tthis._buildBranch(this.m_props.root, -1, items, this.m_props.root);\n\t\t\tthis.m_container.setContent(items);\n\t\t}\n\t}\n\n\tupdateElement( id: any ) {\n\t\tconst { node: child, item } = this._getNode( id );\n\t\tif( child ) {\n\t\t\tconst pn = child.dom.parentNode;\n\t\t\tconst newchild = this._makeNode( item, child.dom.classList.value, child.getData('icon'), child.getData('level') );\n\t\t\tconst dm = newchild._build( );\n\t\t\tpn.replaceChild( dm, child.dom );\n\n\t\t\tif( this.m_selection?.el===child ) {\n\t\t\t\tthis.m_selection.el = newchild;\n\t\t\t}\n\t\t}\n\t}\n\n\tset root(root: TreeNode) {\n\t\tthis.m_props.root = root;\n\t\tthis.update();\n\t}\n\n\topenAll( open = true) {\n\t\tthis.forEach((node: TreeNode) => {\n\t\t\tif( node.children ) {\n\t\t\t\tnode.open = open;\n\t\t\t}\n\t\t});\n\n\t\tthis.__update( )\n\t}\n\n\t/**\n\t * same as root = xxx but keep elements open\n\t */\n\n\trefreshRoot(root: TreeNode) {\n\n\t\tlet openList = [];\n\n\t\tthis.forEach((node: TreeNode): boolean => {\n\t\t\tif (node.open) {\n\t\t\t\topenList.push(node.id);\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\n\t\tlet oldSel = this.selection;\n\t\tif( root ) {\n\t\t\tthis.m_props.root = root;\n\t\t}\n\n\t\tthis.forEach((node: TreeNode): boolean => {\n\n\t\t\tif (openList.indexOf(node.id) >= 0) {\n\t\t\t\tnode.open = true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t});\n\n\t\tthis.__update( );\n\t}\n\n\tprivate _buildBranch(node: TreeNode, level: number, items: Component[], parent: TreeNode) {\n\t\t\n\t\tlet cls = '@tree-item';\n\n\t\tif( node.cls ) {\n\t\t\tcls += ' '+node.cls;\n\t\t}\n\n\t\tif (!node.open && node.children) {\n\t\t\tcls += ' collapsed';\n\t\t}\n\n\t\tif (node.children) {\n\t\t\tcls += ' folder';\n\t\t\tif (node.children.length == 0) {\n\t\t\t\tcls += ' empty';\n\t\t\t}\n\t\t}\n\n\t\tlet icon: IconID = node.icon;\n\t\tif (icon === undefined ) {\n\t\t\tif (node.children) {\n\t\t\t\tif( node.open===true ) {\n\t\t\t\t\ticon = 'var(--x4-icon-chevron-down)';\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ticon = 'var(--x4-icon-chevron-right)';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (level >= 0) {\n\n\t\t\tconst item = this._makeNode( node, cls, icon, level );\n\n\t\t\tif (this.m_selection?.id == node.id) {\n\t\t\t\tthis.m_selection.el = item;\n\t\t\t\titem.addClass('selected');\n\t\t\t}\n\n\t\t\titems.push(item);\n\t\t}\n\n\t\tif (level == -1 || node.open) {\n\t\t\tif (node.children) {\n\n\t\t\t\tif (this.m_props.sort) {\n\t\t\t\t\t// sort items case insensitive:\n\t\t\t\t\t//\tfirst folders\n\t\t\t\t\t//\tthen items \n\t\t\t\t\tnode.children = node.children.sort((a, b) => {\n\t\t\t\t\t\tlet at = (a.children ? '0' + a.text : a.text)?.toLocaleLowerCase();\n\t\t\t\t\t\tlet bt = (b.children ? '0' + b.text : b.text)?.toLocaleLowerCase();\n\t\t\t\t\t\treturn at < bt ? -1 : at > bt ? 1 : 0;\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tnode.children.forEach((c) => {\n\t\t\t\t\tthis._buildBranch(c, level + 1, items, node)\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _renderDef( node: TreeNode ) {\n\t\treturn new Label({ cls: 'tree-label', flex:1, text: node.text });\n\t}\n\n\tprivate _makeNode( node: TreeNode, cls: string, icon: IconID, level: number ): Component {\n\t\t\n\t\tconst item = new HLayout({\n\t\t\tcls,\n\t\t\tcontent: [\n\t\t\t\tnew Icon({ cls: 'tree-icon', icon }),\n\t\t\t\tthis.m_props.renderItem ? this.m_props.renderItem( node ) : this._renderDef( node ),\n\t\t\t],\n\t\t\tdata: {\n\t\t\t\t'node': node,\n\t\t\t\t'level': level,\n\t\t\t\t'icon': icon,\n\t\t\t},\n\t\t\tstyle: {\n\t\t\t\tpaddingLeft: 4 + level * this.m_props.indent\n\t\t\t},\n\t\t\tattrs: {\n\t\t\t\tdraggable: this.m_props.canDragItems ? true : undefined\n\t\t\t},\t\t\t\t\n\t\t});\n\n\n\t\treturn item;\n\t}\n\n\t/**\n\t * \n\t */\n\n\tforEach(cb: (node: TreeNode) => boolean | void ) {\n\t\tlet found = null;\n\n\t\tfunction scan(node) {\n\t\t\tif (cb(node) == true) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (node.children) {\n\t\t\t\tfor (let i = 0; i < node.children.length; i++) {\n\t\t\t\t\tif (scan(node.children[i])) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.m_props.root) {\n\t\t\tscan(this.m_props.root);\n\t\t}\n\n\t\treturn found;\n\t}\n\n\tensureVisible( id: any ) {\n\t\tconst { node } = this._getNode( id );\n\t\tif( node ) {\n\t\t\tnode.scrollIntoView( );\n\t\t}\n\t}\n\n\tset selection(id: any) {\n\t\tthis.select( id, false );\n\t}\n\n\t/**\n\t * care, component should have been created, to select an item at startup,\n\t * use something like \n\t * componentCreated( ) {\n\t * \tmytree.select( id );\n\t * }\n\t */\n\n\tselect( id: any, notify = true ) {\n\t\t\n\t\tif (this.m_selection?.el) {\n\t\t\tthis.m_selection.el.removeClass('selected');\n\t\t}\n\n\t\tthis.m_selection = null;\n\n\t\tif (id !== undefined) {\n\t\t\tconst { node: sel } = this._getNode( id );\n\t\t\tif( sel ) {\n\t\t\t\tthis.m_selection = {\n\t\t\t\t\tid: id,\n\t\t\t\t\tel: sel\n\t\t\t\t};\n\n\t\t\t\tsel.addClass('selected');\n\t\t\t\tsel.scrollIntoView( );\n\n\t\t\t\tif( notify ) {\n\t\t\t\t\tlet nd = sel.getData('node') as TreeNode;\n\t\t\t\t\tthis.emit('selectionchange', EvSelectionChange(nd));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif( notify ) {\n\t\t\t\tthis.emit('selectionchange', EvSelectionChange(null));\n\t\t\t}\n\t\t}\n\t}\n\t\n\n\tprivate _getNode( id ): {node:Component,item:TreeNode} {\n\t\tlet found = { node: null, item: null };\n\n\t\tthis.m_container.enumChilds((c) => {\n\t\t\tlet node = c.getData('node');\n\t\t\tif (node?.id == id) {\n\t\t\t\tfound = {node:c,item:node};\n\t\t\t\treturn true;\n\t\t\t}\n\t\t});\n\n\t\treturn found;\n\t}\n\n\tget selection() {\n\t\treturn this.m_selection?.id;\n\t}\n\n\tgetNodeWithId(id: any): TreeNode {\n\t\treturn this.forEach((node) => node.id == id);\n\t}\n\n\t/**\n\t * \n\t */\n\n\tprivate _click(ev: MouseEvent) {\n\n\t\tlet dom = ev.target as HTMLElement;\n\t\tlet idom = dom;\n\t\tlet onsub = false;\n\n\t\t// avoid getting click on sub childs\n\t\tif( dom.tabIndex!==-1 ) {\n\t\t\tonsub = true;\n\t\t}\n\n\t\twhile (dom != this.dom) {\n\n\t\t\tlet el = Component.getElement(dom);\n\t\t\tlet nd = el?.getData('node') as TreeNode;\n\t\t\tif (nd) {\n\n\t\t\t\tif (nd.children && !onsub ) {\n\t\t\t\t\t// on text or on expando ?\n\t\t\t\t\tif (el.hasClass('selected') || idom.classList.contains('tree-icon') ) {\t//expando\n\t\t\t\t\t\tnd.open = nd.open ? false : true;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.m_selection = { id: nd.id, el: null };\n\n\t\t\t\t\tlet offset = this.m_view?.dom?.scrollTop;\n\t\t\t\t\tthis.update( );\n\t\t\t\t\tif (offset) {\n\t\t\t\t\t\tthis.m_view.dom.scrollTo(0, offset);\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.emit('expand', EvExpand(nd));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.selection = nd.id;\n\n\t\t\t\t\tif( !onsub ) {\n\t\t\t\t\t\tif (ev.type == 'click') {\n\t\t\t\t\t\t\tthis.emit('click', EvClick(nd));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tthis.emit('dblclick', EvDblClick(nd));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.emit('selectionchange', EvSelectionChange(nd));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdom = dom.parentElement;\n\t\t}\n\n\t\tif (ev.type == 'click') {\n\t\t\tthis.m_selection = null;\n\t\t\tthis.update( );\n\t\t\tthis.emit('selectionchange', EvSelectionChange(null) );\t\n\t\t}\n\t}\n\n\tprivate _handleCtxMenu(ev: MouseEvent) {\n\t\tev.preventDefault();\n\t\t\n\t\tlet dom = ev.target as HTMLElement;\n\t\tlet idom = dom;\n\n\t\twhile (dom != this.dom) {\n\n\t\t\tlet el = Component.getElement(dom);\n\t\t\tlet nd = el?.getData('node') as TreeNode;\n\t\t\tif (nd) {\n\t\t\t\tif (nd.children) {\n\t\t\t\t\t// on text or on expando ?\n\t\t\t\t\tif ( idom.classList.contains('tree-icon') ) {\t//expando\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.selection = nd.id;\n\t\t\t\t\n\t\t\t\tthis.emit('click', EvClick(nd) );\n\t\t\t\tthis.emit('contextMenu', EvContextMenu(ev, nd));\n\t\t\t\t\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdom = dom.parentElement;\n\t\t}\n\n\t\tthis.selection = null;\n\t\tthis.emit('contextMenu', EvContextMenu(ev, null));\n\t}\n\n\t/**\n\t * constructs a tree node from an array of strings\n\t * elements are organized like folders (separator = /)\n\t * @example\n\t * let root = TreeView.buildFromString( [\n\t * \t'this/is/a/final/file'\n\t * 'this/is/another/file'\n\t * ] );\n\t */\n\n\tstatic buildFromStrings(paths: string[], separator = '/'): TreeNode {\n\n\t\tlet root: TreeNode = {\n\t\t\tid: 0,\n\t\t\ttext: '<root>',\n\t\t\tchildren: []\n\t\t};\n\n\t\tfunction insert(elements: TreeNode[], path: string) {\n\n\t\t\tlet pos = path.indexOf(separator);\n\t\t\tlet main = path.substr(0, pos < 0 ? undefined : pos);\n\n\t\t\tlet elem: TreeNode;\n\n\t\t\tif (pos >= 0) {\n\t\t\t\telem = elements.find((el) => {\n\t\t\t\t\treturn el.text == main;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (!elem) {\n\t\t\t\telem = {\n\t\t\t\t\tid: path,\n\t\t\t\t\ttext: main,\n\t\t\t\t};\n\n\t\t\t\telements.push(elem);\n\t\t\t}\n\n\t\t\tif (pos >= 0) {\n\t\t\t\tif (!elem.children) {\n\t\t\t\t\telem.children = [];\n\t\t\t\t}\n\n\t\t\t\tinsert(elem.children, path.substr(pos + separator.length));\n\t\t\t}\n\t\t}\n\n\t\tpaths.forEach((path) => {\n\t\t\tinsert(root.children, path);\n\t\t});\n\n\t\treturn root;\n\t}\n\n\t/**\n\t * constructs a tree node from an array of nodes like\n\t * node {\n\t * \tid: number,\n\t * parent: number,\n\t * name: string\n\t * }\n\t */\n\n\tstatic buildFromHierarchy(nodes: HierarchicalNode[], cb?: (node: TreeNode) => void): TreeNode {\n\n\t\tlet root: TreeNode = {\n\t\t\tid: 0,\n\t\t\ttext: '<root>',\n\t\t\tchildren: []\n\t\t};\n\n\t\tlet tree_nodes: TreeNode[] = [];\n\n\t\tfunction insert(node: HierarchicalNode) {\n\n\t\t\tlet elem: TreeNode;\n\t\t\tlet pelem: TreeNode;\n\n\t\t\tif (node.parent > 0) {\n\t\t\t\tpelem = tree_nodes.find((tnode: TreeNode) => tnode.id == node.parent);\n\n\t\t\t\tif (!pelem) {\n\t\t\t\t\tpelem = {\n\t\t\t\t\t\tid: node.parent,\n\t\t\t\t\t\ttext: '',\n\t\t\t\t\t\tchildren: []\n\t\t\t\t\t};\n\n\t\t\t\t\ttree_nodes.push(pelem);\n\t\t\t\t}\n\n\t\t\t\tif (!pelem.children) {\n\t\t\t\t\tpelem.children = [];\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tpelem = root;\n\t\t\t}\n\n\t\t\telem = tree_nodes.find((tnode: TreeNode) => tnode.id == node.id);\n\t\t\tif (!elem) {\n\t\t\t\telem = {\n\t\t\t\t\tid: node.id,\n\t\t\t\t\ttext: node.name,\n\t\t\t\t\tparent: node.parent,\n\t\t\t\t\tcls: node.cls,\n\t\t\t\t\ticon: node.icon,\n\t\t\t\t\tdata: node.data,\n\t\t\t\t};\n\n\t\t\t\tif (!node.leaf) {\n\t\t\t\t\telem.children = [];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\telem.icon = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\telem.text = node.name;\n\t\t\t\telem.parent = node.parent;\n\t\t\t}\n\n\t\t\ttree_nodes.push(elem);\n\t\t\tpelem.children.push(elem)\n\t\t}\n\n\t\tnodes.forEach(insert);\n\t\tif (cb) {\n\t\t\ttree_nodes.forEach(cb);\n\t\t}\n\n\t\treturn root;\n\t}\n}\n\n\n", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file x4react.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Component, ComponentContent, CProps, CEventMap } from './component';\n\n\nconst createElement = ( clsOrTag, attrs, ...children ): ComponentContent => {\n\n\tlet comp: Component;\n\n\t// fragment\n\tif( clsOrTag==createFragment || clsOrTag==Fragment ) {\n\t\treturn children;\n\t}\n\t// class constructor, yes : dirty\n\telse if( clsOrTag instanceof Function ) {\n\t\tcomp = new (clsOrTag as any)( attrs );\n\t}\n\t// basic tag\n\telse {\n\t\tcomp = new Component( {\n\t\t\ttag: clsOrTag,\n\t\t\t...attrs,\n\t\t});\n\t}\n\n\tif( children && children.length ) {\n\t\tcomp.setContent( children );\n\t}\n\n\treturn comp;\n}\n\nconst Fragment = Symbol( \"fragment\" );\n\nconst createFragment = ( ): ComponentContent => {\n\treturn null;\n}\n\nexport let React = {\n\tcreateElement,\n\tcreateFragment,\n\tFragment,\n}\n\n\n\n\n\n/**\n * \n */\n\n export abstract class TSXComponent<P extends CProps<CEventMap> = CProps<CEventMap>, E extends CEventMap = CEventMap> extends Component<P,E> {\n\tpublic render(props: P) {\n\t\tconst tsx = this.renderTSX( props );\n\t\tif( tsx ) {\n\t\t\tthis.setContent( tsx );\n\t\t}\n\t}\n\n\tpublic abstract renderTSX( props: P ): Component | Component[];\n}\n\n", "/**\n* ___ ___ __\n* \\ \\/ / / _\n* \\ / /_| |_\n* / \\____ _| \n* /__/\\__\\ |_|\n* \n* @file app_sockets.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nimport { Application } from \"./application\"\nimport { EvMessage } from \"./x4events\"\n\n/**\n * WEB SOCKETS\n * \n * les messages re\u00E7us par l'application sont retransmis au websocket.\n * comme \u00E7a, tous les clients connect\u00E9s sur le serveur recevront une copie du message.\n * ca permet de mettre a jour les clients dynamiquement\n * \n */\n\nconst msg_sent = Symbol( 'msg_sent' );\n\nexport function setupWSMessaging( closeCB: ( ) => void ) {\n\tconst protocol = window.location.protocol === 'https:' ? 'wss://' : 'ws://';\n\tconst sockets = new WebSocket( `${protocol}${window.location.hostname}:${window.location.port}`, 'messaging' );\n\n\tconst app = Application.instance( );\n\n\t// pour tous les messages recus par l'application\n\t//\ton transmet aux autres\n\tapp.on( 'global', ( e: EvMessage ) => {\n\t\tif( (e as any)[msg_sent] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tsockets.send( JSON.stringify( {\n\t\t\tmsg: e.msg,\n\t\t\tparams: e.params,\n\t\t} ) );\n\t});\n\n\t// reception d'un message\n\tsockets.onmessage = ( e ) => {\n\t\tif( e.data!='ping' ) {\n\t\t\tconst message = JSON.parse(e.data);\n\t\t\tmessage[msg_sent] = true;\n\t\t\tapp.signal( 'global', message );\n\t\t}\n\t}\n\n\t// perte du socket\n\tsockets.onclose = ( ev ) => {\n\t\tconsole.log( 'websocket closed:', ev );\n\t\tcloseCB( );\n\t}\n\n\tsockets.onerror = (ev )=> {\n\t\tconsole.log( 'websocket error:', ev );\n\t}\n}", "/**\n* ___ ___ __\n* \\ \\_/ / / _\n* \\ / /_| |_\n* / _ \\____ _| \n* /__/ \\__\\ |_|\n* \n* @file version.ts\n* @author Etienne Cochard \n*\n* Copyright (c) 2019-2023 R-libre ingenierie\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy \n* of this software and associated documentation files (the \"Software\"), to deal \n* in the Software without restriction, including without limitation the rights \n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \n* of the Software, and to permit persons to whom the Software is furnished to do so, \n* subject to the following conditions:\n* The above copyright notice and this permission notice shall be included in all copies\n* or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \n* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \n* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n\nexport const x4js_version = \"1.6.1\";"],
5
+ "mappings": "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,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,CACD,CACD,EACA,CACC,MAAO,OACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,CACD,CACD,EACA,CACC,MAAO,SACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,CACD,CACD,EACA,CACC,MAAO,cACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,CACD,CACD,EACA,CACC,MAAO,SACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,CACD,CACD,EACA,CACC,MAAO,OACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,MACN,CACD,CACD,EACA,CACC,MAAO,aACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,MACN,EACA,CACC,OAAQ,IACR,IAAK,MACN,EACA,CACC,OAAQ,IACR,IAAK,MACN,EACA,CACC,OAAQ,IACR,IAAK,MACN,EACA,CACC,OAAQ,IACR,IAAK,KACN,CACD,CACD,EACA,CACC,MAAO,OACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,KACN,EACA,CACC,OAAQ,IACR,IAAK,KACN,EACA,CACC,OAAQ,IACR,IAAK,KACN,EACA,CACC,OAAQ,IACR,IAAK,KACN,EACA,CACC,OAAQ,IACR,IAAK,KACN,CACD,CACD,EACA,CACC,MAAO,OACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,KACN,EACA,CACC,OAAQ,IACR,IAAK,KACN,EACA,CACC,OAAQ,IACR,IAAK,KACN,EACA,CACC,OAAQ,IACR,IAAK,KACN,EACA,CACC,OAAQ,IACR,IAAK,KACN,CACD,CACD,EACA,CACC,MAAO,QACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,CACD,CACD,EACA,CACC,MAAO,cACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,CACD,CACD,EACA,CACC,MAAO,OACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,CACD,CACD,EACA,CACC,MAAO,SACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,CACD,CACD,EACA,CACC,MAAO,QACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,CACD,CACD,EACA,CACC,MAAO,SACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,CACD,CACD,EACA,CACC,MAAO,cACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,CACD,CACD,EACA,CACC,MAAO,QACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,CACD,CACD,EACA,CACC,MAAO,OACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,CACD,CACD,EACA,CACC,MAAO,YACP,WAAY,CACX,CACC,OAAQ,GACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,QACN,EACA,CACC,OAAQ,IACR,IAAK,OACN,EACA,CACC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",
6
+ "names": ["x4js_exports", "__export", "AbsLayout", "Application", "AutoComplete", "AutoLayout", "AutoRecord", "BaseButton", "BaseComponent", "BasicEvent", "Button", "CSSParser", "Calendar", "Canvas", "CardView", "CheckBox", "Clipboard", "Color", "ColorPicker", "ColorPickerBox", "ColorPickerEditor", "ComboBox", "Component", "ComputedStyle", "Container", "DataProxy", "DataStore", "DataView", "Dialog", "EvBtnClick", "EvCancel", "EvChange", "EvClick", "EvContextMenu", "EvDataChange", "EvDblClick", "EvDrag", "EvError", "EvFocus", "EvGridCheck", "EvLoaded", "EvMessage", "EvMove", "EvOverlayResize", "EvSelectionChange", "EvSize", "EvTimer", "EvViewChange", "EventSource", "FileUpload", "Flex", "Form", "GridLayout", "GridView", "HLayout", "HtmlString", "Icon", "Image", "ImageUpload", "Input", "Label", "Link", "ListView", "Masonry", "Md5", "Menu", "MenuBar", "MenuItem", "MenuSeparator", "MenuTitle", "MessageBox", "NetworkError", "Panel", "Point", "Popup", "PopupCalendar", "PopupListView", "PromptDialogBox", "PropertyEditor", "RadioBtn", "Rating", "React", "Record", "Rect", "Router", "SVGComponent", "SVGGradient", "SVGGroup", "SVGItem", "SVGPath", "SVGPathBuilder", "SVGShape", "SVGText", "ScrollView", "Separator", "Settings", "SideBarView", "Size", "SizerOverlay", "Space", "Spreadsheet", "Stylesheet", "TSXComponent", "TabBar", "TabView", "TableLayout", "TextArea", "TextEdit", "Toaster", "ToggleButton", "Tooltip", "TreeView", "VLayout", "_date_set_locale", "_tr", "_x4_unitless", "addTranslation", "ajax", "ajaxAsJSON", "ajaxAsText", "ajaxRequest", "asap", "bool_formatter", "calcAge", "camelCase", "clamp", "classNames", "crc32", "createLanguage", "data", "date_calc_weeknum", "date_clone", "date_diff", "date_format", "date_formatter", "date_hash", "date_sql_utc", "date_to_sql", "deferCall", "downloadData", "dragManager", "drawText", "escapeHtml", "flyWrap", "formatIntlDate", "generatePassword", "getAvailableLanguages", "getCurrentLanguage", "getMousePos", "html", "initTooltips", "installHMR", "isArray", "isFunction", "isHtmlString", "isLanguage", "isLiteralObject", "isNumber", "isString", "isTouchDevice", "markdownToHtml", "mix", "money_formatter", "money_formatter_nz", "openFileDialog", "pad", "parseIntlDate", "parseIntlFloat", "pascalCase", "removeHtmlTags", "roundTo", "saveFileDialog", "selectLanguage", "setCurrencySymbol", "setupWSMessaging", "sprintf", "sql_date_formatter", "waitFontLoading", "x4app", "x4js_version", "__toCommonJS", "x4document", "stopPropagation", "__name", "preventDefault", "BasicEvent", "params", "EvClick", "context", "EvChange", "value", "EvSelectionChange", "selection", "EvContextMenu", "uievent", "EvTimer", "timer", "time", "EvMessage", "msg", "source", "EvDrag", "element", "data", "ctx", "EvError", "code", "message", "EventSource", "type", "event", "eventName", "e", "listeners", "defaultHandler", "temp", "i", "n", "delay", "call", "callback", "newCallback", "ev", "resolve", "handlers", "stack", "idx", "events", "capturing", "BaseComponent", "EventSource", "#m_timers", "props", "name", "timeout", "repeat", "callback", "id", "tm", "EvTimer", "clear", "v", "elements", "n", "__name", "sym_lang", "languages", "createLanguage", "name", "base", "__name", "isLanguage", "addTranslation", "parts", "lang", "p", "_patch", "_proxyfy", "obj", "by", "n", "src", "root", "result", "_mk_proxy", "target", "prop", "req_path", "value", "_findBaseTrans", "trans", "_tr", "selectLanguage", "getCurrentLanguage", "getAvailableLanguages", "fr", "en", "isTouchDevice", "__name", "roundTo", "num", "ndec", "mul", "res", "parseIntlFloat", "pascalCase", "string", "result", "__name", "camelCase", "text", "m", "chr", "Point", "x", "y", "Size", "w", "h", "Rect", "left", "top", "width", "height", "rc", "bottom", "right", "dx", "dy", "arg", "sprintf", "format", "args", "match", "index", "escapeHtml", "unsafe", "nl_br", "c", "removeHtmlTags", "isString", "ret_val", "ch", "cur_locale", "_date_set_locale", "locale", "date_format", "date", "options", "formatIntlDate", "date_diff", "date1", "date2", "dt", "sec", "_tr", "min", "hrs", "date_to_sql", "withHours", "date_sql_utc", "date_hash", "date_clone", "date_calc_weeknum", "firstDayOfYear", "pastDaysOfYear", "parseIntlDate", "value", "fmts", "formats", "fmatch", "smatch", "now", "d", "i", "s", "ty", "tm", "td", "fmt", "esc", "pad", "calcAge", "birth", "ref", "age", "days", "downloadData", "data", "mimetype", "filename", "blob", "url", "a", "x4document", "val", "isArray", "isFunction", "isLiteralObject", "what", "size", "isNumber", "waitFontLoading", "name", "ct", "resolve", "irc", "deferCall", "fn", "asap", "cb", "markdownToHtml", "lines", "state", "div", "l", "txt", "lvl", "reBold", "sub", "reItalic", "NetworkError", "b", "getMousePos", "ev", "fromDoc", "x_name", "y_name", "em", "et", "clamp", "v", "max", "HtmlString", "html", "isHtmlString", "Clipboard", "crc32", "str", "crc", "buf", "crc32tab", "mix", "superclass", "MixinBuilder", "mixins", "mixin", "classNames", "cls", "generatePassword", "length", "rules", "allChars", "allMin", "rule", "pswd", "shuffle", "maxlength", "shuffled", "installHMR", "host", "port", "reloadCallback", "refreshCSS", "sheets", "head", "elem", "rel", "address", "socket", "msg", "_Stylesheet", "getStyleSheet", "name", "x4document", "sheet", "__name", "dom", "definition", "isString", "index", "idx", "r", "rule", "css", "i", "values", "j", "Stylesheet", "__publicField", "CSSParser", "rules", "ret", "a", "scope", "property", "value", "isArray", "n", "pascalCase", "snames", "names", "scopes", "s", "sub", "properties", "browser_specials", "ComputedStyle", "style", "_x4_ns_prefix", "_x4_el_store", "_x4_el_sym", "_x4_unitless", "unbubbleEvents", "passiveEvents", "reNumber", "EvDblClick", "context", "BasicEvent", "__name", "EvFocus", "focus", "_Component", "BaseComponent", "props", "content", "refreshAll", "append", "c", "isArray", "item", "x", "tag", "namespace", "name", "value", "data", "show", "enable", "style", "s", "isNumber", "pseudoElt", "ComputedStyle", "attrs", "a", "add", "classes", "remove", "cls", "set", "toggle", "ename", "vdom", "x4document", "sty", "att", "attr", "evt", "e", "handlers", "h", "el", "isString", "isHtmlString", "tabIndex", "defValue", "mutations", "notify", "mutation", "i", "with_dom", "timers", "_dom", "delay", "_update", "oldDOM", "newDOM", "withMargins", "r", "rc", "Rect", "st", "tm", "bm", "lm", "rm", "type", "listener", "passive", "_listener", "listeners", "store", "handler", "ev", "target", "noup", "root", "fn", "eventType", "eventStore", "entries", "entry", "dom", "cb", "recursive", "cel", "component", "me", "clsname", "pascalCase", "event", "initiator", "iframes", "f", "flyWrap", "overs", "cursor", "elementOver", "mask", "arg", "rel", "top", "bot", "left", "right", "pn", "bdy", "pr", "selector", "result", "elements", "id", "ref", "Stylesheet", "elParent", "classname", "srhCls", "outerDiv", "innerDiv", "Component", "__publicField", "fly_element", "Flex", "Space", "size", "EvSize", "mode", "Separator", "te", "y", "__move", "ex", "ey", "width", "Size", "height", "mev", "tev", "prevDom", "prevEl", "nextDom", "nextEl", "EvOverlayResize", "ui_event", "sens", "SizerOverlay", "eev", "pos", "getMousePos", "EvShortcut", "Container", "sequence", "callback", "immediate", "seq", "reseq", "sk", "asap", "Settings", "name", "value", "defValue", "data", "__name", "parseRoute", "str", "loose", "arr", "keys", "pattern", "tmp", "c", "o", "ext", "__name", "Router", "EventSource", "useHash", "event", "url", "found", "h", "uri", "handler", "x4document", "notify", "replace", "EvError", "matches", "params", "handlers", "j", "k", "_x4_touch_time", "_Application", "BaseComponent", "props", "settings_name", "Settings", "x4app", "Router", "root", "clearBefore", "ddom", "x4document", "dest", "flyWrap", "title", "ev", "enter", "now", "tch", "fake", "Component", "Application", "__name", "__publicField", "AbsLayout", "Container", "__name", "HLayout", "VLayout", "AutoLayout", "props", "horz", "rc", "GridLayout", "TableLayout", "row", "col", "create", "idx", "_mkid", "cell", "update", "Component", "c", "item", "data", "rowCount", "colCount", "width", "height", "cls", "rows", "skip", "r", "cols", "cdata", "cc", "rs", "cs", "sr", "sc", "rdata", "rr", "ScrollView", "Component", "props", "content", "container", "isArray", "VLayout", "__name", "Masonry", "Container", "items", "item", "style", "rowHeight", "rowGap", "rc", "rowSpan", "itm", "EvMove", "pos", "BasicEvent", "__name", "_Popup", "Container", "props", "enable", "modal", "focus", "x4document", "elUI", "flyWrap", "Application", "autofocus", "tabbable", "el", "rc", "x", "y", "align", "offset", "halign", "valign", "rm", "index", "els", "sens", "SizerOverlay", "e", "event", "irc", "st", "ev", "tm", "lm", "bm", "ix", "iy", "mp", "getMousePos", "Component", "ne", "__move", "ex", "ey", "left", "top", "width", "height", "dx", "dy", "px", "py", "newsize", "Size", "EvSize", "me", "tev", "Popup", "__publicField", "x4handleKeyDown", "target", "topStack", "_nextTab", "root", "prev", "focusEl", "comp", "tab_indexes", "ct", "installKBHandler", "EvAction", "source", "BasicEvent", "__name", "Action", "BaseComponent", "props", "t", "EvChange", "i", "EvLoaded", "url", "svg", "context", "BasicEvent", "__name", "trimQuotes", "str", "l", "Loader", "EventSource", "r", "svgLoader", "_Icon", "Component", "props", "isString", "icon", "remove_old", "name", "reVar", "match_var", "varname", "Stylesheet", "reSvg", "reSvg2", "match_svg", "match_dta", "match_cls", "classes", "match_url", "match_char", "css", "rulename", "rule", "set", "ev", "HtmlString", "pth", "Icon", "__publicField", "Label", "Component", "param", "HtmlString", "props", "text", "escapeHtml", "Icon", "txt", "comp", "icon", "ico", "__name", "MenuSeparator", "Component", "__name", "MenuTitle", "Label", "_Menu", "Popup", "props", "opener", "yes", "menu", "x4document", "ev", "elOn", "mouseon", "args", "x", "y", "align", "offset", "getMousePos", "Menu", "__publicField", "MenuItem", "a", "b", "Action", "isString", "e", "icon", "text", "popIco", "Icon", "EvClick", "doClose", "parent_menu", "rc", "MenuBar", "HLayout", "ListView", "VLayout", "props", "e", "items", "keepSel", "ev", "moveSel", "__name", "sens", "isFunction", "newsel", "index", "item", "citem", "Container", "HLayout", "forceUpdate", "update", "newTop", "list_items", "selId", "selFnd", "rc", "limit", "y", "top", "height", "count", "newels", "cache", "it", "itm", "c", "t", "newItem", "dom", "self", "Component", "id", "event", "EvClick", "EvDblClick", "EvContextMenu", "notify", "EvSelectionChange", "prepend", "select", "idx", "was_sel", "oldDOM", "_new", "newDOM", "EvCancel", "context", "BasicEvent", "PopupListView", "Popup", "newfocus", "MenuItem", "modal", "x4document", "itemId", "tipTmo", "tooltip", "Tooltip", "Component", "text", "Icon", "Label", "x", "y", "align", "halign", "valign", "rc", "x4document", "rm", "__name", "initTooltips", "cb", "isTouchDevice", "tipTarget", "handle_mpos", "event", "handle_mouse", "target", "tip", "_hideTip", "Input", "Component", "props", "text", "Tooltip", "x4document", "rc", "dom", "upper", "value", "type", "files", "file", "v", "newval", "ro", "start", "length", "idom", "__name", "BaseButton", "Component", "props", "e", "action", "icon", "text", "ui_icon", "Icon", "ui_label", "Label", "ui_ricon", "start", "ev", "menu", "Menu", "isFunction", "rc", "EvClick", "label", "ico", "items", "__name", "Button", "ToggleButton", "EvChange", "ic", "Calendar", "VLayout", "props", "month_start", "date_clone", "day", "dte", "today", "month_end", "end_of_month", "date_hash", "rows", "header", "HLayout", "Label", "formatIntlDate", "Flex", "Button", "day_names", "d", "_tr", "cmonth", "first", "days", "Component", "cls", "mkItem", "__name", "date", "EvChange", "n", "type", "items", "m", "MenuItem", "min", "max", "menu", "Menu", "rc", "PopupCalendar", "Popup", "newfocus", "modal", "at", "x4document", "reEmail", "TextEdit", "Component", "props", "eprops", "def_hook", "e", "Input", "button", "Button", "ag", "b", "gadgets", "width", "flex", "labelWidth", "label", "labelAlign", "top", "Label", "HLayout", "ena", "EvClick", "fmt", "value", "date", "parseIntlDate", "formatIntlDate", "dte", "text", "start", "length", "ro", "EvChange", "EvFocus", "update", "_tr", "pattern", "re", "v", "min", "max", "err", "sprintf", "btn", "PopupCalendar", "ev", "rc", "__name", "AutoComplete", "TextEdit", "props", "e", "items", "show", "cstyle", "fontFamily", "fontSize", "PopupListView", "value", "c", "r1", "focus", "__name", "EvPaint", "ctx", "BasicEvent", "__name", "mkPainter", "c2d", "w", "h", "cp", "smoothLine", "smoothLineEx", "line", "roundRect", "calcTextSize", "setFontSize", "circle", "points", "path", "move", "midPointBtw", "p1", "p2", "getQuadraticXY", "t", "sx", "sy", "cp1x", "cp1y", "ex", "ey", "p3", "i", "len", "midPoint", "x", "y", "_points", "tension", "numOfSeg", "close", "p", "pc", "pts", "l", "rPos", "rLen", "res", "cache", "cachePtr", "st", "st2", "st3", "st23", "st32", "parse", "pt1", "pt2", "pt3", "pt4", "t1x", "t1y", "t2x", "t2y", "c", "c1", "c2", "c3", "c4", "x1", "y1", "x2", "y2", "color", "lineWidth", "width", "height", "radius", "text", "rounded", "fh", "lh", "fs", "fsize", "Canvas", "Component", "props", "delay", "scale", "wait", "dom", "canvas", "devicePixelRatio", "backingStoreRatio", "ratio", "rw", "rh", "cc", "CardView", "Component", "props", "pages", "p", "name", "page", "card", "isFunction", "EvChange", "active", "asap", "__name", "CheckBox", "Component", "props", "labelWidth", "uid", "Input", "Label", "EvChange", "ck", "dom", "text", "__name", "colorValues", "_Color", "r", "g", "b", "a", "argc", "self", "_init", "base", "alpha", "__name", "percent", "p", "v", "c1", "c2", "e1", "e2", "A", "R", "G", "B", "f", "el", "h", "s", "i", "q", "t", "c", "max", "min", "delta", "saturation", "value", "hue", "l", "hue2rgb", "color", "minval", "maxval", "rnorm", "gnorm", "bnorm", "mdiff", "msum", "light", "satur", "with_alpha", "_hx", "name", "Stylesheet", "str", "m", "gr", "std", "varName", "Color", "__publicField", "n", "DEFAULT_TIMEOUT", "ajaxRequest", "cfg", "params", "url", "method", "formdata", "buildQuery", "xhr", "progress", "failure", "success", "h", "ev", "disp", "humanSize", "e", "__name", "bytes", "unit", "value", "getMethod", "query", "key", "param", "isArray", "i", "n", "result", "ajaxAsJSON", "init", "ajax", "ajaxAsText", "type", "options", "isString", "cvt", "isLiteralObject", "response", "NetworkError", "EvDataChange", "type", "id", "BasicEvent", "__name", "MetaInfos", "name", "metaFields", "_getMetas", "obj", "create", "ctor", "mfld", "pctor", "Record", "pmetas", "data", "ownerCls", "fldName", "metas", "field", "string", "props", "int", "float", "bool", "date", "calc", "array", "source", "rec", "errs", "fi", "fd", "f", "fields", "sf", "value", "input", "ffv", "mul", "isString", "result", "v", "idx", "fld", "AutoRecord", "fnames", "n", "DataProxy", "BaseComponent", "url", "r", "raw", "json", "EvChange", "DataStore", "EventSource", "ev", "records", "realRecords", "index", "maxID", "rid", "lim", "base", "p", "other", "opts", "eopts", "DataView", "filter", "iidx", "fn", "_lt", "recval", "filterValue", "_le", "_eq", "_neq", "_ge", "_gt", "_re", "filterRe", "filterFld", "filterFn", "sort", "bads", "fidxs", "si", "ia", "ib", "va", "vb", "fidx", "cb", "ri", "EvViewChange", "action", "isArray", "e", "notify", "ridx", "ComboBox", "HLayout", "props", "e", "items", "Component", "input", "Input", "v", "text", "width", "flex", "labelWidth", "Label", "Button", "filter_items", "isFunction", "filter", "cstyle", "fontFamily", "fontSize", "PopupListView", "r1", "r2", "_tr", "ev", "item", "EvSelectionChange", "EvChange", "fireEv", "id", "focus", "view", "DataStore", "result", "rec", "index", "__name", "Form", "VLayout", "props", "content", "height", "items", "buttons", "els", "refreshAll", "name", "enable", "button", "HLayout", "btns", "b", "Component", "Button", "_tr", "inputs", "result", "input", "TextEdit", "combo", "ComboBox", "btn", "EvBtnClick", "values", "elements", "e", "item", "type", "el", "value", "cfg", "cbvalidation", "form", "ajaxRequest", "flyWrap", "set", "__name", "EvBtnClick", "button", "BasicEvent", "__name", "Dialog", "Popup", "props", "content", "width", "height", "isFunction", "e", "Form", "ev", "rc", "EvSize", "geom", "Rect", "hasTitle", "HLayout", "Icon", "Label", "isTouchDevice", "els", "refreshAll", "buttons", "event", "x", "y", "getMousePos", "wrc", "flyWrap", "x4document", "dx", "dy", "now", "delta", "__move", "ex", "ey", "Component", "mev", "tev", "EvMove", "saveRect", "title", "name", "result", "_ColorPicker", "Container", "props", "e", "menu", "Menu", "MenuItem", "pt", "getMousePos", "Color", "fillSubs", "colors", "sub_sel", "mc", "clr", "selected", "ccolor", "cls", "classNames", "el", "Component", "cur", "selector", "__name", "main_sel", "materialColors", "color", "c", "VLayout", "HLayout", "TextEdit", "ev", "CheckBox", "cell", "subs", "rc", "clamp", "edit", "gradient", "EvChange", "ColorPicker", "__publicField", "ColorPickerBox", "Dialog", "customs", "cc", "custom", "els", "i", "lne", "j", "idx", "Label", "msg", "isString", "ColorPickerEditor", "tcolor", "v", "dlg", "x_drag_cb", "DragManager", "el", "ev", "x4document", "cb", "filterCB", "dragEnter", "__name", "dragOver", "infos", "Point", "dragLeave", "drop", "leaving", "x", "entering", "dragManager", "defStyle", "drawText", "ctx", "input_Text", "rc", "drawStyle", "center", "Point", "rad", "fontSize", "roundTo", "style", "family", "textarray", "lines", "columns", "gap", "col_width", "col_left", "hlimit", "spaceW", "_measureText", "text", "line", "lwidth", "words", "w", "n", "e", "word", "test", "textSize", "_calcTextHeight", "lineHeight", "nlines", "col_top", "fullHeight", "justify", "column", "y", "align", "maxw", "_justify", "x", "cw", "__name", "size", "width", "delta", "emptyImageSrc", "_isStaticImage", "src", "__name", "_Image", "Component", "props", "mp", "x", "force", "newList", "done", "lazy", "dom", "rc", "x4document", "Image", "__publicField", "FileUpload", "HLayout", "props", "__name", "ImageUpload", "ename", "Component", "Image", "Input", "v", "e", "self", "createThumbnail", "file", "reader", "allowedTypes", "files", "filesLen", "i", "imgType", "g_file_input", "_createFileInput", "x4document", "openFileDialog", "extensions", "cb", "multiple", "fi", "evt", "saveFileDialog", "defFileName", "locale", "moneyFmt", "setCurrencySymbol", "symbol", "__name", "sql_date_formatter", "input", "dte", "options", "date_formatter", "formatIntlDate", "money_formatter", "val", "roundTo", "money_formatter_nz", "bool_formatter", "T_UPDATE", "EvGridCheck", "rec", "chk", "BasicEvent", "__name", "ColHeader", "Component", "props", "title", "Icon", "v", "sens", "ic", "GridView", "VLayout", "e", "_tr", "select", "sel", "scrolltype", "index", "event", "id", "itm", "store", "DataStore", "ev", "recId", "Label", "flex", "cols", "col", "cls", "comp", "flyWrap", "resizeCol", "SizerOverlay", "Flex", "full_width", "HLayout", "foots", "width", "_col", "updateFlex", "c", "name", "asc", "$hdr", "gr", "x4document", "gv", "rc", "row", "n", "canOpt", "rh", "height", "top", "y", "cidx", "count", "even", "w", "limit", "rowid", "crow", "r", "rrow", "cell", "fmt", "text", "html", "show", "msg", "forceUpdate", "update", "newTop", "newLeft", "dom", "self", "hit", "EvDblClick", "idx", "i", "item", "dom_item", "scrollIntoView", "old", "EvSelectionChange", "EvContextMenu", "filename", "data", "fsep", "lsep", "record", "downloadData", "icon", "ids", "cid", "value", "isFunction", "Link", "Component", "props", "EvClick", "text", "href", "isHtmlString", "html", "__name", "_Md5", "str", "raw", "x", "hc", "ho", "n", "offset", "j", "i", "k", "a", "b", "c", "d", "buf8", "buf32", "bufLen", "code", "input", "self", "s", "state", "buf", "dataBitsLen", "matches", "lo", "hi", "Md5", "__name", "__publicField", "MessageBox", "Dialog", "props", "icon", "buttons", "msg", "HLayout", "Icon", "Label", "ev", "asap", "txt", "isString", "isHtmlString", "resolve", "reject", "_props", "cb", "__name", "btn", "text", "title", "PromptDialogBox", "TextEdit", "inputCallback", "Panel", "VLayout", "props", "sens", "Label", "Component", "gadgets", "icon", "Icon", "HLayout", "els", "text", "__name", "CellData", "__name", "__publicField", "Spreadsheet", "VLayout", "props", "e", "col", "width", "title", "columns", "before", "new_cells_data", "celldata", "key", "row", "_getid", "_mkid", "new_rows_data", "rowdata", "rowtodel", "column", "inspos", "coltodel", "raw", "value", "focus", "dom", "self", "itm", "Component", "EvContextMenu", "cols", "index", "comp", "SizerOverlay", "ev", "HLayout", "g1", "x4document", "g2", "g3", "rc", "fullw", "nwide", "calcw", "calcz", "calcm", "colIdx", "minw", "cw", "z", "restw", "i", "rest", "cell", "rh", "height", "top", "y", "cidx", "rowIdx", "count", "right_pos", "w", "even", "c", "full_width", "limit", "x", "cls", "text", "EvDblClick", "scrollIntoView", "lastcol", "doscroll", "mode", "last", "forceUpdate", "newTop", "newLeft", "sensy", "sensx", "sel", "newRow", "newCol", "l1", "trys", "l2", "event", "oldSel", "newSel", "EvSelectionChange", "max_row", "uid", "parseIntlFloat", "forceText", "forcedText", "place", "parent", "prc", "edtBuilder", "TextEdit", "cellvalue", "movesel", "deferCall", "input", "sens", "ComboBox", "save", "id", "old", "EvChange", "asap", "start", "PropertyEditor", "Component", "props", "Spreadsheet", "_tr", "a", "e", "fields", "record", "fld", "lno", "ev", "ctx", "text", "EvChange", "rec", "row", "col", "editor", "TextEdit", "Input", "CheckBox", "values", "view", "field", "choices", "i", "__name", "RadioBtn", "Component", "props", "text", "name", "labelWidth", "checked", "align", "value", "icon", "Input", "Label", "query", "x4document", "dom", "EvChange", "ck", "__name", "Rating", "HLayout", "props", "shape", "value", "Input", "e", "i", "cls", "c", "Component", "v", "n", "ev", "on", "el", "comp", "EvChange", "__name", "SideBarView", "CardView", "props", "VLayout", "HLayout", "tabs", "p", "Separator", "card", "Button", "page", "__name", "reNumber", "d2r", "d", "__name", "p2c", "x", "y", "r", "deg", "rad", "num", "clean", "a", "b", "v", "SVGItem", "tag", "t", "color", "width", "name", "value", "_x4_unitless", "isNumber", "c", "result", "k", "id", "tr", "cx", "cy", "dx", "dy", "SVGPath", "start", "end", "st", "en", "flag", "SVGText", "txt", "font", "size", "weight", "align", "al", "SVGShape", "_SVGGradient", "x1", "y1", "x2", "y2", "isString", "offset", "s", "SVGGradient", "__publicField", "SVGGroup", "path", "text", "r1", "r2", "shape", "w", "h", "group", "grad", "i", "_SVGPathBuilder", "clip", "SVGPathBuilder", "SVGComponent", "Component", "props", "TabBar", "Container", "props", "p", "page", "buttons", "Button", "id", "notify", "x", "EvChange", "__name", "TabView", "CardView", "props", "tabs", "pages", "p", "HLayout", "card", "Button", "page", "__name", "TextArea", "Component", "props", "asap", "e", "EvChange", "t", "text", "lines", "dom", "end", "sel", "value", "__name", "Toaster", "Popup", "props", "Label", "opacity", "__name", "EvExpand", "node", "BasicEvent", "__name", "TreeView", "VLayout", "props", "Container", "HLayout", "e", "ev", "Component", "hit", "parent", "i", "value", "data", "EvDrag", "items", "id", "child", "item", "pn", "newchild", "dm", "root", "open", "openList", "oldSel", "level", "cls", "icon", "b", "at", "bt", "c", "Label", "Icon", "cb", "found", "scan", "notify", "sel", "nd", "EvSelectionChange", "dom", "idom", "onsub", "el", "offset", "EvClick", "EvDblClick", "EvContextMenu", "paths", "separator", "insert", "elements", "path", "pos", "main", "elem", "nodes", "tree_nodes", "pelem", "tnode", "createElement", "__name", "clsOrTag", "attrs", "children", "comp", "createFragment", "Fragment", "Component", "React", "TSXComponent", "props", "tsx", "msg_sent", "setupWSMessaging", "closeCB", "protocol", "sockets", "app", "Application", "e", "message", "ev", "__name", "x4js_version"]
7
7
  }