Обновление списка подготовленных параметров

This commit is contained in:
2025-12-15 16:10:38 +03:00
parent a484d03894
commit 601859f465
+160 -78
View File
@@ -8,62 +8,69 @@ let currentToolboxData = null;
// Список предопределенных характеристик с разделами // Список предопределенных характеристик с разделами
const predefinedSpecs = { const predefinedSpecs = {
"Универсальные": [ "Инструмент для ЧПУ": [
"Диаметр", { "Тип крепления": ["BT", "ER", "HSK", "ISO", "Weldon"] },
лина", опуск биения",
"Черновая", "Длина режущей части",
"Чистовая", "Максимальная подача",
"Материал инструмента", "Максимальные обороты",
"Покрытие (TiN, TiAlN, AlTiN)", "Рабочая часть",
"Тип хвостовика", { "Тип спирали": ["Левосторонняя", "Правосторонняя"] }
"Назначение",
"По стали",
"По нержавейке",
"По алюминию",
"Твёрдый сплав",
"HSS"
], ],
"Фрезеровка": [ "Сверла": [
"Кол-во перьев", { "Тип хвостовика": ["Морзе", "Цилиндрический"] }
"Тип фрезы (концевая, торцевая, черновая)",
"Угол спирали",
"Геометрия зубьев"
], ],
"Токарка": [ "Токарка": [
"Пластины", "Пластины",
"Форма пластины (C, D, V, W, T)", { "Форма пластины": ["C", "D", "T", "V", "W", "Резьбовая"] },
"Радиус", "Радиус",
"Наружная", { "Тип резьбы": ["Внутренняя", "Наружная"] },
"Внутренняя", { "Исполнение резьбы": ["Левая", "Правая"] },
"Резьбовая",
"Шаг", "Шаг",
"Тип державки", { "Угол резьбы": [30, 55, 60] },
"Направление (правое/левое)", "Шаг",
"Система крепления" { "Профиль резьбы": ["Неполный", "Полный"] }
], ],
"Сверла": [ "Универсальные": [
"Угол заточки (118°, 135°)", "Диаметр",
"Тип хвостовика (цилиндрический, Морзе)", "Длина",
"Глубокое сверление" { "Вид обработки": ["На удар", "Черновая", "Чистовая"] },
{ "Материал инструмента": ["HSS", "Твёрдый сплав"] },
{ "Покрытие": ["AlTiN", "TiAlN", "TiN"] },
"Тип хвостовика",
"Назначение",
{
"Обрабатываемый материал": [
"H (Твёрдые материалы)",
"M (Нержавеющая сталь)",
"N (Цветные металлы)",
"P (Сталь)",
"S (Жаропрочные)"
]
}
], ],
"Инструмент для ЧПУ": [ "Фрезеровка": [
"Тип инструмента (фреза, сверло, развертка, гравёр, фасочник)", "Кол-во перьев",
"Тип обработки (2D, 3D, контурная, карманная)", {
"Ступенчатая геометрия", "Тип фрезы": [
"Тип крепления (ER, Weldon, HSK, BT, ISO)", "Коническая",
"Максимальные обороты", "Концевая",
"Максимальная подача", "Радиусная",
"Допуск биения", "Сферическая",
"Тип спирали (правосторонняя, левосторонняя)", "Торцевая",
"Длина режущей части", "Фасочная"
"Рабочая часть" ]
},
"Угол спирали",
"Геометрия зубьев"
] ]
}; };
async function getCookieData() { async function getCookieData() {
accessData = await getCookie('toolbox_access'); accessData = await getCookie('toolbox_access');
userData = await getCookie('toolbox_user'); userData = await getCookie('toolbox_user');
@@ -4796,47 +4803,65 @@ async function manageToolkit(toolkitData = null, categories = null, action = 'cr
const specModal = document.createElement('div'); const specModal = document.createElement('div');
specModal.className = 'modal fade'; specModal.className = 'modal fade';
specModal.id = 'addSpecModal'; specModal.id = 'addSpecModal';
specModal.innerHTML = ` specModal.innerHTML = `
<div class="modal-dialog modal-dialog-centered"> <div class="modal-dialog modal-dialog-centered">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h5 class="modal-title"><i class="bi bi-gear me-2"></i>${modalTitle}</h5> <h5 class="modal-title">
<i class="bi bi-gear me-2"></i>${modalTitle}
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button> <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<!-- Название -->
<div class="mb-3"> <div class="mb-3">
<label for="specName" class="form-label required">Название характеристики</label> <label class="form-label required">Название характеристики</label>
<div class="input-group"> <div class="input-group">
<input type="text" class="form-control" id="specName" <input type="text" class="form-control" id="specName"
placeholder="Введите название" value="${oldKey || ''}"> value="${oldKey || ''}" placeholder="Введите название">
<button class="btn btn-outline-secondary dropdown-toggle" type="button"
data-bs-toggle="dropdown" aria-expanded="false"> <button class="btn btn-outline-secondary dropdown-toggle"
data-bs-toggle="dropdown">
<i class="bi bi-list"></i> <i class="bi bi-list"></i>
</button> </button>
<ul class="dropdown-menu dropdown-menu-end" style="max-height: 300px; overflow-y: auto;">
${Object.entries(predefinedSpecs).map(([category, items]) => ` <ul class="dropdown-menu dropdown-menu-end"
<li><h6 class="dropdown-header">${category}</h6></li> style="max-height:300px;overflow-y:auto;">
${items.map(item => ` ${buildSpecNameDropdown()}
<li>
<button class="dropdown-item" type="button" onclick="selectPredefinedSpec('${item}')">
${item}
</button>
</li>
`).join('')}
`).join('')}
</ul> </ul>
</div> </div>
</div> </div>
<!-- Значение -->
<div class="mb-3"> <div class="mb-3">
<label for="specValue" class="form-label required">Значение</label> <label class="form-label required">Значение</label>
<div class="input-group">
<input type="text" class="form-control" id="specValue" <input type="text" class="form-control" id="specValue"
placeholder="Введите значение" value="${oldValue || ''}"> value="${oldValue || ''}" placeholder="Введите значение">
<button class="btn btn-outline-secondary dropdown-toggle"
data-bs-toggle="dropdown">
<i class="bi bi-list"></i>
</button>
<ul class="dropdown-menu dropdown-menu-end"
id="specValueDropdown"
style="max-height:300px;overflow-y:auto;">
<li>
<span class="dropdown-item disabled">
Сначала выберите параметр
</span>
</li>
</ul>
</div> </div>
</div> </div>
</div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Отмена</button> <button class="btn btn-secondary" data-bs-dismiss="modal">Отмена</button>
<button type="button" class="btn btn-primary" id="saveSpecBtn">${saveButtonText}</button> <button class="btn btn-primary" id="saveSpecBtn">${saveButtonText}</button>
</div> </div>
</div> </div>
</div> </div>
@@ -4845,32 +4870,92 @@ async function manageToolkit(toolkitData = null, categories = null, action = 'cr
document.body.appendChild(specModal); document.body.appendChild(specModal);
const bsSpecModal = new bootstrap.Modal(specModal); const bsSpecModal = new bootstrap.Modal(specModal);
// Функция выбора предопределенной характеристики /* ---------- helpers ---------- */
function buildSpecNameDropdown() {
return Object.entries(predefinedSpecs).map(([category, items]) => `
<li><h6 class="dropdown-header">${category}</h6></li>
${items.map(item => {
const name = typeof item === 'string'
? item
: Object.keys(item)[0];
return `
<li>
<button class="dropdown-item" type="button"
onclick="selectPredefinedSpec('${name.replace(/'/g, "\\'")}')">
${name}
</button>
</li>
`;
}).join('')}
`).join('');
}
function updateValueDropdown(specName) {
const dropdown = document.getElementById('specValueDropdown');
dropdown.innerHTML = '';
const values = findSpecValues(specName);
if (!values) {
dropdown.innerHTML = `
<li>
<span class="dropdown-item disabled">
Только ручной ввод
</span>
</li>
`;
return;
}
values.forEach(val => {
dropdown.innerHTML += `
<li>
<button class="dropdown-item" type="button"
onclick="selectSpecValue('${val}')">
${val}
</button>
</li>
`;
});
}
function findSpecValues(name) {
for (const items of Object.values(predefinedSpecs)) {
for (const item of items) {
if (typeof item === 'object' && item[name]) {
return item[name];
}
}
}
return null;
}
/* ---------- global callbacks ---------- */
window.selectPredefinedSpec = function (name) { window.selectPredefinedSpec = function (name) {
document.getElementById('specName').value = name; document.getElementById('specName').value = name;
updateValueDropdown(name);
}; };
// Обработчик сохранения window.selectSpecValue = function (value) {
document.getElementById('specValue').value = value;
};
/* ---------- save ---------- */
specModal.querySelector('#saveSpecBtn').addEventListener('click', () => { specModal.querySelector('#saveSpecBtn').addEventListener('click', () => {
const name = document.getElementById('specName').value.trim(); const name = document.getElementById('specName').value.trim();
const value = document.getElementById('specValue').value.trim(); const value = document.getElementById('specValue').value.trim();
if (!name) { if (!name) return showError('Введите название характеристики');
showError('Введите название характеристики'); if (!value) return showError('Введите значение характеристики');
return;
}
if (!value) {
showError('Введите значение характеристики');
return;
}
// Если это режим редактирования и название изменилось, удаляем старую характеристику
if (isEditMode && oldKey !== name) { if (isEditMode && oldKey !== name) {
delete specifications[oldKey]; delete specifications[oldKey];
} }
// Добавляем/обновляем характеристику
specifications[name] = value; specifications[name] = value;
updateSpecificationsList(); updateSpecificationsList();
@@ -4881,11 +4966,8 @@ async function manageToolkit(toolkitData = null, categories = null, action = 'cr
}, 300); }, 300);
}); });
// Очистка при закрытии
specModal.addEventListener('hidden.bs.modal', () => { specModal.addEventListener('hidden.bs.modal', () => {
setTimeout(() => { setTimeout(() => specModal.remove(), 300);
if (specModal.parentNode) specModal.remove();
}, 300);
}); });
bsSpecModal.show(); bsSpecModal.show();