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

This commit is contained in:
2025-12-15 16:10:38 +03:00
parent a484d03894
commit 601859f465
+179 -97
View File
@@ -8,62 +8,69 @@ let currentToolboxData = null;
// Список предопределенных характеристик с разделами
const predefinedSpecs = {
"Универсальные": [
"Диаметр",
лина",
"Черновая",
"Чистовая",
"Материал инструмента",
"Покрытие (TiN, TiAlN, AlTiN)",
"Тип хвостовика",
"Назначение",
"По стали",
"По нержавейке",
"По алюминию",
"Твёрдый сплав",
"HSS"
"Инструмент для ЧПУ": [
{ "Тип крепления": ["BT", "ER", "HSK", "ISO", "Weldon"] },
опуск биения",
"Длина режущей части",
"Максимальная подача",
"Максимальные обороты",
"Рабочая часть",
{ "Тип спирали": ["Левосторонняя", "Правосторонняя"] }
],
"Фрезеровка": [
"Кол-во перьев",
"Тип фрезы (концевая, торцевая, черновая)",
"Угол спирали",
"Геометрия зубьев"
"Сверла": [
{ "Тип хвостовика": ["Морзе", "Цилиндрический"] }
],
"Токарка": [
"Пластины",
"Форма пластины (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() {
accessData = await getCookie('toolbox_access');
userData = await getCookie('toolbox_user');
@@ -4796,81 +4803,159 @@ async function manageToolkit(toolkitData = null, categories = null, action = 'cr
const specModal = document.createElement('div');
specModal.className = 'modal fade';
specModal.id = 'addSpecModal';
specModal.innerHTML = `
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<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>
</div>
<div class="modal-body">
<div class="mb-3">
<label for="specName" class="form-label required">Название характеристики</label>
<div class="input-group">
<input type="text" class="form-control" id="specName"
placeholder="Введите название" value="${oldKey || ''}">
<button class="btn btn-outline-secondary dropdown-toggle" type="button"
data-bs-toggle="dropdown" aria-expanded="false">
<i class="bi bi-list"></i>
</button>
<ul class="dropdown-menu dropdown-menu-end" style="max-height: 300px; overflow-y: auto;">
${Object.entries(predefinedSpecs).map(([category, items]) => `
<li><h6 class="dropdown-header">${category}</h6></li>
${items.map(item => `
<li>
<button class="dropdown-item" type="button" onclick="selectPredefinedSpec('${item}')">
${item}
</button>
</li>
`).join('')}
`).join('')}
</ul>
</div>
</div>
<div class="mb-3">
<label for="specValue" class="form-label required">Значение</label>
<input type="text" class="form-control" id="specValue"
placeholder="Введите значение" value="${oldValue || ''}">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<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>
</div>
<div class="modal-body">
<!-- Название -->
<div class="mb-3">
<label class="form-label required">Название характеристики</label>
<div class="input-group">
<input type="text" class="form-control" id="specName"
value="${oldKey || ''}" 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"
style="max-height:300px;overflow-y:auto;">
${buildSpecNameDropdown()}
</ul>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Отмена</button>
<button type="button" class="btn btn-primary" id="saveSpecBtn">${saveButtonText}</button>
<!-- Значение -->
<div class="mb-3">
<label class="form-label required">Значение</label>
<div class="input-group">
<input type="text" class="form-control" id="specValue"
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 class="modal-footer">
<button class="btn btn-secondary" data-bs-dismiss="modal">Отмена</button>
<button class="btn btn-primary" id="saveSpecBtn">${saveButtonText}</button>
</div>
</div>
`;
</div>
`;
document.body.appendChild(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) {
document.getElementById('specName').value = name;
updateValueDropdown(name);
};
// Обработчик сохранения
window.selectSpecValue = function (value) {
document.getElementById('specValue').value = value;
};
/* ---------- save ---------- */
specModal.querySelector('#saveSpecBtn').addEventListener('click', () => {
const name = document.getElementById('specName').value.trim();
const value = document.getElementById('specValue').value.trim();
if (!name) {
showError('Введите название характеристики');
return;
}
if (!name) return showError('Введите название характеристики');
if (!value) return showError('Введите значение характеристики');
if (!value) {
showError('Введите значение характеристики');
return;
}
// Если это режим редактирования и название изменилось, удаляем старую характеристику
if (isEditMode && oldKey !== name) {
delete specifications[oldKey];
}
// Добавляем/обновляем характеристику
specifications[name] = value;
updateSpecificationsList();
@@ -4881,11 +4966,8 @@ async function manageToolkit(toolkitData = null, categories = null, action = 'cr
}, 300);
});
// Очистка при закрытии
specModal.addEventListener('hidden.bs.modal', () => {
setTimeout(() => {
if (specModal.parentNode) specModal.remove();
}, 300);
setTimeout(() => specModal.remove(), 300);
});
bsSpecModal.show();