annotation color and clone templates
This commit is contained in:
parent
f3e5cb4ffd
commit
cbd0c5b68a
@ -22,6 +22,8 @@ $(document).ready(function () {
|
|||||||
let partsListData = [];
|
let partsListData = [];
|
||||||
// DIMENSIONE GLOBALE MARKER
|
// DIMENSIONE GLOBALE MARKER
|
||||||
let globalMarkerSize = 16;
|
let globalMarkerSize = 16;
|
||||||
|
// COLORE TESTO LISTA DESCRIZIONI
|
||||||
|
let globalDescriptionColor = "#000000";
|
||||||
|
|
||||||
// ===================
|
// ===================
|
||||||
// MODAL INITIALIZATION
|
// MODAL INITIALIZATION
|
||||||
@ -138,6 +140,7 @@ $(document).ready(function () {
|
|||||||
descriptionTextbox = null;
|
descriptionTextbox = null;
|
||||||
markerObjects = {};
|
markerObjects = {};
|
||||||
globalMarkerSize = 16;
|
globalMarkerSize = 16;
|
||||||
|
globalDescriptionColor = "#000000";
|
||||||
$("#photoSelectorContainerAnnotations").empty().hide();
|
$("#photoSelectorContainerAnnotations").empty().hide();
|
||||||
$("#samplePhotoAnnotations").attr("src", "");
|
$("#samplePhotoAnnotations").attr("src", "");
|
||||||
$("#partsListAnnotations").empty();
|
$("#partsListAnnotations").empty();
|
||||||
@ -177,7 +180,25 @@ $(document).ready(function () {
|
|||||||
updateMarkers();
|
updateMarkers();
|
||||||
markUnsaved();
|
markUnsaved();
|
||||||
});
|
});
|
||||||
|
// ===================
|
||||||
|
// COLORE LISTA DESCRIZIONI
|
||||||
|
// ===================
|
||||||
|
$(document)
|
||||||
|
.off("input.descriptionColor", "#descriptionColorPickerAnnotations")
|
||||||
|
.on(
|
||||||
|
"input.descriptionColor",
|
||||||
|
"#descriptionColorPickerAnnotations",
|
||||||
|
function () {
|
||||||
|
globalDescriptionColor = $(this).val();
|
||||||
|
|
||||||
|
if (descriptionTextbox && fabricCanvas) {
|
||||||
|
descriptionTextbox.set("fill", globalDescriptionColor);
|
||||||
|
fabricCanvas.renderAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
markUnsaved();
|
||||||
|
},
|
||||||
|
);
|
||||||
// ===================
|
// ===================
|
||||||
// PHOTO LOADERS
|
// PHOTO LOADERS
|
||||||
// ===================
|
// ===================
|
||||||
@ -1130,7 +1151,7 @@ $(document).ready(function () {
|
|||||||
backgroundColor: "transparent",
|
backgroundColor: "transparent",
|
||||||
fontFamily: "Arial",
|
fontFamily: "Arial",
|
||||||
fontSize: Math.max(16, Math.round(globalMarkerSize * 0.8)),
|
fontSize: Math.max(16, Math.round(globalMarkerSize * 0.8)),
|
||||||
fill: "#000000",
|
fill: globalDescriptionColor,
|
||||||
padding: 10,
|
padding: 10,
|
||||||
editable: false,
|
editable: false,
|
||||||
selectable: true,
|
selectable: true,
|
||||||
|
|||||||
228
public/userarea/clone_template.php
Normal file
228
public/userarea/clone_template.php
Normal file
@ -0,0 +1,228 @@
|
|||||||
|
<?php
|
||||||
|
require_once 'class/db-functions.php';
|
||||||
|
|
||||||
|
ini_set('display_errors', 1);
|
||||||
|
ini_set('display_startup_errors', 1);
|
||||||
|
error_reporting(E_ALL);
|
||||||
|
|
||||||
|
if (!isset($_GET['id']) || !is_numeric($_GET['id'])) {
|
||||||
|
die("Invalid template ID");
|
||||||
|
}
|
||||||
|
|
||||||
|
$sourceTemplateId = (int)$_GET['id'];
|
||||||
|
|
||||||
|
try {
|
||||||
|
$db = DBHandlerSelect::getInstance();
|
||||||
|
$pdo = $db->getConnection();
|
||||||
|
|
||||||
|
$pdo->beginTransaction();
|
||||||
|
|
||||||
|
// 1. Get source template
|
||||||
|
$stmt = $pdo->prepare("
|
||||||
|
SELECT
|
||||||
|
name,
|
||||||
|
source_type,
|
||||||
|
header_row,
|
||||||
|
start_column,
|
||||||
|
description,
|
||||||
|
target_table,
|
||||||
|
sample_xlsx,
|
||||||
|
button_size,
|
||||||
|
button_bg_color,
|
||||||
|
button_text_color,
|
||||||
|
button_label,
|
||||||
|
status,
|
||||||
|
client_specific_fields,
|
||||||
|
idclient,
|
||||||
|
clientname,
|
||||||
|
schemaname,
|
||||||
|
idschema,
|
||||||
|
schemajson,
|
||||||
|
xls_headers,
|
||||||
|
api_sample_json,
|
||||||
|
json_nodes,
|
||||||
|
idroutine
|
||||||
|
FROM excel_templates
|
||||||
|
WHERE id = ?
|
||||||
|
LIMIT 1
|
||||||
|
");
|
||||||
|
$stmt->execute([$sourceTemplateId]);
|
||||||
|
$template = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
|
if (!$template) {
|
||||||
|
throw new Exception("Template not found.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. Generate unique clone name
|
||||||
|
$baseName = 'Copia di ' . $template['name'];
|
||||||
|
$newName = $baseName;
|
||||||
|
|
||||||
|
$checkStmt = $pdo->prepare("SELECT COUNT(*) FROM excel_templates WHERE name = ?");
|
||||||
|
$checkStmt->execute([$newName]);
|
||||||
|
|
||||||
|
if ((int)$checkStmt->fetchColumn() > 0) {
|
||||||
|
$counter = 2;
|
||||||
|
|
||||||
|
do {
|
||||||
|
$newName = $baseName . ' (' . $counter . ')';
|
||||||
|
$checkStmt->execute([$newName]);
|
||||||
|
$exists = (int)$checkStmt->fetchColumn() > 0;
|
||||||
|
$counter++;
|
||||||
|
} while ($exists);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. Insert cloned template
|
||||||
|
$insertTemplate = $pdo->prepare("
|
||||||
|
INSERT INTO excel_templates (
|
||||||
|
name,
|
||||||
|
source_type,
|
||||||
|
created_at,
|
||||||
|
updated_at,
|
||||||
|
header_row,
|
||||||
|
start_column,
|
||||||
|
description,
|
||||||
|
target_table,
|
||||||
|
sample_xlsx,
|
||||||
|
button_size,
|
||||||
|
button_bg_color,
|
||||||
|
button_text_color,
|
||||||
|
button_label,
|
||||||
|
status,
|
||||||
|
client_specific_fields,
|
||||||
|
idclient,
|
||||||
|
clientname,
|
||||||
|
schemaname,
|
||||||
|
idschema,
|
||||||
|
schemajson,
|
||||||
|
xls_headers,
|
||||||
|
api_sample_json,
|
||||||
|
json_nodes,
|
||||||
|
idroutine
|
||||||
|
) VALUES (
|
||||||
|
:name,
|
||||||
|
:source_type,
|
||||||
|
NOW(),
|
||||||
|
NOW(),
|
||||||
|
:header_row,
|
||||||
|
:start_column,
|
||||||
|
:description,
|
||||||
|
:target_table,
|
||||||
|
:sample_xlsx,
|
||||||
|
:button_size,
|
||||||
|
:button_bg_color,
|
||||||
|
:button_text_color,
|
||||||
|
:button_label,
|
||||||
|
:status,
|
||||||
|
:client_specific_fields,
|
||||||
|
:idclient,
|
||||||
|
:clientname,
|
||||||
|
:schemaname,
|
||||||
|
:idschema,
|
||||||
|
:schemajson,
|
||||||
|
:xls_headers,
|
||||||
|
:api_sample_json,
|
||||||
|
:json_nodes,
|
||||||
|
:idroutine
|
||||||
|
)
|
||||||
|
");
|
||||||
|
|
||||||
|
$insertTemplate->execute([
|
||||||
|
':name' => $newName,
|
||||||
|
':source_type' => $template['source_type'],
|
||||||
|
':header_row' => $template['header_row'],
|
||||||
|
':start_column' => $template['start_column'],
|
||||||
|
':description' => $template['description'],
|
||||||
|
':target_table' => $template['target_table'],
|
||||||
|
':sample_xlsx' => $template['sample_xlsx'],
|
||||||
|
':button_size' => $template['button_size'],
|
||||||
|
':button_bg_color' => $template['button_bg_color'],
|
||||||
|
':button_text_color' => $template['button_text_color'],
|
||||||
|
':button_label' => $template['button_label'],
|
||||||
|
':status' => $template['status'],
|
||||||
|
':client_specific_fields' => $template['client_specific_fields'],
|
||||||
|
':idclient' => $template['idclient'],
|
||||||
|
':clientname' => $template['clientname'],
|
||||||
|
':schemaname' => $template['schemaname'],
|
||||||
|
':idschema' => $template['idschema'],
|
||||||
|
':schemajson' => $template['schemajson'],
|
||||||
|
':xls_headers' => $template['xls_headers'],
|
||||||
|
':api_sample_json' => $template['api_sample_json'],
|
||||||
|
':json_nodes' => $template['json_nodes'],
|
||||||
|
':idroutine' => $template['idroutine']
|
||||||
|
]);
|
||||||
|
|
||||||
|
$newTemplateId = (int)$pdo->lastInsertId();
|
||||||
|
|
||||||
|
if ($newTemplateId <= 0) {
|
||||||
|
throw new Exception("Unable to create cloned template.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. Clone template_mapping rows
|
||||||
|
$cloneMappings = $pdo->prepare("
|
||||||
|
INSERT INTO template_mapping (
|
||||||
|
template_id,
|
||||||
|
schema_id,
|
||||||
|
field_id,
|
||||||
|
excel_column,
|
||||||
|
json_node,
|
||||||
|
is_manual,
|
||||||
|
manual_default,
|
||||||
|
auto_value,
|
||||||
|
data_type,
|
||||||
|
is_required,
|
||||||
|
default_value,
|
||||||
|
has_list,
|
||||||
|
length,
|
||||||
|
decimals,
|
||||||
|
min_value,
|
||||||
|
max_value,
|
||||||
|
default_curr_date,
|
||||||
|
tablename,
|
||||||
|
field_label,
|
||||||
|
main_field,
|
||||||
|
is_visible_import,
|
||||||
|
is_visible_parts
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
:new_template_id,
|
||||||
|
schema_id,
|
||||||
|
field_id,
|
||||||
|
excel_column,
|
||||||
|
json_node,
|
||||||
|
is_manual,
|
||||||
|
manual_default,
|
||||||
|
auto_value,
|
||||||
|
data_type,
|
||||||
|
is_required,
|
||||||
|
default_value,
|
||||||
|
has_list,
|
||||||
|
length,
|
||||||
|
decimals,
|
||||||
|
min_value,
|
||||||
|
max_value,
|
||||||
|
default_curr_date,
|
||||||
|
tablename,
|
||||||
|
field_label,
|
||||||
|
main_field,
|
||||||
|
is_visible_import,
|
||||||
|
is_visible_parts
|
||||||
|
FROM template_mapping
|
||||||
|
WHERE template_id = :source_template_id
|
||||||
|
");
|
||||||
|
|
||||||
|
$cloneMappings->execute([
|
||||||
|
':new_template_id' => $newTemplateId,
|
||||||
|
':source_template_id' => $sourceTemplateId
|
||||||
|
]);
|
||||||
|
|
||||||
|
$pdo->commit();
|
||||||
|
|
||||||
|
header("Location: templates_dashboard.php?cloned=1&new_id=" . $newTemplateId);
|
||||||
|
exit;
|
||||||
|
} catch (Exception $e) {
|
||||||
|
if (isset($pdo) && $pdo->inTransaction()) {
|
||||||
|
$pdo->rollBack();
|
||||||
|
}
|
||||||
|
|
||||||
|
die("Clone error: " . htmlspecialchars($e->getMessage(), ENT_QUOTES, 'UTF-8'));
|
||||||
|
}
|
||||||
@ -46,6 +46,16 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
|
<div style="display: flex; align-items: center; gap: 6px; margin-right: auto;">
|
||||||
|
<label for="descriptionColorPickerAnnotations" style="font-size: 0.8rem; margin: 0; white-space: nowrap;">
|
||||||
|
Colore annotazioni:
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
type="color"
|
||||||
|
id="descriptionColorPickerAnnotations"
|
||||||
|
value="#000000"
|
||||||
|
style="width: 34px; height: 28px; padding: 1px; border: 1px solid #ccc; border-radius: 4px; cursor: pointer;">
|
||||||
|
</div>
|
||||||
<button type="button" class="btn btn-primary btn-sm" id="addDescriptionsBtnAnnotations" style="padding: 0.1rem 0.5rem; font-size: 0.8rem;">Aggiungi Lista Descrizioni</button>
|
<button type="button" class="btn btn-primary btn-sm" id="addDescriptionsBtnAnnotations" style="padding: 0.1rem 0.5rem; font-size: 0.8rem;">Aggiungi Lista Descrizioni</button>
|
||||||
<button type="button" class="btn btn-danger btn-sm" id="removeAnnotationsBtnAnnotations" style="padding: 0.1rem 0.5rem; font-size: 0.8rem;">Rimuovi Descrizioni</button>
|
<button type="button" class="btn btn-danger btn-sm" id="removeAnnotationsBtnAnnotations" style="padding: 0.1rem 0.5rem; font-size: 0.8rem;">Rimuovi Descrizioni</button>
|
||||||
<button type="button" class="btn btn-warning btn-sm" id="undoMarkerBtnAnnotations" style="padding: 0.1rem 0.5rem; font-size: 0.8rem;">Undo Marker</button>
|
<button type="button" class="btn btn-warning btn-sm" id="undoMarkerBtnAnnotations" style="padding: 0.1rem 0.5rem; font-size: 0.8rem;">Undo Marker</button>
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@ -181,6 +181,20 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
|
|
||||||
|
const urlParams = new URLSearchParams(window.location.search);
|
||||||
|
|
||||||
|
if (urlParams.get('cloned') === '1') {
|
||||||
|
Swal.fire({
|
||||||
|
title: "Template cloned",
|
||||||
|
text: "The template was cloned successfully.",
|
||||||
|
icon: "success",
|
||||||
|
confirmButtonText: "OK"
|
||||||
|
});
|
||||||
|
|
||||||
|
const cleanUrl = window.location.pathname;
|
||||||
|
window.history.replaceState({}, document.title, cleanUrl);
|
||||||
|
}
|
||||||
$('#xlsTemplatesTable').DataTable({
|
$('#xlsTemplatesTable').DataTable({
|
||||||
processing: true,
|
processing: true,
|
||||||
serverSide: false,
|
serverSide: false,
|
||||||
@ -195,18 +209,24 @@
|
|||||||
className: "table-actions text-center",
|
className: "table-actions text-center",
|
||||||
render: function(data, type, row) {
|
render: function(data, type, row) {
|
||||||
return `
|
return `
|
||||||
<div class="d-flex justify-content-center gap-1">
|
<div class="d-flex justify-content-center gap-1">
|
||||||
<a href="edit_template_xls.php?id=${data}" class="btn btn-sm btn-primary" title="Edit">
|
<a href="edit_template_xls.php?id=${data}" class="btn btn-sm btn-primary" title="Edit">
|
||||||
<i class="bx bx-edit-alt"></i>
|
<i class="bx bx-edit-alt"></i>
|
||||||
</a>
|
</a>
|
||||||
<a href="mapping_template_xls_scheme2.php?id=${data}" class="btn btn-sm btn-success" title="Mapping">
|
|
||||||
<i class="bx bx-link-alt"></i>
|
<a href="mapping_template_xls_scheme2.php?id=${data}" class="btn btn-sm btn-success" title="Mapping">
|
||||||
</a>
|
<i class="bx bx-link-alt"></i>
|
||||||
<button class="btn btn-sm btn-danger" onclick="confirmDelete(${data})" title="Delete">
|
</a>
|
||||||
<i class="bx bx-trash"></i>
|
|
||||||
</button>
|
<button class="btn btn-sm btn-warning" onclick="confirmClone(${data}, '${String(row.name || '').replace(/'/g, "\\'")}')" title="Clone">
|
||||||
</div>
|
<i class="bx bx-copy"></i>
|
||||||
`;
|
</button>
|
||||||
|
|
||||||
|
<button class="btn btn-sm btn-danger" onclick="confirmDelete(${data})" title="Delete">
|
||||||
|
<i class="bx bx-trash"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -318,6 +338,31 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function confirmClone(id, templateName) {
|
||||||
|
Swal.fire({
|
||||||
|
title: "Clone template?",
|
||||||
|
html: `
|
||||||
|
<div class="text-start">
|
||||||
|
<p class="mb-2">You are about to clone this template:</p>
|
||||||
|
<strong>${templateName}</strong>
|
||||||
|
<p class="mt-3 mb-0 text-muted">
|
||||||
|
The new template will be created as <strong>Copia di ${templateName}</strong> and all mappings will be copied.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
`,
|
||||||
|
icon: "question",
|
||||||
|
showCancelButton: true,
|
||||||
|
confirmButtonColor: "#ffc107",
|
||||||
|
cancelButtonColor: "#6c757d",
|
||||||
|
confirmButtonText: "Yes, clone it",
|
||||||
|
cancelButtonText: "Cancel"
|
||||||
|
}).then((result) => {
|
||||||
|
if (result.isConfirmed) {
|
||||||
|
window.location.href = `clone_template.php?id=${id}`;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
$(document).on("change", ".toggle-status", function() {
|
$(document).on("change", ".toggle-status", function() {
|
||||||
let templateId = $(this).data("id");
|
let templateId = $(this).data("id");
|
||||||
let newStatus = $(this).is(":checked") ? "active" : "inactive";
|
let newStatus = $(this).is(":checked") ? "active" : "inactive";
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user