Enhance product links and translations; update styles and add registration modal

- Updated product links in rma.php and rma_manage.php to include icons for better UX.
- Improved German, Spanish, Dutch, Polish, Portuguese, and US translations with new phrases for software licenses and user information prompts.
- Refactored CSS to remove redundant styles and added new styles for a registration modal, enhancing the overall UI.
- Introduced JavaScript variables for user information prompts in softwaretool.php for better localization support.
This commit is contained in:
“VeLiTi”
2026-01-12 15:59:46 +01:00
parent be6f73b19c
commit 884d2a3366
21 changed files with 1332 additions and 355 deletions

View File

@@ -64,11 +64,64 @@ if(isset($get_content) && $get_content!=''){
//build up search //build up search
$clause .= ' AND (h.rowID like :'.$v[0].' OR h.createdby like :'.$v[0].')'; $clause .= ' AND (h.rowID like :'.$v[0].' OR h.createdby like :'.$v[0].')';
} }
elseif ($v[0] == 'type' && $v[1] == 'servicereport') { elseif ($v[0] == 'serialnumber') {
//Filter out only relevant servicereports //build up serialnumber
$filter_key_1 = '"%serialnumber%"'; //check if multiple serialnumbers are provided
$filter_key_2 = '"ServiceReport"'; if (str_contains($v[1], ',')){
$clause .= ' AND h.type = '.$filter_key_2.' AND NOT e.productrowid = "31" AND h.description like '.$filter_key_1; $inputs = explode(",",$v[1]);
$new_querystring = ''; //empty querystring
$x=0;
foreach($inputs as $input){
//create key
$new_key = $v[0].'_'.$x;
//inject new key/value to array
$criterias[$new_key] = $input;
$new_querystring .= ':'.$new_key.',';
$x++;
}
//remove obsolete last character from new_querystring
$new_querystring = substr($new_querystring,0, -1);
//add new_querystring to clause
$clause .= ' AND e.serialnumber IN ('.$new_querystring.')';
//remove original key/value from array
unset($criterias[$v[0]]);
}
else {
$clause .= ' AND e.serialnumber IN (:'.$v[0].')';
}
}
elseif ($v[0] == 'type') {
if ($v[1] == 'servicereport') {
//Filter out only relevant servicereports
$filter_key_1 = '"%serialnumber%"';
$filter_key_2 = '"ServiceReport"';
$clause .= ' AND h.type = '.$filter_key_2.' AND NOT e.productrowid = "31" AND h.description like '.$filter_key_1;
//remove from criterias to prevent double binding
unset($criterias[$v[0]]);
}
elseif (str_contains($v[1], ',')) {
//check if multiple types are provided
$inputs = explode(",",$v[1]);
$new_querystring = ''; //empty querystring
$x=0;
foreach($inputs as $input){
//create key
$new_key = $v[0].'_'.$x;
//inject new key/value to array
$criterias[$new_key] = $input;
$new_querystring .= ':'.$new_key.',';
$x++;
}
//remove obsolete last character from new_querystring
$new_querystring = substr($new_querystring,0, -1);
//add new_querystring to clause
$clause .= ' AND h.type IN ('.$new_querystring.')';
//remove original key/value from array
unset($criterias[$v[0]]);
}
else {
$clause .= ' AND h.type = :'.$v[0];
}
} }
elseif ($v[0] == 'created') { elseif ($v[0] == 'created') {
//build up search //build up search

View File

@@ -24,7 +24,11 @@ function checkSerial($serialinput){
} }
//CHECK IF SN AND PAYLOAD IS SEND => FROM EXTERNAL APPS //CHECK IF SN AND PAYLOAD IS SEND => FROM EXTERNAL APPS
if (isset($post_content['sn']) && isset($post_content['payload'])){ if (isset($post_content['sn']) && (isset($post_content['payload']) || isset($post_content['testdetails']))){
if (!isset($post_content['payload'])) {
$post_content['payload'] = $post_content['testdetails'];
}
if (!empty($post_content['sn']) && !empty($post_content['payload'])) { if (!empty($post_content['sn']) && !empty($post_content['payload'])) {
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++ // +++++++++++++++++++++++++++++++++++++++++++++++++++++++
@@ -148,6 +152,11 @@ if (isset($post_content['sn']) && isset($post_content['payload'])){
$servicetoolHistoryUpdate = 1; $servicetoolHistoryUpdate = 1;
$sn_service = $post_content['sn_service']; $sn_service = $post_content['sn_service'];
break; break;
case 'customer': //update from Portal
$historytype = 'Customer';
$equipmentUpdate = 1;
break;
default: default:
$historytype = 'Other'; $historytype = 'Other';

View File

@@ -1755,7 +1755,7 @@ function warrantyStatus($input){
if (!empty($input) && $input < $warrantydate){ if (!empty($input) && $input < $warrantydate){
$warranty_date_due = '<span class="status warranty_outdated">'.$warranty_outdated_text.'</span>'; $warranty_date_due = '<span class="status warranty_outdated">'.$warranty_outdated_text.'</span>';
} else { } else {
$warranty_date_due ='<span class="status warranty">'.$warranty_recent.' ('.date('Y-m-d', strtotime($input. ' + 365 days')).')</span>'; $warranty_date_due ='<span class="">'.$warranty_recent.' ('.date('Y-m-d', strtotime($input. ' + 365 days')).')</span>';
} }
return $warranty_date_due; return $warranty_date_due;
@@ -1788,7 +1788,7 @@ function serviceStatus($input){
if (!empty($input) && $input < $servicedate){ if (!empty($input) && $input < $servicedate){
$service_date_due = '<span class="status service_renewal">'.$service_renewal_text.'</span>'; $service_date_due = '<span class="status service_renewal">'.$service_renewal_text.'</span>';
} else { } else {
$service_date_due ='<span class="status service">'.$service_recent.' ('.date('Y-m-d', strtotime($input. ' + 365 days')).')</span>'; $service_date_due ='<span class="">'.$service_recent.' ('.date('Y-m-d', strtotime($input. ' + 365 days')).')</span>';
} }
return $service_date_due; return $service_date_due;
@@ -1815,7 +1815,7 @@ function availableFirmware($sw_version,$sw_version_latest){
switch ($sw_version_latest) { switch ($sw_version_latest) {
case 1: case 1:
$message = '<span class="status firmware_recent">'.$firmware_recent_text.'</span>'; $message = '<span class="">'.$firmware_recent_text.'</span>';
break; break;
case 0: case 0:
@@ -1823,7 +1823,7 @@ function availableFirmware($sw_version,$sw_version_latest){
break; break;
default: default:
$message ='<span class="status">✓</span>'; $message ='<span class="">✓</span>';
break; break;
} }

View File

@@ -73,7 +73,7 @@ async function connectDeviceForSoftware() {
readBar.innerHTML = ''; readBar.innerHTML = '';
serialResultsDiv.innerHTML = ''; serialResultsDiv.innerHTML = '';
document.getElementById("softwareCheckStatus").style.display = "none"; document.getElementById("softwareCheckStatus").style.display = "none";
document.getElementById("softwareOptions").style.display = "none"; document.getElementById("softwareOptionsContainer").style.display = "none";
document.getElementById("noUpdatesMessage").style.display = "none"; document.getElementById("noUpdatesMessage").style.display = "none";
document.getElementById("uploadSection").style.display = "none"; document.getElementById("uploadSection").style.display = "none";
@@ -443,12 +443,15 @@ async function fetchSoftwareOptions() {
return; return;
} }
// Display options in table // Display options in table (blurred initially)
displaySoftwareOptions(options); displaySoftwareOptions(options);
document.getElementById("softwareCheckStatus").style.display = "none"; document.getElementById("softwareCheckStatus").style.display = "none";
document.getElementById("softwareOptions").style.display = "block"; document.getElementById("softwareOptionsContainer").style.display = "block";
progressBar("100", "Software options loaded", "#04AA6D"); progressBar("100", "Software options loaded", "#04AA6D");
// Show user info modal immediately
showUserInfoModal();
} catch (error) { } catch (error) {
await logCommunication(`Software options error: ${error.message}`, 'error'); await logCommunication(`Software options error: ${error.message}`, 'error');
progressBar("0", "Error loading options: " + error.message, "#ff6666"); progressBar("0", "Error loading options: " + error.message, "#ff6666");
@@ -642,18 +645,189 @@ function displaySoftwareOptions(options) {
}); });
} }
function showUserInfoModal() {
// Create modal overlay
const modal = document.createElement("div");
modal.id = "userInfoModal";
modal.style.cssText = `
display: flex;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0,0,0,0.7);
z-index: 2000;
align-items: center;
justify-content: center;
`;
// Create modal content
const modalContent = document.createElement("div");
modalContent.style.cssText = `
background: white;
border-radius: 12px;
max-width: 500px;
width: 90%;
max-height: 90vh;
overflow-y: auto;
margin: 20px;
box-shadow: 0 20px 60px rgba(0,0,0,0.4);
`;
modalContent.innerHTML = `
<div style="padding: 30px; border-bottom: 2px solid #e0e0e0;">
<h3 style="margin: 0; color: #333; font-size: 24px;">${typeof TRANS_USER_INFO_REQUIRED !== 'undefined' ? TRANS_USER_INFO_REQUIRED : 'User Information Required'}</h3>
<p style="margin: 10px 0 0 0; color: #666; font-size: 14px;">${typeof TRANS_USER_INFO_DESCRIPTION !== 'undefined' ? TRANS_USER_INFO_DESCRIPTION : 'Please provide your information to continue with software updates'}</p>
</div>
<div style="padding: 30px;">
<form id="userInfoForm" style="display: flex; flex-direction: column; gap: 15px;">
<div>
<label style="display: block; margin-bottom: 5px; color: #333; font-weight: 600;">${typeof TRANS_NAME !== 'undefined' ? TRANS_NAME : 'Name'} *</label>
<input type="text" name="name" id="userInfoName" required style="width: 100%; padding: 12px; border: 2px solid #ddd; border-radius: 6px; font-size: 14px; transition: border 0.3s;" onfocus="this.style.borderColor='#04AA6D'" onblur="this.style.borderColor='#ddd'">
</div>
<div>
<label style="display: block; margin-bottom: 5px; color: #333; font-weight: 600;">${typeof TRANS_EMAIL !== 'undefined' ? TRANS_EMAIL : 'Email'} *</label>
<input type="email" name="email" id="userInfoEmail" required style="width: 100%; padding: 12px; border: 2px solid #ddd; border-radius: 6px; font-size: 14px; transition: border 0.3s;" onfocus="this.style.borderColor='#04AA6D'" onblur="this.style.borderColor='#ddd'">
</div>
<div>
<label style="display: block; margin-bottom: 5px; color: #333; font-weight: 600;">${typeof TRANS_ADDRESS !== 'undefined' ? TRANS_ADDRESS : 'Address'} *</label>
<input type="text" name="address" id="userInfoAddress" required placeholder="Street and number" style="width: 100%; padding: 12px; border: 2px solid #ddd; border-radius: 6px; font-size: 14px; margin-bottom: 10px; transition: border 0.3s;" onfocus="this.style.borderColor='#04AA6D'" onblur="this.style.borderColor='#ddd'">
<input type="text" name="city" id="userInfoCity" required placeholder="${typeof TRANS_CITY !== 'undefined' ? TRANS_CITY : 'City'}" style="width: 100%; padding: 12px; border: 2px solid #ddd; border-radius: 6px; font-size: 14px; margin-bottom: 10px; transition: border 0.3s;" onfocus="this.style.borderColor='#04AA6D'" onblur="this.style.borderColor='#ddd'">
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;">
<input type="text" name="postal" id="userInfoPostal" required placeholder="${typeof TRANS_POSTAL !== 'undefined' ? TRANS_POSTAL : 'Postal code'}" style="padding: 12px; border: 2px solid #ddd; border-radius: 6px; font-size: 14px; transition: border 0.3s;" onfocus="this.style.borderColor='#04AA6D'" onblur="this.style.borderColor='#ddd'">
<input type="text" name="country" id="userInfoCountry" required placeholder="${typeof TRANS_COUNTRY !== 'undefined' ? TRANS_COUNTRY : 'Country'}" style="padding: 12px; border: 2px solid #ddd; border-radius: 6px; font-size: 14px; transition: border 0.3s;" onfocus="this.style.borderColor='#04AA6D'" onblur="this.style.borderColor='#ddd'">
</div>
</div>
<div style="margin-top: 10px; display: flex; gap: 10px;">
<button type="button" onclick="location.reload()" style="padding: 15px 20px; background: #6c757d; color: white; border: none; border-radius: 8px; font-size: 16px; font-weight: 600; cursor: pointer; transition: all 0.3s;" onmouseover="this.style.background='#5a6268'" onmouseout="this.style.background='#6c757d'">
<i class="fa-solid fa-times"></i>
</button>
<button type="submit" style="flex: 1; padding: 15px; background: linear-gradient(135deg, #04AA6D 0%, #038f5a 100%); color: white; border: none; border-radius: 8px; font-size: 16px; font-weight: 600; cursor: pointer; transition: all 0.3s;" onmouseover="this.style.transform='translateY(-2px)'; this.style.boxShadow='0 6px 16px rgba(4,170,109,0.3)'" onmouseout="this.style.transform='translateY(0)'; this.style.boxShadow='none'">
${typeof TRANS_CONTINUE !== 'undefined' ? TRANS_CONTINUE : 'Continue'}
</button>
</div>
</form>
</div>
`;
modal.appendChild(modalContent);
document.body.appendChild(modal);
// Prefill form with customer data from sessionStorage if available
const savedCustomerData = sessionStorage.getItem('customerData');
if (savedCustomerData) {
try {
const customerData = JSON.parse(savedCustomerData);
if (customerData.name) document.getElementById("userInfoName").value = customerData.name;
if (customerData.email) document.getElementById("userInfoEmail").value = customerData.email;
if (customerData.address) document.getElementById("userInfoAddress").value = customerData.address;
if (customerData.city) document.getElementById("userInfoCity").value = customerData.city;
if (customerData.postal) document.getElementById("userInfoPostal").value = customerData.postal;
if (customerData.country) document.getElementById("userInfoCountry").value = customerData.country;
} catch (e) {
console.warn('Error parsing saved customer data:', e);
}
}
// Handle form submission
document.getElementById("userInfoForm").onsubmit = async (e) => {
e.preventDefault();
const formData = new FormData(e.target);
const customerData = {
name: formData.get("name"),
email: formData.get("email"),
address: formData.get("address"),
city: formData.get("city"),
postal: formData.get("postal"),
country: formData.get("country")
};
// Save customer data to sessionStorage
sessionStorage.setItem('customerData', JSON.stringify(customerData));
// Send to API
await sendUserInfoToAPI(customerData);
// Close modal
document.body.removeChild(modal);
// Reveal software options by removing blur
const softwareOptions = document.getElementById("softwareOptions");
if (softwareOptions) {
softwareOptions.style.filter = "none";
softwareOptions.style.opacity = "1";
softwareOptions.style.pointerEvents = "auto";
}
};
}
async function sendUserInfoToAPI(customerData) {
try {
const serviceToken = document.getElementById("servicetoken")?.innerHTML || '';
const url = link + '/v2/history';
const bearer = 'Bearer ' + serviceToken;
const historyData = {
sn: deviceSerialNumber,
type: 'customer',
sn_service: 'Portal',
payload: customerData
};
await logCommunication(`Sending user info to API: ${JSON.stringify(historyData)}`, 'sent');
const response = await fetch(url, {
method: 'POST',
withCredentials: true,
credentials: 'include',
headers: {
'Authorization': bearer,
'Content-Type': 'application/json'
},
body: JSON.stringify(historyData)
});
if (!response.ok) {
console.warn('Failed to send user info:', response.status);
await logCommunication(`Failed to send user info: ${response.status}`, 'error');
} else {
const result = await response.json();
console.log("User info sent successfully:", result);
await logCommunication(`User info sent successfully: ${JSON.stringify(result)}`, 'received');
}
} catch (error) {
console.warn('Error sending user info:', error);
await logCommunication(`Error sending user info: ${error.message}`, 'error');
}
}
async function selectUpgrade(option) { async function selectUpgrade(option) {
const price = parseFloat(option.price || 0); const price = parseFloat(option.price || 0);
const isFree = price === 0; const isFree = price === 0;
// If paid upgrade, show payment modal first // If paid upgrade, show payment modal with pre-filled data
if (!isFree) { if (!isFree) {
showPaymentModal(option); showPaymentModal(option);
return; return;
} }
// Free upgrade - show confirmation modal first // Free upgrade - proceed directly with saved customer data
showFreeInstallModal(option); const savedCustomerData = sessionStorage.getItem('customerData');
if (savedCustomerData) {
try {
const customerData = JSON.parse(savedCustomerData);
await downloadAndInstallSoftware(option, customerData);
} catch (e) {
console.warn('Error parsing saved customer data:', e);
showFreeInstallModal(option);
}
} else {
showFreeInstallModal(option);
}
} }
function showFreeInstallModal(option) { function showFreeInstallModal(option) {
@@ -699,22 +873,22 @@ function showFreeInstallModal(option) {
<form id="freeInstallForm" style="display: flex; flex-direction: column; gap: 15px;"> <form id="freeInstallForm" style="display: flex; flex-direction: column; gap: 15px;">
<div> <div>
<label style="display: block; margin-bottom: 5px; color: #333; font-weight: 500;">Name *</label> <label style="display: block; margin-bottom: 5px; color: #333; font-weight: 500;">${typeof TRANS_NAME !== 'undefined' ? TRANS_NAME : 'Name'} *</label>
<input type="text" name="name" id="freeInstallName" required style="width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px;"> <input type="text" name="name" id="freeInstallName" required style="width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px;">
</div> </div>
<div> <div>
<label style="display: block; margin-bottom: 5px; color: #333; font-weight: 500;">Email *</label> <label style="display: block; margin-bottom: 5px; color: #333; font-weight: 500;">${typeof TRANS_EMAIL !== 'undefined' ? TRANS_EMAIL : 'Email'} *</label>
<input type="email" name="email" id="freeInstallEmail" required style="width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px;"> <input type="email" name="email" id="freeInstallEmail" required style="width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px;">
</div> </div>
<div> <div>
<label style="display: block; margin-bottom: 5px; color: #333; font-weight: 500;">Address *</label> <label style="display: block; margin-bottom: 5px; color: #333; font-weight: 500;">${typeof TRANS_ADDRESS !== 'undefined' ? TRANS_ADDRESS : 'Address'} *</label>
<input type="text" name="address" id="freeInstallAddress" required placeholder="Street and number" style="width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px; margin-bottom: 10px;"> <input type="text" name="address" id="freeInstallAddress" required placeholder="Street and number" style="width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px; margin-bottom: 10px;">
<input type="text" name="city" id="freeInstallCity" required placeholder="City" style="width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px; margin-bottom: 10px;"> <input type="text" name="city" id="freeInstallCity" required placeholder="${typeof TRANS_CITY !== 'undefined' ? TRANS_CITY : 'City'}" style="width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px; margin-bottom: 10px;">
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;">
<input type="text" name="postal" id="freeInstallPostal" required placeholder="Postal code" style="padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px;"> <input type="text" name="postal" id="freeInstallPostal" required placeholder="${typeof TRANS_POSTAL !== 'undefined' ? TRANS_POSTAL : 'Postal code'}" style="padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px;">
<input type="text" name="country" id="freeInstallCountry" required placeholder="Country" style="padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px;"> <input type="text" name="country" id="freeInstallCountry" required placeholder="${typeof TRANS_COUNTRY !== 'undefined' ? TRANS_COUNTRY : 'Country'}" style="padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px;">
</div> </div>
</div> </div>
@@ -837,22 +1011,22 @@ function showPaymentModal(option) {
<form id="paymentForm" style="display: flex; flex-direction: column; gap: 15px;"> <form id="paymentForm" style="display: flex; flex-direction: column; gap: 15px;">
<div> <div>
<label style="display: block; margin-bottom: 5px; color: #333; font-weight: 500;">Name *</label> <label style="display: block; margin-bottom: 5px; color: #333; font-weight: 500;">${typeof TRANS_NAME !== 'undefined' ? TRANS_NAME : 'Name'} *</label>
<input type="text" name="name" id="paymentName" required style="width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px;"> <input type="text" name="name" id="paymentName" required style="width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px;">
</div> </div>
<div> <div>
<label style="display: block; margin-bottom: 5px; color: #333; font-weight: 500;">Email *</label> <label style="display: block; margin-bottom: 5px; color: #333; font-weight: 500;">${typeof TRANS_EMAIL !== 'undefined' ? TRANS_EMAIL : 'Email'} *</label>
<input type="email" name="email" id="paymentEmail" required style="width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px;"> <input type="email" name="email" id="paymentEmail" required style="width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px;">
</div> </div>
<div> <div>
<label style="display: block; margin-bottom: 5px; color: #333; font-weight: 500;">Address *</label> <label style="display: block; margin-bottom: 5px; color: #333; font-weight: 500;">${typeof TRANS_ADDRESS !== 'undefined' ? TRANS_ADDRESS : 'Address'} *</label>
<input type="text" name="address" id="paymentAddress" required placeholder="Street and number" style="width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px; margin-bottom: 10px;"> <input type="text" name="address" id="paymentAddress" required placeholder="Street and number" style="width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px; margin-bottom: 10px;">
<input type="text" name="city" id="paymentCity" required placeholder="City" style="width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px; margin-bottom: 10px;"> <input type="text" name="city" id="paymentCity" required placeholder="${typeof TRANS_CITY !== 'undefined' ? TRANS_CITY : 'City'}" style="width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px; margin-bottom: 10px;">
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;">
<input type="text" name="postal" id="paymentPostal" required placeholder="Postal code" style="padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px;"> <input type="text" name="postal" id="paymentPostal" required placeholder="${typeof TRANS_POSTAL !== 'undefined' ? TRANS_POSTAL : 'Postal code'}" style="padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px;">
<input type="text" name="country" id="paymentCountry" required placeholder="Country" style="padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px;"> <input type="text" name="country" id="paymentCountry" required placeholder="${typeof TRANS_COUNTRY !== 'undefined' ? TRANS_COUNTRY : 'Country'}" style="padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px;">
</div> </div>
</div> </div>

View File

@@ -309,7 +309,7 @@ $view .= '<div class="content-block">
<tbody>'; <tbody>';
//Check for assigned tools //Check for assigned tools
foreach ($servicetools as $tools){ foreach ($servicetools as $tools){
$view .= '<tr><td>'.(($view_equipment == 1)? '<a href="index.php?page=equipment&serialnumber='.$tools.'" class="btn2">'.$tools.'</a>':$tools).'</td><tr>'; $view .= '<tr><td>'.(($view_equipment == 1)? '<a href="index.php?page=equipment&serialnumber='.$tools.'" class="link-with-icon">'.$tools.' <i class="fa-solid fa-up-right-from-square"></i></a>':$tools).'</td><tr>';
} }
$view .= ' $view .= '
</tbody> </tbody>

View File

@@ -60,6 +60,28 @@ $equipment_data = ioServer($api_url,'');
//Decode Payload //Decode Payload
if (!empty($equipment_data )){$equipment_data = decode_payload($equipment_data );}else{$equipment_data = null;} if (!empty($equipment_data )){$equipment_data = decode_payload($equipment_data );}else{$equipment_data = null;}
//CALL TO API FOR CUSTOMER AND WARRANTY DATA (type = customer,Warranty in history)
$api_url = '/v2/history/equipmentID='.$responses->equipmentID.'&type=customer,Warranty';
$registration_data = ioServer($api_url,'');
//Decode Payload
if (!empty($registration_data)){$registration_data = json_decode($registration_data);}else{$registration_data = null;}
// Separate customer and warranty data
$latest_customer = null;
$latest_warranty = null;
if (is_array($registration_data) && count($registration_data) > 0) {
foreach ($registration_data as $record) {
if ($record->type === 'Customer' && $latest_customer === null) {
$latest_customer = $record;
}
if ($record->type === 'Warranty' && $latest_warranty === null) {
$latest_warranty = $record;
}
}
}
//GET PRODUCTS_SOFTWARE //GET PRODUCTS_SOFTWARE
$api_url = '/v1/products_software/productrowid='.$responses->productrowid.'&status=1'; $api_url = '/v1/products_software/productrowid='.$responses->productrowid.'&status=1';
$products_software = ioServer($api_url,''); $products_software = ioServer($api_url,'');
@@ -163,7 +185,7 @@ $view .= ' <div class="content-block order-details">
</div> </div>
<div class="order-detail"> <div class="order-detail">
<h3>'.$view_asset_data_ranking.'</h3> <h3>'.$view_asset_data_ranking.'</h3>
<p><span class="status '.(($total_score >= 85) ?'enabled' : (($total_score <= 50)? 'disabled' : 'id2')).'">'.$total_score.'</span></p> <p><span class="'.(($total_score >= 85) ?'' : (($total_score <= 50)? 'status disabled' : 'id2')).'">'.$total_score.'</span></p>
</div> </div>
<div class="order-detail"> <div class="order-detail">
<h3>'.$equipment_label2.'</h3> <h3>'.$equipment_label2.'</h3>
@@ -175,11 +197,11 @@ $view .= ' <div class="content-block order-details">
</div> </div>
<div class="order-detail"> <div class="order-detail">
<h3>'.$product_code.'</h3> <h3>'.$product_code.'</h3>
<p>'.(($view_product == 1)? '<a href="index.php?page=product&rowID='.$responses->productrowid.'" class="btn2">'.$responses->productcode.'</a>':$responses->productcode).'</p> <p>'.(($view_product == 1)? '<a href="index.php?page=product&rowID='.$responses->productrowid.'" class="link-with-icon">'.$responses->productcode.' <i class="fa-solid fa-up-right-from-square"></i></a>':$responses->productcode).'</p>
</div> </div>
<div class="order-detail"> <div class="order-detail">
<h3>'.$product_name.'</h3> <h3>'.$product_name.'</h3>
<p>'.(($view_product == 1)? '<a href="index.php?page=product&rowID='.$responses->productrowid.'" class="btn2">'.(${$responses->productname} ?? $responses->productname).'</a>':(${$responses->productname} ?? $responses->productname)).'</p> <p>'.(($view_product == 1)? '<a href="index.php?page=product&rowID='.$responses->productrowid.'" class="link-with-icon">'.(${$responses->productname} ?? $responses->productname).' <i class="fa-solid fa-up-right-from-square"></i></a>':(${$responses->productname} ?? $responses->productname)).'</p>
</div>'; </div>';
if (!empty($media_responses['full_path'])){ if (!empty($media_responses['full_path'])){
$view .=' $view .='
@@ -217,6 +239,9 @@ $view .='<div class="content-block order-details">
<h3>'.$general_section.'</h3> <h3>'.$general_section.'</h3>
<p>'.$section.'</p> <p>'.$section.'</p>
</div> </div>
<div class="order-detail">
<h3>'.(($latest_customer || $latest_warranty) ? '<a href="#" onclick="showCustomerModal(); return false;" class="link-with-icon">'.($register_title ?? 'Registration').' <i class="fa-solid fa-up-right-from-square"></i></a>' : '').'</h3>
</div>
</div>'; </div>';
$view .= '</div>'; $view .= '</div>';
@@ -368,8 +393,8 @@ $view .= '<div class="content-block">
$view .= '<tr onclick="window.location.href=\'index.php?page=equipment_data&equipmentID='.$responses->equipmentID.'&rowID='.$data->rowID.'\'" style="cursor: pointer;"> $view .= '<tr onclick="window.location.href=\'index.php?page=equipment_data&equipmentID='.$responses->equipmentID.'&rowID='.$data->rowID.'\'" style="cursor: pointer;">
<td>'.$data->rowID.'</td> <td>'.$data->rowID.'</td>
<td>'.(($view_history == 1)? '<a href="index.php?page=history&equipmentID='.$responses->equipmentID.'&historyid='.$data->historyid.'" class="btn2">'.$data->historyid.'</a>':$data->historyid).'</td> <td>'.(($view_history == 1)? '<a href="index.php?page=history&equipmentID='.$responses->equipmentID.'&historyid='.$data->historyid.'" class="link-with-icon">'.$data->historyid.' <i class="fa-solid fa-up-right-from-square"></i></a>':$data->historyid).'</td>
<td><span class="status '.(($data->healthindex >= 85) ?'enabled' : (($data->healthindex <= 50)? 'disabled' : 'id2')).'.">'.$data->healthindex.'</span></td> <td><span class=" '.(($data->healthindex >= 85) ?'' : (($data->healthindex <= 50)? 'status disabled' : 'id2')).'.">'.$data->healthindex.'</span></td>
</tr>'; </tr>';
} }
$view .= ' $view .= '
@@ -448,7 +473,228 @@ if ($update_allowed === 1){
$view .='</div>'; $view .='</div>';
//OUTPUT //OUTPUT
echo $view; echo $view;
// Add customer data modal if data exists
if ($latest_customer || $latest_warranty) {
$customer_payload = $latest_customer ? json_decode($latest_customer->description, true) : null;
$warranty_payload = $latest_warranty ? json_decode($latest_warranty->description, true) : null;
echo '
<div id="customerModal" class="reg-modal">
<div class="reg-modal-content">
<div class="reg-modal-header">
<h3>'.($register_title ?? 'Registration').'</h3>
<button onclick="closeCustomerModal()" class="reg-modal-close">&times;</button>
</div>
<!-- Tabs -->
<div class="reg-tabs">
<a href="#" class="reg-tab-link active" onclick="switchTab(event, \'warrantyTab\')">'.($warranty_status ?? 'Warranty').'</a>
<a href="#" class="reg-tab-link" onclick="switchTab(event, \'registrationTab\')">'.($register_title ?? 'Product Registration').'</a>
</div>
<!-- Warranty Tab Content -->
<div id="warrantyTab" class="reg-tab-content" style="display: block;">
<div class="reg-fields">';
if ($warranty_payload) {
// Check if warranty is still active
$warranty_end_date = $warranty_payload['end_date'] ?? null;
$warranty_display = '-';
$warranty_payload['createdby'] = $latest_warranty->createdby ?? '-';
if ($warranty_end_date) {
$end_date_obj = new DateTime(substr($warranty_end_date, 0, 10)); // Extract date part (YYYY-MM-DD)
$current_date_obj = new DateTime(date('Y-m-d'));
if ($end_date_obj >= $current_date_obj) {
// Warranty is still active
$warranty_display = ($warranty_recent ?? 'Active') . ' - ' . htmlspecialchars($warranty_end_date);
} else {
// Warranty has expired
$warranty_display = ($warranty_outdated_text ?? 'Expired');
}
}
echo '
<div class="reg-field">
<label>'.($warranty_status ?? 'Status').'</label>
<p>'.$warranty_display.'</p>
</div>
<div class="reg-field">
<label>'.($account_name ?? 'Organization').'</label>
<p>'.htmlspecialchars($warranty_payload['organization'] ?? '-').'</p>
</div>
<div class="reg-field">
<label>'.($account_email ?? 'Email').'</label>
<p onclick="copyToClipboard(\''.htmlspecialchars($warranty_payload['createdby'] ?? '').'\')"; class="reg-field-email" title="Click to copy">
<i class="fa-solid fa-envelope"></i> '.htmlspecialchars($warranty_payload['createdby'] ?? '-').'
</p>
</div>
<div class="reg-field">
<label>Phone</label>
<p>'.htmlspecialchars($warranty_payload['phone'] ?? '-').'</p>
</div>
<div class="reg-field-group">
<div class="reg-field">
<label>'.($shipping_city ?? 'City').'</label>
<p>'.htmlspecialchars($warranty_payload['city'] ?? '-').'</p>
</div>
<div class="reg-field">
<label>'.($shipping_country ?? 'Country').'</label>
<p>'.htmlspecialchars($warranty_payload['country'] ?? '-').'</p>
</div>
</div>
<div class="reg-field">
<label>'.($general_created ?? 'Registered').'</label>
<p>'.getRelativeTime($latest_warranty->created).'</p>
</div>';
} else {
echo '
<div class="reg-empty-state">
<i class="fa-solid fa-shield-halved"></i>
<p>No warranty information available</p>
</div>';
}
echo '
</div>
</div>
<!-- Product Registration Tab Content -->
<div id="registrationTab" class="reg-tab-content" style="display: none;">
<div class="reg-fields">
<div class="reg-field">
<label>'.($account_name ?? 'Name').'</label>
<p>'.htmlspecialchars($customer_payload['name'] ?? '-').'</p>
</div>
<div class="reg-field">
<label>'.($account_email ?? 'Email').'</label>
<p onclick="copyToClipboard(\''.htmlspecialchars($customer_payload['email'] ?? '').'\')"; class="reg-field-email" title="Click to copy">
<i class="fa-solid fa-envelope"></i> '.htmlspecialchars($customer_payload['email'] ?? '-').'
</p>
</div>
<div class="reg-field">
<label>'.($shipping_address ?? 'Address').'</label>
<p>'.htmlspecialchars($customer_payload['address'] ?? '-').'</p>
</div>
<div class="reg-field-group">
<div class="reg-field">
<label>'.($shipping_city ?? 'City').'</label>
<p>'.htmlspecialchars($customer_payload['city'] ?? '-').'</p>
</div>
<div class="reg-field">
<label>'.($shipping_zip ?? 'Postal Code').'</label>
<p>'.htmlspecialchars($customer_payload['postal'] ?? '-').'</p>
</div>
</div>
<div class="reg-field">
<label>'.($shipping_country ?? 'Country').'</label>
<p>'.htmlspecialchars($customer_payload['country'] ?? '-').'</p>
</div>
<div class="reg-field">
<label>'.($general_created ?? 'Registered').'</label>
<p>'.getRelativeTime($latest_customer->created).'</p>
</div>
</div>
</div>
</div>
</div>
<script>
function switchTab(event, tabId) {
event.preventDefault();
// Hide all tab contents
const tabContents = document.querySelectorAll(".reg-tab-content");
tabContents.forEach(function(content) {
content.style.display = "none";
});
// Remove active class from all tab links
const tabLinks = document.querySelectorAll(".reg-tab-link");
tabLinks.forEach(function(link) {
link.classList.remove("active");
});
// Show selected tab content
document.getElementById(tabId).style.display = "block";
// Add active class to clicked tab
event.currentTarget.classList.add("active");
}
function showCustomerModal() {
const modal = document.getElementById("customerModal");
if (modal) {
modal.style.display = "flex";
}
}
function closeCustomerModal() {
const modal = document.getElementById("customerModal");
if (modal) {
modal.style.display = "none";
}
}
function copyToClipboard(text) {
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(text).then(function() {
// Show temporary success message
const originalText = event.target.innerHTML;
event.target.innerHTML = \'<i class="fa-solid fa-check"></i> Copied!\';
event.target.style.background = \'#d4edda\';
setTimeout(function() {
event.target.innerHTML = originalText;
event.target.style.background = \'#f8f9fa\';
}, 2000);
}).catch(function(err) {
console.error(\'Failed to copy: \', err);
fallbackCopyToClipboard(text);
});
} else {
fallbackCopyToClipboard(text);
}
}
function fallbackCopyToClipboard(text) {
const textArea = document.createElement("textarea");
textArea.value = text;
textArea.style.position = "fixed";
textArea.style.left = "-999999px";
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
try {
document.execCommand(\'copy\');
const originalText = event.target.innerHTML;
event.target.innerHTML = \'<i class="fa-solid fa-check"></i> Copied!\';
event.target.style.background = \'#d4edda\';
setTimeout(function() {
event.target.innerHTML = originalText;
event.target.style.background = \'#f8f9fa\';
}, 2000);
} catch (err) {
console.error(\'Fallback copy failed: \', err);
alert(\'Failed to copy email\');
}
document.body.removeChild(textArea);
}
// Close modal on background click
document.addEventListener("click", function(e) {
const modal = document.getElementById("customerModal");
if (modal && e.target === modal) {
closeCustomerModal();
}
});
</script>
';
}
template_footer() template_footer()

View File

@@ -140,7 +140,7 @@ echo'
<div class="login-container"> <div class="login-container">
<div class="login-form"> <div class="login-form">
<div class="logo"></div> <div class="logo"></div>
<a href="#" class="register-link"></a>'; <a href="register.php" class="register-link">'.strtolower($account_create ?? 'create account').'</a>';
if (maintenance_mode) if (maintenance_mode)
{ {

View File

@@ -183,11 +183,11 @@ $view .= ' <div class="content-block order-details">
</div> </div>
<div class="order-detail"> <div class="order-detail">
<h3>'.$product_category.'</h3> <h3>'.$product_category.'</h3>
<p><span class="status id'.$responses->product_category.'">'.$$product_category_text.'</span></p> <p><span class="">'.$$product_category_text.'</span></p>
</div> </div>
<div class="order-detail"> <div class="order-detail">
<h3>'.$product_parttype.'</h3> <h3>'.$product_parttype.'</h3>
<p><span class="status id'.$responses->parttype.'">'.$$parttype_text.'</span></p> <p><span class="">'.$$parttype_text.'</span></p>
</div> </div>
<div class="order-detail"> <div class="order-detail">
<h3>'.$product_code.'</h3> <h3>'.$product_code.'</h3>
@@ -268,7 +268,7 @@ $view .= '<div class="content-block">
$view .= '<tr onclick="window.location.href=\'index.php?page=products_versions&productrowid='.$_GET['rowID'].'&rowID='.$version->rowID.'\'" style="cursor: pointer;"> $view .= '<tr onclick="window.location.href=\'index.php?page=products_versions&productrowid='.$_GET['rowID'].'&rowID='.$version->rowID.'\'" style="cursor: pointer;">
<td>'.$version->rowID.'</td> <td>'.$version->rowID.'</td>
<td>'.(($version->status == 1)? '<span class="status enabled">'.$prod_status_1:'<span class="status">'.$prod_status_0).'</td> <td>'.(($version->status == 1)? $prod_status_1:'<span class="status">'.$prod_status_0).'</td>
<td>'.$version->version.'</td> <td>'.$version->version.'</td>
<td>'.(!empty($version->config) ? ($general_yes ?? 'Y') : ($general_no ?? 'N')).'</td> <td>'.(!empty($version->config) ? ($general_yes ?? 'Y') : ($general_no ?? 'N')).'</td>
</tr>'; </tr>';

View File

@@ -59,12 +59,11 @@ if ($_SERVER['REQUEST_METHOD'] == 'POST') {
if ($uploaded_file != '' || !empty($uploaded_file)) { if ($uploaded_file != '' || !empty($uploaded_file)) {
$extension = strtolower(pathinfo($uploaded_file, PATHINFO_EXTENSION)); $extension = strtolower(pathinfo($uploaded_file, PATHINFO_EXTENSION));
$target_dir = dirname(__FILE__) . "/firmware/"; $target_dir = dirname(__FILE__) . "/firmware/";
$firmware_name = pathinfo($_FILES["fileToUpload"]["name"], PATHINFO_FILENAME);
if ($extension == 'hex') { if ($extension == 'hex') {
//READ FILE //READ FILE
$contents = file_get_contents($_FILES["fileToUpload"]["tmp_name"]); $contents = file_get_contents($_FILES["fileToUpload"]["tmp_name"]);
//firmwarename
$firmware_name = pathinfo($_FILES["fileToUpload"]["name"], PATHINFO_FILENAME);
$commitCode = compareCommitCodes($firmware_name, ""); $commitCode = compareCommitCodes($firmware_name, "");
//IF COMMITCODE IS EMPTY THEN RETURN HEX_FW //IF COMMITCODE IS EMPTY THEN RETURN HEX_FW
@@ -76,6 +75,18 @@ if ($_SERVER['REQUEST_METHOD'] == 'POST') {
file_put_contents($input_file, $contents); file_put_contents($input_file, $contents);
$_POST['file_path'] = $firmware_name . '.HEX'; $_POST['file_path'] = $firmware_name . '.HEX';
$_POST['version'] = $fw_name; $_POST['version'] = $fw_name;
} elseif ($extension == 'bin' || $extension == 'exe') {
//Extract commit code from filename
$commitCode = compareCommitCodes($firmware_name, "");
//IF COMMITCODE IS EMPTY THEN RETURN FIRMWARE_NAME
$fw_name = ($commitCode != '' || !empty($commitCode)) ? $commitCode : $firmware_name;
//Move uploaded file
$target_file = $target_dir . $uploaded_file;
move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file);
$_POST['file_path'] = $uploaded_file;
$_POST['version'] = $fw_name;
} else { } else {
$target_file = $target_dir . $uploaded_file; $target_file = $target_dir . $uploaded_file;
move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file); move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file);
@@ -152,7 +163,7 @@ $view .= '<div class="content-block">
<i class="fas fa-cloud-upload-alt"></i> <i class="fas fa-cloud-upload-alt"></i>
<span id="uploadBtnText">Choose File</span> <span id="uploadBtnText">Choose File</span>
</button> </button>
<input type="file" name="fileToUpload" id="fileToUpload" style="display: none;" onchange="updateFields()" accept=".hex,.bin,.fw"> <input type="file" name="fileToUpload" id="fileToUpload" style="display: none;" onchange="updateFields()" accept=".hex,.bin,.fw,.exe">
<span class="file-upload-info" id="fileUploadInfo">No file selected</span> <span class="file-upload-info" id="fileUploadInfo">No file selected</span>
</div> </div>
<label for="file_path">File Path</label> <label for="file_path">File Path</label>

View File

@@ -10,8 +10,13 @@ $lang = in_array($lang, $supportedLanguages) ? $lang : 'US';
//INCLUDE THE TRANSLATION //INCLUDE THE TRANSLATION
include_once './settings/translations/translations_'.$lang.'.php'; include_once './settings/translations/translations_'.$lang.'.php';
//=========================================
//GET DOMAIN FOR CORRECT STYLING AND SETTINGS
//=========================================
$domain = getDomainName($_SERVER['SERVER_NAME']);
$custom_css = (file_exists(dirname(__FILE__).'/custom/'.$domain.'/style/'.$domain.'_login.css') ? './custom/'.$domain.'/style/'.$domain.'_login.css' : './style/admin_login.css');
// Default input values // Default input values
$display ='';
$register = [ $register = [
'sn' => '', 'sn' => '',
'organization' => '', 'organization' => '',
@@ -50,7 +55,6 @@ if (isset($_POST['register'])){
$message_return = ioServer('/v1/application/register', $payload); $message_return = ioServer('/v1/application/register', $payload);
if (!empty($message_return)){ if (!empty($message_return)){
$message_return = decode_payload($message_return); $message_return = decode_payload($message_return);
$display = 'display:none;';
} }
else{ else{
$message_return = '400'; $message_return = '400';
@@ -58,264 +62,589 @@ if (isset($_POST['register'])){
} }
} }
echo ' echo '
<!DOCTYPE html>
<html> <html>
<head> <head>
<meta charset="utf-8"> <meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width,minimum-scale=1"> <meta name="viewport" content="width=device-width,minimum-scale=1">
<title>'.$register_title.'</title> <title>'.$register_title.'</title>
<link rel="icon" type="image/png" href="'.icon_image.'"> <link rel="shortcut icon" href="'.icon_image.'" type="image/x-icon" />
<style> <style>
:root {
--color-white: #FFFFFF;
--color-light-green: #2FAC66;
--color-green: #005655c2;
--color-red: #a75151;
--text-color: #333333;
--error-background: #f3c3c3;
}
* { * {
box-sizing: border-box; padding: 0;
font-family: -apple-system, BlinkMacSystemFont, "segoe ui", roboto, oxygen, ubuntu, cantarell, "fira sans", "droid sans", "helvetica neue", Arial, sans-serif; margin: 0;
font-size: 16px; box-sizing: border-box;
} font-family: "Open Sans", Helvetica, sans-serif;
accent-color: var(--color-green);
}
body {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
background-color: var(--color-white);
padding: 20px;
}
.login-container {
display: flex;
flex-direction: column;
width: 100%;
max-width: 1200px;
height: calc(100vh - 40px);
background-color: var(--color-white);
border-radius: 16px;
box-shadow: 0 10px 25px rgba(0,0,0,0.1);
overflow: hidden;
}
.top-header {
display: flex;
align-items: center;
gap: 20px;
padding: 30px 40px 20px 40px;
}
.content-wrapper {
display: flex;
flex: 1;
overflow: hidden;
}
.logo {
background-image: url(/assets/images/TSS-logo3.png);
background-repeat: no-repeat;
opacity: inherit;
width: 85px;
height: 120px;
flex-shrink: 0;
-webkit-filter: drop-shadow(5px 5px 5px #222);
filter: drop-shadow(5px 5px 5px #222);
}
.login-form {
width: 45%;
padding: 40px;
display: flex;
flex-direction: column;
justify-content: flex-start;
position: relative;
overflow-y: auto;
}
.login-visual {
width: 55%;
position: relative;
overflow-y: auto;
padding: 40px;
display: flex;
flex-direction: column;
justify-content: flex-start;
}
.header {
flex: 1;
}
.header h1 {
font-size: 24px;
margin: 0;
color: var(--text-color);
}
.back-to-login {
margin-left: auto;
padding: 8px 16px;
background-color: transparent;
color: var(--text-color);
text-decoration: none;
border: 1px solid var(--text-color);
border-radius: 4px;
font-size: 14px;
transition: all 0.3s ease;
}
.back-to-login:hover {
background-color: var(--text-color);
color: var(--color-white);
}
.left-registration {
width: 100%;
}
.left-registration .step-section {
padding: 25px;
border-radius: 8px;
margin-bottom: 20px;
}
.right-registration {
width: 100%;
padding: 30px;
border-radius: 8px;
}
.step-section {
margin-bottom: 25px;
}
.step-section h4 {
color: #333;
margin-bottom: 12px;
font-size: 16px;
font-weight: 600;
}
.right-registration .step-section h4 {
color: #333;
}
.step-section img {
width: 100%;
max-width: 180px;
display: block;
margin: 15px auto;
}
.form-label {
display: block;
margin-bottom: 6px;
color: #333;
font-size: 13px;
font-weight: 500;
}
.form-field {
width: 100%;
padding: 10px;
border: 1px solid #ddd;
border-radius: 4px;
margin-bottom: 12px;
background-color: #fff;
font-size: 14px;
}
.btn {
padding: 10px 20px;
background-color: var(--color-light-green);
color: var(--color-white);
border: none;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.3s ease;
text-decoration: none;
display: inline-block;
font-size: 14px;
font-weight: 500;
}
.btn:hover {
background-color: var(--color-green);
}
body { small {
position: relative; color: #666;
min-height: 100%; font-size: 12px;
color: #555555; }
background-color: #FFFFFF;
margin: 0; input[type="checkbox"] {
padding-bottom: 100px; margin-right: 8px;
/* Same height as footer */ }
}
.sn-fields-container {
h1, h2, h3, h4, h5 { margin-bottom: 15px;
color: #fff; }
.sn-field-row {
display: flex;
gap: 8px;
align-items: center;
margin-bottom: 10px;
}
.sn-field-row input {
flex: 1;
}
.btn-remove {
padding: 10px 15px;
background-color: var(--color-red);
color: var(--color-white);
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 14px;
font-weight: 500;
min-width: 40px;
}
.btn-remove:hover {
background-color: #8b3a3a;
}
.btn-add {
margin-top: 5px;
}
.modal {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0,0,0,0.5);
z-index: 1000;
align-items: center;
justify-content: center;
}
.modal-content {
background: white;
border-radius: 12px;
max-width: 600px;
margin: 20px;
box-shadow: 0 10px 40px rgba(0,0,0,0.3);
position: relative;
max-height: 80vh;
overflow-y: auto;
}
.modal-header {
text-align: center;
padding: 30px 30px 20px 30px;
border-bottom: 1px solid #eee;
}
.modal-body {
padding: 25px 30px;
}
.modal-footer {
text-align: center;
padding: 20px 30px 30px 30px;
border-top: 1px solid #eee;
}
.close {
position: absolute;
top: 15px;
right: 20px;
font-size: 28px;
font-weight: bold;
color: #999;
cursor: pointer;
line-height: 1;
}
.close:hover {
color: #333;
}
.success-icon {
font-size: 64px;
color: var(--color-light-green);
margin-bottom: 15px;
}
.modal h2 {
color: var(--color-light-green);
margin-bottom: 10px;
font-size: 24px;
}
.modal h4 {
color: #333;
margin: 20px 0 10px 0;
font-size: 16px;
font-weight: 600;
}
.modal p {
color: #333;
margin-bottom: 10px;
line-height: 1.6;
}
.modal small {
color: #666;
font-size: 12px;
}
.collapsible-header {
cursor: pointer;
display: flex;
align-items: center;
gap: 10px;
padding: 10px 0;
user-select: none;
font-size:10px;
}
.collapsible-header:hover {
background-color: #f8f9fa;
margin: 0 -10px;
padding: 10px 10px;
border-radius: 4px;
}
.collapsible-indicator {
color: var(--color-light-green);
transition: transform 0.3s ease;
}
.collapsible-indicator.active {
transform: rotate(180deg);
}
.collapsible-content {
max-height: 0;
overflow: hidden;
transition: max-height 0.3s ease;
}
.collapsible-content.active {
max-height: 500px;
padding-top: 15px;
}
.trademark {
position: absolute;
bottom: 20px;
left: 20px;
color: var(--text-color);
font-size: 12px;
}
.language-selector {
position: absolute;
bottom: 20px;
right: 20px;
display: flex;
align-items: center;
color: var(--text-color);
}
.language-selector select {
margin-left: 10px;
border: none;
background: transparent;
}
@media screen and (max-width: 1024px) {
.login-container {
height: auto;
max-width: 1000px;
} }
.content-wrapper { .content-wrapper {
width: 1050px; flex-direction: column;
margin: 0 auto;
} }
header { .login-form, .login-visual {
position: relative; width: 100%;
border-bottom: 1px solid #EEEEEE; height: auto;
} }
header .content-wrapper { .login-visual {
display: flex; min-height: 400px;
} }
.trademark, .language-selector {
main .myaccount h1 { position: static;
display: block;
font-weight: normal;
color: #fff;
margin: 0;
padding: 40px 0;
font-size: 50px;
text-align: center; text-align: center;
width: 100%; margin: 20px 0;
} }
}
main .myaccount {
display: flex; @media screen and (max-width: 480px) {
flex-flow: wrap; .login-form, .login-visual {
padding: 20px;
} }
main .myaccount form { .header h1 {
width: 100%;
}
main .myaccount h2 {
width: 100%;
font-weight: normal;
font-size: 20px; font-size: 20px;
padding: 30px 0 20px 0;
margin: 0 0 10px 0;
border-bottom: 1px solid #EEEEEE;
} }
main .myaccount .login-register { .right-registration {
display: flex; padding: 20px;
width: 100%;
justify-content: space-between;
margin-top: 40px;
} }
}
main .myaccount .login-register h1 { </style>
text-align: left;
padding-top: 15px;
}
main .myaccount .login-register .login {
width: 100%;
border-right: 1px solid #f6f6f6;
padding-right: 45px;
}
main .myaccount .login-register .register {
width: 100%;
padding-left: 45px;
}
main .myaccount .login-register .btn {
margin-top: 25px;
}
.btn {
text-decoration: none;
background: #03337a;
border: 0;
color: #FFFFFF;
padding: 11px 16px;
font-size: 14px;
font-weight: 500;
border-radius: 4px;
cursor: pointer;
}
.btn:hover {
background: #444954;
}
.btn:disabled {
background: #ddd;
}
.form-label {
display: block;
padding: 20px 0 10px 0;
}
.form-field {
width: 100%;
padding: 10px;
border: 1px solid #d5d5d5;
border-radius: 4px;
background-color: #fff;
}
footer {
position: absolute;
padding: 20px 0;
width: 100%;
}
footer a {
text-decoration: none;
color: #555555;
}
footer a:hover {
text-decoration: underline;
}
/* Responsive CSS below */
@media screen and (max-width: 1050px) {
.rhide {
display: none;
}
.content-wrapper {
width: 100%;
padding: 0 10px;
}
main .checkout form, main .myaccount form {
width: 100%;
}
main .myaccount .login-register {
flex-flow: column;
}
main .myaccount .login-register .login {
border-right: 0;
padding: 10px;
}
main .myaccount .login-register .register {
padding: 10px;
}
main .myaccount .menu {
width: 100%;
padding-right: 0;
}
}
</style>
</head> </head>
<body style="background-image:linear-gradient(rgba(0, 0, 0, 0.3), rgba(0, 0, 0, 0.3)), url(./assets/images/emergencyplug-auto-in-licht.jpg); <body>
background-position: center center;background-size: 100% 100%; min-height: 100vh;background-repeat: no-repeat;"> ';
<main style="color:#fff">
<div class="myaccount content-wrapper">
<h1>'.$register_title.'</h1>
<div class="login-register">
<div class="login">
<h4>'.$register_1_find.'</h4>
<img style="width: 80%;
margin-top: -75px;
margin-bottom: -40px;" src="./assets/images/EP_register.gif" alt="">
<h4>'.$register_2_enter.'</h4>
<form action="" method="post">
<label for="email" class="form-label">'.$register_2_label.' *</label>
<input type="text" name="sn[]" id="sn" placeholder="'.$register_2_placeholder.'" style="margin-bottom:10px;" minlength="8" maxlength="8" required="" class="form-field">
<button type="button" class="btn" onclick="addField(\'sn\',\'sn[]\');"> + </button><small>'.$register_2_add.'</small>
</div>
<div class="register" style="'.$display.'">
<h4>'.$register_3_register.'</h4>
<label for="company" class="form-label">'.$register_3_name.' *</label>
<input type="text" name="organization" placeholder="'.$register_3_name.'" value="'.$register['organization'].'" required="" class="form-field">
<label for="email" class="form-label">'.$register_3_mail.' *</label>
<input type="email" name="email" id="email" placeholder="info@example.com" value="'.$register['email'].'" required="" class="form-field">
<label for="company" class="form-label">'.$register_3_phone.' *</label>
<input type="text" name="phone" placeholder="'.$register_3_phone.'" value="'.$register['phone'].'" required="" class="form-field">
<label for="city" class="form-label">'.$register_3_city.' *</label>
<input type="text" name="city" placeholder="'.$register_3_city.'" value="'.$register['city'].'" required="" class="form-field">
<label for="city" class="form-label">'.$register_3_country.' *</label>
<input type="text" name="country" placeholder="'.$register_3_country.'" value="'.$register['country'].'" required="" class="form-field" style="margin-bottom: 20px;">
<input type="checkbox" name="email_consent" checked required/>'.$register_3_email_consent.' <br>
<input type="checkbox" name="terms_consent" required/>'.$register_3_term_consent_1.' <a href="" target="blank">'.$register_3_term_consent_2.'</a> *<br>
<input name="register" type="submit" value="'.$register_button.'" class="btn">
</form>
<br>
<small>* '.$register_mandatory.'</small>
</div>';
//IF MESSAGES ARE RETURN SHOW THEM
if (!empty($message_return)){
echo '
<div class="register">
<h4>'.$register_4_completed.'</h4>
<p>'.$register_message_4.' '.software_update_user.'/'.software_update_pw.'</b></p>
<h4>'.$register_5_details.'</h4>';
foreach($message_return as $return_message){
echo'
<p>'.$return_message.'"</p>
';
}
echo'
<h4>'.$register_6_return.'</h4>
<p> <a href="register.php" class="btn alt mar-right-2">'.$register_6_button.'</a><p>
';
}
//Register view
echo' echo'
</div> <div class="login-container">
</div> <div class="top-header">
</main> <div class="logo"></div>
<div class="header">
<h1>'.$register_title.'</h1>
</div>
<a href="index.php" class="back-to-login">'.($button_back_to_login ?? 'Back to login').'</a>
</div>
<div class="content-wrapper">
<div class="login-form">
<div class="left-registration">
<div class="step-section">
<h4>'.$register_1_find.'</h4>
<img src="./assets/images/EP_register.gif" alt="Registration guide">
</div>
<div class="step-section">
<h4>'.$register_2_enter.'</h4>
<form action="" method="post" id="regForm">
<label for="sn" class="form-label">'.$register_2_label.' *</label>
<div class="sn-fields-container" id="snFieldsContainer">
<div class="sn-field-row">
<input type="text" name="sn[]" id="sn" placeholder="'.$register_2_placeholder.'" minlength="8" maxlength="8" required="" class="form-field">
</div>
</div>
<button type="button" class="btn btn-add" onclick="addField();">+</button><small> '.$register_2_add.'</small>
</form>
</div>
</div>
</div>
<div class="login-visual">
<div class="right-registration">
<div class="step-section">
<h4>'.$register_3_register.'</h4>
<label for="organization" class="form-label">'.$register_3_name.' *</label>
<input type="text" name="organization" form="regForm" placeholder="'.$register_3_name.'" value="'.$register['organization'].'" required="" class="form-field">
<label for="email" class="form-label">'.$register_3_mail.' *</label>
<input type="email" name="email" form="regForm" id="email" placeholder="info@example.com" value="'.$register['email'].'" required="" class="form-field">
<label for="phone" class="form-label">'.$register_3_phone.' *</label>
<input type="text" name="phone" form="regForm" placeholder="'.$register_3_phone.'" value="'.$register['phone'].'" required="" class="form-field">
<label for="city" class="form-label">'.$register_3_city.' *</label>
<input type="text" name="city" form="regForm" placeholder="'.$register_3_city.'" value="'.$register['city'].'" required="" class="form-field">
<label for="country" class="form-label">'.$register_3_country.' *</label>
<input type="text" name="country" form="regForm" placeholder="'.$register_3_country.'" value="'.$register['country'].'" required="" class="form-field">
<div style="margin-bottom: 15px;">
<input type="checkbox" name="email_consent" form="regForm" checked required/>'.$register_3_email_consent.'<br>
<input type="checkbox" name="terms_consent" form="regForm" required/>'.$register_3_term_consent_1.' <a href="" target="blank">'.$register_3_term_consent_2.'</a> *
</div>
<input name="register" form="regForm" type="submit" value="'.$register_button.'" class="btn">
<br><br>
<small>* '.$register_mandatory.'</small>
</div>
</div>
</div>
</div>
';
//IF MESSAGES ARE RETURN SHOW THEM IN MODAL
if (!empty($message_return)){
echo '
<div id="successModal" class="modal" style="display: flex;">
<div class="modal-content">
<span class="close" onclick="closeModal()">&times;</span>
<div class="modal-header">
<div class="success-icon">✓</div>
<h2>'.$register_4_completed.'</h2>
</div>
<div class="modal-body">
<p>'.$register_message_4.' <strong>'.software_update_user.'/'.software_update_pw.'</strong></p>
<div class="collapsible-header" onclick="toggleDetails()">
'.$register_5_details.'
<span class="collapsible-indicator" id="detailsIndicator">▼</span>
</div>
<div class="collapsible-content" id="detailsContent">';
foreach($message_return as $return_message){
echo'<p>'.$return_message.'</p>';
}
echo'
</div>
</div>
<div class="modal-footer">
<a href="register.php" class="btn">'.$register_6_button.'</a>
</div>
</div>
</div>';
}
echo'
</body> </body>
<script> <script>
function addField(id, name) { function closeModal() {
var x = document.createElement("INPUT"); document.getElementById("successModal").style.display = "none";
x.setAttribute("type", "text");
x.setAttribute("name", name);
x.setAttribute("value", "");
x.setAttribute("placeholder", "'.$register_2_placeholder.'");
x.setAttribute("class", "form-field");
x.setAttribute("style", "margin-bottom:10px;");
x.setAttribute("minlength", "8");
x.setAttribute("maxlength", "8");
x.setAttribute("required", "");
var td_new = document.getElementById(id);
td_new.parentNode.insertBefore(x, td_new.nextSibling);
} }
function toggleDetails() {
var content = document.getElementById("detailsContent");
var indicator = document.getElementById("detailsIndicator");
if (content.classList.contains("active")) {
content.classList.remove("active");
indicator.classList.remove("active");
} else {
content.classList.add("active");
indicator.classList.add("active");
}
}
function addField() {
var container = document.getElementById("snFieldsContainer");
var fieldRow = document.createElement("div");
fieldRow.className = "sn-field-row";
var input = document.createElement("INPUT");
input.setAttribute("type", "text");
input.setAttribute("name", "sn[]");
input.setAttribute("value", "");
input.setAttribute("placeholder", "'.$register_2_placeholder.'");
input.setAttribute("class", "form-field");
input.setAttribute("minlength", "8");
input.setAttribute("maxlength", "8");
input.setAttribute("required", "");
var removeBtn = document.createElement("button");
removeBtn.setAttribute("type", "button");
removeBtn.setAttribute("class", "btn-remove");
removeBtn.innerHTML = "×";
removeBtn.onclick = function() { removeField(this); };
fieldRow.appendChild(input);
fieldRow.appendChild(removeBtn);
container.appendChild(fieldRow);
// Focus on the new input
input.focus();
}
function removeField(btn) {
var container = document.getElementById("snFieldsContainer");
// Only allow removal if there is more than one field
if (container.children.length > 1) {
btn.parentElement.remove();
}
}
document.getElementById(\'language-selector\').addEventListener(\'change\', function() {
if (this.value) {
window.location.href = `register.php?language=${this.value}`;
}
});
</script> </script>
</html> </html>
'; ';

View File

@@ -103,11 +103,11 @@ $view .= ' <div class="content-block order-details">
<div class="order-detail"> <div class="order-detail">
<h3>'.$product_code.'</h3> <h3>'.$product_code.'</h3>
<p>'.(($view_product == 1)? '<a href="index.php?page=product&rowID='.$rma_header['productrowid'].'" class="btn2">'.$rma_header['productcode'].'</a>':'<input type="text" name="header[productcode]" value="'.$rma_header['productcode'].'">').'</p> <p>'.(($view_product == 1)? '<a href="index.php?page=product&rowID='.$rma_header['productrowid'].'" class="link-with-icon">'.$rma_header['productcode'].' <i class="fa-solid fa-up-right-from-square"></i></a>':'<input type="text" name="header[productcode]" value="'.$rma_header['productcode'].'">').'</p>
</div> </div>
<div class="order-detail"> <div class="order-detail">
<h3>'.$product_name.'</h3> <h3>'.$product_name.'</h3>
<p>'.(($view_product == 1)? '<a href="index.php?page=product&rowID='.$rma_header['productrowid'].'" class="btn2">'.(${$rma_header['productname']} ?? $rma_header['productname']).'</a>':'<input type="text" name="header[productname]" value="'.(${$rma_header['productname']} ?? $rma_header['productname']).'">').'</p> <p>'.(($view_product == 1)? '<a href="index.php?page=product&rowID='.$rma_header['productrowid'].'" class="link-with-icon">'.(${$rma_header['productname']} ?? $rma_header['productname']).' <i class="fa-solid fa-up-right-from-square"></i></a>':'<input type="text" name="header[productname]" value="'.(${$rma_header['productname']} ?? $rma_header['productname']).'">').'</p>
</div> </div>
<div class="order-detail"> <div class="order-detail">
<h3>'.$equipment_label10.'</h3> <h3>'.$equipment_label10.'</h3>

View File

@@ -260,11 +260,11 @@ $view .= ' <div class="content-block order-details">
</div> </div>
<div class="order-detail"> <div class="order-detail">
<h3>'.$product_code.'</h3> <h3>'.$product_code.'</h3>
<p>'.(($view_product == 1)? '<a href="index.php?page=product&rowID='.$rma['header']['productrowid'].'" class="btn2">'.$rma['header']['productcode'].'</a>':'<input type="text" name="header[productcode]" value="'.$rma['header']['productcode'].'">').'</p> <p>'.(($view_product == 1)? '<a href="index.php?page=product&rowID='.$rma['header']['productrowid'].'" class="link-with-icon">'.$rma['header']['productcode'].' <i class="fa-solid fa-up-right-from-square"></i></a>':'<input type="text" name="header[productcode]" value="'.$rma['header']['productcode'].'">').'</p>
</div> </div>
<div class="order-detail"> <div class="order-detail">
<h3>'.$product_name.'</h3> <h3>'.$product_name.'</h3>
<p>'.(($view_product == 1)? '<a href="index.php?page=product&rowID='.$rma['header']['productrowid'].'" class="btn2">'.(${$rma['header']['productname']} ?? $rma['header']['productname']).'</a>':'<input type="text" name="header[productname]" value="'.(${$rma['header']['productname']} ?? $rma['header']['productname']).'">').'</p> <p>'.(($view_product == 1)? '<a href="index.php?page=product&rowID='.$rma['header']['productrowid'].'" class="link-with-icon">'.(${$rma['header']['productname']} ?? $rma['header']['productname']).' <i class="fa-solid fa-up-right-from-square"></i></a>':'<input type="text" name="header[productname]" value="'.(${$rma['header']['productname']} ?? $rma['header']['productname']).'">').'</p>
</div> </div>
<div class="order-detail"> <div class="order-detail">
<h3>'.$equipment_label10.'</h3> <h3>'.$equipment_label10.'</h3>

View File

@@ -28,6 +28,9 @@ $menu_report_usage = 'Systemnutzung';
$menu_maintenance = 'Maintenance'; $menu_maintenance = 'Maintenance';
$menu_profiles = 'Profiles'; $menu_profiles = 'Profiles';
$menu_upgrades = 'Software Upgrades'; $menu_upgrades = 'Software Upgrades';
$menu_sales_licenses = 'Lizenzen';
$menu_softwaretool = 'Software-Aktualisierung';
$menu_products_software_versions = 'Software';
$tab1 = 'Allgemein'; $tab1 = 'Allgemein';
$tab2 = 'Partner'; $tab2 = 'Partner';
$tab3 = 'Protokoll'; $tab3 = 'Protokoll';
@@ -366,16 +369,15 @@ $register_3_term_consent_1 = 'Ich stimme den ';
$register_3_term_consent_2 = 'Allgemeinen Geschäftsbedingungen zu'; $register_3_term_consent_2 = 'Allgemeinen Geschäftsbedingungen zu';
$register_button = 'Registrieren'; $register_button = 'Registrieren';
$register_mandatory = 'verpflichtend'; $register_mandatory = 'verpflichtend';
$register_4_completed = '4. Registrierung abgeschlossen'; $register_4_completed = 'Registrierung abgeschlossen';
$register_5_details = '5. Registrierungsdetails'; $register_5_details = 'Registrierungsdetails';
$register_6_return = '6. Zurück zur Registrierung'; $register_6_return = 'Zurück zur Registrierung';
$register_6_button = 'Zurück'; $register_6_button = 'Zurück';
$register_message_1 = 'Seriennummer nicht erkannt, bitte wenden Sie sich an Ihren Lieferanten'; $register_message_1 = 'Seriennummer nicht erkannt, bitte wenden Sie sich an Ihren Lieferanten';
$register_message_2 = 'Produkt in Garantie oder Garantie abgelaufen. Falls dies nicht korrekt ist, wenden Sie sich bitte an Ihren Lieferanten'; $register_message_2 = 'Produkt in Garantie oder Garantie abgelaufen. Falls dies nicht korrekt ist, wenden Sie sich bitte an Ihren Lieferanten';
$register_message_3 = 'Die Garantie wurde um ein zusätzliches Jahr verlängert'; $register_message_3 = 'Die Garantie wurde um ein zusätzliches Jahr verlängert';
$register_message_4 = 'Vielen Dank für Ihre Registrierung. Sie erhalten den Link zu unserem Software-Update-Tool per E-Mail, die Sie während der Registrierung angegeben haben. $register_message_4 = 'Vielen Dank für Ihre Registrierung. Sie erhalten den Link zu unserem Software-Update-Tool per E-Mail, die Sie während der Registrierung angegeben haben.
<br><br>Falls Sie unsere E-Mail nicht erhalten, können Sie über unsere Website auf unser Software-Update-Tool zugreifen.<br><br>Gehen Sie zu Mein Login und verwenden Sie Benutzername/Passwort:';
Falls Sie unsere E-Mail nicht erhalten, können Sie über unsere Website auf unser Software-Update-Tool zugreifen. Gehen Sie zu Mein Login und verwenden Sie Benutzername/Passwort:';
$communication_h2 = 'Kommunikation'; $communication_h2 = 'Kommunikation';
$communication_p = 'Kommunikation anzeigen, verwalten und suchen.'; $communication_p = 'Kommunikation anzeigen, verwalten und suchen.';
$communication_status = 'Status'; $communication_status = 'Status';
@@ -822,5 +824,6 @@ $focus_offering_0 = 'Economy - Premium';
$focus_offering_1 = 'Premium - Highend'; $focus_offering_1 = 'Premium - Highend';
$dealer_type_0 = 'Lokal'; $dealer_type_0 = 'Lokal';
$dealer_type_1 = 'Professionell'; $dealer_type_1 = 'Professionell';
$dealer_type_2 = 'Unternehmens'; $dealer_type_2 = 'Unternehmens';$user_information_required = 'Benutzerinformationen Erforderlich';
?> $user_information_description = 'Bitte geben Sie Ihre Daten ein, um mit Software-Updates fortzufahren';
$general_continue = 'Fortfahren';?>

View File

@@ -28,6 +28,9 @@ $menu_report_usage = 'Uso del Sistema';
$menu_maintenance = 'Mantenimiento'; $menu_maintenance = 'Mantenimiento';
$menu_profiles = 'Perfiles'; $menu_profiles = 'Perfiles';
$menu_upgrades = 'Actualizaciones de Software'; $menu_upgrades = 'Actualizaciones de Software';
$menu_sales_licenses = 'Licencias';
$menu_softwaretool = 'Actualización de Software';
$menu_products_software_versions = 'Software';
$tab1 = 'General'; $tab1 = 'General';
$tab2 = 'Socios'; $tab2 = 'Socios';
$tab3 = 'Registro'; $tab3 = 'Registro';
@@ -366,16 +369,14 @@ $register_3_term_consent_1 = 'Acepto ';
$register_3_term_consent_2 = 'términos y condiciones'; $register_3_term_consent_2 = 'términos y condiciones';
$register_button = 'Registrar'; $register_button = 'Registrar';
$register_mandatory = 'obligatorio'; $register_mandatory = 'obligatorio';
$register_4_completed = '4. Registro Completado'; $register_4_completed = 'Registro Completado';
$register_5_details = '5. Detalles del Registro'; $register_5_details = 'Detalles del Registro';
$register_6_return = '6. Volver al registro'; $register_6_return = 'Volver al registro';
$register_6_button = 'Atrás'; $register_6_button = 'Atrás';
$register_message_1 = 'Número de serie no reconocido, comuníquese con su proveedor'; $register_message_1 = 'Número de serie no reconocido, comuníquese con su proveedor';
$register_message_2 = 'Producto bajo garantía o garantía expirada. Si no es correcto, comuníquese con su proveedor'; $register_message_2 = 'Producto bajo garantía o garantía expirada. Si no es correcto, comuníquese con su proveedor';
$register_message_3 = 'La garantía se extiende por 1 año adicional'; $register_message_3 = 'La garantía se extiende por 1 año adicional';
$register_message_4 = 'Gracias por su registro. Recibirá el enlace a nuestra herramienta de actualización de software a través del correo electrónico proporcionado durante el registro. $register_message_4 = 'Gracias por su registro. Recibirá el enlace a nuestra herramienta de actualización de software a través del correo electrónico proporcionado durante el registro.<br><br>En caso de que no reciba nuestro correo electrónico, puede acceder a nuestra herramienta de actualización de software a través de nuestro sitio web. <br><br>Vaya a Mi Login y utilice nombre de usuario/contraseña:';
En caso de que no reciba nuestro correo electrónico, puede acceder a nuestra herramienta de actualización de software a través de nuestro sitio web. Vaya a Mi Login y utilice nombre de usuario/contraseña:';
$communication_h2 = 'Comunicación'; $communication_h2 = 'Comunicación';
$communication_p = 'Ver, gestionar y buscar comunicación.'; $communication_p = 'Ver, gestionar y buscar comunicación.';
$communication_status = 'Estado'; $communication_status = 'Estado';
@@ -829,4 +830,7 @@ $focus_offering_1 = 'Premium - Alta gama';
$dealer_type_0 = 'Local'; $dealer_type_0 = 'Local';
$dealer_type_1 = 'Profesional'; $dealer_type_1 = 'Profesional';
$dealer_type_2 = 'Corporativo'; $dealer_type_2 = 'Corporativo';
$user_information_required = 'Información del Usuario Requerida';
$user_information_description = 'Por favor proporcione su información para continuar con las actualizaciones de software';
$general_continue = 'Continuar';
?> ?>

View File

@@ -28,6 +28,9 @@ $menu_report_usage = 'Systeemgebruik';
$menu_maintenance = 'Maintenance'; $menu_maintenance = 'Maintenance';
$menu_profiles = 'Profielen'; $menu_profiles = 'Profielen';
$menu_upgrades = 'Software Upgrades'; $menu_upgrades = 'Software Upgrades';
$menu_sales_licenses = 'Licenties';
$menu_softwaretool = 'Software Update';
$menu_products_software_versions = 'Software';
$tab1 = 'Algemeen'; $tab1 = 'Algemeen';
$tab2 = 'Hierarchy'; $tab2 = 'Hierarchy';
$tab3 = 'Log'; $tab3 = 'Log';
@@ -366,16 +369,14 @@ $register_3_term_consent_1 = 'Ik ga akkoord met de ';
$register_3_term_consent_2 = 'algemene voorwaarden'; $register_3_term_consent_2 = 'algemene voorwaarden';
$register_button = 'Registreren'; $register_button = 'Registreren';
$register_mandatory = 'verplicht'; $register_mandatory = 'verplicht';
$register_4_completed = '4. Registratie Voltooid'; $register_4_completed = 'Registratie Voltooid';
$register_5_details = '5. Registratiegegevens'; $register_5_details = 'Registratiegegevens';
$register_6_return = '6. Terug naar registratie'; $register_6_return = 'Terug naar registratie';
$register_6_button = 'Terug'; $register_6_button = 'Terug';
$register_message_1 = 'Serienummer niet herkend, neem contact op met uw leverancier'; $register_message_1 = 'Serienummer niet herkend, neem contact op met uw leverancier';
$register_message_2 = 'Product onder garantie of garantie verlopen. Neem contact op met uw leverancier als dit niet klopt'; $register_message_2 = 'Product onder garantie of garantie verlopen. Neem contact op met uw leverancier als dit niet klopt';
$register_message_3 = 'Garantie is met 1 extra jaar verlengd'; $register_message_3 = 'Garantie is met 1 extra jaar verlengd';
$register_message_4 = 'Bedankt voor uw registratie. U ontvangt de link naar onze software-update tool via de e-mail die u tijdens de registratie heeft opgegeven. $register_message_4 = 'Bedankt voor uw registratie. U ontvangt de link naar onze software-update tool via de e-mail die u tijdens de registratie heeft opgegeven. <br><br>Als u onze e-mail niet ontvangt, kunt u via onze website toegang krijgen tot onze software updatetool. <br><br>Ga naar Mijn Login en gebruik gebruikersnaam/wachtwoord:';
Als u onze e-mail niet ontvangt, kunt u via onze website toegang krijgen tot onze software updatetool. Ga naar Mijn Login en gebruik gebruikersnaam/wachtwoord:';
$communication_h2 = 'Communicatie'; $communication_h2 = 'Communicatie';
$communication_p = 'Bekijk, update, en zoek communicatie.'; $communication_p = 'Bekijk, update, en zoek communicatie.';
$communication_status = 'Status'; $communication_status = 'Status';
@@ -1035,4 +1036,7 @@ $focus_offering_1 = 'Premium - Highend';
$dealer_type_0 = 'Lokaal'; $dealer_type_0 = 'Lokaal';
$dealer_type_1 = 'Professioneel'; $dealer_type_1 = 'Professioneel';
$dealer_type_2 = 'Bedrijf'; $dealer_type_2 = 'Bedrijf';
$user_information_required = 'Gebruikersinformatie Vereist';
$user_information_description = 'Geef uw gegevens op om door te gaan met software-updates';
$general_continue = 'Doorgaan';
?> ?>

View File

@@ -28,6 +28,9 @@ $menu_report_usage = 'Użycie systemu';
$menu_maintenance = 'Konserwacja'; $menu_maintenance = 'Konserwacja';
$menu_profiles = 'Profile'; $menu_profiles = 'Profile';
$menu_upgrades = 'Aktualizacje Oprogramowania'; $menu_upgrades = 'Aktualizacje Oprogramowania';
$menu_sales_licenses = 'Licencje';
$menu_softwaretool = 'Aktualizacja Oprogramowania';
$menu_products_software_versions = 'Oprogramowanie';
$tab1 = 'Ogólne'; $tab1 = 'Ogólne';
$tab2 = 'Partnerzy'; $tab2 = 'Partnerzy';
$tab3 = 'Dziennik'; $tab3 = 'Dziennik';
@@ -373,7 +376,7 @@ $register_6_button = 'Wstecz';
$register_message_1 = 'Numer seryjny nie został rozpoznany, skontaktuj się z dostawcą'; $register_message_1 = 'Numer seryjny nie został rozpoznany, skontaktuj się z dostawcą';
$register_message_2 = 'Produkt objęty gwarancją lub gwarancja wygasła. Jeśli jest to nieprawidłowe, skontaktuj się z dostawcą'; $register_message_2 = 'Produkt objęty gwarancją lub gwarancja wygasła. Jeśli jest to nieprawidłowe, skontaktuj się z dostawcą';
$register_message_3 = 'Gwarancja przedłużona o 1 dodatkowy rok'; $register_message_3 = 'Gwarancja przedłużona o 1 dodatkowy rok';
$register_message_4 = 'Dziękujemy za rejestrację. Otrzymasz link do naszego narzędzia aktualizacji oprogramowania na adres e-mail podany podczas rejestracji. W przypadku nieotrzymania naszego e-maila możesz uzyskać dostęp do naszego narzędzia aktualizacji oprogramowania przez naszą stronę internetową. Przejdź do Moje logowanie i użyj nazwy użytkownika/hasła:'; $register_message_4 = 'Dziękujemy za rejestrację. Otrzymasz link do naszego narzędzia aktualizacji oprogramowania na adres e-mail podany podczas rejestracji. <br><br>W przypadku nieotrzymania naszego e-maila możesz uzyskać dostęp do naszego narzędzia aktualizacji oprogramowania przez naszą stronę internetową. <br><br>Przejdź do Moje logowanie i użyj nazwy użytkownika/hasła:';
$communication_h2 = 'Komunikacja'; $communication_h2 = 'Komunikacja';
$communication_p = 'Przeglądaj, zarządzaj i wyszukuj komunikację.'; $communication_p = 'Przeglądaj, zarządzaj i wyszukuj komunikację.';
$communication_status = 'Status'; $communication_status = 'Status';
@@ -761,4 +764,7 @@ $general_currency_1 = '$';
$general_currency_0 = '€'; $general_currency_0 = '€';
$general_modifier_0 = '-'; $general_modifier_0 = '-';
$general_modifier_1 = '+'; $general_modifier_1 = '+';
$user_information_required = 'Wymagane Informacje o Użytkowniku';
$user_information_description = 'Podaj swoje dane, aby kontynuować aktualizacje oprogramowania';
$general_continue = 'Kontynuuj';
?> ?>

View File

@@ -28,6 +28,9 @@ $menu_report_usage = 'Uso do Sistema';
$menu_maintenance = 'Manutenção'; $menu_maintenance = 'Manutenção';
$menu_profiles = 'Perfis'; $menu_profiles = 'Perfis';
$menu_upgrades = 'Atualizações de Software'; $menu_upgrades = 'Atualizações de Software';
$menu_sales_licenses = 'Licenças';
$menu_softwaretool = 'Atualização de Software';
$menu_products_software_versions = 'Software';
$tab1 = 'Geral'; $tab1 = 'Geral';
$tab2 = 'Parceiros'; $tab2 = 'Parceiros';
$tab3 = 'Registro'; $tab3 = 'Registro';
@@ -366,16 +369,14 @@ $register_3_term_consent_1 = 'Eu concordo com ';
$register_3_term_consent_2 = 'termos e condições'; $register_3_term_consent_2 = 'termos e condições';
$register_button = 'Registrar'; $register_button = 'Registrar';
$register_mandatory = 'obrigatório'; $register_mandatory = 'obrigatório';
$register_4_completed = '4. Registro Concluído'; $register_4_completed = 'Registro Concluído';
$register_5_details = '5. Detalhes do Registro'; $register_5_details = 'Detalhes do Registro';
$register_6_return = '6. Retornar ao registro'; $register_6_return = 'Retornar ao registro';
$register_6_button = 'Voltar'; $register_6_button = 'Voltar';
$register_message_1 = 'Número de série não reconhecido, entre em contato com seu fornecedor'; $register_message_1 = 'Número de série não reconhecido, entre em contato com seu fornecedor';
$register_message_2 = 'Produto sob garantia ou garantia expirada. Se não estiver correto, entre em contato com seu fornecedor'; $register_message_2 = 'Produto sob garantia ou garantia expirada. Se não estiver correto, entre em contato com seu fornecedor';
$register_message_3 = 'Garantia é estendida por 1 ano adicional'; $register_message_3 = 'Garantia é estendida por 1 ano adicional';
$register_message_4 = 'Obrigado pelo seu registro. Você receberá o link para nossa ferramenta de atualização de software pelo e-mail fornecido durante o registro. $register_message_4 = 'Obrigado pelo seu registro. Você receberá o link para nossa ferramenta de atualização de software pelo e-mail fornecido durante o registro.<br><br>Caso não receba o nosso e-mail, pode aceder à nossa ferramenta de atualização de software através do nosso website. <br><br>Vá para Meu Login e utilize o nome de utilizador/palavra-passe:';
Caso não receba o nosso e-mail, pode aceder à nossa ferramenta de atualização de software através do nosso website. Vá para Meu Login e utilize o nome de utilizador/palavra-passe:';
$communication_h2 = 'Comunicação'; $communication_h2 = 'Comunicação';
$communication_p = 'Ver, gerenciar e buscar comunicação.'; $communication_p = 'Ver, gerenciar e buscar comunicação.';
$communication_status = 'Status'; $communication_status = 'Status';
@@ -829,4 +830,7 @@ $focus_offering_1 = 'Premium - Alta gama';
$dealer_type_0 = 'Local'; $dealer_type_0 = 'Local';
$dealer_type_1 = 'Profissional'; $dealer_type_1 = 'Profissional';
$dealer_type_2 = 'Corporativo'; $dealer_type_2 = 'Corporativo';
$user_information_required = 'Informações do Usuário Obrigatórias';
$user_information_description = 'Por favor, forneça suas informações para continuar com as atualizações de software';
$general_continue = 'Continuar';
?> ?>

View File

@@ -29,6 +29,9 @@ $menu_report_usage = 'System usage';
$menu_maintenance = 'Maintenance'; $menu_maintenance = 'Maintenance';
$menu_profiles = 'Profiles'; $menu_profiles = 'Profiles';
$menu_upgrades = 'Software Upgrades'; $menu_upgrades = 'Software Upgrades';
$menu_sales_licenses = 'Licenses';
$menu_softwaretool = 'Software Update';
$menu_products_software_versions = 'Software';
$tab1 = 'General'; $tab1 = 'General';
$tab2 = 'Partners'; $tab2 = 'Partners';
$tab3 = 'Log'; $tab3 = 'Log';
@@ -375,16 +378,14 @@ $register_3_term_consent_1 = 'I agree with ';
$register_3_term_consent_2 = 'terms and conditions'; $register_3_term_consent_2 = 'terms and conditions';
$register_button = 'Register'; $register_button = 'Register';
$register_mandatory = 'mandatory'; $register_mandatory = 'mandatory';
$register_4_completed = '4. Registration Completed'; $register_4_completed = 'Registration Completed';
$register_5_details = '5. Registration details'; $register_5_details = 'Registration details';
$register_6_return = '6. Return to registration'; $register_6_return = 'Return to registration';
$register_6_button = 'Back'; $register_6_button = 'Back';
$register_message_1 = 'Serialnumber not recognized, please contact your supplier'; $register_message_1 = 'Serialnumber not recognized, please contact your supplier';
$register_message_2 = 'Product under warranty or warranty expired. If not correct please contact your supplier'; $register_message_2 = 'Product under warranty or warranty expired. If not correct please contact your supplier';
$register_message_3 = 'Warranty is extended with 1 additional year'; $register_message_3 = 'Warranty is extended with 1 additional year';
$register_message_4 = 'Thank you for your registration. You will receive the link to our software update tool via the mail provided during the registration. $register_message_4 = 'Thank you for your registration. You will receive the link to our software update tool via the mail provided during the registration.<br><br>In case you do not receive our email you can access our software update tool via our website. <br><br>Go to My Login and use username/password:';
In case you do not receive our email you can access our software update tool via our website. Go to My Login and use username/password:';
$communication_h2 = 'Communication'; $communication_h2 = 'Communication';
$communication_p = 'View, manage, and search communication.'; $communication_p = 'View, manage, and search communication.';
$communication_status = 'Status'; $communication_status = 'Status';
@@ -1049,4 +1050,7 @@ $focus_offering_1 = 'Premium - Highend';
$dealer_type_0 = 'Local'; $dealer_type_0 = 'Local';
$dealer_type_1 = 'Professional'; $dealer_type_1 = 'Professional';
$dealer_type_2 = 'Corporate'; $dealer_type_2 = 'Corporate';
$user_information_required = 'User Information Required';
$user_information_description = 'Please provide your information to continue with software updates';
$general_continue = 'Continue';
?> ?>

View File

@@ -203,9 +203,11 @@ $view .= '<div class="content-block">
<p id="checkingMessage" style="margin: 0; font-size: 16px;">'.$softwaretool_checking.'</p> <p id="checkingMessage" style="margin: 0; font-size: 16px;">'.$softwaretool_checking.'</p>
</div> </div>
<div id="softwareOptions" style="margin-top: 20px; display:none;"> <div id="softwareOptionsContainer" style="margin-top: 20px; display:none; position: relative;">
<h3 style="margin-bottom: 20px; color: #333;">'.$softwaretool_select_upgrade.'</h3> <div id="softwareOptions" style="filter: blur(8px); pointer-events: none; opacity: 0.3; transition: all 0.3s ease;">
<div id="softwareOptionsGrid" style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 20px; justify-content: center; max-width: 1200px; margin: 0 auto;"> <h3 style="margin-bottom: 20px; color: #333;">'.$softwaretool_select_upgrade.'</h3>
<div id="softwareOptionsGrid" style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 20px; justify-content: center; max-width: 1200px; margin: 0 auto;">
</div>
</div> </div>
</div> </div>
@@ -274,6 +276,18 @@ echo '
var MOLLIE_ENABLED = '.(mollie_enabled ? 'true' : 'false').'; var MOLLIE_ENABLED = '.(mollie_enabled ? 'true' : 'false').';
var PAYPAL_ENABLED = '.(paypal_enabled ? 'true' : 'false').'; var PAYPAL_ENABLED = '.(paypal_enabled ? 'true' : 'false').';
var PAY_ON_DELIVERY_ENABLED = '.(pay_on_delivery_enabled ? 'true' : 'false').'; var PAY_ON_DELIVERY_ENABLED = '.(pay_on_delivery_enabled ? 'true' : 'false').';
// Translation variables
var TRANS_NAME = "'.($account_name ?? 'Name').'";
var TRANS_EMAIL = "'.($account_email ?? 'Email').'";
var TRANS_ADDRESS = "'.($shipping_address ?? 'Address').'";
var TRANS_CITY = "'.($shipping_city ?? 'City').'";
var TRANS_POSTAL = "'.($shipping_zip ?? 'Postal Code').'";
var TRANS_COUNTRY = "'.($shipping_country ?? 'Country').'";
var TRANS_USER_INFO_REQUIRED = "'.($user_information_required ?? 'User Information Required').'";
var TRANS_USER_INFO_DESCRIPTION = "'.($user_information_description ?? 'Please provide your information to continue with software updates').'";
var TRANS_CONTINUE = "'.($general_continue ?? 'Continue').'";
var port, textEncoder, writableStreamClosed, writer, historyIndex = -1; var port, textEncoder, writableStreamClosed, writer, historyIndex = -1;
const lineHistory = []; const lineHistory = [];

View File

@@ -1062,43 +1062,6 @@ main .manage-order-table .delete-item:hover {
color: #e26060; color: #e26060;
} }
.table table tbody .status {
padding: 6px 12px;
border-radius: 6px;
background-color: #10b981;
font-weight: 500;
font-size: 12px;
color: var(--color-white);
display: inline-block;
text-align: center;
min-width: 60px;
}
.table table tbody .status.enabled {
padding: 6px 12px;
border-radius: 6px;
background-color: #10b981;
font-weight: 500;
font-size: 12px;
color: var(--color-white);
display: inline-block;
text-align: center;
min-width: 60px;
}
.table table tbody .status.disabled {
padding: 6px 12px;
border-radius: 6px;
background-color: #ef4444;
font-weight: 500;
font-size: 12px;
color: var(--color-white);
display: inline-block;
text-align: center;
min-width: 60px;
}
.status { .status {
padding: 3px 6px; padding: 3px 6px;
border-radius: 4px; border-radius: 4px;
@@ -1335,6 +1298,24 @@ background-color: var(--color-indicator-1);
font-style: italic; font-style: italic;
} }
.link-with-icon {
text-decoration: none;
color: var(--color-green);
font-weight: 500;
transition: color 0.2s ease;
}
.link-with-icon:hover {
color: var(--color-dark-green);
text-decoration: underline;
}
.link-with-icon i {
font-size: 0.75em;
margin-left: 4px;
opacity: 0.7;
}
.btn_link { .btn_link {
display: inline-flex; display: inline-flex;
align-items: center; align-items: center;
@@ -3128,4 +3109,128 @@ main .content-block .button-container {
align-items: center; align-items: center;
padding: 20px; padding: 20px;
border-top: 1px solid #eee; border-top: 1px solid #eee;
} }
/* Registration Modal Styles */
.reg-modal {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
z-index: 1000;
align-items: center;
justify-content: center;
}
.reg-modal-content {
background: white;
border-radius: 12px;
max-width: 600px;
width: 90%;
max-height: 90vh;
overflow-y: auto;
margin: 20px;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4);
}
.reg-modal-header {
padding: 25px;
border-bottom: 2px solid #e0e0e0;
display: flex;
justify-content: space-between;
align-items: center;
}
.reg-modal-header h3 {
margin: 0;
color: #333;
}
.reg-modal-close {
background: transparent;
border: none;
font-size: 24px;
cursor: pointer;
color: #666;
}
.reg-tabs {
border-bottom: 1px solid #e0e0e0;
}
.reg-tab-link {
padding: 15px 25px;
display: inline-block;
text-decoration: none;
color: #666;
border-bottom: 2px solid transparent;
transition: all 0.3s;
}
.reg-tab-link.active {
border-bottom: 2px solid #04AA6D;
color: #04AA6D;
}
.reg-tab-content {
padding: 25px;
}
.reg-fields {
display: flex;
flex-direction: column;
gap: 15px;
}
.reg-field-group {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 15px;
}
.reg-field label {
display: block;
margin-bottom: 5px;
color: #666;
font-size: 12px;
font-weight: 600;
text-transform: uppercase;
}
.reg-field p {
margin: 0;
padding: 10px;
background: #f8f9fa;
border-radius: 6px;
color: #333;
}
.reg-field-email {
color: #04AA6D;
cursor: pointer;
transition: background 0.2s;
}
.reg-field-email:hover {
background: #e9ecef;
}
.reg-empty-state {
text-align: center;
padding: 40px 20px;
color: #999;
}
.reg-empty-state i {
font-size: 48px;
margin-bottom: 15px;
opacity: 0.3;
}
.reg-empty-state p {
margin: 0;
}

View File

@@ -80,9 +80,20 @@ body {
top: 20px; top: 20px;
right: 20px; right: 20px;
text-decoration: none; text-decoration: none;
margin-left: auto;
padding: 8px 16px;
background-color: transparent;
color: var(--text-color); color: var(--text-color);
border: 1px solid var(--text-color);
border-radius: 4px;
font-size: 12px;
transition: all 0.3s ease;
}
.register-link:hover {
background-color: var(--text-color);
color: var(--color-white);
} }
.header { .header {
margin-bottom: 30px; margin-bottom: 30px;
} }