From 8e9ab45f420dab208fa0f3117516358ce9708583 Mon Sep 17 00:00:00 2001 From: Andy C <46699959+sudoischenny@users.noreply.github.com> Date: Tue, 27 Feb 2024 14:55:38 -0500 Subject: [PATCH 1/6] Toasts Notification & Loading Mesages Added a built in function called toast for longer notifications. Also added message.loading() Please see docs\build-apps\write-javascript\built-in-javascript-functions.md --- .../lowcoder/src/comps/hooks/hookComp.tsx | 2 + .../src/comps/hooks/hookCompTypes.tsx | 2 + .../lowcoder/src/comps/hooks/hookListComp.tsx | 1 + .../lowcoder/src/comps/hooks/messageComp.ts | 8 +- .../lowcoder/src/comps/hooks/toastComp.ts | 102 ++++++++++++++++++ .../packages/lowcoder/src/i18n/locales/de.ts | 8 ++ .../packages/lowcoder/src/i18n/locales/en.ts | 8 ++ .../packages/lowcoder/src/i18n/locales/zh.ts | 8 ++ docs/.gitbook/assets/builtin-js-toasts.png | Bin 0 -> 31319 bytes .../built-in-javascript-functions.md | 39 +++++-- 10 files changed, 169 insertions(+), 9 deletions(-) create mode 100644 client/packages/lowcoder/src/comps/hooks/toastComp.ts create mode 100644 docs/.gitbook/assets/builtin-js-toasts.png diff --git a/client/packages/lowcoder/src/comps/hooks/hookComp.tsx b/client/packages/lowcoder/src/comps/hooks/hookComp.tsx index dd2a6b1dc..8002436e1 100644 --- a/client/packages/lowcoder/src/comps/hooks/hookComp.tsx +++ b/client/packages/lowcoder/src/comps/hooks/hookComp.tsx @@ -29,6 +29,7 @@ import { useInterval, useTitle, useWindowSize } from "react-use"; import { useCurrentUser } from "util/currentUser"; import { LocalStorageComp } from "./localStorageComp"; import { MessageComp } from "./messageComp"; +import { ToastComp } from "./toastComp"; import { ThemeComp } from "./themeComp"; import UrlParamsHookComp from "./UrlParamsHookComp"; import { UtilsComp } from "./utilsComp"; @@ -94,6 +95,7 @@ const HookMap: HookCompMapRawType = { momentJsLib: DayJsLib, // old components use this hook utils: UtilsComp, message: MessageComp, + toast: ToastComp, localStorage: LocalStorageComp, modal: ModalComp, meeting: VideoMeetingControllerComp, diff --git a/client/packages/lowcoder/src/comps/hooks/hookCompTypes.tsx b/client/packages/lowcoder/src/comps/hooks/hookCompTypes.tsx index a985a8e72..617f2f6c1 100644 --- a/client/packages/lowcoder/src/comps/hooks/hookCompTypes.tsx +++ b/client/packages/lowcoder/src/comps/hooks/hookCompTypes.tsx @@ -12,6 +12,7 @@ const AllHookComp = [ "momentJsLib", "utils", "message", + "toast", "localStorage", "currentUser", "screenInfo", @@ -58,6 +59,7 @@ const HookCompConfig: Record< }, utils: { category: "hide" }, message: { category: "hide" }, + toast: { category: "hide" }, }; // Get hook component category diff --git a/client/packages/lowcoder/src/comps/hooks/hookListComp.tsx b/client/packages/lowcoder/src/comps/hooks/hookListComp.tsx index 3f28e2d1a..7b267ec19 100644 --- a/client/packages/lowcoder/src/comps/hooks/hookListComp.tsx +++ b/client/packages/lowcoder/src/comps/hooks/hookListComp.tsx @@ -19,6 +19,7 @@ const defaultHookListValue = [ { compType: "lodashJsLib", name: "_" }, { compType: "utils", name: "utils" }, { compType: "message", name: "message" }, + { compType: "toast", name: "toast" }, { compType: "localStorage", name: "localStorage" }, { compType: "currentUser", name: "currentUser" }, { compType: "screenInfo", name: "screenInfo" }, diff --git a/client/packages/lowcoder/src/comps/hooks/messageComp.ts b/client/packages/lowcoder/src/comps/hooks/messageComp.ts index e0e6451cb..028c37691 100644 --- a/client/packages/lowcoder/src/comps/hooks/messageComp.ts +++ b/client/packages/lowcoder/src/comps/hooks/messageComp.ts @@ -11,7 +11,7 @@ const params: ParamsConfig = [ { name: "options", type: "JSON" }, ]; -const showMessage = (params: EvalParamType[], level: "info" | "success" | "warning" | "error") => { +const showMessage = (params: EvalParamType[], level: "info" | "success" | "loading" | "warning" | "error") => { const text = params?.[0]; const options = params?.[1] as JSONObject; const duration = options?.["duration"] ?? 3; @@ -35,6 +35,12 @@ MessageComp = withMethodExposing(MessageComp, [ showMessage(params, "success"); }, }, + { + method: { name: "loading", description: trans("messageComp.loading"), params: params }, + execute: (comp, params) => { + showMessage(params, "loading"); + }, + }, { method: { name: "warn", description: trans("messageComp.warn"), params: params }, execute: (comp, params) => { diff --git a/client/packages/lowcoder/src/comps/hooks/toastComp.ts b/client/packages/lowcoder/src/comps/hooks/toastComp.ts new file mode 100644 index 000000000..604c127ed --- /dev/null +++ b/client/packages/lowcoder/src/comps/hooks/toastComp.ts @@ -0,0 +1,102 @@ +import { withMethodExposing } from "../generators/withMethodExposing"; +import { simpleMultiComp } from "../generators"; +import { withExposingConfigs } from "../generators/withExposing"; +import { EvalParamType, ParamsConfig } from "../controls/actionSelector/executeCompTypes"; +import { JSONObject } from "../../util/jsonTypes"; +import { trans } from "i18n"; +import { notificationInstance } from "lowcoder-design"; +import type { ArgsProps, NotificationPlacement } from 'antd/es/notification/interface'; + +const params: ParamsConfig = [ + { name: "text", type: "string" }, + { name: "options", type: "JSON" }, +]; + +const showNotification = ( + params: EvalParamType[], + level: "open" | "info" | "success" | "warning" | "error" +) => { + const text = params?.[0] as string; + const options = params?.[1] as JSONObject; + + const { message , duration, id, placement } = options; + + // Convert duration to a number or null, if it's not a valid number, default to null + const durationNumberOrNull: number | null = typeof duration === 'number' ? duration : null; + + const notificationArgs: ArgsProps = { + message: text, + description: message as React.ReactNode, + duration: durationNumberOrNull ?? 3, + key: id as React.Key, // Ensure id is a valid React.Key + placement: placement as NotificationPlacement ?? "bottomRight", // Ensure placement is a valid NotificationPlacement or undefined + }; + + // Use notificationArgs to trigger the notification + + text && notificationInstance[level](notificationArgs); +}; + +//what we would like to expose: title, text, duration, id, btn-obj, onClose, placement + +const ToastCompBase = simpleMultiComp({}); + +export let ToastComp = withExposingConfigs(ToastCompBase, []); + +/* +export declare const NotificationPlacements: readonly ["top", "topLeft", "topRight", "bottom", "bottomLeft", "bottomRight"]; +export type NotificationPlacement = (typeof NotificationPlacements)[number]; +export type IconType = 'success' | 'info' | 'error' | 'warning'; +export interface ArgsProps { + message: React.ReactNode; + description?: React.ReactNode; + btn?: React.ReactNode; + key?: React.Key; + onClose?: () => void; + duration?: number | null; + icon?: React.ReactNode; + placement?: NotificationPlacement; + style?: React.CSSProperties; + className?: string; + readonly type?: IconType; + onClick?: () => void; + closeIcon?: React.ReactNode; + props?: DivProps; + role?: 'alert' | 'status'; +} +*/ + +ToastComp = withMethodExposing(ToastComp, [ + { + method: { name: "open", description: trans("toastComp.info"), params: params }, + execute: (comp, params) => { + showNotification(params, "open"); + }, + }, + { + method: { name: "info", description: trans("toastComp.info"), params: params }, + execute: (comp, params) => { + showNotification(params, "info"); + }, + }, + { + method: { name: "success", description: trans("toastComp.success"), params: params }, + execute: (comp, params) => { + showNotification(params, "success"); + }, + }, + { + method: { name: "warn", description: trans("toastComp.warn"), params: params }, + execute: (comp, params) => { + showNotification(params, "warning"); + }, + }, + { + method: { name: "error", description: trans("toastComp.error"), params: params }, + execute: (comp, params) => { + showNotification(params, "error"); + }, + }, +]); + + diff --git a/client/packages/lowcoder/src/i18n/locales/de.ts b/client/packages/lowcoder/src/i18n/locales/de.ts index cc41a8d1e..2b5e6c0a0 100644 --- a/client/packages/lowcoder/src/i18n/locales/de.ts +++ b/client/packages/lowcoder/src/i18n/locales/de.ts @@ -1612,10 +1612,18 @@ export const de = { }, "messageComp": { "info": "Eine Benachrichtigung senden", + "loading": "Ladebestätigung senden", "success": "Erfolgsbenachrichtigung senden", "warn": "Eine Warnmeldung senden", "error": "Eine Fehlerbenachrichtigung senden" }, + "tostComp": { + "info": "Eine Benachrichtigung senden", + "loading": "Ladebestätigung senden", + "success": "Erfolgsbenachrichtigung senden", + "warn": "Eine Warnmeldung senden", + "error": "Eine Fehlerbenachrichtigung senden" +}, "themeComp": { "switchTo": "Thema wechseln" }, diff --git a/client/packages/lowcoder/src/i18n/locales/en.ts b/client/packages/lowcoder/src/i18n/locales/en.ts index 9e71926f0..dc1c9afe0 100644 --- a/client/packages/lowcoder/src/i18n/locales/en.ts +++ b/client/packages/lowcoder/src/i18n/locales/en.ts @@ -1775,6 +1775,14 @@ export const en = { }, "messageComp": { "info": "Send a Notification", + "loading": "Send a Loading Notification", + "success": "Send a Success Notification", + "warn": "Send a Warning Notification", + "error": "Send an Error Notification" + }, + "toastComp": { + "info": "Send a Notification", + "loading": "Send a Loading Notification", "success": "Send a Success Notification", "warn": "Send a Warning Notification", "error": "Send an Error Notification" diff --git a/client/packages/lowcoder/src/i18n/locales/zh.ts b/client/packages/lowcoder/src/i18n/locales/zh.ts index 12821ebf6..943cb2829 100644 --- a/client/packages/lowcoder/src/i18n/locales/zh.ts +++ b/client/packages/lowcoder/src/i18n/locales/zh.ts @@ -1683,6 +1683,14 @@ utilsComp: { }, messageComp: { info: "发送通知", + loading: "发送加载通知", + success: "发送成功通知", + warn: "发送警告通知", + error: "发送错误通知", +}, +toastComp: { + info: "发送通知", + loading: "发送加载通知", success: "发送成功通知", warn: "发送警告通知", error: "发送错误通知", diff --git a/docs/.gitbook/assets/builtin-js-toasts.png b/docs/.gitbook/assets/builtin-js-toasts.png new file mode 100644 index 0000000000000000000000000000000000000000..56d04f3fa858c470082f1e74ea7e5d126a2226a1 GIT binary patch literal 31319 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 B0Zjk^ literal 0 HcmV?d00001 diff --git a/docs/build-apps/write-javascript/built-in-javascript-functions.md b/docs/build-apps/write-javascript/built-in-javascript-functions.md index 757c30511..ee78acba1 100644 --- a/docs/build-apps/write-javascript/built-in-javascript-functions.md +++ b/docs/build-apps/write-javascript/built-in-javascript-functions.md @@ -109,18 +109,41 @@ utils.copyToClipboard( input1.value ) 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. ```javascript -// messageInstance.info( text: string, options?: {duration: number = 3 } ) -messageInstance.info("Please confirm your information", { duration: 10 }) -// messageInstance.success( text: string, options?: {duration: number = 3 } ) -messageInstance.success("Query runs successfully", { duration: 10 }) -// messageInstance.warning( text: string, options?: {duration: number = 3 } ) -messageInstance.warning("Warning", { duration: 10 }) -// messageInstance.error( text: string, options?: {duration: number = 3 } ) -messageInstance.error("Query runs with error", { duration: 10 }) +// message.info( text: string, options?: {duration: number = 3 } ) +message.info("Please confirm your information", { duration: 10 }) +// message.loading( text: string, options?: {duration: number = 3 } ) +message.loading("Query is running", { duration: 5 }) +// message.success( text: string, options?: {duration: number = 3 } ) +message.success("Query runs successfully", { duration: 10 }) +// message.warning( text: string, options?: {duration: number = 3 } ) +message.warning("Warning", { duration: 10 }) +// message.error( text: string, options?: {duration: number = 3 } ) +message.error("Query runs with error", { duration: 10 }) ```

+## toast - dismissible stack-able notifications + +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. + +The id field can be used to update previous toasts. + +```javascript +// toast.open( title: string, options?: { message?: string, duration?: number = 3, id?: string, placement?: "top" | "topLeft" | "topRight" | "bottom" | "bottomRight", "bottomRight" = "bottomRight" } ) +toast.open("This Is a Notification", {message: "I do not go away automatically.", duration: 0}) +// toast.info( title: string, options?: { message?: string, duration?: number = 3, id?: string, placement?: "top" | "topLeft" | "topRight" | "bottom" | "bottomRight", "bottomRight" = "bottomRight" } ) +toast.info("Order #1519", {message: "Shipped out on Tuesday, Jan 3rd.", duration: 5}) +// toast.success( title: string, options?: { message?: string, duration?: number = 3, id?: string, placement?: "top" | "topLeft" | "topRight" | "bottom" | "bottomRight", "bottomRight" = "bottomRight" } ) +toast.success("Query runs successfully", { duration: 10 }) +// toast.warn( title: string, options?: { message?: string, duration?: number = 3, id?: string, placement?: "top" | "topLeft" | "topRight" | "bottom" | "bottomRight", "bottomRight" = "bottomRight" } ) +toast.warn("Duplicate Action", {message: "The email was previously sent on Jan 3rd. Click the button again to send.", duration: 5}) +// toast.error( title: string, options?: { message?: string, duration?: number = 3, id?: string, placement?: "top" | "topLeft" | "topRight" | "bottom" | "bottomRight", "bottomRight" = "bottomRight" } ) +toast.error("Your credentials were invalid", {message: "You have 5 tries left", duration: 5}) +``` + +
+ ## localStorage 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`. From 683179cd3167bfaf98d8569a3b4f66ca90a3e365 Mon Sep 17 00:00:00 2001 From: Andy C <46699959+sudoischenny@users.noreply.github.com> Date: Tue, 27 Feb 2024 15:21:50 -0500 Subject: [PATCH 2/6] Update Toasts Image --- .vscode/settings.json | 7 +++++++ docs/.gitbook/assets/builtin-js-toasts.png | Bin 31319 -> 34438 bytes 2 files changed, 7 insertions(+) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..39649ae48 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "workbench.colorCustomizations": { + "activityBar.background": "#2A3012", + "titleBar.activeBackground": "#3B431A", + "titleBar.activeForeground": "#F9FAF2" + } +} \ No newline at end of file diff --git a/docs/.gitbook/assets/builtin-js-toasts.png b/docs/.gitbook/assets/builtin-js-toasts.png index 56d04f3fa858c470082f1e74ea7e5d126a2226a1..cfaf5833205312800645c4ddd6185e7e424c0f7a 100644 GIT binary patch literal 34438 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 z�Y-(}(RPM5ikoQ_+cC72pb9%tKjZM2VJ(JbcB-O1Q2&jZmulJo$Fc`q@4saOM<= zZb34;FU){TkvA)?K2NrK`{EsXyK8tnQ@AiEp-40&nmI{gNnEoO#YksjHg)RiM>$4s zp4wzpG`{LbFGOrJ2@-KbXS)u&^BqnK+5&lWMv+)AJBhV&Z5Z9Wd){1AZLR9X{Cl#N zmvIA6?QyTNMj(>Ucs2Tjk-Q!=Y}bg=r>s@$m9~0Cst*vJ^9;5u7_1BXeBKX3sW8|BsO;`#8^{*yw48VBREX{IMROE(VL znuyvmu9HQJEo+I>%_%XM(^goBdmmT2#l=kD;5a%?suYF1u7?Dhoti0GXqb)hI_JSg zkYapVQ4WmGa_TgAY%8MOAi7+XK-=rVMjj_S-#c-hw+j({qh6(6zG3$^ugQAd>1ke& zB>^lkV;o=3B*utIhrVg5mqx>uzvTeqJc~QgM$Pn?tOEOc;M+?N>l$D6A>$dt8XnzY zJR6irY$xAMXuzE|%JGS8t(N0#9LaAUc7qeBG4EuYzYCk<@-c#Z9o1E#RHItL-L%Y)Q3c@+yb4oTU?`G`! zg*Y--pNmA5i@@t!A};8yC^63W0_2)++vk$j2PEf@5vc zbcV7OK^g|$$*ZH))pjj*xjNU&s}2U;c`hE~k83i^g-(uWRI|%+jHF2eFO)=k&CZHN zFPpViEIqNki_lM$=cI3i8Vm=q*r&2PkT^U?f8x8PD(~|!;H!5f#OGtY+O`u(Gswra zO21Lq(NfdfDUdYdaQu`*Bz$g#!vg2d-IG*cpMgh0aS+@nZFj3GD<#J_-F;QneA_yq z7nwem_rG_n{%sfi7hp8`4`39iK^o;C|Ij)9C*(gXAy0FR7>kN7!UFz^A_(mE8$^|a zrXu~{6&zmz(YHY=N)n!o(W<1`X$i_&fKJ51yBxdAxvO$ag@XmH{`No@+cKg2 zF*@Pmly$*;HD10arc1Tl0GuZgxUfytzs>ku_zygoqvWz3V0w-R_j}TKb_^ z_DfKt@4wbvV=Lz~d}EN9kM~{|>%EEK6vbimES$}g<))XU!ZEZh@`%3cQed0#VWjY& z_=p4!I}@DL$T$k$&AnP!QKS13&*u{G&^?rf951k*qqrTp6+*Ve=k|7J&rzJGBsFKJ zo!BsE!t@B>pSS-n922gfZmf$zh8@dx_*zPUVVYKT3L%VBcJ%SMh^wP>c`BP5NITE- z;JZ`wB|wQ4lpc>1c(sO0%N~UmBi#FR$Xc^M{oylY2xge!rgt1|B;9mNt(Vr&RID2j9aV!lMV-fe;(wXc1?HRy^_Wkfv z?&!=*pwUMx_Eg&kv3h?HEb64jKrePhv%CQGompkk>1Rtt-*Rd5qhn345~Spv5wT-9 zq$BaO!7S~yL^yKui1k*g9kt+CU?_g^Oop|O{9!PvCbB$!q(4Ec{@nt5J#ba-WjH-l z6PNwQvQcaLO;o@I)riMbTEmCoLv+9>%=|d6z}7|c5Lzs6w?jX$xP!|!Qe*%%%d zqd^>ydqF)JXIF(zOebTcDsUIubi=WlJ|+t{-HQwqWZI z1jwS@)v8dW3FVjq!-^5pBQNHdv8PNgUk*Ix$!fv8UHHTg?_b$8s|+LRoO_PE(UCKT zja12+Qbu&5C8G9Y34FXPT=beE#oN{3RNw9DUys3YmL_=%1H*>2d zV|l7lXM?`?ncCJK*&{uGpxV3DJZLlm6 zn9%_n9KoJNpNI7kEqw1d+YVQ zPOtFn1?=4FI(J<{5pJ86$%^}l287upKb8A(P|9C318Lt5IE6YTTXKwTdlGfe$@C?x z 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%0AAm|K!IDP-;*~zT`LJmNj0QsK@u{E6?pa4TT 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 NzXu1Gvkf5N8F*}ys%fp3!3BU zIP$!2JQ~rWGY^JpD}>ltUIY^FlR9xno(*s)FD;Z?^$o}5;xeRj1fJqxou|+GecZlK z#YAAijJ`@(r{H&dp6h1Z4=iXmz0DI|_$kPxe6NTR#=6*?%AdG6e)>QPB^zCQr5t4l z56`GnMYk5KDBByiW>=rVXuE^;ex&f@^q!Y7Yw)`A8~-c5Rtwu zYpWqzB-(KFrWP&F;HQh^B+ubgNu@5n4tfRili&NJ}`L$Sg52s3yoQxk; zYdAm0tMOC4v*C{m+0p`e+%`_|^k24(LJDGDMLI9}N&Pe#bIaI)Y$uKBBXR}okptIf@gGFp2DGJa^8wYq= z;7Uh)VavC&Hp=l&_O+B9={2iD+jV>MSgq9FNQ%=jL9H#L4@4iS_pmD8VezM^H^WLz z4=h=Sv_7uo67kw|w{5_x&UMGKsO&~*zM9t{61yJu?FxYlfw&U4*3dscm;d;T{->Xf zg_hwb*WaeeJ80@e06XjtAqXbd!CGB&`_l4)KhvmmMvepbjgGrL1dg zGi}5+Fwp_kGAK<@A%#xMVA}2U+o`%`elp0TBy@}hEX^0&A^sxxiUx6w-fAGC8T1U} z)Plm~)XUTj&~MKRj|GR~oTlBw#XEO>n-__LSYmJT?U4|}>rII``xpp*Eck*)jsRcq zIZc`2?qzba!|g9c)fz+AI{Ir%Wuop~i_Y8KP;QWzyFGG9L4TPO3~5AH1sy|BP;J50 z=7O@We%y}8=e&RdjXdXLuh+jn1IJXw9794oC%7c2-?+0DljH}c`F-|&rBgldsV6Tx z{4_6 z(n%Qi8WIz9K2L{AI0fOxe>)~#312qzXf^(AR~;j+{{(9Mc{#;GR^zj6kVdk{VvyCW zEJn>#F&yx6k)LRJh2>mNo6e0=Q1;6;J^#GxmQV7jsu96N72h5Cf>-v)h?hB9Q+I!b z=dkuT7^a}=|8;J*TS_y_oPCmsm$2efRwQ+-OP!75r@KVymz4*dxtQ@bavzR_WYZ-l zvIhyfVm)0JpEZ0gM=QZ`&d$O7JCwJGa+N?YeFe%;LucGpFABF(p!nx`6?Fm4``s*B zaE5Oh$=7Nz?S@bN$#1OJ75qj0`hUsjA+_7N_nF}r)$sGHg+>3^%KyTHF2o)(sx4%j z!?ShhfI0AQ5zuA5gdiXQVkH6DKEF1DN#=f$=5Y`X@O4$KpG%sA4Ctk5R75@ObK*{aUSn|^DvGu|a2~?)~ z0KhqU0R9vF0?3t4_#d|bkPX48?(?QIF;VIhTpfVF&;$5O<^>aD=-H_mP}Un@7_{q< z>Z-Z`GTG81@XzVJ3%vG)2p~~3;y&2%0Pq_jARn*9smj=UX+HV4b2ptXf$;_4r58{A z2T%*=n2a++kUPV_F63W#U@KU@7KE)c-iT-iBoU`x9xGx74^yUU~VfMV+qdRTXA4di4|xt{A~wdb6_KoHPFz- zfnNZ%25gTre_b3B!~w0#-Js_g^YDt(!T-_6I3!5Gft`latE`4A&m!KSaaklRI}dP$ zvF-X|GE(Y~NuovE8OEL)L|#^z2M~LpYP*V7?l7$qZDLMhzWpsF8kTk;gos~dsvRM> zx~LXuqF2=~7XzW%q-SC8-)Lg1zBzik1$DS!#)FDZ-v HpQ--^9VU!B literal 31319 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 B0Zjk^ From 3708c3052158ff087a1f95f179b55ceb6fcfb9ae Mon Sep 17 00:00:00 2001 From: Andy C <46699959+sudoischenny@users.noreply.github.com> Date: Tue, 27 Feb 2024 15:39:07 -0500 Subject: [PATCH 3/6] Added toast.destroy() Destroys a previous toast based on assigned id. --- .../lowcoder/src/comps/hooks/toastComp.ts | 37 +++++++------------ .../packages/lowcoder/src/i18n/locales/en.ts | 1 + .../built-in-javascript-functions.md | 6 ++- 3 files changed, 20 insertions(+), 24 deletions(-) diff --git a/client/packages/lowcoder/src/comps/hooks/toastComp.ts b/client/packages/lowcoder/src/comps/hooks/toastComp.ts index 604c127ed..49174a784 100644 --- a/client/packages/lowcoder/src/comps/hooks/toastComp.ts +++ b/client/packages/lowcoder/src/comps/hooks/toastComp.ts @@ -37,36 +37,27 @@ const showNotification = ( text && notificationInstance[level](notificationArgs); }; +const destroy = ( + params: EvalParamType[] +) => { + // Extract the id from the params + const id = params[0] as React.Key; + + // Call notificationInstance.destroy with the provided id + notificationInstance.destroy(id); +}; + //what we would like to expose: title, text, duration, id, btn-obj, onClose, placement const ToastCompBase = simpleMultiComp({}); export let ToastComp = withExposingConfigs(ToastCompBase, []); -/* -export declare const NotificationPlacements: readonly ["top", "topLeft", "topRight", "bottom", "bottomLeft", "bottomRight"]; -export type NotificationPlacement = (typeof NotificationPlacements)[number]; -export type IconType = 'success' | 'info' | 'error' | 'warning'; -export interface ArgsProps { - message: React.ReactNode; - description?: React.ReactNode; - btn?: React.ReactNode; - key?: React.Key; - onClose?: () => void; - duration?: number | null; - icon?: React.ReactNode; - placement?: NotificationPlacement; - style?: React.CSSProperties; - className?: string; - readonly type?: IconType; - onClick?: () => void; - closeIcon?: React.ReactNode; - props?: DivProps; - role?: 'alert' | 'status'; -} -*/ - ToastComp = withMethodExposing(ToastComp, [ + { + method: { name: "destroy", description: trans("toastComp.destroy"), params: params }, + execute: (comp, params) => destroy(params), + }, { method: { name: "open", description: trans("toastComp.info"), params: params }, execute: (comp, params) => { diff --git a/client/packages/lowcoder/src/i18n/locales/en.ts b/client/packages/lowcoder/src/i18n/locales/en.ts index dc1c9afe0..4c0ddd264 100644 --- a/client/packages/lowcoder/src/i18n/locales/en.ts +++ b/client/packages/lowcoder/src/i18n/locales/en.ts @@ -1781,6 +1781,7 @@ export const en = { "error": "Send an Error Notification" }, "toastComp": { + "destroy": "close a Notification", "info": "Send a Notification", "loading": "Send a Loading Notification", "success": "Send a Success Notification", diff --git a/docs/build-apps/write-javascript/built-in-javascript-functions.md b/docs/build-apps/write-javascript/built-in-javascript-functions.md index ee78acba1..aecebe6b8 100644 --- a/docs/build-apps/write-javascript/built-in-javascript-functions.md +++ b/docs/build-apps/write-javascript/built-in-javascript-functions.md @@ -127,7 +127,9 @@ message.error("Query runs with error", { duration: 10 }) 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. -The id field can be used to update previous toasts. +The id field can be used to update previous toasts. Or used to destroy the previous toast. + +Destroy function used without an id will remove all toast. ```javascript // toast.open( title: string, options?: { message?: string, duration?: number = 3, id?: string, placement?: "top" | "topLeft" | "topRight" | "bottom" | "bottomRight", "bottomRight" = "bottomRight" } ) @@ -140,6 +142,8 @@ toast.success("Query runs successfully", { duration: 10 }) toast.warn("Duplicate Action", {message: "The email was previously sent on Jan 3rd. Click the button again to send.", duration: 5}) // toast.error( title: string, options?: { message?: string, duration?: number = 3, id?: string, placement?: "top" | "topLeft" | "topRight" | "bottom" | "bottomRight", "bottomRight" = "bottomRight" } ) toast.error("Your credentials were invalid", {message: "You have 5 tries left", duration: 5}) +//toast.destroy(id?: string) +toast.destroy() ```

From 791cff1e98d26386ce6aeda7bee8877639240cde Mon Sep 17 00:00:00 2001 From: Andy C <46699959+sudoischenny@users.noreply.github.com> Date: Tue, 27 Feb 2024 16:02:40 -0500 Subject: [PATCH 4/6] Toast Dismiss Added the ability to allow or disallow toasts to be dismissed. --- client/packages/lowcoder/src/comps/hooks/toastComp.ts | 10 ++++++---- .../write-javascript/built-in-javascript-functions.md | 10 +++++----- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/client/packages/lowcoder/src/comps/hooks/toastComp.ts b/client/packages/lowcoder/src/comps/hooks/toastComp.ts index 49174a784..8b80e89b9 100644 --- a/client/packages/lowcoder/src/comps/hooks/toastComp.ts +++ b/client/packages/lowcoder/src/comps/hooks/toastComp.ts @@ -19,17 +19,19 @@ const showNotification = ( const text = params?.[0] as string; const options = params?.[1] as JSONObject; - const { message , duration, id, placement } = options; + const { message , duration, id, placement, dismissible } = options; + + const closeIcon: boolean | undefined = dismissible === true ? undefined : (dismissible === false ? false : undefined); - // Convert duration to a number or null, if it's not a valid number, default to null const durationNumberOrNull: number | null = typeof duration === 'number' ? duration : null; const notificationArgs: ArgsProps = { message: text, description: message as React.ReactNode, duration: durationNumberOrNull ?? 3, - key: id as React.Key, // Ensure id is a valid React.Key - placement: placement as NotificationPlacement ?? "bottomRight", // Ensure placement is a valid NotificationPlacement or undefined + key: id as React.Key, + placement: placement as NotificationPlacement ?? "bottomRight", + closeIcon: closeIcon as boolean, }; // Use notificationArgs to trigger the notification diff --git a/docs/build-apps/write-javascript/built-in-javascript-functions.md b/docs/build-apps/write-javascript/built-in-javascript-functions.md index aecebe6b8..0bbbb6db0 100644 --- a/docs/build-apps/write-javascript/built-in-javascript-functions.md +++ b/docs/build-apps/write-javascript/built-in-javascript-functions.md @@ -132,15 +132,15 @@ The id field can be used to update previous toasts. Or used to destroy the previ Destroy function used without an id will remove all toast. ```javascript -// toast.open( title: string, options?: { message?: string, duration?: number = 3, id?: string, placement?: "top" | "topLeft" | "topRight" | "bottom" | "bottomRight", "bottomRight" = "bottomRight" } ) +// toast.open( title: string, options?: { message?: string, duration?: number = 3, id?: string, placement?: "top" | "topLeft" | "topRight" | "bottom" | "bottomRight", "bottomRight" = "bottomRight", dismissible?: boolean = true } ) toast.open("This Is a Notification", {message: "I do not go away automatically.", duration: 0}) -// toast.info( title: string, options?: { message?: string, duration?: number = 3, id?: string, placement?: "top" | "topLeft" | "topRight" | "bottom" | "bottomRight", "bottomRight" = "bottomRight" } ) +// toast.info( title: string, options?: { message?: string, duration?: number = 3, id?: string, placement?: "top" | "topLeft" | "topRight" | "bottom" | "bottomRight", "bottomRight" = "bottomRight", dismissible?: boolean = true } ) toast.info("Order #1519", {message: "Shipped out on Tuesday, Jan 3rd.", duration: 5}) -// toast.success( title: string, options?: { message?: string, duration?: number = 3, id?: string, placement?: "top" | "topLeft" | "topRight" | "bottom" | "bottomRight", "bottomRight" = "bottomRight" } ) +// toast.success( title: string, options?: { message?: string, duration?: number = 3, id?: string, placement?: "top" | "topLeft" | "topRight" | "bottom" | "bottomRight", "bottomRight" = "bottomRight", dismissible?: boolean = true } ) toast.success("Query runs successfully", { duration: 10 }) -// toast.warn( title: string, options?: { message?: string, duration?: number = 3, id?: string, placement?: "top" | "topLeft" | "topRight" | "bottom" | "bottomRight", "bottomRight" = "bottomRight" } ) +// toast.warn( title: string, options?: { message?: string, duration?: number = 3, id?: string, placement?: "top" | "topLeft" | "topRight" | "bottom" | "bottomRight", "bottomRight" = "bottomRight", dismissible?: boolean = true } ) toast.warn("Duplicate Action", {message: "The email was previously sent on Jan 3rd. Click the button again to send.", duration: 5}) -// toast.error( title: string, options?: { message?: string, duration?: number = 3, id?: string, placement?: "top" | "topLeft" | "topRight" | "bottom" | "bottomRight", "bottomRight" = "bottomRight" } ) +// toast.error( title: string, options?: { message?: string, duration?: number = 3, id?: string, placement?: "top" | "topLeft" | "topRight" | "bottom" | "bottomRight", "bottomRight" = "bottomRight", dismissible?: boolean = true } ) toast.error("Your credentials were invalid", {message: "You have 5 tries left", duration: 5}) //toast.destroy(id?: string) toast.destroy() From 2dea08b12a2ec40189532519600e379605c785aa Mon Sep 17 00:00:00 2001 From: Abdul Qadir Date: Wed, 28 Feb 2024 14:30:07 +0500 Subject: [PATCH 5/6] Add migration to fix existing application public view bug --- .../domain/application/model/Application.java | 11 +++++-- .../service/ApplicationService.java | 8 +++++ .../runner/migrations/DatabaseChangelog.java | 6 ++++ .../migrations/job/AddPtmFieldsJob.java | 6 ++++ .../migrations/job/AddPtmFieldsJobImpl.java | 29 +++++++++++++++++++ 5 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 server/api-service/lowcoder-server/src/main/java/org/lowcoder/runner/migrations/job/AddPtmFieldsJob.java create mode 100644 server/api-service/lowcoder-server/src/main/java/org/lowcoder/runner/migrations/job/AddPtmFieldsJobImpl.java diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/model/Application.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/model/Application.java index 89c76c41b..332464894 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/model/Application.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/model/Application.java @@ -12,6 +12,7 @@ import java.util.Set; import java.util.function.Supplier; +import lombok.Setter; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.BooleanUtils; import org.lowcoder.domain.query.model.ApplicationQuery; @@ -38,10 +39,13 @@ public class Application extends HasIdAndAuditing { private final Map publishedApplicationDSL; - private final Boolean publicToAll; - private final Boolean publicToMarketplace; + @Setter + private Boolean publicToAll; + @Setter + private Boolean publicToMarketplace; - private final Boolean agencyProfile; + @Setter + private Boolean agencyProfile; private Map editingApplicationDSL; @@ -161,4 +165,5 @@ public Map getEditingApplicationDSL() { public Object getLiveContainerSize() { return liveContainerSize.get(); } + } diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/ApplicationService.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/ApplicationService.java index 917d0762e..06ab6287e 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/ApplicationService.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/ApplicationService.java @@ -66,6 +66,10 @@ public Mono updateById(String applicationId, Application application) { return Mono.error(new BizException(BizError.INVALID_PARAMETER, "INVALID_PARAMETER", FieldName.ID)); } + log.info("inside mongoUpsertHelper "); + + log.info("application: " + application); + return mongoUpsertHelper.updateById(application, applicationId); } @@ -220,4 +224,8 @@ public Mono> getPublicApplicationIds(Collection applicationI } + + public Flux findAll() { + return repository.findAll(); + } } diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/runner/migrations/DatabaseChangelog.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/runner/migrations/DatabaseChangelog.java index 90d62e98b..6e33d075b 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/runner/migrations/DatabaseChangelog.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/runner/migrations/DatabaseChangelog.java @@ -18,6 +18,7 @@ import org.lowcoder.infra.config.model.ServerConfig; import org.lowcoder.infra.eventlog.EventLog; import org.lowcoder.infra.serverlog.ServerLog; +import org.lowcoder.runner.migrations.job.AddPtmFieldsJob; import org.lowcoder.runner.migrations.job.CompleteAuthType; import org.lowcoder.runner.migrations.job.MigrateAuthConfigJob; import org.springframework.data.domain.Sort; @@ -182,6 +183,11 @@ public void addOrgIdIndexOnServerLog(MongockTemplate mongoTemplate) { ); } + @ChangeSet(order = "020", id = "add-ptm-fields-to-applications", author = "") + public void addPtmFieldsToApplicatgions(AddPtmFieldsJob addPtmFieldsJob) { + addPtmFieldsJob.migrateApplicationsToInitPtmFields(); + } + public static Index makeIndex(String... fields) { if (fields.length == 1) { return new Index(fields[0], Sort.Direction.ASC).named(fields[0]); diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/runner/migrations/job/AddPtmFieldsJob.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/runner/migrations/job/AddPtmFieldsJob.java new file mode 100644 index 000000000..44b492f75 --- /dev/null +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/runner/migrations/job/AddPtmFieldsJob.java @@ -0,0 +1,6 @@ +package org.lowcoder.runner.migrations.job; + +public interface AddPtmFieldsJob { + + void migrateApplicationsToInitPtmFields(); +} diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/runner/migrations/job/AddPtmFieldsJobImpl.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/runner/migrations/job/AddPtmFieldsJobImpl.java new file mode 100644 index 000000000..b4701d710 --- /dev/null +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/runner/migrations/job/AddPtmFieldsJobImpl.java @@ -0,0 +1,29 @@ +package org.lowcoder.runner.migrations.job; + +import org.lowcoder.domain.application.service.ApplicationService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class AddPtmFieldsJobImpl implements AddPtmFieldsJob { + + @Autowired + private ApplicationService applicationService; + + @Override + public void migrateApplicationsToInitPtmFields() { + applicationService.findAll() + .doOnNext(application -> { + if(!application.isPublicToAll()) { + application.setPublicToAll(Boolean.FALSE); + } + if(!application.isPublicToMarketplace()) { + application.setPublicToMarketplace(Boolean.FALSE); + } + if(!application.agencyProfile()) { + application.setAgencyProfile(Boolean.FALSE); + } + }).flatMap(application -> applicationService.updateById(application.getId(), application)) + .blockLast(); + } +} From 86100fe06f79931209b3738fc76c5f02a560928d Mon Sep 17 00:00:00 2001 From: Abdul Qadir Date: Wed, 28 Feb 2024 14:40:56 +0500 Subject: [PATCH 6/6] Remove unnecessary logs --- .../domain/application/service/ApplicationService.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/ApplicationService.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/ApplicationService.java index 06ab6287e..dfc3f2a8d 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/ApplicationService.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/ApplicationService.java @@ -66,10 +66,6 @@ public Mono updateById(String applicationId, Application application) { return Mono.error(new BizException(BizError.INVALID_PARAMETER, "INVALID_PARAMETER", FieldName.ID)); } - log.info("inside mongoUpsertHelper "); - - log.info("application: " + application); - return mongoUpsertHelper.updateById(application, applicationId); }