@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,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
|
+
}
|