Compare commits

...

4 Commits

Author SHA1 Message Date
John Crisp
91105c83c9 Finish Backup add Printers and small tweaks 2025-06-12 18:52:32 +02:00
John Crisp
f3295483b2 Continue Backup files. Various formatting fixes and show hide passwords 2025-06-11 19:13:32 +02:00
John Crisp
eb05438d80 Updated remote access and flag JS 2025-06-11 11:58:16 +02:00
John Crisp
22fbb582d2 Tweak login template 2025-06-11 10:24:40 +02:00
26 changed files with 883 additions and 612 deletions

View File

@@ -208,7 +208,7 @@ document.addEventListener('DOMContentLoaded', () => {
//if (!response.ok) throw new Error('Country not found'); //if (!response.ok) throw new Error('Country not found');
//const data = await response.json(); //const data = await response.json();
//// Return the name in the native language //// Return the name in the native language
//return data[0].name.common; //return data[0].name.common;
//} catch (error) { //} catch (error) {
//console.error(error); //console.error(error);
//return 'Unknown Country'; //return 'Unknown Country';
@@ -222,7 +222,7 @@ document.addEventListener('DOMContentLoaded', () => {
function getCountryCodeFromLanguage(language) { function getCountryCodeFromLanguage(language) {
return languageToCountryMap[language] ? languageToCountryMap[language].code : null; return languageToCountryMap[language] ? languageToCountryMap[language].code : null;
} }
function getCountryNameFromCountryCode(countryCode) { function getCountryNameFromCountryCode(countryCode) {
//alert(`Country code: ${countryCode}`); //alert(`Country code: ${countryCode}`);
for (const language in languageToCountryMap) { for (const language in languageToCountryMap) {
@@ -263,11 +263,15 @@ document.addEventListener('DOMContentLoaded', () => {
function displayLocaleAndFlag() { function displayLocaleAndFlag() {
// Get the browser locale // Get the browser locale
const userLocale = navigator.language || navigator.userLanguage; const userLocale = navigator.languages && navigator.languages.length
? navigator.languages[0]
: navigator.language;
//alert(`User Locale: ${userLocale}`); // Alert the detected locale //alert(`User Locale: ${userLocale}`); // Alert the detected locale
//console.log(navigator.languages); // Log language to console
const { flag, isUnknown, countryCode } = getFlagEmoji(userLocale); const { flag, isUnknown, countryCode } = getFlagEmoji(userLocale);
//alert(`Country Code: ${countryCode}, Is Unknown: ${isUnknown}`); // Debug country code and unknown flag status //alert(`Country Code: ${countryCode}, Is Unknown: ${isUnknown}`); // Debug country code and unknown flag status
// Display the locale and the corresponding flag (or fallback) // Display the locale and the corresponding flag (or fallback)
@@ -278,7 +282,7 @@ function displayLocaleAndFlag() {
fallbackDiv.className = 'fallback-box'; fallbackDiv.className = 'fallback-box';
fallbackDiv.textContent = `? ${userLocale.toUpperCase()}`; // Show ? and locale code inside the box fallbackDiv.textContent = `? ${userLocale.toUpperCase()}`; // Show ? and locale code inside the box
document.getElementById('flag-container').appendChild(fallbackDiv); document.getElementById('flag-container').appendChild(fallbackDiv);
// Tooltip for fallback // Tooltip for fallback
fallbackDiv.title = "Unknown Country"; // Tooltip for fallback fallbackDiv.title = "Unknown Country"; // Tooltip for fallback
//alert('Fallback triggered: Unknown Country'); // Debug fallback //alert('Fallback triggered: Unknown Country'); // Debug fallback
@@ -290,7 +294,7 @@ function displayLocaleAndFlag() {
flagSpan.textContent = flag; // Use flag emoji flagSpan.textContent = flag; // Use flag emoji
flagSpan.title = countryName; // Tooltip for the flag in country language flagSpan.title = countryName; // Tooltip for the flag in country language
document.getElementById('flag-container').appendChild(flagSpan); document.getElementById('flag-container').appendChild(flagSpan);
//alert(`Flag Emoji: ${flag}`); // Debug flag emoji display //alert(`Flag Emoji: ${flag}`); // Debug flag emoji display
} }
} }

View File

@@ -15,7 +15,7 @@
<div class="text-danger"> <div class="text-danger">
<%= $c->render_to_string(inline => stash 'error') %> <%= $c->render_to_string(inline => stash 'error') %>
</div> </div>
%} % }
<h1><%= $title%></h1> <h1><%= $title%></h1>
@@ -39,9 +39,9 @@
</div> </div>
<div class="col-auto"> <div class="col-auto">
% if ( $bac_datas->{status} eq 'checked' ) { % if ( $bac_datas->{status} eq 'checked' ) {
<input type='checkbox' name='Tapebackup' checked > <input type='checkbox' name='Tapebackup' aria-describedby="enabled" checked >
% } else { % } else {
<input type='checkbox' name='Tapebackup'> <input type='checkbox' name='Tapebackup' aria-describedby="disabled">
% } % }
</div> </div>
</div> </div>
@@ -50,17 +50,20 @@
<div class="row g-3 align-items-center"> <div class="row g-3 align-items-center">
<div class="col-md-2"> <div class="col-md-2">
<%= l 'bac_TAPE_BACKUP_TIME' %> <label for="inputBackupHour" class="col-form-label"><%= l 'bac_TAPE_BACKUP_TIME' %></label>
<label for="inputBackupMin" class="col-form-label"></label>
</div> </div>
<div class="col-auto"> <div class="col-auto">
% param 'BackupHour' => $bac_datas->{backupHour} unless param 'BackupHour'; % param 'BackupHour' => $bac_datas->{backupHour} unless param 'BackupHour';
<%= text_field 'BackupHour', size => '2' %> <input type="text" name="BackupHour" id="inputBackupHour" class="form-control" maxlength="2" size="4" aria-describedby="Backup Hour" value="<%= $bac_datas->{backupHour} %>">
</div>
<div class="col-auto">
% param 'BackupMin' => $bac_datas->{backupMin} unless param 'BackupMin'; % param 'BackupMin' => $bac_datas->{backupMin} unless param 'BackupMin';
<%= text_field 'BackupMin', size => '2' %> <input type="text" name="BackupMin" id="inputBackupMin" class="form-control" maxlength="2" size="4" aria-describedby="Backup Minute" value="<%= $bac_datas->{backupMin} %>">
</div> </div>
<div class="col-auto"> <div class="col-auto">
% param 'BackupAMPM' => $bac_datas->{backupAMPM} unless param 'BackupAMPM'; % param 'BackupAMPM' => $bac_datas->{backupAMPM} unless param 'BackupAMPM';
<%= select_field 'BackupAMPM' => ['AM', 'PM'], class => "form-select" %> <%= select_field 'BackupAMPM' => ['AM', 'PM'], class => "form-select" %>
</div> </div>
</div> </div>
@@ -69,17 +72,20 @@
<div class="row g-3 align-items-center"> <div class="row g-3 align-items-center">
<div class="col-md-2"> <div class="col-md-2">
<%= l 'bac_LOAD_TAPE_REMINDER_TIME' %> <label for="inputReminderMin" class="col-form-label"><%= l 'bac_LOAD_TAPE_REMINDER_TIME' %></label>
<label for="inputReminderMin" class="col-form-label"></label>
</div> </div>
<div class="col-auto"> <div class="col-auto">
% param 'ReminderHour' => $bac_datas->{reminderHour} unless param 'ReminderHour'; % param 'ReminderHour' => $bac_datas->{reminderHour} unless param 'ReminderHour';
<%= text_field 'ReminderHour', size => '2' %> <input type="text" name="ReminderHour" id="inputReminderHour" class="form-control" maxlength="2" size="4" aria-describedby="Reminder Hour" value="<%= $bac_datas->{reminderHour} %>">
</div>
<div class="col-auto">
% param 'ReminderMin' => $bac_datas->{reminderMin} unless param 'ReminderMin'; % param 'ReminderMin' => $bac_datas->{reminderMin} unless param 'ReminderMin';
<%= text_field 'ReminderMin', size => '2' %> <input type="text" name="ReminderMin" id="inputReminderMin" class="form-control" maxlength="2" size="4" aria-describedby="Reminder Minute" value="<%= $bac_datas->{reminderMin} %>">
</div> </div>
<div class="col-auto"> <div class="col-auto">
% param 'ReminderAMPM' => $bac_datas->{reminderAMPM} unless param 'ReminderAMPM'; % param 'ReminderAMPM' => $bac_datas->{reminderAMPM} unless param 'ReminderAMPM';
<%= select_field 'ReminderAMPM' => ['AM', 'PM'], class => "form-select" %> <%= select_field 'ReminderAMPM' => ['AM', 'PM'], class => "form-select" %>
</div> </div>
</div> </div>

View File

@@ -5,10 +5,10 @@
<div class="card-body"> <div class="card-body">
% if (config->{debug} == 1) { % if (config->{debug} == 1) {
<pre> <pre>
<%= dumper $c->current_route %> <%= dumper $c->current_route %>
<%= dumper $bac_datas %> <%= dumper $bac_datas %>
</pre> </pre>
% } % }
% if ( stash 'error' ) { % if ( stash 'error' ) {
@@ -22,13 +22,15 @@
<br> <br>
<h2><%=l 'bac_RESTORE_CONF_FROM_TAPE' %></h2>
<br>
<form action="/smanager/backupd" method="POST"> <form action="/smanager/backupd" method="POST">
<h2><%=l 'bac_RESTORE_CONF_FROM_TAPE' %></h2> <div>
<%= $c->render_to_string(inline => (l 'bac_RESTORE_CONF_FROM_TAPE_DESC')) %>
<br> </div>
<%= $c->render_to_string(inline => (l 'bac_RESTORE_CONF_FROM_TAPE_DESC')) %>
<br> <br>

View File

@@ -5,31 +5,34 @@
<div class="card-body"> <div class="card-body">
% if (config->{debug} == 1) { % if (config->{debug} == 1) {
<pre> <pre>
<%= dumper $c->current_route %> <%= dumper $c->current_route %>
<%= dumper $bac_datas %> <%= dumper $bac_datas %>
</pre> </pre>
% } % }
% if ( stash 'error' ) { % if ( stash 'error' ) {
<br><div class="text-danger"> <br>
<%= $c->render_to_string(inline => stash 'error') %> <div class="text-danger">
</div> <%= $c->render_to_string(inline => stash 'error') %>
%} </div>
% }
<h1><%= $title%></h1> <h1><%= $title%></h1>
<br> <br>
<form action="/smanager/backup" method="POST"> <h2><%= l 'bac_CONFIGURE_WORKSTN_BACKUP' %></h2>
<h2><%= l 'bac_CONFIGURE_WORKSTN_BACKUP' %></h2> <br>
<br>
<div>
<%= $c->render_to_string(inline => (l 'bac_WORKSTN_BACKUP_DESC')) %> <%= $c->render_to_string(inline => (l 'bac_WORKSTN_BACKUP_DESC')) %>
</div>
<br> <br>
<form action="/smanager/backup" method="POST">
<div> <div>
<%= l 'bac_WORKSTN_BACKUP_ENABLED' %>: <%= $bac_datas->{status} %> <%= l 'bac_WORKSTN_BACKUP_ENABLED' %>: <%= $bac_datas->{status} %>

View File

@@ -5,169 +5,268 @@
<div class="card-body"> <div class="card-body">
% if (config->{debug} == 1) { % if (config->{debug} == 1) {
<p> <pre>
%= dumper $c->current_route <%= dumper $c->current_route %>
%= dumper $bac_datas <%= dumper $bac_datas %>
</p> </pre>
% } % }
% if ( stash 'error' ) { % if ( stash 'error' ) {
<br><div> <br>
%= $c->render_to_string(inline => stash 'error') <div class="text-danger">
</div> <%= $c->render_to_string(inline => stash 'error') %>
%} </div>
% }
<h1><%= $title%></h1> <h1><%= $title%></h1>
<h2>
%=l 'bac_CONFIGURE_WORKSTN_BACKUP'
</h2>
%= $c->render_to_string(inline => (l 'bac_CONFIGURE_WORKSTN_BACKUP_DESC'))
%= form_for '/backupd' => (method => 'POST') => begin
<p>
<span class="">
%=l 'bac_ENABLE_WORKSTN_BACKUP'
</span>
<span class="">
% if ( $bac_datas->{status} eq 'checked' ) {
<input type='checkbox' name='Workstnbackup' checked >
%} else {
%= check_box 'Workstnbackup'
%}
</span>
</p>
<p>
<h3>
%= l 'bac_WORKSTATION_BACKUP_DEST'
</h3>
<br> <br>
% if ( $bac_datas->{vfstype} =~ m/cifs|nfs/s ) { <h2><%= l 'bac_CONFIGURE_WORKSTN_BACKUP' %></h2>
<span class="">
%=l 'bac_WORKSTN_NAME'
</span>
<span class="">
% param 'BackupwkStation' => $bac_datas->{station} unless param 'BackupwkStation';
%= text_field 'BackupwkStation', size => 20, class => ""
</span>
<br>
%}
% if ( $bac_datas->{vfstype} eq 'usb' ) {
<span class="">
%=l 'bac_local removable disk'
</span>
<span class="">
% param 'BackupwkFolder' => $bac_datas->{mount} unless param 'BackupwkFolder';
%= select_field 'BackupwkFolder' => $c->get_BackupwkDest_options( $bac_datas->{vfstype}), class => ""
</span>
<br>
% } elsif ( $bac_datas->{vfstype} eq 'mnt') {
<span class="">
%=l 'bac_Mounted disk'
</span>
<span class="">
% param 'BackupwkFolder' => $bac_datas->{folder} unless param 'BackupwkFolder';
%= select_field 'BackupwkFolder' => $c->get_BackupwkDest_options( $bac_datas->{vfstype}), class => ""
</span>
<br>
% } else {
<span class="">
%=l 'bac_SHARED_FOLDER_NAME'
</span><span class="">
% param 'BackupwkFolder' => $bac_datas->{folder} unless param 'BackupwkFolder';
%= text_field 'BackupwkFolder', size => 20, class => ""
</span>
<br>
%}
% if ( $bac_datas->{vfstype} eq 'cifs' ) {
<span class="">
%=l 'bac_WORKSTN_LOGIN'
</span><span class="">
% param 'BackupwkLogin' => $bac_datas->{login} unless param 'BackupwkLogin';
%= text_field 'BackupwkLogin', size => 12, class => ""
</span>
<br>
<span class="">
%=l 'bac_PASSWORD'
</span><span class="">
% param 'BackupwkPassword' => $bac_datas->{password} unless param 'BackupwkPassword';
%= password_field 'BackupwkPassword', size => 12, class => ""
</span>
%}
</p><br><h3>
%= l 'bac_WORKSTN_BACKUP_SETTINGS'
</h3><br>
<p>
<span class="">
%=l 'bac_NUMBER_OF_SETS'
</span>
<span class="">
% param 'SetsNumber' => $bac_datas->{setsNumber} unless param 'SetsNumber';
%= text_field 'SetsNumber', size => '3'
</span>
%=l 'bac_NUMBER_OF_FILES_IN_SET'
<span class="">
% param 'Filesinset' => $bac_datas->{filesinset} unless param 'Filesinset';
%= text_field 'Filesinset', size => '3'
</span></p>
<p>
<span class="">
%=l 'bac_WORKSTN_BACKUP_TIME'
</span>
<span class="">
% param 'BackupwkHour' => $bac_datas->{hour} unless param 'BackupwkHour';
%= text_field 'BackupwkHour', size => '2'
% param 'BackupwkMin' => $bac_datas->{min} unless param 'BackupwkMin';
%= text_field 'BackupwkMin', size => '2'
</span>
%=l 'AM/PM:'
<span class="">
% param 'BackupwkAMPM' => $bac_datas->{ampm} unless param 'BackupwkAMPM';
%= select_field 'BackupwkAMPM' => ['AM', 'PM'], class => ""
</span>
</p>
<p><span class="">
%=l 'bac_WORKSTN_TIMEOUT'
</span>
<span class="">
% param 'BackupwkTimeout' => $bac_datas->{timeout} unless param 'BackupwkTimeout';
%= text_field 'BackupwkTimeout', size => '2'
</span>
%=l 'bac_INC_ONLY_TIMEOUT'
<span class="">
% if ( $bac_datas->{incOnlyTimeout} eq 'checked' ) {
<input type='checkbox' name='IncOnlyTimeout' checked >
%} else {
%= check_box 'IncOnlyTimeout'
%}
</span></p>
<p>
<span class="">
%=l 'bac_COMPRESSION_LEVEL'
</span>
<span class="">
% param 'Compression' => $bac_datas->{compression} unless param 'Compression';
%= text_field 'Compression', size => '1'
</span>
%=l 'bac_FULL_ONLY_ON'
<span class="">
% param 'Dof' => $bac_datas->{dof} unless param 'Dof';
%= select_field 'Dof' => $c->get_dow_list(), class => ""
</p>
<br> <br>
<div>
<%= $c->render_to_string(inline => (l 'bac_CONFIGURE_WORKSTN_BACKUP_DESC')) %>
<div>
<br>
<form action="/smanager/backupd" method="POST">
<div class="row g-3 align-items-center">
<div class="col-md-2">
<%= l 'bac_ENABLE_WORKSTN_BACKUP' %>
</div>
<div class="col-auto">
% if ( $bac_datas->{status} eq 'checked' ) {
<input type='checkbox' name='Workstnbackup' aria-describedby="enabled" checked >
% } else {
<input type='checkbox' name='Workstnbackup' aria-describedby="disabled">
% }
</div>
</div>
</p>
<p>
<h3>
%= l 'bac_WORKSTATION_BACKUP_DEST'
</h3>
<br>
% if ( $bac_datas->{vfstype} =~ m/cifs|nfs/s ) {
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputBackupWorkStationName" class="col-form-label"><%= l 'bac_WORKSTN_NAME' %></label>
</div>
<div class="col-auto">
% param 'BackupwkStation' => $bac_datas->{station} unless param 'BackupwkStation';
<input type="text" name="BackupwkStation" id="inputBackupWorkStationName" class="form-control"
size="20" aria-describedby="Workstation Name" value="<%= $bac_datas->{station} %>">
</div>
</div>
<br>
% }
% if ( $bac_datas->{vfstype} eq 'usb' ) {
<div class="row g-3 align-items-center">
<div class="col-md-2">
<%= l 'bac_local removable disk' %>
</div>
<div class="col-auto">
% param 'BackupwkFolder' => $bac_datas->{mount} unless param 'BackupwkFolder';
<%= select_field 'BackupwkFolder' => $c->get_BackupwkDest_options( $bac_datas->{vfstype}), class => "form-select" %>
</div>
</div>
<br>
% } elsif ( $bac_datas->{vfstype} eq 'mnt') {
<div class="row g-3 align-items-center">
<div class="col-md-2">
<%= l 'bac_Mounted disk' %>
</div>
<div class="col-auto">
% param 'BackupwkFolder' => $bac_datas->{folder} unless param 'BackupwkFolder';
<%= select_field 'BackupwkFolder' => $c->get_BackupwkDest_options( $bac_datas->{vfstype}), class => "form-select" %>
</div>
</div>
<br>
% } else {
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputBackupSharedFolderName" class="col-form-label"><%= l 'bac_SHARED_FOLDER_NAME' %></label>
</div>
<div class="col-auto">
<input type="text" name="BackupwkFolder" id="inputBackupSharedFolderName" class="form-control"
size="20" aria-describedby="Backup Shared Folder Name" value="<%= $bac_datas->{folder} %>">
</div>
</div>
<br>
% }
% if ( $bac_datas->{vfstype} eq 'cifs' ) {
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputBackupWorkLogin" class="col-form-label"><%= l 'bac_WORKSTN_LOGIN' %></label>
</div>
<div class="col-auto">
% param 'BackupwkLogin' => $bac_datas->{login} unless param 'BackupwkLogin';
<input type="text" name="BackupwkLogin" id="inputBackupWorkLogin" class="form-control"
size="12" aria-describedby="Backup Workstation Login" value="<%= $bac_datas->{login} %>">
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="password" class="col-form-label"><%= l 'bac_PASSWORD' %></label>
</div>
<div class="col-auto">
% param 'BackupwkPassword' => $bac_datas->{password} unless param 'BackupwkPassword';
<input type="password" name="BackupwkPassword" id="password" class="form-control" size="12" aria-describedby="Backup Workstation Password" value="<%= $bac_datas->{password} %>">
</div>
<div class="col-auto">
<span id="togglePassword" class="bi bi-eye"></span>
</div>
</div>
% }
<br>
<h3><%= l 'bac_WORKSTN_BACKUP_SETTINGS' %></h3>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputNumberofSets" class="col-form-label"><%= l 'bac_NUMBER_OF_SETS' %></label>
</div>
<div class="col-auto">
% param 'SetsNumber' => $bac_datas->{setsNumber} unless param 'SetsNumber';
<input type="text" name="SetsNumber" id="inputNumberofSets" class="form-control" maxlength="3" size="3" aria-describedby="Number of sets" value="<%= $bac_datas->{setsNumber} %>">
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputFilesinSet" class="col-form-label"><%= l 'bac_NUMBER_OF_FILES_IN_SET' %></label>
</div>
<div class="col-auto">
% param 'Filesinset' => $bac_datas->{filesinset} unless param 'Filesinset';
<input type="text" name="Filesinset" id="inputFilesinSet" class="form-control" maxlength="3" size="3" aria-describedby="Files in set" value="<%= $bac_datas->{filesinset} %>">
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputWorkstationBackupHour" class="col-form-label"><%= l 'bac_WORKSTN_BACKUP_TIME' %></label>
<label for="inputWorkstationBackupMin" class="col-form-label"></label>
</div>
<div class="col-auto">
% param 'BackupwkHour' => $bac_datas->{hour} unless param 'BackupwkHour';
<input type="text" name="BackupwkHour" id="inputWorkstationBackupHour" class="form-control" maxlength="2" size="4" aria-describedby="Backup Hour" value="<%= $bac_datas->{hour} %>">
</div>
<div class="col-auto">
% param 'BackupwkMin' => $bac_datas->{min} unless param 'BackupwkMin';
<input type="text" name="BackupwkMin" id="inputWorkstationBackupMin" class="form-control" maxlength="2" size="4" aria-describedby="Backup Minute" value="<%= $bac_datas->{min} %>">
</div>
<div class="col-auto">
<%= l 'AM/PM:' %>
</div>
<div class="col-auto">
% param 'BackupwkAMPM' => $bac_datas->{ampm} unless param 'BackupwkAMPM';
<%= select_field 'BackupwkAMPM' => ['AM', 'PM'], class => "form-select" %>
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputWorkstationTimeout" class="col-form-label"><%= l 'bac_WORKSTN_TIMEOUT' %></label>
</div>
<div class="col-auto">
% param 'BackupwkTimeout' => $bac_datas->{timeout} unless param 'BackupwkTimeout';
<input type="text" name="BackupwkTimeout" id="inputWorkstationTimeout" class="form-control" maxlength="2" size="2" aria-describedby="Workstation Timeout" value="<%= $bac_datas->{timeout} %>">
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<%= l 'bac_INC_ONLY_TIMEOUT' %>
</div>
<div class="col-auto">
% if ( $bac_datas->{incOnlyTimeout} eq 'checked' ) {
<input type='checkbox' name='IncOnlyTimeout' aria-describedby="enabled" checked >
% } else {
<input type='checkbox' name='IncOnlyTimeout' aria-describedby="disabled">
% }
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputBackupCompression" class="col-form-label"><%= l 'bac_COMPRESSION_LEVEL' %></label>
</div>
<div class="col-auto">
% param 'Compression' => $bac_datas->{compression} unless param 'Compression';
<input type="text" name="Compression" id="inputBackupCompression" class="form-control" maxlength="1" size="1" aria-describedby="Compression level" value="<%= $bac_datas->{compression} %>">
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<%= l 'bac_FULL_ONLY_ON' %>
</div>
<div class="col-auto">
% param 'Dof' => $bac_datas->{dof} unless param 'Dof';
%= select_field 'Dof' => $c->get_dow_list(), class => "form-select"
</div>
</div>
<br>
%= hidden_field 'Function' => $bac_datas->{function}
%= hidden_field 'VFSType' => $bac_datas->{vfstype}
% my $btn = l('bac_UPDATE_CONF');
<div class="row g-3 align-items-center">
<div class="col-md-2">
<button type="submit" class="btn btn-primary" value="<%=$c->l('NEXT')%>"><%= $btn %></button>
</div>
</div>
<br>
</form>
%= hidden_field 'Function' => $bac_datas->{function}
%= hidden_field 'VFSType' => $bac_datas->{vfstype}
%= submit_button $c->l('bac_UPDATE_CONF'), class => ""
% end
</div> </div>
% end % end

View File

@@ -5,42 +5,64 @@
<div class="card-body"> <div class="card-body">
% if (config->{debug} == 1) { % if (config->{debug} == 1) {
<p> <pre>
%= dumper $c->current_route <%= dumper $c->current_route %>
%= dumper $bac_datas <%= dumper $bac_datas %>
</p> </pre>
% } % }
% if ( stash 'error' ) { % if ( stash 'error' ) {
<br><div class=""> <br>
%= $c->render_to_string(inline => stash 'error') <div class="text-danger">
</div> <%= $c->render_to_string(inline => stash 'error') %>
%} </div>
% }
<h1><%= $title%></h1> <h1><%= $title%></h1>
%= form_for '/backupd' => (method => 'POST') => begin <br>
<h2> <h2><%= l 'bac_WORKSTN_RESTORE' %></h2>
%=l 'bac_WORKSTN_RESTORE'
</h2>
<br><br> <br>
% if ($bac_datas->{status} ne 'enabled') {
%= $c->render_to_string(inline => (l 'bac_CONFIGURATION_TO_BE_DONE'))
% } else {
%= $c->render_to_string(inline => (l 'bac_RESTORE_CONF_FROM_WORKSTN_DESC') . ' ' . $c->get_shared_folder_to_verify())
%}
<br><br><span class=""> <form action="/smanager/backupd" method="POST">
%=l 'bac_SELECT_BACKUP_FILE'
</span> % if ($bac_datas->{status} ne 'enabled') {
<span class=""> <div>
%= select_field 'Backupset' => $c->get_Backupset_options(), class => "" <%= $c->render_to_string(inline => (l 'bac_CONFIGURATION_TO_BE_DONE')) %>
</span><br><br> </div>
% } else {
<div>
<%= $c->render_to_string(inline => (l 'bac_RESTORE_CONF_FROM_WORKSTN_DESC') . ' ' . $c->get_shared_folder_to_verify()) %>
</div>
% }
<br><br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<%= l 'bac_SELECT_BACKUP_FILE' %>
</div>
<div class="col-auto">
<%= select_field 'Backupset' => $c->get_Backupset_options(), class => "form-select" %>
</div>
</div>
<br><br>
<%= hidden_field 'Function' => $bac_datas->{'function'} %>
% my $btn = l('bac_RESTORE_FROM_WORKSTN');
<div class="row g-3 align-items-center">
<div class="col-md-2">
<button type="submit" class="btn btn-primary"><%= $btn %></button>
</div>
</div>
</form>
%= hidden_field 'Function' => $bac_datas->{'function'}
%= submit_button $c->l('bac_RESTORE_FROM_WORKSTN'), class => ""
% end
</div> </div>
% end % end

View File

@@ -5,33 +5,49 @@
<div class="card-body"> <div class="card-body">
% if (config->{debug} == 1) { % if (config->{debug} == 1) {
<p> <pre>
%= dumper $c->current_route <%= dumper $c->current_route %>
%= dumper $bac_datas <%= dumper $bac_datas %>
</p> </pre>
% } % }
% if ( stash 'error' ) { % if ( stash 'error' ) {
<br><div class=""> <br>
%= $c->render_to_string(inline => stash 'error') <div class="text-danger">
</div> <%= $c->render_to_string(inline => stash 'error') %>
%} </div>
% }
<h1><%= $title%></h1> <h1><%= $title%></h1>
%= form_for '/backupd' => (method => 'POST') => begin <br>
<h2><%= l 'bac_WORKSTN_RESTORE' %></h2>
<br>
<form action="/smanager/backupd" method="POST">
<div>
<%= $c->render_to_string(inline => $bac_datas->{restore_log}) %>
</div>
<br>
<div>
<%= l 'bac_YOU_MUST_REBOOT' %>
</div>
<%= hidden_field 'Function' => $bac_datas->{'function'} %>
% my $btn = l('bac_REBOOT');
<div class="row g-3 align-items-center">
<div class="col-md-2">
<button type="submit" class="btn btn-primary"><%= $btn %></button>
</div>
</div>
</form>
<h2>
%=l 'bac_WORKSTN_RESTORE'
</h2>
<p>
%= $c->render_to_string(inline => $bac_datas->{restore_log})
</p><p>
%=l 'bac_YOU_MUST_REBOOT'
</p>
%= hidden_field 'Function' => $bac_datas->{'function'}
%= submit_button $c->l('bac_REBOOT'), class => ""
% end
</div> </div>
% end % end

View File

@@ -5,49 +5,73 @@
<div class="card-body"> <div class="card-body">
% if (config->{debug} == 1) { % if (config->{debug} == 1) {
<p> <pre>
%= dumper $c->current_route <%= dumper $c->current_route %>
%= dumper $bac_datas <%= dumper $bac_datas %>
</p> </pre>
% } % }
% if ( stash 'error' ) { % if ( stash 'error' ) {
<br><div class=""> <br><div class="text-danger">
%= $c->render_to_string(inline => stash 'error') <%= $c->render_to_string(inline => stash 'error') %>
</div> </div>
%} % }
<h1><%= $title%></h1> <h1><%= $title%></h1>
%= form_for '/backupd' => (method => 'POST') => begin <br>
<h2><%=l 'bac_WORKSTN_SEL_RESTORE' %></h2> <h2><%=l 'bac_WORKSTN_SEL_RESTORE' %></h2>
%= $c->render_to_string(inline => (l 'bac_WORKSTN_SEL_REST_DESC') . ' ' . $c->get_shared_folder_to_verify()) <br>
<h3><%=l 'bac_BACKUP_CHOICE' %></h3> <form action="/smanager/backupd" method="POST">
<br> <div>
<span class=""> <%= $c->render_to_string(inline => (l 'bac_WORKSTN_SEL_REST_DESC') . ' ' . $c->get_shared_folder_to_verify()) %>
%=l 'bac_SELECT_BACKUP_FILE' </div>
</span>
<span class="">
%= select_field 'Backupset' => $c->get_Restoreset_options(), class => ""
</span>
<br>
<br>
<span class="">
%=l 'bac_FILTER_EXPRESSION'
</span>
<span class="">
%= text_field 'Filterexp', size => 32, class => ""
</span>
<br>
<br>
%= hidden_field 'Function' => $bac_datas->{'function'}
%= submit_button $c->l('PERFORM'), class => ""
% end <br>
<h3><%= l 'bac_BACKUP_CHOICE' %></h3>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<%= l 'bac_SELECT_BACKUP_FILE' %>
</div>
<div class="col-auto">
<%= select_field 'Backupset' => $c->get_Restoreset_options(), class => "form-select" %>
</div>
</div>
<br><br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<label for="inputFilterExpression" class="col-form-label"><%=l 'bac_FILTER_EXPRESSION' %></label>
</div>
<div class="col-auto">
<input type="text" name="Filterexp" id="inputFilterExpression" class="form-control" aria-describedby="Input Filter Expression">
</div>
</div>
<br><br>
%= hidden_field 'Function' => $bac_datas->{'function'}
% my $btn = l('PERFORM');
<div class="row g-3 align-items-center">
<div class="col-md-2">
<button type="submit" class="btn btn-primary"><%= $btn %></button>
</div>
</div>
</form>
</div> </div>

View File

@@ -5,51 +5,71 @@
<div class="card-body"> <div class="card-body">
% if (config->{debug} == 1) { % if (config->{debug} == 1) {
<p> <pre>
%= dumper $c->current_route <%= dumper $c->current_route %>
%= dumper $bac_datas <%= dumper $bac_datas %>
</p> </pre>
% } % }
% if ( stash 'error' ) { % if ( stash 'error' ) {
<br><div class=""> <br>
%= $c->render_to_string(inline => stash 'error') <div class="text-danger">
</div> <%= $c->render_to_string(inline => stash 'error') %>
%} </div>
% }
<h1><%= $title%></h1> <h1><%= $title%></h1>
<br>
<h2><%=l 'bac_WORKSTN_SELECTIVE_RESTORE' %></h2> <h2><%=l 'bac_WORKSTN_SELECTIVE_RESTORE' %></h2>
<br> <br>
%= $c->render_to_string(inline => (l 'bac_READ_COMPLETE')) <div>
<%= $c->render_to_string(inline => (l 'bac_READ_COMPLETE')) %>
</div>
%= form_for '/backupd' => (method => 'POST') => begin <br>
<br><span class=""> <form action="/smanager/backupd" method="POST">
%=l 'bac_SELECT_FILES_TO_RESTORE'
</span>
<span class="">
%= select_field 'Restorefiles' => $c->get_Restorefiles_options($bac_datas->{'filterexp'},$bac_datas->{'backupset'}), class => "", multiple => 1, size => 15
</span>
<br>
<br>
<span class="">
%=l 'bac_SELECT_DATE_BEFORE'
</span>
<span class="">
%= text_field 'Seldatebefore', size => 32, class => ""
</span>
<br>
<br>
%= hidden_field 'Function' => $bac_datas->{'function'}
%= hidden_field 'Backupset' => $bac_datas->{'backupset'}
%= hidden_field 'Filterexp' => $bac_datas->{'filterexp'}
%= submit_button $c->l('PERFORM'), class => "" <div class="row g-3 align-items-center">
<div class="col-md-1">
<%=l 'bac_SELECT_FILES_TO_RESTORE' %>
</div>
<div class="col-auto">
<%= select_field 'Restorefiles' => $c->get_Restorefiles_options($bac_datas->{'filterexp'},$bac_datas->{'backupset'}), class => "form-select", multiple => 1, size => 15 %>
</div>
</div>
% end <br><br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<label for="inputSelectDate" class="col-form-label"><%=l 'bac_SELECT_DATE_BEFORE' %></label>
</div>
<div class="col-auto">
<input type="text" name="Seldatebefore" id="inputSelectDate" class="form-control" aria-describedby="Restore most recent">
</div>
</div>
<br><br>
%= hidden_field 'Function' => $bac_datas->{'function'}
%= hidden_field 'Backupset' => $bac_datas->{'backupset'}
%= hidden_field 'Filterexp' => $bac_datas->{'filterexp'}
% my $btn = l('PERFORM');
<div class="row g-3 align-items-center">
<div class="col-md-2">
<button type="submit" class="btn btn-primary" value="<%=$c->l('bac_RESTORE_FROM_TAPE')%>"><%= $btn %></button>
</div>
</div>
<form>
</div> </div>
% end % end

View File

@@ -5,30 +5,44 @@
<div class="card-body"> <div class="card-body">
% if (config->{debug} == 1) { % if (config->{debug} == 1) {
<p> <pre>
%= dumper $c->current_route <%= dumper $c->current_route %>
%= dumper $bac_datas <%= dumper $bac_datas %>
</p> </pre>
% } % }
% if ( stash 'error' ) { % if ( stash 'error' ) {
<br> <br>
<div class=""> <div class="text-danger">
%= $c->render_to_string(inline => stash 'error') <%= $c->render_to_string(inline => stash 'error') %>
</div> </div>
%} % }
<h1><%= $title%></h1> <h1><%= $title%></h1>
<br>
<h2><%=l 'bac_WORKSTN_SELECTIVE_RESTORE' %></h2> <h2><%=l 'bac_WORKSTN_SELECTIVE_RESTORE' %></h2>
<br>
%= $c->render_to_string(inline => $bac_datas->{restore_log})
<br> <br>
%= form_for '/backupd' => (method => 'POST') => begin <form action="/smanager/backupd" method="POST">
%= hidden_field 'Function' => $bac_datas->{'function'}
%= submit_button $c->l('NEXT'), class => ""
% end <div>
<%= $c->render_to_string(inline => $bac_datas->{restore_log}) %>
</div>
<%= hidden_field 'Function' => $bac_datas->{'function'} %>
% my $btn = l('NEXT');
<div class="row g-3 align-items-center">
<div class="col-md-2">
<button type="submit" class="btn btn-primary"><%= $btn %></button>
</div>
</div>
</form>
</div> </div>
% end % end

View File

@@ -4,59 +4,75 @@
<div class="card-body"> <div class="card-body">
% if (config->{debug} == 1) { % if (config->{debug} == 1) {
<p> <pre>
%= dumper $c->current_route <%= dumper $c->current_route %>
%= dumper $bac_datas <%= dumper $bac_datas %>
</p> </pre>
% } % }
% if ( stash 'error' ) { % if ( stash 'error' ) {
<br> <br><div class="text-danger">
<div class=""> <%= $c->render_to_string(inline => stash 'error') %>
%= $c->render_to_string(inline => stash 'error') </div>
</div> % }
%}
<h1><%= $title%></h1> <h1><%= $title%></h1>
<h2>
%=l 'bac_VERIFY_WORKSTN_BACKUP_FILE'
</h2>
%= form_for '/backup' => (method => 'POST') => begin
% if ($bac_datas->{status} ne 'enabled') {
%= $c->render_to_string(inline => (l 'bac_CONFIGURATION_TO_BE_DONE'))
% } else {
%= $c->render_to_string(inline => (l 'bac_VERIFY_WORKSTN_BACKUP_DESC') . ' ' . $c->get_shared_folder_to_verify())
%}
<br>
<br>
<span class="">
%=l 'bac_SELECT_BACKUP_FILE'
</span>
<span class="">
%= select_field 'Backupset' => $c->get_Backupset_options(), class => ""
</span>
<br> <br>
<p> <h2><%=l 'bac_VERIFY_WORKSTN_BACKUP_FILE' %></h2>
<span class="">
%=l 'bac_CHECK_TO_VERIFY_FULL_RESTORE'
</span>
<span class="">
%= check_box 'Verifyall'
</span>
</p>
<br>
%=l 'bac_CHECK_INTEGRITY_WARNING' <form action="/smanager/backup" method="POST">
<br> <br>
<br>
%= hidden_field 'Function' => $bac_datas->{'function'} . '1'
%= submit_button $c->l('bac_VERIFY'), class => ""
% end % if ($bac_datas->{status} ne 'enabled') {
<div>
<%= $c->render_to_string(inline => (l 'bac_CONFIGURATION_TO_BE_DONE')) %>
</div>
% } else {
<div>
<%= $c->render_to_string(inline => (l 'bac_VERIFY_WORKSTN_BACKUP_DESC') . ' ' . $c->get_shared_folder_to_verify()) %>
</div>
% }
<br><br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<%=l 'bac_SELECT_BACKUP_FILE' %>
</div>
<div class="col-auto">
<%= select_field 'Backupset' => $c->get_Backupset_options(), class => "form-select" %>
</div>
</div>
<br><br>
<div class="row g-3 align-items-center">
<div class="col-md-4">
<%=l 'bac_CHECK_TO_VERIFY_FULL_RESTORE' %>
</div>
<div class="col-auto">
<input type='checkbox' name='Verifyall'>
</div>
</div>
<br>
%=l 'bac_CHECK_INTEGRITY_WARNING'
<br>
<br>
%= hidden_field 'Function' => $bac_datas->{'function'} . '1'
% my $btn = l('bac_VERIFY');
<div class="row g-3 align-items-center">
<div class="col-md-2">
<button type="submit" class="btn btn-primary"><%= $btn %></button>
</div>
</div>
</form>
</div> </div>
% end % end

View File

@@ -4,34 +4,47 @@
<div class="card-body"> <div class="card-body">
% if (config->{debug} == 1) { % if (config->{debug} == 1) {
<p> <pre>
%= dumper $c->current_route <%= dumper $c->current_route %>
%= dumper $bac_datas->{function} <%= dumper $bac_datas->{function} %>
<!-- dumper $bac_datas->{'files_list'} --> <!-- dumper $bac_datas->{'files_list'} -->
</p> </pre>
% } % }
% if ( stash 'error' ) { % if ( stash 'error' ) {
<br> <br>
<div class=""> <div class="text-danger">
%= $c->render_to_string(inline => stash 'error') <%= $c->render_to_string(inline => stash 'error') %>
</div> </div>
%} % }
<h1><%= $title%></h1> <h1><%= $title%></h1>
<br>
<h2><%= l 'bac_VERIFY_WORKSTN_BACKUP_FILE' %></h2> <h2><%= l 'bac_VERIFY_WORKSTN_BACKUP_FILE' %></h2>
<br> <br>
%= $c->render_to_string(inline => $c->workstnVerify())
<div>
<%= $c->render_to_string(inline => $c->workstnVerify()) %>
</div>
<br> <br>
%= form_for '/backupd' => (method => 'POST') => begin <form action="/smanager/backupd" method="POST">
%= hidden_field 'Function' => $bac_datas->{'function'} %= hidden_field 'Function' => $bac_datas->{'function'}
%= submit_button $c->l('NEXT'), class => "" % my $btn = l('NEXT');
<div class="row g-3 align-items-center">
<div class="col-md-2">
<button type="submit" class="btn btn-primary"><%= $btn %></button>
</div>
</div>
</form>
% end
</div> </div>
% end % end

View File

@@ -2,11 +2,11 @@
% content_for 'module' => begin % content_for 'module' => begin
% if ( config 'debug' ) { % if (config->{debug} == 1) {
<div> <div>
<!-- %= dumper $c->current_route --> <%= dumper $c->current_route %>
% if ( stash 'trt' ) { % if ( stash 'trt' ) {
%= dumper stash 'trt' <%= dumper stash 'trt' %>
% } % }
</div> </div>
% } % }

View File

@@ -19,33 +19,31 @@
<br> <br>
<div> <div class="row g-3 align-items-center">
<div class="col-md-1">
<%= l 'PASSWORD_NEW' %> <%= l 'PASSWORD_NEW' %>
</div> </div>
<div class="col-auto">
<br> <input name="newPass" id="password" type="password" class="form-control sme-password" placeholder="Password" autocomplete="on">
<div class="row g-3 align-items-center">
<div class="col-md-2">
<input name="newPass" id="newPass" type="password" class="form-control sme-password" placeholder="Password">
</div>
</div> </div>
<div class="col-auto">
<span id="togglePassword" class="bi bi-eye"></span>
</div>
</div>
<br> <br>
<div> <div class="row g-3 align-items-center">
<div class="col-md-1">
<%= l 'PASSWORD_VERIFY_NEW' %> <%= l 'PASSWORD_VERIFY_NEW' %>
</div> </div>
<div class="col-auto">
<br> <input name="newPassVerify" id="passVerify" type="password" class="form-control sme-password" placeholder="Password" autocomplete="on">
<div class="row g-3 align-items-center">
<div class="col-md-2">
<input name="newPassVerify" id="newPassVerify" type="password" class="form-control sme-password" placeholder="Password">
</div>
</div> </div>
<div class="col-auto">
<br> <span id="togglePasswordVerify" class="bi bi-eye"></span>
</div>
</div>
<br><br> <br><br>

View File

@@ -8,7 +8,7 @@
% my %ret; % my %ret;
% unless (length($retref)) {%ret = (ret=>"");} % unless (length($retref)) {%ret = (ret=>"");}
% else {%ret = %$retref;} % else {%ret = %$retref;}
<!-- So at this point the next section is only relevant it ret is not defined --> <!-- So at this point the next section is only relevant it ret is not defined -->
%# my $element_count = scalar(@ret); %# my $element_count = scalar(@ret);
@@ -40,9 +40,9 @@
% } % }
<br><br> <br><br>
% my $btn = l('ln_LOCALNETWORK_ADD'); % my $btn = l('ln_LOCALNETWORK_ADD');
<div class="row g-3 align-items-center"> <div class="row g-3 align-items-center">
<div class="col-md-2"> <div class="col-md-2">
<button type="submit" class="btn btn-primary"><%= $btn %></button> <button type="submit" class="btn btn-primary"><%= $btn %></button>
@@ -50,7 +50,7 @@
</div> </div>
<br> <br>
% my $numlocalnetworks = @$localnetworks; % my $numlocalnetworks = @$localnetworks;
% if ($numlocalnetworks == 0) { % if ($numlocalnetworks == 0) {
<%= l 'ln_LOCAL_NETWORK_NONE' %> <%= l 'ln_LOCAL_NETWORK_NONE' %>
@@ -72,11 +72,11 @@
% my $removable = $localnetwork->prop('Removable') || "yes"; % my $removable = $localnetwork->prop('Removable') || "yes";
% my $system = $localnetwork->prop('SystemLocalNetwork') || "no"; % my $system = $localnetwork->prop('SystemLocalNetwork') || "no";
% if ( $system eq "yes" ) { $removable = "no"; } % if ( $system eq "yes" ) { $removable = "no"; }
<tr> <tr class="align-middle">
<td><%= $localnetwork->key %> <td><%= $localnetwork->key %></td>
<td><%= $localnetwork->prop('Mask') %> <td><%= $localnetwork->prop('Mask') %></td>
<td><%= $num_hosts %> <td><%= $num_hosts %></td>
<td><%= $localnetwork->prop('Router') %> <td><%= $localnetwork->prop('Router') %></td>
% my $actionRemove = '&nbsp;'; % my $actionRemove = '&nbsp;';
% if ($removable eq "yes") { % if ($removable eq "yes") {
%my $remove_text = l('REMOVE'); # Localized text %my $remove_text = l('REMOVE'); # Localized text
@@ -97,6 +97,6 @@
</table> </table>
<%= hidden_field 'trt' => $ln_datas->{trt} %> <%= hidden_field 'trt' => $ln_datas->{trt} %>
% } % }
</form> </form>
</div> </div>

View File

@@ -1,51 +1,61 @@
<div> <div>
% my $btn = l('ADD'); <h2><%=l 'prt_CREATE_NEW_PRINTER' %></h2>
%= form_for '/printers2' => (method => 'POST') => begin
<p>
<h2>
%=l 'prt_CREATE_NEW_PRINTER'
</h2>
<br>
%=l 'prt_CREATE_NEW_DESC'
</p>
<br> <br>
<p> <form action="/smanager/printers2" method="POST">
<span class="">
%=l 'prt_PRINTER_NAME', class => ""
</span>
<span class="">
%= text_field 'Name', class => ""
</span>
</p>
<p> <br>
<span class="">
%=l 'DESCRIPTION_BRIEF', class => ""
</span>
<span class="">
%= text_field 'Description', class => ""
</span>
</p>
<p> <div>
<span class=""> <%= l 'prt_CREATE_NEW_DESC' %>
%=l 'LOCATION', class => "" </div>
</span>
<span class="">
%= select_field 'Location' => $c->printerLocation_list(), class => ""
</span>
</p>
<p> <br>
<br><br>
%= submit_button "$btn", class => ""
</p>
%= hidden_field 'trt' => $prt_datas->{trt} <div class="row g-3 align-items-center">
<div class="col-md-1">
% end <label for="inputPrinterName" class="col-form-label"><%= l 'prt_PRINTER_NAME' %></label>
</div>
<div class="col-auto">
<input type="text" name="Name" id="inputPrinterName" class="form-control" aria-describedby="Printer Name">
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<label for="inputPrinterDesc" class="col-form-label"><%= l 'DESCRIPTION_BRIEF' %></label>
</div>
<div class="col-auto">
<input type="text" name="Description" id="inputPrinterDesc" class="form-control" aria-describedby="Printer Description">
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<%= l 'LOCATION'%>
</div>
<div class="col-auto">
<%= select_field 'Location' => $c->printerLocation_list(), class => "form-select" %>
</div>
</div>
<br><br>
<%= hidden_field 'trt' => $prt_datas->{trt} %>
% my $btn = l('ADD');
<div class="row g-3 align-items-center">
<div class="col-md-1">
<button type="submit" class="btn btn-primary"><%= $btn %></button>
</div>
</div>
</form>
</div> </div>

View File

@@ -1,30 +1,38 @@
<div> <div>
% my $btn = l('REMOVE');
%= form_for '/printers2' => (method => 'POST') => begin
<p>
<h2>
%=l 'prt_REMOVE_PRINTER'
</h2>
<br><br>
<%=l 'prt_ABOUT_TO_REMOVE'%> <%=$prt_datas->{printer}%> <h2><%= l 'prt_REMOVE_PRINTER' %></h2>
(<%=$prt_datas->{description}%>)
<form action="/smanager/printers2" method="POST">
<br> <br>
%=l 'prt_SPOOL_FILE_WARNING' <div>
<%= l 'prt_ABOUT_TO_REMOVE'%> <%=$prt_datas->{printer}%> (<%=$prt_datas->{description}%>)
</div>
<br> <br>
%=l 'prt_ARE_YOU_SURE' <div class="text-danger">
</p> <%= l 'prt_SPOOL_FILE_WARNING' %>
</div>
<p>
<br> <br>
%= submit_button "$btn", class => ""
</p>
<div>
<%= l 'prt_ARE_YOU_SURE' %>
</div>
<br>
%= hidden_field 'trt' => $prt_datas->{trt} %= hidden_field 'trt' => $prt_datas->{trt}
%= hidden_field 'printer' => $prt_datas->{printer} %= hidden_field 'printer' => $prt_datas->{printer}
% end % my $btn = l('REMOVE');
<div class="row g-3 align-items-center">
<div class="col-md-1">
<button type="submit" class="btn btn-primary"><%= $btn %></button>
</div>
</div>
</form>
</div> </div>

View File

@@ -1,82 +1,72 @@
<div> <div>
% my $btn = l('prt_INITIAL_BTN');
%= form_for '/printers' => (method => 'POST') => begin
%= hidden_field 'trt' => 'ADD'
<p>
<br> <br>
%= submit_button "$btn", class => ""
</p>
% end
<p> <form action="/smanager/printers" method="POST">
<h2>
%=l 'prt_CURRENT_LIST' % my $btn = l('prt_INITIAL_BTN');
</h2> <%= hidden_field 'trt' => 'ADD' %>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<button type="submit" class="btn btn-primary"><%= $btn %></button>
</div>
</div>
</form>
<br>
<h2><%= l 'prt_CURRENT_LIST' %></h2>
<br><br> <br><br>
% my $numPrinters = @$printerDrivers;
% if ($numPrinters == 0){ % my $numPrinters = @$printerDrivers;
%=l 'prt_NO_PRINTERS' % if ($numPrinters == 0){
% } else { <%= l 'prt_NO_PRINTERS' %>
<table class="table table-bordered"> % } else {
<thead> <table class="table table-bordered">
<tr> <thead>
<th class=""> <tr>
%=l 'NAME' <th><%= l 'NAME' %></th>
</th> <th><%= l 'DESCRIPTION' %></th>
<th class=""> <th><%= l 'LOCATION' %></th>
%=l 'DESCRIPTION' <th><%= l 'prt_REMOTE_ADDRESS' %></th>
</th> <th><%= l 'prt_REMOTE_NAME' %></th>
<th class=""> <th><%= l 'ACTION' %></th>
%=l 'LOCATION' </tr>
</th> </thead>
<th class=""> <tbody>
%=l 'prt_REMOTE_ADDRESS' % foreach my $printer (@$printerDrivers) {
</th> % my $address = ($printer->prop('Location') eq 'remote')
<th class=""> % ? $printer->prop('Address') : 'N/A';
%=l 'prt_REMOTE_NAME' % my $remoteName = ($printer->prop('Location') eq 'remote')
</th> % ? $printer->prop('RemoteName') : 'N/A';
<th class=""> % $remoteName = 'raw' unless ($remoteName);
%=l 'ACTION'
</th> <tr class="align-middle">
</tr> <td><%= $printer->key %></td>
</thead> <td><%= $printer->prop('Description') %></td>
<tbody> <td><%= $printer->prop('Location') %></td>
% foreach my $printer (@$printerDrivers) <td><%= $address %></td>
% { <td><%= $remoteName %></td>
% my $address = ($printer->prop('Location') eq 'remote') <td>
% ? $printer->prop('Address') : 'N/A'; % my $remove_text = l('REMOVE'); # Localized text
% my $remoteName = ($printer->prop('Location') eq 'remote') % my $csrf_token = "TOKEN"; # CSRF token for security
% ? $printer->prop('RemoteName') : 'N/A'; % my $printer_name = $printer->key;
% $remoteName = 'raw' unless ($remoteName); % my $actionRemove = qq{
<tr> % <a href="printers2?CsrfDef=$csrf_token&trt=DEL&&printer=$printer_name">
%= t td => (class => "") => $printer->key % <button type='button' class="btn btn-primary" title='$remove_text' >
%= t td => (class => "") => $printer->prop('Description') % $remove_text
%= t td => (class => "") => $printer->prop('Location') % </button>
%= t td => (class => "") => $address % </a>
%= t td => (class => "") => $remoteName % };
<td class=""> <%= $c->render_to_string(inline => $actionRemove) %>
%my $remove_text = l('REMOVE'); # Localized text </td>
%my $csrf_token = "TOKEN"; # CSRF token for security </tr>
%my $printer_name = $printer->key; % }
%my $actionRemove = qq{ </tbody>
% <a href="printers2?CsrfDef=$csrf_token&trt=DEL&&printer=$printer_name"> </table>
% <button type='button' class="" title='$remove_text' > % }
% $remove_text
% </button>
% </a>
%};
<%= $c->render_to_string(inline => $actionRemove) %>
</td>
</tr>
% }
</tbody>
</table>
<%} %>
</p>
</div> </div>

View File

@@ -19,7 +19,9 @@
% if ($numUsers == 0){ % if ($numUsers == 0){
<%= l 'ACCOUNT_USER_NONE' %> <div>
<%= l 'ACCOUNT_USER_NONE' %>
</div>
% } else { % } else {
% my $limit = l('quo_LIMIT_WITH_GRACE_MB'); $limit =~ s#(graceX)#<br>$1#; % my $limit = l('quo_LIMIT_WITH_GRACE_MB'); $limit =~ s#(graceX)#<br>$1#;

View File

@@ -22,7 +22,7 @@
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-bordered"> <table class="table table-bordered">
<thead> <thead>
<tr class=""> <tr>
<th><%=l 'ACCOUNT' %></th> <th><%=l 'ACCOUNT' %></th>
<th><%=l 'USER_NAME' %></th> <th><%=l 'USER_NAME' %></th>
<th><%=l 'usr_VPN_CLIENT_ACCESS' %></th> <th><%=l 'usr_VPN_CLIENT_ACCESS' %></th>
@@ -54,7 +54,7 @@
% my ($actionModify, $actionLock, $actionResetPw, $actionRemove,$actionroundcube) = '&nbsp;'; % my ($actionModify, $actionLock, $actionResetPw, $actionRemove,$actionroundcube) = '&nbsp;';
% my $thisdomain = $c->req->url->to_abs->host; % my $thisdomain = $c->req->url->to_abs->host;
<tr> <tr class="align-middle">
<td><%= $username %></td> <td><%= $username %></td>
<td><%= $first %>&nbsp<%=$last %></td> <td><%= $first %>&nbsp<%=$last %></td>
<td><%= $vpnaccess %></td> <td><%= $vpnaccess %></td>

View File

@@ -43,31 +43,31 @@
<%= l 'usr_RESET_DESC2' %> <%= l 'usr_RESET_DESC2' %>
</div> </div>
<br> <br><br>
<div>
<%= l 'PASSWORD_NEW' %>
</div>
<br>
<div class="row g-3 align-items-center"> <div class="row g-3 align-items-center">
<div class="col-md-2"> <div class="col-md-1">
<input name="newPass" id="newPass" type="password" class="form-control sme-password" placeholder="Password"> <%= l 'PASSWORD_NEW' %>
</div>
<div class="col-auto">
<input name="newPass" id="password" type="password" class="form-control sme-password" placeholder="Password" autocomplete="on">
</div>
<div class="col-auto">
<span id="togglePassword" class="bi bi-eye"></span>
</div> </div>
</div> </div>
<br> <br>
<div>
<%= l 'PASSWORD_VERIFY_NEW' %>
</div>
<br>
<div class="row g-3 align-items-center"> <div class="row g-3 align-items-center">
<div class="col-md-2"> <div class="col-md-1">
<input name="newPassVerify" id="newPassVerify" type="password" class="form-control sme-password" placeholder="Password"> <%= l 'PASSWORD_VERIFY_NEW' %>
</div>
<div class="col-auto">
<input name="newPassVerify" id="passVerify" type="password" class="form-control sme-password" placeholder="Password" autocomplete="on">
</div>
<div class="col-auto">
<span id="togglePasswordVerify" class="bi bi-eye"></span>
</div> </div>
</div> </div>

View File

@@ -5,10 +5,10 @@
<div class="card-body"> <div class="card-body">
%if (config->{debug} == 1) { %if (config->{debug} == 1) {
<div> <pre>
%= dumper $c->current_route %= dumper $c->current_route
%= dumper $prt_datas %= dumper $prt_datas
</div> </pre>
% } % }
% if ( stash 'error' ) { % if ( stash 'error' ) {

View File

@@ -24,12 +24,13 @@
<% my $btn = l('SAVE'); %> <% my $btn = l('SAVE'); %>
<form action="/smanager/remoteaccess" method="POST"> <form action="/smanager/remoteaccess" method="POST">
% my $ipsec = $c->get_ipsecrw_status(); % my $ipsec = $c->get_ipsecrw_status();
% if ( $ipsec ) { <!-- reetp not tested -->
% if ( $ipsec) {
<h2><%= l 'rma_TITLE_IPSECRW' %></h2> <h2><%= l 'rma_TITLE_IPSECRW' %></h2>
<div> <div>
<%= l 'rma_DESC_IPSECRW' %> <%= l 'rma_DESC_IPSECRW' %>
@@ -42,7 +43,7 @@
<%= text_field 'IpsecrwSess', class => "" %> <%= text_field 'IpsecrwSess', class => "" %>
</div> </div>
<br> <br>
<div> <div>
<%= $c->render_to_string(inline => $c->l('rma_DESC_IPSECRW_RESET')); %> <%= $c->render_to_string(inline => $c->l('rma_DESC_IPSECRW_RESET')); %>
</div> </div>
@@ -51,19 +52,19 @@
<%= l 'rma_LABEL_IPSECRW_RESET' %> <%= l 'rma_LABEL_IPSECRW_RESET' %>
</div> </div>
<div> <div>
<%= check_box 'IpsecrwReset',class => "" %> <input type='checkbox' name='IpsecrwReset'>
</div> </div>
<br><br> <br><br>
<!--<hr class="" />--> <!--<hr class="" />-->
%} % }
<!-- percequ include 'partials/_rma_pptp' --> <!-- percequ include 'partials/_rma_pptp' -->
<h2><%= $c->l('rma_VALIDFROM_TITLE', $c->l('rma_REMOTE_MANAGEMENT')); %></h2> <h2><%= $c->l('rma_VALIDFROM_TITLE', $c->l('rma_REMOTE_MANAGEMENT')); %></h2>
<br> <br>
<div> <div>
<%= l 'rma_VALIDFROM_DESC' %> <%= l 'rma_VALIDFROM_DESC' %>
</div> </div>
@@ -82,12 +83,12 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
% foreach my $val ( @vals ) { % foreach my $val ( @vals ) {
% my ($net, $mask) = split '/', $val; % my ($net, $mask) = split '/', $val;
% $mask = '255.255.255.255' unless ($mask); % $mask = '255.255.255.255' unless ($mask);
% my ($numhosts,$a,$b) = esmith::util::computeHostRange($net,$mask); % my ($numhosts,$a,$b) = esmith::util::computeHostRange($net,$mask);
<tr> <tr class="align-middle">
<td><%= $net %></td> <td><%= $net %></td>
<td><%= $mask %></td> <td><%= $mask %></td>
<td><%= $numhosts %></td> <td><%= $numhosts %></td>
@@ -96,9 +97,9 @@
</td> </td>
</tr> </tr>
% } % }
</tbody> </tbody>
</table> </table>
<!-- my @cbGroup = $q->checkbox_group(-name => 'validFromRemove', <!-- my @cbGroup = $q->checkbox_group(-name => 'validFromRemove',
-values => [@vals], -labels => { map {$_ => ''} @vals }); -values => [@vals], -labels => { map {$_ => ''} @vals });
@@ -109,36 +110,42 @@
<b><%= l('rma_NO_ENTRIES_YET'); %></b> <b><%= l('rma_NO_ENTRIES_YET'); %></b>
% } % }
<%= l 'rma_DESC_VALID_FROM_ENTRIES' %> <br>
<div>
<%= l 'rma_DESC_VALID_FROM_ENTRIES' %>
</div>
<br><br> <br><br>
<div class="row g-3 align-items-center"> <div class="row g-3 align-items-center">
<div class="col-md-2"> <div class="col-md-1">
<%= l 'NETWORK' %> <label for="inputNetwork" class="col-form-label"><%= l 'NETWORK' %></label>
</div> </div>
<div class="col-auto"> <div class="col-auto">
<%= text_field 'ValidFromNetwork', class => "" %> <input type="text" name="ValidFromNetwork" id="inputNetwork" class="form-control" aria-describedby="Network">
</div> </div>
</div> </div>
<br> <br>
<div class="row g-3 align-items-center"> <div class="row g-3 align-items-center">
<div class="col-md-2"> <div class="col-md-1">
<%= l 'rma_SUBNET_MASK' %> <label for="inputSubnetMask" class="col-form-label"><%= l 'rma_SUBNET_MASK' %></label>
</div> </div>
<div class="col-auto"> <div class="col-auto">
<%= text_field 'ValidFromMask', class => "" %> <input type="text" name="ValidFromMask" id="inputSubnetMask" class="form-control" aria-describedby="Subnet">
</div> </div>
</div> </div>
<!--<hr class="" />--> <!--<hr class="" />-->
<br><br>
<h2><%= l 'rma_TITLE_SSH' %></h2> <h2><%= l 'rma_TITLE_SSH' %></h2>
<br> <br>
<div> <div>
<%= l 'rma_DESC_SSH' %> <%= l 'rma_DESC_SSH' %>
</div> </div>
@@ -156,7 +163,7 @@
</div> </div>
<br> <br>
<div class="row g-3 align-items-center"> <div class="row g-3 align-items-center">
<div class="col-md-2"> <div class="col-md-2">
<%= l 'rma_LABEL_SSH_ADMIN' %> <%= l 'rma_LABEL_SSH_ADMIN' %>
@@ -178,16 +185,16 @@
<%= select_field 'SshPasswordAuthentication' => [[(l 'NO'), 'no'], [(l 'YES'), 'yes']], class => "form-select" %> <%= select_field 'SshPasswordAuthentication' => [[(l 'NO'), 'no'], [(l 'YES'), 'yes']], class => "form-select" %>
</div> </div>
</div> </div>
<br> <br>
<div class="row g-3 align-items-center"> <div class="row g-3 align-items-center">
<div class="col-md-2"> <div class="col-md-2">
<%= l 'rma_LABEL_SSH_PORT' %> <label for="inputSSHPort" class="col-form-label"><%= l 'rma_LABEL_SSH_PORT' %></label>
</div> </div>
<div class="col-auto"> <div class="col-sm-1">
% param 'SshTCPPort' => $c->get_ssh_port() unless param 'SshTCPPort'; % param 'SshTCPPort' => $c->get_ssh_port() unless param 'SshTCPPort';
<%= text_field 'SshTCPPort' %> <input type="text" name="SshTCPPort" id="inputSSHPort" class="form-control" aria-describedby="SSH Port" value="<%= $c->get_ssh_port() %>">
</div> </div>
</div> </div>
@@ -195,12 +202,14 @@
<!--<hr class="" />--> <!--<hr class="" />-->
<br><br>
<h2><%= l 'rma_TITLE_FTP_ACCESS' %></h2> <h2><%= l 'rma_TITLE_FTP_ACCESS' %></h2>
<br> <br>
<div> <div>
<%= $c->render_to_string(inline => $c->l('rma_DESC_FTP_ACCESS')); %> <%= $c->render_to_string(inline => $c->l('rma_DESC_FTP_ACCESS')); %>
</div> </div>
<br> <br>
<div class="row g-3 align-items-center"> <div class="row g-3 align-items-center">
@@ -212,16 +221,16 @@
<%= select_field 'FtpAccess' => $c->networkAccess_list(), class => "form-select" %> <%= select_field 'FtpAccess' => $c->networkAccess_list(), class => "form-select" %>
</div> </div>
</div> </div>
<br> <br>
<br> <br>
<div> <div>
<%= $c->render_to_string(inline => $c->l('rma_DESC_FTP_LOGIN')); %> <%= $c->render_to_string(inline => $c->l('rma_DESC_FTP_LOGIN')); %>
</div> </div>
<br> <br>
<div class="row g-3 align-items-center"> <div class="row g-3 align-items-center">
<div class="col-md-2"> <div class="col-md-2">
<%= l 'rma_LABEL_FTP_LOGIN' %> <%= l 'rma_LABEL_FTP_LOGIN' %>
@@ -237,19 +246,19 @@
% my $mode = $c->get_telnet_mode(); % my $mode = $c->get_telnet_mode();
% if ( $mode ne 'off') { % if ( $mode ne 'off') {
<!--<hr class="" />--> <!--<hr class="" />-->
<h2><%= l 'rma_TITLE_TELNET_ACCESS' %></h2> <h2><%= l 'rma_TITLE_TELNET_ACCESS' %></h2>
<br> <br>
<div class="row g-3 align-items-center"> <div class="row g-3 align-items-center">
<div class="col-md-2"> <div class="col-md-2">
<%= l 'rma_DESC_TELNET_ACCESS' %> <%= l 'rma_DESC_TELNET_ACCESS' %>
</div> </div>
<div> <div>
<br><br> <br><br>
<div class="row g-3 align-items-center"> <div class="row g-3 align-items-center">
<div class="col-md-2"> <div class="col-md-2">
<%= l 'rma_LABEL_TELNET_ACCESS' %> <%= l 'rma_LABEL_TELNET_ACCESS' %>

View File

@@ -16,7 +16,7 @@
% if ( stash 'error' ) { % if ( stash 'error' ) {
<br> <br>
<div> <div>
%= $c->render_to_string(inline => stash 'error') %= $c->render_to_string(inline => stash 'error')
</div> </div>
%} %}
@@ -27,7 +27,7 @@
<div> <div>
%= $c->render_to_string( inline => l('pwd_DESCRIPTION')); %= $c->render_to_string( inline => l('pwd_DESCRIPTION'));
</div> </div>
% if ( $pwd_datas->{trt} eq 'RESET' ) { % if ( $pwd_datas->{trt} eq 'RESET' ) {
% my $btn = l('pwd_PASSWORD_RESET'); % my $btn = l('pwd_PASSWORD_RESET');
% my $url = '/userpasswordr'; % my $url = '/userpasswordr';
@@ -57,16 +57,16 @@
</tr> </tr>
</tbody> </tbody>
</table> </table>
<br> <br>
% if ( $pwd_datas->{trt} ne 'RESET' ) { % if ( $pwd_datas->{trt} ne 'RESET' ) {
<div> <div>
<%= l 'pwd_PASSWORD_OLD' %> <%= l 'pwd_PASSWORD_OLD' %>
</div> </div>
<br> <br>
<div class="row g-3 align-items-center"> <div class="row g-3 align-items-center">
<div class="col-md-2"> <div class="col-md-2">
<input name="OldPass" id="OldPass" type="password" class="form-control sme-password" placeholder="Password"> <input name="OldPass" id="OldPass" type="password" class="form-control sme-password" placeholder="Password">
@@ -74,14 +74,14 @@
</div> </div>
% } % }
<br> <br>
<div> <div>
<%= l 'pwd_PASSWORD_NEW' %> <%= l 'pwd_PASSWORD_NEW' %>
</div> </div>
<br> <br>
<div class="row g-3 align-items-center"> <div class="row g-3 align-items-center">
<div class="col-md-2"> <div class="col-md-2">
<input name="Pass" id="Pass" type="password" class="form-control sme-password" placeholder="Password"> <input name="Pass" id="Pass" type="password" class="form-control sme-password" placeholder="Password">
@@ -93,14 +93,14 @@
<div> <div>
%=l 'pwd_PASSWORD_VERIFY_NEW' %=l 'pwd_PASSWORD_VERIFY_NEW'
</div> </div>
<br> <br>
<div class="row g-3 align-items-center"> <div class="row g-3 align-items-center">
<div class="col-md-2"> <div class="col-md-2">
<input name="Passverify" id="PassVerify" type="password" class="form-control sme-password" placeholder="Password"> <input name="Passverify" id="PassVerify" type="password" class="form-control sme-password" placeholder="Password">
</div> </div>
</div> </div>
<br> <br>

View File

@@ -5,12 +5,12 @@
<div class="card-body"> <div class="card-body">
%if (config->{debug} == 1) { %if (config->{debug} == 1) {
<div> <pre>
(DBG)route: <%= $c->current_route %><br> route: <%= dumper $c->current_route %>
(DBG)pdc: <%= $wkg_datas->{ServerRole}%><br> pdc: <%= dumper $wkg_datas->{ServerRole}%>
(DBG)roam: <%= $wkg_datas->{RoamingProfiles}%><br> roam: <%= dumper $wkg_datas->{RoamingProfiles}%>
</div> </pre>
%} % }
<h1><%= $title %></h1> <h1><%= $title %></h1>
<br> <br>
@@ -29,8 +29,8 @@
<label for="inputWorkgroup" class="col-form-label"><%= l 'wkg_LABEL_WORKGROUP' %></label> <label for="inputWorkgroup" class="col-form-label"><%= l 'wkg_LABEL_WORKGROUP' %></label>
</div> </div>
<div class="col-auto"> <div class="col-auto">
<input type="text" name="Workgroup" id="inputWorkgroup" class="form-control" aria-describedby="inputWorkgroup" maxlength="15" value="<%= $wkg_datas->{Workgroup}%>" > <input type="text" name="Workgroup" id="inputWorkgroup" class="form-control" aria-describedby="inputWorkgroup" maxlength="15" size="15" value="<%= $wkg_datas->{Workgroup}%>" >
</div> </div>
<div class="col-auto"> <div class="col-auto">
<span id="passwordHelpInline" class="form-text"> <span id="passwordHelpInline" class="form-text">
Limited to 15 characters by the NETBIOS Limited to 15 characters by the NETBIOS

View File

@@ -1,6 +1,6 @@
%define name smeserver-manager-AdminLTE %define name smeserver-manager-AdminLTE
%define version 11.0.0 %define version 11.0.0
%define release 33 %define release 35
Summary: AdminLTE is an html framework for admin consoles - this rpm adds it to smeserver manager2 Summary: AdminLTE is an html framework for admin consoles - this rpm adds it to smeserver manager2
Name: %{name} Name: %{name}
Version: %{version} Version: %{version}
@@ -29,6 +29,21 @@ AdminLTE is an html framework for admin consoles
wget https://github.com/ColorlibHQ/AdminLTE/archive/master.zip wget https://github.com/ColorlibHQ/AdminLTE/archive/master.zip
%changelog %changelog
* Thu Jun 12 2025 John Crisp <jcrisp@safeandsoundit.co.uk> 11.0.0-35.sme
- Finish backup panels
- Finish printer panels
- Tidy Local Networks
- Small layout tweaks
* Wed Jun 11 2025 John Crisp <jcrisp@safeandsoundit.co.uk> 11.0.0-34.sme
- Update flag detection JS [SME: 13039]
- Tweak login template
- Update Remoteaccess template
- Various formatting fixes
- User password trying to get the show hide password icon working
- Ibay password trying to get the show hide password icon working
- Continue Backup panels
* Tue Jun 10 2025 John Crisp <jcrisp@safeandsoundit.co.uk> 11.0.0-33.sme * Tue Jun 10 2025 John Crisp <jcrisp@safeandsoundit.co.uk> 11.0.0-33.sme
- Fix out of sync versioning - Fix out of sync versioning