@_tc/template-core 0.2.0-bate.0 → 0.2.0-bate.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/.skills/tc-component-usage-skills/reference/template-core-frontend.md +8 -1
- package/.skills/tc-generator/SKILL.md +3 -2
- package/.skills/tc-generator/reference/example.md +1 -1
- package/.skills/tc-generator/reference/model-schema.md +18 -0
- package/.skills/tc-generator/reference/project-template/index.js +1 -1
- package/.skills/tc-generator/reference/runtime-extensions.md +22 -2
- package/AGENT_README.md +35 -14
- package/README.md +238 -33
- package/cjs/app/controller/view.js +1 -1
- package/cjs/app/{extend → extends}/db.js +1 -1
- package/cjs/app/extends/localCacheHtmlEtag.js +1 -0
- package/cjs/app/extends/render-view.js +1 -0
- package/cjs/app/middleware.js +1 -1
- package/cjs/app/view/entry.tpl +0 -16
- package/cjs/bundler/buildFE.js +1 -0
- package/cjs/bundler/index.js +1 -1
- package/cjs/bundler/state.js +1 -1
- package/cjs/bundler/utils.js +3 -3
- package/cjs/packages/common/index.js +1 -1
- package/cjs/packages/common/rafTimer.js +1 -0
- package/cjs/packages/common/string/index.js +1 -1
- package/cjs/packages/core/index.js +1 -1
- package/cjs/packages/core/loader/controller.js +1 -1
- package/cjs/packages/core/loader/extend.js +1 -1
- package/cjs/packages/core/loader/middleware.js +1 -1
- package/cjs/packages/core/loader/router-schema.js +1 -1
- package/cjs/packages/core/loader/router.js +1 -1
- package/cjs/packages/core/loader/service.js +1 -1
- package/cjs/packages/utils/runFileFn.js +1 -1
- package/esm/app/controller/view.js +28 -15
- package/esm/app/{extend → extends}/$fetch.js +1 -1
- package/esm/app/{extend → extends}/crypto.js +1 -1
- package/esm/app/{extend → extends}/db.js +2 -2
- package/esm/app/{extend → extends}/generateErrorMessage.js +1 -1
- package/esm/app/extends/localCacheHtmlEtag.js +41 -0
- package/esm/app/{extend → extends}/logger.js +1 -1
- package/esm/app/{extend → extends}/parsingParamsOnUrl.js +1 -1
- package/esm/app/extends/render-view.js +18 -0
- package/esm/app/middleware.js +8 -12
- package/esm/app/view/entry.tpl +0 -16
- package/esm/bundler/buildFE.js +14 -0
- package/esm/bundler/index.js +2 -14
- package/esm/bundler/state.js +5 -1
- package/esm/bundler/utils.js +130 -104
- package/esm/packages/common/index.js +7 -6
- package/esm/packages/common/rafTimer.js +47 -0
- package/esm/packages/common/string/index.js +11 -2
- package/esm/packages/core/index.js +34 -28
- package/esm/packages/core/loader/controller.js +6 -6
- package/esm/packages/core/loader/extend.js +6 -6
- package/esm/packages/core/loader/middleware.js +6 -6
- package/esm/packages/core/loader/router-schema.js +7 -7
- package/esm/packages/core/loader/router.js +13 -13
- package/esm/packages/core/loader/service.js +6 -6
- package/esm/packages/utils/runFileFn.js +10 -10
- package/fe/frontend/apps/dash/Dashboard.js +6 -4
- package/fe/frontend/apps/dash/dash.entry.js +4 -0
- package/fe/frontend/src/common/generateMenuData.d.ts +4 -1
- package/fe/frontend/src/common/generateMenuData.js +3 -3
- package/fe/frontend/src/common/language.d.ts +12 -1
- package/fe/frontend/src/common/language.js +25 -4
- package/fe/frontend/src/common/rafTimer.d.ts +1 -0
- package/fe/frontend/src/common/rafTimer.js +2 -0
- package/fe/frontend/src/common/request.js +1 -0
- package/fe/frontend/src/common/theme.d.ts +7 -0
- package/fe/frontend/src/common/theme.js +33 -0
- package/fe/frontend/src/components/BasePage/HeaderView.js +2 -2
- package/fe/frontend/src/components/LanguageSwitch/LanguageSwitch.js +22 -6
- package/fe/frontend/src/components/ThemeSwitch/ThemeSwitch.d.ts +3 -2
- package/fe/frontend/src/components/ThemeSwitch/ThemeSwitch.js +6 -29
- package/fe/frontend/src/components/ThemeSwitch/index.d.ts +1 -0
- package/fe/frontend/src/components/ThemeSwitch/index.js +3 -2
- package/fe/frontend/src/components/index.js +2 -2
- package/fe/frontend/src/defaultPages/NotFoundPage/index.js +4 -3
- package/fe/frontend/src/defaultPages/SchemaPage/components/CallCom/DetailPanel.js +14 -9
- package/fe/frontend/src/defaultPages/SchemaPage/components/CallCom/PopFrom.js +8 -7
- package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaSearch/index.js +20 -24
- package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaTable/PreviewImage.d.ts +10 -0
- package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaTable/PreviewImage.js +17 -0
- package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaTable/data.d.ts +5 -0
- package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaTable/data.js +8 -0
- package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaTable/index.js +50 -32
- package/fe/frontend/src/defaultPages/SchemaPage/index.css +0 -4
- package/fe/frontend/src/defaultPages/SchemaPage/index.js +5 -3
- package/fe/frontend/src/defaultPages/SlotPage/index.js +6 -3
- package/fe/frontend/src/hooks/useText.d.ts +3 -0
- package/fe/frontend/src/hooks/useText.js +14 -0
- package/fe/frontend/src/index.d.ts +11 -3
- package/fe/frontend/src/index.js +8 -3
- package/fe/frontend/src/language/index.d.ts +0 -2
- package/fe/frontend/src/language/index.js +1 -7
- package/fe/frontend/src/language/resources.d.ts +2 -0
- package/fe/frontend/src/language/resources.js +9 -0
- package/fe/model/types/data/schema.d.ts +24 -2
- package/fe/model/types/index.d.ts +1 -0
- package/fe/packages/common/i18n/default.js +3 -0
- package/fe/packages/common/i18n/en-US.js +5 -2
- package/fe/packages/common/i18n/index.js +13 -0
- package/fe/packages/common/i18n/locales.js +7 -0
- package/fe/packages/common/index.d.ts +1 -0
- package/fe/packages/common/rafTimer.d.ts +7 -0
- package/fe/packages/common/rafTimer.js +168 -0
- package/fe/packages/common/string/index.d.ts +9 -0
- package/fe/packages/react/hooks/index.d.ts +9 -0
- package/fe/packages/react/hooks/index.js +8 -0
- package/fe/packages/react/hooks/useRefState.d.ts +4 -12
- package/fe/packages/react/hooks/useRefState.js +18 -8
- package/fe/packages/react/ui/components/DataTable/dataTableWidth.d.ts +12 -0
- package/fe/packages/react/ui/components/DataTable/dataTableWidth.js +33 -0
- package/fe/packages/react/ui/components/DataTable/dataTableWidth.test.js +39 -0
- package/fe/packages/react/ui/components/DataTable/index.d.ts +1 -1
- package/fe/packages/react/ui/components/DataTable/index.js +12 -32
- package/fe/packages/react/ui/components/Textarea/Textarea.d.ts +1 -1
- package/fe/packages/react/ui/components/Textarea/Textarea.js +1 -1
- package/fe/packages/react/ui/components/types/baseType.d.ts +21 -0
- package/fe/packages/react/ui/components/types/baseType.js +0 -0
- package/model/frontend/src/common/language.d.ts +12 -1
- package/model/frontend/src/hooks/useText.d.ts +3 -0
- package/model/frontend/src/language/index.d.ts +0 -2
- package/model/frontend/src/language/resources.d.ts +2 -0
- package/model/model/types/data/schema.d.ts +24 -2
- package/model/model/types/index.d.ts +1 -0
- package/model/packages/common/index.d.ts +1 -0
- package/model/packages/common/rafTimer.d.ts +7 -0
- package/model/packages/common/string/index.d.ts +9 -0
- package/model/packages/react/ui/components/DataTable/dataTableWidth.d.ts +12 -0
- package/model/packages/react/ui/components/DataTable/index.d.ts +1 -1
- package/model/packages/react/ui/components/Textarea/Textarea.d.ts +1 -1
- package/model/packages/react/ui/components/types/baseType.d.ts +21 -0
- package/package.json +5 -5
- package/types/app/extends/localCacheHtmlEtag.d.ts +10 -0
- package/types/app/{extend → extends}/render-view.d.ts +1 -1
- package/types/app/service/base.d.ts +1 -1
- package/types/app/service/project.d.ts +1 -1
- package/types/app/type.d.ts +2 -1
- package/types/app/typings.d.ts +10 -8
- package/types/bundler/buildFE.d.ts +2 -0
- package/types/bundler/index.d.ts +1 -2
- package/types/bundler/state.d.ts +4 -0
- package/types/bundler/utils.d.ts +5 -0
- package/types/index.d.ts +3 -3
- package/types/packages/common/i18n/default.d.ts +4 -0
- package/types/packages/common/i18n/en-US.d.ts +6 -2
- package/types/packages/common/i18n/index.d.ts +21 -0
- package/types/packages/common/i18n/locales.d.ts +10 -0
- package/types/packages/common/i18n/types.d.ts +40 -0
- package/types/packages/common/index.d.ts +1 -0
- package/types/packages/common/rafTimer.d.ts +44 -0
- package/types/packages/common/string/index.d.ts +16 -0
- package/types/packages/core/loader/extend.d.ts +1 -1
- package/types/packages/core/types.d.ts +4 -0
- package/cjs/app/extend/render-view.js +0 -1
- package/esm/app/extend/render-view.js +0 -25
- /package/cjs/app/{extend → extends}/$fetch.js +0 -0
- /package/cjs/app/{extend → extends}/crypto.js +0 -0
- /package/cjs/app/{extend → extends}/generateErrorMessage.js +0 -0
- /package/cjs/app/{extend → extends}/logger.js +0 -0
- /package/cjs/app/{extend → extends}/parsingParamsOnUrl.js +0 -0
- /package/types/app/{extend → extends}/$fetch.d.ts +0 -0
- /package/types/app/{extend → extends}/crypto.d.ts +0 -0
- /package/types/app/{extend → extends}/db.d.ts +0 -0
- /package/types/app/{extend → extends}/generateErrorMessage.d.ts +0 -0
- /package/types/app/{extend → extends}/logger.d.ts +0 -0
- /package/types/app/{extend → extends}/parsingParamsOnUrl.d.ts +0 -0
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { runFileFn as r } from "../../utils/runFileFn.js";
|
|
1
|
+
import { resolve as e } from "../../utils/path.js";
|
|
2
|
+
import { loadFileFn as t } from "../../utils/loadFile.js";
|
|
3
|
+
import { runFileFn as n } from "../../utils/runFileFn.js";
|
|
5
4
|
import "../../utils/index.js";
|
|
5
|
+
import { getAppPaths as r } from "../paths.js";
|
|
6
6
|
//#region packages/core/loader/router-schema.ts
|
|
7
7
|
var i = (i) => {
|
|
8
8
|
let a = {};
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
r(i).forEach((r) => {
|
|
10
|
+
t(r, "router-schema", { preProcessingFileCallback(t) {
|
|
11
11
|
a = {
|
|
12
12
|
...a,
|
|
13
|
-
...
|
|
13
|
+
...n(e(t))
|
|
14
14
|
};
|
|
15
15
|
} });
|
|
16
16
|
}), i.routerSchema = a;
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { runFileFn as i } from "../../utils/runFileFn.js";
|
|
1
|
+
import { resolve as e } from "../../utils/path.js";
|
|
2
|
+
import { loadFileFn as t } from "../../utils/loadFile.js";
|
|
3
|
+
import { runFileFn as n } from "../../utils/runFileFn.js";
|
|
5
4
|
import "../../utils/index.js";
|
|
5
|
+
import { getAppPath as r, getAppPaths as i } from "../paths.js";
|
|
6
6
|
import { existsSync as a } from "fs";
|
|
7
7
|
import o from "koa-router";
|
|
8
8
|
//#region packages/core/loader/router.ts
|
|
9
9
|
var s = (s) => {
|
|
10
|
-
let c, l =
|
|
11
|
-
if (l) for (let
|
|
12
|
-
let
|
|
13
|
-
if (a(
|
|
14
|
-
c =
|
|
10
|
+
let c, l = r(s, "business");
|
|
11
|
+
if (l) for (let t of ["router-guard.ts", "router-guard.js"]) {
|
|
12
|
+
let r = e(l, t);
|
|
13
|
+
if (a(r)) {
|
|
14
|
+
c = n(r)(s);
|
|
15
15
|
break;
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
18
|
c || console.info("-- [router-guard] -- not router-guard.(ts|js) file");
|
|
19
19
|
let u = [];
|
|
20
|
-
|
|
21
|
-
r
|
|
22
|
-
let
|
|
23
|
-
|
|
20
|
+
i(s).forEach((r) => {
|
|
21
|
+
t(r, "router", { preProcessingFileCallback: (t) => {
|
|
22
|
+
let r = new o();
|
|
23
|
+
r.level = 0, u.push(r), n(e(t))(s, r);
|
|
24
24
|
} });
|
|
25
25
|
});
|
|
26
26
|
let d = new o();
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { runFileFn as n } from "../../utils/runFileFn.js";
|
|
1
|
+
import { loadFileFn as e } from "../../utils/loadFile.js";
|
|
2
|
+
import { runFileFn as t } from "../../utils/runFileFn.js";
|
|
4
3
|
import "../../utils/index.js";
|
|
4
|
+
import { getAppPaths as n } from "../paths.js";
|
|
5
5
|
//#region packages/core/loader/service.ts
|
|
6
6
|
var r = (r) => {
|
|
7
|
-
r.service =
|
|
8
|
-
...
|
|
9
|
-
...
|
|
7
|
+
r.service = n(r).reduce((n, i) => ({
|
|
8
|
+
...n,
|
|
9
|
+
...e(i, "service", { loadFileCallback: (e) => new (t(e)(r))() })
|
|
10
10
|
}), {});
|
|
11
11
|
};
|
|
12
12
|
//#endregion
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { __require as e } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { readFileSync as t } from "fs";
|
|
3
|
+
import { extname as n } from "path";
|
|
4
4
|
//#region packages/utils/runFileFn.ts
|
|
5
5
|
var r = !1;
|
|
6
6
|
function i(e) {
|
|
@@ -9,12 +9,12 @@ function i(e) {
|
|
|
9
9
|
function a(e) {
|
|
10
10
|
return e && typeof e == "object" && "default" in e && e.default !== void 0 ? e.default : e;
|
|
11
11
|
}
|
|
12
|
-
function o(
|
|
12
|
+
function o(t) {
|
|
13
13
|
try {
|
|
14
|
-
return e(
|
|
14
|
+
return e(t);
|
|
15
15
|
} catch (r) {
|
|
16
|
-
if (t
|
|
17
|
-
return c(), delete e.cache[e.resolve(
|
|
16
|
+
if (n(t) !== ".ts" || !s(r)) throw r;
|
|
17
|
+
return c(), delete e.cache[e.resolve(t)], e(t);
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
function s(e) {
|
|
@@ -23,11 +23,11 @@ function s(e) {
|
|
|
23
23
|
}
|
|
24
24
|
function c() {
|
|
25
25
|
if (r) return;
|
|
26
|
-
let
|
|
26
|
+
let n = l();
|
|
27
27
|
e.extensions[".ts"] = (e, r) => {
|
|
28
|
-
let { outputText: i } =
|
|
29
|
-
module:
|
|
30
|
-
target:
|
|
28
|
+
let { outputText: i } = n.transpileModule(t(r, "utf8"), { compilerOptions: {
|
|
29
|
+
module: n.ModuleKind.CommonJS,
|
|
30
|
+
target: n.ScriptTarget.ES2020,
|
|
31
31
|
esModuleInterop: !0,
|
|
32
32
|
allowSyntheticDefaultImports: !0
|
|
33
33
|
} });
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { getAuthToken } from "../../src/common/auth/index.js";
|
|
2
|
-
import { getText } from "../../src/common/language.js";
|
|
3
2
|
import { generateMenuItemData } from "../../src/common/generateMenuData.js";
|
|
4
3
|
import { Menu } from "../../../packages/react/ui/components/Menu/Menu.js";
|
|
5
4
|
import "../../../packages/react/ui/components/index.js";
|
|
6
5
|
import { useModeStore } from "../../src/stores/mode.js";
|
|
7
6
|
import { findMenuItem, leftSidebarBasePath } from "../../src/common/menu.js";
|
|
7
|
+
import { useText } from "../../src/hooks/useText.js";
|
|
8
8
|
import HeaderView from "../../src/components/BasePage/HeaderView.js";
|
|
9
9
|
import useRouterParams from "../../src/hooks/useRouterParams.js";
|
|
10
10
|
import useInit from "../../../packages/react/hooks/useInit.js";
|
|
@@ -83,6 +83,7 @@ var getRenderableHomePage = (projectInfo) => {
|
|
|
83
83
|
var Dashboard = () => {
|
|
84
84
|
const { initModeData, initData, projectInfo } = useModeStore();
|
|
85
85
|
const HeaderUserArea = dashComponents["HeaderView.userArea"];
|
|
86
|
+
const text = useText();
|
|
86
87
|
useInit(() => {
|
|
87
88
|
!initData && initModeData();
|
|
88
89
|
});
|
|
@@ -94,7 +95,7 @@ var Dashboard = () => {
|
|
|
94
95
|
if (initData && projectInfo?.menuLayout === "top") return /* @__PURE__ */ jsx(Menu, {
|
|
95
96
|
className: " w-full",
|
|
96
97
|
mode: "top",
|
|
97
|
-
items: generateMenuItemData(projectInfo.menu),
|
|
98
|
+
items: generateMenuItemData(projectInfo.menu, text),
|
|
98
99
|
selectedKey: SK,
|
|
99
100
|
onSelect: (e) => {
|
|
100
101
|
uSK(e);
|
|
@@ -107,7 +108,8 @@ var Dashboard = () => {
|
|
|
107
108
|
initData,
|
|
108
109
|
projectInfo,
|
|
109
110
|
SK,
|
|
110
|
-
nav
|
|
111
|
+
nav,
|
|
112
|
+
text
|
|
111
113
|
]);
|
|
112
114
|
useEffect(() => {
|
|
113
115
|
if (initData && projectInfo) {
|
|
@@ -165,7 +167,7 @@ var Dashboard = () => {
|
|
|
165
167
|
const getTitle = () => {
|
|
166
168
|
const title = projectInfo?.desc ?? projectInfo?.name;
|
|
167
169
|
if (!isInit.current && title) document.title = projectInfo?.name ?? title;
|
|
168
|
-
return title ?
|
|
170
|
+
return title ? text(title) : void 0;
|
|
169
171
|
};
|
|
170
172
|
return /* @__PURE__ */ jsxs("div", {
|
|
171
173
|
className: "dash-main h-screen flex flex-col overflow-hidden bg-theme-bg text-foreground",
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { registerFrontendI18nResources } from "../../src/common/language.js";
|
|
1
2
|
import { QK, leftSidebarBasePath } from "../../src/common/menu.js";
|
|
2
3
|
import Dashboard from "./Dashboard.js";
|
|
3
4
|
import { renderImportComponent } from "../../src/common/importComponent.js";
|
|
5
|
+
import { initThemeMode } from "../../src/common/theme.js";
|
|
4
6
|
import { initApp } from "../../src/main.js";
|
|
5
7
|
import { jsx } from "react/jsx-runtime";
|
|
6
8
|
import extendDashRoutes from "@tc/scalability/dash/customRoutes";
|
|
@@ -54,6 +56,8 @@ initApp(({ children }) => /* @__PURE__ */ jsx("div", {
|
|
|
54
56
|
}), {
|
|
55
57
|
routes: getDefaultPageRoutes(),
|
|
56
58
|
beforeRender: async (context) => {
|
|
59
|
+
await registerFrontendI18nResources();
|
|
60
|
+
initThemeMode();
|
|
57
61
|
if (typeof initDash === "function") await initDash(context);
|
|
58
62
|
}
|
|
59
63
|
});
|
|
@@ -1,3 +1,6 @@
|
|
|
1
1
|
import type { ProjectInfo } from "../api/baseInfo";
|
|
2
2
|
import type { MenuItemData } from "../../../packages/react/ui/components/index";
|
|
3
|
-
|
|
3
|
+
import { getText } from "./language";
|
|
4
|
+
type TextResolver = typeof getText;
|
|
5
|
+
export declare const generateMenuItemData: (data: ProjectInfo["menu"], text?: TextResolver) => MenuItemData[];
|
|
6
|
+
export {};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { getText } from "./language.js";
|
|
2
2
|
//#region frontend/src/common/generateMenuData.ts
|
|
3
|
-
var generateMenuItemData = (data) => {
|
|
3
|
+
var generateMenuItemData = (data, text = getText) => {
|
|
4
4
|
return data.map((m) => {
|
|
5
|
-
const children = m.menuType === "group" && m.subMenu.length ? generateMenuItemData(m.subMenu) : void 0;
|
|
5
|
+
const children = m.menuType === "group" && m.subMenu.length ? generateMenuItemData(m.subMenu, text) : void 0;
|
|
6
6
|
return {
|
|
7
7
|
key: m.key,
|
|
8
|
-
label:
|
|
8
|
+
label: text(m.name),
|
|
9
9
|
icon: m.icon,
|
|
10
10
|
children,
|
|
11
11
|
minWidth: 100
|
|
@@ -1,2 +1,13 @@
|
|
|
1
|
-
import type { I18nInterpolationValues, I18nTranslateOptions } from "../../../packages/react/ui/i18n/index";
|
|
1
|
+
import type { I18nAddResourcesOptions, I18nDictionary, I18nInterpolationValues, I18nLanguage, I18nResources, I18nSetResourcesOptions, I18nTranslateOptions } from "../../../packages/react/ui/i18n/index";
|
|
2
|
+
export declare const addLanguageResources: (language: I18nLanguage, messages: I18nDictionary, options?: I18nAddResourcesOptions) => void;
|
|
3
|
+
export declare const setLanguage: (language: I18nLanguage) => void;
|
|
4
|
+
export declare const setFallbackLanguage: (language: I18nLanguage) => void;
|
|
5
|
+
export declare const setResources: (resources: I18nResources, options?: I18nSetResourcesOptions) => void;
|
|
6
|
+
export declare const getCurrentLanguage: () => string;
|
|
7
|
+
export declare const getFallbackLanguage: () => string;
|
|
8
|
+
export declare const getI18nResources: () => Partial<Record<string, I18nDictionary>>;
|
|
9
|
+
export declare const getSupportedLanguages: () => string[];
|
|
10
|
+
export declare const registerFrontendI18nResources: (resources?: I18nResources) => Promise<void>;
|
|
2
11
|
export declare const getText: (key: string, fillingData?: I18nInterpolationValues, options?: I18nTranslateOptions) => string;
|
|
12
|
+
export declare const t: <T = string>(key: string, fillingData?: I18nInterpolationValues, options?: I18nTranslateOptions) => string | T;
|
|
13
|
+
export type { I18nAddResourcesOptions, I18nDictionary, I18nInterpolationValues, I18nLanguage, I18nResources, I18nSetResourcesOptions, I18nTranslateOptions, };
|
|
@@ -1,12 +1,33 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { i18nKeyPrefix } from "../language/index.js";
|
|
2
2
|
import { i18n, i18nStore } from "../../../packages/common/i18n/index.js";
|
|
3
3
|
import "../../../packages/react/ui/i18n/index.js";
|
|
4
4
|
//#region frontend/src/common/language.ts
|
|
5
|
-
|
|
6
|
-
i18nStore.getState().addResources(
|
|
5
|
+
var addLanguageResources = (language, messages, options) => {
|
|
6
|
+
i18nStore.getState().addResources(language, messages, options);
|
|
7
|
+
};
|
|
8
|
+
var setLanguage = (language) => {
|
|
9
|
+
i18nStore.getState().setLanguage(language);
|
|
10
|
+
};
|
|
11
|
+
var setFallbackLanguage = (language) => {
|
|
12
|
+
i18nStore.getState().setFallbackLanguage(language);
|
|
13
|
+
};
|
|
14
|
+
var setResources = (resources, options) => {
|
|
15
|
+
i18nStore.getState().setResources(resources, options);
|
|
16
|
+
};
|
|
17
|
+
var getCurrentLanguage = () => i18nStore.getState().language;
|
|
18
|
+
var getFallbackLanguage = () => i18nStore.getState().fallbackLanguage;
|
|
19
|
+
var getI18nResources = () => i18nStore.getState().resources;
|
|
20
|
+
var getSupportedLanguages = () => Object.keys(getI18nResources());
|
|
21
|
+
var registerFrontendI18nResources = async (resources) => {
|
|
22
|
+
const nextResources = resources ?? (await import("../language/resources.js")).frontendI18nResources;
|
|
23
|
+
Object.entries(nextResources).forEach(([language, messages]) => {
|
|
24
|
+
addLanguageResources(language, messages ?? {});
|
|
25
|
+
});
|
|
26
|
+
};
|
|
7
27
|
var getText = (key, fillingData, options) => {
|
|
8
28
|
if (key.includes("$i18n::")) return i18n(key.replace(i18nKeyPrefix, ""), fillingData, options);
|
|
9
29
|
return key;
|
|
10
30
|
};
|
|
31
|
+
var t = i18n;
|
|
11
32
|
//#endregion
|
|
12
|
-
export { getText };
|
|
33
|
+
export { addLanguageResources, getCurrentLanguage, getFallbackLanguage, getI18nResources, getSupportedLanguages, getText, registerFrontendI18nResources, setFallbackLanguage, setLanguage, setResources, t };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "../../../packages/common/rafTimer";
|
|
@@ -100,6 +100,7 @@ api.interceptors.request.use(async (config) => {
|
|
|
100
100
|
const aauto = getApiAuth();
|
|
101
101
|
const time = (/* @__PURE__ */ new Date()).getTime();
|
|
102
102
|
config.headers = {
|
|
103
|
+
"Content-Type": "application/json",
|
|
103
104
|
...config.headers,
|
|
104
105
|
s_t: time + "",
|
|
105
106
|
s_sign: md5(`${window["_signKey"]}_${time}`),
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type ThemeSwitchMode = 'light' | 'dark';
|
|
2
|
+
export declare const themeSwitchStorageKey = "tc_theme";
|
|
3
|
+
export declare const getStoredThemeMode: (storageKey?: string) => ThemeSwitchMode | null;
|
|
4
|
+
export declare const getCurrentThemeMode: (defaultValue?: ThemeSwitchMode, storageKey?: string) => ThemeSwitchMode;
|
|
5
|
+
export declare const persistThemeMode: (mode: ThemeSwitchMode, storageKey?: string) => void;
|
|
6
|
+
export declare const applyThemeMode: (mode?: ThemeSwitchMode, persist?: boolean, storageKey?: string) => void;
|
|
7
|
+
export declare const initThemeMode: (defaultValue?: ThemeSwitchMode, storageKey?: string) => ThemeSwitchMode;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
//#region frontend/src/common/theme.ts
|
|
2
|
+
var themeSwitchStorageKey = "tc_theme";
|
|
3
|
+
var canUseDocument = () => typeof document !== "undefined";
|
|
4
|
+
var canUseLocalStorage = () => typeof localStorage !== "undefined";
|
|
5
|
+
var getStoredThemeMode = (storageKey = themeSwitchStorageKey) => {
|
|
6
|
+
if (!canUseLocalStorage()) return null;
|
|
7
|
+
const value = localStorage.getItem(storageKey);
|
|
8
|
+
return value === "light" || value === "dark" ? value : null;
|
|
9
|
+
};
|
|
10
|
+
var getCurrentThemeMode = (defaultValue, storageKey = themeSwitchStorageKey) => {
|
|
11
|
+
const storedMode = getStoredThemeMode(storageKey);
|
|
12
|
+
if (storedMode) return storedMode;
|
|
13
|
+
if (defaultValue) return defaultValue;
|
|
14
|
+
if (!canUseDocument()) return "light";
|
|
15
|
+
return document.documentElement.classList.contains("dark") ? "dark" : "light";
|
|
16
|
+
};
|
|
17
|
+
var persistThemeMode = (mode, storageKey = themeSwitchStorageKey) => {
|
|
18
|
+
if (canUseLocalStorage()) localStorage.setItem(storageKey, mode);
|
|
19
|
+
};
|
|
20
|
+
var applyThemeMode = (mode = getCurrentThemeMode(), persist = false, storageKey = themeSwitchStorageKey) => {
|
|
21
|
+
if (!canUseDocument()) return;
|
|
22
|
+
const root = document.documentElement;
|
|
23
|
+
root.classList.toggle("dark", mode === "dark");
|
|
24
|
+
root.style.colorScheme = mode;
|
|
25
|
+
if (persist) persistThemeMode(mode, storageKey);
|
|
26
|
+
};
|
|
27
|
+
var initThemeMode = (defaultValue, storageKey = themeSwitchStorageKey) => {
|
|
28
|
+
const mode = getCurrentThemeMode(defaultValue, storageKey);
|
|
29
|
+
applyThemeMode(mode, false, storageKey);
|
|
30
|
+
return mode;
|
|
31
|
+
};
|
|
32
|
+
//#endregion
|
|
33
|
+
export { applyThemeMode, getCurrentThemeMode, getStoredThemeMode, initThemeMode, persistThemeMode, themeSwitchStorageKey };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { frontendLangKeys } from "../../language/index.js";
|
|
2
|
-
import { getText } from "../../common/language.js";
|
|
3
2
|
import { cn } from "../../../../packages/react/ui/lib/utils.js";
|
|
4
3
|
import "../../../../packages/react/ui/index.js";
|
|
4
|
+
import { useText } from "../../hooks/useText.js";
|
|
5
5
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
6
|
import { Boxes } from "lucide-react";
|
|
7
7
|
//#region frontend/src/components/BasePage/HeaderView.tsx
|
|
@@ -14,7 +14,7 @@ var headerThemeStyle = {
|
|
|
14
14
|
var imageLogoPattern = /^(https?:\/\/|data:image\/|\/|\.\/|\.\.\/|.*\.(svg|png|jpe?g|webp|gif)$)/i;
|
|
15
15
|
var HeaderView = (props) => {
|
|
16
16
|
const { icon, title, menu, userArea, children } = props ?? defaultProps;
|
|
17
|
-
const defaultTitle =
|
|
17
|
+
const defaultTitle = useText()(frontendLangKeys.appTitle);
|
|
18
18
|
const brandLogo = icon ? typeof icon === "string" ? imageLogoPattern.test(icon) ? /* @__PURE__ */ jsx("img", {
|
|
19
19
|
className: "h-full max-w-[112px] object-contain",
|
|
20
20
|
src: icon,
|
|
@@ -2,31 +2,47 @@ import { frontendLangKeys } from "../../language/index.js";
|
|
|
2
2
|
import { i18nStore } from "../../../../packages/common/i18n/index.js";
|
|
3
3
|
import { useI18nStore } from "../../../../packages/react/ui/i18n/useI18n.js";
|
|
4
4
|
import "../../../../packages/react/ui/i18n/index.js";
|
|
5
|
-
import {
|
|
5
|
+
import { getSupportedLanguages } from "../../common/language.js";
|
|
6
6
|
import { cn } from "../../../../packages/react/ui/lib/utils.js";
|
|
7
7
|
import { Button } from "../../../../packages/react/ui/components/Button/Button.js";
|
|
8
8
|
import { Dropdown } from "../../../../packages/react/ui/components/Dropdown/Dropdown.js";
|
|
9
9
|
import "../../../../packages/react/ui/index.js";
|
|
10
|
+
import { useText } from "../../hooks/useText.js";
|
|
10
11
|
import { useCallback, useMemo, useRef } from "react";
|
|
11
12
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
12
13
|
import { Check, ChevronDown } from "lucide-react";
|
|
13
14
|
//#region frontend/src/components/LanguageSwitch/LanguageSwitch.tsx
|
|
14
|
-
var getDefaultLanguageOptions = () => [{
|
|
15
|
-
label:
|
|
15
|
+
var getDefaultLanguageOptions = (text) => [{
|
|
16
|
+
label: text(frontendLangKeys.languageSwitchZhCN),
|
|
16
17
|
value: "zh-CN",
|
|
17
18
|
searchText: "zh-CN 中文 简体中文"
|
|
18
19
|
}, {
|
|
19
|
-
label:
|
|
20
|
+
label: text(frontendLangKeys.languageSwitchEnUS),
|
|
20
21
|
value: "en-US",
|
|
21
22
|
searchText: "en-US English"
|
|
22
23
|
}];
|
|
24
|
+
var getLanguageOptions = (text) => {
|
|
25
|
+
const baseOptions = getDefaultLanguageOptions(text);
|
|
26
|
+
const seen = new Set(baseOptions.map((option) => option.value));
|
|
27
|
+
return [...baseOptions, ...getSupportedLanguages().filter((language) => !seen.has(language)).map((language) => ({
|
|
28
|
+
label: language,
|
|
29
|
+
value: language,
|
|
30
|
+
searchText: language
|
|
31
|
+
}))];
|
|
32
|
+
};
|
|
23
33
|
var LanguageSwitch = ({ value, defaultValue, options, onChange, className, buttonClassName, placeholder, disabled, loading, clearable: _clearable, searchable: _searchable, placement = "bottom-end", getPopupContainer = "parent", ...props }) => {
|
|
24
34
|
const rootRef = useRef(null);
|
|
35
|
+
const text = useText();
|
|
25
36
|
const currentLanguage = useI18nStore((state) => state.language);
|
|
26
|
-
const mergedOptions = useMemo(() => options ??
|
|
37
|
+
const mergedOptions = useMemo(() => options ?? getLanguageOptions(text), [
|
|
38
|
+
currentLanguage,
|
|
39
|
+
options,
|
|
40
|
+
useI18nStore((state) => state.resources),
|
|
41
|
+
text
|
|
42
|
+
]);
|
|
27
43
|
const selectedLanguage = value ?? currentLanguage ?? defaultValue;
|
|
28
44
|
const selectedOption = mergedOptions.find((option) => option.value === selectedLanguage);
|
|
29
|
-
const displayText = selectedOption?.label ?? placeholder ??
|
|
45
|
+
const displayText = selectedOption?.label ?? placeholder ?? text(frontendLangKeys.languageSwitchPlaceholder);
|
|
30
46
|
const handleChange = useCallback((language) => {
|
|
31
47
|
if (!language) return;
|
|
32
48
|
const nextLanguage = String(language);
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
import { type ThemeSwitchMode } from "../../common/theme";
|
|
2
|
+
export { applyThemeMode, themeSwitchStorageKey } from "../../common/theme";
|
|
3
|
+
export type { ThemeSwitchMode } from "../../common/theme";
|
|
2
4
|
export interface ThemeSwitchProps {
|
|
3
5
|
value?: ThemeSwitchMode;
|
|
4
6
|
defaultValue?: ThemeSwitchMode;
|
|
@@ -9,6 +11,5 @@ export interface ThemeSwitchProps {
|
|
|
9
11
|
persist?: boolean;
|
|
10
12
|
storageKey?: string;
|
|
11
13
|
}
|
|
12
|
-
export declare const themeSwitchStorageKey = "tc_theme";
|
|
13
14
|
declare const ThemeSwitch: ({ value, defaultValue, onChange, disabled, className, showLabel, persist, storageKey, }: ThemeSwitchProps) => import("react/jsx-runtime").JSX.Element;
|
|
14
15
|
export default ThemeSwitch;
|
|
@@ -1,41 +1,18 @@
|
|
|
1
1
|
import { frontendLangKeys } from "../../language/index.js";
|
|
2
2
|
import { useI18nStore } from "../../../../packages/react/ui/i18n/useI18n.js";
|
|
3
3
|
import "../../../../packages/react/ui/i18n/index.js";
|
|
4
|
-
import { getText } from "../../common/language.js";
|
|
5
4
|
import { cn } from "../../../../packages/react/ui/lib/utils.js";
|
|
6
5
|
import { Switch } from "../../../../packages/react/ui/components/Switch/Switch.js";
|
|
7
6
|
import { Tooltip } from "../../../../packages/react/ui/components/Tooltip/Tooltip.js";
|
|
8
7
|
import "../../../../packages/react/ui/index.js";
|
|
8
|
+
import { useText } from "../../hooks/useText.js";
|
|
9
|
+
import { applyThemeMode, getCurrentThemeMode, persistThemeMode, themeSwitchStorageKey } from "../../common/theme.js";
|
|
9
10
|
import { useEffect, useState } from "react";
|
|
10
11
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
11
12
|
import { Moon, Sun } from "lucide-react";
|
|
12
13
|
//#region frontend/src/components/ThemeSwitch/ThemeSwitch.tsx
|
|
13
|
-
var themeSwitchStorageKey = "tc_theme";
|
|
14
|
-
var canUseDocument = () => typeof document !== "undefined";
|
|
15
|
-
var canUseLocalStorage = () => typeof localStorage !== "undefined";
|
|
16
|
-
var getStoredThemeMode = (storageKey) => {
|
|
17
|
-
if (!canUseLocalStorage()) return null;
|
|
18
|
-
const value = localStorage.getItem(storageKey);
|
|
19
|
-
return value === "light" || value === "dark" ? value : null;
|
|
20
|
-
};
|
|
21
|
-
var getCurrentThemeMode = (defaultValue, storageKey = themeSwitchStorageKey) => {
|
|
22
|
-
const storedMode = getStoredThemeMode(storageKey);
|
|
23
|
-
if (storedMode) return storedMode;
|
|
24
|
-
if (defaultValue) return defaultValue;
|
|
25
|
-
if (!canUseDocument()) return "light";
|
|
26
|
-
return document.documentElement.classList.contains("dark") ? "dark" : "light";
|
|
27
|
-
};
|
|
28
|
-
var persistThemeMode = (mode, storageKey) => {
|
|
29
|
-
if (canUseLocalStorage()) localStorage.setItem(storageKey, mode);
|
|
30
|
-
};
|
|
31
|
-
var applyThemeMode = (mode, persist, storageKey) => {
|
|
32
|
-
if (!canUseDocument()) return;
|
|
33
|
-
const root = document.documentElement;
|
|
34
|
-
root.classList.toggle("dark", mode === "dark");
|
|
35
|
-
root.style.colorScheme = mode;
|
|
36
|
-
if (persist) persistThemeMode(mode, storageKey);
|
|
37
|
-
};
|
|
38
14
|
var ThemeSwitch = ({ value, defaultValue, onChange, disabled, className, showLabel = false, persist = true, storageKey = themeSwitchStorageKey }) => {
|
|
15
|
+
const text = useText();
|
|
39
16
|
useI18nStore((state) => state.language);
|
|
40
17
|
const [internalMode, setInternalMode] = useState(() => getCurrentThemeMode(defaultValue, storageKey));
|
|
41
18
|
const isControlled = value !== void 0;
|
|
@@ -54,8 +31,8 @@ var ThemeSwitch = ({ value, defaultValue, onChange, disabled, className, showLab
|
|
|
54
31
|
if (persist) persistThemeMode(nextMode, storageKey);
|
|
55
32
|
onChange?.(nextMode);
|
|
56
33
|
};
|
|
57
|
-
const label = mode === "dark" ?
|
|
58
|
-
const tooltip = checked ?
|
|
34
|
+
const label = mode === "dark" ? text(frontendLangKeys.themeSwitchDark) : text(frontendLangKeys.themeSwitchLight);
|
|
35
|
+
const tooltip = checked ? text(frontendLangKeys.themeSwitchToLight) : text(frontendLangKeys.themeSwitchToDark);
|
|
59
36
|
return /* @__PURE__ */ jsxs("div", {
|
|
60
37
|
className: cn("inline-flex shrink-0 items-center gap-2 text-foreground", className),
|
|
61
38
|
children: [
|
|
@@ -84,4 +61,4 @@ var ThemeSwitch = ({ value, defaultValue, onChange, disabled, className, showLab
|
|
|
84
61
|
});
|
|
85
62
|
};
|
|
86
63
|
//#endregion
|
|
87
|
-
export { ThemeSwitch as default, themeSwitchStorageKey };
|
|
64
|
+
export { applyThemeMode, ThemeSwitch as default, themeSwitchStorageKey };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { applyThemeMode, getCurrentThemeMode, getStoredThemeMode, initThemeMode, persistThemeMode, themeSwitchStorageKey } from "../../common/theme.js";
|
|
2
|
+
import ThemeSwitch from "./ThemeSwitch.js";
|
|
2
3
|
//#region frontend/src/components/ThemeSwitch/index.ts
|
|
3
4
|
var ThemeSwitch_default = ThemeSwitch;
|
|
4
5
|
//#endregion
|
|
5
|
-
export { ThemeSwitch_default as default, themeSwitchStorageKey };
|
|
6
|
+
export { applyThemeMode, ThemeSwitch_default as default, getCurrentThemeMode, getStoredThemeMode, initThemeMode, persistThemeMode, themeSwitchStorageKey };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import HeaderView from "./BasePage/HeaderView.js";
|
|
2
|
+
import { applyThemeMode, getCurrentThemeMode, getStoredThemeMode, initThemeMode, persistThemeMode, themeSwitchStorageKey } from "../common/theme.js";
|
|
2
3
|
import { generateRouter } from "./Router/index.js";
|
|
3
4
|
import AsyncSelect_default from "./AsyncSelect/index.js";
|
|
4
5
|
import LanguageSwitch_default from "./LanguageSwitch/index.js";
|
|
5
|
-
import { themeSwitchStorageKey } from "./ThemeSwitch/ThemeSwitch.js";
|
|
6
6
|
import ThemeSwitch_default from "./ThemeSwitch/index.js";
|
|
7
|
-
export { AsyncSelect_default as AsyncSelect, HeaderView, LanguageSwitch_default as LanguageSwitch, ThemeSwitch_default as ThemeSwitch, generateRouter, themeSwitchStorageKey };
|
|
7
|
+
export { AsyncSelect_default as AsyncSelect, HeaderView, LanguageSwitch_default as LanguageSwitch, ThemeSwitch_default as ThemeSwitch, applyThemeMode, generateRouter, getCurrentThemeMode, getStoredThemeMode, initThemeMode, persistThemeMode, themeSwitchStorageKey };
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { frontendLangKeys } from "../../language/index.js";
|
|
2
|
-
import {
|
|
2
|
+
import { useText } from "../../hooks/useText.js";
|
|
3
3
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
4
|
//#region frontend/src/defaultPages/NotFoundPage/index.tsx
|
|
5
5
|
var NotFoundPage = () => {
|
|
6
|
+
const text = useText();
|
|
6
7
|
return /* @__PURE__ */ jsx("div", {
|
|
7
8
|
className: "flex h-full min-h-[240px] w-full items-center justify-center bg-theme-bg px-6 text-foreground",
|
|
8
9
|
children: /* @__PURE__ */ jsxs("div", {
|
|
@@ -14,11 +15,11 @@ var NotFoundPage = () => {
|
|
|
14
15
|
}),
|
|
15
16
|
/* @__PURE__ */ jsx("h1", {
|
|
16
17
|
className: "text-lg font-semibold tracking-normal",
|
|
17
|
-
children:
|
|
18
|
+
children: text(frontendLangKeys.notFoundTitle)
|
|
18
19
|
}),
|
|
19
20
|
/* @__PURE__ */ jsx("p", {
|
|
20
21
|
className: "mt-2 text-sm leading-6 text-muted-foreground",
|
|
21
|
-
children:
|
|
22
|
+
children: text(frontendLangKeys.notFoundDescription)
|
|
22
23
|
})
|
|
23
24
|
]
|
|
24
25
|
})
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { frontendLangKeys } from "../../../../language/index.js";
|
|
2
|
-
import { getText } from "../../../../common/language.js";
|
|
3
2
|
import { Drawer } from "../../../../../../packages/react/ui/components/Drawer/Drawer.js";
|
|
4
3
|
import "../../../../../../packages/react/ui/components/index.js";
|
|
5
4
|
import { request } from "../../../../common/request.js";
|
|
5
|
+
import { useText } from "../../../../hooks/useText.js";
|
|
6
6
|
import { schemaEventBus } from "../../../../stores/schemaEventBus.js";
|
|
7
7
|
import { handlingRequestErrors } from "../../../../common/fetchErrorShow.js";
|
|
8
8
|
import useExecuteOnce from "../../../../../../packages/react/hooks/useExecuteOnce.js";
|
|
@@ -28,7 +28,7 @@ var getOptionLabel = (options, value) => {
|
|
|
28
28
|
if (!matchedOption || typeof matchedOption !== "object") return void 0;
|
|
29
29
|
return matchedOption.label ?? stringifyValue(value);
|
|
30
30
|
};
|
|
31
|
-
var formatValue = (value, fieldInfo) => {
|
|
31
|
+
var formatValue = (value, fieldInfo, text) => {
|
|
32
32
|
if (isEmptyValue(value)) return EMPTY_TEXT;
|
|
33
33
|
const option = fieldInfo.option;
|
|
34
34
|
const optionLabel = getOptionLabel(option?.options ?? option?.enumList, value);
|
|
@@ -39,28 +39,33 @@ var formatValue = (value, fieldInfo) => {
|
|
|
39
39
|
return stringifyValue(item);
|
|
40
40
|
}).join(", ");
|
|
41
41
|
}
|
|
42
|
-
if (typeof value === "boolean") return value ?
|
|
42
|
+
if (typeof value === "boolean") return value ? text(frontendLangKeys.yes) : text(frontendLangKeys.no);
|
|
43
43
|
return stringifyValue(value);
|
|
44
44
|
};
|
|
45
|
-
var generateFields = (schema, data) => {
|
|
45
|
+
var generateFields = (schema, data, text) => {
|
|
46
46
|
if (!schema?.properties) return [];
|
|
47
47
|
return Object.keys(schema.properties).reduce((fields, key) => {
|
|
48
48
|
const fieldInfo = schema.properties[key];
|
|
49
49
|
if (!fieldInfo?.option || fieldInfo.option.visible === false) return fields;
|
|
50
50
|
fields.push({
|
|
51
51
|
key,
|
|
52
|
-
label:
|
|
53
|
-
value: formatValue(data?.[key], fieldInfo),
|
|
52
|
+
label: text(fieldInfo.label),
|
|
53
|
+
value: formatValue(data?.[key], fieldInfo, text),
|
|
54
54
|
level: fieldInfo.level ?? 10
|
|
55
55
|
});
|
|
56
56
|
return fields;
|
|
57
57
|
}, []).sort((a, b) => a.level - b.level);
|
|
58
58
|
};
|
|
59
59
|
var DetailPanel = memo((props) => {
|
|
60
|
+
const text = useText();
|
|
60
61
|
const [open, setOpen] = useState(true);
|
|
61
62
|
const [data, setData] = useState(props.data);
|
|
62
63
|
const { config, schema, api } = useComConfig({ comName: props.comName });
|
|
63
|
-
const fields = useMemo(() => generateFields(schema, data), [
|
|
64
|
+
const fields = useMemo(() => generateFields(schema, data, text), [
|
|
65
|
+
data,
|
|
66
|
+
schema,
|
|
67
|
+
text
|
|
68
|
+
]);
|
|
64
69
|
useExecuteOnce(async () => {
|
|
65
70
|
const fetchKey = config?.fetchKey;
|
|
66
71
|
if (fetchKey) {
|
|
@@ -73,7 +78,7 @@ var DetailPanel = memo((props) => {
|
|
|
73
78
|
return /* @__PURE__ */ jsx("div", {
|
|
74
79
|
className: "detail-panel",
|
|
75
80
|
children: /* @__PURE__ */ jsx(Drawer, {
|
|
76
|
-
title:
|
|
81
|
+
title: text(config?.title ?? ""),
|
|
77
82
|
open,
|
|
78
83
|
onClose: () => {
|
|
79
84
|
setOpen(false);
|
|
@@ -93,7 +98,7 @@ var DetailPanel = memo((props) => {
|
|
|
93
98
|
}, field.key))
|
|
94
99
|
}) : /* @__PURE__ */ jsx("div", {
|
|
95
100
|
className: "py-8 text-center text-sm text-muted-foreground",
|
|
96
|
-
children:
|
|
101
|
+
children: text(frontendLangKeys.noData)
|
|
97
102
|
})
|
|
98
103
|
})
|
|
99
104
|
});
|