x4js 1.4.53 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/lib/cjs/action.d.ts +57 -0
  2. package/lib/cjs/application.d.ts +104 -0
  3. package/lib/cjs/autocomplete.d.ts +58 -0
  4. package/lib/cjs/base_component.d.ts +88 -0
  5. package/lib/cjs/button.d.ts +151 -0
  6. package/lib/cjs/calendar.d.ts +81 -0
  7. package/lib/cjs/canvas.d.ts +92 -0
  8. package/lib/cjs/cardview.d.ts +87 -0
  9. package/lib/cjs/checkbox.d.ts +77 -0
  10. package/lib/cjs/color.d.ts +148 -0
  11. package/lib/cjs/colorpicker.d.ts +107 -0
  12. package/lib/cjs/combobox.d.ts +101 -0
  13. package/lib/cjs/component.d.ts +601 -0
  14. package/lib/cjs/datastore.d.ts +396 -0
  15. package/lib/cjs/dialog.d.ts +175 -0
  16. package/lib/cjs/dom_events.d.ts +302 -0
  17. package/lib/cjs/drag_manager.d.ts +54 -0
  18. package/lib/cjs/drawtext.d.ts +48 -0
  19. package/lib/cjs/fileupload.d.ts +64 -0
  20. package/lib/cjs/form.d.ts +126 -0
  21. package/lib/cjs/formatters.d.ts +35 -0
  22. package/lib/cjs/gridview.d.ts +175 -0
  23. package/lib/cjs/i18n.d.ts +73 -0
  24. package/lib/cjs/icon.d.ts +64 -0
  25. package/lib/cjs/image.d.ts +55 -0
  26. package/lib/cjs/index.d.ts +83 -0
  27. package/lib/cjs/input.d.ts +91 -0
  28. package/lib/cjs/label.d.ts +58 -0
  29. package/lib/cjs/layout.d.ts +87 -0
  30. package/lib/cjs/link.d.ts +50 -0
  31. package/lib/cjs/listview.d.ts +178 -0
  32. package/lib/cjs/md5.d.ts +61 -0
  33. package/lib/cjs/menu.d.ts +130 -0
  34. package/lib/cjs/messagebox.d.ts +68 -0
  35. package/lib/cjs/panel.d.ts +47 -0
  36. package/lib/cjs/popup.d.ts +75 -0
  37. package/lib/cjs/property_editor.d.ts +71 -0
  38. package/lib/cjs/radiobtn.d.ts +72 -0
  39. package/lib/cjs/rating.d.ts +53 -0
  40. package/lib/cjs/request.d.ts +52 -0
  41. package/lib/cjs/router.d.ts +42 -0
  42. package/lib/cjs/settings.d.ts +37 -0
  43. package/lib/cjs/sidebarview.d.ts +49 -0
  44. package/lib/cjs/spreadsheet.d.ts +218 -0
  45. package/lib/cjs/styles.d.ts +85 -0
  46. package/lib/cjs/svgcomponent.d.ts +191 -0
  47. package/lib/cjs/tabbar.d.ts +58 -0
  48. package/lib/cjs/tabview.d.ts +49 -0
  49. package/lib/cjs/textarea.d.ts +63 -0
  50. package/lib/cjs/textedit.d.ts +123 -0
  51. package/lib/cjs/toaster.d.ts +42 -0
  52. package/lib/cjs/tools.d.ts +394 -0
  53. package/lib/cjs/tooltips.d.ts +46 -0
  54. package/lib/cjs/treeview.d.ts +132 -0
  55. package/lib/cjs/version.d.ts +29 -0
  56. package/lib/cjs/x4dom.d.ts +49 -0
  57. package/lib/cjs/x4events.d.ts +269 -0
  58. package/lib/cjs/x4react.d.ts +41 -0
  59. package/lib/esm/action.d.ts +57 -0
  60. package/lib/esm/application.d.ts +104 -0
  61. package/lib/esm/autocomplete.d.ts +58 -0
  62. package/lib/esm/base_component.d.ts +88 -0
  63. package/lib/esm/button.d.ts +151 -0
  64. package/lib/esm/calendar.d.ts +81 -0
  65. package/lib/esm/canvas.d.ts +92 -0
  66. package/lib/esm/cardview.d.ts +87 -0
  67. package/lib/esm/checkbox.d.ts +77 -0
  68. package/lib/esm/color.d.ts +148 -0
  69. package/lib/esm/colorpicker.d.ts +107 -0
  70. package/lib/esm/combobox.d.ts +101 -0
  71. package/lib/esm/component.d.ts +601 -0
  72. package/lib/esm/datastore.d.ts +396 -0
  73. package/lib/esm/dialog.d.ts +175 -0
  74. package/lib/esm/dom_events.d.ts +302 -0
  75. package/lib/esm/drag_manager.d.ts +54 -0
  76. package/lib/esm/drawtext.d.ts +48 -0
  77. package/lib/esm/fileupload.d.ts +64 -0
  78. package/lib/esm/form.d.ts +126 -0
  79. package/lib/esm/formatters.d.ts +35 -0
  80. package/lib/esm/gridview.d.ts +175 -0
  81. package/lib/esm/i18n.d.ts +73 -0
  82. package/lib/esm/icon.d.ts +64 -0
  83. package/lib/esm/image.d.ts +55 -0
  84. package/lib/esm/index.d.ts +83 -0
  85. package/lib/esm/input.d.ts +91 -0
  86. package/lib/esm/label.d.ts +58 -0
  87. package/lib/esm/layout.d.ts +87 -0
  88. package/lib/esm/link.d.ts +50 -0
  89. package/lib/esm/listview.d.ts +178 -0
  90. package/lib/esm/md5.d.ts +61 -0
  91. package/lib/esm/menu.d.ts +130 -0
  92. package/lib/esm/messagebox.d.ts +68 -0
  93. package/lib/esm/panel.d.ts +47 -0
  94. package/lib/esm/popup.d.ts +75 -0
  95. package/lib/esm/property_editor.d.ts +71 -0
  96. package/lib/esm/radiobtn.d.ts +72 -0
  97. package/lib/esm/rating.d.ts +53 -0
  98. package/lib/esm/request.d.ts +52 -0
  99. package/lib/esm/router.d.ts +42 -0
  100. package/lib/esm/settings.d.ts +37 -0
  101. package/lib/esm/sidebarview.d.ts +49 -0
  102. package/lib/esm/spreadsheet.d.ts +218 -0
  103. package/lib/esm/styles.d.ts +85 -0
  104. package/lib/esm/svgcomponent.d.ts +191 -0
  105. package/lib/esm/tabbar.d.ts +58 -0
  106. package/lib/esm/tabview.d.ts +49 -0
  107. package/lib/esm/textarea.d.ts +63 -0
  108. package/lib/esm/textedit.d.ts +123 -0
  109. package/lib/esm/toaster.d.ts +42 -0
  110. package/lib/esm/tools.d.ts +394 -0
  111. package/lib/esm/tooltips.d.ts +46 -0
  112. package/lib/esm/treeview.d.ts +132 -0
  113. package/lib/esm/version.d.ts +29 -0
  114. package/lib/esm/x4dom.d.ts +49 -0
  115. package/lib/esm/x4events.d.ts +269 -0
  116. package/lib/esm/x4react.d.ts +41 -0
  117. package/lib/ts_src/MIT-license.md +14 -0
  118. package/lib/ts_src/action.ts +88 -0
  119. package/lib/ts_src/alpha.jpg +0 -0
  120. package/lib/ts_src/application.ts +251 -0
  121. package/lib/ts_src/autocomplete.ts +197 -0
  122. package/lib/ts_src/base64.ts +166 -0
  123. package/lib/ts_src/base_component.ts +152 -0
  124. package/lib/ts_src/button.ts +355 -0
  125. package/lib/ts_src/calendar.ts +322 -0
  126. package/lib/ts_src/canvas.ts +505 -0
  127. package/lib/ts_src/cardview.ts +227 -0
  128. package/lib/ts_src/checkbox.ts +187 -0
  129. package/lib/ts_src/color.ts +752 -0
  130. package/lib/ts_src/colorpicker.ts +1639 -0
  131. package/lib/ts_src/combobox.ts +362 -0
  132. package/lib/ts_src/component.ts +2329 -0
  133. package/lib/ts_src/datastore.ts +1322 -0
  134. package/lib/ts_src/dialog.ts +656 -0
  135. package/lib/ts_src/dom_events.ts +315 -0
  136. package/lib/ts_src/drag_manager.ts +199 -0
  137. package/lib/ts_src/drawtext.ts +355 -0
  138. package/lib/ts_src/fileupload.ts +213 -0
  139. package/lib/ts_src/form.ts +366 -0
  140. package/lib/ts_src/formatters.ts +105 -0
  141. package/lib/ts_src/gridview.ts +1185 -0
  142. package/lib/ts_src/i18n.ts +346 -0
  143. package/lib/ts_src/icon.ts +329 -0
  144. package/lib/ts_src/image.ts +204 -0
  145. package/lib/ts_src/index.ts +88 -0
  146. package/lib/ts_src/input.ts +249 -0
  147. package/lib/ts_src/label.ts +128 -0
  148. package/lib/ts_src/layout.ts +430 -0
  149. package/lib/ts_src/link.ts +86 -0
  150. package/lib/ts_src/listview.ts +762 -0
  151. package/lib/ts_src/md5.ts +438 -0
  152. package/lib/ts_src/menu.ts +425 -0
  153. package/lib/ts_src/messagebox.ts +203 -0
  154. package/lib/ts_src/panel.ts +86 -0
  155. package/lib/ts_src/popup.ts +494 -0
  156. package/lib/ts_src/property_editor.ts +337 -0
  157. package/lib/ts_src/radiobtn.ts +196 -0
  158. package/lib/ts_src/rating.ts +135 -0
  159. package/lib/ts_src/request.ts +300 -0
  160. package/lib/ts_src/router.ts +185 -0
  161. package/lib/ts_src/settings.ts +77 -0
  162. package/lib/ts_src/sidebarview.ts +103 -0
  163. package/lib/ts_src/spreadsheet.ts +1442 -0
  164. package/lib/ts_src/styles.ts +343 -0
  165. package/lib/ts_src/svgcomponent.ts +537 -0
  166. package/lib/ts_src/tabbar.ts +151 -0
  167. package/lib/ts_src/tabview.ts +110 -0
  168. package/lib/ts_src/textarea.ts +187 -0
  169. package/lib/ts_src/textedit.ts +544 -0
  170. package/lib/ts_src/toaster.ts +80 -0
  171. package/lib/ts_src/tools.ts +1468 -0
  172. package/lib/ts_src/tooltips.ts +191 -0
  173. package/lib/ts_src/treeview.ts +675 -0
  174. package/lib/ts_src/version.ts +30 -0
  175. package/lib/ts_src/x4.less +2236 -0
  176. package/lib/ts_src/x4dom.ts +57 -0
  177. package/lib/ts_src/x4events.ts +585 -0
  178. package/lib/ts_src/x4react.ts +90 -0
  179. package/package.json +3 -2
@@ -0,0 +1,204 @@
1
+ /**
2
+ * ___ ___ __
3
+ * \ \/ / / _
4
+ * \ / /_| |_
5
+ * / \____ _|
6
+ * /__/\__\ |_|
7
+ *
8
+ * @file image.ts
9
+ * @author Etienne Cochard
10
+ *
11
+ * Copyright (c) 2019-2022 R-libre ingenierie
12
+ *
13
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
14
+ * of this software and associated documentation files (the "Software"), to deal
15
+ * in the Software without restriction, including without limitation the rights
16
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
17
+ * of the Software, and to permit persons to whom the Software is furnished to do so,
18
+ * subject to the following conditions:
19
+ * The above copyright notice and this permission notice shall be included in all copies
20
+ * or substantial portions of the Software.
21
+ *
22
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
23
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
24
+ * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
25
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
27
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28
+ **/
29
+
30
+ import { x4document } from './x4dom'
31
+
32
+ import { Component, CProps, html } from './component'
33
+
34
+ // ============================================================================
35
+ // [IMAGE]
36
+ // ============================================================================
37
+
38
+ interface ImageProps extends CProps
39
+ {
40
+ src: string;
41
+ alt?: string;
42
+ lazy?: boolean; // mark image as lazy loading
43
+ alignment?: 'fill' | 'contain' | 'cover' | 'scale-down' | 'none';
44
+ }
45
+
46
+ const emptyImageSrc = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';
47
+
48
+ function _isStaticImage( src: string ) {
49
+ return src.substr(0,5)=='data:';
50
+ }
51
+
52
+
53
+
54
+ /**
55
+ * Standard image class
56
+ */
57
+ export class Image extends Component<ImageProps>
58
+ {
59
+ protected m_created: boolean;
60
+ protected m_lazysrc: string; // expected
61
+
62
+ constructor(props: ImageProps) {
63
+ super(props);
64
+
65
+ this.m_created = false;
66
+
67
+ this.m_props.lazy = props.lazy===false ? false : true;
68
+ this.m_props.alt = props.alt;
69
+
70
+ if( props.lazy!==false ) {
71
+ this.m_lazysrc = props.src;
72
+ props.src = emptyImageSrc;
73
+ }
74
+
75
+ this.setDomEvent( 'create', ( ) => {
76
+ if( props.lazy ) {
77
+ this.setImage( this.m_lazysrc, true );
78
+ }
79
+ });
80
+ }
81
+
82
+ /** @ignore */
83
+ render( ) {
84
+ let mp = this.m_props;
85
+
86
+ const img = new Component( {
87
+ tag: 'img',
88
+ attrs: {
89
+ draggable: false,
90
+ alt: mp.alt ?? '',
91
+ decoding: mp.lazy ? 'async' : undefined,
92
+ },
93
+ style: {
94
+ objectFit: mp.alignment ? mp.alignment : undefined
95
+ }
96
+ });
97
+
98
+ this.setContent( img );
99
+ }
100
+
101
+ /**
102
+ * change the image
103
+ * @param src - image path
104
+ */
105
+
106
+ public setImage( src: string, force?: boolean ) {
107
+
108
+ if( !src ) {
109
+ src = emptyImageSrc;
110
+ }
111
+
112
+ if( !this.m_props.lazy ) {
113
+ this.m_props.src = src;
114
+ this.m_lazysrc = src;
115
+
116
+ if( this.dom ) {
117
+ (<HTMLElement>this.dom.firstChild).setAttribute( 'src', src );
118
+ }
119
+ }
120
+ else if( force || this.m_lazysrc!=src ) {
121
+ if( _isStaticImage(src) ) {
122
+ // not to download -> direct display
123
+ this.m_props.src = src;
124
+ this.m_lazysrc = src;
125
+
126
+ if( this.dom ) {
127
+ (<HTMLElement>this.dom.firstChild).setAttribute( 'src', this.m_props.src );
128
+ }
129
+ }
130
+ else {
131
+ // clear current image while waiting
132
+ this.m_props.src = emptyImageSrc;
133
+ if( this.dom ) {
134
+ (<HTMLElement>this.dom.firstChild).setAttribute( 'src', this.m_props.src );
135
+ }
136
+
137
+ this.m_lazysrc = src;
138
+ if( this.dom ) {
139
+ this._update_image( );
140
+ }
141
+ }
142
+ }
143
+ }
144
+
145
+ private _update_image( ) {
146
+
147
+ console.assert( !!this.dom );
148
+
149
+ if( this.m_lazysrc && !_isStaticImage(this.m_lazysrc) ) {
150
+ // we do not push Components in a static array...
151
+ Image.lazy_images_waiting.push( { dom: this.dom, src: this.m_lazysrc } );
152
+ if( Image.lazy_image_timer===undefined ) {
153
+ Image.lazy_image_timer = setInterval( Image.lazyWatch as TimerHandler, 10 );
154
+ }
155
+ }
156
+ }
157
+
158
+ private static lazy_images_waiting = [];
159
+ private static lazy_image_timer: number = undefined;
160
+
161
+ private static lazyWatch( ) {
162
+
163
+ let newList = [];
164
+ let done = 0;
165
+
166
+ Image.lazy_images_waiting.forEach( ( el ) => {
167
+
168
+ let dom = el.dom,
169
+ src = el.src;
170
+
171
+ // skip deleted elements
172
+ if( !dom || dom.offsetParent === null ) {
173
+ // do not append to newList
174
+ return;
175
+ }
176
+
177
+ let rc = dom.getBoundingClientRect();
178
+
179
+ // if it is visible & inserted inside the document
180
+ if( !done && dom.offsetParent!==null &&
181
+ rc.bottom >= 0 && rc.right >= 0 &&
182
+ rc.top <= (window.innerHeight || x4document.documentElement.clientHeight) &&
183
+ rc.left <= (window.innerWidth || x4document.documentElement.clientWidth) ) {
184
+
185
+ // ok, we load the image
186
+ let img = <HTMLElement>dom.firstChild;
187
+ img.setAttribute( 'src', src );
188
+ done++;
189
+ }
190
+ else {
191
+ // still not visible: may be next time
192
+ newList.push( el );
193
+ }
194
+ } );
195
+
196
+ Image.lazy_images_waiting = newList;
197
+
198
+ // no more elements to watch...
199
+ if( newList.length==0 ) {
200
+ clearInterval( Image.lazy_image_timer );
201
+ Image.lazy_image_timer = undefined;
202
+ }
203
+ }
204
+ }
@@ -0,0 +1,88 @@
1
+ /**
2
+ * ___ ___ __
3
+ * \ \_/ / / _
4
+ * \ / /_| |_
5
+ * / _ \____ _|
6
+ * /__/ \__\ |_|
7
+ *
8
+ * @file index.ts
9
+ * @author Etienne Cochard
10
+ *
11
+ * Copyright (c) 2019-2022 R-libre ingenierie
12
+ *
13
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
14
+ * of this software and associated documentation files (the "Software"), to deal
15
+ * in the Software without restriction, including without limitation the rights
16
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
17
+ * of the Software, and to permit persons to whom the Software is furnished to do so,
18
+ * subject to the following conditions:
19
+ * The above copyright notice and this permission notice shall be included in all copies
20
+ * or substantial portions of the Software.
21
+ *
22
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
23
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
24
+ * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
25
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
27
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28
+ **/
29
+
30
+ export * from "./application"
31
+ export * from "./autocomplete"
32
+ export * from "./base_component"
33
+ //export * from "./base64"
34
+ export * from "./button"
35
+ export * from "./calendar"
36
+ export * from "./canvas"
37
+ export * from "./cardview"
38
+ export * from "./checkbox"
39
+ export * from "./color"
40
+ export * from "./colorpicker"
41
+ export * from "./combobox"
42
+ export * from "./component"
43
+ export * from "./datastore"
44
+ export * from "./dialog"
45
+ export * from "./dom_events"
46
+ export * from "./drag_manager"
47
+ export * from "./drawtext"
48
+ export * from "./fileupload"
49
+ export * from "./form"
50
+ export * from "./formatters"
51
+ export * from "./gridview"
52
+ export * from "./i18n"
53
+ export * from "./icon"
54
+ export * from "./image"
55
+ export * from "./input"
56
+ export * from "./label"
57
+ export * from "./layout"
58
+ export * from "./link"
59
+ export * from "./listview"
60
+ export * from "./md5"
61
+ export * from "./menu"
62
+ export * from "./messagebox"
63
+ export * from "./panel"
64
+ export * from "./popup"
65
+ export * from "./property_editor"
66
+ export * from "./radiobtn"
67
+ export * from "./rating"
68
+ export * from "./request"
69
+ export * from "./router"
70
+ export * from "./settings"
71
+ export * from "./sidebarview"
72
+ //export * from "./smartedit"
73
+ export * from "./spreadsheet"
74
+ export * from "./styles"
75
+ export * from "./svgcomponent"
76
+ export * from "./tabbar"
77
+ export * from "./tabview"
78
+ export * from "./textarea"
79
+ export * from "./textedit"
80
+ //export * from "./texthiliter"
81
+ export * from "./toaster"
82
+ export * from "./tools"
83
+ export * from "./tooltips"
84
+ export * from "./treeview"
85
+ export * from "./x4events"
86
+ export * from "./x4react"
87
+
88
+ export * from "./version"
@@ -0,0 +1,249 @@
1
+ /**
2
+ * ___ ___ __
3
+ * \ \/ / / _
4
+ * \ / /_| |_
5
+ * / \____ _|
6
+ * /__/\__\ |_|
7
+ *
8
+ * @file input.ts
9
+ * @author Etienne Cochard
10
+ *
11
+ * Copyright (c) 2019-2022 R-libre ingenierie
12
+ *
13
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
14
+ * of this software and associated documentation files (the "Software"), to deal
15
+ * in the Software without restriction, including without limitation the rights
16
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
17
+ * of the Software, and to permit persons to whom the Software is furnished to do so,
18
+ * subject to the following conditions:
19
+ * The above copyright notice and this permission notice shall be included in all copies
20
+ * or substantial portions of the Software.
21
+ *
22
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
23
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
24
+ * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
25
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
27
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28
+ **/
29
+
30
+ import { Component, CProps, CEventMap, EvFocus } from './component'
31
+ //import { EvChange } from './x4_events';
32
+
33
+ export type EditType = 'text' | 'number' | 'email' | 'date' | 'password' | 'file' | 'checkbox' | 'radio';
34
+
35
+ export interface ValueHook {
36
+ get( ) : any;
37
+ set( v: any ) : void;
38
+ }
39
+
40
+ export interface InputEventMap extends CEventMap {
41
+ // change?: EvChange;
42
+ // focus?: EvFocus;
43
+ }
44
+
45
+ export interface InputProps<P extends InputEventMap = InputEventMap> extends CProps<P> {
46
+ value?: string;
47
+ name?: string;
48
+ type?: EditType
49
+ placeHolder?: string;
50
+ autoFocus?: boolean;
51
+ readOnly?: boolean;
52
+ tabIndex?: number | boolean;
53
+ pattern?: string;
54
+ uppercase?: boolean;
55
+ spellcheck?: boolean;
56
+ value_hook?: ValueHook;
57
+ min?: number;
58
+ max?: number;
59
+ autosel?: boolean;
60
+ }
61
+
62
+
63
+ /**
64
+ * base class for elements implementing an input
65
+ * CARE derived classes must set this.ui.input
66
+ */
67
+
68
+ export class Input extends Component<InputProps,InputEventMap>
69
+ {
70
+ constructor( props: InputProps ) {
71
+ super( props );
72
+ }
73
+
74
+ /** @ignore */
75
+ render( props: InputProps ) {
76
+
77
+ this.setTag( 'input' );
78
+ this._setTabIndex( props.tabIndex );
79
+
80
+ this.setAttributes( {
81
+ value: props.value,
82
+ type: props.type || 'text',
83
+ name: props.name,
84
+ placeholder: props.placeHolder,
85
+ autofocus: props.autoFocus,
86
+ readonly: props.readOnly,
87
+ autocomplete: 'new-password', // chrome ignore 'off' but not something else than 'on'
88
+ tabIndex: props.tabIndex,
89
+ spellcheck: props.spellcheck===false ? 'false' : undefined,
90
+ min: props.min,
91
+ max: props.max,
92
+ ...props.attrs
93
+ });
94
+
95
+ this.m_props.autosel = props.autosel ?? true;
96
+
97
+ if( props.uppercase ) {
98
+ this.setStyleValue( 'textTransform', 'uppercase' );
99
+ }
100
+
101
+ if( this.m_props.autosel ) {
102
+ this.setDomEvent( "focus", ( ) => {
103
+ this.selectAll( );
104
+ });
105
+ }
106
+ }
107
+
108
+ public getType( ) {
109
+ return this.m_props.type;
110
+ }
111
+
112
+ /**
113
+ * return the current editor value
114
+ */
115
+
116
+ public get value( ) : string {
117
+
118
+ if( this.dom ) {
119
+ this.m_props.value = (<HTMLInputElement>this.dom).value;
120
+ }
121
+
122
+ if( this.m_props.uppercase ) {
123
+ let upper = this.m_props.value.toUpperCase( ); // todo: locale ?
124
+ if( this.dom && upper!=this.m_props.value ) {
125
+ (<HTMLInputElement>this.dom).value = upper; // update the input
126
+ }
127
+
128
+ this.m_props.value = upper;
129
+ }
130
+
131
+ return this.m_props.value;
132
+ }
133
+
134
+ /**
135
+ * Change the editor value
136
+ * @param value - new value to set
137
+ */
138
+
139
+ public set value( value: string ) {
140
+
141
+ this.m_props.value = value;
142
+
143
+ if( this.dom ) {
144
+ (<HTMLInputElement>this.dom).value = value;
145
+ }
146
+ }
147
+
148
+ public getStoreValue( ): any {
149
+
150
+ if( this.m_props.value_hook ) {
151
+ return this.m_props.value_hook.get( );
152
+ }
153
+ else {
154
+ let type = this.getAttribute('type');
155
+ if( type ) { type = type.toLowerCase( ); }
156
+
157
+ let value,
158
+ dom = (<HTMLInputElement>this.dom);
159
+
160
+ if( type === "file") {
161
+ value = [];
162
+
163
+ let files = dom.files;
164
+ for( let file = 0; file < files.length; file++ ) {
165
+ value.push( files[file].name );
166
+ }
167
+ }
168
+ else if ( type === 'checkbox' ) {
169
+ if( dom.checked ) {
170
+ value = 1;
171
+ }
172
+ else {
173
+ value = 0;
174
+ }
175
+ }
176
+ else if( type === 'radio' ) {
177
+ if( dom.checked ) {
178
+ value = this.value;
179
+ }
180
+ }
181
+ else if( type === 'date' ) {
182
+ debugger;
183
+ }
184
+ else {
185
+ value = this.value;
186
+ }
187
+
188
+ return value;
189
+ }
190
+ }
191
+
192
+ public setStoreValue( v: any ) {
193
+
194
+ if( this.m_props.value_hook ) {
195
+ return this.m_props.value_hook.set( v );
196
+ }
197
+ else {
198
+ let type = this.getAttribute('type'),
199
+ dom = (<HTMLInputElement>this.dom);
200
+
201
+ if( type ) { type = type.toLowerCase( ); }
202
+ if( type==='checkbox' ) {
203
+ let newval = v!==null && v!=='0' && v!==0 && v!==false;
204
+ if( newval!==dom.checked ) {
205
+ dom.setAttribute( 'checked', ''+newval );
206
+ dom.dispatchEvent( new Event( 'change' ) );
207
+ }
208
+ }
209
+ else {
210
+ this.value = v;
211
+ }
212
+ }
213
+ }
214
+
215
+ set readOnly( ro: boolean ) {
216
+ this.setAttribute('readonly', ro );
217
+ }
218
+
219
+ /**
220
+ * select all the text
221
+ */
222
+
223
+ public selectAll( ) {
224
+ (<HTMLInputElement>this.dom).select();
225
+ }
226
+
227
+ /**
228
+ * select a part of the text
229
+ * @param start
230
+ * @param length
231
+ */
232
+
233
+ public select( start: number, length: number = 9999 ) : void {
234
+ (<HTMLInputElement>this.dom).setSelectionRange( start, start+length );
235
+ }
236
+
237
+ /**
238
+ * get the selection as { start, length }
239
+ */
240
+
241
+ public getSelection( ) {
242
+ let idom = (<HTMLInputElement>this.dom);
243
+
244
+ return {
245
+ start: idom.selectionStart,
246
+ length: idom.selectionEnd - idom.selectionStart,
247
+ };
248
+ }
249
+ }
@@ -0,0 +1,128 @@
1
+ /**
2
+ * ___ ___ __
3
+ * \ \/ / / _
4
+ * \ / /_| |_
5
+ * / \____ _|
6
+ * /__/\__\ |_|
7
+ *
8
+ * @file label.ts
9
+ * @author Etienne Cochard
10
+ *
11
+ * Copyright (c) 2019-2022 R-libre ingenierie
12
+ *
13
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
14
+ * of this software and associated documentation files (the "Software"), to deal
15
+ * in the Software without restriction, including without limitation the rights
16
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
17
+ * of the Software, and to permit persons to whom the Software is furnished to do so,
18
+ * subject to the following conditions:
19
+ * The above copyright notice and this permission notice shall be included in all copies
20
+ * or substantial portions of the Software.
21
+ *
22
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
23
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
24
+ * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
25
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
27
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28
+ **/
29
+
30
+ import { Component, CProps } from './component'
31
+ import { HtmlString } from './tools'
32
+ import { Icon, IconID } from './icon'
33
+
34
+ // ============================================================================
35
+ // [LABEL]
36
+ // ============================================================================
37
+
38
+ export interface LabelProps extends CProps {
39
+ text: string | HtmlString;
40
+ icon?: IconID;
41
+ align?: 'left' | 'right' | 'center';
42
+ multiline?: boolean; // understand \n as newlines
43
+ }
44
+
45
+ /**
46
+ * Standard label
47
+ */
48
+
49
+ export class Label extends Component<LabelProps>
50
+ {
51
+ /**
52
+ * double constructor, from string/html or as usual
53
+ */
54
+
55
+ constructor( props: LabelProps );
56
+ constructor( text: string | HtmlString );
57
+ constructor( param: any ) {
58
+
59
+ if( typeof(param)==='string' || param instanceof HtmlString ) {
60
+ super( { text: param } );
61
+ }
62
+ else {
63
+ super( param );
64
+ }
65
+ }
66
+
67
+ /** @ignore */
68
+ render( props: LabelProps ) {
69
+
70
+ let text: any = this.m_props.text;
71
+ if( this.m_props.multiline && !(text instanceof HtmlString) ) {
72
+ text = new HtmlString( (text as string).replace( /\n/g, '<br/>' ) );
73
+ }
74
+
75
+ if( !props.icon ) {
76
+ this.setContent( text );
77
+ }
78
+ else {
79
+ this.setTag( 'span' );
80
+ this.addClass( '@hlayout' );
81
+
82
+ this.setContent( [
83
+ new Icon( { icon: props.icon } ),
84
+ new Component( { content: text, ref: 'text' } )
85
+ ] );
86
+ }
87
+
88
+ this.addClass( props.align ?? 'left' );
89
+ }
90
+
91
+ /**
92
+ * change the displayed text
93
+ * @param text - new text
94
+ */
95
+
96
+ public set text( txt: string | HtmlString ) {
97
+
98
+ let props = this.m_props;
99
+
100
+ if( props.text!==txt ) {
101
+ props.text = txt;
102
+
103
+ let text: any = this.m_props.text;
104
+ if( this.m_props.multiline && !(text instanceof HtmlString) ) {
105
+ text = new HtmlString( (text as string).replace( '/\n/g', '<br/>' ) );
106
+ }
107
+
108
+ if( this.dom ) {
109
+
110
+ let comp: Component = this;
111
+ if( this.m_props.icon ) {
112
+ comp = this.itemWithRef<Component>( 'text' );
113
+ }
114
+
115
+ comp.setContent( text );
116
+ }
117
+ }
118
+ }
119
+
120
+ /**
121
+ *
122
+ */
123
+
124
+ public get text( ) : string | HtmlString {
125
+ return this.m_props.text;
126
+ }
127
+ }
128
+