@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.
- package/LICENSE +28 -0
- package/README.md +2 -0
- package/jsconfig.json +10 -0
- package/libs/fgta5js-dist/fgta5js-v1.8.3.min.css +2 -0
- package/libs/fgta5js-dist/fgta5js-v1.8.3.min.js +11 -0
- package/libs/fgta5js-dist/fgta5js-v1.8.3.min.js.map +1 -0
- package/libs/fgta5js-dist/fonts/karla-italic-latin-ext.woff2 +0 -0
- package/libs/fgta5js-dist/fonts/karla-italic-latin.woff2 +0 -0
- package/libs/fgta5js-dist/fonts/karla-normal-latin-ext.woff2 +0 -0
- package/libs/fgta5js-dist/fonts/karla-normal-latin.woff2 +0 -0
- package/libs/fgta5js-dist/fonts/karla.css +142 -0
- package/libs/webmodule/module-edit.css +163 -0
- package/libs/webmodule/module-footer.css +22 -0
- package/libs/webmodule/module-list.css +25 -0
- package/libs/webmodule/module.css +52 -0
- package/libs/webmodule/module.js +195 -0
- package/libs/webmodule/pagehelper.mjs +45 -0
- package/modules/generator/appgen-components.mjs +142 -0
- package/modules/generator/appgen-icons.mjs +6 -0
- package/modules/generator/appgen-io.mjs +784 -0
- package/modules/generator/appgen-ui-search.mjs +173 -0
- package/modules/generator/appgen-ui-unique.mjs +153 -0
- package/modules/generator/appgen-ui.mjs +1181 -0
- package/modules/generator/generator-context.mjs +18 -0
- package/modules/generator/generator-designtemplate.html +1508 -0
- package/modules/generator/generator-ext.html +0 -0
- package/modules/generator/generator-ext.mjs +3 -0
- package/modules/generator/generator.css +642 -0
- package/modules/generator/generator.mjs +195 -0
- package/modules/generator/generator.png +0 -0
- package/modules/generator/generatorEdit.html +185 -0
- package/modules/generator/generatorEdit.mjs +238 -0
- package/modules/generator/generatorList.html +32 -0
- package/modules/generator/generatorList.mjs +243 -0
- package/modules/login/login.css +11 -0
- package/modules/login/login.html +12 -0
- package/modules/login/login.mjs +111 -0
- package/package.json +46 -0
- package/percobaan/simmpan-ke-minio.js +24 -0
- package/src/api.js +80 -0
- package/src/apis/generator.api.js +226 -0
- package/src/apis/login.api.js +109 -0
- package/src/bucket.js +24 -0
- package/src/context.js +26 -0
- package/src/datalog.sql +22 -0
- package/src/datarecords.js +0 -0
- package/src/db.js +61 -0
- package/src/generator/createApiExtenderModule.js +54 -0
- package/src/generator/createApiModule.js +218 -0
- package/src/generator/createIcon.js +62 -0
- package/src/generator/createInfoAboutExtender.js +42 -0
- package/src/generator/createInfoLogs.js +41 -0
- package/src/generator/createInfoRecordExtender.js +41 -0
- package/src/generator/createModuleContext.js +48 -0
- package/src/generator/createModuleDetilEditHtml.js +110 -0
- package/src/generator/createModuleDetilEditMjs.js +172 -0
- package/src/generator/createModuleDetilListHtml.js +146 -0
- package/src/generator/createModuleDetilListMjs.js +73 -0
- package/src/generator/createModuleEjs.js +51 -0
- package/src/generator/createModuleExtenderHtml.js +43 -0
- package/src/generator/createModuleExtenderMjs.js +43 -0
- package/src/generator/createModuleHeaderEditHtml.js +148 -0
- package/src/generator/createModuleHeaderEditMjs.js +197 -0
- package/src/generator/createModuleHeaderListHtml.js +144 -0
- package/src/generator/createModuleHeaderListMjs.js +67 -0
- package/src/generator/createModuleMjs.js +67 -0
- package/src/generator/createModuleRollup.js +42 -0
- package/src/generator/createProgramData.js +96 -0
- package/src/generator/createTable.js +156 -0
- package/src/generator/ddl.js +475 -0
- package/src/generator/helper.js +149 -0
- package/src/generator/templates/__rollup-module.ejs +90 -0
- package/src/generator/templates/api-extender-module.js.ejs +0 -0
- package/src/generator/templates/api-module.js.ejs +818 -0
- package/src/generator/templates/module-context.ejs +16 -0
- package/src/generator/templates/module-ext-about.ejs +1 -0
- package/src/generator/templates/module-ext-record.ejs +1 -0
- package/src/generator/templates/module-ext.html.ejs +3 -0
- package/src/generator/templates/module-ext.mjs.ejs +21 -0
- package/src/generator/templates/module-logs.ejs +14 -0
- package/src/generator/templates/module.ejs.ejs +48 -0
- package/src/generator/templates/module.mjs.ejs +256 -0
- package/src/generator/templates/moduleDetilEdit.html.ejs +34 -0
- package/src/generator/templates/moduleDetilEdit.mjs.ejs +792 -0
- package/src/generator/templates/moduleDetilList.html.ejs +26 -0
- package/src/generator/templates/moduleDetilList.mjs.ejs +319 -0
- package/src/generator/templates/moduleHeaderEdit.html.ejs +53 -0
- package/src/generator/templates/moduleHeaderEdit.mjs.ejs +807 -0
- package/src/generator/templates/moduleHeaderList.html.ejs +24 -0
- package/src/generator/templates/moduleHeaderList.mjs.ejs +308 -0
- package/src/generator/templates/sqlAddField.ejs +3 -0
- package/src/generator/templates/sqlAddForeignKey.ejs +12 -0
- package/src/generator/templates/sqlAddUniqueIndex.ejs +4 -0
- package/src/generator/templates/sqlCreateTable.ejs +9 -0
- package/src/generator/templates/sqlDropForeignKey.ejs +3 -0
- package/src/generator/templates/sqlDropUniqueIndex.ejs +4 -0
- package/src/generator/templates/sqlModifyField.ejs +6 -0
- package/src/generator/trygenerate.js +83 -0
- package/src/generator/worker.js +389 -0
- package/src/helper.js +82 -0
- package/src/logger.js +39 -0
- package/src/router.js +84 -0
- package/src/routers/defaultLoginApi.js +29 -0
- package/src/routers/defaultLoginAsset.js +18 -0
- package/src/routers/defaultLoginPage.js +36 -0
- package/src/routers/defaultRootIndex.js +16 -0
- package/src/routers/downloadHandler.js +51 -0
- package/src/routers/fileUploadApi.js +15 -0
- package/src/routers/generatorApi.js +30 -0
- package/src/routers/generatorAsset.js +18 -0
- package/src/routers/generatorPage.js +37 -0
- package/src/routers/handleError.js +43 -0
- package/src/routers/handleModuleNotfound.js +12 -0
- package/src/routers/moduleApi.js +34 -0
- package/src/routers/modulePage.js +102 -0
- package/src/sequencerdoc.js +311 -0
- package/src/sequencerline.js +214 -0
- package/src/session.js +57 -0
- package/src/startup.js +59 -0
- package/src/webapps.js +239 -0
- package/src/workermanager.js +83 -0
- package/templates/_lib_debug.ejs +11 -0
- package/templates/_lib_production.ejs +5 -0
- package/templates/application.page.ejs +143 -0
- package/templates/generator.page.ejs +131 -0
- package/templates/index.page.ejs +24 -0
- package/templates/login.page.ejs +102 -0
- package/templates/moduleError.ejs +16 -0
- package/templates/moduleNotfound.ejs +14 -0
- package/webapps.code-workspace +11 -0
|
@@ -0,0 +1,197 @@
|
|
|
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 createModuleHeaderEditMjs(context, options) {
|
|
11
|
+
const overwrite = options.overwrite===true
|
|
12
|
+
const moduleName = context.moduleName
|
|
13
|
+
const title = context.title
|
|
14
|
+
const sectionPart = 'edit'
|
|
15
|
+
const timeGenerated = context.timeGenerated
|
|
16
|
+
|
|
17
|
+
try {
|
|
18
|
+
|
|
19
|
+
// Data Detil
|
|
20
|
+
const entitiesDetil = []
|
|
21
|
+
for (let entityName in context.entities) {
|
|
22
|
+
const entity = context.entities[entityName]
|
|
23
|
+
|
|
24
|
+
// hanya proses yang detil
|
|
25
|
+
if (entityName=='header') {
|
|
26
|
+
continue
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const e = {
|
|
30
|
+
name: entityName,
|
|
31
|
+
table: entity.table,
|
|
32
|
+
pk: entity.pk,
|
|
33
|
+
moduleSection: kebabToCamel(`${moduleName}-${entityName}`),
|
|
34
|
+
}
|
|
35
|
+
entitiesDetil.push(e)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
// Data Header
|
|
41
|
+
for (let entityName in context.entities) {
|
|
42
|
+
const entityData = context.entities[entityName]
|
|
43
|
+
|
|
44
|
+
// hanya proses yang Header
|
|
45
|
+
if (entityName!='header') {
|
|
46
|
+
continue
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const sectionName = entityName
|
|
50
|
+
const modulePart = kebabToCamel(`${moduleName}-${sectionName}-${sectionPart}`)
|
|
51
|
+
const targetFile = path.join(context.moduleDir, `${modulePart}.mjs`)
|
|
52
|
+
|
|
53
|
+
// cek dulu apakah file ada
|
|
54
|
+
var fileExists = await isFileExist(targetFile)
|
|
55
|
+
if (fileExists && !overwrite) {
|
|
56
|
+
context.postMessage({message: `skip file: '${targetFile}`})
|
|
57
|
+
return
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// reporting progress to parent process
|
|
61
|
+
context.postMessage({message: `generating file: '${targetFile}`})
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
// start geneate program code
|
|
65
|
+
|
|
66
|
+
const tablename = entityData.table
|
|
67
|
+
const headerPrimaryKey = entityData.pk
|
|
68
|
+
|
|
69
|
+
const fields = []
|
|
70
|
+
const fieldHandles = []
|
|
71
|
+
const defaultInits = []
|
|
72
|
+
const uploadFields = []
|
|
73
|
+
const comboboxList = []
|
|
74
|
+
let headerHasUpload = false
|
|
75
|
+
for (var fieldName in entityData.Items) {
|
|
76
|
+
const item = entityData.Items[fieldName]
|
|
77
|
+
|
|
78
|
+
if (!item.showInForm) {
|
|
79
|
+
continue
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
const component = item.component
|
|
84
|
+
const fieldname = item.data_fieldname
|
|
85
|
+
const inputname = item.input_name
|
|
86
|
+
const elementId = `${modulePart}-${item.input_name}`
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
if (component=='Filebox') {
|
|
90
|
+
headerHasUpload = true
|
|
91
|
+
uploadFields.push({
|
|
92
|
+
elementId,
|
|
93
|
+
fieldname,
|
|
94
|
+
inputname
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
} else if (component=='Combobox') {
|
|
98
|
+
comboboxList.push({
|
|
99
|
+
inputname
|
|
100
|
+
})
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// setup handles
|
|
104
|
+
const handles = []
|
|
105
|
+
for (let eventname in item.Handle) {
|
|
106
|
+
let createhandle = item.Handle[eventname]
|
|
107
|
+
if (createhandle) {
|
|
108
|
+
if (eventname=='selecting' && component=='Combobox') {
|
|
109
|
+
handles.push({
|
|
110
|
+
eventname,
|
|
111
|
+
appId: item.Reference.loaderApiModule,
|
|
112
|
+
path: item.Reference.loaderApiPath,
|
|
113
|
+
field_value: item.Reference.bindingValue,
|
|
114
|
+
field_text: item.Reference.bindingText,
|
|
115
|
+
})
|
|
116
|
+
} else {
|
|
117
|
+
handles.push({eventname})
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (handles.length>0) {
|
|
123
|
+
fieldHandles.push({component, inputname, handles})
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
// setup default values
|
|
128
|
+
let setdefault
|
|
129
|
+
if (item.data_defaultvalue != '') {
|
|
130
|
+
if (item.component=='Datepicker' || item.component=='Timepicker') {
|
|
131
|
+
setdefault = `${item.name }: new Date()`
|
|
132
|
+
} else if (item.component=='Numberbox') {
|
|
133
|
+
setdefault = `${item.name }: ${item.data_defaultvalue}`
|
|
134
|
+
} else if (item.component=='Checkbox') {
|
|
135
|
+
if (item.data_defaultvalue==='true' || item.data_defaultvalue==='checked' || item.data_defaultvalue==='1') {
|
|
136
|
+
setdefault = `${item.name }: true`
|
|
137
|
+
}
|
|
138
|
+
} else {
|
|
139
|
+
setdefault = `${item.name }: '${item.data_defaultvalue}'`
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (setdefault!=null) {
|
|
144
|
+
defaultInits.push(setdefault)
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
// add to field config data
|
|
152
|
+
fields.push({
|
|
153
|
+
component,
|
|
154
|
+
fieldname,
|
|
155
|
+
inputname,
|
|
156
|
+
elementId
|
|
157
|
+
})
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
const variables = {
|
|
165
|
+
timeGenerated,
|
|
166
|
+
moduleDescription: context.descr,
|
|
167
|
+
title,
|
|
168
|
+
tablename,
|
|
169
|
+
modulePart,
|
|
170
|
+
moduleName,
|
|
171
|
+
moduleSection: kebabToCamel(`${moduleName}-${sectionName}`),
|
|
172
|
+
moduleList: kebabToCamel(`${moduleName}-${sectionName}-list`),
|
|
173
|
+
fields,
|
|
174
|
+
fieldHandles,
|
|
175
|
+
defaultInits,
|
|
176
|
+
headerPrimaryKey,
|
|
177
|
+
headerHasUpload,
|
|
178
|
+
entitiesDetil,
|
|
179
|
+
uploadFields,
|
|
180
|
+
comboboxList
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
const tplFilePath = path.join(__dirname, 'templates', 'moduleHeaderEdit.mjs.ejs')
|
|
186
|
+
const template = await fs.readFile(tplFilePath, 'utf-8');
|
|
187
|
+
const content = ejs.render(template, variables)
|
|
188
|
+
|
|
189
|
+
await fs.writeFile(targetFile, content, 'utf8');
|
|
190
|
+
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
} catch (err) {
|
|
194
|
+
throw err
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { kebabToCamel, isFileExist, getSectionData } from './helper.js'
|
|
2
|
+
import { fileURLToPath } from 'url';
|
|
3
|
+
import ejs from 'ejs'
|
|
4
|
+
import path from 'path'
|
|
5
|
+
import fs from 'fs/promises'
|
|
6
|
+
|
|
7
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
+
const __dirname = path.dirname(__filename);
|
|
9
|
+
|
|
10
|
+
export async function createModuleHeaderListHtml(context, options) {
|
|
11
|
+
const overwrite = options.overwrite===true
|
|
12
|
+
const moduleName = context.moduleName
|
|
13
|
+
const title = context.title
|
|
14
|
+
const sectionPart = 'list'
|
|
15
|
+
|
|
16
|
+
try {
|
|
17
|
+
|
|
18
|
+
for (let entityName in context.entities) {
|
|
19
|
+
// hanya proses yang Header
|
|
20
|
+
if (entityName!='header') {
|
|
21
|
+
continue
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const sectionName = entityName
|
|
25
|
+
const modulePart = kebabToCamel(`${moduleName}-${sectionName}-${sectionPart}`)
|
|
26
|
+
const targetFile = path.join(context.moduleDir, `${modulePart}.html`)
|
|
27
|
+
|
|
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
|
+
|
|
36
|
+
// reporting progress to parent process
|
|
37
|
+
context.postMessage({message: `generating file: '${targetFile}`})
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
// start geneate program code
|
|
42
|
+
const entityData = context.entities[entityName]
|
|
43
|
+
const sectionData = getSectionData(moduleName, entityName, entityData, 'list')
|
|
44
|
+
|
|
45
|
+
const itemsList = []
|
|
46
|
+
for (var fieldName in entityData.Items) {
|
|
47
|
+
const item = entityData.Items[fieldName]
|
|
48
|
+
if (!item.showInGrid) {
|
|
49
|
+
continue
|
|
50
|
+
}
|
|
51
|
+
item._fieldName = fieldName
|
|
52
|
+
item._columnIndex = Number(item.input_index)
|
|
53
|
+
itemsList.push(item)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// urutkan data
|
|
57
|
+
itemsList.sort((a, b) => a._columnIndex - b._columnIndex);
|
|
58
|
+
|
|
59
|
+
const sortedItems = {}
|
|
60
|
+
for (let item of itemsList) {
|
|
61
|
+
sortedItems[item._fieldName] = item
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
const fields = []
|
|
66
|
+
for (var fieldName in sortedItems) {
|
|
67
|
+
const item = entityData.Items[fieldName]
|
|
68
|
+
|
|
69
|
+
const component = item.component
|
|
70
|
+
const dataName = item.name
|
|
71
|
+
const binding = item.data_fieldname
|
|
72
|
+
const label = item.input_label
|
|
73
|
+
const {bindingValue, bindingText, bindingDisplay, table} = item.Reference
|
|
74
|
+
|
|
75
|
+
// additional attributes
|
|
76
|
+
const attrs = []
|
|
77
|
+
if (item.grid_formatter.trim()!='') {
|
|
78
|
+
attrs.push(`formatter="${item.grid_formatter}"`)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (item.grid_css.trim()!='') {
|
|
82
|
+
attrs.push(`class="${item.grid_css}"`)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (item.grid_inlinestyle.trim()!='') {
|
|
86
|
+
attrs.push(`style="${item.grid_inlinestyle}"`)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (item.grid_sorting) {
|
|
90
|
+
attrs.push(`sorting="true"`)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
let additionalAttributes = attrs.join(' ')
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
let columnDataName = dataName
|
|
98
|
+
let columnDataBinding = binding
|
|
99
|
+
|
|
100
|
+
if (component=='Combobox') {
|
|
101
|
+
if (bindingDisplay!='' && bindingDisplay!=null) {
|
|
102
|
+
columnDataName = bindingDisplay
|
|
103
|
+
columnDataBinding = bindingDisplay
|
|
104
|
+
} else {
|
|
105
|
+
columnDataName = bindingText
|
|
106
|
+
columnDataBinding = bindingText
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
// masukkan ke fields
|
|
113
|
+
fields.push({
|
|
114
|
+
component,
|
|
115
|
+
dataName: columnDataName, //bindingDisplay!=null ? bindingDisplay : dataName,
|
|
116
|
+
binding: columnDataBinding, //bindingDisplay!=null ? bindingDisplay : binding,
|
|
117
|
+
label,
|
|
118
|
+
additionalAttributes
|
|
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
|
+
fields: fields
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
const tplFilePath = path.join(__dirname, 'templates', 'moduleHeaderList.html.ejs')
|
|
134
|
+
const template = await fs.readFile(tplFilePath, 'utf-8');
|
|
135
|
+
const content = ejs.render(template, variables)
|
|
136
|
+
|
|
137
|
+
await fs.writeFile(targetFile, content, 'utf8');
|
|
138
|
+
|
|
139
|
+
}
|
|
140
|
+
} catch (err) {
|
|
141
|
+
throw err
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
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 createModuleHeaderListMjs(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
|
+
// hanya proses yang Header
|
|
21
|
+
if (entityName!='header') {
|
|
22
|
+
continue
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
const sectionName = entityName
|
|
27
|
+
const modulePart = kebabToCamel(`${moduleName}-${sectionName}-${sectionPart}`)
|
|
28
|
+
const targetFile = path.join(context.moduleDir, `${modulePart}.mjs`)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
// cek dulu apakah file ada
|
|
32
|
+
var fileExists = await isFileExist(targetFile)
|
|
33
|
+
if (fileExists && !overwrite) {
|
|
34
|
+
context.postMessage({message: `skip file: '${targetFile}`})
|
|
35
|
+
return
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// reporting progress to parent process
|
|
39
|
+
context.postMessage({message: `generating file: '${targetFile}`})
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
// start geneate program code
|
|
43
|
+
const entityData = context.entities[entityName]
|
|
44
|
+
const sectionData = getSectionData(moduleName, entityName, entityData, 'list')
|
|
45
|
+
|
|
46
|
+
const variables = {
|
|
47
|
+
timeGenerated: context.timeGenerated,
|
|
48
|
+
title: title,
|
|
49
|
+
modulePart: modulePart,
|
|
50
|
+
moduleName: moduleName,
|
|
51
|
+
moduleEdit: kebabToCamel(`${moduleName}-${sectionName}-edit`),
|
|
52
|
+
moduleSection: kebabToCamel(`${moduleName}-${sectionName}`),
|
|
53
|
+
sectionName
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
const tplFilePath = path.join(__dirname, 'templates', 'moduleHeaderList.mjs.ejs')
|
|
58
|
+
const template = await fs.readFile(tplFilePath, 'utf-8');
|
|
59
|
+
const content = ejs.render(template, variables)
|
|
60
|
+
|
|
61
|
+
await fs.writeFile(targetFile, content, 'utf8');
|
|
62
|
+
}
|
|
63
|
+
} catch (err) {
|
|
64
|
+
throw err
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
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 createModuleMjs(context, options) {
|
|
11
|
+
const overwrite = options.overwrite===true
|
|
12
|
+
const moduleName = context.moduleName
|
|
13
|
+
const title = context.title
|
|
14
|
+
const targetFile = path.join(context.moduleDir, `${moduleName}.mjs`)
|
|
15
|
+
const iconUrl = context.icon=='' ? '' : `public/modules/${moduleName}/${options.iconFileName}`
|
|
16
|
+
|
|
17
|
+
try {
|
|
18
|
+
// cek dulu apakah file ada
|
|
19
|
+
var fileExists = await isFileExist(targetFile)
|
|
20
|
+
if (fileExists && !overwrite) {
|
|
21
|
+
context.postMessage({message: `skip file: '${targetFile}`})
|
|
22
|
+
return
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// reporting progress to parent process
|
|
26
|
+
context.postMessage({message: `generating file: '${targetFile}`})
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
// start geneate program code
|
|
30
|
+
let sections = []
|
|
31
|
+
for (var entityName in context.entities) {
|
|
32
|
+
// console.log(context.entities[entityName])
|
|
33
|
+
sections.push(getSectionData(moduleName, entityName, context.entities[entityName], 'list'))
|
|
34
|
+
sections.push(getSectionData(moduleName, entityName, context.entities[entityName], 'edit'))
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
const entityNameArray = []
|
|
39
|
+
for (let s of sections) {
|
|
40
|
+
if (s.partName=='edit') {
|
|
41
|
+
const sectionName = s.sectionName
|
|
42
|
+
entityNameArray.push(sectionName)
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const entityNameList = `'${entityNameArray.join("\', \'")}'`
|
|
47
|
+
|
|
48
|
+
const variables = {
|
|
49
|
+
timeGenerated: context.timeGenerated,
|
|
50
|
+
title: title,
|
|
51
|
+
moduleName: moduleName,
|
|
52
|
+
iconUrl,
|
|
53
|
+
entityNameList,
|
|
54
|
+
sections: sections
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
const tplFilePath = path.join(__dirname, 'templates', 'module.mjs.ejs')
|
|
59
|
+
const template = await fs.readFile(tplFilePath, 'utf-8');
|
|
60
|
+
const content = ejs.render(template, variables)
|
|
61
|
+
|
|
62
|
+
await fs.writeFile(targetFile, content, 'utf8');
|
|
63
|
+
} catch (err) {
|
|
64
|
+
throw err
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { 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
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
+
const __dirname = path.dirname(__filename);
|
|
9
|
+
|
|
10
|
+
export async function createModuleRollup(context, options) {
|
|
11
|
+
const overwrite = options.overwrite===true
|
|
12
|
+
const moduleName = context.moduleName
|
|
13
|
+
const targetFile = path.join(context.moduleDir, `__rollup.${moduleName}.js`)
|
|
14
|
+
|
|
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', '__rollup-module.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
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { isFileExist } from './helper.js'
|
|
2
|
+
import { fileURLToPath } from 'url';
|
|
3
|
+
import path from 'path'
|
|
4
|
+
import fs from 'fs/promises'
|
|
5
|
+
import db from '../db.js'
|
|
6
|
+
import sqlUtil from '@agung_dhewe/pgsqlc'
|
|
7
|
+
import { createSequencerLine } from '../sequencerline.js'
|
|
8
|
+
import logger from '../logger.js';
|
|
9
|
+
|
|
10
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
11
|
+
const __dirname = path.dirname(__filename);
|
|
12
|
+
|
|
13
|
+
export async function createProgramData(context, options) {
|
|
14
|
+
const apps_id = context.appname
|
|
15
|
+
if (apps_id=='dev') {
|
|
16
|
+
// untuk dev, tidak perlu diinput ke program
|
|
17
|
+
return
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
const generator_id = context.id
|
|
22
|
+
const rawData = context.icon
|
|
23
|
+
const moduleName = context.moduleName
|
|
24
|
+
const user_id = context.user_id
|
|
25
|
+
const user_name = context.user_name
|
|
26
|
+
const ipaddress = context.ipaddress
|
|
27
|
+
const title = context.title
|
|
28
|
+
const descr = context.descr
|
|
29
|
+
const icon = context.icon=='' ? '' : `public/modules/${moduleName}/${options.iconFileName}`
|
|
30
|
+
const tablename = 'core.program'
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
const log = async (id, action, data={}, remark='') => {
|
|
34
|
+
const source = 'generator'
|
|
35
|
+
const metadata = JSON.stringify({})
|
|
36
|
+
const executionTimeMs = 0
|
|
37
|
+
|
|
38
|
+
const logdata = {id, user_id, user_name, moduleName, action, tablename, executionTimeMs, remark, metadata, ipaddress}
|
|
39
|
+
logdata.moduleName = 'program'
|
|
40
|
+
logdata.tablename = 'core.program'
|
|
41
|
+
|
|
42
|
+
const ret = await logger.log(logdata)
|
|
43
|
+
return ret
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
try {
|
|
48
|
+
|
|
49
|
+
const sql = `select * from ${tablename} where generator_id = \${generator_id}`
|
|
50
|
+
const row = await db.oneOrNone(sql, {generator_id})
|
|
51
|
+
|
|
52
|
+
const obj = {
|
|
53
|
+
program_title: title,
|
|
54
|
+
apps_id : apps_id,
|
|
55
|
+
program_name : moduleName,
|
|
56
|
+
program_descr: descr,
|
|
57
|
+
program_icon: icon,
|
|
58
|
+
generator_id: generator_id,
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const result = await db.tx(async tx=>{
|
|
62
|
+
sqlUtil.connect(tx)
|
|
63
|
+
|
|
64
|
+
if (row==null) {
|
|
65
|
+
// insert
|
|
66
|
+
const sequencer = createSequencerLine(tx, {})
|
|
67
|
+
const program_id = await sequencer.yearlyshort('CNT')
|
|
68
|
+
|
|
69
|
+
obj.program_id = program_id
|
|
70
|
+
obj._createby = user_id
|
|
71
|
+
obj._createdate = (new Date()).toISOString()
|
|
72
|
+
|
|
73
|
+
const cmd = sqlUtil.createInsertCommand(tablename, obj)
|
|
74
|
+
const ret = await cmd.execute(obj)
|
|
75
|
+
|
|
76
|
+
// log
|
|
77
|
+
log(obj.program_id, 'GENERATED')
|
|
78
|
+
|
|
79
|
+
} else {
|
|
80
|
+
// update
|
|
81
|
+
obj.program_id = row.program_id
|
|
82
|
+
obj._modifyby = user_id
|
|
83
|
+
obj._modifydate = (new Date()).toISOString()
|
|
84
|
+
|
|
85
|
+
const cmd = sqlUtil.createUpdateCommand(tablename, obj, ['program_id'])
|
|
86
|
+
const ret = await cmd.execute(obj)
|
|
87
|
+
|
|
88
|
+
// log
|
|
89
|
+
log(obj.program_id, 'REGENERATED')
|
|
90
|
+
}
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
} catch (err) {
|
|
94
|
+
throw err
|
|
95
|
+
}
|
|
96
|
+
}
|