@nocobase/portal-template-default 1.0.3 → 1.0.5
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 +10 -5
- package/package.json +17 -17
- package/registry/nocobase-ai/components/chat/chat-message.tsx +8 -6
- package/registry/nocobase-ai/components/chat/chat-messages.tsx +8 -3
- package/registry/nocobase-ai/components/chat/markdown-message.tsx +26 -0
- package/registry/nocobase-ai/components/chat/sub-agent-conversation.tsx +3 -3
- package/registry/nocobase-ai/demo/configuration-gate.tsx +83 -35
- package/registry/nocobase-i18n/README.md +23 -32
- package/registry/nocobase-i18n/components/language-switcher.tsx +1 -1
- package/registry/nocobase-i18n/demo/index.tsx +2 -2
- package/registry/nocobase-i18n/demo/prompt-generator.tsx +3 -2
- package/registry/nocobase-i18n/extension.tsx +3 -4
- package/registry/nocobase-i18n/index.ts +4 -3
- package/registry/nocobase-i18n/locales/en-US.ts +2 -52
- package/registry/nocobase-i18n/locales/index.ts +8 -0
- package/registry/nocobase-i18n/locales/zh-CN.ts +2 -52
- package/registry/nocobase-i18n/provider.tsx +18 -6
- package/registry/nocobase-i18n/server-resources.ts +13 -31
- package/registry/nocobase-i18n/tests/i18n-regression.mjs +14 -5
- package/registry/nocobase-route-surfaces/README.md +21 -0
- package/registry/nocobase-route-surfaces/demo/index.tsx +266 -0
- package/{src/extensions/nocobase-acl → registry/nocobase-route-surfaces}/demo/lazy-route.tsx +2 -1
- package/registry/nocobase-route-surfaces/demo/prompt-generator.tsx +90 -0
- package/registry/nocobase-route-surfaces/demo/scenarios.ts +95 -0
- package/registry/nocobase-route-surfaces/extension.tsx +119 -0
- package/registry/nocobase-route-surfaces/index.ts +7 -0
- package/registry/nocobase-route-surfaces/route-dialog.tsx +145 -0
- package/registry/nocobase-route-surfaces/route-drawer.tsx +186 -0
- package/registry/nocobase-route-surfaces/route-page.tsx +29 -0
- package/registry/nocobase-route-surfaces/route-surface-context.ts +13 -0
- package/registry/nocobase-route-surfaces/use-refine-unsaved-changes.tsx +106 -0
- package/registry/nocobase-route-surfaces/use-route-surface-close.ts +15 -0
- package/registry/nocobase-route-surfaces/use-route-surface-state.ts +65 -0
- package/registry.config.json +30 -3
- package/scripts/registry.mjs +0 -2
- package/src/App.tsx +65 -35
- package/src/app/extension.ts +1 -2
- package/src/app/extensions.tsx +0 -14
- package/src/components/app-shell/breadcrumb.tsx +67 -2
- package/src/components/app-shell/sidebar.tsx +2 -2
- package/src/components/resources/views/list-view.tsx +3 -2
- package/src/components/ui/sheet.tsx +22 -21
- package/src/lib/nocobase/client.ts +6 -1
- package/src/locales/en-US.ts +81 -0
- package/src/locales/zh-CN.ts +77 -0
- package/src/pages/users/create.tsx +76 -53
- package/src/pages/users/edit.tsx +87 -56
- package/src/pages/users/index.ts +3 -0
- package/src/pages/users/layout.tsx +15 -0
- package/src/pages/users/list.tsx +19 -21
- package/src/pages/users/role-badges.tsx +43 -0
- package/src/pages/users/role-detail.tsx +272 -0
- package/src/pages/users/role-utils.ts +6 -0
- package/src/pages/users/routes.ts +24 -0
- package/src/pages/users/show.tsx +195 -104
- package/src/pages/users/types.ts +13 -0
- package/src/providers/i18n/index.ts +3 -0
- package/{registry/nocobase-i18n → src/providers/i18n}/runtime.ts +63 -16
- package/src/providers/system-settings/context.ts +26 -0
- package/src/providers/system-settings/index.ts +2 -0
- package/src/providers/system-settings/provider.tsx +94 -0
- package/src/extensions/nocobase-acl/README.md +0 -19
- package/src/extensions/nocobase-acl/components/acl-boundary.tsx +0 -106
- package/src/extensions/nocobase-acl/components/index.ts +0 -3
- package/src/extensions/nocobase-acl/components/role-options.ts +0 -36
- package/src/extensions/nocobase-acl/components/role-switcher.tsx +0 -135
- package/src/extensions/nocobase-acl/demo/boundary-api.tsx +0 -186
- package/src/extensions/nocobase-acl/demo/components.tsx +0 -231
- package/src/extensions/nocobase-acl/demo/index.tsx +0 -505
- package/src/extensions/nocobase-acl/demo/prompt-generator.tsx +0 -134
- package/src/extensions/nocobase-acl/demo/role-switcher-prompt-generator.tsx +0 -198
- package/src/extensions/nocobase-acl/demo/scenario-section.tsx +0 -37
- package/src/extensions/nocobase-acl/extension.tsx +0 -71
- package/src/extensions/nocobase-acl/index.ts +0 -1
- package/src/extensions/nocobase-ai/README.md +0 -70
- package/src/extensions/nocobase-ai/adapters/react-hook-form.ts +0 -20
- package/src/extensions/nocobase-ai/assets/nocobase-ai-chat.svg +0 -50
- package/src/extensions/nocobase-ai/components/ai-root-provider.tsx +0 -32
- package/src/extensions/nocobase-ai/components/chat/ai-employee-avatar.tsx +0 -31
- package/src/extensions/nocobase-ai/components/chat/chat-attachment.tsx +0 -92
- package/src/extensions/nocobase-ai/components/chat/chat-compact.tsx +0 -90
- package/src/extensions/nocobase-ai/components/chat/chat-composer.tsx +0 -429
- package/src/extensions/nocobase-ai/components/chat/chat-empty-state.tsx +0 -51
- package/src/extensions/nocobase-ai/components/chat/chat-header.tsx +0 -88
- package/src/extensions/nocobase-ai/components/chat/chat-history-dialog.tsx +0 -77
- package/src/extensions/nocobase-ai/components/chat/chat-message.tsx +0 -252
- package/src/extensions/nocobase-ai/components/chat/chat-messages.tsx +0 -173
- package/src/extensions/nocobase-ai/components/chat/chat-window.tsx +0 -118
- package/src/extensions/nocobase-ai/components/chat/conversation-list.tsx +0 -343
- package/src/extensions/nocobase-ai/components/chat/markdown-message.tsx +0 -165
- package/src/extensions/nocobase-ai/components/chat/model-select-options.tsx +0 -30
- package/src/extensions/nocobase-ai/components/chat/reasoning-panel.tsx +0 -29
- package/src/extensions/nocobase-ai/components/chat/sub-agent-conversation.tsx +0 -142
- package/src/extensions/nocobase-ai/components/chat/tool-call-card.tsx +0 -316
- package/src/extensions/nocobase-ai/components/chat/user-prompt-editor.tsx +0 -99
- package/src/extensions/nocobase-ai/components/chat/work-context-chip.tsx +0 -114
- package/src/extensions/nocobase-ai/components/index.ts +0 -59
- package/src/extensions/nocobase-ai/components/page-elements/ai-form.tsx +0 -44
- package/src/extensions/nocobase-ai/components/page-elements/page-element-provider.tsx +0 -469
- package/src/extensions/nocobase-ai/components/surfaces/chat-dialog.tsx +0 -31
- package/src/extensions/nocobase-ai/components/surfaces/chat-inline.tsx +0 -18
- package/src/extensions/nocobase-ai/components/surfaces/chat-page.tsx +0 -18
- package/src/extensions/nocobase-ai/components/surfaces/chat-side-panel-layout.tsx +0 -54
- package/src/extensions/nocobase-ai/components/surfaces/chat-side-panel.tsx +0 -74
- package/src/extensions/nocobase-ai/components/surfaces/chat-surface-actions.tsx +0 -54
- package/src/extensions/nocobase-ai/components/tools/builtin-tool-renderers.tsx +0 -31
- package/src/extensions/nocobase-ai/components/tools/business-report-dialog.tsx +0 -364
- package/src/extensions/nocobase-ai/components/tools/business-report-renderer.tsx +0 -122
- package/src/extensions/nocobase-ai/components/tools/business-report-utils.tsx +0 -282
- package/src/extensions/nocobase-ai/components/tools/chart-renderer.tsx +0 -99
- package/src/extensions/nocobase-ai/components/tools/echarts-preview.tsx +0 -59
- package/src/extensions/nocobase-ai/components/tools/echarts-runtime-advanced.ts +0 -18
- package/src/extensions/nocobase-ai/components/tools/echarts-runtime-common.ts +0 -20
- package/src/extensions/nocobase-ai/components/tools/echarts-runtime-components.ts +0 -34
- package/src/extensions/nocobase-ai/components/tools/echarts-runtime-hierarchy.ts +0 -24
- package/src/extensions/nocobase-ai/components/tools/echarts-runtime.ts +0 -138
- package/src/extensions/nocobase-ai/components/tools/sub-agent-renderer.tsx +0 -67
- package/src/extensions/nocobase-ai/components/tools/suggestions-renderer.tsx +0 -59
- package/src/extensions/nocobase-ai/components/tools/tool-renderer-provider.tsx +0 -55
- package/src/extensions/nocobase-ai/components/tools/tool-renderer-utils.ts +0 -18
- package/src/extensions/nocobase-ai/components/tools/workflow-renderer.tsx +0 -108
- package/src/extensions/nocobase-ai/components/triggers/ai-chat-floating-trigger.tsx +0 -73
- package/src/extensions/nocobase-ai/components/triggers/ai-employee-shortcut.tsx +0 -149
- package/src/extensions/nocobase-ai/demo/configuration-gate.tsx +0 -49
- package/src/extensions/nocobase-ai/demo/container-showcase.tsx +0 -210
- package/src/extensions/nocobase-ai/demo/floating.tsx +0 -134
- package/src/extensions/nocobase-ai/demo/index.tsx +0 -346
- package/src/extensions/nocobase-ai/demo/interaction-showcase.tsx +0 -151
- package/src/extensions/nocobase-ai/demo/page-context-prompt-generator.tsx +0 -355
- package/src/extensions/nocobase-ai/demo/page-context.tsx +0 -884
- package/src/extensions/nocobase-ai/demo/page-element-showcase.tsx +0 -197
- package/src/extensions/nocobase-ai/demo/prompt-card.tsx +0 -41
- package/src/extensions/nocobase-ai/demo/prompt-generator.tsx +0 -452
- package/src/extensions/nocobase-ai/demo/shortcut.tsx +0 -1207
- package/src/extensions/nocobase-ai/demo/tool-cards.tsx +0 -530
- package/src/extensions/nocobase-ai/extension.tsx +0 -158
- package/src/extensions/nocobase-ai/global-ai-chat.tsx +0 -213
- package/src/extensions/nocobase-ai/index.ts +0 -3
- package/src/extensions/nocobase-ai/providers/ai-provider.tsx +0 -323
- package/src/extensions/nocobase-ai/providers/avatars.ts +0 -817
- package/src/extensions/nocobase-ai/providers/chat-context.tsx +0 -109
- package/src/extensions/nocobase-ai/providers/chat-controller.ts +0 -84
- package/src/extensions/nocobase-ai/providers/chat-message-utils.ts +0 -198
- package/src/extensions/nocobase-ai/providers/chat-provider.tsx +0 -871
- package/src/extensions/nocobase-ai/providers/chat-reducer.ts +0 -147
- package/src/extensions/nocobase-ai/providers/chat-task-utils.ts +0 -105
- package/src/extensions/nocobase-ai/providers/chat-transport.ts +0 -184
- package/src/extensions/nocobase-ai/providers/form-registry.tsx +0 -271
- package/src/extensions/nocobase-ai/providers/frontend-tool-registry.tsx +0 -231
- package/src/extensions/nocobase-ai/providers/index.ts +0 -61
- package/src/extensions/nocobase-ai/providers/model.ts +0 -32
- package/src/extensions/nocobase-ai/providers/page-context.tsx +0 -136
- package/src/extensions/nocobase-ai/providers/stream-coalescer.ts +0 -60
- package/src/extensions/nocobase-ai/providers/stream-event-utils.ts +0 -82
- package/src/extensions/nocobase-ai/providers/stream-parser.ts +0 -61
- package/src/extensions/nocobase-ai/providers/sub-agent-stream.ts +0 -316
- package/src/extensions/nocobase-ai/providers/types.ts +0 -183
- package/src/extensions/nocobase-ai/providers/ui-message-stream.ts +0 -463
- package/src/extensions/nocobase-ai/providers/use-automatic-tool-approval.ts +0 -94
- package/src/extensions/nocobase-ai/providers/use-chat-attachments.ts +0 -206
- package/src/extensions/nocobase-ai/providers/use-chat-message-actions.ts +0 -554
- package/src/extensions/nocobase-ai/providers/use-chat-runtime.ts +0 -210
- package/src/extensions/nocobase-ai/providers/use-chat-work-context.ts +0 -93
- package/src/extensions/nocobase-ai/providers/use-conversation-catalog.ts +0 -108
- package/src/extensions/nocobase-ai/providers/use-conversation-history.ts +0 -178
- package/src/extensions/nocobase-ai/services/index.ts +0 -7
- package/src/extensions/nocobase-ai/services/nocobase-ai-service.ts +0 -454
- package/src/extensions/nocobase-ai/services/types.ts +0 -82
- /package/{registry/nocobase-i18n → src/providers/i18n}/i18n-provider.ts +0 -0
- /package/{registry/nocobase-i18n → src/providers/i18n}/locale-store.ts +0 -0
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
import * as React from "react"
|
|
2
|
-
import { Dialog as SheetPrimitive } from "@base-ui/react/dialog"
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { Dialog as SheetPrimitive } from "@base-ui/react/dialog";
|
|
3
3
|
|
|
4
|
-
import { cn } from "@/lib/utils"
|
|
5
|
-
import { Button } from "@/components/ui/button"
|
|
6
|
-
import { XIcon } from "lucide-react"
|
|
4
|
+
import { cn } from "@/lib/utils";
|
|
5
|
+
import { Button } from "@/components/ui/button";
|
|
6
|
+
import { XIcon } from "lucide-react";
|
|
7
7
|
|
|
8
8
|
function Sheet({ ...props }: SheetPrimitive.Root.Props) {
|
|
9
|
-
return <SheetPrimitive.Root data-slot="sheet" {...props}
|
|
9
|
+
return <SheetPrimitive.Root data-slot="sheet" {...props} />;
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
function SheetTrigger({ ...props }: SheetPrimitive.Trigger.Props) {
|
|
13
|
-
return <SheetPrimitive.Trigger data-slot="sheet-trigger" {...props}
|
|
13
|
+
return <SheetPrimitive.Trigger data-slot="sheet-trigger" {...props} />;
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
function SheetClose({ ...props }: SheetPrimitive.Close.Props) {
|
|
17
|
-
return <SheetPrimitive.Close data-slot="sheet-close" {...props}
|
|
17
|
+
return <SheetPrimitive.Close data-slot="sheet-close" {...props} />;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
function SheetPortal({ ...props }: SheetPrimitive.Portal.Props) {
|
|
21
|
-
return <SheetPrimitive.Portal data-slot="sheet-portal" {...props}
|
|
21
|
+
return <SheetPrimitive.Portal data-slot="sheet-portal" {...props} />;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
function SheetOverlay({ className, ...props }: SheetPrimitive.Backdrop.Props) {
|
|
@@ -31,7 +31,7 @@ function SheetOverlay({ className, ...props }: SheetPrimitive.Backdrop.Props) {
|
|
|
31
31
|
)}
|
|
32
32
|
{...props}
|
|
33
33
|
/>
|
|
34
|
-
)
|
|
34
|
+
);
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
function SheetContent({
|
|
@@ -39,10 +39,12 @@ function SheetContent({
|
|
|
39
39
|
children,
|
|
40
40
|
side = "right",
|
|
41
41
|
showCloseButton = true,
|
|
42
|
+
closeLabel = "Close",
|
|
42
43
|
...props
|
|
43
44
|
}: SheetPrimitive.Popup.Props & {
|
|
44
|
-
side?: "top" | "right" | "bottom" | "left"
|
|
45
|
-
showCloseButton?: boolean
|
|
45
|
+
side?: "top" | "right" | "bottom" | "left";
|
|
46
|
+
showCloseButton?: boolean;
|
|
47
|
+
closeLabel?: string;
|
|
46
48
|
}) {
|
|
47
49
|
return (
|
|
48
50
|
<SheetPortal>
|
|
@@ -68,14 +70,13 @@ function SheetContent({
|
|
|
68
70
|
/>
|
|
69
71
|
}
|
|
70
72
|
>
|
|
71
|
-
<XIcon
|
|
72
|
-
|
|
73
|
-
<span className="sr-only">Close</span>
|
|
73
|
+
<XIcon />
|
|
74
|
+
<span className="sr-only">{closeLabel}</span>
|
|
74
75
|
</SheetPrimitive.Close>
|
|
75
76
|
)}
|
|
76
77
|
</SheetPrimitive.Popup>
|
|
77
78
|
</SheetPortal>
|
|
78
|
-
)
|
|
79
|
+
);
|
|
79
80
|
}
|
|
80
81
|
|
|
81
82
|
function SheetHeader({ className, ...props }: React.ComponentProps<"div">) {
|
|
@@ -85,7 +86,7 @@ function SheetHeader({ className, ...props }: React.ComponentProps<"div">) {
|
|
|
85
86
|
className={cn("flex flex-col gap-0.5 p-4", className)}
|
|
86
87
|
{...props}
|
|
87
88
|
/>
|
|
88
|
-
)
|
|
89
|
+
);
|
|
89
90
|
}
|
|
90
91
|
|
|
91
92
|
function SheetFooter({ className, ...props }: React.ComponentProps<"div">) {
|
|
@@ -95,7 +96,7 @@ function SheetFooter({ className, ...props }: React.ComponentProps<"div">) {
|
|
|
95
96
|
className={cn("mt-auto flex flex-col gap-2 p-4", className)}
|
|
96
97
|
{...props}
|
|
97
98
|
/>
|
|
98
|
-
)
|
|
99
|
+
);
|
|
99
100
|
}
|
|
100
101
|
|
|
101
102
|
function SheetTitle({ className, ...props }: SheetPrimitive.Title.Props) {
|
|
@@ -108,7 +109,7 @@ function SheetTitle({ className, ...props }: SheetPrimitive.Title.Props) {
|
|
|
108
109
|
)}
|
|
109
110
|
{...props}
|
|
110
111
|
/>
|
|
111
|
-
)
|
|
112
|
+
);
|
|
112
113
|
}
|
|
113
114
|
|
|
114
115
|
function SheetDescription({
|
|
@@ -121,7 +122,7 @@ function SheetDescription({
|
|
|
121
122
|
className={cn("text-sm text-muted-foreground", className)}
|
|
122
123
|
{...props}
|
|
123
124
|
/>
|
|
124
|
-
)
|
|
125
|
+
);
|
|
125
126
|
}
|
|
126
127
|
|
|
127
128
|
export {
|
|
@@ -133,4 +134,4 @@ export {
|
|
|
133
134
|
SheetFooter,
|
|
134
135
|
SheetTitle,
|
|
135
136
|
SheetDescription,
|
|
136
|
-
}
|
|
137
|
+
};
|
|
@@ -58,6 +58,7 @@ const unwrapPayload = (
|
|
|
58
58
|
|
|
59
59
|
export class NocoBaseClient {
|
|
60
60
|
private readonly apiOrigin?: string;
|
|
61
|
+
private runtimeLocale?: string;
|
|
61
62
|
|
|
62
63
|
constructor(
|
|
63
64
|
private readonly apiUrl = API_URL,
|
|
@@ -117,7 +118,7 @@ export class NocoBaseClient {
|
|
|
117
118
|
}
|
|
118
119
|
|
|
119
120
|
getLocale() {
|
|
120
|
-
return this.getStoredLocale() ?? getBrowserLocale();
|
|
121
|
+
return this.getStoredLocale() ?? this.runtimeLocale ?? getBrowserLocale();
|
|
121
122
|
}
|
|
122
123
|
|
|
123
124
|
setLocale(locale?: string | null) {
|
|
@@ -126,6 +127,10 @@ export class NocoBaseClient {
|
|
|
126
127
|
else localStorage.removeItem(NOCOBASE_LOCALE_KEY);
|
|
127
128
|
}
|
|
128
129
|
|
|
130
|
+
setRuntimeLocale(locale?: string | null) {
|
|
131
|
+
this.runtimeLocale = locale || undefined;
|
|
132
|
+
}
|
|
133
|
+
|
|
129
134
|
buildUrl(endpoint: string, query?: Record<string, QueryValue>) {
|
|
130
135
|
const base = `${this.apiUrl.replace(/\/$/, "")}/${endpoint.replace(
|
|
131
136
|
/^\//,
|
package/src/locales/en-US.ts
CHANGED
|
@@ -1,11 +1,63 @@
|
|
|
1
1
|
export const starter = {
|
|
2
|
+
"shell.workspace": "AI application workspace",
|
|
3
|
+
"shell.footer.freedom": "AI builds freely.",
|
|
4
|
+
"shell.footer.reliability": "NocoBase keeps it reliable.",
|
|
5
|
+
"auth.signOut": "Sign out",
|
|
6
|
+
"auth.signingOut": "Signing out...",
|
|
7
|
+
"buttons.apply": "Apply",
|
|
8
|
+
"buttons.clear": "Clear",
|
|
9
|
+
"buttons.undo": "Undo",
|
|
10
|
+
"pages.error.title": "Page not found.",
|
|
11
|
+
"pages.error.description": "The page you're looking for does not exist.",
|
|
12
|
+
"pages.error.backHome": "Back to homepage",
|
|
13
|
+
"table.filter.text.placeholder": "Filter by...",
|
|
14
|
+
"table.filter.numeric.placeholder": "Filter by...",
|
|
15
|
+
"table.filter.combobox.placeholder": "Select...",
|
|
16
|
+
"table.filter.combobox.search": "Search...",
|
|
17
|
+
"table.filter.combobox.noResults": "Results not found.",
|
|
18
|
+
"table.filter.operator.placeholder": "Search operator...",
|
|
19
|
+
"table.filter.operator.noResults": "No operator found.",
|
|
20
|
+
"table.filter.operator.eq": "Equals",
|
|
21
|
+
"table.filter.operator.ne": "Not equals",
|
|
22
|
+
"table.filter.operator.lt": "Less than",
|
|
23
|
+
"table.filter.operator.gt": "Greater than",
|
|
24
|
+
"table.filter.operator.lte": "Less than or equal",
|
|
25
|
+
"table.filter.operator.gte": "Greater than or equal",
|
|
26
|
+
"table.filter.operator.in": "Includes in an array",
|
|
27
|
+
"table.filter.operator.nin": "Not includes in an array",
|
|
28
|
+
"table.filter.operator.ina": "Includes in an array (case sensitive)",
|
|
29
|
+
"table.filter.operator.nina": "Not includes in an array (case sensitive)",
|
|
30
|
+
"table.filter.operator.contains": "Contains",
|
|
31
|
+
"table.filter.operator.ncontains": "Not contains",
|
|
32
|
+
"table.filter.operator.containss": "Contains (case sensitive)",
|
|
33
|
+
"table.filter.operator.ncontainss": "Not contains (case sensitive)",
|
|
34
|
+
"table.filter.operator.between": "Between",
|
|
35
|
+
"table.filter.operator.nbetween": "Not between",
|
|
36
|
+
"table.filter.operator.null": "Is null",
|
|
37
|
+
"table.filter.operator.nnull": "Is not null",
|
|
38
|
+
"table.filter.operator.startswith": "Starts with",
|
|
39
|
+
"table.filter.operator.nstartswith": "Not starts with",
|
|
40
|
+
"table.filter.operator.startswiths": "Starts with (case sensitive)",
|
|
41
|
+
"table.filter.operator.nstartswiths": "Not starts with (case sensitive)",
|
|
42
|
+
"table.filter.operator.endswith": "Ends with",
|
|
43
|
+
"table.filter.operator.nendswith": "Not ends with",
|
|
44
|
+
"table.filter.operator.endswiths": "Ends with (case sensitive)",
|
|
45
|
+
"table.filter.operator.nendswiths": "Not ends with (case sensitive)",
|
|
46
|
+
"table.filter.operator.eqs": "Equals (case sensitive)",
|
|
47
|
+
"table.filter.operator.nes": "Not equals (case sensitive)",
|
|
2
48
|
"buttons.create": "Create",
|
|
3
49
|
"buttons.edit": "Edit",
|
|
4
50
|
"buttons.show": "View",
|
|
5
51
|
"buttons.delete": "Delete",
|
|
6
52
|
"buttons.refresh": "Refresh",
|
|
7
53
|
"buttons.cancel": "Cancel",
|
|
54
|
+
"buttons.close": "Close",
|
|
8
55
|
"buttons.confirm": "Are you sure?",
|
|
56
|
+
"unsavedChanges.title": "Discard unsaved changes?",
|
|
57
|
+
"unsavedChanges.description":
|
|
58
|
+
"Your changes have not been saved. Leaving now will discard them.",
|
|
59
|
+
"unsavedChanges.stay": "Keep editing",
|
|
60
|
+
"unsavedChanges.leave": "Discard changes",
|
|
9
61
|
"views.create.title": "Create {{resource}}",
|
|
10
62
|
"views.create.description":
|
|
11
63
|
"Add a new {{resource}} to your NocoBase workspace.",
|
|
@@ -52,6 +104,14 @@ export const app = {
|
|
|
52
104
|
"users.actions.view": "View user",
|
|
53
105
|
"users.actions.edit": "Edit user",
|
|
54
106
|
"users.actions.delete": "Delete user",
|
|
107
|
+
"users.drawer.create.title": "Create user",
|
|
108
|
+
"users.drawer.create.description":
|
|
109
|
+
"Add a user who can sign in to this NocoBase application.",
|
|
110
|
+
"users.drawer.edit.title": "Edit user",
|
|
111
|
+
"users.drawer.edit.description":
|
|
112
|
+
"Update this user's identity and contact information.",
|
|
113
|
+
"users.drawer.show.description":
|
|
114
|
+
"Review this user's identity, contact information, and roles.",
|
|
55
115
|
"users.form.create.submit": "Create user",
|
|
56
116
|
"users.form.create.submitting": "Creating...",
|
|
57
117
|
"users.form.edit.submit": "Save changes",
|
|
@@ -75,8 +135,29 @@ export const app = {
|
|
|
75
135
|
"users.detail.timestamps": "Timestamps",
|
|
76
136
|
"users.detail.noRoles": "No assigned roles",
|
|
77
137
|
"users.detail.unnamed": "Unnamed user",
|
|
138
|
+
"users.detail.loadError.title": "Unable to load user",
|
|
139
|
+
"users.detail.loadError.description":
|
|
140
|
+
"The user may no longer exist, or you may not have permission to view it.",
|
|
78
141
|
"users.ai.table": "Users table",
|
|
79
142
|
"users.ai.detail": "User details",
|
|
80
143
|
"users.ai.createForm": "Create user form",
|
|
81
144
|
"users.ai.editForm": "Edit user form",
|
|
145
|
+
"common.yes": "Yes",
|
|
146
|
+
"common.no": "No",
|
|
147
|
+
"roles.drawer.description": "Review the role associated with this user.",
|
|
148
|
+
"roles.fields.name": "Name",
|
|
149
|
+
"roles.fields.title": "Title",
|
|
150
|
+
"roles.fields.description": "Description",
|
|
151
|
+
"roles.fields.default": "Default role",
|
|
152
|
+
"roles.fields.hidden": "Hidden",
|
|
153
|
+
"roles.fields.allowConfigure": "Can configure",
|
|
154
|
+
"roles.fields.createdAt": "Created at",
|
|
155
|
+
"roles.fields.updatedAt": "Updated at",
|
|
156
|
+
"roles.detail.identity": "Role identity",
|
|
157
|
+
"roles.detail.settings": "Settings",
|
|
158
|
+
"roles.detail.actions": "Allowed actions",
|
|
159
|
+
"roles.detail.timestamps": "Timestamps",
|
|
160
|
+
"roles.detail.unavailable":
|
|
161
|
+
"Additional role details are unavailable. Showing the relation data included with the user.",
|
|
162
|
+
"roles.ai.detail": "Role details",
|
|
82
163
|
} as const;
|
package/src/locales/zh-CN.ts
CHANGED
|
@@ -1,11 +1,62 @@
|
|
|
1
1
|
export const starter = {
|
|
2
|
+
"shell.workspace": "AI 应用工作区",
|
|
3
|
+
"shell.footer.freedom": "AI 自由构建。",
|
|
4
|
+
"shell.footer.reliability": "NocoBase 保障可靠运行。",
|
|
5
|
+
"auth.signOut": "退出登录",
|
|
6
|
+
"auth.signingOut": "正在退出...",
|
|
7
|
+
"buttons.apply": "应用",
|
|
8
|
+
"buttons.clear": "清除",
|
|
9
|
+
"buttons.undo": "撤销",
|
|
10
|
+
"pages.error.title": "页面不存在",
|
|
11
|
+
"pages.error.description": "你访问的页面不存在。",
|
|
12
|
+
"pages.error.backHome": "返回首页",
|
|
13
|
+
"table.filter.text.placeholder": "输入筛选内容...",
|
|
14
|
+
"table.filter.numeric.placeholder": "输入筛选数值...",
|
|
15
|
+
"table.filter.combobox.placeholder": "请选择...",
|
|
16
|
+
"table.filter.combobox.search": "搜索...",
|
|
17
|
+
"table.filter.combobox.noResults": "没有找到结果。",
|
|
18
|
+
"table.filter.operator.placeholder": "搜索操作符...",
|
|
19
|
+
"table.filter.operator.noResults": "没有找到操作符。",
|
|
20
|
+
"table.filter.operator.eq": "等于",
|
|
21
|
+
"table.filter.operator.ne": "不等于",
|
|
22
|
+
"table.filter.operator.lt": "小于",
|
|
23
|
+
"table.filter.operator.gt": "大于",
|
|
24
|
+
"table.filter.operator.lte": "小于或等于",
|
|
25
|
+
"table.filter.operator.gte": "大于或等于",
|
|
26
|
+
"table.filter.operator.in": "包含于数组",
|
|
27
|
+
"table.filter.operator.nin": "不包含于数组",
|
|
28
|
+
"table.filter.operator.ina": "包含于数组(区分大小写)",
|
|
29
|
+
"table.filter.operator.nina": "不包含于数组(区分大小写)",
|
|
30
|
+
"table.filter.operator.contains": "包含",
|
|
31
|
+
"table.filter.operator.ncontains": "不包含",
|
|
32
|
+
"table.filter.operator.containss": "包含(区分大小写)",
|
|
33
|
+
"table.filter.operator.ncontainss": "不包含(区分大小写)",
|
|
34
|
+
"table.filter.operator.between": "介于",
|
|
35
|
+
"table.filter.operator.nbetween": "不介于",
|
|
36
|
+
"table.filter.operator.null": "为空",
|
|
37
|
+
"table.filter.operator.nnull": "不为空",
|
|
38
|
+
"table.filter.operator.startswith": "开头是",
|
|
39
|
+
"table.filter.operator.nstartswith": "开头不是",
|
|
40
|
+
"table.filter.operator.startswiths": "开头是(区分大小写)",
|
|
41
|
+
"table.filter.operator.nstartswiths": "开头不是(区分大小写)",
|
|
42
|
+
"table.filter.operator.endswith": "结尾是",
|
|
43
|
+
"table.filter.operator.nendswith": "结尾不是",
|
|
44
|
+
"table.filter.operator.endswiths": "结尾是(区分大小写)",
|
|
45
|
+
"table.filter.operator.nendswiths": "结尾不是(区分大小写)",
|
|
46
|
+
"table.filter.operator.eqs": "等于(区分大小写)",
|
|
47
|
+
"table.filter.operator.nes": "不等于(区分大小写)",
|
|
2
48
|
"buttons.create": "新建",
|
|
3
49
|
"buttons.edit": "编辑",
|
|
4
50
|
"buttons.show": "查看",
|
|
5
51
|
"buttons.delete": "删除",
|
|
6
52
|
"buttons.refresh": "刷新",
|
|
7
53
|
"buttons.cancel": "取消",
|
|
54
|
+
"buttons.close": "关闭",
|
|
8
55
|
"buttons.confirm": "确定要执行此操作吗?",
|
|
56
|
+
"unsavedChanges.title": "放弃未保存的修改?",
|
|
57
|
+
"unsavedChanges.description": "当前修改尚未保存,离开后这些修改将会丢失。",
|
|
58
|
+
"unsavedChanges.stay": "继续编辑",
|
|
59
|
+
"unsavedChanges.leave": "放弃修改",
|
|
9
60
|
"views.create.title": "新建{{resource}}",
|
|
10
61
|
"views.create.description": "在 NocoBase 工作区中添加新的{{resource}}。",
|
|
11
62
|
"views.edit.title": "编辑{{resource}}",
|
|
@@ -49,6 +100,11 @@ export const app = {
|
|
|
49
100
|
"users.actions.view": "查看用户",
|
|
50
101
|
"users.actions.edit": "编辑用户",
|
|
51
102
|
"users.actions.delete": "删除用户",
|
|
103
|
+
"users.drawer.create.title": "新建用户",
|
|
104
|
+
"users.drawer.create.description": "添加可以登录此 NocoBase 应用的用户。",
|
|
105
|
+
"users.drawer.edit.title": "编辑用户",
|
|
106
|
+
"users.drawer.edit.description": "更新用户的身份和联系方式。",
|
|
107
|
+
"users.drawer.show.description": "查看用户的身份、联系方式和关联角色。",
|
|
52
108
|
"users.form.create.submit": "创建用户",
|
|
53
109
|
"users.form.create.submitting": "正在创建...",
|
|
54
110
|
"users.form.edit.submit": "保存修改",
|
|
@@ -72,8 +128,29 @@ export const app = {
|
|
|
72
128
|
"users.detail.timestamps": "时间信息",
|
|
73
129
|
"users.detail.noRoles": "尚未分配角色",
|
|
74
130
|
"users.detail.unnamed": "未命名用户",
|
|
131
|
+
"users.detail.loadError.title": "无法加载用户",
|
|
132
|
+
"users.detail.loadError.description":
|
|
133
|
+
"该用户可能已不存在,或者你没有权限查看此用户。",
|
|
75
134
|
"users.ai.table": "用户表格",
|
|
76
135
|
"users.ai.detail": "用户详情",
|
|
77
136
|
"users.ai.createForm": "新建用户表单",
|
|
78
137
|
"users.ai.editForm": "编辑用户表单",
|
|
138
|
+
"common.yes": "是",
|
|
139
|
+
"common.no": "否",
|
|
140
|
+
"roles.drawer.description": "查看与当前用户关联的角色信息。",
|
|
141
|
+
"roles.fields.name": "名称",
|
|
142
|
+
"roles.fields.title": "标题",
|
|
143
|
+
"roles.fields.description": "描述",
|
|
144
|
+
"roles.fields.default": "默认角色",
|
|
145
|
+
"roles.fields.hidden": "隐藏",
|
|
146
|
+
"roles.fields.allowConfigure": "允许配置",
|
|
147
|
+
"roles.fields.createdAt": "创建时间",
|
|
148
|
+
"roles.fields.updatedAt": "更新时间",
|
|
149
|
+
"roles.detail.identity": "角色标识",
|
|
150
|
+
"roles.detail.settings": "角色设置",
|
|
151
|
+
"roles.detail.actions": "允许的操作",
|
|
152
|
+
"roles.detail.timestamps": "时间信息",
|
|
153
|
+
"roles.detail.unavailable":
|
|
154
|
+
"无法加载更多角色详情,当前展示用户关联数据中已有的信息。",
|
|
155
|
+
"roles.ai.detail": "角色详情",
|
|
79
156
|
} as const;
|
|
@@ -1,30 +1,67 @@
|
|
|
1
1
|
import { type HttpError, useTranslate } from "@refinedev/core";
|
|
2
2
|
import { useForm } from "@refinedev/react-hook-form";
|
|
3
3
|
import { useMemo } from "react";
|
|
4
|
-
import { useNavigate } from "react-router";
|
|
5
4
|
|
|
6
|
-
import { CreateView } from "@/components/resources/views/create-view";
|
|
7
5
|
import { Button } from "@/components/ui/button";
|
|
8
|
-
import { Card, CardContent } from "@/components/ui/card";
|
|
9
6
|
import { Form } from "@/components/ui/form";
|
|
10
7
|
import { useAIForm, type AIFormField } from "@/extensions/nocobase-ai";
|
|
8
|
+
import {
|
|
9
|
+
RouteDrawer,
|
|
10
|
+
RouteDrawerFooter,
|
|
11
|
+
useRefineUnsavedChangesGuard,
|
|
12
|
+
useRouteSurfaceClose,
|
|
13
|
+
} from "@/extensions/nocobase-route-surfaces";
|
|
11
14
|
import {
|
|
12
15
|
applyAIUserFormValues,
|
|
13
16
|
getAIUserFormFields,
|
|
14
17
|
getAIUserFormValues,
|
|
15
18
|
} from "./form-context";
|
|
16
19
|
import { UserFormFields } from "./form-fields";
|
|
20
|
+
import { userRoutes } from "./routes";
|
|
17
21
|
import type { UserFormValues, UserRecord } from "./types";
|
|
18
22
|
|
|
19
23
|
export const UserCreate = () => {
|
|
20
24
|
const translate = useTranslate();
|
|
21
|
-
const
|
|
25
|
+
const { beforeClose, confirmation } = useRefineUnsavedChangesGuard();
|
|
26
|
+
|
|
27
|
+
return (
|
|
28
|
+
<>
|
|
29
|
+
<RouteDrawer
|
|
30
|
+
title={translate(
|
|
31
|
+
"users.drawer.create.title",
|
|
32
|
+
{ ns: "app" },
|
|
33
|
+
"Create user"
|
|
34
|
+
)}
|
|
35
|
+
description={translate(
|
|
36
|
+
"users.drawer.create.description",
|
|
37
|
+
{ ns: "app" },
|
|
38
|
+
"Add a user who can sign in to this NocoBase application."
|
|
39
|
+
)}
|
|
40
|
+
closeLabel={translate("buttons.close", "Close")}
|
|
41
|
+
closeTo={userRoutes.list}
|
|
42
|
+
beforeClose={beforeClose}
|
|
43
|
+
>
|
|
44
|
+
<UserCreateForm />
|
|
45
|
+
</RouteDrawer>
|
|
46
|
+
{confirmation}
|
|
47
|
+
</>
|
|
48
|
+
);
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
function UserCreateForm() {
|
|
52
|
+
const translate = useTranslate();
|
|
53
|
+
const close = useRouteSurfaceClose();
|
|
22
54
|
const {
|
|
23
55
|
refineCore: { onFinish },
|
|
24
56
|
...form
|
|
25
57
|
} = useForm<UserRecord, HttpError, UserFormValues>({
|
|
26
58
|
refineCoreProps: {
|
|
27
|
-
|
|
59
|
+
resource: "users",
|
|
60
|
+
action: "create",
|
|
61
|
+
redirect: false,
|
|
62
|
+
onMutationSuccess: () => {
|
|
63
|
+
void close({ skipBeforeClose: true });
|
|
64
|
+
},
|
|
28
65
|
},
|
|
29
66
|
defaultValues: {
|
|
30
67
|
nickname: "",
|
|
@@ -34,7 +71,6 @@ export const UserCreate = () => {
|
|
|
34
71
|
password: "",
|
|
35
72
|
},
|
|
36
73
|
});
|
|
37
|
-
|
|
38
74
|
const aiFields = useMemo<AIFormField[]>(
|
|
39
75
|
() => getAIUserFormFields(translate),
|
|
40
76
|
[translate]
|
|
@@ -48,51 +84,38 @@ export const UserCreate = () => {
|
|
|
48
84
|
});
|
|
49
85
|
|
|
50
86
|
return (
|
|
51
|
-
<
|
|
52
|
-
<
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
{
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
<Button
|
|
85
|
-
type="button"
|
|
86
|
-
variant="outline"
|
|
87
|
-
onClick={() => navigate(-1)}
|
|
88
|
-
>
|
|
89
|
-
{translate("users.form.cancel", { ns: "app" }, "Cancel")}
|
|
90
|
-
</Button>
|
|
91
|
-
</div>
|
|
92
|
-
</form>
|
|
93
|
-
</Form>
|
|
94
|
-
</CardContent>
|
|
95
|
-
</Card>
|
|
96
|
-
</CreateView>
|
|
87
|
+
<Form {...form}>
|
|
88
|
+
<form
|
|
89
|
+
ref={aiFormRef}
|
|
90
|
+
onSubmit={form.handleSubmit((values) => onFinish(values))}
|
|
91
|
+
className="flex min-h-0 flex-1 flex-col"
|
|
92
|
+
>
|
|
93
|
+
<div className="resource-form min-h-0 flex-1 overflow-y-auto px-5 py-5">
|
|
94
|
+
<UserFormFields form={form} includePassword translate={translate} />
|
|
95
|
+
</div>
|
|
96
|
+
<RouteDrawerFooter className="flex-row justify-end">
|
|
97
|
+
<Button type="button" variant="outline" onClick={() => void close()}>
|
|
98
|
+
{translate("users.form.cancel", { ns: "app" }, "Cancel")}
|
|
99
|
+
</Button>
|
|
100
|
+
<Button
|
|
101
|
+
type="submit"
|
|
102
|
+
{...form.saveButtonProps}
|
|
103
|
+
disabled={form.formState.isSubmitting}
|
|
104
|
+
>
|
|
105
|
+
{form.formState.isSubmitting
|
|
106
|
+
? translate(
|
|
107
|
+
"users.form.create.submitting",
|
|
108
|
+
{ ns: "app" },
|
|
109
|
+
"Creating..."
|
|
110
|
+
)
|
|
111
|
+
: translate(
|
|
112
|
+
"users.form.create.submit",
|
|
113
|
+
{ ns: "app" },
|
|
114
|
+
"Create user"
|
|
115
|
+
)}
|
|
116
|
+
</Button>
|
|
117
|
+
</RouteDrawerFooter>
|
|
118
|
+
</form>
|
|
119
|
+
</Form>
|
|
97
120
|
);
|
|
98
|
-
}
|
|
121
|
+
}
|