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
$clause .= ' AND (h.rowID like :'.$v[0].' OR h.createdby like :'.$v[0].')';
}
elseif ($v[0] == 'type' && $v[1] == 'servicereport') {
elseif ($v[0] == 'serialnumber') {
//build up serialnumber
//check if multiple serialnumbers are provided
if (str_contains($v[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') {
//build up search

View File

@@ -24,7 +24,11 @@ function checkSerial($serialinput){
}
//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'])) {
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++
@@ -149,6 +153,11 @@ if (isset($post_content['sn']) && isset($post_content['payload'])){
$sn_service = $post_content['sn_service'];
break;
case 'customer': //update from Portal
$historytype = 'Customer';
$equipmentUpdate = 1;
break;
default:
$historytype = 'Other';
break;

View File

@@ -1755,7 +1755,7 @@ function warrantyStatus($input){
if (!empty($input) && $input < $warrantydate){
$warranty_date_due = '<span class="status warranty_outdated">'.$warranty_outdated_text.'</span>';
} 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;
@@ -1788,7 +1788,7 @@ function serviceStatus($input){
if (!empty($input) && $input < $servicedate){
$service_date_due = '<span class="status service_renewal">'.$service_renewal_text.'</span>';
} 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;
@@ -1815,7 +1815,7 @@ function availableFirmware($sw_version,$sw_version_latest){
switch ($sw_version_latest) {
case 1:
$message = '<span class="status firmware_recent">'.$firmware_recent_text.'</span>';
$message = '<span class="">'.$firmware_recent_text.'</span>';
break;
case 0:
@@ -1823,7 +1823,7 @@ function availableFirmware($sw_version,$sw_version_latest){
break;
default:
$message ='<span class="status">✓</span>';
$message ='<span class="">✓</span>';
break;
}

View File

@@ -73,7 +73,7 @@ async function connectDeviceForSoftware() {
readBar.innerHTML = '';
serialResultsDiv.innerHTML = '';
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("uploadSection").style.display = "none";
@@ -443,12 +443,15 @@ async function fetchSoftwareOptions() {
return;
}
// Display options in table
// Display options in table (blurred initially)
displaySoftwareOptions(options);
document.getElementById("softwareCheckStatus").style.display = "none";
document.getElementById("softwareOptions").style.display = "block";
document.getElementById("softwareOptionsContainer").style.display = "block";
progressBar("100", "Software options loaded", "#04AA6D");
// Show user info modal immediately
showUserInfoModal();
} catch (error) {
await logCommunication(`Software options error: ${error.message}`, 'error');
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) {
const price = parseFloat(option.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) {
showPaymentModal(option);
return;
}
// Free upgrade - show confirmation modal first
// Free upgrade - proceed directly with saved customer data
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) {
@@ -699,22 +873,22 @@ function showFreeInstallModal(option) {
<form id="freeInstallForm" style="display: flex; flex-direction: column; gap: 15px;">
<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;">
</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;">
</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="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;">
<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="country" id="freeInstallCountry" required placeholder="Country" 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="${typeof TRANS_COUNTRY !== 'undefined' ? TRANS_COUNTRY : 'Country'}" style="padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px;">
</div>
</div>
@@ -837,22 +1011,22 @@ function showPaymentModal(option) {
<form id="paymentForm" style="display: flex; flex-direction: column; gap: 15px;">
<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;">
</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;">
</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="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;">
<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="country" id="paymentCountry" required placeholder="Country" 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="${typeof TRANS_COUNTRY !== 'undefined' ? TRANS_COUNTRY : 'Country'}" style="padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px;">
</div>
</div>

View File

@@ -309,7 +309,7 @@ $view .= '<div class="content-block">
<tbody>';
//Check for assigned 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 .= '
</tbody>

View File

@@ -60,6 +60,28 @@ $equipment_data = ioServer($api_url,'');
//Decode Payload
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
$api_url = '/v1/products_software/productrowid='.$responses->productrowid.'&status=1';
$products_software = ioServer($api_url,'');
@@ -163,7 +185,7 @@ $view .= ' <div class="content-block order-details">
</div>
<div class="order-detail">
<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 class="order-detail">
<h3>'.$equipment_label2.'</h3>
@@ -175,11 +197,11 @@ $view .= ' <div class="content-block order-details">
</div>
<div class="order-detail">
<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 class="order-detail">
<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>';
if (!empty($media_responses['full_path'])){
$view .='
@@ -217,6 +239,9 @@ $view .='<div class="content-block order-details">
<h3>'.$general_section.'</h3>
<p>'.$section.'</p>
</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>';
$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;">
<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><span class="status '.(($data->healthindex >= 85) ?'enabled' : (($data->healthindex <= 50)? 'disabled' : 'id2')).'.">'.$data->healthindex.'</span></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=" '.(($data->healthindex >= 85) ?'' : (($data->healthindex <= 50)? 'status disabled' : 'id2')).'.">'.$data->healthindex.'</span></td>
</tr>';
}
$view .= '
@@ -450,6 +475,227 @@ $view .='</div>';
//OUTPUT
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()
?>

View File

@@ -140,7 +140,7 @@ echo'
<div class="login-container">
<div class="login-form">
<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)
{

View File

@@ -183,11 +183,11 @@ $view .= ' <div class="content-block order-details">
</div>
<div class="order-detail">
<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 class="order-detail">
<h3>'.$product_parttype.'</h3>
<p><span class="status id'.$responses->parttype.'">'.$$parttype_text.'</span></p>
<p><span class="">'.$$parttype_text.'</span></p>
</div>
<div class="order-detail">
<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;">
<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>'.(!empty($version->config) ? ($general_yes ?? 'Y') : ($general_no ?? 'N')).'</td>
</tr>';

View File

@@ -59,12 +59,11 @@ if ($_SERVER['REQUEST_METHOD'] == 'POST') {
if ($uploaded_file != '' || !empty($uploaded_file)) {
$extension = strtolower(pathinfo($uploaded_file, PATHINFO_EXTENSION));
$target_dir = dirname(__FILE__) . "/firmware/";
$firmware_name = pathinfo($_FILES["fileToUpload"]["name"], PATHINFO_FILENAME);
if ($extension == 'hex') {
//READ FILE
$contents = file_get_contents($_FILES["fileToUpload"]["tmp_name"]);
//firmwarename
$firmware_name = pathinfo($_FILES["fileToUpload"]["name"], PATHINFO_FILENAME);
$commitCode = compareCommitCodes($firmware_name, "");
//IF COMMITCODE IS EMPTY THEN RETURN HEX_FW
@@ -76,6 +75,18 @@ if ($_SERVER['REQUEST_METHOD'] == 'POST') {
file_put_contents($input_file, $contents);
$_POST['file_path'] = $firmware_name . '.HEX';
$_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 {
$target_file = $target_dir . $uploaded_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>
<span id="uploadBtnText">Choose File</span>
</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>
</div>
<label for="file_path">File Path</label>

View File

@@ -10,8 +10,13 @@ $lang = in_array($lang, $supportedLanguages) ? $lang : 'US';
//INCLUDE THE TRANSLATION
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
$display ='';
$register = [
'sn' => '',
'organization' => '',
@@ -50,7 +55,6 @@ if (isset($_POST['register'])){
$message_return = ioServer('/v1/application/register', $payload);
if (!empty($message_return)){
$message_return = decode_payload($message_return);
$display = 'display:none;';
}
else{
$message_return = '400';
@@ -58,264 +62,589 @@ if (isset($_POST['register'])){
}
}
echo '
<!DOCTYPE html>
<html>
<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">
<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>
:root {
--color-white: #FFFFFF;
--color-light-green: #2FAC66;
--color-green: #005655c2;
--color-red: #a75151;
--text-color: #333333;
--error-background: #f3c3c3;
}
* {
padding: 0;
margin: 0;
box-sizing: border-box;
font-family: -apple-system, BlinkMacSystemFont, "segoe ui", roboto, oxygen, ubuntu, cantarell, "fira sans", "droid sans", "helvetica neue", Arial, sans-serif;
font-size: 16px;
font-family: "Open Sans", Helvetica, sans-serif;
accent-color: var(--color-green);
}
body {
position: relative;
min-height: 100%;
color: #555555;
background-color: #FFFFFF;
margin: 0;
padding-bottom: 100px;
/* Same height as footer */
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
background-color: var(--color-white);
padding: 20px;
}
h1, h2, h3, h4, h5 {
color: #fff;
.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 {
width: 1050px;
margin: 0 auto;
display: flex;
flex: 1;
overflow: hidden;
}
header {
.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;
border-bottom: 1px solid #EEEEEE;
overflow-y: auto;
}
header .content-wrapper {
.login-visual {
width: 55%;
position: relative;
overflow-y: auto;
padding: 40px;
display: flex;
flex-direction: column;
justify-content: flex-start;
}
.header {
flex: 1;
}
main .myaccount h1 {
display: block;
font-weight: normal;
color: #fff;
.header h1 {
font-size: 24px;
margin: 0;
padding: 40px 0;
font-size: 50px;
text-align: center;
width: 100%;
color: var(--text-color);
}
main .myaccount {
display: flex;
flex-flow: wrap;
}
main .myaccount form {
width: 100%;
}
main .myaccount h2 {
width: 100%;
font-weight: normal;
font-size: 20px;
padding: 30px 0 20px 0;
margin: 0 0 10px 0;
border-bottom: 1px solid #EEEEEE;
}
main .myaccount .login-register {
display: flex;
width: 100%;
justify-content: space-between;
margin-top: 40px;
}
main .myaccount .login-register h1 {
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 {
.back-to-login {
margin-left: auto;
padding: 8px 16px;
background-color: transparent;
color: var(--text-color);
text-decoration: none;
background: #03337a;
border: 0;
color: #FFFFFF;
padding: 11px 16px;
font-size: 14px;
font-weight: 500;
border: 1px solid var(--text-color);
border-radius: 4px;
cursor: pointer;
font-size: 14px;
transition: all 0.3s ease;
}
.btn:hover {
background: #444954;
.back-to-login:hover {
background-color: var(--text-color);
color: var(--color-white);
}
.btn:disabled {
background: #ddd;
.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;
padding: 20px 0 10px 0;
margin-bottom: 6px;
color: #333;
font-size: 13px;
font-weight: 500;
}
.form-field {
width: 100%;
padding: 10px;
border: 1px solid #d5d5d5;
border: 1px solid #ddd;
border-radius: 4px;
margin-bottom: 12px;
background-color: #fff;
font-size: 14px;
}
footer {
position: absolute;
padding: 20px 0;
width: 100%;
}
footer a {
.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;
color: #555555;
display: inline-block;
font-size: 14px;
font-weight: 500;
}
footer a:hover {
text-decoration: underline;
.btn:hover {
background-color: var(--color-green);
}
/* Responsive CSS below */
@media screen and (max-width: 1050px) {
.rhide {
small {
color: #666;
font-size: 12px;
}
input[type="checkbox"] {
margin-right: 8px;
}
.sn-fields-container {
margin-bottom: 15px;
}
.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;
}
.content-wrapper {
position: fixed;
top: 0;
left: 0;
width: 100%;
padding: 0 10px;
height: 100%;
background: rgba(0,0,0,0.5);
z-index: 1000;
align-items: center;
justify-content: center;
}
main .checkout form, main .myaccount form {
.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 {
flex-direction: column;
}
.login-form, .login-visual {
width: 100%;
height: auto;
}
main .myaccount .login-register {
flex-flow: column;
.login-visual {
min-height: 400px;
}
main .myaccount .login-register .login {
border-right: 0;
padding: 10px;
.trademark, .language-selector {
position: static;
text-align: center;
margin: 20px 0;
}
main .myaccount .login-register .register {
padding: 10px;
}
main .myaccount .menu {
width: 100%;
padding-right: 0;
@media screen and (max-width: 480px) {
.login-form, .login-visual {
padding: 20px;
}
.header h1 {
font-size: 20px;
}
.right-registration {
padding: 20px;
}
}
</style>
</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);
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>
<body>
';
//Register view
echo'
<div class="login-container">
<div class="top-header">
<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="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">
<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>
<br>
<small>* '.$register_mandatory.'</small>
</div>';
</div>
</div>
</div>
//IF MESSAGES ARE RETURN SHOW THEM
<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 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>
';
}
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>
</main>
<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>
<script>
function addField(id, name) {
var x = document.createElement("INPUT");
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 closeModal() {
document.getElementById("successModal").style.display = "none";
}
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>
</html>
';

View File

@@ -103,11 +103,11 @@ $view .= ' <div class="content-block order-details">
<div class="order-detail">
<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 class="order-detail">
<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 class="order-detail">
<h3>'.$equipment_label10.'</h3>

View File

@@ -260,11 +260,11 @@ $view .= ' <div class="content-block order-details">
</div>
<div class="order-detail">
<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 class="order-detail">
<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 class="order-detail">
<h3>'.$equipment_label10.'</h3>

View File

@@ -28,6 +28,9 @@ $menu_report_usage = 'Systemnutzung';
$menu_maintenance = 'Maintenance';
$menu_profiles = 'Profiles';
$menu_upgrades = 'Software Upgrades';
$menu_sales_licenses = 'Lizenzen';
$menu_softwaretool = 'Software-Aktualisierung';
$menu_products_software_versions = 'Software';
$tab1 = 'Allgemein';
$tab2 = 'Partner';
$tab3 = 'Protokoll';
@@ -366,16 +369,15 @@ $register_3_term_consent_1 = 'Ich stimme den ';
$register_3_term_consent_2 = 'Allgemeinen Geschäftsbedingungen zu';
$register_button = 'Registrieren';
$register_mandatory = 'verpflichtend';
$register_4_completed = '4. Registrierung abgeschlossen';
$register_5_details = '5. Registrierungsdetails';
$register_6_return = '6. Zurück zur Registrierung';
$register_4_completed = 'Registrierung abgeschlossen';
$register_5_details = 'Registrierungsdetails';
$register_6_return = 'Zurück zur Registrierung';
$register_6_button = 'Zurück';
$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_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.
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:';
<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:';
$communication_h2 = 'Kommunikation';
$communication_p = 'Kommunikation anzeigen, verwalten und suchen.';
$communication_status = 'Status';
@@ -822,5 +824,6 @@ $focus_offering_0 = 'Economy - Premium';
$focus_offering_1 = 'Premium - Highend';
$dealer_type_0 = 'Lokal';
$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_profiles = 'Perfiles';
$menu_upgrades = 'Actualizaciones de Software';
$menu_sales_licenses = 'Licencias';
$menu_softwaretool = 'Actualización de Software';
$menu_products_software_versions = 'Software';
$tab1 = 'General';
$tab2 = 'Socios';
$tab3 = 'Registro';
@@ -366,16 +369,14 @@ $register_3_term_consent_1 = 'Acepto ';
$register_3_term_consent_2 = 'términos y condiciones';
$register_button = 'Registrar';
$register_mandatory = 'obligatorio';
$register_4_completed = '4. Registro Completado';
$register_5_details = '5. Detalles del Registro';
$register_6_return = '6. Volver al registro';
$register_4_completed = 'Registro Completado';
$register_5_details = 'Detalles del Registro';
$register_6_return = 'Volver al registro';
$register_6_button = 'Atrás';
$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_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.
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:';
$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:';
$communication_h2 = 'Comunicación';
$communication_p = 'Ver, gestionar y buscar comunicación.';
$communication_status = 'Estado';
@@ -829,4 +830,7 @@ $focus_offering_1 = 'Premium - Alta gama';
$dealer_type_0 = 'Local';
$dealer_type_1 = 'Profesional';
$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_profiles = 'Profielen';
$menu_upgrades = 'Software Upgrades';
$menu_sales_licenses = 'Licenties';
$menu_softwaretool = 'Software Update';
$menu_products_software_versions = 'Software';
$tab1 = 'Algemeen';
$tab2 = 'Hierarchy';
$tab3 = 'Log';
@@ -366,16 +369,14 @@ $register_3_term_consent_1 = 'Ik ga akkoord met de ';
$register_3_term_consent_2 = 'algemene voorwaarden';
$register_button = 'Registreren';
$register_mandatory = 'verplicht';
$register_4_completed = '4. Registratie Voltooid';
$register_5_details = '5. Registratiegegevens';
$register_6_return = '6. Terug naar registratie';
$register_4_completed = 'Registratie Voltooid';
$register_5_details = 'Registratiegegevens';
$register_6_return = 'Terug naar registratie';
$register_6_button = 'Terug';
$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_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.
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:';
$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:';
$communication_h2 = 'Communicatie';
$communication_p = 'Bekijk, update, en zoek communicatie.';
$communication_status = 'Status';
@@ -1035,4 +1036,7 @@ $focus_offering_1 = 'Premium - Highend';
$dealer_type_0 = 'Lokaal';
$dealer_type_1 = 'Professioneel';
$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_profiles = 'Profile';
$menu_upgrades = 'Aktualizacje Oprogramowania';
$menu_sales_licenses = 'Licencje';
$menu_softwaretool = 'Aktualizacja Oprogramowania';
$menu_products_software_versions = 'Oprogramowanie';
$tab1 = 'Ogólne';
$tab2 = 'Partnerzy';
$tab3 = 'Dziennik';
@@ -373,7 +376,7 @@ $register_6_button = 'Wstecz';
$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_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_p = 'Przeglądaj, zarządzaj i wyszukuj komunikację.';
$communication_status = 'Status';
@@ -761,4 +764,7 @@ $general_currency_1 = '$';
$general_currency_0 = '€';
$general_modifier_0 = '-';
$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_profiles = 'Perfis';
$menu_upgrades = 'Atualizações de Software';
$menu_sales_licenses = 'Licenças';
$menu_softwaretool = 'Atualização de Software';
$menu_products_software_versions = 'Software';
$tab1 = 'Geral';
$tab2 = 'Parceiros';
$tab3 = 'Registro';
@@ -366,16 +369,14 @@ $register_3_term_consent_1 = 'Eu concordo com ';
$register_3_term_consent_2 = 'termos e condições';
$register_button = 'Registrar';
$register_mandatory = 'obrigatório';
$register_4_completed = '4. Registro Concluído';
$register_5_details = '5. Detalhes do Registro';
$register_6_return = '6. Retornar ao registro';
$register_4_completed = 'Registro Concluído';
$register_5_details = 'Detalhes do Registro';
$register_6_return = 'Retornar ao registro';
$register_6_button = 'Voltar';
$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_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.
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:';
$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:';
$communication_h2 = 'Comunicação';
$communication_p = 'Ver, gerenciar e buscar comunicação.';
$communication_status = 'Status';
@@ -829,4 +830,7 @@ $focus_offering_1 = 'Premium - Alta gama';
$dealer_type_0 = 'Local';
$dealer_type_1 = 'Profissional';
$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_profiles = 'Profiles';
$menu_upgrades = 'Software Upgrades';
$menu_sales_licenses = 'Licenses';
$menu_softwaretool = 'Software Update';
$menu_products_software_versions = 'Software';
$tab1 = 'General';
$tab2 = 'Partners';
$tab3 = 'Log';
@@ -375,16 +378,14 @@ $register_3_term_consent_1 = 'I agree with ';
$register_3_term_consent_2 = 'terms and conditions';
$register_button = 'Register';
$register_mandatory = 'mandatory';
$register_4_completed = '4. Registration Completed';
$register_5_details = '5. Registration details';
$register_6_return = '6. Return to registration';
$register_4_completed = 'Registration Completed';
$register_5_details = 'Registration details';
$register_6_return = 'Return to registration';
$register_6_button = 'Back';
$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_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.
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:';
$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:';
$communication_h2 = 'Communication';
$communication_p = 'View, manage, and search communication.';
$communication_status = 'Status';
@@ -1049,4 +1050,7 @@ $focus_offering_1 = 'Premium - Highend';
$dealer_type_0 = 'Local';
$dealer_type_1 = 'Professional';
$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,11 +203,13 @@ $view .= '<div class="content-block">
<p id="checkingMessage" style="margin: 0; font-size: 16px;">'.$softwaretool_checking.'</p>
</div>
<div id="softwareOptions" style="margin-top: 20px; display:none;">
<div id="softwareOptionsContainer" style="margin-top: 20px; display:none; position: relative;">
<div id="softwareOptions" style="filter: blur(8px); pointer-events: none; opacity: 0.3; transition: all 0.3s ease;">
<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 id="noUpdatesMessage" style="margin: 20px 0; padding: 30px; background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%); border-radius: 3px; text-align: center; display:none; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);">
<i class="fa-solid fa-check-circle" style="font-size: 48px; margin-bottom: 15px; color: #28a745;"></i>
@@ -274,6 +276,18 @@ echo '
var MOLLIE_ENABLED = '.(mollie_enabled ? 'true' : 'false').';
var PAYPAL_ENABLED = '.(paypal_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;
const lineHistory = [];

View File

@@ -1062,43 +1062,6 @@ main .manage-order-table .delete-item:hover {
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 {
padding: 3px 6px;
border-radius: 4px;
@@ -1335,6 +1298,24 @@ background-color: var(--color-indicator-1);
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 {
display: inline-flex;
align-items: center;
@@ -3129,3 +3110,127 @@ main .content-block .button-container {
padding: 20px;
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;
right: 20px;
text-decoration: none;
margin-left: auto;
padding: 8px 16px;
background-color: transparent;
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 {
margin-bottom: 30px;
}