jsxgrid 2.0.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 (83) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +2329 -0
  3. package/dist/fields/jsgrid.field.XDateTimeField.min.js +6 -0
  4. package/dist/fields/jsgrid.field.XRowSelectField.min.js +6 -0
  5. package/dist/fields/jsgrid.field.Xcheckbox.min.js +6 -0
  6. package/dist/fields/jsgrid.field.XimgField.min.js +6 -0
  7. package/dist/fields/jsgrid.field.Xjsoneditor.min.js +6 -0
  8. package/dist/fields/jsgrid.field.Xselect.min.js +6 -0
  9. package/dist/fields/jsgrid.field.Xtextarea.min.js +6 -0
  10. package/dist/fields/lib/jsGridSummaryPlugin.min.js +6 -0
  11. package/dist/fields/lib/jsgrid.popup.basic.min.js +6 -0
  12. package/dist/i18n/jsgrid-Ko.js +46 -0
  13. package/dist/i18n/jsgrid-cs.js +46 -0
  14. package/dist/i18n/jsgrid-de.js +46 -0
  15. package/dist/i18n/jsgrid-el.js +46 -0
  16. package/dist/i18n/jsgrid-es.js +46 -0
  17. package/dist/i18n/jsgrid-fa.js +46 -0
  18. package/dist/i18n/jsgrid-fr.js +47 -0
  19. package/dist/i18n/jsgrid-he.js +46 -0
  20. package/dist/i18n/jsgrid-it.js +47 -0
  21. package/dist/i18n/jsgrid-ja.js +46 -0
  22. package/dist/i18n/jsgrid-ka.js +46 -0
  23. package/dist/i18n/jsgrid-lt.js +47 -0
  24. package/dist/i18n/jsgrid-pl.js +62 -0
  25. package/dist/i18n/jsgrid-pt-br.js +46 -0
  26. package/dist/i18n/jsgrid-pt.js +46 -0
  27. package/dist/i18n/jsgrid-ru.js +47 -0
  28. package/dist/i18n/jsgrid-tr.js +47 -0
  29. package/dist/i18n/jsgrid-zh-cn.js +46 -0
  30. package/dist/i18n/jsgrid-zh-tw.js +46 -0
  31. package/dist/icons-2x.png +0 -0
  32. package/dist/icons.png +0 -0
  33. package/dist/jsxgrid-fields.js +606 -0
  34. package/dist/jsxgrid-fields.min.js +6 -0
  35. package/dist/jsxgrid-theme.css +258 -0
  36. package/dist/jsxgrid-theme.min.css +1 -0
  37. package/dist/jsxgrid-xfields.js +979 -0
  38. package/dist/jsxgrid-xfields.min.js +6 -0
  39. package/dist/jsxgrid.css +126 -0
  40. package/dist/jsxgrid.js +2137 -0
  41. package/dist/jsxgrid.min.css +1 -0
  42. package/dist/jsxgrid.min.js +6 -0
  43. package/package.json +57 -0
  44. package/src/fields/jsgrid.field.XDateTimeField.js +122 -0
  45. package/src/fields/jsgrid.field.XRowSelectField.js +62 -0
  46. package/src/fields/jsgrid.field.Xcheckbox.js +108 -0
  47. package/src/fields/jsgrid.field.XimgField.js +99 -0
  48. package/src/fields/jsgrid.field.Xjsoneditor.js +165 -0
  49. package/src/fields/jsgrid.field.Xselect.js +176 -0
  50. package/src/fields/jsgrid.field.Xtextarea.js +97 -0
  51. package/src/fields/jsgrid.field.checkbox.js +97 -0
  52. package/src/fields/jsgrid.field.control.js +224 -0
  53. package/src/fields/jsgrid.field.number.js +41 -0
  54. package/src/fields/jsgrid.field.select.js +130 -0
  55. package/src/fields/jsgrid.field.text.js +69 -0
  56. package/src/fields/jsgrid.field.textarea.js +34 -0
  57. package/src/i18n/Ko.js +46 -0
  58. package/src/i18n/cs.js +46 -0
  59. package/src/i18n/de.js +46 -0
  60. package/src/i18n/el.js +46 -0
  61. package/src/i18n/es.js +46 -0
  62. package/src/i18n/fa.js +46 -0
  63. package/src/i18n/fr.js +47 -0
  64. package/src/i18n/he.js +46 -0
  65. package/src/i18n/it.js +47 -0
  66. package/src/i18n/ja.js +46 -0
  67. package/src/i18n/ka.js +46 -0
  68. package/src/i18n/lt.js +47 -0
  69. package/src/i18n/pl.js +62 -0
  70. package/src/i18n/pt-br.js +46 -0
  71. package/src/i18n/pt.js +46 -0
  72. package/src/i18n/ru.js +47 -0
  73. package/src/i18n/tr.js +47 -0
  74. package/src/i18n/zh-cn.js +46 -0
  75. package/src/i18n/zh-tw.js +46 -0
  76. package/src/jsgrid.core.js +1655 -0
  77. package/src/jsgrid.field.js +74 -0
  78. package/src/jsgrid.load-indicator.js +82 -0
  79. package/src/jsgrid.load-strategies.js +131 -0
  80. package/src/jsgrid.sort-strategies.js +49 -0
  81. package/src/jsgrid.validation.js +135 -0
  82. package/src/lib/jsGridSummaryPlugin.js +37 -0
  83. package/src/lib/jsgrid.popup.basic.js +107 -0
@@ -0,0 +1,606 @@
1
+ /*
2
+ * jsxgrid v2.0.0 (https://github.com/rok9ru/jsxgrid#readme)
3
+ * (c) 2026 Mikhail Kremza
4
+ * Licensed under MIT
5
+ */
6
+
7
+ (function(jsGrid, $, undefined) {
8
+
9
+ var Field = jsGrid.Field;
10
+
11
+ function TextField(config) {
12
+ Field.call(this, config);
13
+ }
14
+
15
+ TextField.prototype = new Field({
16
+
17
+ autosearch: true,
18
+ readOnly: false,
19
+
20
+ filterTemplate: function() {
21
+ if(!this.filtering)
22
+ return "";
23
+
24
+ var grid = this._grid,
25
+ $result = this.filterControl = this._createTextBox();
26
+
27
+ if(this.autosearch) {
28
+ $result.on("keypress", function(e) {
29
+ if(e.which === 13) {
30
+ grid.search();
31
+ e.preventDefault();
32
+ }
33
+ });
34
+ }
35
+
36
+ return $result;
37
+ },
38
+
39
+ insertTemplate: function() {
40
+ if(!this.inserting)
41
+ return "";
42
+
43
+ return this.insertControl = this._createTextBox();
44
+ },
45
+
46
+ editTemplate: function(value) {
47
+ if(!this.editing)
48
+ return this.itemTemplate.apply(this, arguments);
49
+
50
+ var $result = this.editControl = this._createTextBox();
51
+ $result.val(value);
52
+ return $result;
53
+ },
54
+
55
+ filterValue: function() {
56
+ return this.filterControl.val();
57
+ },
58
+
59
+ insertValue: function() {
60
+ return this.insertControl.val();
61
+ },
62
+
63
+ editValue: function() {
64
+ return this.editControl.val();
65
+ },
66
+
67
+ _createTextBox: function() {
68
+ return $("<input>").attr("type", "text")
69
+ .prop("readonly", !!this.readOnly);
70
+ }
71
+ });
72
+
73
+ jsGrid.fields.text = jsGrid.TextField = TextField;
74
+
75
+ }(jsGrid, jQuery));
76
+
77
+ (function(jsGrid, $, undefined) {
78
+
79
+ var TextField = jsGrid.TextField;
80
+
81
+ function NumberField(config) {
82
+ TextField.call(this, config);
83
+ }
84
+
85
+ NumberField.prototype = new TextField({
86
+
87
+ sorter: "number",
88
+ align: "right",
89
+ readOnly: false,
90
+
91
+ filterValue: function() {
92
+ return this.filterControl.val()
93
+ ? parseInt(this.filterControl.val() || 0, 10)
94
+ : undefined;
95
+ },
96
+
97
+ insertValue: function() {
98
+ return this.insertControl.val()
99
+ ? parseInt(this.insertControl.val() || 0, 10)
100
+ : undefined;
101
+ },
102
+
103
+ editValue: function() {
104
+ return this.editControl.val()
105
+ ? parseInt(this.editControl.val() || 0, 10)
106
+ : undefined;
107
+ },
108
+
109
+ _createTextBox: function() {
110
+ return $("<input>").attr("type", "number")
111
+ .prop("readonly", !!this.readOnly);
112
+ }
113
+ });
114
+
115
+ jsGrid.fields.number = jsGrid.NumberField = NumberField;
116
+
117
+ }(jsGrid, jQuery));
118
+
119
+ (function(jsGrid, $, undefined) {
120
+
121
+ var TextField = jsGrid.TextField;
122
+
123
+ function TextAreaField(config) {
124
+ TextField.call(this, config);
125
+ }
126
+
127
+ TextAreaField.prototype = new TextField({
128
+
129
+ insertTemplate: function() {
130
+ if(!this.inserting)
131
+ return "";
132
+
133
+ return this.insertControl = this._createTextArea();
134
+ },
135
+
136
+ editTemplate: function(value) {
137
+ if(!this.editing)
138
+ return this.itemTemplate.apply(this, arguments);
139
+
140
+ var $result = this.editControl = this._createTextArea();
141
+ $result.val(value);
142
+ return $result;
143
+ },
144
+
145
+ _createTextArea: function() {
146
+ return $("<textarea>").prop("readonly", !!this.readOnly);
147
+ }
148
+ });
149
+
150
+ jsGrid.fields.textarea = jsGrid.TextAreaField = TextAreaField;
151
+
152
+ }(jsGrid, jQuery));
153
+
154
+ (function(jsGrid, $, undefined) {
155
+
156
+ var NumberField = jsGrid.NumberField;
157
+ var numberValueType = "number";
158
+ var stringValueType = "string";
159
+
160
+ function SelectField(config) {
161
+ this.items = [];
162
+ this.selectedIndex = -1;
163
+ this.valueField = "";
164
+ this.textField = "";
165
+
166
+ if(config.valueField && config.items.length) {
167
+ var firstItemValue = config.items[0][config.valueField];
168
+ this.valueType = (typeof firstItemValue) === numberValueType ? numberValueType : stringValueType;
169
+ }
170
+
171
+ this.sorter = this.valueType;
172
+
173
+ NumberField.call(this, config);
174
+ }
175
+
176
+ SelectField.prototype = new NumberField({
177
+
178
+ align: "center",
179
+ valueType: numberValueType,
180
+
181
+ itemTemplate: function(value) {
182
+ var items = this.items,
183
+ valueField = this.valueField,
184
+ textField = this.textField,
185
+ resultItem;
186
+
187
+ if(valueField) {
188
+ if(typeof(value) === "object"){
189
+ resultItem = value;
190
+ }
191
+ else{
192
+ resultItem = $.grep(items, function(item, index) {
193
+ return item[valueField] === value;
194
+ })[0] || {};
195
+ }
196
+ }
197
+ else {
198
+ resultItem = items[value];
199
+ }
200
+
201
+ var result = (textField ? resultItem[textField] : resultItem);
202
+
203
+ return (result === undefined || result === null) ? "" : result;
204
+ },
205
+
206
+ filterTemplate: function() {
207
+ if(!this.filtering)
208
+ return "";
209
+
210
+ var grid = this._grid,
211
+ $result = this.filterControl = this._createSelect();
212
+
213
+ if(this.autosearch) {
214
+ $result.on("change", function(e) {
215
+ grid.search();
216
+ });
217
+ }
218
+
219
+ return $result;
220
+ },
221
+
222
+ insertTemplate: function() {
223
+ if(!this.inserting)
224
+ return "";
225
+
226
+ return this.insertControl = this._createSelect();
227
+ },
228
+
229
+ editTemplate: function(value) {
230
+ if(!this.editing)
231
+ return this.itemTemplate.apply(this, arguments);
232
+
233
+ var $result = this.editControl = this._createSelect();
234
+ var editValue = value;
235
+ if(typeof(value) === "object"){
236
+ editValue = value[this.valueField];
237
+ }
238
+ (editValue !== undefined) && $result.val(editValue);
239
+ return $result;
240
+ },
241
+
242
+ filterValue: function() {
243
+ var val = this.filterControl.val();
244
+ return this.valueType === numberValueType ? parseInt(val || 0, 10) : val;
245
+ },
246
+
247
+ insertValue: function() {
248
+ var val = this.insertControl.val();
249
+ return this.valueType === numberValueType ? parseInt(val || 0, 10) : val;
250
+ },
251
+
252
+ editValue: function() {
253
+ var val = this.editControl.val();
254
+ return this.valueType === numberValueType ? parseInt(val || 0, 10) : val;
255
+ },
256
+
257
+ _createSelect: function() {
258
+ var $result = $("<select>"),
259
+ valueField = this.valueField,
260
+ textField = this.textField,
261
+ selectedIndex = this.selectedIndex;
262
+
263
+ $.each(this.items, function(index, item) {
264
+ var value = valueField ? item[valueField] : index,
265
+ text = textField ? item[textField] : item;
266
+
267
+ var $option = $("<option>")
268
+ .attr("value", value)
269
+ .text(text)
270
+ .appendTo($result);
271
+
272
+ });
273
+
274
+ $result.prop("disabled", !!this.readOnly);
275
+ $result.prop("selectedIndex", selectedIndex);
276
+
277
+ return $result;
278
+ }
279
+ });
280
+
281
+ jsGrid.fields.select = jsGrid.SelectField = SelectField;
282
+
283
+ }(jsGrid, jQuery));
284
+
285
+ (function(jsGrid, $, undefined) {
286
+
287
+ var Field = jsGrid.Field;
288
+
289
+ function CheckboxField(config) {
290
+ Field.call(this, config);
291
+ }
292
+
293
+ CheckboxField.prototype = new Field({
294
+
295
+ sorter: "number",
296
+ align: "center",
297
+ autosearch: true,
298
+
299
+ itemTemplate: function(value) {
300
+ return this._createCheckbox().prop({
301
+ checked: value,
302
+ disabled: true
303
+ });
304
+ },
305
+
306
+ filterTemplate: function() {
307
+ if(!this.filtering)
308
+ return "";
309
+
310
+ var grid = this._grid,
311
+ $result = this.filterControl = this._createCheckbox();
312
+
313
+ $result.prop({
314
+ readOnly: true,
315
+ indeterminate: true
316
+ });
317
+
318
+ $result.on("click", function() {
319
+ var $cb = $(this);
320
+
321
+ if($cb.prop("readOnly")) {
322
+ $cb.prop({
323
+ checked: false,
324
+ readOnly: false
325
+ });
326
+ }
327
+ else if(!$cb.prop("checked")) {
328
+ $cb.prop({
329
+ readOnly: true,
330
+ indeterminate: true
331
+ });
332
+ }
333
+ });
334
+
335
+ if(this.autosearch) {
336
+ $result.on("click", function() {
337
+ grid.search();
338
+ });
339
+ }
340
+
341
+ return $result;
342
+ },
343
+
344
+ insertTemplate: function() {
345
+ if(!this.inserting)
346
+ return "";
347
+
348
+ return this.insertControl = this._createCheckbox();
349
+ },
350
+
351
+ editTemplate: function(value) {
352
+ if(!this.editing)
353
+ return this.itemTemplate.apply(this, arguments);
354
+
355
+ var $result = this.editControl = this._createCheckbox();
356
+ $result.prop("checked", value);
357
+ return $result;
358
+ },
359
+
360
+ filterValue: function() {
361
+ return this.filterControl.get(0).indeterminate
362
+ ? undefined
363
+ : this.filterControl.is(":checked");
364
+ },
365
+
366
+ insertValue: function() {
367
+ return this.insertControl.is(":checked");
368
+ },
369
+
370
+ editValue: function() {
371
+ return this.editControl.is(":checked");
372
+ },
373
+
374
+ _createCheckbox: function() {
375
+ return $("<input>").attr("type", "checkbox");
376
+ }
377
+ });
378
+
379
+ jsGrid.fields.checkbox = jsGrid.CheckboxField = CheckboxField;
380
+
381
+ }(jsGrid, jQuery));
382
+
383
+ (function(jsGrid, $, undefined) {
384
+
385
+ var Field = jsGrid.Field;
386
+
387
+ function ControlField(config) {
388
+ Field.call(this, config);
389
+ this.includeInDataExport = false;
390
+ this._configInitialized = false;
391
+ }
392
+
393
+ ControlField.prototype = new Field({
394
+ css: "jsgrid-control-field",
395
+ align: "center",
396
+ width: 50,
397
+ filtering: false,
398
+ inserting: false,
399
+ editing: false,
400
+ sorting: false,
401
+
402
+ buttonClass: "jsgrid-button",
403
+ modeButtonClass: "jsgrid-mode-button",
404
+
405
+ modeOnButtonClass: "jsgrid-mode-on-button",
406
+ searchModeButtonClass: "jsgrid-search-mode-button",
407
+ insertModeButtonClass: "jsgrid-insert-mode-button",
408
+ editButtonClass: "jsgrid-edit-button",
409
+ deleteButtonClass: "jsgrid-delete-button",
410
+ searchButtonClass: "jsgrid-search-button",
411
+ clearFilterButtonClass: "jsgrid-clear-filter-button",
412
+ insertButtonClass: "jsgrid-insert-button",
413
+ updateButtonClass: "jsgrid-update-button",
414
+ cancelEditButtonClass: "jsgrid-cancel-edit-button",
415
+
416
+ searchModeButtonTooltip: "Switch to searching",
417
+ insertModeButtonTooltip: "Switch to inserting",
418
+ editButtonTooltip: "Edit",
419
+ deleteButtonTooltip: "Delete",
420
+ searchButtonTooltip: "Search",
421
+ clearFilterButtonTooltip: "Clear filter",
422
+ insertButtonTooltip: "Insert",
423
+ updateButtonTooltip: "Update",
424
+ cancelEditButtonTooltip: "Cancel edit",
425
+
426
+ editButton: true,
427
+ deleteButton: true,
428
+ clearFilterButton: true,
429
+ modeSwitchButton: true,
430
+
431
+ _initConfig: function() {
432
+ this._hasFiltering = this._grid.filtering;
433
+ this._hasInserting = this._grid.inserting;
434
+
435
+ if(this._hasInserting && this.modeSwitchButton) {
436
+ this._grid.inserting = false;
437
+ }
438
+
439
+ this._configInitialized = true;
440
+ },
441
+
442
+ headerTemplate: function() {
443
+ if(!this._configInitialized) {
444
+ this._initConfig();
445
+ }
446
+
447
+ var hasFiltering = this._hasFiltering;
448
+ var hasInserting = this._hasInserting;
449
+
450
+ if(!this.modeSwitchButton || (!hasFiltering && !hasInserting))
451
+ return "";
452
+
453
+ if(hasFiltering && !hasInserting)
454
+ return this._createFilterSwitchButton();
455
+
456
+ if(hasInserting && !hasFiltering)
457
+ return this._createInsertSwitchButton();
458
+
459
+ return this._createModeSwitchButton();
460
+ },
461
+
462
+ itemTemplate: function(value, item) {
463
+ var $result = $([]);
464
+
465
+ if(this.editButton) {
466
+ $result = $result.add(this._createEditButton(item));
467
+ }
468
+
469
+ if(this.deleteButton) {
470
+ $result = $result.add(this._createDeleteButton(item));
471
+ }
472
+
473
+ return $result;
474
+ },
475
+
476
+ filterTemplate: function() {
477
+ var $result = this._createSearchButton();
478
+ return this.clearFilterButton ? $result.add(this._createClearFilterButton()) : $result;
479
+ },
480
+
481
+ insertTemplate: function() {
482
+ return this._createInsertButton();
483
+ },
484
+
485
+ editTemplate: function() {
486
+ return this._createUpdateButton().add(this._createCancelEditButton());
487
+ },
488
+
489
+ _createFilterSwitchButton: function() {
490
+ return this._createOnOffSwitchButton("filtering", this.searchModeButtonClass, true);
491
+ },
492
+
493
+ _createInsertSwitchButton: function() {
494
+ return this._createOnOffSwitchButton("inserting", this.insertModeButtonClass, false);
495
+ },
496
+
497
+ _createOnOffSwitchButton: function(option, cssClass, isOnInitially) {
498
+ var isOn = isOnInitially;
499
+
500
+ var updateButtonState = $.proxy(function() {
501
+ $button.toggleClass(this.modeOnButtonClass, isOn);
502
+ }, this);
503
+
504
+ var $button = this._createGridButton(this.modeButtonClass + " " + cssClass, "", function(grid) {
505
+ isOn = !isOn;
506
+ grid.option(option, isOn);
507
+ updateButtonState();
508
+ });
509
+
510
+ updateButtonState();
511
+
512
+ return $button;
513
+ },
514
+
515
+ _createModeSwitchButton: function() {
516
+ var isInserting = false;
517
+
518
+ var updateButtonState = $.proxy(function() {
519
+ $button.attr("title", isInserting ? this.searchModeButtonTooltip : this.insertModeButtonTooltip)
520
+ .toggleClass(this.insertModeButtonClass, !isInserting)
521
+ .toggleClass(this.searchModeButtonClass, isInserting);
522
+ }, this);
523
+
524
+ var $button = this._createGridButton(this.modeButtonClass, "", function(grid) {
525
+ isInserting = !isInserting;
526
+ grid.option("inserting", isInserting);
527
+ grid.option("filtering", !isInserting);
528
+ updateButtonState();
529
+ });
530
+
531
+ updateButtonState();
532
+
533
+ return $button;
534
+ },
535
+
536
+ _createEditButton: function(item) {
537
+ return this._createGridButton(this.editButtonClass, this.editButtonTooltip, function(grid, e) {
538
+ grid.editItem(item);
539
+ e.stopPropagation();
540
+ });
541
+ },
542
+
543
+ _createDeleteButton: function(item) {
544
+ return this._createGridButton(this.deleteButtonClass, this.deleteButtonTooltip, function(grid, e) {
545
+ grid.deleteItem(item);
546
+ e.stopPropagation();
547
+ });
548
+ },
549
+
550
+ _createSearchButton: function() {
551
+ return this._createGridButton(this.searchButtonClass, this.searchButtonTooltip, function(grid) {
552
+ grid.search();
553
+ });
554
+ },
555
+
556
+ _createClearFilterButton: function() {
557
+ return this._createGridButton(this.clearFilterButtonClass, this.clearFilterButtonTooltip, function(grid) {
558
+ grid.clearFilter();
559
+ });
560
+ },
561
+
562
+ _createInsertButton: function() {
563
+ return this._createGridButton(this.insertButtonClass, this.insertButtonTooltip, function(grid) {
564
+ grid.insertItem().done(function() {
565
+ grid.clearInsert();
566
+ });
567
+ });
568
+ },
569
+
570
+ _createUpdateButton: function() {
571
+ return this._createGridButton(this.updateButtonClass, this.updateButtonTooltip, function(grid, e) {
572
+ grid.updateItem();
573
+ e.stopPropagation();
574
+ });
575
+ },
576
+
577
+ _createCancelEditButton: function() {
578
+ return this._createGridButton(this.cancelEditButtonClass, this.cancelEditButtonTooltip, function(grid, e) {
579
+ grid.cancelEdit();
580
+ e.stopPropagation();
581
+ });
582
+ },
583
+
584
+ _createGridButton: function(cls, tooltip, clickHandler) {
585
+ var grid = this._grid;
586
+
587
+ return $("<input>").addClass(this.buttonClass)
588
+ .addClass(cls)
589
+ .attr({
590
+ type: "button",
591
+ title: tooltip
592
+ })
593
+ .on("click", function(e) {
594
+ clickHandler(grid, e);
595
+ });
596
+ },
597
+
598
+ editValue: function() {
599
+ return "";
600
+ }
601
+
602
+ });
603
+
604
+ jsGrid.fields.control = jsGrid.ControlField = ControlField;
605
+
606
+ }(jsGrid, jQuery));
@@ -0,0 +1,6 @@
1
+ /*
2
+ * jsxgrid v2.0.0 (https://github.com/rok9ru/jsxgrid#readme)
3
+ * (c) 2026 Mikhail Kremza
4
+ * Licensed under MIT
5
+ */
6
+ ((t,e)=>{var i=t.Field;function n(t){i.call(this,t)}n.prototype=new i({autosearch:!0,readOnly:!1,filterTemplate:function(){var e,t;return this.filtering?(e=this._grid,t=this.filterControl=this._createTextBox(),this.autosearch&&t.on("keypress",function(t){13===t.which&&(e.search(),t.preventDefault())}),t):""},insertTemplate:function(){return this.inserting?this.insertControl=this._createTextBox():""},editTemplate:function(t){var e;return this.editing?((e=this.editControl=this._createTextBox()).val(t),e):this.itemTemplate.apply(this,arguments)},filterValue:function(){return this.filterControl.val()},insertValue:function(){return this.insertControl.val()},editValue:function(){return this.editControl.val()},_createTextBox:function(){return e("<input>").attr("type","text").prop("readonly",!!this.readOnly)}}),t.fields.text=t.TextField=n})(jsGrid,jQuery),((t,e,i)=>{var n=t.TextField;function r(t){n.call(this,t)}r.prototype=new n({sorter:"number",align:"right",readOnly:!1,filterValue:function(){return this.filterControl.val()?parseInt(this.filterControl.val()||0,10):i},insertValue:function(){return this.insertControl.val()?parseInt(this.insertControl.val()||0,10):i},editValue:function(){return this.editControl.val()?parseInt(this.editControl.val()||0,10):i},_createTextBox:function(){return e("<input>").attr("type","number").prop("readonly",!!this.readOnly)}}),t.fields.number=t.NumberField=r})(jsGrid,jQuery),((t,e)=>{var i=t.TextField;function n(t){i.call(this,t)}n.prototype=new i({insertTemplate:function(){return this.inserting?this.insertControl=this._createTextArea():""},editTemplate:function(t){var e;return this.editing?((e=this.editControl=this._createTextArea()).val(t),e):this.itemTemplate.apply(this,arguments)},_createTextArea:function(){return e("<textarea>").prop("readonly",!!this.readOnly)}}),t.fields.textarea=t.TextAreaField=n})(jsGrid,jQuery),((t,o,r)=>{var i=t.NumberField,n="number";function e(t){var e;this.items=[],this.selectedIndex=-1,this.valueField="",this.textField="",t.valueField&&t.items.length&&(e=t.items[0][t.valueField],this.valueType=typeof e==n?n:"string"),this.sorter=this.valueType,i.call(this,t)}e.prototype=new i({align:"center",valueType:n,itemTemplate:function(i){var t=this.items,n=this.valueField,e=this.textField,t=n?"object"==typeof i?i:o.grep(t,function(t,e){return t[n]===i})[0]||{}:t[i],e=e?t[e]:t;return e===r||null===e?"":e},filterTemplate:function(){var e,t;return this.filtering?(e=this._grid,t=this.filterControl=this._createSelect(),this.autosearch&&t.on("change",function(t){e.search()}),t):""},insertTemplate:function(){return this.inserting?this.insertControl=this._createSelect():""},editTemplate:function(t){var e,i;return this.editing?(e=this.editControl=this._createSelect(),(i="object"==typeof(i=t)?t[this.valueField]:t)!==r&&e.val(i),e):this.itemTemplate.apply(this,arguments)},filterValue:function(){var t=this.filterControl.val();return this.valueType===n?parseInt(t||0,10):t},insertValue:function(){var t=this.insertControl.val();return this.valueType===n?parseInt(t||0,10):t},editValue:function(){var t=this.editControl.val();return this.valueType===n?parseInt(t||0,10):t},_createSelect:function(){var i=o("<select>"),n=this.valueField,r=this.textField,t=this.selectedIndex;return o.each(this.items,function(t,e){t=n?e[n]:t,e=r?e[r]:e;o("<option>").attr("value",t).text(e).appendTo(i)}),i.prop("disabled",!!this.readOnly),i.prop("selectedIndex",t),i}}),t.fields.select=t.SelectField=e})(jsGrid,jQuery),((t,i)=>{var e=t.Field;function n(t){e.call(this,t)}n.prototype=new e({sorter:"number",align:"center",autosearch:!0,itemTemplate:function(t){return this._createCheckbox().prop({checked:t,disabled:!0})},filterTemplate:function(){var t,e;return this.filtering?(t=this._grid,(e=this.filterControl=this._createCheckbox()).prop({readOnly:!0,indeterminate:!0}),e.on("click",function(){var t=i(this);t.prop("readOnly")?t.prop({checked:!1,readOnly:!1}):t.prop("checked")||t.prop({readOnly:!0,indeterminate:!0})}),this.autosearch&&e.on("click",function(){t.search()}),e):""},insertTemplate:function(){return this.inserting?this.insertControl=this._createCheckbox():""},editTemplate:function(t){var e;return this.editing?((e=this.editControl=this._createCheckbox()).prop("checked",t),e):this.itemTemplate.apply(this,arguments)},filterValue:function(){return this.filterControl.get(0).indeterminate?void 0:this.filterControl.is(":checked")},insertValue:function(){return this.insertControl.is(":checked")},editValue:function(){return this.editControl.is(":checked")},_createCheckbox:function(){return i("<input>").attr("type","checkbox")}}),t.fields.checkbox=t.CheckboxField=n})(jsGrid,jQuery),((t,s)=>{var e=t.Field;function i(t){e.call(this,t),this.includeInDataExport=!1,this._configInitialized=!1}i.prototype=new e({css:"jsgrid-control-field",align:"center",width:50,filtering:!1,inserting:!1,editing:!1,sorting:!1,buttonClass:"jsgrid-button",modeButtonClass:"jsgrid-mode-button",modeOnButtonClass:"jsgrid-mode-on-button",searchModeButtonClass:"jsgrid-search-mode-button",insertModeButtonClass:"jsgrid-insert-mode-button",editButtonClass:"jsgrid-edit-button",deleteButtonClass:"jsgrid-delete-button",searchButtonClass:"jsgrid-search-button",clearFilterButtonClass:"jsgrid-clear-filter-button",insertButtonClass:"jsgrid-insert-button",updateButtonClass:"jsgrid-update-button",cancelEditButtonClass:"jsgrid-cancel-edit-button",searchModeButtonTooltip:"Switch to searching",insertModeButtonTooltip:"Switch to inserting",editButtonTooltip:"Edit",deleteButtonTooltip:"Delete",searchButtonTooltip:"Search",clearFilterButtonTooltip:"Clear filter",insertButtonTooltip:"Insert",updateButtonTooltip:"Update",cancelEditButtonTooltip:"Cancel edit",editButton:!0,deleteButton:!0,clearFilterButton:!0,modeSwitchButton:!0,_initConfig:function(){this._hasFiltering=this._grid.filtering,this._hasInserting=this._grid.inserting,this._hasInserting&&this.modeSwitchButton&&(this._grid.inserting=!1),this._configInitialized=!0},headerTemplate:function(){this._configInitialized||this._initConfig();var t=this._hasFiltering,e=this._hasInserting;return this.modeSwitchButton&&(t||e)?t&&!e?this._createFilterSwitchButton():e&&!t?this._createInsertSwitchButton():this._createModeSwitchButton():""},itemTemplate:function(t,e){var i=s([]);return this.editButton&&(i=i.add(this._createEditButton(e))),i=this.deleteButton?i.add(this._createDeleteButton(e)):i},filterTemplate:function(){var t=this._createSearchButton();return this.clearFilterButton?t.add(this._createClearFilterButton()):t},insertTemplate:function(){return this._createInsertButton()},editTemplate:function(){return this._createUpdateButton().add(this._createCancelEditButton())},_createFilterSwitchButton:function(){return this._createOnOffSwitchButton("filtering",this.searchModeButtonClass,!0)},_createInsertSwitchButton:function(){return this._createOnOffSwitchButton("inserting",this.insertModeButtonClass,!1)},_createOnOffSwitchButton:function(e,t,i){var n=i,r=s.proxy(function(){o.toggleClass(this.modeOnButtonClass,n)},this),o=this._createGridButton(this.modeButtonClass+" "+t,"",function(t){n=!n,t.option(e,n),r()});return r(),o},_createModeSwitchButton:function(){var e=!1,i=s.proxy(function(){t.attr("title",e?this.searchModeButtonTooltip:this.insertModeButtonTooltip).toggleClass(this.insertModeButtonClass,!e).toggleClass(this.searchModeButtonClass,e)},this),t=this._createGridButton(this.modeButtonClass,"",function(t){e=!e,t.option("inserting",e),t.option("filtering",!e),i()});return i(),t},_createEditButton:function(i){return this._createGridButton(this.editButtonClass,this.editButtonTooltip,function(t,e){t.editItem(i),e.stopPropagation()})},_createDeleteButton:function(i){return this._createGridButton(this.deleteButtonClass,this.deleteButtonTooltip,function(t,e){t.deleteItem(i),e.stopPropagation()})},_createSearchButton:function(){return this._createGridButton(this.searchButtonClass,this.searchButtonTooltip,function(t){t.search()})},_createClearFilterButton:function(){return this._createGridButton(this.clearFilterButtonClass,this.clearFilterButtonTooltip,function(t){t.clearFilter()})},_createInsertButton:function(){return this._createGridButton(this.insertButtonClass,this.insertButtonTooltip,function(t){t.insertItem().done(function(){t.clearInsert()})})},_createUpdateButton:function(){return this._createGridButton(this.updateButtonClass,this.updateButtonTooltip,function(t,e){t.updateItem(),e.stopPropagation()})},_createCancelEditButton:function(){return this._createGridButton(this.cancelEditButtonClass,this.cancelEditButtonTooltip,function(t,e){t.cancelEdit(),e.stopPropagation()})},_createGridButton:function(t,e,i){var n=this._grid;return s("<input>").addClass(this.buttonClass).addClass(t).attr({type:"button",title:e}).on("click",function(t){i(n,t)})},editValue:function(){return""}}),t.fields.control=t.ControlField=i})(jsGrid,jQuery);