@nocobase/plugin-client 2.2.0-beta.1 → 2.2.0-beta.10
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/dist/client/index.js +1 -1
- package/dist/client/routesTableSchema.d.ts +1 -0
- package/dist/client-v2/index.js +1 -1
- package/dist/externalVersion.js +5 -5
- package/dist/locale/de-DE.json +4 -4
- package/dist/locale/en-US.json +10 -4
- package/dist/locale/es-ES.json +4 -4
- package/dist/locale/fr-FR.json +4 -4
- package/dist/locale/hu-HU.json +4 -4
- package/dist/locale/id-ID.json +4 -4
- package/dist/locale/it-IT.json +4 -4
- package/dist/locale/ja-JP.json +4 -4
- package/dist/locale/ko-KR.json +4 -4
- package/dist/locale/nl-NL.json +4 -4
- package/dist/locale/pt-BR.json +4 -4
- package/dist/locale/ru-RU.json +4 -4
- package/dist/locale/tr-TR.json +4 -4
- package/dist/locale/uk-UA.json +4 -4
- package/dist/locale/vi-VN.json +4 -4
- package/dist/locale/zh-CN.json +10 -4
- package/dist/locale/zh-TW.json +4 -4
- package/dist/node_modules/cronstrue/package.json +1 -1
- package/dist/server/appPortals.d.ts +33 -0
- package/dist/server/appPortals.js +168 -0
- package/dist/server/server.js +9 -2
- package/package.json +2 -2
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
var __defProp = Object.defineProperty;
|
|
11
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
12
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
13
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
14
|
+
var __export = (target, all) => {
|
|
15
|
+
for (var name in all)
|
|
16
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
17
|
+
};
|
|
18
|
+
var __copyProps = (to, from, except, desc) => {
|
|
19
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
20
|
+
for (let key of __getOwnPropNames(from))
|
|
21
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
22
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
23
|
+
}
|
|
24
|
+
return to;
|
|
25
|
+
};
|
|
26
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
27
|
+
var appPortals_exports = {};
|
|
28
|
+
__export(appPortals_exports, {
|
|
29
|
+
listAppPortals: () => listAppPortals
|
|
30
|
+
});
|
|
31
|
+
module.exports = __toCommonJS(appPortals_exports);
|
|
32
|
+
var import_server = require("@nocobase/server");
|
|
33
|
+
const MAIN_APP_NAME = "main";
|
|
34
|
+
const MULTI_PORTAL_MANIFEST_NAMESPACE = "multi-portal";
|
|
35
|
+
const DEFAULT_PORTALS = [
|
|
36
|
+
{
|
|
37
|
+
uid: "__default_admin__",
|
|
38
|
+
title: "Admin",
|
|
39
|
+
icon: "DesktopOutlined",
|
|
40
|
+
routePath: "/admin",
|
|
41
|
+
layout: "desktop",
|
|
42
|
+
defaultPortal: true
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
uid: "__default_mobile__",
|
|
46
|
+
title: "Mobile",
|
|
47
|
+
icon: "MobileOutlined",
|
|
48
|
+
routePath: "/mobile",
|
|
49
|
+
layout: "mobile",
|
|
50
|
+
defaultPortal: true
|
|
51
|
+
}
|
|
52
|
+
];
|
|
53
|
+
function getCname(cname) {
|
|
54
|
+
const trimmed = cname == null ? void 0 : cname.trim();
|
|
55
|
+
return trimmed || null;
|
|
56
|
+
}
|
|
57
|
+
function getAppName(appModel) {
|
|
58
|
+
return typeof appModel.name === "string" && appModel.name ? appModel.name : null;
|
|
59
|
+
}
|
|
60
|
+
function getAppStatus(appName, statuses) {
|
|
61
|
+
return statuses[appName] ?? null;
|
|
62
|
+
}
|
|
63
|
+
function shouldUseCnameVisitUrl(options) {
|
|
64
|
+
const { cname, ssoEnabled, ssoCnameEnabled } = options;
|
|
65
|
+
return Boolean(cname && (!ssoEnabled || ssoCnameEnabled));
|
|
66
|
+
}
|
|
67
|
+
function toAppPortalAppItem(appModel, appSsoIssuer, target) {
|
|
68
|
+
var _a, _b, _c, _d;
|
|
69
|
+
const name = getAppName(appModel);
|
|
70
|
+
if (!name || name === MAIN_APP_NAME) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
const cname = getCname(appModel.cname);
|
|
74
|
+
const ssoEnabled = ((_b = (_a = appModel.options) == null ? void 0 : _a.sso) == null ? void 0 : _b.enabled) === true;
|
|
75
|
+
const ssoCnameEnabled = Boolean(((_d = (_c = appModel.options) == null ? void 0 : _c.sso) == null ? void 0 : _d.issuer) || appSsoIssuer);
|
|
76
|
+
return {
|
|
77
|
+
name,
|
|
78
|
+
title: appModel.title || name,
|
|
79
|
+
icon: appModel.icon || null,
|
|
80
|
+
cname: shouldUseCnameVisitUrl({ cname, ssoEnabled, ssoCnameEnabled }) ? cname : null,
|
|
81
|
+
ssoEnabled,
|
|
82
|
+
target
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function getPortalKey(item) {
|
|
86
|
+
return item.uid ? `${item.appName}:${item.uid}` : `${item.appName}:${item.routePath}`;
|
|
87
|
+
}
|
|
88
|
+
function addPortal(portals, item) {
|
|
89
|
+
if (!item.appName || !item.routePath) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
portals.set(getPortalKey(item), item);
|
|
93
|
+
}
|
|
94
|
+
function addDefaultPortals(portals, appNames) {
|
|
95
|
+
for (const appName of appNames) {
|
|
96
|
+
for (const portal of DEFAULT_PORTALS) {
|
|
97
|
+
addPortal(portals, {
|
|
98
|
+
...portal,
|
|
99
|
+
appName
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function addStoredPortals(portals, appName, storedPortals) {
|
|
105
|
+
if (!Array.isArray(storedPortals)) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
for (const portal of storedPortals) {
|
|
109
|
+
if (!portal || typeof portal.routePath !== "string" || !portal.routePath) {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
addPortal(portals, {
|
|
113
|
+
uid: typeof portal.uid === "string" ? portal.uid : null,
|
|
114
|
+
appName,
|
|
115
|
+
title: typeof portal.title === "string" ? portal.title : null,
|
|
116
|
+
icon: typeof portal.icon === "string" ? portal.icon : null,
|
|
117
|
+
routePath: portal.routePath,
|
|
118
|
+
layout: typeof portal.layout === "string" ? portal.layout : null
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async function listAppPortals(currentAppName) {
|
|
123
|
+
const supervisor = import_server.AppSupervisor.getInstance();
|
|
124
|
+
const appModels = await supervisor.listAppModels();
|
|
125
|
+
const apps = /* @__PURE__ */ new Map();
|
|
126
|
+
const appNames = /* @__PURE__ */ new Set([MAIN_APP_NAME]);
|
|
127
|
+
const target = currentAppName === MAIN_APP_NAME ? "_blank" : void 0;
|
|
128
|
+
const appSsoIssuer = supervisor.getAppSsoIssuer();
|
|
129
|
+
const appItems = appModels.map((appModel) => toAppPortalAppItem(appModel, appSsoIssuer, target));
|
|
130
|
+
if (currentAppName) {
|
|
131
|
+
appNames.add(currentAppName);
|
|
132
|
+
}
|
|
133
|
+
for (const app of appItems) {
|
|
134
|
+
if (!app) {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
apps.set(app.name, app);
|
|
138
|
+
appNames.add(app.name);
|
|
139
|
+
}
|
|
140
|
+
if (appNames.size > 1 && !apps.has(MAIN_APP_NAME)) {
|
|
141
|
+
apps.set(MAIN_APP_NAME, {
|
|
142
|
+
name: MAIN_APP_NAME,
|
|
143
|
+
title: "Main",
|
|
144
|
+
icon: null
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
const appStatuses = await supervisor.getAppsStatuses(Array.from(appNames));
|
|
148
|
+
for (const app of apps.values()) {
|
|
149
|
+
app.status = getAppStatus(app.name, appStatuses);
|
|
150
|
+
}
|
|
151
|
+
const manifests = await supervisor.getAppManifests(
|
|
152
|
+
MULTI_PORTAL_MANIFEST_NAMESPACE,
|
|
153
|
+
Array.from(appNames)
|
|
154
|
+
);
|
|
155
|
+
const portals = /* @__PURE__ */ new Map();
|
|
156
|
+
addDefaultPortals(portals, appNames);
|
|
157
|
+
for (const appName of appNames) {
|
|
158
|
+
addStoredPortals(portals, appName, manifests[appName]);
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
apps: [...apps.values()],
|
|
162
|
+
portals: [...portals.values()]
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
166
|
+
0 && (module.exports = {
|
|
167
|
+
listAppPortals
|
|
168
|
+
});
|
package/dist/server/server.js
CHANGED
|
@@ -45,6 +45,7 @@ var import_utils = require("@nocobase/utils");
|
|
|
45
45
|
var import_lodash = __toESM(require("lodash"));
|
|
46
46
|
var process = __toESM(require("node:process"));
|
|
47
47
|
var import_path = require("path");
|
|
48
|
+
var import_appPortals = require("./appPortals");
|
|
48
49
|
var import_antd = require("./antd");
|
|
49
50
|
var import_cron = require("./cron");
|
|
50
51
|
var import_cronstrue = require("./cronstrue");
|
|
@@ -80,6 +81,7 @@ class PluginClientServer extends import_server.Plugin {
|
|
|
80
81
|
});
|
|
81
82
|
this.app.acl.allow("app", "getLang");
|
|
82
83
|
this.app.acl.allow("app", "getInfo");
|
|
84
|
+
this.app.acl.allow("app", "getPortals", "loggedIn");
|
|
83
85
|
this.app.acl.registerSnippet({
|
|
84
86
|
name: "app",
|
|
85
87
|
actions: ["app:restart", "app:refresh", "app:clearCache", "app:publishEvent"]
|
|
@@ -128,6 +130,11 @@ class PluginClientServer extends import_server.Plugin {
|
|
|
128
130
|
};
|
|
129
131
|
await next();
|
|
130
132
|
},
|
|
133
|
+
getPortals: async (ctx, next) => {
|
|
134
|
+
var _a;
|
|
135
|
+
ctx.body = await (0, import_appPortals.listAppPortals)((_a = ctx.app) == null ? void 0 : _a.name);
|
|
136
|
+
await next();
|
|
137
|
+
},
|
|
131
138
|
async clearCache(ctx, next) {
|
|
132
139
|
await ctx.cache.reset();
|
|
133
140
|
await next();
|
|
@@ -153,7 +160,7 @@ class PluginClientServer extends import_server.Plugin {
|
|
|
153
160
|
}
|
|
154
161
|
const { id, username } = ((_c = ctx.auth) == null ? void 0 : _c.user) ?? {};
|
|
155
162
|
const user = id ? { id, username } : void 0;
|
|
156
|
-
const eventName = `${command}
|
|
163
|
+
const eventName = `${command.replaceAll(":", ".")}.${plugin}`;
|
|
157
164
|
try {
|
|
158
165
|
await ctx.app.eventQueue.publish(eventName, {
|
|
159
166
|
plugin,
|
|
@@ -201,7 +208,7 @@ class PluginClientServer extends import_server.Plugin {
|
|
|
201
208
|
});
|
|
202
209
|
this.app.acl.registerSnippet({
|
|
203
210
|
name: `pm.desktopRoutes`,
|
|
204
|
-
actions: ["
|
|
211
|
+
actions: ["roles.desktopRoutes:*"]
|
|
205
212
|
});
|
|
206
213
|
this.app.acl.allow("desktopRoutes", ["listAccessible", "getAccessible"], "loggedIn");
|
|
207
214
|
}
|
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"description": "Provides a client interface for the NocoBase server",
|
|
7
7
|
"description.ru-RU": "Предоставляет клиентский интерфейс для сервера NocoBase",
|
|
8
8
|
"description.zh-CN": "为 NocoBase 服务端提供客户端界面",
|
|
9
|
-
"version": "2.2.0-beta.
|
|
9
|
+
"version": "2.2.0-beta.10",
|
|
10
10
|
"main": "./dist/server/index.js",
|
|
11
11
|
"license": "Apache-2.0",
|
|
12
12
|
"devDependencies": {
|
|
@@ -23,5 +23,5 @@
|
|
|
23
23
|
"@nocobase/test": "2.x",
|
|
24
24
|
"@nocobase/utils": "2.x"
|
|
25
25
|
},
|
|
26
|
-
"gitHead": "
|
|
26
|
+
"gitHead": "d572beec24de46df948f28db72b25303a63bf62d"
|
|
27
27
|
}
|