Skip to content

Commit eb3854b

Browse files
authored
Merge pull request lowcoder-org#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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy