@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,172 @@
1
+ import { kebabToCamel, isFileExist, getSectionData } from './helper.js'
2
+ import { fileURLToPath } from 'url';
3
+ import path from 'path'
4
+ import fs from 'fs/promises'
5
+ import ejs from 'ejs'
6
+
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = path.dirname(__filename);
9
+
10
+ export async function createModuleDetilEditMjs(context, options) {
11
+ const overwrite = options.overwrite===true
12
+ const moduleName = context.moduleName
13
+ const title = context.title
14
+ const sectionPart = 'edit'
15
+
16
+ try {
17
+
18
+ const headerEntityData = context.entities['header']
19
+ const headerModulePartEdit = kebabToCamel(`${moduleName}-header-edit`)
20
+ const headerPrimaryKey = headerEntityData.pk
21
+
22
+
23
+ for (let entityName in context.entities) {
24
+ const entityData = context.entities[entityName]
25
+
26
+ // process selain header
27
+ if (entityName=='header') {
28
+ continue
29
+ }
30
+
31
+ const sectionName = entityName
32
+ const modulePart = kebabToCamel(`${moduleName}-${sectionName}-${sectionPart}`)
33
+ const targetFile = path.join(context.moduleDir, `${modulePart}.mjs`)
34
+
35
+ // cek dulu apakah file ada
36
+ var fileExists = await isFileExist(targetFile)
37
+ if (fileExists && !overwrite) {
38
+ context.postMessage({message: `skip file: '${targetFile}`})
39
+ return
40
+ }
41
+
42
+ // reporting progress to parent process
43
+ context.postMessage({message: `generating file: '${targetFile}`})
44
+
45
+
46
+ const tablename = entityData.table
47
+
48
+ const fields = []
49
+ const fieldHandles = []
50
+ const defaultInits = []
51
+ const uploadFields = []
52
+ const comboboxList = []
53
+ let detilHasUpload = false
54
+ for (var fieldName in entityData.Items) {
55
+ const item = entityData.Items[fieldName]
56
+
57
+ if (!item.showInForm) {
58
+ continue
59
+ }
60
+
61
+
62
+ const component = item.component
63
+ const fieldname = item.data_fieldname
64
+ const inputname = item.input_name
65
+ const elementId = `${modulePart}-${item.input_name}`
66
+
67
+
68
+ if (component=='Filebox') {
69
+ detilHasUpload = true
70
+ uploadFields.push({
71
+ elementId,
72
+ fieldname,
73
+ inputname
74
+ })
75
+ } else if (component=='Combobox') {
76
+ comboboxList.push({
77
+ inputname
78
+ })
79
+ }
80
+
81
+ // setup handles
82
+ const handles = []
83
+ for (let eventname in item.Handle) {
84
+ let createhandle = item.Handle[eventname]
85
+ if (createhandle) {
86
+ if (eventname=='selecting' && component=='Combobox') {
87
+ handles.push({
88
+ eventname,
89
+ appId: item.Reference.loaderApiModule,
90
+ path: item.Reference.loaderApiPath,
91
+ field_value: item.Reference.bindingValue,
92
+ field_text: item.Reference.bindingText,
93
+ })
94
+ } else {
95
+ handles.push({eventname})
96
+ }
97
+ }
98
+ }
99
+
100
+ if (handles.length>0) {
101
+ fieldHandles.push({component, inputname, handles})
102
+ }
103
+
104
+
105
+ // setup default values
106
+ let setdefault
107
+ if (item.data_defaultvalue != '') {
108
+ if (item.component=='Datepicker' || item.component=='Timepicker') {
109
+ setdefault = `${item.name }: new Date()`
110
+ } else if (item.component=='Numberbox') {
111
+ setdefault = `${item.name }: ${item.data_defaultvalue}`
112
+ } else if (item.component=='Checkbox') {
113
+ if (item.data_defaultvalue==='true' || item.data_defaultvalue==='checked' || item.data_defaultvalue==='1') {
114
+ setdefault = `${item.name }: true`
115
+ }
116
+ } else {
117
+ setdefault = `${item.name }: '${item.data_defaultvalue}'`
118
+ }
119
+ }
120
+
121
+ if (setdefault!=null) {
122
+ defaultInits.push(setdefault)
123
+ }
124
+
125
+
126
+
127
+
128
+
129
+ // add to field config data
130
+ fields.push({
131
+ component,
132
+ fieldname,
133
+ inputname,
134
+ elementId
135
+ })
136
+ }
137
+
138
+
139
+ const detilPrimaryKey = entityData.pk
140
+
141
+
142
+ const variables = {
143
+ timeGenerated: context.timeGenerated,
144
+ title,
145
+ tablename,
146
+ modulePart,
147
+ moduleName,
148
+ sectionName,
149
+ entityName,
150
+ headerPrimaryKey,
151
+ detilPrimaryKey,
152
+ moduleSection: kebabToCamel(`${moduleName}-${sectionName}`),
153
+ moduleList: kebabToCamel(`${moduleName}-${sectionName}-list`),
154
+ fields,
155
+ fieldHandles,
156
+ defaultInits,
157
+ detilHasUpload,
158
+ uploadFields,
159
+ comboboxList
160
+ }
161
+
162
+ const tplFilePath = path.join(__dirname, 'templates', 'moduleDetilEdit.mjs.ejs')
163
+ const template = await fs.readFile(tplFilePath, 'utf-8');
164
+ const content = ejs.render(template, variables)
165
+
166
+ await fs.writeFile(targetFile, content, 'utf8');
167
+ }
168
+ } catch (err) {
169
+ throw err
170
+ }
171
+
172
+ }
@@ -0,0 +1,146 @@
1
+ import { kebabToCamel, isFileExist, getSectionData } from './helper.js'
2
+ import { fileURLToPath } from 'url';
3
+ import path from 'path'
4
+ import fs from 'fs/promises'
5
+ import ejs from 'ejs'
6
+
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = path.dirname(__filename);
9
+
10
+ export async function createModuleDetilListHtml(context, options) {
11
+ const overwrite = options.overwrite===true
12
+ const moduleName = context.moduleName
13
+ const title = context.title
14
+ const sectionPart = 'list'
15
+
16
+
17
+ try {
18
+
19
+ for (let entityName in context.entities) {
20
+ // process selain header
21
+ if (entityName=='header') {
22
+ continue
23
+ }
24
+
25
+ const sectionName = entityName
26
+ const modulePart = kebabToCamel(`${moduleName}-${sectionName}-${sectionPart}`)
27
+ const targetFile = path.join(context.moduleDir, `${modulePart}.html`)
28
+
29
+ // cek dulu apakah file ada
30
+ var fileExists = await isFileExist(targetFile)
31
+ if (fileExists && !overwrite) {
32
+ context.postMessage({message: `skip file: '${targetFile}`})
33
+ return
34
+ }
35
+ context.postMessage({message: `generating file: '${targetFile}`}) // reporting progress to parent process
36
+
37
+ // start geneate program code
38
+ const entityData = context.entities[entityName]
39
+ const sectionData = getSectionData(moduleName, entityName, entityData, 'list')
40
+
41
+ const itemsList = []
42
+ for (var fieldName in entityData.Items) {
43
+ const item = entityData.Items[fieldName]
44
+ if (!item.showInGrid) {
45
+ continue
46
+ }
47
+ item._fieldName = fieldName
48
+ item._columnIndex = Number(item.input_index)
49
+ itemsList.push(item)
50
+ }
51
+
52
+ // urutkan data
53
+ itemsList.sort((a, b) => a._columnIndex - b._columnIndex);
54
+
55
+ const sortedItems = {}
56
+ for (let item of itemsList) {
57
+ sortedItems[item._fieldName] = item
58
+ }
59
+
60
+
61
+ const fields = []
62
+ for (var fieldName in sortedItems) {
63
+ const item = entityData.Items[fieldName]
64
+
65
+ if (!item.showInGrid) {
66
+ continue
67
+ }
68
+
69
+ // console.log(item.input_index)
70
+
71
+ const component = item.component
72
+ const dataName = item.name
73
+ const binding = item.data_fieldname
74
+ const label = item.input_label
75
+ const {bindingValue, bindingText, bindingDisplay, table} = item.Reference
76
+
77
+ // additional attributes
78
+ const attrs = []
79
+ if (item.grid_formatter.trim()!='') {
80
+ attrs.push(`formatter="${item.grid_formatter}"`)
81
+ }
82
+
83
+ if (item.grid_css.trim()!='') {
84
+ attrs.push(`class="${item.grid_css}"`)
85
+ }
86
+
87
+ if (item.grid_inlinestyle.trim()!='') {
88
+ attrs.push(`style='${item.grid_inlinestyle}'`)
89
+ }
90
+
91
+ if (item.grid_sorting) {
92
+ attrs.push(`sorting="true"`)
93
+ }
94
+
95
+ let additionalAttributes = attrs.join(' ')
96
+
97
+
98
+
99
+ let columnDataName = dataName
100
+ let columnDataBinding = binding
101
+
102
+ if (component=='Combobox') {
103
+ if (bindingDisplay!='' && bindingDisplay!=null) {
104
+ columnDataName = bindingDisplay
105
+ columnDataBinding = bindingDisplay
106
+ } else {
107
+ columnDataName = bindingText
108
+ columnDataBinding = bindingText
109
+ }
110
+ }
111
+
112
+
113
+ // masukkan ke fields
114
+ fields.push({
115
+ component,
116
+ dataName: columnDataName, //bindingDisplay!=null ? bindingDisplay : dataName,
117
+ binding: columnDataBinding, //bindingDisplay!=null ? bindingDisplay : binding,
118
+ label,
119
+ additionalAttributes
120
+ })
121
+ }
122
+
123
+
124
+ const variables = {
125
+ timeGenerated: context.timeGenerated,
126
+ title: title,
127
+ moduleName: moduleName,
128
+ modulePart: modulePart,
129
+ moduleSection: kebabToCamel(`${moduleName}-${sectionName}`),
130
+ section: sectionData,
131
+ fields: fields
132
+ }
133
+
134
+
135
+ const tplFilePath = path.join(__dirname, 'templates', 'moduleDetilList.html.ejs')
136
+ const template = await fs.readFile(tplFilePath, 'utf-8');
137
+ const content = ejs.render(template, variables)
138
+
139
+ await fs.writeFile(targetFile, content, 'utf8');
140
+
141
+ }
142
+ } catch (err) {
143
+ throw err
144
+ }
145
+
146
+ }
@@ -0,0 +1,73 @@
1
+ import { kebabToCamel, isFileExist, getSectionData } from './helper.js'
2
+ import { fileURLToPath } from 'url';
3
+ import path from 'path'
4
+ import fs from 'fs/promises'
5
+ import ejs from 'ejs'
6
+
7
+
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = path.dirname(__filename);
10
+
11
+ export async function createModuleDetilListMjs(context, options) {
12
+ const overwrite = options.overwrite===true
13
+ const moduleName = context.moduleName
14
+
15
+ const sectionPart = 'list'
16
+
17
+ try {
18
+
19
+ const headerEntityData = context.entities['header']
20
+ const headerModulePartEdit = kebabToCamel(`${moduleName}-header-edit`)
21
+ const headerPrimaryKey = headerEntityData.pk
22
+
23
+ for (let entityName in context.entities) {
24
+ // process selain header
25
+ if (entityName=='header') {
26
+ continue
27
+ }
28
+
29
+ const sectionName = entityName
30
+ const modulePart = kebabToCamel(`${moduleName}-${sectionName}-${sectionPart}`)
31
+ const targetFile = path.join(context.moduleDir, `${modulePart}.mjs`)
32
+
33
+
34
+ // cek dulu apakah file ada
35
+ var fileExists = await isFileExist(targetFile)
36
+ if (fileExists && !overwrite) {
37
+ context.postMessage({message: `skip file: '${targetFile}`})
38
+ return
39
+ }
40
+
41
+ // reporting progress to parent process
42
+ context.postMessage({message: `generating file: '${targetFile}`})
43
+
44
+
45
+ // start geneate program code
46
+ const entityData = context.entities[entityName]
47
+ const sectionData = getSectionData(moduleName, entityName, entityData, 'edit')
48
+ const title = entityData.title
49
+
50
+
51
+ const variables = {
52
+ timeGenerated: context.timeGenerated,
53
+ title,
54
+ modulePart,
55
+ moduleName,
56
+ sectionName,
57
+ headerModulePartEdit,
58
+ headerPrimaryKey,
59
+ moduleEdit: kebabToCamel(`${moduleName}-${sectionName}-edit`),
60
+
61
+ }
62
+
63
+ const tplFilePath = path.join(__dirname, 'templates', 'moduleDetilList.mjs.ejs')
64
+ const template = await fs.readFile(tplFilePath, 'utf-8');
65
+ const content = ejs.render(template, variables)
66
+
67
+ await fs.writeFile(targetFile, content, 'utf8');
68
+ }
69
+ } catch (err) {
70
+ throw err
71
+ }
72
+
73
+ }
@@ -0,0 +1,51 @@
1
+ import { kebabToCamel, isFileExist, getSectionData } from './helper.js'
2
+ import { fileURLToPath } from 'url';
3
+ import path from 'path'
4
+ import fs from 'fs/promises'
5
+ import ejs from 'ejs'
6
+
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = path.dirname(__filename);
9
+
10
+ export async function createModuleEjs(context, options) {
11
+ const overwrite = options.overwrite===true
12
+ const moduleName = context.moduleName
13
+ const targetFile = path.join(context.moduleDir, `${moduleName}.ejs`)
14
+
15
+ try {
16
+ // cek dulu apakah file ada
17
+ var fileExists = await isFileExist(targetFile)
18
+ if (fileExists && !overwrite) {
19
+ context.postMessage({message: `skip file: '${targetFile}`})
20
+ return
21
+ }
22
+
23
+ // reporting progress to parent process
24
+ context.postMessage({message: `generating file: '${targetFile}`})
25
+
26
+
27
+ // start geneate program code
28
+ let sections = []
29
+ for (var entityName in context.entities) {
30
+ // console.log(context.entities[entityName])
31
+ sections.push(getSectionData(moduleName, entityName, context.entities[entityName], 'list'))
32
+ sections.push(getSectionData(moduleName, entityName, context.entities[entityName], 'edit'))
33
+ }
34
+
35
+ const variables = {
36
+ timeGenerated: context.timeGenerated,
37
+ moduleName: moduleName,
38
+ sections: sections,
39
+
40
+ }
41
+
42
+ const tplFilePath = path.join(__dirname, 'templates', 'module.ejs.ejs')
43
+ const template = await fs.readFile(tplFilePath, 'utf-8');
44
+ const content = ejs.render(template, variables)
45
+
46
+ await fs.writeFile(targetFile, content, 'utf8');
47
+ } catch (err) {
48
+ throw err
49
+ }
50
+
51
+ }
@@ -0,0 +1,43 @@
1
+ import { kebabToCamel, isFileExist } from './helper.js'
2
+ import { fileURLToPath } from 'url';
3
+ import path from 'path'
4
+ import fs from 'fs/promises'
5
+ import ejs from 'ejs'
6
+
7
+
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = path.dirname(__filename);
10
+
11
+ export async function createModuleExtenderHtml(context, options) {
12
+ const overwrite = options.overwrite===true
13
+ const moduleName = context.moduleName
14
+ const targetFile = path.join(context.moduleDir, `${moduleName}-ext.html`)
15
+
16
+ try {
17
+ // cek dulu apakah file ada
18
+ var fileExists = await isFileExist(targetFile)
19
+ if (fileExists && !overwrite) {
20
+ context.postMessage({message: `skip file: '${targetFile}`})
21
+ return
22
+ }
23
+
24
+ // reporting progress to parent process
25
+ context.postMessage({message: `generating file: '${targetFile}`})
26
+
27
+
28
+ // start geneate program code
29
+ const variables = {
30
+ timeGenerated: context.timeGenerated,
31
+ moduleName: moduleName,
32
+ }
33
+
34
+ const tplFilePath = path.join(__dirname, 'templates', 'module-ext.html.ejs')
35
+ const template = await fs.readFile(tplFilePath, 'utf-8');
36
+ const content = ejs.render(template, variables)
37
+
38
+ await fs.writeFile(targetFile, content, 'utf8');
39
+ } catch (err) {
40
+ throw err
41
+ }
42
+
43
+ }
@@ -0,0 +1,43 @@
1
+ import { kebabToCamel, isFileExist } from './helper.js'
2
+ import { fileURLToPath } from 'url';
3
+ import path from 'path'
4
+ import fs from 'fs/promises'
5
+ import ejs from 'ejs'
6
+
7
+
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = path.dirname(__filename);
10
+
11
+ export async function createModuleExtenderMjs(context, options) {
12
+ const overwrite = options.overwrite===true
13
+ const moduleName = context.moduleName
14
+ const targetFile = path.join(context.moduleDir, `${moduleName}-ext.mjs`)
15
+
16
+ try {
17
+ // cek dulu apakah file ada
18
+ var fileExists = await isFileExist(targetFile)
19
+ if (fileExists && !overwrite) {
20
+ context.postMessage({message: `skip file: '${targetFile}`})
21
+ return
22
+ }
23
+
24
+ // reporting progress to parent process
25
+ context.postMessage({message: `generating file: '${targetFile}`})
26
+
27
+
28
+ // start geneate program code
29
+ const variables = {
30
+ timeGenerated: context.timeGenerated,
31
+ moduleName: moduleName,
32
+ }
33
+
34
+ const tplFilePath = path.join(__dirname, 'templates', 'module-ext.mjs.ejs')
35
+ const template = await fs.readFile(tplFilePath, 'utf-8');
36
+ const content = ejs.render(template, variables)
37
+
38
+ await fs.writeFile(targetFile, content, 'utf8');
39
+ } catch (err) {
40
+ throw err
41
+ }
42
+
43
+ }
@@ -0,0 +1,148 @@
1
+ import { kebabToCamel, isFileExist, getSectionData, createAdditionalAttributes } from './helper.js'
2
+ import { fileURLToPath } from 'url';
3
+ import path from 'path'
4
+ import fs from 'fs/promises'
5
+ import ejs from 'ejs'
6
+
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = path.dirname(__filename);
9
+
10
+ export async function createModuleHeaderEditHtml(context, options) {
11
+ const overwrite = options.overwrite===true
12
+ const moduleName = context.moduleName
13
+ const title = context.title
14
+ const sectionPart = 'edit'
15
+
16
+ try {
17
+
18
+ // ambil data entity selain header
19
+ let detilCount = 0
20
+ for (let entityName in context.entities) {
21
+ if (entityName=='header') {
22
+ continue
23
+ }
24
+ detilCount++
25
+ }
26
+
27
+
28
+ for (let entityName in context.entities) {
29
+ // hanya proses yang Header
30
+ if (entityName!='header') {
31
+ continue
32
+ }
33
+
34
+
35
+ const sectionName = entityName
36
+ const modulePart = kebabToCamel(`${moduleName}-${sectionName}-${sectionPart}`)
37
+ const targetFile = path.join(context.moduleDir, `${modulePart}.html`)
38
+
39
+ // cek dulu apakah file ada
40
+ var fileExists = await isFileExist(targetFile)
41
+ if (fileExists && !overwrite) {
42
+ context.postMessage({message: `skip file: '${targetFile}`})
43
+ return
44
+ }
45
+
46
+ // reporting progress to parent process
47
+ context.postMessage({message: `generating file: '${targetFile}`})
48
+
49
+
50
+
51
+
52
+
53
+ // start geneate program code
54
+ const entityData = context.entities[entityName]
55
+ const sectionData = getSectionData(moduleName, entityName, entityData, 'edit')
56
+ const primaryKeyFieldData = entityData.Items[sectionData.primaryKey]
57
+ const primaryKeyName = primaryKeyFieldData.input_name
58
+ const primaryKeyElementId = `${modulePart}-${primaryKeyName}`
59
+
60
+ const autoid = entityData.identifierMethod=='manual' ? 'false' : 'true'
61
+
62
+
63
+ // ambil data field header
64
+ const fields = []
65
+ let index = 0
66
+ for (var fieldName in entityData.Items) {
67
+ const item = entityData.Items[fieldName]
68
+ index++
69
+
70
+
71
+ item.index = index
72
+ // if (item.data_fieldname=='grouptype_id') {
73
+ // console.log(item)
74
+ // }
75
+
76
+ if (!item.showInForm) {
77
+ continue
78
+ }
79
+
80
+ const component = item.component
81
+ const fieldname = item.data_fieldname
82
+ const elementId = `${modulePart}-${item.input_name}`
83
+ const placeholder = item.input_placeholder
84
+ const label = item.input_label
85
+ const tabindex = item.input_index
86
+ const binding = item.data_fieldname
87
+ const additionalAttributes = createAdditionalAttributes(item)
88
+ const cssContainer = item.input_containercss.trim() == '' ? 'input-field' : `input-field ${item.input_containercss.trim()}`
89
+
90
+ fields.push({
91
+ component,
92
+ cssContainer,
93
+ fieldname,
94
+ elementId,
95
+ placeholder,
96
+ label,
97
+ tabindex,
98
+ binding,
99
+ additionalAttributes
100
+ })
101
+
102
+ }
103
+
104
+
105
+ // ambil data semua entity
106
+ const sectionDetils = []
107
+ for (var detilEntityName in context.entities) {
108
+ if (detilEntityName=='header') {
109
+ continue
110
+ }
111
+
112
+ const entityData = context.entities[detilEntityName]
113
+ const listModulePart = kebabToCamel(`${moduleName}-${detilEntityName}-list`)
114
+ const title = entityData.title
115
+ sectionDetils.push({
116
+ listModulePart,
117
+ title
118
+ })
119
+ }
120
+
121
+
122
+ const variables = {
123
+ timeGenerated: context.timeGenerated,
124
+ title: title,
125
+ moduleName: moduleName,
126
+ modulePart: modulePart,
127
+ moduleSection: kebabToCamel(`${moduleName}-${sectionName}`),
128
+ section: sectionData,
129
+ autoid,
130
+ primaryKeyElementId: primaryKeyElementId,
131
+ fields: fields,
132
+ sectionDetils: sectionDetils,
133
+ detilCount
134
+ }
135
+
136
+
137
+ const tplFilePath = path.join(__dirname, 'templates', 'moduleHeaderEdit.html.ejs')
138
+ const template = await fs.readFile(tplFilePath, 'utf-8');
139
+ const content = ejs.render(template, variables)
140
+
141
+ await fs.writeFile(targetFile, content, 'utf8');
142
+
143
+ }
144
+ } catch (err) {
145
+ throw err
146
+ }
147
+
148
+ }