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