готов интерфейс профнастила, начата работа над 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 Параметры
*
* @todo 1. Заголовок калькулятора должен находиться внутри элемента калькулятора
* 2. Ограничение значений полей в зависимости от выбранной марки
*/
public function profnastil(array $vars = []): ?string
{
@ -150,8 +147,6 @@ final class calculator_controller extends core
// Инициализация данных калькулятора
$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'])),
'height' => (int) round((float) settings::read('default_height', $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);
}
/**
* 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,34 +1,30 @@
'use strict';
"use strict";
let calculator = {
const calculator = {
index: document.getElementById("calculator"),
calculators: [],
account: [],
settings: {
defaults: {
buyer: 'individual',
complexity: 'medium',
}
},
},
init() {
// Инициализация калькулятора
this.generate.buyer(this.settings.defaults.buyer)
.then(
success => {
this.generate.complexity(this.settings.defaults.complexity)
.then(
success => {
this.generate.menu()
.then(
success => {
this.authenticate(cookie.read('id'))
() => {
this.authenticate(cookie.read("id"))
.then(
success => {
(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) {
@ -37,60 +33,60 @@ let calculator = {
this.generate.result();
}
}
}
},
);
}
);
}
);
}
},
);
console.log('[КАЛЬКУЛЯТОР] Инициализирован');
console.log("[КАЛЬКУЛЯТОР] Инициализирован");
},
authenticate(id) {
async authenticate(id) {
// Запрос и генерация HTML с данными о типе покупателя (юр. лицо и физ. лицо)'
return fetch('/account/data?id=' + id, {
return await fetch("/account/data?id=" + id, {
method: "POST",
headers: { "content-type": "application/x-www-form-urlencoded" }
headers: { "content-type": "application/x-www-form-urlencoded" },
}).then((response) => {
if (response.status === 200) {
return response.json().then(
success => {
console.log('[КАЛЬКУЛЯТОР] Загружены данные пользователя: ' + id);
(success) => {
console.log("[КАЛЬКУЛЯТОР] Загружены данные пользователя: " + id);
return success;
},
error => {
console.log('[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось загрузить данные пользователя: ' + id);
}
() => {
console.log(
"[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось загрузить данные пользователя: " +
id,
);
},
);
}
});
},
calculate() {
async calculate() {
// Запрос и генерация HTML с данными о рассчете со всех калькуляторов
// Инициализация параметров
let cutting = document.getElementById('cutting');
let discount = document.getElementById('discount');
const cutting = document.getElementById("cutting");
const discount = document.getElementById("discount");
// Инициализация буфера запроса
let query = {
const query = {
calculators: {},
cutting: +cutting.value ?? 0,
discount: +discount.value ?? 0
discount: +discount.value ?? 0,
};
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"]')) {
// Перебор полей с параметрами типа заказчика
@ -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) {
// Найдено выбранное поле
// Запись в буфер запроса
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;
} else if (field.getAttribute('type') === 'text' || field.getAttribute('type') === 'number' || field.getAttribute('type') === 'range') {
query["calculators"][number][
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 {
// Элемент с тегом <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",
headers: { "content-type": "application/json" },
body: JSON.stringify(query)
body: JSON.stringify(query),
}).then((response) => {
if (response.status === 200) {
response.json().then(
success => {
(success) => {
// Инициализация буфера расходов
let expenses = 0;
@ -154,7 +168,7 @@ let calculator = {
// Найдены ошибки
// Генерация текста ответа
result = 'Ошибка';
result = "Ошибка";
} else {
// Не найдены ошибки
@ -163,10 +177,11 @@ let calculator = {
// Запись полученных данных
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) {
@ -174,14 +189,15 @@ let calculator = {
// Запись полученных данных
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)) {
// Перебор станков
// Прибавление данных станка к буферу расходов
expenses += (machine.electricity + (machine.metal ?? 0));
expenses += machine.electricity + (machine.metal ?? 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)) {
@ -237,124 +254,102 @@ let calculator = {
expenses = expenses.toFixed(2);
// Генерация текста ответа
result = expenses + ' рублей';
result = expenses + " рублей";
}
if (this.generate.result(result)) {
console.log(`[КАЛЬКУЛЯТОР] Сгенерирован результат: ${expenses} рублей`);
console.log(
`[КАЛЬКУЛЯТОР] Сгенерирован результат: ${expenses} рублей`,
);
} else {
console.log('[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось сгенерировать результат');
console.log(
"[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось сгенерировать результат",
);
}
},
error => {
console.log('[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось сгенерировать результат');
});
() => {
console.log(
"[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось сгенерировать результат",
);
},
);
}
});
},
generate: {
buyer(value = 'individual') {
// Запрос и генерация 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() {
async menu() {
// Запрос и генерация HTML с кнопками добавления калькулятора
return fetch('/calculator/generate/menu', {
return await fetch("/calculator/generate/menu", {
method: "POST",
headers: { "content-type": "application/x-www-form-urlencoded" }
headers: { "content-type": "application/x-www-form-urlencoded" },
}).then((response) => {
if (response.status === 200) {
response.text().then(
success => {
calculator.index.insertAdjacentHTML('beforeend', success);
(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",
headers: { "content-type": "application/x-www-form-urlencoded" }
headers: { "content-type": "application/x-www-form-urlencoded" },
}).then((response) => {
if (response.status === 200) {
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();
console.log('[КАЛЬКУЛЯТОР] Загружен список с типами забора');
console.log("[КАЛЬКУЛЯТОР] Загружен список с типами забора");
},
error => {
console.log('[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось загрузить список с типами забора');
});
() => {
console.log(
"[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось загрузить список с типами забора",
);
},
);
}
});
},
divider(element, position) {
async divider(element, position) {
// Запрос и генерация HTML с данными о результате калькуляции
return fetch('/calculator/generate/divider', {
return await fetch("/calculator/generate/divider", {
method: "POST",
headers: { "content-type": "application/x-www-form-urlencoded" }
headers: { "content-type": "application/x-www-form-urlencoded" },
}).then((response) => {
if (response.status === 200) {
response.text().then(
success => {
(success) => {
if (element === undefined || position === undefined) {
// Не задан элемент и позиция добавляемого разделителя
// Запись разделителя в конце калькулятора
calculator.index.insertAdjacentHTML('beforeend', success);
calculator.index.insertAdjacentHTML("beforeend", success);
} else {
// Задан элемент и позиция добавляемого разделителя
@ -362,32 +357,40 @@ let calculator = {
element.insertAdjacentHTML(position, success);
}
console.log('[КАЛЬКУЛЯТОР] Загружен разделитель');
console.log("[КАЛЬКУЛЯТОР] Загружен разделитель");
},
error => {
console.log('[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось загрузить разделитель');
});
() => {
console.log(
"[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось загрузить разделитель",
);
},
);
}
});
},
result(expenses) {
// Запрос и генерация HTML с данными о результате калькуляции
function request() {
return fetch('/calculator/generate/result', {
async function request() {
return await fetch("/calculator/generate/result", {
method: "POST",
headers: { "content-type": "application/x-www-form-urlencoded" }
headers: { "content-type": "application/x-www-form-urlencoded" },
}).then((response) => {
if (response.status === 200) {
response.text().then(
success => {
calculator.index.insertAdjacentHTML('beforeend', success);
(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) {
// Не найден элемент с результатом расчёта
@ -424,11 +427,11 @@ let calculator = {
// Инициализация количества обработанных ошибок
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) {
// Найден массив с ошибками (категория)
@ -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;
@ -454,22 +457,22 @@ let calculator = {
// Перебор станков
// Инициализация элемента-заголовка
let term = document.createElement('dt');
const term = document.createElement("dt");
// Запись содержимого
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);
// Запись в список
list.insertAdjacentElement('beforeend', term);
list.insertAdjacentElement('beforeend', definition);
list.insertAdjacentElement("beforeend", term);
list.insertAdjacentElement("beforeend", definition);
// Добавление к счётчику обработанных ошибок
++amount;
@ -481,88 +484,105 @@ let calculator = {
return amount;
},
calculators: {
profnastil() {
async profnastil() {
// Запрос и генерация 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);
// Поиск калькуляторов
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]);
// Запись в журнал
console.log('[КАЛЬКУЛЯТОР] Инициализирован калькулятор лазерной резки');
console.log(
"[КАЛЬКУЛЯТОР] Инициализирован калькулятор лазерной резки",
);
}
return fetch('/calculator/generate/profnastil', {
return await fetch("/calculator/generate/profnastil", {
method: "POST",
headers: { "content-type": "application/x-www-form-urlencoded" }
headers: { "content-type": "application/x-www-form-urlencoded" },
}).then((response) => {
if (response.status === 200) {
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) {
// Найден калькулятор
// Инициализация разделителя перед меню
calculator.generate.divider(last, 'afterend').then(divider => write(last, 'afterend', success));
// Инициализация разделителя перед калькулятором
calculator.generate.divider(last, "afterend").then(
() => write(last, "afterend", success),
);
} else {
// Не найден калькулятор
calculator.generate.divider(menu, 'beforebegin').then(
first => {
calculator.generate.divider(menu, "beforebegin").then(
() => {
// Поиск меню
let menu = document.getElementById("menu");
const menu = document.getElementById("menu");
if (menu !== null) {
// Найдено меню
// Инициализация разделителя перед меню
calculator.generate.divider(menu, 'beforebegin').then(divider => write(menu, 'beforebegin', success));
write(menu, "beforebegin", success)
} else {
// Не найдено меню
// Поиск результатов калькуляции
let result = document.getElementById("result");
const result = document.getElementById("result");
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 {
// Не найден элемент с результатами калькуляции
// Инициализация разделителя перед меню
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>
<div>
<select name="fence" data-calculator-parameter="fence" title="Тип забора">
<option value="1">Сплошной</option>
<option value="2">Секционный</option>
<option value="1">???</option>
</select>
</div>
</div>

View File

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

View File

@ -1,6 +1,14 @@
<section id="menu" class="unselectable">
<a type="button" onclick="calculator.generate.calculators.profnastil(); return false;">
<img src="/img/laser.png" title="Расчитать профнастил">
<img src="" title="Расчитать профнастил">
Профнастил
</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>

View File

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

@ -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>