@things-factory/lite-menu 5.0.0-alpha.31 → 5.0.0-alpha.32
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/client/actions/lite-menu.js +21 -4
- package/client/pages/addon-menu-setting.js +32 -8
- package/dist-server/service/lite-menu/lite-menu-mutation.js +6 -6
- package/dist-server/service/lite-menu/lite-menu-mutation.js.map +1 -1
- package/dist-server/service/lite-menu/lite-menu-query.js +4 -3
- package/dist-server/service/lite-menu/lite-menu-query.js.map +1 -1
- package/dist-server/service/lite-menu/lite-menu-type.js +8 -0
- package/dist-server/service/lite-menu/lite-menu-type.js.map +1 -1
- package/dist-server/service/lite-menu/lite-menu.js +14 -4
- package/dist-server/service/lite-menu/lite-menu.js.map +1 -1
- package/package.json +10 -10
- package/server/service/lite-menu/lite-menu-mutation.ts +8 -7
- package/server/service/lite-menu/lite-menu-query.ts +3 -2
- package/server/service/lite-menu/lite-menu-type.ts +7 -1
- package/server/service/lite-menu/lite-menu.ts +17 -8
- package/translations/en.json +2 -1
- package/translations/ko.json +2 -1
- package/translations/ms.json +2 -1
- package/translations/zh.json +3 -1
|
@@ -81,15 +81,18 @@ export function updateMenuTemplate(template) {
|
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
export async function fetchAddonMenus() {
|
|
84
|
+
var applicationName = document.querySelector('meta[name="application-name"]')?.content
|
|
85
|
+
|
|
84
86
|
var liteMenus = (
|
|
85
87
|
await client.query({
|
|
86
88
|
query: gql`
|
|
87
|
-
{
|
|
88
|
-
liteMenus {
|
|
89
|
+
query ($filters: [Filter!]) {
|
|
90
|
+
liteMenus: liteMenus(filters: $filters) {
|
|
89
91
|
items {
|
|
90
92
|
id
|
|
91
93
|
name
|
|
92
94
|
description
|
|
95
|
+
appName
|
|
93
96
|
parent
|
|
94
97
|
rank
|
|
95
98
|
active
|
|
@@ -100,12 +103,26 @@ export async function fetchAddonMenus() {
|
|
|
100
103
|
total
|
|
101
104
|
}
|
|
102
105
|
}
|
|
103
|
-
|
|
106
|
+
`,
|
|
107
|
+
variables: {
|
|
108
|
+
filters: [
|
|
109
|
+
{
|
|
110
|
+
name: 'active',
|
|
111
|
+
operator: 'eq',
|
|
112
|
+
value: true
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
name: 'appName',
|
|
116
|
+
operator: 'in',
|
|
117
|
+
value: ['', applicationName]
|
|
118
|
+
}
|
|
119
|
+
]
|
|
120
|
+
}
|
|
104
121
|
})
|
|
105
122
|
).data.liteMenus.items
|
|
106
123
|
|
|
107
124
|
store.dispatch({
|
|
108
125
|
type: UPDATE_ADDON_MENUS,
|
|
109
|
-
addon: liteMenus
|
|
126
|
+
addon: liteMenus.filter(menu => !menu.appName || menu.appName === applicationName)
|
|
110
127
|
})
|
|
111
128
|
}
|
|
@@ -16,6 +16,8 @@ import { PageView, store } from '@operato/shell'
|
|
|
16
16
|
import { CommonButtonStyles, CommonGristStyles } from '@operato/styles'
|
|
17
17
|
import { isMobileDevice } from '@operato/utils'
|
|
18
18
|
|
|
19
|
+
const applicationName = document.querySelector('meta[name="application-name"]')?.content
|
|
20
|
+
|
|
19
21
|
class AddonMenuSetting extends connect(store)(localize(i18next)(PageView)) {
|
|
20
22
|
static get properties() {
|
|
21
23
|
return {
|
|
@@ -132,10 +134,11 @@ class AddonMenuSetting extends connect(store)(localize(i18next)(PageView)) {
|
|
|
132
134
|
|
|
133
135
|
await Promise.all(
|
|
134
136
|
modifiedList.map(async record => {
|
|
135
|
-
var
|
|
137
|
+
var id = record.__origin__.id
|
|
136
138
|
var patch = {
|
|
137
139
|
name: record.name,
|
|
138
140
|
description: record.description,
|
|
141
|
+
appName: record.appName,
|
|
139
142
|
parent: record.parent,
|
|
140
143
|
rank: record.rank,
|
|
141
144
|
active: record.active,
|
|
@@ -153,15 +156,15 @@ class AddonMenuSetting extends connect(store)(localize(i18next)(PageView)) {
|
|
|
153
156
|
|
|
154
157
|
return await client.mutate({
|
|
155
158
|
mutation: gql`
|
|
156
|
-
mutation ($
|
|
157
|
-
updateLiteMenu(
|
|
159
|
+
mutation ($id: String!, $patch: LiteMenuPatch!) {
|
|
160
|
+
updateLiteMenu(id: $id, patch: $patch) {
|
|
158
161
|
id
|
|
159
162
|
name
|
|
160
163
|
}
|
|
161
164
|
}
|
|
162
165
|
`,
|
|
163
166
|
variables: {
|
|
164
|
-
|
|
167
|
+
id,
|
|
165
168
|
patch: patch
|
|
166
169
|
}
|
|
167
170
|
})
|
|
@@ -173,6 +176,7 @@ class AddonMenuSetting extends connect(store)(localize(i18next)(PageView)) {
|
|
|
173
176
|
var liteMenu = {
|
|
174
177
|
name: record.name,
|
|
175
178
|
description: record.description,
|
|
179
|
+
appName: record.appName,
|
|
176
180
|
parent: record.parent,
|
|
177
181
|
rank: record.rank,
|
|
178
182
|
active: record.active,
|
|
@@ -211,16 +215,16 @@ class AddonMenuSetting extends connect(store)(localize(i18next)(PageView)) {
|
|
|
211
215
|
|
|
212
216
|
await Promise.all(
|
|
213
217
|
deletedList.map(async record => {
|
|
214
|
-
var
|
|
218
|
+
var id = record.id
|
|
215
219
|
|
|
216
220
|
return await client.mutate({
|
|
217
221
|
mutation: gql`
|
|
218
|
-
mutation ($
|
|
219
|
-
deleteLiteMenu(
|
|
222
|
+
mutation ($id: String!) {
|
|
223
|
+
deleteLiteMenu(id: $id)
|
|
220
224
|
}
|
|
221
225
|
`,
|
|
222
226
|
variables: {
|
|
223
|
-
|
|
227
|
+
id
|
|
224
228
|
}
|
|
225
229
|
})
|
|
226
230
|
})
|
|
@@ -277,6 +281,19 @@ class AddonMenuSetting extends connect(store)(localize(i18next)(PageView)) {
|
|
|
277
281
|
filter: 'search',
|
|
278
282
|
width: 200
|
|
279
283
|
},
|
|
284
|
+
{
|
|
285
|
+
type: 'select',
|
|
286
|
+
name: 'appName',
|
|
287
|
+
header: i18next.t('field.app-name'),
|
|
288
|
+
label: true,
|
|
289
|
+
record: {
|
|
290
|
+
align: 'left',
|
|
291
|
+
editable: true,
|
|
292
|
+
options: ['', applicationName]
|
|
293
|
+
},
|
|
294
|
+
filter: true,
|
|
295
|
+
width: 200
|
|
296
|
+
},
|
|
280
297
|
{
|
|
281
298
|
type: 'select',
|
|
282
299
|
name: 'parent',
|
|
@@ -412,6 +429,12 @@ class AddonMenuSetting extends connect(store)(localize(i18next)(PageView)) {
|
|
|
412
429
|
}
|
|
413
430
|
|
|
414
431
|
async fetchHandler({ filters = [], page, limit, sortings = [] }) {
|
|
432
|
+
filters.push({
|
|
433
|
+
name: 'appName',
|
|
434
|
+
operator: 'in',
|
|
435
|
+
value: ['', applicationName]
|
|
436
|
+
})
|
|
437
|
+
|
|
415
438
|
const response = (
|
|
416
439
|
await client.query({
|
|
417
440
|
query: gql`
|
|
@@ -421,6 +444,7 @@ class AddonMenuSetting extends connect(store)(localize(i18next)(PageView)) {
|
|
|
421
444
|
id
|
|
422
445
|
name
|
|
423
446
|
description
|
|
447
|
+
appName
|
|
424
448
|
parent
|
|
425
449
|
rank
|
|
426
450
|
type
|
|
@@ -22,17 +22,17 @@ let LiteMenuMutation = class LiteMenuMutation {
|
|
|
22
22
|
const { domain, user } = context.state;
|
|
23
23
|
return await (0, typeorm_1.getRepository)(lite_menu_1.LiteMenu).save(Object.assign({ domain, creator: user, updater: user }, liteMenu));
|
|
24
24
|
}
|
|
25
|
-
async updateLiteMenu(
|
|
25
|
+
async updateLiteMenu(id, patch, context) {
|
|
26
26
|
const { domain, user } = context.state;
|
|
27
27
|
const repository = (0, typeorm_1.getRepository)(lite_menu_1.LiteMenu);
|
|
28
28
|
const liteMenu = await repository.findOne({
|
|
29
|
-
where: { domain,
|
|
29
|
+
where: { domain, id }
|
|
30
30
|
});
|
|
31
31
|
return await repository.save(Object.assign(Object.assign(Object.assign({ domain, creater: user }, liteMenu), patch), { updater: user }));
|
|
32
32
|
}
|
|
33
|
-
async deleteLiteMenu(
|
|
33
|
+
async deleteLiteMenu(id, context) {
|
|
34
34
|
const { domain } = context.state;
|
|
35
|
-
await (0, typeorm_1.getRepository)(lite_menu_1.LiteMenu).delete({ domain,
|
|
35
|
+
await (0, typeorm_1.getRepository)(lite_menu_1.LiteMenu).delete({ domain, id });
|
|
36
36
|
return true;
|
|
37
37
|
}
|
|
38
38
|
};
|
|
@@ -46,7 +46,7 @@ __decorate([
|
|
|
46
46
|
], LiteMenuMutation.prototype, "createLiteMenu", null);
|
|
47
47
|
__decorate([
|
|
48
48
|
(0, type_graphql_1.Mutation)(returns => lite_menu_1.LiteMenu, { description: 'To modify LiteMenu information' }),
|
|
49
|
-
__param(0, (0, type_graphql_1.Arg)('
|
|
49
|
+
__param(0, (0, type_graphql_1.Arg)('id')),
|
|
50
50
|
__param(1, (0, type_graphql_1.Arg)('patch')),
|
|
51
51
|
__param(2, (0, type_graphql_1.Ctx)()),
|
|
52
52
|
__metadata("design:type", Function),
|
|
@@ -55,7 +55,7 @@ __decorate([
|
|
|
55
55
|
], LiteMenuMutation.prototype, "updateLiteMenu", null);
|
|
56
56
|
__decorate([
|
|
57
57
|
(0, type_graphql_1.Mutation)(returns => Boolean, { description: 'To delete LiteMenu' }),
|
|
58
|
-
__param(0, (0, type_graphql_1.Arg)('
|
|
58
|
+
__param(0, (0, type_graphql_1.Arg)('id')),
|
|
59
59
|
__param(1, (0, type_graphql_1.Ctx)()),
|
|
60
60
|
__metadata("design:type", Function),
|
|
61
61
|
__metadata("design:paramtypes", [String, Object]),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lite-menu-mutation.js","sourceRoot":"","sources":["../../../server/service/lite-menu/lite-menu-mutation.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,+
|
|
1
|
+
{"version":3,"file":"lite-menu-mutation.js","sourceRoot":"","sources":["../../../server/service/lite-menu/lite-menu-mutation.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,+CAA2D;AAC3D,qCAAuC;AAEvC,2CAAsC;AACtC,qDAA6D;AAG7D,IAAa,gBAAgB,GAA7B,MAAa,gBAAgB;IAE3B,KAAK,CAAC,cAAc,CAAkB,QAAqB,EAAS,OAAY;QAC9E,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEtC,OAAO,MAAM,IAAA,uBAAa,EAAC,oBAAQ,CAAC,CAAC,IAAI,iBACvC,MAAM,EACN,OAAO,EAAE,IAAI,EACb,OAAO,EAAE,IAAI,IACV,QAAQ,EACX,CAAA;IACJ,CAAC;IAGD,KAAK,CAAC,cAAc,CACP,EAAU,EACP,KAAoB,EAC3B,OAAY;QAEnB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEtC,MAAM,UAAU,GAAG,IAAA,uBAAa,EAAC,oBAAQ,CAAC,CAAA;QAC1C,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC;YACxC,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;SACtB,CAAC,CAAA;QAEF,OAAO,MAAM,UAAU,CAAC,IAAI,6CAC1B,MAAM,EACN,OAAO,EAAE,IAAI,IACV,QAAQ,GACR,KAAK,KACR,OAAO,EAAE,IAAI,IACb,CAAA;IACJ,CAAC;IAGD,KAAK,CAAC,cAAc,CAAY,EAAU,EAAS,OAAY;QAC7D,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEhC,MAAM,IAAA,uBAAa,EAAC,oBAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAA;QACpD,OAAO,IAAI,CAAA;IACb,CAAC;CACF,CAAA;AAxCC;IADC,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,oBAAQ,EAAE,EAAE,WAAW,EAAE,wBAAwB,EAAE,CAAC;IACnD,WAAA,IAAA,kBAAG,EAAC,UAAU,CAAC,CAAA;IAAyB,WAAA,IAAA,kBAAG,GAAE,CAAA;;qCAAnB,4BAAW;;sDAS1D;AAGD;IADC,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,oBAAQ,EAAE,EAAE,WAAW,EAAE,gCAAgC,EAAE,CAAC;IAE9E,WAAA,IAAA,kBAAG,EAAC,IAAI,CAAC,CAAA;IACT,WAAA,IAAA,kBAAG,EAAC,OAAO,CAAC,CAAA;IACZ,WAAA,IAAA,kBAAG,GAAE,CAAA;;6CADe,8BAAa;;sDAiBnC;AAGD;IADC,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC;IAC9C,WAAA,IAAA,kBAAG,EAAC,IAAI,CAAC,CAAA;IAAc,WAAA,IAAA,kBAAG,GAAE,CAAA;;;;sDAKjD;AAzCU,gBAAgB;IAD5B,IAAA,uBAAQ,EAAC,oBAAQ,CAAC;GACN,gBAAgB,CA0C5B;AA1CY,4CAAgB"}
|
|
@@ -22,10 +22,11 @@ const shell_1 = require("@things-factory/shell");
|
|
|
22
22
|
const lite_menu_1 = require("./lite-menu");
|
|
23
23
|
const lite_menu_type_1 = require("./lite-menu-type");
|
|
24
24
|
let LiteMenuQuery = class LiteMenuQuery {
|
|
25
|
-
async liteMenu(
|
|
25
|
+
async liteMenu(id, context) {
|
|
26
|
+
const { domain } = context.state;
|
|
26
27
|
const repository = (0, typeorm_1.getRepository)(lite_menu_1.LiteMenu);
|
|
27
28
|
var liteMenu = repository.findOne({
|
|
28
|
-
where: { domain
|
|
29
|
+
where: { domain, id, relations: ['domain', 'creator', 'updater'] }
|
|
29
30
|
});
|
|
30
31
|
return liteMenu;
|
|
31
32
|
}
|
|
@@ -52,7 +53,7 @@ let LiteMenuQuery = class LiteMenuQuery {
|
|
|
52
53
|
};
|
|
53
54
|
__decorate([
|
|
54
55
|
(0, type_graphql_1.Query)(returns => lite_menu_1.LiteMenu, { description: 'To fetch a LiteMenu' }),
|
|
55
|
-
__param(0, (0, type_graphql_1.Arg)('
|
|
56
|
+
__param(0, (0, type_graphql_1.Arg)('id')),
|
|
56
57
|
__param(1, (0, type_graphql_1.Ctx)()),
|
|
57
58
|
__metadata("design:type", Function),
|
|
58
59
|
__metadata("design:paramtypes", [String, Object]),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lite-menu-query.js","sourceRoot":"","sources":["../../../server/service/lite-menu/lite-menu-query.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAAmF;AACnF,qCAAuC;AAEvC,yDAAgD;AAChD,iEAAqD;AACrD,iDAAqE;AAErE,2CAAsC;AACtC,qDAA+C;AAG/C,IAAa,aAAa,GAA1B,MAAa,aAAa;IAExB,KAAK,CAAC,QAAQ,
|
|
1
|
+
{"version":3,"file":"lite-menu-query.js","sourceRoot":"","sources":["../../../server/service/lite-menu/lite-menu-query.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,10 @@ __decorate([
|
|
|
22
22
|
(0, type_graphql_1.Field)({ nullable: true }),
|
|
23
23
|
__metadata("design:type", String)
|
|
24
24
|
], NewLiteMenu.prototype, "description", void 0);
|
|
25
|
+
__decorate([
|
|
26
|
+
(0, type_graphql_1.Field)({ nullable: true }),
|
|
27
|
+
__metadata("design:type", String)
|
|
28
|
+
], NewLiteMenu.prototype, "appName", void 0);
|
|
25
29
|
__decorate([
|
|
26
30
|
(0, type_graphql_1.Field)({ nullable: true }),
|
|
27
31
|
__metadata("design:type", String)
|
|
@@ -60,6 +64,10 @@ __decorate([
|
|
|
60
64
|
(0, type_graphql_1.Field)({ nullable: true }),
|
|
61
65
|
__metadata("design:type", String)
|
|
62
66
|
], LiteMenuPatch.prototype, "description", void 0);
|
|
67
|
+
__decorate([
|
|
68
|
+
(0, type_graphql_1.Field)({ nullable: true }),
|
|
69
|
+
__metadata("design:type", String)
|
|
70
|
+
], LiteMenuPatch.prototype, "appName", void 0);
|
|
63
71
|
__decorate([
|
|
64
72
|
(0, type_graphql_1.Field)({ nullable: true }),
|
|
65
73
|
__metadata("design:type", String)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lite-menu-type.js","sourceRoot":"","sources":["../../../server/service/lite-menu/lite-menu-type.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,+
|
|
1
|
+
{"version":3,"file":"lite-menu-type.js","sourceRoot":"","sources":["../../../server/service/lite-menu/lite-menu-type.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,+CAAgE;AAEhE,2CAAsC;AAGtC,IAAa,WAAW,GAAxB,MAAa,WAAW;CA2BvB,CAAA;AAzBC;IADC,IAAA,oBAAK,GAAE;;yCACI;AAGZ;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;gDACN;AAGpB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;4CACV;AAGhB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;2CACX;AAGf;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;yCAC1B;AAGb;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;yCACb;AAGb;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;yCACb;AAGb;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;0CACZ;AAGd;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;2CACV;AA1BL,WAAW;IADvB,IAAA,wBAAS,GAAE;GACC,WAAW,CA2BvB;AA3BY,kCAAW;AA8BxB,IAAa,aAAa,GAA1B,MAAa,aAAa;CA2BzB,CAAA;AAzBC;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;2CACd;AAGZ;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;kDACN;AAGpB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;8CACV;AAGhB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;6CACX;AAGf;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;2CAC1B;AAGb;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;2CACb;AAGb;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;2CACb;AAGb;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;4CACZ;AAGd;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;6CACV;AA1BL,aAAa;IADzB,IAAA,wBAAS,GAAE;GACC,aAAa,CA2BzB;AA3BY,sCAAa;AA8B1B,IAAa,YAAY,GAAzB,MAAa,YAAY;CAMxB,CAAA;AAJC;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,oBAAQ,CAAC,CAAC;;2CACT;AAGjB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,CAAC;;2CACN;AALF,YAAY;IADxB,IAAA,yBAAU,GAAE;GACA,YAAY,CAMxB;AANY,oCAAY"}
|
|
@@ -11,11 +11,11 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
11
11
|
var _a, _b, _c, _d;
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
13
|
exports.LiteMenu = void 0;
|
|
14
|
-
const typeorm_1 = require("typeorm");
|
|
15
14
|
const type_graphql_1 = require("type-graphql");
|
|
16
|
-
const
|
|
15
|
+
const typeorm_1 = require("typeorm");
|
|
17
16
|
const auth_base_1 = require("@things-factory/auth-base");
|
|
18
17
|
const board_service_1 = require("@things-factory/board-service");
|
|
18
|
+
const shell_1 = require("@things-factory/shell");
|
|
19
19
|
let LiteMenu = class LiteMenu {
|
|
20
20
|
};
|
|
21
21
|
__decorate([
|
|
@@ -44,6 +44,14 @@ __decorate([
|
|
|
44
44
|
(0, type_graphql_1.Field)({ nullable: true }),
|
|
45
45
|
__metadata("design:type", String)
|
|
46
46
|
], LiteMenu.prototype, "description", void 0);
|
|
47
|
+
__decorate([
|
|
48
|
+
(0, typeorm_1.Column)({
|
|
49
|
+
nullable: true,
|
|
50
|
+
default: ''
|
|
51
|
+
}),
|
|
52
|
+
(0, type_graphql_1.Field)({ nullable: true }),
|
|
53
|
+
__metadata("design:type", String)
|
|
54
|
+
], LiteMenu.prototype, "appName", void 0);
|
|
47
55
|
__decorate([
|
|
48
56
|
(0, typeorm_1.Column)({
|
|
49
57
|
nullable: true,
|
|
@@ -125,8 +133,10 @@ __decorate([
|
|
|
125
133
|
], LiteMenu.prototype, "updaterId", void 0);
|
|
126
134
|
LiteMenu = __decorate([
|
|
127
135
|
(0, typeorm_1.Entity)(),
|
|
128
|
-
(0, typeorm_1.Index)('ix_lite_menus_0', (liteMenu) => [liteMenu.domain, liteMenu.name], { unique: true }),
|
|
129
|
-
(0, typeorm_1.Index)('ix_lite_menus_1', (liteMenu) => [liteMenu.domain, liteMenu.parent, liteMenu.rank], {
|
|
136
|
+
(0, typeorm_1.Index)('ix_lite_menus_0', (liteMenu) => [liteMenu.domain, liteMenu.name, liteMenu.appName], { unique: true }),
|
|
137
|
+
(0, typeorm_1.Index)('ix_lite_menus_1', (liteMenu) => [liteMenu.domain, liteMenu.appName, liteMenu.parent, liteMenu.rank], {
|
|
138
|
+
unique: true
|
|
139
|
+
}),
|
|
130
140
|
(0, type_graphql_1.ObjectType)({ description: 'Entity for LiteMenu' })
|
|
131
141
|
], LiteMenu);
|
|
132
142
|
exports.LiteMenu = LiteMenu;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lite-menu.js","sourceRoot":"","sources":["../../../server/service/lite-menu/lite-menu.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA
|
|
1
|
+
{"version":3,"file":"lite-menu.js","sourceRoot":"","sources":["../../../server/service/lite-menu/lite-menu.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@things-factory/lite-menu",
|
|
3
|
-
"version": "5.0.0-alpha.
|
|
3
|
+
"version": "5.0.0-alpha.32",
|
|
4
4
|
"main": "dist-server/index.js",
|
|
5
5
|
"browser": "client/index.js",
|
|
6
6
|
"things-factory": true,
|
|
@@ -33,14 +33,14 @@
|
|
|
33
33
|
"@operato/shell": "1.0.0-beta.1",
|
|
34
34
|
"@operato/styles": "1.0.0-beta.1",
|
|
35
35
|
"@operato/utils": "1.0.0-beta.1",
|
|
36
|
-
"@things-factory/apptool-base": "^5.0.0-alpha.
|
|
37
|
-
"@things-factory/auth-base": "^5.0.0-alpha.
|
|
38
|
-
"@things-factory/board-service": "^5.0.0-alpha.
|
|
39
|
-
"@things-factory/board-ui": "^5.0.0-alpha.
|
|
40
|
-
"@things-factory/grist-ui": "^5.0.0-alpha.
|
|
41
|
-
"@things-factory/more-base": "^5.0.0-alpha.
|
|
42
|
-
"@things-factory/setting-base": "^5.0.0-alpha.
|
|
43
|
-
"@things-factory/utils": "^5.0.0-alpha.
|
|
36
|
+
"@things-factory/apptool-base": "^5.0.0-alpha.32",
|
|
37
|
+
"@things-factory/auth-base": "^5.0.0-alpha.32",
|
|
38
|
+
"@things-factory/board-service": "^5.0.0-alpha.32",
|
|
39
|
+
"@things-factory/board-ui": "^5.0.0-alpha.32",
|
|
40
|
+
"@things-factory/grist-ui": "^5.0.0-alpha.32",
|
|
41
|
+
"@things-factory/more-base": "^5.0.0-alpha.32",
|
|
42
|
+
"@things-factory/setting-base": "^5.0.0-alpha.32",
|
|
43
|
+
"@things-factory/utils": "^5.0.0-alpha.32"
|
|
44
44
|
},
|
|
45
|
-
"gitHead": "
|
|
45
|
+
"gitHead": "c29fd7ecf652108bc3a333a6e0a766c11e1ea9f0"
|
|
46
46
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { getRepository
|
|
1
|
+
import { Arg, Ctx, Mutation, Resolver } from 'type-graphql'
|
|
2
|
+
import { getRepository } from 'typeorm'
|
|
3
|
+
|
|
3
4
|
import { LiteMenu } from './lite-menu'
|
|
4
|
-
import {
|
|
5
|
+
import { LiteMenuPatch, NewLiteMenu } from './lite-menu-type'
|
|
5
6
|
|
|
6
7
|
@Resolver(LiteMenu)
|
|
7
8
|
export class LiteMenuMutation {
|
|
@@ -19,7 +20,7 @@ export class LiteMenuMutation {
|
|
|
19
20
|
|
|
20
21
|
@Mutation(returns => LiteMenu, { description: 'To modify LiteMenu information' })
|
|
21
22
|
async updateLiteMenu(
|
|
22
|
-
@Arg('
|
|
23
|
+
@Arg('id') id: string,
|
|
23
24
|
@Arg('patch') patch: LiteMenuPatch,
|
|
24
25
|
@Ctx() context: any
|
|
25
26
|
): Promise<LiteMenu> {
|
|
@@ -27,7 +28,7 @@ export class LiteMenuMutation {
|
|
|
27
28
|
|
|
28
29
|
const repository = getRepository(LiteMenu)
|
|
29
30
|
const liteMenu = await repository.findOne({
|
|
30
|
-
where: { domain,
|
|
31
|
+
where: { domain, id }
|
|
31
32
|
})
|
|
32
33
|
|
|
33
34
|
return await repository.save({
|
|
@@ -40,10 +41,10 @@ export class LiteMenuMutation {
|
|
|
40
41
|
}
|
|
41
42
|
|
|
42
43
|
@Mutation(returns => Boolean, { description: 'To delete LiteMenu' })
|
|
43
|
-
async deleteLiteMenu(@Arg('
|
|
44
|
+
async deleteLiteMenu(@Arg('id') id: string, @Ctx() context: any): Promise<boolean> {
|
|
44
45
|
const { domain } = context.state
|
|
45
46
|
|
|
46
|
-
await getRepository(LiteMenu).delete({ domain,
|
|
47
|
+
await getRepository(LiteMenu).delete({ domain, id })
|
|
47
48
|
return true
|
|
48
49
|
}
|
|
49
50
|
}
|
|
@@ -11,11 +11,12 @@ import { LiteMenuList } from './lite-menu-type'
|
|
|
11
11
|
@Resolver(LiteMenu)
|
|
12
12
|
export class LiteMenuQuery {
|
|
13
13
|
@Query(returns => LiteMenu, { description: 'To fetch a LiteMenu' })
|
|
14
|
-
async liteMenu(@Arg('
|
|
14
|
+
async liteMenu(@Arg('id') id: string, @Ctx() context: any): Promise<LiteMenu> {
|
|
15
|
+
const { domain } = context.state
|
|
15
16
|
const repository = getRepository(LiteMenu)
|
|
16
17
|
|
|
17
18
|
var liteMenu: any = repository.findOne({
|
|
18
|
-
where: { domain
|
|
19
|
+
where: { domain, id, relations: ['domain', 'creator', 'updater'] }
|
|
19
20
|
})
|
|
20
21
|
|
|
21
22
|
return liteMenu
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Field, InputType, Int, ObjectType } from 'type-graphql'
|
|
2
2
|
|
|
3
3
|
import { LiteMenu } from './lite-menu'
|
|
4
4
|
|
|
@@ -10,6 +10,9 @@ export class NewLiteMenu {
|
|
|
10
10
|
@Field({ nullable: true })
|
|
11
11
|
description?: string
|
|
12
12
|
|
|
13
|
+
@Field({ nullable: true })
|
|
14
|
+
appName?: string
|
|
15
|
+
|
|
13
16
|
@Field({ nullable: true })
|
|
14
17
|
parent?: string
|
|
15
18
|
|
|
@@ -37,6 +40,9 @@ export class LiteMenuPatch {
|
|
|
37
40
|
@Field({ nullable: true })
|
|
38
41
|
description?: string
|
|
39
42
|
|
|
43
|
+
@Field({ nullable: true })
|
|
44
|
+
appName?: string
|
|
45
|
+
|
|
40
46
|
@Field({ nullable: true })
|
|
41
47
|
parent?: string
|
|
42
48
|
|
|
@@ -1,22 +1,24 @@
|
|
|
1
|
+
import { Field, ID, Int, ObjectType } from 'type-graphql'
|
|
1
2
|
import {
|
|
3
|
+
Column,
|
|
2
4
|
CreateDateColumn,
|
|
3
|
-
UpdateDateColumn,
|
|
4
5
|
Entity,
|
|
5
6
|
Index,
|
|
6
|
-
Column,
|
|
7
|
-
RelationId,
|
|
8
7
|
ManyToOne,
|
|
9
|
-
PrimaryGeneratedColumn
|
|
8
|
+
PrimaryGeneratedColumn,
|
|
9
|
+
RelationId,
|
|
10
|
+
UpdateDateColumn
|
|
10
11
|
} from 'typeorm'
|
|
11
|
-
import { ObjectType, Field, Int, ID, registerEnumType } from 'type-graphql'
|
|
12
12
|
|
|
13
|
-
import { Domain } from '@things-factory/shell'
|
|
14
13
|
import { User } from '@things-factory/auth-base'
|
|
15
14
|
import { Board } from '@things-factory/board-service'
|
|
15
|
+
import { Domain } from '@things-factory/shell'
|
|
16
16
|
|
|
17
17
|
@Entity()
|
|
18
|
-
@Index('ix_lite_menus_0', (liteMenu: LiteMenu) => [liteMenu.domain, liteMenu.name], { unique: true })
|
|
19
|
-
@Index('ix_lite_menus_1', (liteMenu: LiteMenu) => [liteMenu.domain, liteMenu.parent, liteMenu.rank], {
|
|
18
|
+
@Index('ix_lite_menus_0', (liteMenu: LiteMenu) => [liteMenu.domain, liteMenu.name, liteMenu.appName], { unique: true })
|
|
19
|
+
@Index('ix_lite_menus_1', (liteMenu: LiteMenu) => [liteMenu.domain, liteMenu.appName, liteMenu.parent, liteMenu.rank], {
|
|
20
|
+
unique: true
|
|
21
|
+
})
|
|
20
22
|
@ObjectType({ description: 'Entity for LiteMenu' })
|
|
21
23
|
export class LiteMenu {
|
|
22
24
|
@PrimaryGeneratedColumn('uuid')
|
|
@@ -40,6 +42,13 @@ export class LiteMenu {
|
|
|
40
42
|
@Field({ nullable: true })
|
|
41
43
|
description?: string
|
|
42
44
|
|
|
45
|
+
@Column({
|
|
46
|
+
nullable: true,
|
|
47
|
+
default: ''
|
|
48
|
+
})
|
|
49
|
+
@Field({ nullable: true })
|
|
50
|
+
appName?: string
|
|
51
|
+
|
|
43
52
|
@Column({
|
|
44
53
|
nullable: true,
|
|
45
54
|
default: ''
|
package/translations/en.json
CHANGED
package/translations/ko.json
CHANGED
package/translations/ms.json
CHANGED