@agung_dhewe/webapps 1.1.2 → 1.2.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.

Potentially problematic release.


This version of @agung_dhewe/webapps might be problematic. Click here for more details.

Files changed (89) hide show
  1. package/lib/fgta5js-dist/fgta5js-v1.8.5.min.js +11 -0
  2. package/lib/fgta5js-dist/fgta5js-v1.8.5.min.js.map +1 -0
  3. package/{libs → lib}/webmodule/module-edit.css +73 -18
  4. package/{libs → lib}/webmodule/module-list.css +13 -0
  5. package/lib/webmodule/module-print.css +28 -0
  6. package/{libs → lib}/webmodule/module.css +13 -6
  7. package/{libs → lib}/webmodule/module.js +14 -4
  8. package/lib/webmodule/pagehelper.mjs +129 -0
  9. package/modules/generator/appgen-io.mjs +153 -76
  10. package/modules/generator/appgen-ui.mjs +234 -167
  11. package/modules/generator/generator-designtemplate-def.html +38 -0
  12. package/modules/generator/generator-designtemplate.html +11 -1492
  13. package/modules/generator/generator.css +103 -65
  14. package/modules/generator/generator.mjs +1 -1
  15. package/modules/generator/generator.svg +98 -0
  16. package/modules/generator/generatorEdit.mjs +43 -35
  17. package/modules/generator/generatorList.mjs +27 -0
  18. package/modules/generator/tpl-designerinfo.html +100 -0
  19. package/modules/generator/tpl-field-checkbox.html +200 -0
  20. package/modules/generator/tpl-field-combobox.html +228 -0
  21. package/modules/generator/tpl-field-datepicker.html +192 -0
  22. package/modules/generator/tpl-field-filebox.html +189 -0
  23. package/modules/generator/tpl-field-numberbox.html +218 -0
  24. package/modules/generator/tpl-field-textbox.html +255 -0
  25. package/modules/generator/tpl-field-timepicker.html +192 -0
  26. package/modules/generator/tpl-searchdesign.html +32 -0
  27. package/modules/generator/tpl-uniquedesign.html +25 -0
  28. package/modules/login/login.css +10 -2
  29. package/package.json +3 -1
  30. package/percobaan/coba-sequencer.js +16 -0
  31. package/src/api.js +12 -9
  32. package/src/apis/generator.api.js +35 -23
  33. package/src/apis/login.api.js +1 -0
  34. package/src/db.js +58 -32
  35. package/src/generator/createApiModule.js +4 -1
  36. package/src/generator/createIcon.js +24 -2
  37. package/src/generator/createLayoutCss.js +107 -0
  38. package/src/generator/createModuleDetilEditHtml.js +12 -1
  39. package/src/generator/createModuleDetilEditMjs.js +32 -28
  40. package/src/generator/createModuleDetilListHtml.js +14 -7
  41. package/src/generator/createModuleDetilListMjs.js +13 -1
  42. package/src/generator/createModuleHeaderEditHtml.js +13 -1
  43. package/src/generator/createModuleHeaderEditMjs.js +23 -2
  44. package/src/generator/createProgramData.js +3 -2
  45. package/src/generator/createTable.js +45 -38
  46. package/src/generator/helper.js +45 -27
  47. package/src/generator/templates/__rollup-module.ejs +1 -1
  48. package/src/generator/templates/api-module.js.ejs +171 -32
  49. package/src/generator/templates/layout.css.ejs +24 -0
  50. package/src/generator/templates/module-ext.html.ejs +1 -1
  51. package/src/generator/templates/module-ext.mjs.ejs +19 -1
  52. package/src/generator/templates/module.ejs.ejs +8 -0
  53. package/src/generator/templates/module.mjs.ejs +42 -5
  54. package/src/generator/templates/moduleDetilEdit.html.ejs +11 -0
  55. package/src/generator/templates/moduleDetilEdit.mjs.ejs +135 -30
  56. package/src/generator/templates/moduleDetilList.html.ejs +2 -1
  57. package/src/generator/templates/moduleDetilList.mjs.ejs +86 -11
  58. package/src/generator/templates/moduleHeaderEdit.html.ejs +8 -1
  59. package/src/generator/templates/moduleHeaderEdit.mjs.ejs +123 -36
  60. package/src/generator/templates/moduleHeaderList.html.ejs +5 -1
  61. package/src/generator/templates/moduleHeaderList.mjs.ejs +47 -15
  62. package/src/generator/trygenerate.js +18 -2
  63. package/src/generator/worker.js +83 -72
  64. package/src/logger.js +12 -12
  65. package/src/notifier.js +29 -0
  66. package/src/routers/generatorPage.js +3 -1
  67. package/src/routers/modulePage.js +32 -7
  68. package/src/sequencerdoc.js +22 -46
  69. package/src/sequencerline.js +16 -4
  70. package/src/session.js +69 -33
  71. package/src/startup.js +47 -10
  72. package/src/webapps.js +61 -18
  73. package/templates/_lib_debug.ejs +8 -8
  74. package/templates/_lib_production.ejs +2 -2
  75. package/templates/application.page.ejs +39 -6
  76. package/templates/generator.page.ejs +4 -3
  77. package/templates/index.page.ejs +2 -2
  78. package/templates/login.page.ejs +3 -3
  79. package/libs/fgta5js-dist/fgta5js-v1.8.3.min.js +0 -11
  80. package/libs/fgta5js-dist/fgta5js-v1.8.3.min.js.map +0 -1
  81. package/libs/webmodule/pagehelper.mjs +0 -45
  82. package/modules/generator/generator.png +0 -0
  83. /package/{libs/fgta5js-dist/fgta5js-v1.8.3.min.css → lib/fgta5js-dist/fgta5js-v1.8.5.min.css} +0 -0
  84. /package/{libs → lib}/fgta5js-dist/fonts/karla-italic-latin-ext.woff2 +0 -0
  85. /package/{libs → lib}/fgta5js-dist/fonts/karla-italic-latin.woff2 +0 -0
  86. /package/{libs → lib}/fgta5js-dist/fonts/karla-normal-latin-ext.woff2 +0 -0
  87. /package/{libs → lib}/fgta5js-dist/fonts/karla-normal-latin.woff2 +0 -0
  88. /package/{libs → lib}/fgta5js-dist/fonts/karla.css +0 -0
  89. /package/{libs → lib}/webmodule/module-footer.css +0 -0
@@ -10,24 +10,24 @@ const ATTR_ROWSEARCH = 'data-rowsearch'
10
10
 
11
11
  // const Context = {}
12
12
 
13
- const isValidName = str => /^[_a-z0-9]+$/.test(str) ;
13
+ const isValidName = str => /^[_a-z0-9]+$/.test(str);
14
14
 
15
15
  const timestamp = () => {
16
- const now = new Date();
17
- const YYYY = now.getFullYear();
18
- const MM = String(now.getMonth() + 1).padStart(2, "0");
19
- const DD = String(now.getDate()).padStart(2, "0");
20
- const HH = String(now.getHours()).padStart(2, "0");
21
- const mm = String(now.getMinutes()).padStart(2, "0");
22
- const SS = String(now.getSeconds()).padStart(2, "0");
23
- return `${YYYY}${MM}${DD}${HH}${mm}${SS}`;
16
+ const now = new Date();
17
+ const YYYY = now.getFullYear();
18
+ const MM = String(now.getMonth() + 1).padStart(2, "0");
19
+ const DD = String(now.getDate()).padStart(2, "0");
20
+ const HH = String(now.getHours()).padStart(2, "0");
21
+ const mm = String(now.getMinutes()).padStart(2, "0");
22
+ const SS = String(now.getSeconds()).padStart(2, "0");
23
+ return `${YYYY}${MM}${DD}${HH}${mm}${SS}`;
24
24
  }
25
25
 
26
26
  export default class AppGenIO {
27
27
  Setup(config) {
28
28
  AppGenIO_Setup(this, config)
29
29
  }
30
-
30
+
31
31
 
32
32
  AutoSave() {
33
33
  AppGenIO_AutoSave(this)
@@ -42,14 +42,14 @@ export default class AppGenIO {
42
42
  }
43
43
 
44
44
  // cek AppGenIO_Setup untuk ovveride fungsi2 di bawah
45
- AddEntity(data) {} // ini nanti di ovveride saat setup
46
- startDesign(entity_id) {}
45
+ AddEntity(data) { } // ini nanti di ovveride saat setup
46
+ startDesign(entity_id) { }
47
47
 
48
48
 
49
49
  #autoSavePaused = false
50
50
  get autoSavePaused() { return this.#autoSavePaused }
51
51
  pauseAutoSave(autoSavePaused) {
52
- console.log(autoSavePaused? 'auto save paused' : 'auto save resume')
52
+ console.log(autoSavePaused ? 'auto save paused' : 'auto save resume')
53
53
  this.#autoSavePaused = autoSavePaused
54
54
  }
55
55
 
@@ -83,38 +83,38 @@ export default class AppGenIO {
83
83
 
84
84
  function getValueFrom(datafield, query, propertyname) {
85
85
  var el = datafield.querySelector(query)
86
- if (el==null) {
86
+ if (el == null) {
87
87
  return null
88
88
  }
89
- if (el[propertyname]===undefined) {
89
+ if (el[propertyname] === undefined) {
90
90
  return null
91
- }
91
+ }
92
92
  return el[propertyname]
93
93
  }
94
94
 
95
95
  function getCheckedFrom(datafield, query) {
96
96
  var el = datafield.querySelector(query)
97
- if (el==null) {
97
+ if (el == null) {
98
98
  return false
99
99
  }
100
100
 
101
- return el.checked===true ? true : false
101
+ return el.checked === true ? true : false
102
102
  }
103
103
 
104
104
  function setValueTo(value, datafield, query, propertyname) {
105
105
  var el = datafield.querySelector(query)
106
- if (el==null) {
106
+ if (el == null) {
107
107
  return null
108
108
  }
109
- if (el[propertyname]===undefined) {
109
+ if (el[propertyname] === undefined) {
110
110
  return null
111
- }
111
+ }
112
112
  el[propertyname] = value
113
113
  }
114
114
 
115
115
  function setCheckedTo(checked, datafield, query) {
116
116
  var el = datafield.querySelector(query)
117
- if (el==null) {
117
+ if (el == null) {
118
118
  return false
119
119
  }
120
120
  el.checked = checked
@@ -122,7 +122,7 @@ function setCheckedTo(checked, datafield, query) {
122
122
 
123
123
  function setSelectedTo(value, datafield, query) {
124
124
  var el = datafield.querySelector(query)
125
- if (el==null) {
125
+ if (el == null) {
126
126
  return false
127
127
  }
128
128
 
@@ -145,24 +145,24 @@ function AppGenIO_Setup(self, config) {
145
145
 
146
146
 
147
147
  btn.save = document.getElementById('btnAppGenSave')
148
- btn.save.addEventListener('click', async (evt)=>{
148
+ btn.save.addEventListener('click', async (evt) => {
149
149
 
150
150
  const data = await AppGenIO_GetCurrentWorkData(self)
151
151
  const suggestedName = data.name
152
152
  const handle = await window.showSaveFilePicker({
153
153
  suggestedName,
154
154
  types: [
155
- {
156
- description: "JSON File",
157
- accept: { "application/json": [".json"] },
158
- },
155
+ {
156
+ description: "JSON File",
157
+ accept: { "application/json": [".json"] },
158
+ },
159
159
  ],
160
160
  });
161
161
 
162
-
162
+
163
163
  const writable = await handle.createWritable();
164
- await writable.write(JSON.stringify(data, null, 2)); // prettify JSON
165
- await writable.close();
164
+ await writable.write(JSON.stringify(data, null, 2)); // prettify JSON
165
+ await writable.close();
166
166
 
167
167
  // AppGenIO_Save(self, evt)
168
168
  })
@@ -170,23 +170,23 @@ function AppGenIO_Setup(self, config) {
170
170
 
171
171
 
172
172
  btn.load = document.getElementById('btnAppGenLoad')
173
- btn.load.addEventListener('click', (evt)=>{
173
+ btn.load.addEventListener('click', (evt) => {
174
174
  const input = document.createElement("input");
175
175
  input.type = "file";
176
176
  input.accept = ".json"; // opsional: filter ekstensi
177
177
  input.style.display = "none"; // tidak perlu ditambahkan ke dokumen
178
-
178
+
179
179
  input.addEventListener("change", () => {
180
180
  if (input.files.length > 0) {
181
181
  const file = input.files[0]
182
182
  if (!file) return;
183
-
183
+
184
184
  const reader = new FileReader();
185
185
  reader.onload = function (e) {
186
186
  const content = e.target.result;
187
187
  AppGenIO_ReadData(self, content)
188
188
  };
189
- reader.readAsText(file);
189
+ reader.readAsText(file);
190
190
  }
191
191
  });
192
192
 
@@ -207,6 +207,9 @@ function AppGenIO_updateCache(data) {
207
207
 
208
208
  function AppGenIO_AutoSave(self) {
209
209
  // autosave ke local storage per 10 detik
210
+
211
+ // AUTO SAVE tidak digunaka lagi
212
+ /*
210
213
  const svr = setInterval(async ()=>{
211
214
  try {
212
215
  if (!self.autoSavePaused) {
@@ -218,6 +221,7 @@ function AppGenIO_AutoSave(self) {
218
221
  console.log(err.message)
219
222
  }
220
223
  }, 10000)
224
+ */
221
225
  }
222
226
 
223
227
  /*
@@ -265,7 +269,7 @@ async function AppGenIO_GetCurrentWorkData(self) {
265
269
  uniques: {},
266
270
  search: {},
267
271
  }
268
-
272
+
269
273
  try {
270
274
  AppGenIO_GetDef(self, PROG)
271
275
  AppGenIO_GetActions(self, PROG)
@@ -292,7 +296,7 @@ function AppGenIO_GetDef(self, PROG) {
292
296
  PROG.id = obj_programid.value
293
297
  PROG.appname = obj_appname.value.toLowerCase()
294
298
  PROG.name = obj_programname.value.toLowerCase()
295
- PROG.title = obj_programtitle.value
299
+ PROG.title = obj_programtitle.value
296
300
  PROG.directory = obj_directory.value
297
301
  PROG.description = obj_programdescription.value
298
302
  PROG.icon = obj_icon.style.backgroundImage
@@ -323,13 +327,13 @@ function AppGenIO_GetEntities(self, PROG) {
323
327
  tr.classList.remove('field-error')
324
328
  try {
325
329
  var entity_id = tr.getAttribute('data-entity-id')
326
- let entity = AppGenIO_GetEntityData(self, entity_id)
327
-
330
+ let entity = AppGenIO_GetEntityData(self, entity_id)
331
+
328
332
  if (!isValidName(entity.name)) {
329
333
  throw new Error(`entity name '${entity.name}' tidak valid`)
330
334
  }
331
335
 
332
- if (PROG.entities[entity.name]!==undefined) {
336
+ if (PROG.entities[entity.name] !== undefined) {
333
337
  // sudah ada, entiti duplikasi
334
338
  throw new Error(`entity ${entity.name} terduplikasi`)
335
339
  }
@@ -363,30 +367,49 @@ function AppGenIO_GetEntityData(self, entity_id) {
363
367
  var elTable = editor.querySelector('div[name="designer-info"] div[name="col_table"]')
364
368
  var elPK = editor.querySelector('div[name="designer-info"] div[name="col_pk"]')
365
369
  var elInputDescr = editor.querySelector('div[name="designer-info"] input[name="table-descr"]')
370
+ var elChkSkipRegenerateTable = editor.querySelector('div[name="designer-info"] input[name="skip-regenerate-table"]')
371
+
372
+
373
+ var elChkFormGridLayout = editor.querySelector('div[name="designer-info"] input[name="form-grid-layout"]')
374
+ var elChkFormNew = editor.querySelector('div[name="designer-info"] input[name="allow-form-new"]')
375
+ var elChkFormEdit = editor.querySelector('div[name="designer-info"] input[name="allow-form-edit"]')
376
+
366
377
  var elChkRowAdd = editor.querySelector('div[name="designer-info"] input[name="allow-row-add"]')
367
378
  var elChkRowRemove = editor.querySelector('div[name="designer-info"] input[name="allow-row-remove"]')
379
+ var elChkRowEdit = editor.querySelector('div[name="designer-info"] input[name="allow-row-edit"]')
368
380
 
369
381
  var elIdMethod = editor.querySelector('div[name="designer-info"] select[name="identifier-method"]')
370
382
  var elIdfPrefix = editor.querySelector('div[name="designer-info"] input[name="identifier-prefix"]')
371
383
  var elIdBlock = editor.querySelector('div[name="designer-info"] input[name="identifier-block"]')
372
384
  var elIdLength = editor.querySelector('div[name="designer-info"] input[name="identifier-length"]')
373
385
 
386
+ var elBindHTitle = editor.querySelector('div[name="designer-info"] input[name="bind_head_title"]')
387
+ var elBindHDescr = editor.querySelector('div[name="designer-info"] input[name="bind_head_descr"]')
388
+
374
389
 
375
390
 
376
391
 
377
392
  entity.name = elName.innerHTML.toLowerCase()
378
- entity.isheader = entity.name=='header' ? true : false;
393
+ entity.isheader = entity.name == 'header' ? true : false;
379
394
  entity.title = elTitle.innerHTML
380
395
  entity.table = elTable.innerHTML.toLowerCase()
381
396
  entity.pk = elPK.innerHTML.toLowerCase()
382
397
  entity.descr = elInputDescr.value
398
+ entity.skipRegenerateTable = elChkSkipRegenerateTable.checked ? true : false
399
+
400
+ entity.formGridLayout = elChkFormGridLayout.checked ? true : false
401
+ entity.allowFormNew = elChkFormNew.checked ? true : false
402
+ entity.allowFormEdit = elChkFormEdit.checked ? true : false
383
403
  entity.allowRowAdd = elChkRowAdd.checked ? true : false
384
404
  entity.allowRowRemove = elChkRowRemove.checked ? true : false
405
+ entity.allowRowEdit = elChkRowEdit.checked ? true : false
406
+
385
407
  entity.identifierMethod = elIdMethod.value
386
408
  entity.identifierPrefix = elIdfPrefix.value
387
409
  entity.identifierBlock = elIdBlock.value
388
410
  entity.identifierLength = elIdLength.value
389
-
411
+ entity.bindHeadTitle = elBindHTitle.value
412
+ entity.bindHeadDescr = elBindHDescr.value
390
413
 
391
414
  entity.Items = {}
392
415
 
@@ -399,7 +422,7 @@ function AppGenIO_GetEntityData(self, entity_id) {
399
422
 
400
423
  for (let elfield of elAllFields) {
401
424
  let field = AppGenIO_GetFieldData(self, elfield)
402
- if (entity.Items[field.name]!==undefined) {
425
+ if (entity.Items[field.name] !== undefined) {
403
426
  elfield.classList.add('field-error')
404
427
  throw new Error(`fieldname '${field.name}' terduplikasi!`)
405
428
  }
@@ -425,14 +448,14 @@ function AppGenIO_GetEntityUnique(self, editor) {
425
448
  const name = tdName.innerHTML
426
449
  const fields = tdFields.innerHTML
427
450
 
428
- uniques[name] = {name, fields}
451
+ uniques[name] = { name, fields }
429
452
  }
430
453
 
431
454
  return uniques
432
455
  }
433
456
 
434
457
  function AppGenIO_GetEntitySearch(self, editor) {
435
- console.log('get entity search')
458
+ // console.log('get entity search')
436
459
 
437
460
  const search = {}
438
461
  const tbl = editor.querySelector('table[name="tbl-search"]')
@@ -445,7 +468,7 @@ function AppGenIO_GetEntitySearch(self, editor) {
445
468
  const label = tdLabel.innerHTML
446
469
  const fields = tdFields.innerHTML
447
470
 
448
- search[name] = {name, label, fields}
471
+ search[name] = { name, label, fields }
449
472
  }
450
473
 
451
474
  return search
@@ -455,7 +478,7 @@ function AppGenIO_GetEntitySearch(self, editor) {
455
478
 
456
479
  function AppGenIO_GetFieldData(self, el) {
457
480
  const field = {}
458
-
481
+
459
482
  field.component = el.getAttribute(ATTR_COMPNAME)
460
483
  field.data_fieldname = getValueFrom(el, 'input[name="fieldname"]', 'value')
461
484
  field.name = field.data_fieldname.toLowerCase()
@@ -470,8 +493,15 @@ function AppGenIO_GetFieldData(self, el) {
470
493
  // allownull
471
494
  field.data_allownull = getCheckedFrom(el, 'input[name="allownull"]')
472
495
 
496
+ // multiline
497
+ field.input_multiline = getCheckedFrom(el, 'input[name="multiline"]')
498
+
499
+
500
+
501
+
502
+
473
503
  // get defaul value
474
- if (field.component=='Checkbox') {
504
+ if (field.component == 'Checkbox') {
475
505
  var defaultChecked = getCheckedFrom(el, 'input[name="defaultvalue"]')
476
506
  field.data_defaultvalue = defaultChecked ? 1 : 0
477
507
  } else {
@@ -492,24 +522,32 @@ function AppGenIO_GetFieldData(self, el) {
492
522
  field.input_information = getValueFrom(el, 'input[name="information"]', 'value') ?? ''
493
523
  field.input_containercss = getValueFrom(el, 'input[name="input-containercss"]', 'value') ?? ''
494
524
  field.input_inlinestyle = getValueFrom(el, 'input[name="input-inlinestyle"]', 'value') ?? ''
495
-
496
-
525
+
526
+
497
527
  var sel_charcase = el.querySelector('select[name="charcasing"]')
498
- if (sel_charcase!=null) {
528
+ if (sel_charcase != null) {
499
529
  field.input_charcase = sel_charcase.value
500
530
  } else {
501
531
  field.input_charcase = 'normal'
502
532
  }
503
533
 
504
534
  var chk_inputdisabled = el.querySelector('input[name="disabledinform"]')
505
- field.input_disabled = chk_inputdisabled.checked ? true : false
535
+ field.input_disabled = chk_inputdisabled.checked ? true : false
506
536
 
507
- var chk_showingrid = el.querySelector('input[name="showingrid"]')
537
+ var chk_showingrid = el.querySelector('input[name="showingrid"]')
508
538
  field.showInGrid = chk_showingrid.checked ? true : false
509
539
 
510
- var chk_showinform = el.querySelector('input[name="showinform"]')
540
+ var chk_showinform = el.querySelector('input[name="showinform"]')
511
541
  field.showInForm = chk_showinform.checked ? true : false
512
542
 
543
+ // desktop position
544
+ field.input_dposrow = getValueFrom(el, 'input[name="input-dposrow"]', 'value') ?? ''
545
+ field.input_dposrowspan = getValueFrom(el, 'input[name="input-dposrowspan"]', 'value') ?? ''
546
+ field.input_dposcol = getValueFrom(el, 'input[name="input-dposcol"]', 'value') ?? ''
547
+ field.input_dposcolspan = getValueFrom(el, 'input[name="input-dposcolspan"]', 'value') ?? ''
548
+ field.input_dposstyle = getValueFrom(el, 'input[name="input-dposstyle"]', 'value') ?? ''
549
+
550
+
513
551
  // grid related
514
552
  field.grid_formatter = getValueFrom(el, 'input[name="gridformatter"]', 'value') ?? ''
515
553
  field.grid_css = getValueFrom(el, 'input[name="gridcss"]', 'value') ?? ''
@@ -533,7 +571,7 @@ function AppGenIO_GetFieldData(self, el) {
533
571
  field.Validation.hasCustomValidator = getCheckedFrom(el, 'input[name="hascustomvalidator"]')
534
572
  field.Validation.customValidator = getValueFrom(el, 'input[name="validator"]', 'value')
535
573
 
536
-
574
+
537
575
 
538
576
  field.Reference = {}
539
577
  field.Reference.table = getValueFrom(el, 'input[name="ref_table"]', 'value')
@@ -544,12 +582,13 @@ function AppGenIO_GetFieldData(self, el) {
544
582
  field.Reference.loaderApiModule = getValueFrom(el, 'input[name="loaderapimodule"]', 'value')
545
583
  field.Reference.loaderApiPath = getValueFrom(el, 'input[name="loaderapipath"]', 'value')
546
584
 
547
-
585
+
548
586
  field.Handle = {}
549
587
  field.Handle.changed = getCheckedFrom(el, 'input[name="ishandlechanged"]')
550
588
  field.Handle.input = getCheckedFrom(el, 'input[name="ishandleinput"]')
551
589
  field.Handle.keydown = getCheckedFrom(el, 'input[name="ishandlekeydown"]')
552
590
  field.Handle.checked = getCheckedFrom(el, 'input[name="ishandlechecked"]')
591
+ field.Handle.unchecked = getCheckedFrom(el, 'input[name="ishandleunchecked"]')
553
592
  field.Handle.selected = getCheckedFrom(el, 'input[name="ishandleselected"]')
554
593
  field.Handle.selecting = getCheckedFrom(el, 'input[name="ishandleselecting"]')
555
594
  field.Handle.populating = getCheckedFrom(el, 'input[name="ishandlepopulating"]')
@@ -559,7 +598,7 @@ function AppGenIO_GetFieldData(self, el) {
559
598
  if (!isValidName(field.data_fieldname)) {
560
599
  el.classList.add('field-error')
561
600
  throw new Error('Nama Field is not valid, gunakan huruf kecil, karakter special _ atau angka')
562
- }
601
+ }
563
602
 
564
603
  return field
565
604
  }
@@ -598,7 +637,7 @@ async function AppGenIO_Load(self, data) {
598
637
  const obj_programdescription = document.getElementById('obj_programdescription')
599
638
  const obj_icon = document.getElementById('upload-icon')
600
639
 
601
- obj_programid.value = data.id
640
+ obj_programid.value = data.id
602
641
  obj_appname.value = data.appname
603
642
  obj_programname.value = data.name
604
643
  obj_programtitle.value = data.title
@@ -622,11 +661,14 @@ async function AppGenIO_Load(self, data) {
622
661
  const elEntityDesign = document.getElementById('entities-design')
623
662
  elEntityDesign.innerHTML = ''
624
663
 
625
- const tbl_entity =document.getElementById('tbl_entity')
664
+ const tbl_entity = document.getElementById('tbl_entity')
626
665
  const tbody = tbl_entity.querySelector('tbody')
627
666
  var de = document.getElementById('entities-design')
628
- for (var entityname in data.entities) {
629
- var entity = data.entities[entityname]
667
+
668
+ let firstEntity = null
669
+ for (let entityname in data.entities) {
670
+ let entity = data.entities[entityname]
671
+
630
672
 
631
673
 
632
674
  await self.AddEntity({
@@ -642,28 +684,45 @@ async function AppGenIO_Load(self, data) {
642
684
 
643
685
  const btn = tbody.querySelector(`[name="col_btndesign"][${ATTR_ENTITYID}="${entity.id}"]`)
644
686
  btn.click()
645
-
687
+
688
+
689
+ if (firstEntity == null) {
690
+ firstEntity = entity
691
+ firstEntity.btnDesign = btn
692
+ }
693
+
694
+
646
695
 
647
696
  // isikan data entity
648
- // TODO: isikan data entity
649
697
  const editor = de.querySelector(`div[name="entity-editor"][${ATTR_ENTITYID}="${entity.id}"]`)
650
698
  setValueTo(entity.descr, editor, 'div[name="designer-info"] input[name="table-descr"]', 'value')
651
- setCheckedTo(entity.allowRowAdd, editor, 'div[name="designer-info"] input[name="allow-row-add"]')
652
- setCheckedTo(entity.allowRowRemove, editor, 'div[name="designer-info"] input[name="allow-row-remove"]')
699
+ setCheckedTo(entity.skipRegenerateTable ?? false, editor, 'div[name="designer-info"] input[name="skip-regenerate-table"]')
700
+
701
+ setCheckedTo(entity.formGridLayout ?? false, editor, 'div[name="designer-info"] input[name="form-grid-layout"]')
702
+ setCheckedTo(entity.allowFormNew ?? true, editor, 'div[name="designer-info"] input[name="allow-form-new"]')
703
+ setCheckedTo(entity.allowFormEdit ?? true, editor, 'div[name="designer-info"] input[name="allow-form-edit"]')
704
+ setCheckedTo(entity.allowRowAdd ?? true, editor, 'div[name="designer-info"] input[name="allow-row-add"]')
705
+ setCheckedTo(entity.allowRowRemove ?? true, editor, 'div[name="designer-info"] input[name="allow-row-remove"]')
706
+ setCheckedTo(entity.allowRowEdit ?? true, editor, 'div[name="designer-info"] input[name="allow-row-edit"]')
707
+
653
708
  setValueTo(entity.identifierMethod, editor, 'div[name="designer-info"] select[name="identifier-method"]', 'value')
654
709
  setValueTo(entity.identifierPrefix, editor, 'div[name="designer-info"] input[name="identifier-prefix"]', 'value')
655
- setValueTo(entity.identifierBlock , editor, 'div[name="designer-info"] input[name="identifier-block"]', 'value')
710
+ setValueTo(entity.identifierBlock, editor, 'div[name="designer-info"] input[name="identifier-block"]', 'value')
656
711
  setValueTo(entity.identifierLength, editor, 'div[name="designer-info"] input[name="identifier-length"]', 'value')
657
712
 
713
+ setValueTo(entity.bindHeadTitle ?? '', editor, 'div[name="designer-info"] input[name="bind_head_title"]', 'value')
714
+ setValueTo(entity.bindHeadDescr ?? '', editor, 'div[name="designer-info"] input[name="bind_head_descr"]', 'value')
715
+
716
+
658
717
  // ambil drop target dari entity
659
718
  let droptarget = elEntityDesign.querySelector(`div[name="entity-editor"][${ATTR_ENTITYID}="${entity.id}"] div[name="drop-target"]`)
660
-
719
+
661
720
  // console.log(entity)
662
721
  for (var item_id in entity.Items) {
663
722
  let item = entity.Items[item_id]
664
723
 
665
724
  var componentname = item.component
666
-
725
+
667
726
  let comp = Components[componentname]
668
727
  let datafield = self.addComponentToDesigner(droptarget, comp)
669
728
 
@@ -676,7 +735,7 @@ async function AppGenIO_Load(self, data) {
676
735
  let uniq = entity.Uniques[uniq_name]
677
736
  let name = uniq.name
678
737
  let fields = uniq.fields
679
- Context.addUnique({uniq_name:name, uniq_fields:fields}, entity.id)
738
+ Context.addUnique({ uniq_name: name, uniq_fields: fields }, entity.id)
680
739
  }
681
740
 
682
741
  // search
@@ -687,13 +746,21 @@ async function AppGenIO_Load(self, data) {
687
746
  let fields = search.fields
688
747
  Context.addSearch({
689
748
  criteria_name: name,
690
- criteria_label: label,
691
- criteria_fields:fields
749
+ criteria_label: label,
750
+ criteria_fields: fields
692
751
  }, entity.id)
693
752
  }
694
-
753
+
695
754
  }
696
755
 
756
+
757
+ // console.log(firstEntity)
758
+ setTimeout(() => {
759
+ console.log(firstEntity)
760
+ firstEntity.btnDesign.click()
761
+ }, 500)
762
+
763
+
697
764
  }
698
765
 
699
766
  function AppGenIO_FillDataField(self, datafield, field) {
@@ -708,7 +775,9 @@ function AppGenIO_FillDataField(self, datafield, field) {
708
775
 
709
776
  setCheckedTo(field.data_allownull, datafield, 'input[name="allownull"]')
710
777
 
711
- if (field.component=='Checkbox') {
778
+ setCheckedTo(field.input_multiline, datafield, 'input[name="multiline"]')
779
+
780
+ if (field.component == 'Checkbox') {
712
781
  setCheckedTo(field.data_defaultvalue, datafield, 'input[name="defaultvalue"]')
713
782
  } else {
714
783
  setValueTo(field.data_defaultvalue, datafield, 'input[name="defaultvalue"]', 'value')
@@ -716,7 +785,7 @@ function AppGenIO_FillDataField(self, datafield, field) {
716
785
  setValueTo(field.description, datafield, 'input[name="description"]', 'value')
717
786
 
718
787
 
719
- if (field.input_index===undefined) {
788
+ if (field.input_index === undefined) {
720
789
  field.input_index = '0'
721
790
  }
722
791
 
@@ -737,6 +806,13 @@ function AppGenIO_FillDataField(self, datafield, field) {
737
806
  setCheckedTo(field.showInForm, datafield, 'input[name="showinform"]')
738
807
 
739
808
 
809
+ // desktop position
810
+ setValueTo(field.input_dposrow ?? 'auto', datafield, 'input[name="input-dposrow"]', 'value')
811
+ setValueTo(field.input_dposrowspan ?? '', datafield, 'input[name="input-dposrowspan"]', 'value')
812
+ setValueTo(field.input_dposcol ?? '1', datafield, 'input[name="input-dposcol"]', 'value')
813
+ setValueTo(field.input_dposcolspan ?? '2', datafield, 'input[name="input-dposcolspan"]', 'value')
814
+ setValueTo(field.input_dposstyle ?? '', datafield, 'input[name="input-dposstyle"]', 'value')
815
+
740
816
  // grid related
741
817
  setValueTo(field.grid_formatter, datafield, 'input[name="gridformatter"]', 'value')
742
818
  setValueTo(field.grid_css, datafield, 'input[name="gridcss"]', 'value')
@@ -761,10 +837,10 @@ function AppGenIO_FillDataField(self, datafield, field) {
761
837
 
762
838
  setValueTo(field.Reference.table, datafield, 'input[name="ref_table"]', 'value')
763
839
  setValueTo(field.Reference.pk, datafield, 'input[name="ref_id"]', 'value')
764
-
840
+
765
841
  // TODO: ini nanti kalau perlu diperbaiki disini
766
842
  // setValueTo(field.Reference.bindingValue, datafield, 'input[name="ref_id"]', 'value')
767
-
843
+
768
844
  setValueTo(field.Reference.bindingDisplay, datafield, 'input[name="ref_display"]', 'value')
769
845
  setValueTo(field.Reference.bindingText, datafield, 'input[name="ref_text"]', 'value')
770
846
 
@@ -776,6 +852,7 @@ function AppGenIO_FillDataField(self, datafield, field) {
776
852
  setCheckedTo(field.Handle.input, datafield, 'input[name="ishandleinput"]')
777
853
  setCheckedTo(field.Handle.keydown, datafield, 'input[name="ishandlekeydown"]')
778
854
  setCheckedTo(field.Handle.checked, datafield, 'input[name="ishandlechecked"]')
855
+ setCheckedTo(field.Handle.unchecked, datafield, 'input[name="ishandleunchecked"]')
779
856
  setCheckedTo(field.Handle.selected, datafield, 'input[name="ishandleselected"]')
780
857
  setCheckedTo(field.Handle.selecting, datafield, 'input[name="ishandleselecting"]')
781
858
  setCheckedTo(field.Handle.populating, datafield, 'input[name="ishandlepopulating"]')