feat: UIAlert with dynamic icon types and default button configurations (#1175)

* UIAlert with dynamic icon types and default button configurations

* Update src/gui/src/UI/UIAlert.js

Co-authored-by: Eric Dubé <eric.alex.dube@gmail.com>

* Update src/gui/src/UI/UIAlert.js

Co-authored-by: Eric Dubé <eric.alex.dube@gmail.com>

* fix: improve error handling in UIAlert component and reseting package-lock

* fix: update UIAlert to use 'type' for alert type selection

* fix: update UIAlert to use 'type' for button configuration

---------

Co-authored-by: Eric Dubé <eric.alex.dube@gmail.com>
This commit is contained in:
Aman Purohit
2025-03-14 19:18:38 -04:00
committed by GitHub
parent 505e7abda2
commit a278a6140b
2 changed files with 62 additions and 14 deletions
+55 -14
View File
@@ -19,31 +19,72 @@
import UIWindow from './UIWindow.js'
function UIAlert(options){
function UIAlert(options) {
// set sensible defaults
if(arguments.length > 0){
if (arguments.length > 0) {
// if first argument is a string, then assume it is the message
if(window.isString(arguments[0])){
if (window.isString(arguments[0])) {
options = {};
options.message = arguments[0];
}
// if second argument is an array, then assume it is the buttons
if(arguments[1] && Array.isArray(arguments[1])){
if (arguments[1] && Array.isArray(arguments[1])) {
options.buttons = arguments[1];
}
}
return new Promise(async (resolve) => {
// provide an 'OK' button if no buttons are provided
if(!options.buttons || options.buttons.length === 0){
if (!options.buttons || options.buttons.length === 0) {
options.buttons = [
{label: i18n('ok'), value: true, type: 'primary'}
{ label: i18n('ok'), value: true, type: 'primary' }
]
}
// Define alert types
const alertTypes = {
error: { icon: "danger.svg", title: "Error!", color: "#D32F2F" },
warning: { icon: "warning-sign.svg", title: "Warning!", color: "#FFA000" },
info: { icon: "reminder.svg", title: "Info", color: "#1976D2" },
success: { icon: "c-check.svg", title: "Success!", color: "#388E3C" },
confirm: { icon: "question.svg", title: "Are you sure?", color: "#555555" }
};
// set body icon
options.body_icon = options.body_icon ?? window.icons['warning-sign.svg'];
if(options.type === 'success')
// Set default values
const alertType = alertTypes[options.type] || alertTypes.warning;
options.message = options.title || alertType.title;
options.body_icon = options.body_icon ?? window.icons[alertType.icon];
options.color = options.color ?? alertType.color;
// Define buttons if not provided
if (!options.buttons || options.buttons.length === 0) {
switch (options.type) {
case "confirm":
options.buttons = [
{ label: "Yes", value: true, type: "primary" },
{ label: "No", value: false, type: "secondary" }
];
break;
case "error":
options.buttons = [
{ label: "Retry", value: "retry", type: "danger" },
{ label: "Cancel", value: "cancel", type: "secondary" }
];
break;
default:
options.buttons = [{ label: i18n('ok'), value: true, type: "primary" }];
break;
}
}
// callback support with correct resolve handling
options.buttons.forEach(button => {
button.onClick = () => {
if (options.callback) {
options.callback(button.value);
}
puter.ui.closeDialog();
};
});
if (options.type === 'success')
options.body_icon = window.icons['c-check.svg'];
let santized_message = html_encode(options.message);
@@ -62,9 +103,9 @@ function UIAlert(options){
// message
h += `<div class="window-alert-message">${santized_message}</div>`;
// buttons
if(options.buttons && options.buttons.length > 0){
if (options.buttons && options.buttons.length > 0) {
h += `<div style="overflow:hidden; margin-top:20px;">`;
for(let y=0; y<options.buttons.length; y++){
for (let y = 0; y < options.buttons.length; y++) {
h += `<button class="button button-block button-${html_encode(options.buttons[y].type)} alert-resp-button"
data-label="${html_encode(options.buttons[y].label)}"
data-value="${html_encode(options.buttons[y].value ?? options.buttons[y].label)}"
@@ -96,7 +137,7 @@ function UIAlert(options){
width: 350,
parent_uuid: options.parent_uuid,
...options.window_options,
window_css:{
window_css: {
height: 'initial',
},
body_css: {
@@ -112,8 +153,8 @@ function UIAlert(options){
// --------------------------------------------------------
// Button pressed
// --------------------------------------------------------
$(el_window).find('.alert-resp-button').on('click', async function(event){
event.preventDefault();
$(el_window).find('.alert-resp-button').on('click', async function (event) {
event.preventDefault();
event.stopPropagation();
resolve($(this).attr('data-value'));
$(el_window).close();
+7
View File
@@ -0,0 +1,7 @@
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Transformed by: SVG Repo Mixer Tools -->
<svg width="256px" height="256px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" stroke="#0f94e6">
<g id="SVGRepo_bgCarrier" stroke-width="0"/>

After

Width:  |  Height:  |  Size: 996 B