@agung_dhewe/webapps 1.1.2

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 (130) hide show
  1. package/LICENSE +28 -0
  2. package/README.md +2 -0
  3. package/jsconfig.json +10 -0
  4. package/libs/fgta5js-dist/fgta5js-v1.8.3.min.css +2 -0
  5. package/libs/fgta5js-dist/fgta5js-v1.8.3.min.js +11 -0
  6. package/libs/fgta5js-dist/fgta5js-v1.8.3.min.js.map +1 -0
  7. package/libs/fgta5js-dist/fonts/karla-italic-latin-ext.woff2 +0 -0
  8. package/libs/fgta5js-dist/fonts/karla-italic-latin.woff2 +0 -0
  9. package/libs/fgta5js-dist/fonts/karla-normal-latin-ext.woff2 +0 -0
  10. package/libs/fgta5js-dist/fonts/karla-normal-latin.woff2 +0 -0
  11. package/libs/fgta5js-dist/fonts/karla.css +142 -0
  12. package/libs/webmodule/module-edit.css +163 -0
  13. package/libs/webmodule/module-footer.css +22 -0
  14. package/libs/webmodule/module-list.css +25 -0
  15. package/libs/webmodule/module.css +52 -0
  16. package/libs/webmodule/module.js +195 -0
  17. package/libs/webmodule/pagehelper.mjs +45 -0
  18. package/modules/generator/appgen-components.mjs +142 -0
  19. package/modules/generator/appgen-icons.mjs +6 -0
  20. package/modules/generator/appgen-io.mjs +784 -0
  21. package/modules/generator/appgen-ui-search.mjs +173 -0
  22. package/modules/generator/appgen-ui-unique.mjs +153 -0
  23. package/modules/generator/appgen-ui.mjs +1181 -0
  24. package/modules/generator/generator-context.mjs +18 -0
  25. package/modules/generator/generator-designtemplate.html +1508 -0
  26. package/modules/generator/generator-ext.html +0 -0
  27. package/modules/generator/generator-ext.mjs +3 -0
  28. package/modules/generator/generator.css +642 -0
  29. package/modules/generator/generator.mjs +195 -0
  30. package/modules/generator/generator.png +0 -0
  31. package/modules/generator/generatorEdit.html +185 -0
  32. package/modules/generator/generatorEdit.mjs +238 -0
  33. package/modules/generator/generatorList.html +32 -0
  34. package/modules/generator/generatorList.mjs +243 -0
  35. package/modules/login/login.css +11 -0
  36. package/modules/login/login.html +12 -0
  37. package/modules/login/login.mjs +111 -0
  38. package/package.json +46 -0
  39. package/percobaan/simmpan-ke-minio.js +24 -0
  40. package/src/api.js +80 -0
  41. package/src/apis/generator.api.js +226 -0
  42. package/src/apis/login.api.js +109 -0
  43. package/src/bucket.js +24 -0
  44. package/src/context.js +26 -0
  45. package/src/datalog.sql +22 -0
  46. package/src/datarecords.js +0 -0
  47. package/src/db.js +61 -0
  48. package/src/generator/createApiExtenderModule.js +54 -0
  49. package/src/generator/createApiModule.js +218 -0
  50. package/src/generator/createIcon.js +62 -0
  51. package/src/generator/createInfoAboutExtender.js +42 -0
  52. package/src/generator/createInfoLogs.js +41 -0
  53. package/src/generator/createInfoRecordExtender.js +41 -0
  54. package/src/generator/createModuleContext.js +48 -0
  55. package/src/generator/createModuleDetilEditHtml.js +110 -0
  56. package/src/generator/createModuleDetilEditMjs.js +172 -0
  57. package/src/generator/createModuleDetilListHtml.js +146 -0
  58. package/src/generator/createModuleDetilListMjs.js +73 -0
  59. package/src/generator/createModuleEjs.js +51 -0
  60. package/src/generator/createModuleExtenderHtml.js +43 -0
  61. package/src/generator/createModuleExtenderMjs.js +43 -0
  62. package/src/generator/createModuleHeaderEditHtml.js +148 -0
  63. package/src/generator/createModuleHeaderEditMjs.js +197 -0
  64. package/src/generator/createModuleHeaderListHtml.js +144 -0
  65. package/src/generator/createModuleHeaderListMjs.js +67 -0
  66. package/src/generator/createModuleMjs.js +67 -0
  67. package/src/generator/createModuleRollup.js +42 -0
  68. package/src/generator/createProgramData.js +96 -0
  69. package/src/generator/createTable.js +156 -0
  70. package/src/generator/ddl.js +475 -0
  71. package/src/generator/helper.js +149 -0
  72. package/src/generator/templates/__rollup-module.ejs +90 -0
  73. package/src/generator/templates/api-extender-module.js.ejs +0 -0
  74. package/src/generator/templates/api-module.js.ejs +818 -0
  75. package/src/generator/templates/module-context.ejs +16 -0
  76. package/src/generator/templates/module-ext-about.ejs +1 -0
  77. package/src/generator/templates/module-ext-record.ejs +1 -0
  78. package/src/generator/templates/module-ext.html.ejs +3 -0
  79. package/src/generator/templates/module-ext.mjs.ejs +21 -0
  80. package/src/generator/templates/module-logs.ejs +14 -0
  81. package/src/generator/templates/module.ejs.ejs +48 -0
  82. package/src/generator/templates/module.mjs.ejs +256 -0
  83. package/src/generator/templates/moduleDetilEdit.html.ejs +34 -0
  84. package/src/generator/templates/moduleDetilEdit.mjs.ejs +792 -0
  85. package/src/generator/templates/moduleDetilList.html.ejs +26 -0
  86. package/src/generator/templates/moduleDetilList.mjs.ejs +319 -0
  87. package/src/generator/templates/moduleHeaderEdit.html.ejs +53 -0
  88. package/src/generator/templates/moduleHeaderEdit.mjs.ejs +807 -0
  89. package/src/generator/templates/moduleHeaderList.html.ejs +24 -0
  90. package/src/generator/templates/moduleHeaderList.mjs.ejs +308 -0
  91. package/src/generator/templates/sqlAddField.ejs +3 -0
  92. package/src/generator/templates/sqlAddForeignKey.ejs +12 -0
  93. package/src/generator/templates/sqlAddUniqueIndex.ejs +4 -0
  94. package/src/generator/templates/sqlCreateTable.ejs +9 -0
  95. package/src/generator/templates/sqlDropForeignKey.ejs +3 -0
  96. package/src/generator/templates/sqlDropUniqueIndex.ejs +4 -0
  97. package/src/generator/templates/sqlModifyField.ejs +6 -0
  98. package/src/generator/trygenerate.js +83 -0
  99. package/src/generator/worker.js +389 -0
  100. package/src/helper.js +82 -0
  101. package/src/logger.js +39 -0
  102. package/src/router.js +84 -0
  103. package/src/routers/defaultLoginApi.js +29 -0
  104. package/src/routers/defaultLoginAsset.js +18 -0
  105. package/src/routers/defaultLoginPage.js +36 -0
  106. package/src/routers/defaultRootIndex.js +16 -0
  107. package/src/routers/downloadHandler.js +51 -0
  108. package/src/routers/fileUploadApi.js +15 -0
  109. package/src/routers/generatorApi.js +30 -0
  110. package/src/routers/generatorAsset.js +18 -0
  111. package/src/routers/generatorPage.js +37 -0
  112. package/src/routers/handleError.js +43 -0
  113. package/src/routers/handleModuleNotfound.js +12 -0
  114. package/src/routers/moduleApi.js +34 -0
  115. package/src/routers/modulePage.js +102 -0
  116. package/src/sequencerdoc.js +311 -0
  117. package/src/sequencerline.js +214 -0
  118. package/src/session.js +57 -0
  119. package/src/startup.js +59 -0
  120. package/src/webapps.js +239 -0
  121. package/src/workermanager.js +83 -0
  122. package/templates/_lib_debug.ejs +11 -0
  123. package/templates/_lib_production.ejs +5 -0
  124. package/templates/application.page.ejs +143 -0
  125. package/templates/generator.page.ejs +131 -0
  126. package/templates/index.page.ejs +24 -0
  127. package/templates/login.page.ejs +102 -0
  128. package/templates/moduleError.ejs +16 -0
  129. package/templates/moduleNotfound.ejs +14 -0
  130. package/webapps.code-workspace +11 -0
@@ -0,0 +1,173 @@
1
+ import { ICON_CLOSE } from './appgen-icons.mjs'
2
+
3
+ const ATTR_ENTITYID = 'data-entity-id'
4
+ const ATTR_ROWSEARCH = 'data-rowsearch'
5
+
6
+ let ME
7
+
8
+
9
+ export function AppGenLayout_setSearchME(me) {
10
+ ME = me
11
+ }
12
+
13
+
14
+ export function AppGenLayout_setupSearchDesigner(elsearch, entity_id) {
15
+ const tbl = elsearch.querySelector('table[name="tbl-search"]')
16
+ const btnAdd = elsearch.querySelector('button[name="btnAdd"]')
17
+ const btnNew = elsearch.querySelector('a[name="btnNew"')
18
+ const trLineAdd = btnAdd.closest('tr')
19
+
20
+ tbl.setAttribute(ATTR_ENTITYID, entity_id)
21
+ btnAdd.setAttribute(ATTR_ENTITYID, entity_id)
22
+ trLineAdd.setAttribute(ATTR_ENTITYID, entity_id)
23
+
24
+ btnAdd.addEventListener('click', AppGenLayout_addSearchButtonClick)
25
+ btnNew.addEventListener('click', AppGenLayout_newSearchButtonClick)
26
+
27
+ }
28
+
29
+ function AppGenLayout_newSearchButtonClick(evt) {
30
+ const tr = evt.target.closest('tr')
31
+ const elName = tr.querySelector('input[name="criteria_name"]')
32
+ const elLabel = tr.querySelector('input[name="criteria_label"]')
33
+ const elFields = tr.querySelector('input[name="criteria_fields"]')
34
+
35
+ // reset editor entri
36
+ elName.disabled = false
37
+ elName.value = ''
38
+ elLabel.value = ''
39
+ elFields.value = ''
40
+ }
41
+
42
+ function AppGenLayout_addSearchButtonClick(evt) {
43
+ const tr = evt.target.closest('tr')
44
+ const entity_id = tr.getAttribute(ATTR_ENTITYID)
45
+ const elName = tr.querySelector('input[name="criteria_name"]')
46
+ const elLabel = tr.querySelector('input[name="criteria_label"]')
47
+ const elFields = tr.querySelector('input[name="criteria_fields"]')
48
+
49
+ const data = {
50
+ criteria_name: elName.value,
51
+ criteria_label: elLabel.value,
52
+ criteria_fields: elFields.value
53
+ }
54
+
55
+ try {
56
+
57
+ AppGenLayout_addSearch(data, entity_id)
58
+
59
+ // reset editor entri
60
+ elName.disabled = false
61
+ elName.value = ''
62
+ elLabel.value = ''
63
+ elFields.value = ''
64
+
65
+ } catch (err) {
66
+ $fgta5.MessageBox.warning(err.message)
67
+ }
68
+
69
+
70
+ }
71
+
72
+
73
+
74
+
75
+ async function AppGenLayout_removeSearchButtonClick(evt) {
76
+ var res = await $fgta5.MessageBox.confirm('removing item is irreversible. Are you sure ?')
77
+ if (res=='ok') {
78
+ const btn = evt.target
79
+ const tr = evt.target.closest('tr')
80
+ tr.remove()
81
+ }
82
+ }
83
+
84
+ function AppGenLayout_rowSearchEdit(evt) {
85
+ const tr = evt.target.closest('tr')
86
+ const tbl = tr.closest('table')
87
+ const tdName = tr.querySelector(`td[data-name="name"]`)
88
+ const tdLabel = tr.querySelector(`td[data-name="label"]`)
89
+ const tdFields = tr.querySelector(`td[data-name="fields"]`)
90
+
91
+
92
+ // get editor
93
+ const btnAddEditor = tbl.querySelector('button[name="btnAdd"]')
94
+ const trEditor = btnAddEditor.closest('tr')
95
+ const elName = trEditor.querySelector('input[name="criteria_name"]')
96
+ const elLabel = trEditor.querySelector('input[name="criteria_label"]')
97
+ const elFields = trEditor.querySelector('input[name="criteria_fields"]')
98
+
99
+ elName.disabled = true
100
+ elName.value = tdName.innerHTML
101
+ elLabel.value = tdLabel.innerHTML
102
+ elFields.value = tdFields.innerHTML
103
+ }
104
+
105
+ export function AppGenLayout_addSearch(data, entity_id) {
106
+ const tbl = ME.EntityDesigner.querySelector(`table[name="tbl-search"][${ATTR_ENTITYID}="${entity_id}"`)
107
+ const btn = tbl.querySelector('button[name="btnAdd"]')
108
+ const tr = btn.closest('tr')
109
+
110
+ const criteria_name = data.criteria_name
111
+ const criteria_label = data.criteria_label
112
+ const criteria_fields = data.criteria_fields
113
+
114
+
115
+ if (!/^[a-zA-Z_]+$/.test(criteria_name)) {
116
+ throw new Error('Nama criteria tidak valid')
117
+ }
118
+
119
+
120
+ // cek apakah sudah ada criteria_name
121
+ const trExists = tbl.querySelector(`tr[data-value="${criteria_name}"]`)
122
+ if (trExists!=null) {
123
+ const tdLabel = trExists.querySelector(`td[data-name="label"]`)
124
+ const tdFields = trExists.querySelector(`td[data-name="fields"]`)
125
+ tdLabel.innerHTML = criteria_label
126
+ tdFields.innerHTML = criteria_fields
127
+
128
+ } else {
129
+ // tambahkan search
130
+ const newRow = document.createElement('tr')
131
+ const tdName = document.createElement('td')
132
+ const tdLabel = document.createElement('td')
133
+ const tdFields = document.createElement('td')
134
+ const tdControl = document.createElement('td')
135
+ const btnRemove = document.createElement('div')
136
+ btnRemove.classList.add('action-button-remove')
137
+ btnRemove.innerHTML = ICON_CLOSE
138
+ btnRemove.addEventListener('click', AppGenLayout_removeSearchButtonClick)
139
+ tdName.addEventListener('click', AppGenLayout_rowSearchEdit)
140
+ tdLabel.addEventListener('click', AppGenLayout_rowSearchEdit)
141
+ tdFields.addEventListener('click', AppGenLayout_rowSearchEdit)
142
+
143
+
144
+
145
+ tdName.innerHTML = criteria_name
146
+ tdName.setAttribute('data-name', 'name')
147
+ tdName.classList.add('search-editor-item')
148
+
149
+ tdLabel.innerHTML = criteria_label
150
+ tdLabel.setAttribute('data-name', 'label')
151
+ tdLabel.classList.add('search-editor-item')
152
+
153
+ tdFields.innerHTML = criteria_fields
154
+ tdFields.setAttribute('data-name', 'fields')
155
+ tdFields.classList.add('search-editor-item')
156
+
157
+ tdControl.appendChild(btnRemove)
158
+
159
+
160
+ newRow.appendChild(tdName)
161
+ newRow.appendChild(tdLabel)
162
+ newRow.appendChild(tdFields)
163
+ newRow.appendChild(tdControl)
164
+
165
+ newRow.setAttribute('data-value', criteria_name)
166
+ newRow.setAttribute(ATTR_ENTITYID, entity_id)
167
+ newRow.setAttribute(ATTR_ROWSEARCH, '')
168
+
169
+ tr.parentNode.insertBefore(newRow, tr);
170
+
171
+ }
172
+
173
+ }
@@ -0,0 +1,153 @@
1
+ import { ICON_CLOSE } from './appgen-icons.mjs'
2
+
3
+ const ATTR_ENTITYID = 'data-entity-id'
4
+ const ATTR_ROWUNIQUE = 'data-rowuniqueindex'
5
+
6
+ let ME
7
+
8
+
9
+ export function AppGenLayout_setUniqueME(me) {
10
+ ME = me
11
+ }
12
+
13
+ export function AppGenLayout_setupUniqueDesigner(eluniq, entity_id) {
14
+ const tbl = eluniq.querySelector('table[name="tbl-unique"]')
15
+ const btnAdd = eluniq.querySelector('button[name="btnAdd"]')
16
+ const btnNew = eluniq.querySelector('a[name="btnNew"')
17
+ const trLineAdd = btnAdd.closest('tr')
18
+
19
+ tbl.setAttribute(ATTR_ENTITYID, entity_id)
20
+ btnAdd.setAttribute(ATTR_ENTITYID, entity_id)
21
+ trLineAdd.setAttribute(ATTR_ENTITYID, entity_id)
22
+
23
+ btnAdd.addEventListener('click', AppGenLayout_addUniqueButtonClick)
24
+ btnNew.addEventListener('click', AppGenLayout_newUniqueButtonClick)
25
+ }
26
+
27
+
28
+ function AppGenLayout_newUniqueButtonClick(evt) {
29
+ const tr = evt.target.closest('tr')
30
+ const elName = tr.querySelector('input[name="unique_name"]')
31
+ const elFields = tr.querySelector('input[name="unique_fields"]')
32
+
33
+ // reset editor entri
34
+ elName.disabled = false
35
+ elName.value = ''
36
+ elFields.value = ''
37
+ }
38
+
39
+ function AppGenLayout_addUniqueButtonClick(evt) {
40
+ const tr = evt.target.closest('tr')
41
+ const entity_id = tr.getAttribute(ATTR_ENTITYID)
42
+ const elName = tr.querySelector('input[name="unique_name"]')
43
+ const elFields = tr.querySelector('input[name="unique_fields"]')
44
+
45
+ const data = {
46
+ uniq_name: elName.value,
47
+ uniq_fields: elFields.value
48
+ }
49
+
50
+ try {
51
+
52
+ AppGenLayout_addUnique(data, entity_id)
53
+
54
+ // reset
55
+ elName.disabled = false
56
+ elName.value = ''
57
+ elFields.value = ''
58
+
59
+ } catch (err) {
60
+ $fgta5.MessageBox.warning(err.message)
61
+ }
62
+
63
+
64
+ }
65
+
66
+
67
+ async function AppGenLayout_removeUniqueButtonClick(evt) {
68
+ var res = await $fgta5.MessageBox.confirm('removing item is irreversible. Are you sure ?')
69
+ if (res=='ok') {
70
+ const btn = evt.target
71
+ const tr = evt.target.closest('tr')
72
+ tr.remove()
73
+ }
74
+ }
75
+
76
+
77
+
78
+
79
+ function AppGenLayout_rowUniqueEdit(evt) {
80
+ const tr = evt.target.closest('tr')
81
+ const tbl = tr.closest('table')
82
+ const tdName = tr.querySelector(`td[data-name="name"]`)
83
+ const tdFields = tr.querySelector(`td[data-name="fields"]`)
84
+
85
+
86
+ // get editor
87
+ const btnAddEditor = tbl.querySelector('button[name="btnAdd"]')
88
+ const trEditor = btnAddEditor.closest('tr')
89
+ const elName = trEditor.querySelector('input[name="unique_name"]')
90
+ const elFields = trEditor.querySelector('input[name="unique_fields"]')
91
+
92
+ elName.disabled = true
93
+ elName.value = tdName.innerHTML
94
+ elFields.value = tdFields.innerHTML
95
+ }
96
+
97
+
98
+ export function AppGenLayout_addUnique(data, entity_id) {
99
+ const tbl = ME.EntityDesigner.querySelector(`table[name="tbl-unique"][${ATTR_ENTITYID}="${entity_id}"`)
100
+ const btn = tbl.querySelector('button[name="btnAdd"]')
101
+ const tr = btn.closest('tr')
102
+
103
+
104
+ const uniq_name = data.uniq_name
105
+ const uniq_fields = data.uniq_fields
106
+
107
+ if (!/^[a-zA-Z_]+$/.test(uniq_name)) {
108
+ throw new Error('Nama unique tidak valid')
109
+ }
110
+
111
+
112
+ // cek apakah sudah ada uniq_name
113
+ const trExists = tbl.querySelector(`tr[data-value="${uniq_name}"]`)
114
+ if (trExists!=null) {
115
+ const tdFields = trExists.querySelector(`td[data-name="fields"]`)
116
+ tdFields.innerHTML = uniq_fields
117
+
118
+ } else {
119
+
120
+ // tambahkan unique
121
+ const newRow = document.createElement('tr')
122
+ const tdName = document.createElement('td')
123
+ const tdFields = document.createElement('td')
124
+ const tdControl = document.createElement('td')
125
+ const btnRemove = document.createElement('div')
126
+ btnRemove.classList.add('action-button-remove')
127
+ btnRemove.innerHTML = ICON_CLOSE
128
+ btnRemove.addEventListener('click', AppGenLayout_removeUniqueButtonClick)
129
+ tdName.addEventListener('click', AppGenLayout_rowUniqueEdit)
130
+ tdFields.addEventListener('click', AppGenLayout_rowUniqueEdit)
131
+
132
+
133
+ tdName.innerHTML = uniq_name
134
+ tdName.setAttribute('data-name', 'name')
135
+ tdName.classList.add('search-editor-item')
136
+
137
+ tdFields.innerHTML = uniq_fields
138
+ tdFields.setAttribute('data-name', 'fields')
139
+ tdFields.classList.add('search-editor-item')
140
+
141
+ tdControl.appendChild(btnRemove)
142
+
143
+ newRow.appendChild(tdName)
144
+ newRow.appendChild(tdFields)
145
+ newRow.appendChild(tdControl)
146
+
147
+ newRow.setAttribute('data-value', uniq_name)
148
+ newRow.setAttribute(ATTR_ENTITYID, entity_id)
149
+ newRow.setAttribute(ATTR_ROWUNIQUE, '')
150
+
151
+ tr.parentNode.insertBefore(newRow, tr);
152
+ }
153
+ }