lupine.api 1.1.58 → 1.1.60
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/README.md +3 -3
- package/admin/admin-about.tsx +12 -16
- package/admin/admin-config.tsx +47 -44
- package/admin/admin-css.tsx +3 -3
- package/admin/admin-db.tsx +75 -75
- package/admin/admin-frame-helper.tsx +364 -364
- package/admin/admin-frame.tsx +164 -164
- package/admin/admin-index.tsx +65 -65
- package/admin/admin-login.tsx +111 -111
- package/admin/admin-menu-edit.tsx +637 -637
- package/admin/admin-menu-list.tsx +87 -87
- package/admin/admin-page-edit.tsx +564 -564
- package/admin/admin-page-list.tsx +83 -83
- package/admin/admin-performance.tsx +28 -28
- package/admin/admin-release.tsx +427 -426
- package/admin/admin-resources.tsx +382 -382
- package/admin/admin-shell.tsx +89 -89
- package/admin/admin-table-data.tsx +146 -146
- package/admin/admin-table-list.tsx +230 -230
- package/admin/admin-test-animations.tsx +395 -395
- package/admin/admin-test-component.tsx +823 -808
- package/admin/admin-test-edit.tsx +319 -319
- package/admin/admin-test-themes.tsx +56 -56
- package/admin/admin-tokens.tsx +338 -338
- package/admin/design/admin-design.tsx +174 -174
- package/admin/design/block-grid.tsx +36 -36
- package/admin/design/block-grid1.tsx +21 -21
- package/admin/design/block-paragraph.tsx +19 -19
- package/admin/design/block-title.tsx +19 -19
- package/admin/design/design-block-box.tsx +140 -140
- package/admin/design/drag-data.tsx +24 -24
- package/admin/index.ts +9 -9
- package/admin/package.json +15 -15
- package/admin/tsconfig.json +127 -127
- package/dev/copy-folder.js +32 -32
- package/dev/cp-index-html.js +69 -69
- package/dev/file-utils.js +12 -12
- package/dev/index.js +18 -19
- package/dev/package.json +12 -12
- package/dev/plugin-ifelse.js +168 -168
- package/dev/plugin-ifelse.test.js +37 -37
- package/dev/run-cmd.js +14 -14
- package/dev/send-request.js +12 -12
- package/package.json +55 -55
- package/src/admin-api/admin-api-helper.ts +210 -205
- package/src/admin-api/admin-api.ts +65 -65
- package/src/admin-api/admin-auth.ts +152 -146
- package/src/admin-api/admin-config.ts +94 -84
- package/src/admin-api/admin-csv.ts +94 -94
- package/src/admin-api/admin-db.ts +269 -269
- package/src/admin-api/admin-menu.ts +135 -135
- package/src/admin-api/admin-page.ts +135 -135
- package/src/admin-api/admin-performance.ts +128 -128
- package/src/admin-api/admin-release.ts +706 -700
- package/src/admin-api/admin-resources.ts +318 -318
- package/src/admin-api/admin-token-helper.ts +82 -79
- package/src/admin-api/admin-tokens.ts +90 -90
- package/src/admin-api/index.ts +2 -2
- package/src/admin-api/web-config-api.ts +19 -19
- package/src/api/api-cache.ts +103 -103
- package/src/api/api-helper.ts +44 -44
- package/src/api/api-module.ts +67 -60
- package/src/api/api-router.ts +177 -177
- package/src/api/api-shared-storage.ts +64 -64
- package/src/api/async-storage.ts +5 -5
- package/src/api/debug-service.ts +56 -56
- package/src/api/encode-html.ts +27 -27
- package/src/api/handle-status.ts +75 -75
- package/src/api/index.ts +15 -16
- package/src/api/mini-web-socket.ts +270 -270
- package/src/api/server-content-type.ts +82 -82
- package/src/api/server-render.ts +235 -215
- package/src/api/shell-service.ts +74 -74
- package/src/api/simple-storage.ts +80 -80
- package/src/api/static-server.ts +128 -125
- package/src/api/to-client-delivery.ts +26 -26
- package/src/app/app-cache.ts +55 -55
- package/src/app/app-helper.ts +62 -62
- package/src/app/app-message.ts +109 -109
- package/src/app/app-shared-storage.ts +363 -363
- package/src/app/app-start.ts +136 -136
- package/src/app/cleanup-exit.ts +16 -16
- package/src/app/host-to-path.ts +38 -38
- package/src/app/index.ts +11 -11
- package/src/app/process-dev-requests.ts +130 -130
- package/src/app/web-listener.ts +294 -294
- package/src/app/web-processor.ts +47 -42
- package/src/app/web-server.ts +100 -100
- package/src/common-js/web-env.js +104 -104
- package/src/index.ts +7 -7
- package/src/lang/api-lang-en.ts +26 -26
- package/src/lang/api-lang-zh-cn.ts +27 -27
- package/src/lang/index.ts +2 -2
- package/src/lang/lang-helper.ts +76 -76
- package/src/lang/lang-props.ts +6 -6
- package/src/lib/db/db-helper.ts +23 -23
- package/src/lib/db/db-mysql.ts +249 -250
- package/src/lib/db/db-sqlite.ts +101 -101
- package/src/lib/db/db.spec.ts +28 -28
- package/src/lib/db/db.ts +325 -325
- package/src/lib/db/index.ts +5 -5
- package/src/lib/index.ts +3 -3
- package/src/lib/logger.spec.ts +214 -214
- package/src/lib/logger.ts +281 -281
- package/src/lib/runtime-require.ts +37 -37
- package/src/lib/utils/cookie-util.ts +34 -34
- package/src/lib/utils/crypto.ts +58 -58
- package/src/lib/utils/date-utils.ts +317 -317
- package/src/lib/utils/deep-merge.ts +37 -37
- package/src/lib/utils/delay.ts +12 -12
- package/src/lib/utils/file-setting.ts +55 -55
- package/src/lib/utils/format-bytes.ts +11 -11
- package/src/lib/utils/fs-utils.ts +158 -158
- package/src/lib/utils/get-env.ts +27 -27
- package/src/lib/utils/index.ts +12 -12
- package/src/lib/utils/is-type.ts +48 -48
- package/src/lib/utils/load-env.ts +14 -14
- package/src/lib/utils/pad.ts +6 -6
- package/src/models/api-base.ts +5 -5
- package/src/models/api-module-props.ts +10 -11
- package/src/models/api-router-props.ts +26 -26
- package/src/models/app-cache-props.ts +33 -33
- package/src/models/app-data-props.ts +10 -10
- package/src/models/app-helper-props.ts +6 -6
- package/src/models/app-shared-storage-props.ts +38 -38
- package/src/models/app-start-props.ts +18 -18
- package/src/models/async-storage-props.ts +13 -13
- package/src/models/db-config.ts +30 -30
- package/src/models/host-to-path-props.ts +12 -12
- package/src/models/index.ts +16 -16
- package/src/models/json-object.ts +8 -8
- package/src/models/locals-props.ts +36 -36
- package/src/models/logger-props.ts +84 -84
- package/src/models/simple-storage-props.ts +13 -14
- package/src/models/to-client-delivery-props.ts +6 -6
- package/tsconfig.json +115 -115
- package/dev/plugin-gen-versions.js +0 -20
|
@@ -1,564 +1,564 @@
|
|
|
1
|
-
import {
|
|
2
|
-
CssProps,
|
|
3
|
-
getRenderPageProps,
|
|
4
|
-
isFrontEnd,
|
|
5
|
-
RefProps,
|
|
6
|
-
DomUtils,
|
|
7
|
-
ModalWindow,
|
|
8
|
-
NotificationMessage,
|
|
9
|
-
PopupMenu,
|
|
10
|
-
} from 'lupine.components';
|
|
11
|
-
import { DesignBlockBox } from './design/design-block-box';
|
|
12
|
-
import { BlockParagraph } from './design/block-paragraph';
|
|
13
|
-
|
|
14
|
-
const fetchTableList = async () => {
|
|
15
|
-
const data = await getRenderPageProps().renderPageFunctions.fetchData('/api/admin/db/tables');
|
|
16
|
-
return data.json;
|
|
17
|
-
};
|
|
18
|
-
const fetchTableDrop = async (tableName: string) => {
|
|
19
|
-
const data = await getRenderPageProps().renderPageFunctions.fetchData('/api/admin/db/table-drop', {
|
|
20
|
-
table: tableName,
|
|
21
|
-
});
|
|
22
|
-
return data.json;
|
|
23
|
-
};
|
|
24
|
-
const fetchTableTruncate = async (tableName: string) => {
|
|
25
|
-
const data = await getRenderPageProps().renderPageFunctions.fetchData('/api/admin/db/table-truncate', {
|
|
26
|
-
table: tableName,
|
|
27
|
-
});
|
|
28
|
-
return data.json;
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
export const SaveMenu = (props: {
|
|
32
|
-
menuIdReadonly?: boolean;
|
|
33
|
-
menuId: string;
|
|
34
|
-
title: string;
|
|
35
|
-
note: string;
|
|
36
|
-
package: string;
|
|
37
|
-
}) => {
|
|
38
|
-
return (
|
|
39
|
-
<div className='save-menu'>
|
|
40
|
-
<div class='row-box mb-s'>
|
|
41
|
-
<div class='w-7'>Menu Id:</div>
|
|
42
|
-
<input type='text' id='s_menuId' value={props.menuId} class='input-base w-20' readonly={props.menuIdReadonly} />
|
|
43
|
-
</div>
|
|
44
|
-
<div class='row-box mb-s'>
|
|
45
|
-
<div class='w-7'>Menu Title:</div>
|
|
46
|
-
<input type='text' id='s_menuTitle' value={props.title} class='input-base w-20' />
|
|
47
|
-
</div>
|
|
48
|
-
<div class='row-box mb-s'>
|
|
49
|
-
<div class='w-7'>Menu Description:</div>
|
|
50
|
-
<input type='text' id='s_menuNote' value={props.note} class='input-base w-20' />
|
|
51
|
-
</div>
|
|
52
|
-
<div class='row-box mb-s'>
|
|
53
|
-
<div class='w-7'>Package id:</div>
|
|
54
|
-
<input type='text' id='s_menuPackage' value={props.package} class='input-base w-20' />
|
|
55
|
-
</div>
|
|
56
|
-
</div>
|
|
57
|
-
);
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
export const AdminPageEditPage = (menuId: string) => {
|
|
61
|
-
if (!isFrontEnd()) {
|
|
62
|
-
return <div>No SSR.</div>;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
let savedMenuId = '';
|
|
66
|
-
let savedMenuTitle = '';
|
|
67
|
-
let savedMenuNote = '';
|
|
68
|
-
let savedPackage = '';
|
|
69
|
-
const onDelete = async (tableName: string) => {
|
|
70
|
-
if (!confirm(`Are you really Deleting ${tableName}?`)) {
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
const json = await fetchTableDrop(tableName);
|
|
74
|
-
console.log('====fetchTableDelete', json);
|
|
75
|
-
NotificationMessage.sendMessage('Deleted: ' + tableName);
|
|
76
|
-
onClick();
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
// const onDownload = async (tableName: string) => {
|
|
80
|
-
// downloadLink('/api/admin/db/table-download?table=' + tableName);
|
|
81
|
-
// };
|
|
82
|
-
|
|
83
|
-
const onClick = async () => {
|
|
84
|
-
const json = await fetchTableList();
|
|
85
|
-
console.log('====fetchTableList', json);
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
const doLoad = (results: any) => {
|
|
89
|
-
oMenu.length = 0;
|
|
90
|
-
savedMenuId = results.menuid;
|
|
91
|
-
savedMenuTitle = results.title;
|
|
92
|
-
savedMenuNote = results.note;
|
|
93
|
-
savedPackage = results.package;
|
|
94
|
-
for (const i in results.items) {
|
|
95
|
-
const item = results.items[i];
|
|
96
|
-
const lev = Number.parseInt(item[0]);
|
|
97
|
-
var pre = new Array(lev * 4 + 1).join('-');
|
|
98
|
-
oMenu.options[oMenu.length] = new Option(pre + item[4], item.join('\t'));
|
|
99
|
-
}
|
|
100
|
-
oMenu.selectedIndex = 0;
|
|
101
|
-
doListChg();
|
|
102
|
-
};
|
|
103
|
-
const onSave = () => {
|
|
104
|
-
doSave(false);
|
|
105
|
-
};
|
|
106
|
-
const onSaveAs = () => {
|
|
107
|
-
doSave(true);
|
|
108
|
-
};
|
|
109
|
-
const doSave = async (isSaveAs = false) => {
|
|
110
|
-
const handleClicked = async (index: number) => {
|
|
111
|
-
if (index === 0) {
|
|
112
|
-
// Save
|
|
113
|
-
const id = DomUtils.getValue('#s_menuId');
|
|
114
|
-
const title = DomUtils.getValue('#s_menuTitle');
|
|
115
|
-
const note = DomUtils.getValue('#s_menuNote');
|
|
116
|
-
const pkg = DomUtils.getValue('#s_menuPackage');
|
|
117
|
-
let regex = /^[a-zA-Z0-9]+$/;
|
|
118
|
-
if (!id || !regex.test(id)) {
|
|
119
|
-
alert('menuId is not valid!');
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
const menuIdReadonly = !isSaveAs && !!savedMenuId;
|
|
123
|
-
const items = getAllItems();
|
|
124
|
-
const post: any = {
|
|
125
|
-
id,
|
|
126
|
-
title,
|
|
127
|
-
note,
|
|
128
|
-
items,
|
|
129
|
-
idReadonly: menuIdReadonly,
|
|
130
|
-
package: pkg,
|
|
131
|
-
};
|
|
132
|
-
|
|
133
|
-
const updateIds = () => {
|
|
134
|
-
savedMenuId = id;
|
|
135
|
-
savedMenuTitle = title;
|
|
136
|
-
savedMenuNote = note;
|
|
137
|
-
savedPackage = pkg;
|
|
138
|
-
ref.$('.admin-sub-title').innerHTML = `Edit Menu: ${savedMenuId}`;
|
|
139
|
-
};
|
|
140
|
-
const data = await getRenderPageProps().renderPageFunctions.fetchData('/api/admin/menus/save', post);
|
|
141
|
-
if (data.json && data.json.status !== 'ok') {
|
|
142
|
-
if (!post.idReadonly && data.json.status === 'ID_EXISTS') {
|
|
143
|
-
if (!confirm(`${data.json.message}\r\n\r\nDo you want to override the same menu id?`)) {
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
post.idReadonly = true;
|
|
147
|
-
const data2 = await getRenderPageProps().renderPageFunctions.fetchData('/api/admin/menus/save', post);
|
|
148
|
-
if (data2.json && data2.json.status !== 'ok') {
|
|
149
|
-
alert(`Error happened: ${data2.json.message}`);
|
|
150
|
-
} else {
|
|
151
|
-
updateIds();
|
|
152
|
-
NotificationMessage.sendMessage('Menu is saved.');
|
|
153
|
-
}
|
|
154
|
-
} else {
|
|
155
|
-
alert(`Error happened: ${data.json.message}`);
|
|
156
|
-
return;
|
|
157
|
-
}
|
|
158
|
-
} else {
|
|
159
|
-
updateIds();
|
|
160
|
-
NotificationMessage.sendMessage('Menu is saved.');
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
modalClose();
|
|
165
|
-
};
|
|
166
|
-
const modalClose = await ModalWindow.show({
|
|
167
|
-
title: 'Save Menu',
|
|
168
|
-
buttons: ['Save', 'Cancel'],
|
|
169
|
-
// contentMaxHeight: '400px',
|
|
170
|
-
handleClicked,
|
|
171
|
-
children: (
|
|
172
|
-
<SaveMenu
|
|
173
|
-
menuIdReadonly={!!savedMenuId && !isSaveAs}
|
|
174
|
-
menuId={savedMenuId}
|
|
175
|
-
title={savedMenuTitle}
|
|
176
|
-
note={savedMenuNote}
|
|
177
|
-
package={savedPackage}
|
|
178
|
-
></SaveMenu>
|
|
179
|
-
),
|
|
180
|
-
});
|
|
181
|
-
};
|
|
182
|
-
|
|
183
|
-
let oMenu!: HTMLSelectElement;
|
|
184
|
-
const ref: RefProps = {
|
|
185
|
-
onLoad: async () => {
|
|
186
|
-
// oMenu = document.querySelector('#menulist')!;
|
|
187
|
-
// if (menuId) {
|
|
188
|
-
// const response = await getRenderPageProps().renderPageFunctions.fetchData(`/api/admin/pages/get/${menuId}`);
|
|
189
|
-
// doLoad(response.json.result);
|
|
190
|
-
// }
|
|
191
|
-
},
|
|
192
|
-
};
|
|
193
|
-
function getSel(ismsg = true) {
|
|
194
|
-
if (oMenu.selectedIndex < 0 && ismsg) {
|
|
195
|
-
if (oMenu.length == 0) {
|
|
196
|
-
NotificationMessage.sendMessage('No item in menu item list.');
|
|
197
|
-
} else {
|
|
198
|
-
NotificationMessage.sendMessage('Please select one item.');
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
return oMenu.selectedIndex;
|
|
202
|
-
}
|
|
203
|
-
function getLevel(ind: number) {
|
|
204
|
-
var t = oMenu.options[ind].value.split('\t');
|
|
205
|
-
return Number.parseInt(t[0]);
|
|
206
|
-
}
|
|
207
|
-
function getNav(ind: number) {
|
|
208
|
-
var t = oMenu.options[ind].value.split('\t');
|
|
209
|
-
return t[1];
|
|
210
|
-
}
|
|
211
|
-
function getAcc(ind: number) {
|
|
212
|
-
var t = oMenu.options[ind].value.split('\t');
|
|
213
|
-
return t[2];
|
|
214
|
-
}
|
|
215
|
-
function getLnk(ind: number) {
|
|
216
|
-
var t = oMenu.options[ind].value.split('\t');
|
|
217
|
-
return t[3];
|
|
218
|
-
}
|
|
219
|
-
function getTxt(ind: number) {
|
|
220
|
-
var t = oMenu.options[ind].value.split('\t');
|
|
221
|
-
return t[4];
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
function getAllItems() {
|
|
225
|
-
const ret = [];
|
|
226
|
-
for (var i = 0; i < oMenu.length; i++) {
|
|
227
|
-
// ret.push(oMenu.options[i].value);
|
|
228
|
-
ret.push([getLevel(i), getNav(i), getAcc(i), getLnk(i), getTxt(i)]);
|
|
229
|
-
}
|
|
230
|
-
return ret;
|
|
231
|
-
}
|
|
232
|
-
async function doDelete() {
|
|
233
|
-
if (!savedMenuId) {
|
|
234
|
-
alert('Current menu is not on DB yet.');
|
|
235
|
-
return;
|
|
236
|
-
}
|
|
237
|
-
if (!confirm('Do you delete this menu from the system?')) return;
|
|
238
|
-
await getRenderPageProps().renderPageFunctions.fetchData(`/api/admin/menus/delete/${savedMenuId}`);
|
|
239
|
-
doNew();
|
|
240
|
-
NotificationMessage.sendMessage('Menu is deleted.');
|
|
241
|
-
}
|
|
242
|
-
function doNew() {
|
|
243
|
-
savedMenuId = '';
|
|
244
|
-
for (var i = oMenu.length - 1; i >= 0; i--) {
|
|
245
|
-
oMenu.options[i].remove();
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
function byId(id: string) {
|
|
249
|
-
return document.getElementById(id)! as HTMLElement;
|
|
250
|
-
}
|
|
251
|
-
function doListChg() {
|
|
252
|
-
var ind = getSel(false);
|
|
253
|
-
var tt = getTxt(ind);
|
|
254
|
-
|
|
255
|
-
var ty = '0';
|
|
256
|
-
DomUtils.setValue('#menuimageout', '');
|
|
257
|
-
DomUtils.setValue('#menuimageon', '');
|
|
258
|
-
DomUtils.setValue('#menupanel', '');
|
|
259
|
-
if (tt.substring(0, 4) == '[::]') {
|
|
260
|
-
var t = tt.split('[::]');
|
|
261
|
-
if (t.length == 6) {
|
|
262
|
-
DomUtils.setValue('#menuimg1', t[3]);
|
|
263
|
-
DomUtils.setValue('#menuimg2', t[4]);
|
|
264
|
-
ty = t[1];
|
|
265
|
-
tt = t[2];
|
|
266
|
-
DomUtils.setValue('#menupanel', t[5]);
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
var lev = getLevel(ind);
|
|
271
|
-
if (lev > 0) {
|
|
272
|
-
byId('img_p0').style.display = 'none';
|
|
273
|
-
byId('img_p1').style.display = 'none';
|
|
274
|
-
byId('img_p2').style.display = 'none';
|
|
275
|
-
byId('img_panel').style.display = 'none';
|
|
276
|
-
} else {
|
|
277
|
-
byId('img_p0').style.display = '';
|
|
278
|
-
byId('img_p1').style.display = '';
|
|
279
|
-
byId('img_p2').style.display = '';
|
|
280
|
-
byId('img_panel').style.display = '';
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
DomUtils.setChecked('#itemtype1', ty == '' || ty == '0');
|
|
284
|
-
DomUtils.setChecked('#itemtype2', ty == '1');
|
|
285
|
-
DomUtils.setValue('#menutitle', tt);
|
|
286
|
-
DomUtils.setValue('#menulink', getLnk(ind));
|
|
287
|
-
DomUtils.setValue('#menutarget', getNav(ind));
|
|
288
|
-
DomUtils.setValue('#menuaccess', getAcc(ind));
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
function doReplace(ind2?: number) {
|
|
292
|
-
var ind = typeof ind2 === 'number' && ind2 >= 0 ? ind2 : getSel(true);
|
|
293
|
-
if (ind < 0) return;
|
|
294
|
-
var menutxt = DomUtils.getValue('#menutitle').trim();
|
|
295
|
-
if (menutxt == '') {
|
|
296
|
-
alert('Please input menu text.');
|
|
297
|
-
return;
|
|
298
|
-
}
|
|
299
|
-
if (menutxt.indexOf('[::]') >= 0) {
|
|
300
|
-
alert('Cannot include "[::]" in menu text.');
|
|
301
|
-
return;
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
var lev = getLevel(ind);
|
|
305
|
-
var acc = DomUtils.getValue('#menuaccess');
|
|
306
|
-
var nav = DomUtils.getValue('#menutarget');
|
|
307
|
-
if (!nav || nav == '' || !acc || acc == '') {
|
|
308
|
-
alert('Please select browsernav and access.');
|
|
309
|
-
return;
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
var itemty = '0';
|
|
313
|
-
if (DomUtils.getChecked('#itemtype2')) {
|
|
314
|
-
itemty = '1';
|
|
315
|
-
}
|
|
316
|
-
var img1 = DomUtils.getValue('#menuimageout').trim();
|
|
317
|
-
var img2 = DomUtils.getValue('#menuimageon').trim();
|
|
318
|
-
var panel = DomUtils.getValue('#menupanel').trim();
|
|
319
|
-
if (itemty == '1' && img1 == '') {
|
|
320
|
-
alert('For selected Image, need input image path.');
|
|
321
|
-
return;
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
if (img1 != '' || panel != '') {
|
|
325
|
-
menutxt = '[::]' + itemty + '[::]' + menutxt + '[::]' + img1 + '[::]' + img2 + '[::]' + panel;
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
var pre = new Array(lev * 4 + 1).join('-');
|
|
329
|
-
oMenu.options[ind].value = lev + ' ' + nav + ' ' + acc + ' XX ' + DomUtils.getValue('#menulink').trim() + ' ' + menutxt;
|
|
330
|
-
oMenu.options[ind].text = pre + DomUtils.getValue('#menutitle').trim();
|
|
331
|
-
}
|
|
332
|
-
function doAppend(act: number) {
|
|
333
|
-
var ind = oMenu.selectedIndex;
|
|
334
|
-
if (ind < 0) {
|
|
335
|
-
ind = oMenu.length - 1;
|
|
336
|
-
}
|
|
337
|
-
if (act == 1) {
|
|
338
|
-
DomUtils.setValue('#menutitle', 'New Item');
|
|
339
|
-
DomUtils.setValue('#menulink', '');
|
|
340
|
-
}
|
|
341
|
-
if (DomUtils.getValue('#menutitle').trim() == '') {
|
|
342
|
-
alert('Please input menu text.');
|
|
343
|
-
return;
|
|
344
|
-
}
|
|
345
|
-
var acc = DomUtils.getValue('#menuaccess');
|
|
346
|
-
var nav = DomUtils.getValue('#menutarget');
|
|
347
|
-
if (!nav || nav == '' || !acc || acc == '') {
|
|
348
|
-
alert('Please select Target and Access Level.');
|
|
349
|
-
return;
|
|
350
|
-
}
|
|
351
|
-
oMenu.options[oMenu.length] = new Option('', '');
|
|
352
|
-
for (var i = oMenu.length - 1; ind >= 0 && i > ind; i--) {
|
|
353
|
-
oMenu.options[i].text = oMenu.options[i - 1].text;
|
|
354
|
-
oMenu.options[i].value = oMenu.options[i - 1].value;
|
|
355
|
-
}
|
|
356
|
-
doReplace(ind + 1);
|
|
357
|
-
oMenu.options[ind + 1].selected = true;
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
function doDel() {
|
|
361
|
-
var ind = getSel(true);
|
|
362
|
-
if (ind < 0) return;
|
|
363
|
-
if (!confirm('Delete the selected item and all the subs?')) return;
|
|
364
|
-
var lev = getLevel(ind);
|
|
365
|
-
var ind0 = -1;
|
|
366
|
-
for (var i = ind; i < oMenu.length; i++) {
|
|
367
|
-
var levx = getLevel(i);
|
|
368
|
-
if (levx <= lev && i != ind) {
|
|
369
|
-
break;
|
|
370
|
-
}
|
|
371
|
-
ind0 = i;
|
|
372
|
-
}
|
|
373
|
-
for (var i = ind0; i >= ind; i--) {
|
|
374
|
-
oMenu.options[i].remove();
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
if (ind >= oMenu.length) ind = oMenu.length - 1;
|
|
378
|
-
if (ind >= 0) oMenu.options[ind].selected = true;
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
function doMoveUp(ind: number) {
|
|
382
|
-
if (ind < 1) return -1;
|
|
383
|
-
var ind0 = -1;
|
|
384
|
-
var lev = getLevel(ind);
|
|
385
|
-
for (var i = ind - 1; i >= 0; i--) {
|
|
386
|
-
var levx = getLevel(i);
|
|
387
|
-
if (levx < lev) {
|
|
388
|
-
break;
|
|
389
|
-
}
|
|
390
|
-
if (levx == lev) {
|
|
391
|
-
ind0 = i;
|
|
392
|
-
break;
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
if (ind0 < 0) return -1;
|
|
396
|
-
oMenu.options[ind0].selected = true;
|
|
397
|
-
var inds = ind0;
|
|
398
|
-
|
|
399
|
-
for (var i = ind; i < oMenu.length; i++) {
|
|
400
|
-
var levx = getLevel(i);
|
|
401
|
-
if (levx <= lev && i != ind) break;
|
|
402
|
-
|
|
403
|
-
for (var j = i; j > ind0; j--) {
|
|
404
|
-
var text = oMenu.options[j].text;
|
|
405
|
-
var value = oMenu.options[j].value;
|
|
406
|
-
oMenu.options[j].text = oMenu.options[j - 1].text;
|
|
407
|
-
oMenu.options[j].value = oMenu.options[j - 1].value;
|
|
408
|
-
oMenu.options[j - 1].text = text;
|
|
409
|
-
oMenu.options[j - 1].value = value;
|
|
410
|
-
}
|
|
411
|
-
ind0++;
|
|
412
|
-
}
|
|
413
|
-
return ind0 - inds;
|
|
414
|
-
}
|
|
415
|
-
function doUp() {
|
|
416
|
-
var ind = getSel(true);
|
|
417
|
-
doMoveUp(ind);
|
|
418
|
-
}
|
|
419
|
-
function doDown() {
|
|
420
|
-
var ind = getSel(true);
|
|
421
|
-
if (ind < 0) return;
|
|
422
|
-
|
|
423
|
-
if (ind >= oMenu.length - 1) return;
|
|
424
|
-
var ind0 = -1;
|
|
425
|
-
var lev = getLevel(ind);
|
|
426
|
-
for (var i = ind + 1; i < oMenu.length; i++) {
|
|
427
|
-
var levx = getLevel(i);
|
|
428
|
-
if (levx < lev) {
|
|
429
|
-
break;
|
|
430
|
-
}
|
|
431
|
-
if (levx == lev) {
|
|
432
|
-
ind0 = i;
|
|
433
|
-
break;
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
if (ind0 < 0) return;
|
|
437
|
-
var ind2 = doMoveUp(ind0);
|
|
438
|
-
oMenu.options[ind + ind2].selected = true;
|
|
439
|
-
}
|
|
440
|
-
function doLeft() {
|
|
441
|
-
var ind = getSel(true);
|
|
442
|
-
if (ind < 0) return;
|
|
443
|
-
|
|
444
|
-
var lev = getLevel(ind);
|
|
445
|
-
if (lev <= 0) return;
|
|
446
|
-
for (var i = ind; i < oMenu.length; i++) {
|
|
447
|
-
var t = oMenu.options[i].value.split('\t');
|
|
448
|
-
let newlev = Number.parseInt(t[0]);
|
|
449
|
-
if (newlev <= lev && i != ind) break;
|
|
450
|
-
|
|
451
|
-
newlev--;
|
|
452
|
-
t[0] = '' + newlev;
|
|
453
|
-
var pre = new Array(newlev * 4 + 1).join('-');
|
|
454
|
-
oMenu.options[i].value = t.join(' ');
|
|
455
|
-
oMenu.options[i].text = pre + t[4];
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
function doRight() {
|
|
459
|
-
var ind = getSel(true);
|
|
460
|
-
if (ind < 1) return;
|
|
461
|
-
|
|
462
|
-
var lev0 = getLevel(ind - 1);
|
|
463
|
-
var lev = getLevel(ind);
|
|
464
|
-
if (lev0 < lev) return;
|
|
465
|
-
for (var i = ind; i < oMenu.length; i++) {
|
|
466
|
-
var t = oMenu.options[i].value.split('\t');
|
|
467
|
-
let newlev = Number.parseInt(t[0]);
|
|
468
|
-
if (newlev <= lev && i != ind) break;
|
|
469
|
-
|
|
470
|
-
newlev++;
|
|
471
|
-
t[0] = '' + newlev;
|
|
472
|
-
var pre = new Array(newlev * 4 + 1).join('-');
|
|
473
|
-
oMenu.options[i].value = t.join(' ');
|
|
474
|
-
oMenu.options[i].text = pre + t[4];
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
const css: CssProps = {
|
|
479
|
-
height: '100%',
|
|
480
|
-
display: 'flex',
|
|
481
|
-
flexDirection: 'column',
|
|
482
|
-
border: 'var(--primary-border)',
|
|
483
|
-
'.edit-page-header': {
|
|
484
|
-
height: '30px',
|
|
485
|
-
},
|
|
486
|
-
'.edit-page-body': {
|
|
487
|
-
borderTop: 'var(--primary-border)',
|
|
488
|
-
flex: '1',
|
|
489
|
-
display: 'flex',
|
|
490
|
-
flexDirection: 'row',
|
|
491
|
-
},
|
|
492
|
-
'.edit-page-menu': {
|
|
493
|
-
display: 'flex',
|
|
494
|
-
width: '200px',
|
|
495
|
-
flexDirection: 'column',
|
|
496
|
-
borderRight: 'var(--primary-border)',
|
|
497
|
-
},
|
|
498
|
-
'.edit-page-if': {
|
|
499
|
-
flex: '1',
|
|
500
|
-
overflowX: 'auto',
|
|
501
|
-
overflowY: 'auto',
|
|
502
|
-
},
|
|
503
|
-
'.edit-page-if .iframe': {
|
|
504
|
-
display: 'flex', // resolve the scrollbar issue
|
|
505
|
-
width: '100%',
|
|
506
|
-
height: '100%',
|
|
507
|
-
// border: 'solid 1px red',
|
|
508
|
-
},
|
|
509
|
-
};
|
|
510
|
-
|
|
511
|
-
const list = ['aaa', 'bbb'];
|
|
512
|
-
const handleSelected = (themeName: string) => {
|
|
513
|
-
const iframe = ref.current.querySelector('.iframe') as HTMLIFrameElement;
|
|
514
|
-
iframe.contentDocument!.body.innerHTML = 'abc' + themeName;
|
|
515
|
-
};
|
|
516
|
-
|
|
517
|
-
const addBlock = () => {
|
|
518
|
-
const iframe = ref.current.querySelector('.iframe') as HTMLIFrameElement;
|
|
519
|
-
// communication with inside iframe
|
|
520
|
-
const msgSender = (iframe as any).contentWindow._lj_design;
|
|
521
|
-
msgSender.toParent = (cmd: string, data: any) => {
|
|
522
|
-
if (cmd === 'xxx') {
|
|
523
|
-
console.log('addBlock', data);
|
|
524
|
-
}
|
|
525
|
-
};
|
|
526
|
-
|
|
527
|
-
msgSender.toIframe('add-block', 'ss');
|
|
528
|
-
};
|
|
529
|
-
|
|
530
|
-
const iframeLoad = () => {
|
|
531
|
-
const iframe = ref.current.querySelector('.iframe') as HTMLIFrameElement;
|
|
532
|
-
const msgSender = (iframe as any).contentWindow._lj_design;
|
|
533
|
-
if (msgSender) {
|
|
534
|
-
msgSender.toParent = (cmd: string, data: any) => {
|
|
535
|
-
console.log('top window', cmd, data);
|
|
536
|
-
if (cmd === 'xxx') {
|
|
537
|
-
}
|
|
538
|
-
};
|
|
539
|
-
}
|
|
540
|
-
};
|
|
541
|
-
|
|
542
|
-
return (
|
|
543
|
-
<div css={css} ref={ref}>
|
|
544
|
-
<div class='edit-page-header row-box pt-s pl-s'>
|
|
545
|
-
<div>Edit Menu: {menuId}</div>
|
|
546
|
-
<PopupMenu list={list} defaultValue={'aaa'} handleSelected={handleSelected}></PopupMenu>
|
|
547
|
-
</div>
|
|
548
|
-
<div class='edit-page-body pt-s pl-s'>
|
|
549
|
-
<div class='edit-page-menu pt-s pl-s'>
|
|
550
|
-
<div onClick={addBlock}>
|
|
551
|
-
<DesignBlockBox id='5' isNewBlock={true}>
|
|
552
|
-
<BlockParagraph>design block three</BlockParagraph>
|
|
553
|
-
</DesignBlockBox>
|
|
554
|
-
</div>
|
|
555
|
-
<div onClick={addBlock}>Add Block</div>
|
|
556
|
-
<div onClick={addBlock}>Add Block</div>
|
|
557
|
-
</div>
|
|
558
|
-
<div class='edit-page-if pt-s pl-s'>
|
|
559
|
-
<iframe onLoad={iframeLoad} class='iframe' frameBorder='0' src='/admin_dev/design'></iframe>
|
|
560
|
-
</div>
|
|
561
|
-
</div>
|
|
562
|
-
</div>
|
|
563
|
-
);
|
|
564
|
-
};
|
|
1
|
+
import {
|
|
2
|
+
CssProps,
|
|
3
|
+
getRenderPageProps,
|
|
4
|
+
isFrontEnd,
|
|
5
|
+
RefProps,
|
|
6
|
+
DomUtils,
|
|
7
|
+
ModalWindow,
|
|
8
|
+
NotificationMessage,
|
|
9
|
+
PopupMenu,
|
|
10
|
+
} from 'lupine.components';
|
|
11
|
+
import { DesignBlockBox } from './design/design-block-box';
|
|
12
|
+
import { BlockParagraph } from './design/block-paragraph';
|
|
13
|
+
|
|
14
|
+
const fetchTableList = async () => {
|
|
15
|
+
const data = await getRenderPageProps().renderPageFunctions.fetchData('/api/admin/db/tables');
|
|
16
|
+
return data.json;
|
|
17
|
+
};
|
|
18
|
+
const fetchTableDrop = async (tableName: string) => {
|
|
19
|
+
const data = await getRenderPageProps().renderPageFunctions.fetchData('/api/admin/db/table-drop', {
|
|
20
|
+
table: tableName,
|
|
21
|
+
});
|
|
22
|
+
return data.json;
|
|
23
|
+
};
|
|
24
|
+
const fetchTableTruncate = async (tableName: string) => {
|
|
25
|
+
const data = await getRenderPageProps().renderPageFunctions.fetchData('/api/admin/db/table-truncate', {
|
|
26
|
+
table: tableName,
|
|
27
|
+
});
|
|
28
|
+
return data.json;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export const SaveMenu = (props: {
|
|
32
|
+
menuIdReadonly?: boolean;
|
|
33
|
+
menuId: string;
|
|
34
|
+
title: string;
|
|
35
|
+
note: string;
|
|
36
|
+
package: string;
|
|
37
|
+
}) => {
|
|
38
|
+
return (
|
|
39
|
+
<div className='save-menu'>
|
|
40
|
+
<div class='row-box mb-s'>
|
|
41
|
+
<div class='w-7'>Menu Id:</div>
|
|
42
|
+
<input type='text' id='s_menuId' value={props.menuId} class='input-base w-20' readonly={props.menuIdReadonly} />
|
|
43
|
+
</div>
|
|
44
|
+
<div class='row-box mb-s'>
|
|
45
|
+
<div class='w-7'>Menu Title:</div>
|
|
46
|
+
<input type='text' id='s_menuTitle' value={props.title} class='input-base w-20' />
|
|
47
|
+
</div>
|
|
48
|
+
<div class='row-box mb-s'>
|
|
49
|
+
<div class='w-7'>Menu Description:</div>
|
|
50
|
+
<input type='text' id='s_menuNote' value={props.note} class='input-base w-20' />
|
|
51
|
+
</div>
|
|
52
|
+
<div class='row-box mb-s'>
|
|
53
|
+
<div class='w-7'>Package id:</div>
|
|
54
|
+
<input type='text' id='s_menuPackage' value={props.package} class='input-base w-20' />
|
|
55
|
+
</div>
|
|
56
|
+
</div>
|
|
57
|
+
);
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
export const AdminPageEditPage = (menuId: string) => {
|
|
61
|
+
if (!isFrontEnd()) {
|
|
62
|
+
return <div>No SSR.</div>;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
let savedMenuId = '';
|
|
66
|
+
let savedMenuTitle = '';
|
|
67
|
+
let savedMenuNote = '';
|
|
68
|
+
let savedPackage = '';
|
|
69
|
+
const onDelete = async (tableName: string) => {
|
|
70
|
+
if (!confirm(`Are you really Deleting ${tableName}?`)) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const json = await fetchTableDrop(tableName);
|
|
74
|
+
console.log('====fetchTableDelete', json);
|
|
75
|
+
NotificationMessage.sendMessage('Deleted: ' + tableName);
|
|
76
|
+
onClick();
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
// const onDownload = async (tableName: string) => {
|
|
80
|
+
// downloadLink('/api/admin/db/table-download?table=' + tableName);
|
|
81
|
+
// };
|
|
82
|
+
|
|
83
|
+
const onClick = async () => {
|
|
84
|
+
const json = await fetchTableList();
|
|
85
|
+
console.log('====fetchTableList', json);
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
const doLoad = (results: any) => {
|
|
89
|
+
oMenu.length = 0;
|
|
90
|
+
savedMenuId = results.menuid;
|
|
91
|
+
savedMenuTitle = results.title;
|
|
92
|
+
savedMenuNote = results.note;
|
|
93
|
+
savedPackage = results.package;
|
|
94
|
+
for (const i in results.items) {
|
|
95
|
+
const item = results.items[i];
|
|
96
|
+
const lev = Number.parseInt(item[0]);
|
|
97
|
+
var pre = new Array(lev * 4 + 1).join('-');
|
|
98
|
+
oMenu.options[oMenu.length] = new Option(pre + item[4], item.join('\t'));
|
|
99
|
+
}
|
|
100
|
+
oMenu.selectedIndex = 0;
|
|
101
|
+
doListChg();
|
|
102
|
+
};
|
|
103
|
+
const onSave = () => {
|
|
104
|
+
doSave(false);
|
|
105
|
+
};
|
|
106
|
+
const onSaveAs = () => {
|
|
107
|
+
doSave(true);
|
|
108
|
+
};
|
|
109
|
+
const doSave = async (isSaveAs = false) => {
|
|
110
|
+
const handleClicked = async (index: number) => {
|
|
111
|
+
if (index === 0) {
|
|
112
|
+
// Save
|
|
113
|
+
const id = DomUtils.getValue('#s_menuId');
|
|
114
|
+
const title = DomUtils.getValue('#s_menuTitle');
|
|
115
|
+
const note = DomUtils.getValue('#s_menuNote');
|
|
116
|
+
const pkg = DomUtils.getValue('#s_menuPackage');
|
|
117
|
+
let regex = /^[a-zA-Z0-9]+$/;
|
|
118
|
+
if (!id || !regex.test(id)) {
|
|
119
|
+
alert('menuId is not valid!');
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const menuIdReadonly = !isSaveAs && !!savedMenuId;
|
|
123
|
+
const items = getAllItems();
|
|
124
|
+
const post: any = {
|
|
125
|
+
id,
|
|
126
|
+
title,
|
|
127
|
+
note,
|
|
128
|
+
items,
|
|
129
|
+
idReadonly: menuIdReadonly,
|
|
130
|
+
package: pkg,
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
const updateIds = () => {
|
|
134
|
+
savedMenuId = id;
|
|
135
|
+
savedMenuTitle = title;
|
|
136
|
+
savedMenuNote = note;
|
|
137
|
+
savedPackage = pkg;
|
|
138
|
+
ref.$('.admin-sub-title').innerHTML = `Edit Menu: ${savedMenuId}`;
|
|
139
|
+
};
|
|
140
|
+
const data = await getRenderPageProps().renderPageFunctions.fetchData('/api/admin/menus/save', post);
|
|
141
|
+
if (data.json && data.json.status !== 'ok') {
|
|
142
|
+
if (!post.idReadonly && data.json.status === 'ID_EXISTS') {
|
|
143
|
+
if (!confirm(`${data.json.message}\r\n\r\nDo you want to override the same menu id?`)) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
post.idReadonly = true;
|
|
147
|
+
const data2 = await getRenderPageProps().renderPageFunctions.fetchData('/api/admin/menus/save', post);
|
|
148
|
+
if (data2.json && data2.json.status !== 'ok') {
|
|
149
|
+
alert(`Error happened: ${data2.json.message}`);
|
|
150
|
+
} else {
|
|
151
|
+
updateIds();
|
|
152
|
+
NotificationMessage.sendMessage('Menu is saved.');
|
|
153
|
+
}
|
|
154
|
+
} else {
|
|
155
|
+
alert(`Error happened: ${data.json.message}`);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
} else {
|
|
159
|
+
updateIds();
|
|
160
|
+
NotificationMessage.sendMessage('Menu is saved.');
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
modalClose();
|
|
165
|
+
};
|
|
166
|
+
const modalClose = await ModalWindow.show({
|
|
167
|
+
title: 'Save Menu',
|
|
168
|
+
buttons: ['Save', 'Cancel'],
|
|
169
|
+
// contentMaxHeight: '400px',
|
|
170
|
+
handleClicked,
|
|
171
|
+
children: (
|
|
172
|
+
<SaveMenu
|
|
173
|
+
menuIdReadonly={!!savedMenuId && !isSaveAs}
|
|
174
|
+
menuId={savedMenuId}
|
|
175
|
+
title={savedMenuTitle}
|
|
176
|
+
note={savedMenuNote}
|
|
177
|
+
package={savedPackage}
|
|
178
|
+
></SaveMenu>
|
|
179
|
+
),
|
|
180
|
+
});
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
let oMenu!: HTMLSelectElement;
|
|
184
|
+
const ref: RefProps = {
|
|
185
|
+
onLoad: async () => {
|
|
186
|
+
// oMenu = document.querySelector('#menulist')!;
|
|
187
|
+
// if (menuId) {
|
|
188
|
+
// const response = await getRenderPageProps().renderPageFunctions.fetchData(`/api/admin/pages/get/${menuId}`);
|
|
189
|
+
// doLoad(response.json.result);
|
|
190
|
+
// }
|
|
191
|
+
},
|
|
192
|
+
};
|
|
193
|
+
function getSel(ismsg = true) {
|
|
194
|
+
if (oMenu.selectedIndex < 0 && ismsg) {
|
|
195
|
+
if (oMenu.length == 0) {
|
|
196
|
+
NotificationMessage.sendMessage('No item in menu item list.');
|
|
197
|
+
} else {
|
|
198
|
+
NotificationMessage.sendMessage('Please select one item.');
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return oMenu.selectedIndex;
|
|
202
|
+
}
|
|
203
|
+
function getLevel(ind: number) {
|
|
204
|
+
var t = oMenu.options[ind].value.split('\t');
|
|
205
|
+
return Number.parseInt(t[0]);
|
|
206
|
+
}
|
|
207
|
+
function getNav(ind: number) {
|
|
208
|
+
var t = oMenu.options[ind].value.split('\t');
|
|
209
|
+
return t[1];
|
|
210
|
+
}
|
|
211
|
+
function getAcc(ind: number) {
|
|
212
|
+
var t = oMenu.options[ind].value.split('\t');
|
|
213
|
+
return t[2];
|
|
214
|
+
}
|
|
215
|
+
function getLnk(ind: number) {
|
|
216
|
+
var t = oMenu.options[ind].value.split('\t');
|
|
217
|
+
return t[3];
|
|
218
|
+
}
|
|
219
|
+
function getTxt(ind: number) {
|
|
220
|
+
var t = oMenu.options[ind].value.split('\t');
|
|
221
|
+
return t[4];
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function getAllItems() {
|
|
225
|
+
const ret = [];
|
|
226
|
+
for (var i = 0; i < oMenu.length; i++) {
|
|
227
|
+
// ret.push(oMenu.options[i].value);
|
|
228
|
+
ret.push([getLevel(i), getNav(i), getAcc(i), getLnk(i), getTxt(i)]);
|
|
229
|
+
}
|
|
230
|
+
return ret;
|
|
231
|
+
}
|
|
232
|
+
async function doDelete() {
|
|
233
|
+
if (!savedMenuId) {
|
|
234
|
+
alert('Current menu is not on DB yet.');
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
if (!confirm('Do you delete this menu from the system?')) return;
|
|
238
|
+
await getRenderPageProps().renderPageFunctions.fetchData(`/api/admin/menus/delete/${savedMenuId}`);
|
|
239
|
+
doNew();
|
|
240
|
+
NotificationMessage.sendMessage('Menu is deleted.');
|
|
241
|
+
}
|
|
242
|
+
function doNew() {
|
|
243
|
+
savedMenuId = '';
|
|
244
|
+
for (var i = oMenu.length - 1; i >= 0; i--) {
|
|
245
|
+
oMenu.options[i].remove();
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
function byId(id: string) {
|
|
249
|
+
return document.getElementById(id)! as HTMLElement;
|
|
250
|
+
}
|
|
251
|
+
function doListChg() {
|
|
252
|
+
var ind = getSel(false);
|
|
253
|
+
var tt = getTxt(ind);
|
|
254
|
+
|
|
255
|
+
var ty = '0';
|
|
256
|
+
DomUtils.setValue('#menuimageout', '');
|
|
257
|
+
DomUtils.setValue('#menuimageon', '');
|
|
258
|
+
DomUtils.setValue('#menupanel', '');
|
|
259
|
+
if (tt.substring(0, 4) == '[::]') {
|
|
260
|
+
var t = tt.split('[::]');
|
|
261
|
+
if (t.length == 6) {
|
|
262
|
+
DomUtils.setValue('#menuimg1', t[3]);
|
|
263
|
+
DomUtils.setValue('#menuimg2', t[4]);
|
|
264
|
+
ty = t[1];
|
|
265
|
+
tt = t[2];
|
|
266
|
+
DomUtils.setValue('#menupanel', t[5]);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
var lev = getLevel(ind);
|
|
271
|
+
if (lev > 0) {
|
|
272
|
+
byId('img_p0').style.display = 'none';
|
|
273
|
+
byId('img_p1').style.display = 'none';
|
|
274
|
+
byId('img_p2').style.display = 'none';
|
|
275
|
+
byId('img_panel').style.display = 'none';
|
|
276
|
+
} else {
|
|
277
|
+
byId('img_p0').style.display = '';
|
|
278
|
+
byId('img_p1').style.display = '';
|
|
279
|
+
byId('img_p2').style.display = '';
|
|
280
|
+
byId('img_panel').style.display = '';
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
DomUtils.setChecked('#itemtype1', ty == '' || ty == '0');
|
|
284
|
+
DomUtils.setChecked('#itemtype2', ty == '1');
|
|
285
|
+
DomUtils.setValue('#menutitle', tt);
|
|
286
|
+
DomUtils.setValue('#menulink', getLnk(ind));
|
|
287
|
+
DomUtils.setValue('#menutarget', getNav(ind));
|
|
288
|
+
DomUtils.setValue('#menuaccess', getAcc(ind));
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
function doReplace(ind2?: number) {
|
|
292
|
+
var ind = typeof ind2 === 'number' && ind2 >= 0 ? ind2 : getSel(true);
|
|
293
|
+
if (ind < 0) return;
|
|
294
|
+
var menutxt = DomUtils.getValue('#menutitle').trim();
|
|
295
|
+
if (menutxt == '') {
|
|
296
|
+
alert('Please input menu text.');
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
if (menutxt.indexOf('[::]') >= 0) {
|
|
300
|
+
alert('Cannot include "[::]" in menu text.');
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
var lev = getLevel(ind);
|
|
305
|
+
var acc = DomUtils.getValue('#menuaccess');
|
|
306
|
+
var nav = DomUtils.getValue('#menutarget');
|
|
307
|
+
if (!nav || nav == '' || !acc || acc == '') {
|
|
308
|
+
alert('Please select browsernav and access.');
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
var itemty = '0';
|
|
313
|
+
if (DomUtils.getChecked('#itemtype2')) {
|
|
314
|
+
itemty = '1';
|
|
315
|
+
}
|
|
316
|
+
var img1 = DomUtils.getValue('#menuimageout').trim();
|
|
317
|
+
var img2 = DomUtils.getValue('#menuimageon').trim();
|
|
318
|
+
var panel = DomUtils.getValue('#menupanel').trim();
|
|
319
|
+
if (itemty == '1' && img1 == '') {
|
|
320
|
+
alert('For selected Image, need input image path.');
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
if (img1 != '' || panel != '') {
|
|
325
|
+
menutxt = '[::]' + itemty + '[::]' + menutxt + '[::]' + img1 + '[::]' + img2 + '[::]' + panel;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
var pre = new Array(lev * 4 + 1).join('-');
|
|
329
|
+
oMenu.options[ind].value = lev + ' ' + nav + ' ' + acc + ' XX ' + DomUtils.getValue('#menulink').trim() + ' ' + menutxt;
|
|
330
|
+
oMenu.options[ind].text = pre + DomUtils.getValue('#menutitle').trim();
|
|
331
|
+
}
|
|
332
|
+
function doAppend(act: number) {
|
|
333
|
+
var ind = oMenu.selectedIndex;
|
|
334
|
+
if (ind < 0) {
|
|
335
|
+
ind = oMenu.length - 1;
|
|
336
|
+
}
|
|
337
|
+
if (act == 1) {
|
|
338
|
+
DomUtils.setValue('#menutitle', 'New Item');
|
|
339
|
+
DomUtils.setValue('#menulink', '');
|
|
340
|
+
}
|
|
341
|
+
if (DomUtils.getValue('#menutitle').trim() == '') {
|
|
342
|
+
alert('Please input menu text.');
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
var acc = DomUtils.getValue('#menuaccess');
|
|
346
|
+
var nav = DomUtils.getValue('#menutarget');
|
|
347
|
+
if (!nav || nav == '' || !acc || acc == '') {
|
|
348
|
+
alert('Please select Target and Access Level.');
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
oMenu.options[oMenu.length] = new Option('', '');
|
|
352
|
+
for (var i = oMenu.length - 1; ind >= 0 && i > ind; i--) {
|
|
353
|
+
oMenu.options[i].text = oMenu.options[i - 1].text;
|
|
354
|
+
oMenu.options[i].value = oMenu.options[i - 1].value;
|
|
355
|
+
}
|
|
356
|
+
doReplace(ind + 1);
|
|
357
|
+
oMenu.options[ind + 1].selected = true;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
function doDel() {
|
|
361
|
+
var ind = getSel(true);
|
|
362
|
+
if (ind < 0) return;
|
|
363
|
+
if (!confirm('Delete the selected item and all the subs?')) return;
|
|
364
|
+
var lev = getLevel(ind);
|
|
365
|
+
var ind0 = -1;
|
|
366
|
+
for (var i = ind; i < oMenu.length; i++) {
|
|
367
|
+
var levx = getLevel(i);
|
|
368
|
+
if (levx <= lev && i != ind) {
|
|
369
|
+
break;
|
|
370
|
+
}
|
|
371
|
+
ind0 = i;
|
|
372
|
+
}
|
|
373
|
+
for (var i = ind0; i >= ind; i--) {
|
|
374
|
+
oMenu.options[i].remove();
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
if (ind >= oMenu.length) ind = oMenu.length - 1;
|
|
378
|
+
if (ind >= 0) oMenu.options[ind].selected = true;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
function doMoveUp(ind: number) {
|
|
382
|
+
if (ind < 1) return -1;
|
|
383
|
+
var ind0 = -1;
|
|
384
|
+
var lev = getLevel(ind);
|
|
385
|
+
for (var i = ind - 1; i >= 0; i--) {
|
|
386
|
+
var levx = getLevel(i);
|
|
387
|
+
if (levx < lev) {
|
|
388
|
+
break;
|
|
389
|
+
}
|
|
390
|
+
if (levx == lev) {
|
|
391
|
+
ind0 = i;
|
|
392
|
+
break;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
if (ind0 < 0) return -1;
|
|
396
|
+
oMenu.options[ind0].selected = true;
|
|
397
|
+
var inds = ind0;
|
|
398
|
+
|
|
399
|
+
for (var i = ind; i < oMenu.length; i++) {
|
|
400
|
+
var levx = getLevel(i);
|
|
401
|
+
if (levx <= lev && i != ind) break;
|
|
402
|
+
|
|
403
|
+
for (var j = i; j > ind0; j--) {
|
|
404
|
+
var text = oMenu.options[j].text;
|
|
405
|
+
var value = oMenu.options[j].value;
|
|
406
|
+
oMenu.options[j].text = oMenu.options[j - 1].text;
|
|
407
|
+
oMenu.options[j].value = oMenu.options[j - 1].value;
|
|
408
|
+
oMenu.options[j - 1].text = text;
|
|
409
|
+
oMenu.options[j - 1].value = value;
|
|
410
|
+
}
|
|
411
|
+
ind0++;
|
|
412
|
+
}
|
|
413
|
+
return ind0 - inds;
|
|
414
|
+
}
|
|
415
|
+
function doUp() {
|
|
416
|
+
var ind = getSel(true);
|
|
417
|
+
doMoveUp(ind);
|
|
418
|
+
}
|
|
419
|
+
function doDown() {
|
|
420
|
+
var ind = getSel(true);
|
|
421
|
+
if (ind < 0) return;
|
|
422
|
+
|
|
423
|
+
if (ind >= oMenu.length - 1) return;
|
|
424
|
+
var ind0 = -1;
|
|
425
|
+
var lev = getLevel(ind);
|
|
426
|
+
for (var i = ind + 1; i < oMenu.length; i++) {
|
|
427
|
+
var levx = getLevel(i);
|
|
428
|
+
if (levx < lev) {
|
|
429
|
+
break;
|
|
430
|
+
}
|
|
431
|
+
if (levx == lev) {
|
|
432
|
+
ind0 = i;
|
|
433
|
+
break;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
if (ind0 < 0) return;
|
|
437
|
+
var ind2 = doMoveUp(ind0);
|
|
438
|
+
oMenu.options[ind + ind2].selected = true;
|
|
439
|
+
}
|
|
440
|
+
function doLeft() {
|
|
441
|
+
var ind = getSel(true);
|
|
442
|
+
if (ind < 0) return;
|
|
443
|
+
|
|
444
|
+
var lev = getLevel(ind);
|
|
445
|
+
if (lev <= 0) return;
|
|
446
|
+
for (var i = ind; i < oMenu.length; i++) {
|
|
447
|
+
var t = oMenu.options[i].value.split('\t');
|
|
448
|
+
let newlev = Number.parseInt(t[0]);
|
|
449
|
+
if (newlev <= lev && i != ind) break;
|
|
450
|
+
|
|
451
|
+
newlev--;
|
|
452
|
+
t[0] = '' + newlev;
|
|
453
|
+
var pre = new Array(newlev * 4 + 1).join('-');
|
|
454
|
+
oMenu.options[i].value = t.join(' ');
|
|
455
|
+
oMenu.options[i].text = pre + t[4];
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
function doRight() {
|
|
459
|
+
var ind = getSel(true);
|
|
460
|
+
if (ind < 1) return;
|
|
461
|
+
|
|
462
|
+
var lev0 = getLevel(ind - 1);
|
|
463
|
+
var lev = getLevel(ind);
|
|
464
|
+
if (lev0 < lev) return;
|
|
465
|
+
for (var i = ind; i < oMenu.length; i++) {
|
|
466
|
+
var t = oMenu.options[i].value.split('\t');
|
|
467
|
+
let newlev = Number.parseInt(t[0]);
|
|
468
|
+
if (newlev <= lev && i != ind) break;
|
|
469
|
+
|
|
470
|
+
newlev++;
|
|
471
|
+
t[0] = '' + newlev;
|
|
472
|
+
var pre = new Array(newlev * 4 + 1).join('-');
|
|
473
|
+
oMenu.options[i].value = t.join(' ');
|
|
474
|
+
oMenu.options[i].text = pre + t[4];
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
const css: CssProps = {
|
|
479
|
+
height: '100%',
|
|
480
|
+
display: 'flex',
|
|
481
|
+
flexDirection: 'column',
|
|
482
|
+
border: 'var(--primary-border)',
|
|
483
|
+
'.edit-page-header': {
|
|
484
|
+
height: '30px',
|
|
485
|
+
},
|
|
486
|
+
'.edit-page-body': {
|
|
487
|
+
borderTop: 'var(--primary-border)',
|
|
488
|
+
flex: '1',
|
|
489
|
+
display: 'flex',
|
|
490
|
+
flexDirection: 'row',
|
|
491
|
+
},
|
|
492
|
+
'.edit-page-menu': {
|
|
493
|
+
display: 'flex',
|
|
494
|
+
width: '200px',
|
|
495
|
+
flexDirection: 'column',
|
|
496
|
+
borderRight: 'var(--primary-border)',
|
|
497
|
+
},
|
|
498
|
+
'.edit-page-if': {
|
|
499
|
+
flex: '1',
|
|
500
|
+
overflowX: 'auto',
|
|
501
|
+
overflowY: 'auto',
|
|
502
|
+
},
|
|
503
|
+
'.edit-page-if .iframe': {
|
|
504
|
+
display: 'flex', // resolve the scrollbar issue
|
|
505
|
+
width: '100%',
|
|
506
|
+
height: '100%',
|
|
507
|
+
// border: 'solid 1px red',
|
|
508
|
+
},
|
|
509
|
+
};
|
|
510
|
+
|
|
511
|
+
const list = ['aaa', 'bbb'];
|
|
512
|
+
const handleSelected = (themeName: string) => {
|
|
513
|
+
const iframe = ref.current.querySelector('.iframe') as HTMLIFrameElement;
|
|
514
|
+
iframe.contentDocument!.body.innerHTML = 'abc' + themeName;
|
|
515
|
+
};
|
|
516
|
+
|
|
517
|
+
const addBlock = () => {
|
|
518
|
+
const iframe = ref.current.querySelector('.iframe') as HTMLIFrameElement;
|
|
519
|
+
// communication with inside iframe
|
|
520
|
+
const msgSender = (iframe as any).contentWindow._lj_design;
|
|
521
|
+
msgSender.toParent = (cmd: string, data: any) => {
|
|
522
|
+
if (cmd === 'xxx') {
|
|
523
|
+
console.log('addBlock', data);
|
|
524
|
+
}
|
|
525
|
+
};
|
|
526
|
+
|
|
527
|
+
msgSender.toIframe('add-block', 'ss');
|
|
528
|
+
};
|
|
529
|
+
|
|
530
|
+
const iframeLoad = () => {
|
|
531
|
+
const iframe = ref.current.querySelector('.iframe') as HTMLIFrameElement;
|
|
532
|
+
const msgSender = (iframe as any).contentWindow._lj_design;
|
|
533
|
+
if (msgSender) {
|
|
534
|
+
msgSender.toParent = (cmd: string, data: any) => {
|
|
535
|
+
console.log('top window', cmd, data);
|
|
536
|
+
if (cmd === 'xxx') {
|
|
537
|
+
}
|
|
538
|
+
};
|
|
539
|
+
}
|
|
540
|
+
};
|
|
541
|
+
|
|
542
|
+
return (
|
|
543
|
+
<div css={css} ref={ref}>
|
|
544
|
+
<div class='edit-page-header row-box pt-s pl-s'>
|
|
545
|
+
<div>Edit Menu: {menuId}</div>
|
|
546
|
+
<PopupMenu list={list} defaultValue={'aaa'} handleSelected={handleSelected}></PopupMenu>
|
|
547
|
+
</div>
|
|
548
|
+
<div class='edit-page-body pt-s pl-s'>
|
|
549
|
+
<div class='edit-page-menu pt-s pl-s'>
|
|
550
|
+
<div onClick={addBlock}>
|
|
551
|
+
<DesignBlockBox id='5' isNewBlock={true}>
|
|
552
|
+
<BlockParagraph>design block three</BlockParagraph>
|
|
553
|
+
</DesignBlockBox>
|
|
554
|
+
</div>
|
|
555
|
+
<div onClick={addBlock}>Add Block</div>
|
|
556
|
+
<div onClick={addBlock}>Add Block</div>
|
|
557
|
+
</div>
|
|
558
|
+
<div class='edit-page-if pt-s pl-s'>
|
|
559
|
+
<iframe onLoad={iframeLoad} class='iframe' frameBorder='0' src='/admin_dev/design'></iframe>
|
|
560
|
+
</div>
|
|
561
|
+
</div>
|
|
562
|
+
</div>
|
|
563
|
+
);
|
|
564
|
+
};
|