Files
auction_program/assets/js/edit.js

159 lines
7.4 KiB
JavaScript
Raw Normal View History

2024-11-29 14:31:14 +07:00
"use strict";
// Khai báo các biến trạng thái chính để quản lý lịch sử các trạng thái giao diện
let historyStates = []; // Lưu trữ lịch sử HTML của trang
let currentStateIndex = -1; // Chỉ số trạng thái hiện tại trong lịch sử
let currentElement = null; // Phần tử hiện đang chỉnh sửa
let isEditMode = false; // Xác định chế độ chỉnh sửa có được bật không
// Các phần tử giao diện được chọn từ DOM, chứa các thành phần tương tác trong giao diện chỉnh sửa
2024-11-13 15:55:05 +07:00
const $elements = {
2024-11-29 14:31:14 +07:00
// Nút để bật hoặc tắt chế độ chỉnh sửa
2024-11-13 15:55:05 +07:00
toggleEditModeButton: $('#toggleEditMode'),
2024-11-29 14:31:14 +07:00
// Thanh công cụ hiển thị các tùy chọn khi chỉnh sửa phần tử
2024-11-13 15:55:05 +07:00
tabBar: $('#tabBar'),
2024-11-29 14:31:14 +07:00
// Phần tùy chọn cho chỉnh sửa văn bản, bao gồm các thiết lập màu, nội dung và khoảng cách dòng
2024-11-13 15:55:05 +07:00
textOptions: $('#textOptions'),
2024-11-29 14:31:14 +07:00
// Phần tùy chọn cho chỉnh sửa ảnh, bao gồm URL ảnh và kích thước
2024-11-13 15:55:05 +07:00
imageOptions: $('#imageOptions'),
2024-11-29 14:31:14 +07:00
// Phần tùy chọn cho chỉnh sửa hộp (box), có thể dùng để thay đổi kích thước hoặc màu nền
2024-11-13 15:55:05 +07:00
boxOptions: $('#BoxOptions'),
2024-11-29 14:31:14 +07:00
// Phần tùy chọn cho chỉnh sửa nền, cho phép thiết lập màu nền
2024-11-13 15:55:05 +07:00
bgOptions: $('#bgOptions'),
2024-11-29 14:31:14 +07:00
// Trường nhập liệu cho màu chữ, cho phép người dùng chọn màu chữ của tiêu đề hoặc văn bản
2024-11-13 15:55:05 +07:00
textColorInput: $('#textColor'),
2024-11-29 14:31:14 +07:00
// Trường nhập liệu cho màu nền của văn bản, cho phép người dùng thay đổi màu nền của tiêu đề
2024-11-13 15:55:05 +07:00
textBackgroundInput: $('#textBackground'),
2024-11-29 14:31:14 +07:00
// Trường nhập liệu cho nội dung văn bản, dùng để chỉnh sửa nội dung của tiêu đề
2024-11-13 15:55:05 +07:00
textContentInput: $('#textContent'),
2024-11-29 14:31:14 +07:00
// Trường nhập liệu URL của ảnh, cho phép người dùng nhập URL để thay đổi ảnh
2024-11-13 15:55:05 +07:00
imageURLInput: $('#imageURL'),
2024-11-29 14:31:14 +07:00
// Trường tải lên ảnh, cho phép người dùng tải ảnh trực tiếp từ máy tính
2024-11-13 15:55:05 +07:00
imageUploadInput: $('#imageUpload'),
2024-11-29 14:31:14 +07:00
// Trường nhập liệu cho kích thước logo, dùng để điều chỉnh kích thước ảnh hoặc logo
2024-11-13 15:55:05 +07:00
logoSizeInput: $('#logoSize'),
2024-11-29 14:31:14 +07:00
// Hiển thị giá trị kích thước hiện tại của ảnh, được cập nhật khi thay đổi kích thước logo
2024-11-13 15:55:05 +07:00
sizeValueSpan: $('#sizeValue'),
2024-11-29 14:31:14 +07:00
// Trường nhập liệu khoảng cách dòng, giúp người dùng điều chỉnh khoảng cách dòng của văn bản
2024-11-13 15:55:05 +07:00
lineHeightInput: $('#lineHeight')
};
2024-11-29 14:31:14 +07:00
// Lắng nghe sự kiện scroll để chuyển chế độ cố định cho thanh công cụ khi cuộn xuống
2024-11-09 11:14:57 +07:00
$(window).scroll(function () {
2024-11-13 15:55:05 +07:00
$(".mode-edit").toggleClass('fixed', $(window).scrollTop() > 100);
});
2024-11-29 14:31:14 +07:00
/**
* Bật/tắt chế độ chỉnh sửa.
* Khi bật, các phần tử sẽ thể chỉnh sửa, ngược lại.
*/
2024-11-13 15:55:05 +07:00
$elements.toggleEditModeButton.on('click', function () {
2024-11-09 11:14:57 +07:00
isEditMode = !isEditMode;
$('.editable-element').toggleClass('editable', isEditMode);
2024-11-13 15:55:05 +07:00
$elements.toggleEditModeButton.html(isEditMode ? '<i class="fas fa-sign-out-alt"></i> Thoát chỉnh sửa' : '<i class="far fa-edit"></i> Chỉnh sửa');
$elements.tabBar.hide();
2024-11-09 11:14:57 +07:00
});
2024-11-29 14:31:14 +07:00
/**
* Cập nhật màu sắc của phần tử hiện tại.
* @param type - Loại màu sắc cần thay đổi ('text' hoặc 'bg').
* @param color - màu cần áp dụng cho phần tử.
*/
2024-11-13 15:55:05 +07:00
function updateElementColor(type, color) {
2024-11-29 14:31:14 +07:00
if (!currentElement)
return;
2024-11-13 15:55:05 +07:00
const className = type === 'text' ? `text-[${color}]` : `bg-[${color}]`;
currentElement.find('.title').attr('class', function (i, c) {
2024-11-29 14:31:14 +07:00
return c ? c.split(' ').filter(cls => !cls.startsWith(type)).concat(className).join(' ') : className;
2024-11-13 15:55:05 +07:00
});
}
2024-11-29 14:31:14 +07:00
/**
* Xử tải ảnh lên gán ảnh mới cho phần tử.
* @param event - Sự kiện thay đổi từ ô tải ảnh lên.
*/
2024-11-13 15:55:05 +07:00
function handleImageUpload(event) {
2024-11-29 14:31:14 +07:00
var _a;
const file = (_a = event.target.files) === null || _a === void 0 ? void 0 : _a[0];
if (!file)
return;
2024-11-13 15:55:05 +07:00
const reader = new FileReader();
reader.onload = function () {
2024-11-29 14:31:14 +07:00
currentElement === null || currentElement === void 0 ? void 0 : currentElement.find('img').attr('src', reader.result);
2024-11-13 15:55:05 +07:00
};
reader.readAsDataURL(file);
}
2024-11-29 14:31:14 +07:00
/**
* Bắt đầu chế độ chỉnh sửa cho phần tử được chọn.
* @param event - Sự kiện click để bắt đầu chỉnh sửa.
* @param button - Nút bấm để kích hoạt chỉnh sửa phần tử.
*/
function startEditing(event, button) {
if (!isEditMode)
return;
event.stopPropagation();
currentElement = $(button).closest('.editable-element');
$elements.tabBar.show();
setupOptions();
}
/**
* Thiết lập các tùy chọn cho phần tử đang chỉnh sửa dựa trên loại của .
*/
function setupOptions() {
if (!currentElement)
return;
2024-11-13 15:55:05 +07:00
const elementType = currentElement.data('type');
2024-11-29 14:31:14 +07:00
if (elementType === 'box') {
showBoxOptions();
2024-11-09 11:14:57 +07:00
}
2024-11-29 14:31:14 +07:00
else if (elementType === 'title') {
showTextOptions(currentElement.find('.title'));
2024-11-13 15:55:05 +07:00
}
2024-11-29 14:31:14 +07:00
else if (elementType === 'background') {
showBgOptions();
2024-11-13 15:55:05 +07:00
}
2024-11-29 14:31:14 +07:00
else if (elementType === 'image') {
showImageOptions();
2024-11-13 15:55:05 +07:00
}
2024-11-09 11:14:57 +07:00
}
2024-11-29 14:31:14 +07:00
// Các hàm hiển thị và xử lý tùy chọn (showTextOptions, showBgOptions, showImageOptions, showBoxOptions)
// Thêm vào TypeScript, định nghĩa tham số và chú thích
/**
* Hiển thị các tùy chọn văn bản cho phần tử tiêu đề.
* @param $title - Phần tử tiêu đề hiện tại.
*/
2024-11-13 15:55:05 +07:00
function showTextOptions($title) {
2024-11-29 14:31:14 +07:00
// Hiển thị các tùy chọn và thiết lập giá trị hiện tại cho ô input
$elements.textOptions.show();
$elements.boxOptions.hide();
2024-11-13 15:55:05 +07:00
$elements.imageOptions.hide();
2024-11-29 14:31:14 +07:00
$elements.bgOptions.hide();
2024-11-13 15:55:05 +07:00
$elements.textContentInput.val($title.text().trim());
$elements.textColorInput.val(extractColor($title, 'text'));
$elements.textBackgroundInput.val(extractColor($title, 'bg'));
$elements.lineHeightInput.val(parseFloat($title.css('line-height')));
$('#fontSize').val(parseFloat($title.css('font-size')));
$('#fontFamily').val($title.css('font-family'));
2024-11-29 14:31:14 +07:00
$('#BgcolorCode').val(extractColor($title, 'bg'));
2024-11-13 15:55:05 +07:00
$('#colorCodeTitle').val(extractColor($title, 'text'));
}
2024-11-29 14:31:14 +07:00
/**
* Trích xuất màu từ lớp CSS của phần tử.
* @param $element - Phần tử để lấy màu.
* @param type - Loại màu ('text' hoặc 'bg').
* @returns màu đã được trích xuất hoặc '#000000' nếu không .
*/
2024-11-09 11:14:57 +07:00
function extractColor($element, type) {
2024-11-29 14:31:14 +07:00
var _a;
2024-11-09 11:14:57 +07:00
const regex = new RegExp(`${type}-\\[([#0-9A-Fa-f]+)\\]`);
2024-11-29 14:31:14 +07:00
const match = (_a = $element.attr('class')) === null || _a === void 0 ? void 0 : _a.match(regex);
2024-11-13 15:55:05 +07:00
return match ? match[1] : '#000000';
2024-11-09 11:14:57 +07:00
}
2024-11-29 14:31:14 +07:00
/**
* Lưu trạng thái hiện tại vào lịch sử trạng thái.
*/
function saveCurrentState() {
const currentHTML = document.documentElement.innerHTML;
if (currentStateIndex < historyStates.length - 1) {
historyStates = historyStates.slice(0, currentStateIndex + 1);
2024-11-13 16:20:20 +07:00
}
2024-11-29 14:31:14 +07:00
historyStates.push(currentHTML);
currentStateIndex++;
2024-11-13 16:20:20 +07:00
}
2024-11-29 14:31:14 +07:00
// (Các hàm khác tương tự như goBack, applyChanges, updateLineHeight, ...)
// Đảm bảo mỗi hàm có chú thích chi tiết về chức năng, tham số và kiểu trả về.