Skip to content

Commit eb3854b

Browse files
authored
Merge pull request #721 from sudoischenny/main
Add toast notifications & loading message type.
2 parents b395356 + 56d2086 commit eb3854b

File tree

11 files changed

+174
-9
lines changed

11 files changed

+174
-9
lines changed

.vscode/settings.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"workbench.colorCustomizations": {
3+
"activityBar.background": "#2A3012",
4+
"titleBar.activeBackground": "#3B431A",
5+
"titleBar.activeForeground": "#F9FAF2"
6+
}
7+
}

client/packages/lowcoder/src/comps/hooks/hookComp.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import { useInterval, useTitle, useWindowSize } from "react-use";
2929
import { useCurrentUser } from "util/currentUser";
3030
import { LocalStorageComp } from "./localStorageComp";
3131
import { MessageComp } from "./messageComp";
32+
import { ToastComp } from "./toastComp";
3233
import { ThemeComp } from "./themeComp";
3334
import UrlParamsHookComp from "./UrlParamsHookComp";
3435
import { UtilsComp } from "./utilsComp";
@@ -94,6 +95,7 @@ const HookMap: HookCompMapRawType = {
9495
momentJsLib: DayJsLib, // old components use this hook
9596
utils: UtilsComp,
9697
message: MessageComp,
98+
toast: ToastComp,
9799
localStorage: LocalStorageComp,
98100
modal: ModalComp,
99101
meeting: VideoMeetingControllerComp,

client/packages/lowcoder/src/comps/hooks/hookCompTypes.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ const AllHookComp = [
1212
"momentJsLib",
1313
"utils",
1414
"message",
15+
"toast",
1516
"localStorage",
1617
"currentUser",
1718
"screenInfo",
@@ -58,6 +59,7 @@ const HookCompConfig: Record<
5859
},
5960
utils: { category: "hide" },
6061
message: { category: "hide" },
62+
toast: { category: "hide" },
6163
};
6264

6365
// Get hook component category

client/packages/lowcoder/src/comps/hooks/hookListComp.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ const defaultHookListValue = [
1919
{ compType: "lodashJsLib", name: "_" },
2020
{ compType: "utils", name: "utils" },
2121
{ compType: "message", name: "message" },
22+
{ compType: "toast", name: "toast" },
2223
{ compType: "localStorage", name: "localStorage" },
2324
{ compType: "currentUser", name: "currentUser" },
2425
{ compType: "screenInfo", name: "screenInfo" },

client/packages/lowcoder/src/comps/hooks/messageComp.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ const params: ParamsConfig = [
1111
{ name: "options", type: "JSON" },
1212
];
1313

14-
const showMessage = (params: EvalParamType[], level: "info" | "success" | "warning" | "error") => {
14+
const showMessage = (params: EvalParamType[], level: "info" | "success" | "loading" | "warning" | "error") => {
1515
const text = params?.[0];
1616
const options = params?.[1] as JSONObject;
1717
const duration = options?.["duration"] ?? 3;
@@ -35,6 +35,12 @@ MessageComp = withMethodExposing(MessageComp, [
3535
showMessage(params, "success");
3636
},
3737
},
38+
{
39+
method: { name: "loading", description: trans("messageComp.loading"), params: params },
40+
execute: (comp, params) => {
41+
showMessage(params, "loading");
42+
},
43+
},
3844
{
3945
method: { name: "warn", description: trans("messageComp.warn"), params: params },
4046
execute: (comp, params) => {
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import { withMethodExposing } from "../generators/withMethodExposing";
2+
import { simpleMultiComp } from "../generators";
3+
import { withExposingConfigs } from "../generators/withExposing";
4+
import { EvalParamType, ParamsConfig } from "../controls/actionSelector/executeCompTypes";
5+
import { JSONObject } from "../../util/jsonTypes";
6+
import { trans } from "i18n";
7+
import { notificationInstance } from "lowcoder-design";
8+
import type { ArgsProps, NotificationPlacement } from 'antd/es/notification/interface';
9+
10+
const params: ParamsConfig = [
11+
{ name: "text", type: "string" },
12+
{ name: "options", type: "JSON" },
13+
];
14+
15+
const showNotification = (
16+
params: EvalParamType[],
17+
level: "open" | "info" | "success" | "warning" | "error"
18+
) => {
19+
const text = params?.[0] as string;
20+
const options = params?.[1] as JSONObject;
21+
22+
const { message , duration, id, placement, dismissible } = options;
23+
24+
const closeIcon: boolean | undefined = dismissible === true ? undefined : (dismissible === false ? false : undefined);
25+
26+
const durationNumberOrNull: number | null = typeof duration === 'number' ? duration : null;
27+
28+
const notificationArgs: ArgsProps = {
29+
message: text,
30+
description: message as React.ReactNode,
31+
duration: durationNumberOrNull ?? 3,
32+
key: id as React.Key,
33+
placement: placement as NotificationPlacement ?? "bottomRight",
34+
closeIcon: closeIcon as boolean,
35+
};
36+
37+
// Use notificationArgs to trigger the notification
38+
39+
text && notificationInstance[level](notificationArgs);
40+
};
41+
42+
const destroy = (
43+
params: EvalParamType[]
44+
) => {
45+
// Extract the id from the params
46+
const id = params[0] as React.Key;
47+
48+
// Call notificationInstance.destroy with the provided id
49+
notificationInstance.destroy(id);
50+
};
51+
52+
//what we would like to expose: title, text, duration, id, btn-obj, onClose, placement
53+
54+
const ToastCompBase = simpleMultiComp({});
55+
56+
export let ToastComp = withExposingConfigs(ToastCompBase, []);
57+
58+
ToastComp = withMethodExposing(ToastComp, [
59+
{
60+
method: { name: "destroy", description: trans("toastComp.destroy"), params: params },
61+
execute: (comp, params) => destroy(params),
62+
},
63+
{
64+
method: { name: "open", description: trans("toastComp.info"), params: params },
65+
execute: (comp, params) => {
66+
showNotification(params, "open");
67+
},
68+
},
69+
{
70+
method: { name: "info", description: trans("toastComp.info"), params: params },
71+
execute: (comp, params) => {
72+
showNotification(params, "info");
73+
},
74+
},
75+
{
76+
method: { name: "success", description: trans("toastComp.success"), params: params },
77+
execute: (comp, params) => {
78+
showNotification(params, "success");
79+
},
80+
},
81+
{
82+
method: { name: "warn", description: trans("toastComp.warn"), params: params },
83+
execute: (comp, params) => {
84+
showNotification(params, "warning");
85+
},
86+
},
87+
{
88+
method: { name: "error", description: trans("toastComp.error"), params: params },
89+
execute: (comp, params) => {
90+
showNotification(params, "error");
91+
},
92+
},
93+
]);
94+
95+

client/packages/lowcoder/src/i18n/locales/de.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1615,10 +1615,18 @@ export const de = {
16151615
},
16161616
"messageComp": {
16171617
"info": "Eine Benachrichtigung senden",
1618+
"loading": "Ladebestätigung senden",
16181619
"success": "Erfolgsbenachrichtigung senden",
16191620
"warn": "Eine Warnmeldung senden",
16201621
"error": "Eine Fehlerbenachrichtigung senden"
16211622
},
1623+
"tostComp": {
1624+
"info": "Eine Benachrichtigung senden",
1625+
"loading": "Ladebestätigung senden",
1626+
"success": "Erfolgsbenachrichtigung senden",
1627+
"warn": "Eine Warnmeldung senden",
1628+
"error": "Eine Fehlerbenachrichtigung senden"
1629+
},
16221630
"themeComp": {
16231631
"switchTo": "Thema wechseln"
16241632
},

client/packages/lowcoder/src/i18n/locales/en.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1778,6 +1778,15 @@ export const en = {
17781778
},
17791779
"messageComp": {
17801780
"info": "Send a Notification",
1781+
"loading": "Send a Loading Notification",
1782+
"success": "Send a Success Notification",
1783+
"warn": "Send a Warning Notification",
1784+
"error": "Send an Error Notification"
1785+
},
1786+
"toastComp": {
1787+
"destroy": "close a Notification",
1788+
"info": "Send a Notification",
1789+
"loading": "Send a Loading Notification",
17811790
"success": "Send a Success Notification",
17821791
"warn": "Send a Warning Notification",
17831792
"error": "Send an Error Notification"

client/packages/lowcoder/src/i18n/locales/zh.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1686,6 +1686,14 @@ utilsComp: {
16861686
},
16871687
messageComp: {
16881688
info: "发送通知",
1689+
loading: "发送加载通知",
1690+
success: "发送成功通知",
1691+
warn: "发送警告通知",
1692+
error: "发送错误通知",
1693+
},
1694+
toastComp: {
1695+
info: "发送通知",
1696+
loading: "发送加载通知",
16891697
success: "发送成功通知",
16901698
warn: "发送警告通知",
16911699
error: "发送错误通知",
33.6 KB
Loading

docs/build-apps/write-javascript/built-in-javascript-functions.md

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -109,18 +109,45 @@ utils.copyToClipboard( input1.value )
109109
Use `message` methods to send a global alert notification, which displays at the top of the screen and lasts for 3 seconds by default. Each of the following four methods supports a unique display style.
110110

111111
```javascript
112-
// messageInstance.info( text: string, options?: {duration: number = 3 } )
113-
messageInstance.info("Please confirm your information", { duration: 10 })
114-
// messageInstance.success( text: string, options?: {duration: number = 3 } )
115-
messageInstance.success("Query runs successfully", { duration: 10 })
116-
// messageInstance.warning( text: string, options?: {duration: number = 3 } )
117-
messageInstance.warning("Warning", { duration: 10 })
118-
// messageInstance.error( text: string, options?: {duration: number = 3 } )
119-
messageInstance.error("Query runs with error", { duration: 10 })
112+
// message.info( text: string, options?: {duration: number = 3 } )
113+
message.info("Please confirm your information", { duration: 10 })
114+
// message.loading( text: string, options?: {duration: number = 3 } )
115+
message.loading("Query is running", { duration: 5 })
116+
// message.success( text: string, options?: {duration: number = 3 } )
117+
message.success("Query runs successfully", { duration: 10 })
118+
// message.warning( text: string, options?: {duration: number = 3 } )
119+
message.warning("Warning", { duration: 10 })
120+
// message.error( text: string, options?: {duration: number = 3 } )
121+
message.error("Query runs with error", { duration: 10 })
120122
```
121123

122124
<figure><img src="../../.gitbook/assets/builtin-js-messages.png" alt=""><figcaption></figcaption></figure>
123125

126+
## toast - dismissible stack-able notifications
127+
128+
Use `toast` methods to send a notification, which displays at the top of the screen and lasts for 3 seconds by default. Each of the following five methods supports a unique display style. After 3 toasts they will be stacked.
129+
130+
The id field can be used to update previous toasts. Or used to destroy the previous toast.
131+
132+
Destroy function used without an id will remove all toast.
133+
134+
```javascript
135+
// toast.open( title: string, options?: { message?: string, duration?: number = 3, id?: string, placement?: "top" | "topLeft" | "topRight" | "bottom" | "bottomRight", "bottomRight" = "bottomRight", dismissible?: boolean = true } )
136+
toast.open("This Is a Notification", {message: "I do not go away automatically.", duration: 0})
137+
// toast.info( title: string, options?: { message?: string, duration?: number = 3, id?: string, placement?: "top" | "topLeft" | "topRight" | "bottom" | "bottomRight", "bottomRight" = "bottomRight", dismissible?: boolean = true } )
138+
toast.info("Order #1519", {message: "Shipped out on Tuesday, Jan 3rd.", duration: 5})
139+
// toast.success( title: string, options?: { message?: string, duration?: number = 3, id?: string, placement?: "top" | "topLeft" | "topRight" | "bottom" | "bottomRight", "bottomRight" = "bottomRight", dismissible?: boolean = true } )
140+
toast.success("Query runs successfully", { duration: 10 })
141+
// toast.warn( title: string, options?: { message?: string, duration?: number = 3, id?: string, placement?: "top" | "topLeft" | "topRight" | "bottom" | "bottomRight", "bottomRight" = "bottomRight", dismissible?: boolean = true } )
142+
toast.warn("Duplicate Action", {message: "The email was previously sent on Jan 3rd. Click the button again to send.", duration: 5})
143+
// toast.error( title: string, options?: { message?: string, duration?: number = 3, id?: string, placement?: "top" | "topLeft" | "topRight" | "bottom" | "bottomRight", "bottomRight" = "bottomRight", dismissible?: boolean = true } )
144+
toast.error("Your credentials were invalid", {message: "You have 5 tries left", duration: 5})
145+
//toast.destroy(id?: string)
146+
toast.destroy()
147+
```
148+
149+
<figure><img src="../../.gitbook/assets/builtin-js-toasts.png" alt=""><figcaption></figcaption></figure>
150+
124151
## localStorage
125152

126153
Use `localStorage` methods to store and manage key-value pair data locally, which is not reset when the app refreshes, and can be accessed in any app within the workspace using `localStorage.values`.

0 commit comments

Comments
 (0)