готов интерфейс профнастила, начата работа над 3д сеткой и евроштакетом

This commit is contained in:
Arsen Mirzaev Tatyano-Muradovich 2023-02-25 22:55:21 +10:00
parent ff6a646cbd
commit 26b5876513
8 changed files with 439 additions and 297 deletions

View File

@ -134,14 +134,11 @@ final class calculator_controller extends core
} }
/** /**
* Лазерная резка * Профнастил
* *
* HTML-код с калькулятором лазерной резки * HTML-код с калькулятором профнастила
* *
* @param array $vars Параметры * @param array $vars Параметры
*
* @todo 1. Заголовок калькулятора должен находиться внутри элемента калькулятора
* 2. Ограничение значений полей в зависимости от выбранной марки
*/ */
public function profnastil(array $vars = []): ?string public function profnastil(array $vars = []): ?string
{ {
@ -150,8 +147,6 @@ final class calculator_controller extends core
// Инициализация данных калькулятора // Инициализация данных калькулятора
$vars['calculators'] = ['profnastil' => [ $vars['calculators'] = ['profnastil' => [
'company' => settings::read('default_buyer', $vars['errors']['calculators']),
'complexity' => settings::read('default_complexity', $vars['errors']['calculators']),
'width' => (int) round((float) settings::read('default_width', $vars['errors']['calculators'])), 'width' => (int) round((float) settings::read('default_width', $vars['errors']['calculators'])),
'height' => (int) round((float) settings::read('default_height', $vars['errors']['calculators'])), 'height' => (int) round((float) settings::read('default_height', $vars['errors']['calculators'])),
'length' => (int) round((float) settings::read('default_length', $vars['errors']['calculators'])), 'length' => (int) round((float) settings::read('default_length', $vars['errors']['calculators'])),
@ -165,6 +160,60 @@ final class calculator_controller extends core
return $this->view->render(DIRECTORY_SEPARATOR . 'calculators' . DIRECTORY_SEPARATOR . 'profnastil.html', $vars); return $this->view->render(DIRECTORY_SEPARATOR . 'calculators' . DIRECTORY_SEPARATOR . 'profnastil.html', $vars);
} }
/**
* 3D-сетка
*
* HTML-код с калькулятором 3D-сетки
*
* @param array $vars Параметры
*/
public function setka(array $vars = []): ?string
{
// Инициализация журнала ошибок
$vars['errors'] = ['calculators' => []];
// Инициализация данных калькулятора
$vars['calculators'] = ['profnastil' => [
'width' => (int) round((float) settings::read('default_width', $vars['errors']['calculators'])),
'height' => (int) round((float) settings::read('default_height', $vars['errors']['calculators'])),
'length' => (int) round((float) settings::read('default_length', $vars['errors']['calculators'])),
'amount' => (int) round((float) settings::read('default_amount', $vars['errors']['calculators'])),
'type' => settings::read('default_type', $vars['errors']['calculators']),
'holes' => (int) round((float) settings::read('default_holes', $vars['errors']['calculators'])),
'diameter' => (float) settings::read('default_diameter', $vars['errors']['calculators'])
]];
// Генерация представления
return $this->view->render(DIRECTORY_SEPARATOR . 'calculators' . DIRECTORY_SEPARATOR . 'setka.html', $vars);
}
/**
* Евроштакет
*
* HTML-код с калькулятором евроштакета
*
* @param array $vars Параметры
*/
public function evroshtaket(array $vars = []): ?string
{
// Инициализация журнала ошибок
$vars['errors'] = ['calculators' => []];
// Инициализация данных калькулятора
$vars['calculators'] = ['profnastil' => [
'width' => (int) round((float) settings::read('default_width', $vars['errors']['calculators'])),
'height' => (int) round((float) settings::read('default_height', $vars['errors']['calculators'])),
'length' => (int) round((float) settings::read('default_length', $vars['errors']['calculators'])),
'amount' => (int) round((float) settings::read('default_amount', $vars['errors']['calculators'])),
'type' => settings::read('default_type', $vars['errors']['calculators']),
'holes' => (int) round((float) settings::read('default_holes', $vars['errors']['calculators'])),
'diameter' => (float) settings::read('default_diameter', $vars['errors']['calculators'])
]];
// Генерация представления
return $this->view->render(DIRECTORY_SEPARATOR . 'calculators' . DIRECTORY_SEPARATOR . 'evroshtaket.html', $vars);
}
/** /**
* Расчёт * Расчёт
* *

View File

@ -1,96 +1,92 @@
'use strict'; "use strict";
let calculator = { const calculator = {
index: document.getElementById("calculator"), index: document.getElementById("calculator"),
calculators: [], calculators: [],
account: [], account: [],
settings: { settings: {
defaults: { defaults: {
buyer: 'individual', },
complexity: 'medium',
}
}, },
init() { init() {
// Инициализация калькулятора // Инициализация калькулятора
this.generate.buyer(this.settings.defaults.buyer) this.generate.menu()
.then( .then(
success => { () => {
this.generate.complexity(this.settings.defaults.complexity) this.authenticate(cookie.read("id"))
.then( .then(
success => { (success) => {
this.generate.menu() // Запись данных аккаунта
.then( this.account = success;
success => {
this.authenticate(cookie.read('id'))
.then(
success => {
// Запись данных аккаунта
this.account = success;
if (this.account !== undefined && typeof this.account === 'object' && this.account.permissions !== undefined) { if (
// Найден аккаунт this.account !== undefined &&
typeof this.account === "object" &&
this.account.permissions !== undefined
) {
// Найден аккаунт
if (this.account.permissions.calculate == 1) { if (this.account.permissions.calculate == 1) {
// Разрешено использовать калькулятор // Разрешено использовать калькулятор
this.generate.result(); this.generate.result();
} }
} }
} },
);
}
);
}
); );
} },
); );
console.log('[КАЛЬКУЛЯТОР] Инициализирован'); console.log("[КАЛЬКУЛЯТОР] Инициализирован");
}, },
authenticate(id) { async authenticate(id) {
// Запрос и генерация HTML с данными о типе покупателя (юр. лицо и физ. лицо)' // Запрос и генерация HTML с данными о типе покупателя (юр. лицо и физ. лицо)'
return fetch('/account/data?id=' + id, { return await fetch("/account/data?id=" + id, {
method: "POST", method: "POST",
headers: { "content-type": "application/x-www-form-urlencoded" } headers: { "content-type": "application/x-www-form-urlencoded" },
}).then((response) => { }).then((response) => {
if (response.status === 200) { if (response.status === 200) {
return response.json().then( return response.json().then(
success => { (success) => {
console.log('[КАЛЬКУЛЯТОР] Загружены данные пользователя: ' + id); console.log("[КАЛЬКУЛЯТОР] Загружены данные пользователя: " + id);
return success; return success;
}, },
error => { () => {
console.log('[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось загрузить данные пользователя: ' + id); console.log(
} "[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось загрузить данные пользователя: " +
id,
);
},
); );
} }
}); });
}, },
calculate() { async calculate() {
// Запрос и генерация HTML с данными о рассчете со всех калькуляторов // Запрос и генерация HTML с данными о рассчете со всех калькуляторов
// Инициализация параметров // Инициализация параметров
let cutting = document.getElementById('cutting'); const cutting = document.getElementById("cutting");
let discount = document.getElementById('discount'); const discount = document.getElementById("discount");
// Инициализация буфера запроса // Инициализация буфера запроса
let query = { const query = {
calculators: {}, calculators: {},
cutting: +cutting.value ?? 0, cutting: +cutting.value ?? 0,
discount: +discount.value ?? 0 discount: +discount.value ?? 0,
}; };
for (const number in this.calculators) { for (const number in this.calculators) {
// Перебор калькуляторов // Перебор калькуляторов
// Инициализация буфера запроса для нового калькулятора // Инициализация буфера запроса для нового калькулятора
query['calculators'][number] = {}; query["calculators"][number] = {};
// Инициализация типа калькулятора // Инициализация типа калькулятора
query['calculators'][number]['calculator'] = this.calculators[number].getAttribute('data-calculator'); query["calculators"][number]["calculator"] = this.calculators[number]
.getAttribute("data-calculator");
for (const buyer of this.index.querySelectorAll('input[name="buyer"]')) { for (const buyer of this.index.querySelectorAll('input[name="buyer"]')) {
// Перебор полей с параметрами типа заказчика // Перебор полей с параметрами типа заказчика
@ -99,51 +95,69 @@ let calculator = {
// Найдено выбранное поле // Найдено выбранное поле
// Запись в буфер запроса // Запись в буфер запроса
query['calculators'][number]['buyer'] = buyer.value; query["calculators"][number]["buyer"] = buyer.value;
} }
} }
for (const complexity of this.index.querySelectorAll('input[name="complexity"]')) { for (
const complexity of this.index.querySelectorAll(
'input[name="complexity"]',
)
) {
// Перебор полей с параметрами сложности // Перебор полей с параметрами сложности
if (complexity.checked) { if (complexity.checked) {
// Найдено выбранное поле // Найдено выбранное поле
// Запись в буфер запроса // Запись в буфер запроса
query['calculators'][number]['complexity'] = complexity.value; query["calculators"][number]["complexity"] = complexity.value;
} }
} }
for (const field of this.calculators[number].querySelectorAll('[data-calculator-parameter]')) { for (
const field of this.calculators[number].querySelectorAll(
"[data-calculator-parameter]",
)
) {
// Перебор полей с параметрами // Перебор полей с параметрами
if (field.getAttribute('type') === 'checkbox') { if (field.getAttribute("type") === "checkbox") {
// Флажок // Флажок
// Запись в буфер запроса // Запись в буфер запроса
query['calculators'][number][field.getAttribute('data-calculator-parameter')] = field.checked; query["calculators"][number][
} else if (field.getAttribute('type') === 'text' || field.getAttribute('type') === 'number' || field.getAttribute('type') === 'range') { field.getAttribute("data-calculator-parameter")
] = field.checked;
} else if (
field.getAttribute("type") === "text" ||
field.getAttribute("type") === "number" ||
field.getAttribute("type") === "range"
) {
// Текстовое, цифровое поле или ползунок // Текстовое, цифровое поле или ползунок
// Запись в буфер запроса // Запись в буфер запроса
query['calculators'][number][field.getAttribute('data-calculator-parameter')] = field.value; query["calculators"][number][
field.getAttribute("data-calculator-parameter")
] = field.value;
} else { } else {
// Элемент с тегом <select> (подразумевается) // Элемент с тегом <select> (подразумевается)
// Запись в буфер запроса // Запись в буфер запроса
query['calculators'][number][field.getAttribute('data-calculator-parameter')] = field.value ?? field.options[field.selectedIndex].text; query["calculators"][number][
field.getAttribute("data-calculator-parameter")
] = field.value ?? field.options[field.selectedIndex].text;
} }
} }
} }
return fetch('/calculator/calculate', { return await fetch("/calculator/calculate", {
method: "POST", method: "POST",
headers: { "content-type": "application/json" }, headers: { "content-type": "application/json" },
body: JSON.stringify(query) body: JSON.stringify(query),
}).then((response) => { }).then((response) => {
if (response.status === 200) { if (response.status === 200) {
response.json().then( response.json().then(
success => { (success) => {
// Инициализация буфера расходов // Инициализация буфера расходов
let expenses = 0; let expenses = 0;
@ -154,7 +168,7 @@ let calculator = {
// Найдены ошибки // Найдены ошибки
// Генерация текста ответа // Генерация текста ответа
result = 'Ошибка'; result = "Ошибка";
} else { } else {
// Не найдены ошибки // Не найдены ошибки
@ -163,10 +177,11 @@ let calculator = {
// Запись полученных данных // Запись полученных данных
cutting.value = success.other.cutting; cutting.value = success.other.cutting;
cutting.parentElement.children[0].innerText = 'Длина реза 1 детали (' + cutting.value + 'мм)'; cutting.parentElement.children[0].innerText =
"Длина реза 1 детали (" + cutting.value + "мм)";
// Разблокировка параметра // Разблокировка параметра
cutting.removeAttribute('disabled'); cutting.removeAttribute("disabled");
} }
if (success.other.discount !== undefined) { if (success.other.discount !== undefined) {
@ -174,14 +189,15 @@ let calculator = {
// Запись полученных данных // Запись полученных данных
discount.value = success.other.discount; discount.value = success.other.discount;
discount.parentElement.children[0].innerText = 'Скидка (' + discount.value + '%)'; discount.parentElement.children[0].innerText = "Скидка (" +
discount.value + "%)";
} }
for (const [, machine] of Object.entries(success.machines)) { for (const [, machine] of Object.entries(success.machines)) {
// Перебор станков // Перебор станков
// Прибавление данных станка к буферу расходов // Прибавление данных станка к буферу расходов
expenses += (machine.electricity + (machine.metal ?? 0)); expenses += machine.electricity + (machine.metal ?? 0);
// Прибавление амортизации к буферу вывода // Прибавление амортизации к буферу вывода
expenses += machine.reprocessing ?? 0; expenses += machine.reprocessing ?? 0;
@ -208,7 +224,8 @@ let calculator = {
// Перебор операторов // Перебор операторов
// Прибавление данных оператора к буферу расходов // Прибавление данных оператора к буферу расходов
expenses += (operator.time.design + operator.time.machine) * operator.hour; expenses += (operator.time.design + operator.time.machine) *
operator.hour;
} }
for (const [, handyman] of Object.entries(success.handymans)) { for (const [, handyman] of Object.entries(success.handymans)) {
@ -237,124 +254,102 @@ let calculator = {
expenses = expenses.toFixed(2); expenses = expenses.toFixed(2);
// Генерация текста ответа // Генерация текста ответа
result = expenses + ' рублей'; result = expenses + " рублей";
} }
if (this.generate.result(result)) { if (this.generate.result(result)) {
console.log(`[КАЛЬКУЛЯТОР] Сгенерирован результат: ${expenses} рублей`); console.log(
`[КАЛЬКУЛЯТОР] Сгенерирован результат: ${expenses} рублей`,
);
} else { } else {
console.log('[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось сгенерировать результат'); console.log(
"[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось сгенерировать результат",
);
} }
}, },
error => { () => {
console.log('[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось сгенерировать результат'); console.log(
}); "[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось сгенерировать результат",
);
},
);
} }
}); });
}, },
generate: { generate: {
buyer(value = 'individual') { async menu() {
// Запрос и генерация HTML с данными о типе покупателя (юр. лицо и физ. лицо)
return fetch('/calculator/generate/buyer?value=' + value, {
method: "POST",
headers: { "content-type": "application/x-www-form-urlencoded" }
}).then((response) => {
if (response.status === 200) {
response.text().then(
success => {
calculator.index.insertAdjacentHTML('beforeend', success);
console.log('[КАЛЬКУЛЯТОР] Загружен элемент с кнопками выбора типа покупателя');
},
error => {
console.log('[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось загрузить элемент с кнопками выбора типа покупателя');
});
}
});
},
complexity(value = 'medium') {
// Запрос и генерация HTML с данными о сложности работы
return fetch('/calculator/generate/complexity?value=' + value, {
method: "POST",
headers: { "content-type": "application/x-www-form-urlencoded" }
}).then((response) => {
if (response.status === 200) {
response.text().then(
success => {
calculator.index.insertAdjacentHTML('beforeend', success);
console.log('[КАЛЬКУЛЯТОР] Загружен элемент с кнопками выбора сложности');
},
error => {
console.log('[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось загрузить элемент с кнопками выбора сложности');
});
}
});
},
menu() {
// Запрос и генерация HTML с кнопками добавления калькулятора // Запрос и генерация HTML с кнопками добавления калькулятора
return fetch('/calculator/generate/menu', { return await fetch("/calculator/generate/menu", {
method: "POST", method: "POST",
headers: { "content-type": "application/x-www-form-urlencoded" } headers: { "content-type": "application/x-www-form-urlencoded" },
}).then((response) => { }).then((response) => {
if (response.status === 200) { if (response.status === 200) {
response.text().then( response.text().then(
success => { (success) => {
calculator.index.insertAdjacentHTML('beforeend', success); calculator.index.insertAdjacentHTML("beforeend", success);
console.log('[КАЛЬКУЛЯТОР] Загружен элемент с кнопками добавления калькулятора'); console.log(
"[КАЛЬКУЛЯТОР] Загружен элемент с кнопками добавления калькулятора",
);
}, },
error => { () => {
console.log('[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось загрузить элемент с кнопками добавления калькулятора'); console.log(
}); "[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось загрузить элемент с кнопками добавления калькулятора",
);
},
);
} }
}); });
}, },
fence(element, type = 1) { async fence(element, type = 1) {
// Генерация полей с выбором типа забора // Генерация полей с выбором типа забора
return fetch('/calculator/generate/fence?type=' + type, { return await fetch("/calculator/generate/fence?type=" + type, {
method: "POST", method: "POST",
headers: { "content-type": "application/x-www-form-urlencoded" } headers: { "content-type": "application/x-www-form-urlencoded" },
}).then((response) => { }).then((response) => {
if (response.status === 200) { if (response.status === 200) {
response.text().then( response.text().then(
success => { (success) => {
// Поиск оболочки списка // Поиск оболочки списка
let wrap = element.querySelectorAll('select[name="fence"]')[0]; const wrap = element.querySelectorAll('select[name="fence"]')[0];
// Запись полученного списка в оболочку // Запись полученного списка в оболочку
wrap.parentElement.parentElement.insertAdjacentHTML('afterend', success); wrap.parentElement.parentElement.insertAdjacentHTML(
"afterend",
success,
);
// Удаление старого списка // Удаление старого списка
if (wrap !== undefined) wrap.parentElement.parentElement.remove(); if (wrap !== undefined) wrap.parentElement.parentElement.remove();
console.log('[КАЛЬКУЛЯТОР] Загружен список с типами забора'); console.log("[КАЛЬКУЛЯТОР] Загружен список с типами забора");
}, },
error => { () => {
console.log('[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось загрузить список с типами забора'); console.log(
}); "[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось загрузить список с типами забора",
);
},
);
} }
}); });
}, },
divider(element, position) { async divider(element, position) {
// Запрос и генерация HTML с данными о результате калькуляции // Запрос и генерация HTML с данными о результате калькуляции
return fetch('/calculator/generate/divider', { return await fetch("/calculator/generate/divider", {
method: "POST", method: "POST",
headers: { "content-type": "application/x-www-form-urlencoded" } headers: { "content-type": "application/x-www-form-urlencoded" },
}).then((response) => { }).then((response) => {
if (response.status === 200) { if (response.status === 200) {
response.text().then( response.text().then(
success => { (success) => {
if (element === undefined || position === undefined) { if (element === undefined || position === undefined) {
// Не задан элемент и позиция добавляемого разделителя // Не задан элемент и позиция добавляемого разделителя
// Запись разделителя в конце калькулятора // Запись разделителя в конце калькулятора
calculator.index.insertAdjacentHTML('beforeend', success); calculator.index.insertAdjacentHTML("beforeend", success);
} else { } else {
// Задан элемент и позиция добавляемого разделителя // Задан элемент и позиция добавляемого разделителя
@ -362,32 +357,40 @@ let calculator = {
element.insertAdjacentHTML(position, success); element.insertAdjacentHTML(position, success);
} }
console.log('[КАЛЬКУЛЯТОР] Загружен разделитель'); console.log("[КАЛЬКУЛЯТОР] Загружен разделитель");
}, },
error => { () => {
console.log('[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось загрузить разделитель'); console.log(
}); "[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось загрузить разделитель",
);
},
);
} }
}); });
}, },
result(expenses) { result(expenses) {
// Запрос и генерация HTML с данными о результате калькуляции // Запрос и генерация HTML с данными о результате калькуляции
function request() { async function request() {
return fetch('/calculator/generate/result', { return await fetch("/calculator/generate/result", {
method: "POST", method: "POST",
headers: { "content-type": "application/x-www-form-urlencoded" } headers: { "content-type": "application/x-www-form-urlencoded" },
}).then((response) => { }).then((response) => {
if (response.status === 200) { if (response.status === 200) {
response.text().then( response.text().then(
success => { (success) => {
calculator.index.insertAdjacentHTML('beforeend', success); calculator.index.insertAdjacentHTML("beforeend", success);
console.log('[КАЛЬКУЛЯТОР] Загружен элемент с данными о результате калькуляции'); console.log(
"[КАЛЬКУЛЯТОР] Загружен элемент с данными о результате калькуляции",
);
}, },
error => { () => {
console.log('[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось загрузить элемент с данными о результате калькуляции'); console.log(
}); "[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось загрузить элемент с данными о результате калькуляции",
);
},
);
} }
}); });
} }
@ -401,7 +404,7 @@ let calculator = {
// Переданы расходы // Переданы расходы
// Инициализация элемента // Инициализация элемента
let element = document.getElementById('calculate'); const element = document.getElementById("calculate");
if (element == null) { if (element == null) {
// Не найден элемент с результатом расчёта // Не найден элемент с результатом расчёта
@ -424,11 +427,11 @@ let calculator = {
// Инициализация количества обработанных ошибок // Инициализация количества обработанных ошибок
let amount = 0; let amount = 0;
if (typeof errors === 'object') { if (typeof errors === "object") {
// Передан массив с ошибками и он является массивом // Передан массив с ошибками и он является массивом
// Инициализация буфера для проверки вложенности массива // Инициализация буфера для проверки вложенности массива
let first = Object.values(errors)[0]; const first = Object.values(errors)[0];
if (first !== undefined && first.text === undefined) { if (first !== undefined && first.text === undefined) {
// Найден массив с ошибками (категория) // Найден массив с ошибками (категория)
@ -439,10 +442,10 @@ let calculator = {
// Не найден массив с ошибками (подразумевается, что это и есть информация об ошибке) // Не найден массив с ошибками (подразумевается, что это и есть информация об ошибке)
// Инициализация элемента-оболочки // Инициализация элемента-оболочки
let list = document.getElementById('errors'); const list = document.getElementById("errors");
// Перезапись данных об ошибках // Перезапись данных об ошибках
list.innerText = ''; list.innerText = "";
// Проверка на наличие ошибок // Проверка на наличие ошибок
if (errors.length === 0) return false; if (errors.length === 0) return false;
@ -454,22 +457,22 @@ let calculator = {
// Перебор станков // Перебор станков
// Инициализация элемента-заголовка // Инициализация элемента-заголовка
let term = document.createElement('dt'); const term = document.createElement("dt");
// Запись содержимого // Запись содержимого
term.innerText = error.text; term.innerText = error.text;
// Инициализация элемента-описания // Инициализация элемента-описания
let definition = document.createElement('dd'); const definition = document.createElement("dd");
// Запись содержимого // Запись содержимого
definition.innerText = error.file + ' в строке ' + error.line; definition.innerText = error.file + " в строке " + error.line;
// input.setAttribute('id', element.id); // input.setAttribute('id', element.id);
// Запись в список // Запись в список
list.insertAdjacentElement('beforeend', term); list.insertAdjacentElement("beforeend", term);
list.insertAdjacentElement('beforeend', definition); list.insertAdjacentElement("beforeend", definition);
// Добавление к счётчику обработанных ошибок // Добавление к счётчику обработанных ошибок
++amount; ++amount;
@ -481,88 +484,105 @@ let calculator = {
return amount; return amount;
}, },
calculators: { calculators: {
profnastil() { async profnastil() {
// Запрос и генерация HTML с калькулятором лазерной резки // Запрос и генерация HTML с калькулятором лазерной резки
function write(target, position, html) { function write(target, position, html) {
if (target === undefined || position === undefined || html === undefined) return false; if (
target === undefined || position === undefined || html === undefined
) return false;
// Запись калькулятора после последнего калькулятора // Запись калькулятора после последнего калькулятора
target.insertAdjacentHTML(position, html); target.insertAdjacentHTML(position, html);
// Поиск калькуляторов // Поиск калькуляторов
let calculators = calculator.index.querySelectorAll('section[data-calculator]'); const calculators = calculator.index.querySelectorAll(
"section[data-calculator]",
);
// Инициализация идентификатора калькулятора // Инициализация идентификатора калькулятора
let id = calculators.length - 1; const id = calculators.length - 1;
// Запись калькулятору его идентификатора // Запись калькулятору его идентификатора
calculators[id].id = 'profnastil_' + id; calculators[id].id = "profnastil_" + id;
// Запись в реестр последнего калькулятора (подразумевается, что он новый и только что был записан) // Запись в реестр последнего калькулятора (подразумевается, что он новый и только что был записан)
calculator.calculators.push(calculators[id]); calculator.calculators.push(calculators[id]);
// Запись в журнал // Запись в журнал
console.log('[КАЛЬКУЛЯТОР] Инициализирован калькулятор лазерной резки'); console.log(
"[КАЛЬКУЛЯТОР] Инициализирован калькулятор лазерной резки",
);
} }
return fetch('/calculator/generate/profnastil', { return await fetch("/calculator/generate/profnastil", {
method: "POST", method: "POST",
headers: { "content-type": "application/x-www-form-urlencoded" } headers: { "content-type": "application/x-www-form-urlencoded" },
}).then((response) => { }).then((response) => {
if (response.status === 200) { if (response.status === 200) {
response.text().then( response.text().then(
success => { (success) => {
// Поиск последнего калькулятора // Поиск последнего калькулятора
let last = calculator.calculators[calculator.calculators.length - 1]; const last =
calculator.calculators[calculator.calculators.length - 1];
if (last !== undefined && last !== null) { if (last !== undefined && last !== null) {
// Найден калькулятор // Найден калькулятор
// Инициализация разделителя перед меню // Инициализация разделителя перед калькулятором
calculator.generate.divider(last, 'afterend').then(divider => write(last, 'afterend', success)); calculator.generate.divider(last, "afterend").then(
() => write(last, "afterend", success),
);
} else { } else {
// Не найден калькулятор // Не найден калькулятор
calculator.generate.divider(menu, 'beforebegin').then( calculator.generate.divider(menu, "beforebegin").then(
first => { () => {
// Поиск меню // Поиск меню
let menu = document.getElementById("menu"); const menu = document.getElementById("menu");
if (menu !== null) { if (menu !== null) {
// Найдено меню // Найдено меню
// Инициализация разделителя перед меню // Инициализация разделителя перед меню
calculator.generate.divider(menu, 'beforebegin').then(divider => write(menu, 'beforebegin', success)); write(menu, "beforebegin", success)
} else { } else {
// Не найдено меню // Не найдено меню
// Поиск результатов калькуляции // Поиск результатов калькуляции
let result = document.getElementById("result"); const result = document.getElementById("result");
if (result !== null) { if (result !== null) {
// Найден элемент с результатами калькуляции // Найден элемент с результатами калькуляции
// Инициализация разделителя перед меню // Инициализация разделителя перед меню
calculator.generate.divider(result, 'beforebegin').then(result => write(result, 'beforebegin', success)); calculator.generate.divider(result, "beforebegin")
.then((result) =>
write(result, "beforebegin", success)
);
} else { } else {
// Не найден элемент с результатами калькуляции // Не найден элемент с результатами калькуляции
// Инициализация разделителя перед меню // Инициализация разделителя перед меню
calculator.generate.divider().then(result => write(calculator.index, 'beforeend', success)); calculator.generate.divider().then(() =>
write(calculator.index, "beforeend", success)
);
} }
} }
} },
); );
} }
}, },
error => { () => {
// Запись в журнал // Запись в журнал
console.log('[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось инициализировать калькулятор лазерной резки'); console.log(
}); "[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось инициализировать калькулятор лазерной резки",
);
},
);
} }
}); });
} },
} },
} },
}; };

View File

@ -2,8 +2,7 @@
<label>Забор</label> <label>Забор</label>
<div> <div>
<select name="fence" data-calculator-parameter="fence" title="Тип забора"> <select name="fence" data-calculator-parameter="fence" title="Тип забора">
<option value="1">Сплошной</option> <option value="1">???</option>
<option value="2">Секционный</option>
</select> </select>
</div> </div>
</div> </div>

View File

@ -2,7 +2,8 @@
<label>Забор</label> <label>Забор</label>
<div> <div>
<select name="fence" data-calculator-parameter="fence" title="Тип забора"> <select name="fence" data-calculator-parameter="fence" title="Тип забора">
<option value="1">???</option> <option value="1">Сплошной</option>
<option value="2">Секционный</option>
</select> </select>
</div> </div>
</div> </div>

View File

@ -1,6 +1,14 @@
<section id="menu" class="unselectable"> <section id="menu" class="unselectable">
<a type="button" onclick="calculator.generate.calculators.profnastil(); return false;"> <a type="button" onclick="calculator.generate.calculators.profnastil(); return false;">
<img src="/img/laser.png" title="Расчитать профнастил"> <img src="" title="Расчитать профнастил">
Профнастил Профнастил
</a> </a>
<a type="button" onclick="calculator.generate.calculators.setka(); return false;">
<img src="" title="Расчитать 3D-сетку">
3D-сетка
</a>
<a type="button" onclick="calculator.generate.calculators.evroshtaket); return false;">
<img src="" title="Расчитать евроштакет">
Евроштакет
</a>
</section> </section>

View File

@ -1,99 +1,97 @@
<h3>Лазерная резка <span title="Удалить"></span></h3> <h3>Забор из профнастила<span title="Удалить"></span></h3>
<section class="calculator" data-calculator="laser"> <section class="calculator" data-calculator="laser">
<div> <div>
<label>Тип</label> <label>Тип</label>
<div>
<select name="type" data-calculator-parameter="type" title="Тип профнастила">
<option value="c8">C8</option>
<option value="c10">C10</option>
<option value="hc21">HC21</option>
</select>
</div>
</div>
<div>
<label>Цвет каркаса</label>
<div>
<select name="base_color" data-calculator-parameter="base_color" title="Цвет">
<option value="chocolate">Шоколад</option>
<option value="graphite">Графит</option>
<option value="green_moss">Зелёный мох</option>
</select>
</div>
</div>
<div>
<label>Каркас</label>
<div>
<select name="base" data-calculator-parameter="base" title="Каркас" onchange="calculator.generate.fence(this.parentElement.parentElement.parentElement, this.value)">
<option value="1">Профильная труба</option>
<option value="2">П-образный профиль</option>
</select>
</div>
</div>
{% include 'calculators/elements/fences/1.html' %}
<div>
<label>Цвет забора</label>
<div>
<select name="fence_color" data-calculator-parameter="fence_color" title="Цвет">
<option value="chocolate">Шоколад</option>
<option value="graphite">Графит</option>
<option value="green_moss">Зелёный мох</option>
</select>
</div>
</div>
<div> <div>
<label>Размер</label> <select name="type" data-calculator-parameter="type" title="Выбор типа профнастила">
<div> <option value="c8">C8</option>
<input data-calculator-parameter="width" type="number" class="measured" title="Длина детали" <option value="c10">C10</option>
value="{{ calculators.laser.width }}" min="{{ calculators.laser.width.min ?? 1 }}" <option value="hc21">HC21</option>
max="{{ calculators.laser.width.max ?? 3000 }}"> </select>
<span class="unit unselectable">мм</span>
<small>x</small>
<input data-calculator-parameter="height" type="number" class="measured" title="Ширина детали"
value="{{ calculators.laser.height }}" min="{{ calculators.laser.height.min ?? 1 }}"
max="{{ calculators.laser.height.max ?? 3000 }}">
<span class="unit unselectable">мм</span>
<small>x</small>
<input data-calculator-parameter="length" type="number" class="measured" title="Толщина детали"
value="{{ calculators.laser.length }}" min="{{ calculators.laser.length.min ?? 1 }}"
max="{{ calculators.laser.length.max ?? 20 }}">
<span class="unit unselectable">мм</span>
</div>
</div> </div>
</div>
<div>
<label>Цвет каркаса</label>
<div> <div>
<label>Отверстия</label> <select name="base_color" data-calculator-parameter="base_color" title="Выбор цвета каркаса">
<div> <option value="chocolate">Шоколад</option>
<input data-calculator-parameter="holes" type="number" class="measured" title="Количество отверстий" <option value="graphite">Графит</option>
value="{{ calculators.laser.holes }}" min="{{ calculators.laser.holes.min ?? 0 }}" <option value="green_moss">Зелёный мох</option>
max="{{ calculators.laser.holes.max ?? 100 }}"> </select>
<span class="unit unselectable">шт</span>
<small>x</small>
<input data-calculator-parameter="diameter" type="number" class="measured" title="Диаметр отверстий"
value="{{ calculators.laser.diameter }}" min="{{ calculators.laser.diameter.min ?? 0 }}"
max="{{ calculators.laser.diameter.max ?? 100 }}">
<span class="unit unselectable">мм</span>
</div>
</div> </div>
</div>
<div>
<label>Каркас</label>
<div> <div>
<label>Количество</label> <select name="base" data-calculator-parameter="base" title="Выбор каркаса" onchange="calculator.generate.fence(this.parentElement.parentElement.parentElement, this.value)">
<div> <option value="1">Профильная труба</option>
<input data-calculator-parameter="amount" type="number" class="measured" title="Количество изделий" <option value="2">П-образный профиль</option>
value="{{ calculators.laser.amount }}" min="{{ calculators.laser.amount.min ?? 1 }}" </select>
max="{{ calculators.laser.amount.max ?? 10000 }}">
<span class="unit unselectable">шт</span>
</div>
</div> </div>
</div>
{% include 'calculators/elements/fences/1.html' %}
<div>
<label>Цвет профнастила</label>
<div> <div>
<label for="our">Наш металл</label> <select name="fence_color" data-calculator-parameter="fence_color" title="Выбор цвета профнастила">
<div> <option value="chocolate">Шоколад</option>
<input data-calculator-parameter="our" type="checkbox" title="Используется наш металл" checked> <option value="graphite">Графит</option>
</div> <option value="green_moss">Зелёный мох</option>
</select>
</div> </div>
</div>
<div>
<label>Тип монтажа</label>
<div>
<select name="mounting" data-calculator-parameter="mounting" title="Выбор типа монтажа">
<option value="ground">В грунт</option>
<option value="piles">На сваи/бетон</option>
</select>
</div>
</div>
<div>
<label>Высота</label>
<div>
<select name="height" data-calculator-parameter="height" title="Высота">
<option value="1800">1800мм</option>
<option value="2000">2000мм</option>
</select>
</div>
</div>
<div>
<label>Длина</label>
<div>
<input data-calculator-parameter="length" type="number" class="measured" title="Длина детали"
value="{{ calculators.profnastil.length.default ?? 1 }}" min="{{ calculators.profnastil.length.min ?? 1 }}"
max="{{ calculators.profnastil.length.max ?? 3000 }}">
<span class="unit unselectable">м</span>
</div>
</div>
<div>
<label>Калитки</label>
<div>
<input data-calculator-parameter="wickets" type="number" class="measured" title="Количество калиток"
value="{{ calculators.profnastil.wickets.default ?? 0 }}" min="{{ calculators.profnastil.wickets.min ?? 0 }}"
max="{{ calculators.profnastil.wickets.max ?? 100 }}">
<span class="unit unselectable">шт</span>
</div>
</div>
<div>
<label>Ворота</label>
<div>
<input data-calculator-parameter="gates" type="number" class="measured" title="Количество ворот"
value="{{ calculators.profnastil.gates.default ?? 0 }}" min="{{ calculators.profnastil.gates.min ?? 0 }}"
max="{{ calculators.profnastil.gates.max ?? 100 }}">
<span class="unit unselectable">шт</span>
</div>
</div>
</section> </section>

View File

@ -0,0 +1,83 @@
<h3>Забор из профнастила<span title="Удалить"></span></h3>
<section class="calculator" data-calculator="laser">
<div>
<label>Тип</label>
<div>
<select name="type" data-calculator-parameter="type" title="Выбор типа сетки">
<option value="light">light</option>
<option value="medium">medium</option>
<option value="optima">optima</option>
</select>
</div>
</div>
<div>
<label>Цвет сетки</label>
<div>
<select name="fence_color" data-calculator-parameter="fence_color" title="Выбор цвета сетки">
<option value="graphite">Графит</option>
<option value="green_moss">Зелёный мох</option>
</select>
</div>
</div>
<div>
<label>Тип крепления</label>
<div>
<select name="fastening" data-calculator-parameter="fastening" title="Выбор типа крепления">
<option value="brace">Скоба</option>
<option value="collar">Хомут</option>
</select>
</div>
</div>
<div>
<label>Тип монтажа</label>
<div>
<select name="mounting" data-calculator-parameter="mounting" title="Выбор типа монтажа">
<option value="ground">В грунт</option>
<option value="piles">На сваи/бетон</option>
</select>
</div>
</div>
<div>
<label>Высота</label>
<div>
<select name="height" data-calculator-parameter="height" title="Высота">
<option value="1800">1800мм</option>
<option value="2000">2000мм</option>
</select>
</div>
</div>
<div>
<label>Длина</label>
<div>
<input data-calculator-parameter="length" type="number" class="measured" title="Длина детали"
value="{{ calculators.profnastil.length.default ?? 1 }}" min="{{ calculators.profnastil.length.min ?? 1 }}"
max="{{ calculators.profnastil.length.max ?? 3000 }}">
<span class="unit unselectable">м</span>
</div>
</div>
<div>
<label>Калитки</label>
<div>
<input data-calculator-parameter="wickets" type="number" class="measured" title="Количество калиток"
value="{{ calculators.profnastil.wickets.default ?? 0 }}" min="{{ calculators.profnastil.wickets.min ?? 0 }}"
max="{{ calculators.profnastil.wickets.max ?? 100 }}">
<span class="unit unselectable">шт</span>
</div>
</div>
<div>
<label>Ворота</label>
<div>
<input data-calculator-parameter="gates" type="number" class="measured" title="Количество ворот"
value="{{ calculators.profnastil.gates.default ?? 0 }}" min="{{ calculators.profnastil.gates.min ?? 0 }}"
max="{{ calculators.profnastil.gates.max ?? 100 }}">
<span class="unit unselectable">шт</span>
</div>
</div>
</section>

View File

@ -1,16 +0,0 @@
<?xml version="1.0"?>
<psalm
errorLevel="7"
resolveFromConfigFile="true"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="https://getpsalm.org/schema/config"
xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
findUnusedBaselineEntry="true"
>
<projectFiles>
<directory name="mirzaev/zkmr/calculator/system" />
<ignoreFiles>
<directory name="vendor" />
</ignoreFiles>
</projectFiles>
</psalm>