Files
pilot/gnome-pilot-extension/ui/commandEditDialog.js
2026-01-10 20:24:11 +01:00

154 lines
4.3 KiB
JavaScript

// ui/commandEditDialog.js - Dialogue d'édition pour la allowlist des commandes
import GObject from 'gi://GObject';
import Gtk from 'gi://Gtk';
import Adw from 'gi://Adw';
/**
* Dialogue pour éditer la liste des commandes autorisées
*/
export const CommandEditDialog = GObject.registerClass(
class CommandEditDialog extends Adw.Window {
_init(parent, currentAllowlist) {
super._init({
transient_for: parent,
modal: true,
title: 'Edit Allowed Commands',
default_width: 500,
default_height: 400,
});
this._currentAllowlist = [...currentAllowlist];
this._buildUI();
}
/**
* Construit l'interface du dialogue
*/
_buildUI() {
// Header bar
const headerBar = new Adw.HeaderBar();
const cancelButton = new Gtk.Button({
label: 'Cancel',
});
cancelButton.connect('clicked', () => {
this.emit('response', Gtk.ResponseType.CANCEL);
});
headerBar.pack_start(cancelButton);
const saveButton = new Gtk.Button({
label: 'Save',
});
saveButton.add_css_class('suggested-action');
saveButton.connect('clicked', () => {
this.emit('response', Gtk.ResponseType.OK);
});
headerBar.pack_end(saveButton);
// Toolbar view
const toolbarView = new Adw.ToolbarView();
toolbarView.add_top_bar(headerBar);
// Main content
const contentBox = new Gtk.Box({
orientation: Gtk.Orientation.VERTICAL,
spacing: 12,
margin_top: 12,
margin_bottom: 12,
margin_start: 12,
margin_end: 12,
});
// Info label
const infoLabel = new Gtk.Label({
label: 'Select which commands are allowed to be executed via MQTT:',
wrap: true,
xalign: 0,
});
contentBox.append(infoLabel);
// Available commands
const availableCommands = ['shutdown', 'reboot', 'sleep', 'hibernate', 'screen'];
// List box for commands
const listBox = new Gtk.ListBox({
selection_mode: Gtk.SelectionMode.NONE,
});
listBox.add_css_class('boxed-list');
this._commandCheckboxes = {};
for (const command of availableCommands) {
const row = new Adw.ActionRow({
title: command.charAt(0).toUpperCase() + command.slice(1),
subtitle: this._getCommandDescription(command),
});
const checkbox = new Gtk.CheckButton({
active: this._currentAllowlist.includes(command),
valign: Gtk.Align.CENTER,
});
this._commandCheckboxes[command] = checkbox;
row.add_suffix(checkbox);
row.activatable_widget = checkbox;
listBox.append(row);
}
// Scrolled window
const scrolledWindow = new Gtk.ScrolledWindow({
vexpand: true,
hscrollbar_policy: Gtk.PolicyType.NEVER,
});
scrolledWindow.set_child(listBox);
contentBox.append(scrolledWindow);
// Warning label
const warningLabel = new Gtk.Label({
label: '⚠️ Warning: These commands have system-wide effects. Enable only commands you need.',
wrap: true,
xalign: 0,
});
warningLabel.add_css_class('warning');
contentBox.append(warningLabel);
toolbarView.set_content(contentBox);
this.set_content(toolbarView);
}
/**
* Retourne une description pour chaque commande
*/
_getCommandDescription(command) {
const descriptions = {
'shutdown': 'Power off the system',
'reboot': 'Restart the system',
'sleep': 'Suspend to RAM (sleep mode)',
'hibernate': 'Suspend to disk (hibernate)',
'screen': 'Control screen on/off state',
};
return descriptions[command] || 'No description available';
}
/**
* Récupère la nouvelle allowlist
*/
getAllowlist() {
const allowlist = [];
for (const [command, checkbox] of Object.entries(this._commandCheckboxes)) {
if (checkbox.active) {
allowlist.push(command);
}
}
return allowlist;
}
});