diff --git a/apps/demo/src/Views/Ui/components/Message.tsx b/apps/demo/src/Views/Ui/components/Message.tsx index 33da4da45..18b473d1b 100644 --- a/apps/demo/src/Views/Ui/components/Message.tsx +++ b/apps/demo/src/Views/Ui/components/Message.tsx @@ -1,16 +1,56 @@ import { useTranslation } from "@dzangolab/react-i18n"; -import { Button, Message, Page } from "@dzangolab/react-ui"; +import { Button, Message, Page, TDataTable } from "@dzangolab/react-ui"; import { useNavigate } from "react-router-dom"; -import { Section } from "../../../components/Demo"; +import { CodeBlock, Section } from "../../../components/Demo"; export const MessageDemo = () => { const [t] = useTranslation("ui"); const navigate = useNavigate(); + const propertiesData = [ + { + default: "false", + description: t("message.propertiesDescription.enableClose"), + prop: "enableClose", + type: "boolean", + }, + { + default: "-", + description: t("message.propertiesDescription.icon"), + prop: "icon", + type: "string | ReactNode", + }, + { + default: "-", + description: t("message.propertiesDescription.message"), + prop: "message", + type: "string | string[] | ReactNode", + }, + { + default: "-", + description: t("message.propertiesDescription.onClose"), + prop: "onClose", + type: "() => void", + }, + { + default: "info", + description: t("message.propertiesDescription.severity"), + prop: "severity", + type: `"info" | "success" | "warning" | "danger"`, + }, + { + default: "true", + description: t("message.propertiesDescription.showIcon"), + prop: "showIcon", + type: "boolean", + }, + ]; + return ( { /> } > -
+
+

{t("common.usage", { component: "Message" })}

+ +
+ +
+ + +
+ +
+ {t("message.contents.content1")}} /> + +
+ +
+ + +
+ +
+ + +
+ +
+ } + /> + +
+ +
} + enableClose={true} + icon={} + message={t("message.contents.content4")} + /> + +
+ +
+ + + + + + +
+
+ + +
+
+
diff --git a/apps/demo/src/locales/en/ui.json b/apps/demo/src/locales/en/ui.json index a48a6369f..4eade75d1 100644 --- a/apps/demo/src/locales/en/ui.json +++ b/apps/demo/src/locales/en/ui.json @@ -5,6 +5,14 @@ "common": { "usage": "To use the {{component}} component, simply import it into your React file:" }, + "propertiesTable": { + "header": { + "default": "Default", + "description": "Description", + "properties": "Properties", + "type": "Type" + } + }, "headers": { "buttons": "Buttons", "data": "Data", @@ -215,7 +223,39 @@ } }, "message": { - "title": "Message" + "contents": { + "content1": "Season Sale: Enjoy massive discounts with up to 50% off on a wide range of selected items — from fashion to electronics, don’t miss out on these limited-time offers!", + "content2": "New features just launched! Check them out!", + "content3": "New Year, New You: Start fresh with our services!", + "content4": "We value your feedback: take our quick survey!", + "content5": "Warning: Limited time only! Sale ends soon!", + "danger": "Danger message", + "info": "Info message", + "success": "Success message", + "warning": "Warning message" + }, + "subtitle": "The Message component displays contextual messages with optional icons and a closable action. It supports custom slots, making it flexible for various use cases.", + "propertiesDescription": { + "enableClose": "Displays a close icon if true, allowing the message to be dismissed.", + "icon": "Icon to display alongside the message.", + "message": "The message text to display in the component.", + "onClose": "Function to be called when the message is closed.", + "severity": "Defines the styling severity of the message. Defaults to 'info'.", + "showIcon": "Show default icon based on severity or custom icon if provided." + }, + "title": "Message", + "usage": { + "arrayMessage": "Array of message", + "basic": "Basic", + "customMessage": "Custom message", + "enableClose": "Enable close", + "hideIcon": "Hide default icon", + "icons": { + "customIcon": "Custom icon", + "icon": "Icon" + }, + "severity": "Severity" + } }, "modal": { "title": "Modal", diff --git a/apps/demo/src/locales/fr/ui.json b/apps/demo/src/locales/fr/ui.json index d7ef338f8..07f597644 100644 --- a/apps/demo/src/locales/fr/ui.json +++ b/apps/demo/src/locales/fr/ui.json @@ -5,6 +5,14 @@ "common": { "usage": "To use the {{component}} component, simply import it into your React file (fr):" }, + "propertiesTable": { + "header": { + "default": "Default (fr)", + "description": "Description (fr)", + "properties": "Properties (fr)", + "type": "Type (fr)" + } + }, "headers": { "buttons": "Buttons (fr)", "data": "Data (fr)", @@ -215,7 +223,39 @@ } }, "message": { - "title": "Message (fr)" + "contents": { + "content1": "Season Sale: Enjoy massive discounts with up to 50% off on a wide range of selected items — from fashion to electronics, don’t miss out on these limited-time offers! (fr)", + "content2": "New features just launched! Check them out! (fr)", + "content3": "New Year, New You: Start fresh with our services! (fr)", + "content4": "We value your feedback: take our quick survey! (fr)", + "content5": "Warning: Limited time only! Sale ends soon! (fr)", + "danger": "Danger message (fr)", + "info": "Info message (fr)", + "success": "Success message (fr)", + "warning": "Warning message (fr)" + }, + "subtitle": "The Message component displays contextual messages with optional icons and a closable action. It supports custom slots, making it flexible for various use cases. (fr)", + "propertiesDescription": { + "enableClose": "Displays a close icon if true, allowing the message to be dismissed. (fr)", + "icon": "Icon to display alongside the message. (fr)", + "message": "The message text to display in the component. (fr)", + "onClose": "Function to be called when the message is closed. (fr)", + "severity": "Defines the styling severity of the message. Defaults to 'info'. (fr)", + "showIcon": "Show default icon based on severity or custom icon if provided. (fr)" + }, + "title": "Message (fr)", + "usage": { + "arrayMessage": "Array of message (fr)", + "basic": "Basic (fr)", + "customMessage": "Custom message (fr)", + "enableClose": "Enable close (fr)", + "hideIcon": "Hide default icon (fr)", + "icons": { + "customIcon": "Custom icon (fr)", + "icon": "Icon (fr)" + }, + "severity": "Severity (fr)" + } }, "modal": { "title": "Modal (fr)", diff --git a/packages/ui/src/Message/index.tsx b/packages/ui/src/Message/index.tsx index d8a173c0a..01373e6e0 100644 --- a/packages/ui/src/Message/index.tsx +++ b/packages/ui/src/Message/index.tsx @@ -1,23 +1,84 @@ -import { ReactNode } from "react"; +import { ReactNode, useState } from "react"; type MessageProperties = { - message: string; - icon?: string | ReactNode; + enableClose?: boolean; + icon?: ReactNode; + message: string[] | ReactNode; + onClose?: () => void; + severity?: "info" | "success" | "warning" | "danger"; + showIcon?: boolean; }; -const Message = ({ message, icon }: MessageProperties) => { +const Message = ({ + onClose, + enableClose = false, + message, + icon, + severity = "info", + showIcon = true, +}: MessageProperties) => { + const [showMessage, setShowMessage] = useState(true); + + const defaultSeverityIcons = { + info: "pi pi-info-circle", + success: "pi pi-check-circle", + warning: "pi pi-exclamation-triangle", + danger: "pi pi-times-circle", + }; + + const handleClose = () => { + setShowMessage(false); + + if (onClose) { + onClose(); + } + }; + + if (!showMessage) { + return null; + } + const renderIcon = () => { return ( - {typeof icon === "string" ? : icon} + {!icon ? ( + + ) : typeof icon === "string" ? ( + + ) : ( + icon + )} ); }; + const renderMessageContent = () => { + if (typeof message === "string") { + return {message}; + } + + if (Array.isArray(message)) { + return ( +
    + {message.map((message_, index) => ( +
  • {message_}
  • + ))} +
+ ); + } + + return message; + }; + return ( -
- {renderIcon()} - {message} +
+ {showIcon && renderIcon()} +
{renderMessageContent()}
+ {enableClose && ( + + + + )}
); }; diff --git a/packages/ui/src/assets/css/dropdown-menu.css b/packages/ui/src/assets/css/dropdown-menu.css index a00ef3c72..28908f339 100644 --- a/packages/ui/src/assets/css/dropdown-menu.css +++ b/packages/ui/src/assets/css/dropdown-menu.css @@ -41,7 +41,6 @@ ul.dropdown-menu-list { min-width: 160px; overflow: hidden; padding-inline-start: 0; - width: max-content; } ul.dropdown-menu-list li { diff --git a/packages/ui/src/assets/css/message.css b/packages/ui/src/assets/css/message.css index 331b791b6..2a9d68bf2 100644 --- a/packages/ui/src/assets/css/message.css +++ b/packages/ui/src/assets/css/message.css @@ -1,7 +1,51 @@ -.message{ - padding: 1rem; - background-color: var(--blue-100); - border-radius: 0.5rem; - border: 1px solid var(--blue-800); - color: solid var(--blue-800); +.message { + background-color: color-mix(in srgb, var(--_background-color) 10%, #fff); + border-radius: 0.5rem; + border: 1px solid var(--_border-color); + color: var(--_color); + display: flex; + gap: 1rem; + padding: .5rem 1rem; +} + +.message .message-content { + flex: 1; +} + +.message-content ul { + display: flex; + flex-direction: column; + gap: 0.5rem; + list-style-type: disc; + margin: 0 1rem; + padding: 0; +} + +.message .close-message { + color: var(--color); + cursor: pointer; +} + +.message.danger { + --_background-color: var(--dz-danger-color); + --_border-color: var(--dz-danger-color); + --_color: var(--dz-danger-color); +} + +.message.info { + --_background-color: var(--dz-primary-color); + --_border-color: var(--dz-primary-color); + --_color: var(--dz-primary-color); +} + +.message.success { + --_background-color: var(--dz-success-color); + --_border-color: var(--dz-success-color); + --_color: var(--dz-success-color); +} + +.message.warning { + --_background-color: var(--dz-warning-color); + --_border-color: var(--dz-warning-color); + --_color: var(--dz-warning-color); }