Обновление списка подготовленных параметров
This commit is contained in:
+160
-78
@@ -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,47 +4803,65 @@ 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>
|
||||
<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>
|
||||
<label 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">
|
||||
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;">
|
||||
${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 class="dropdown-menu dropdown-menu-end"
|
||||
style="max-height:300px;overflow-y:auto;">
|
||||
${buildSpecNameDropdown()}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Значение -->
|
||||
<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"
|
||||
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 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>
|
||||
<button class="btn btn-secondary" data-bs-dismiss="modal">Отмена</button>
|
||||
<button class="btn btn-primary" id="saveSpecBtn">${saveButtonText}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -4845,32 +4870,92 @@ async function manageToolkit(toolkitData = null, categories = null, action = 'cr
|
||||
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();
|
||||
|
||||
Reference in New Issue
Block a user