#3: new passes type, user applications page, bug fixes
This commit is contained in:
parent
8072bccfb1
commit
438dd59762
44
index.js
44
index.js
@ -481,6 +481,50 @@ app.get("/applications", checkAuthorization, async (req, res) => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
app.get("/myapplications", checkAuthorization, async (req, res) => {
|
||||||
|
const token = req.cookies.token;
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
method: "POST",
|
||||||
|
url: process.env.API_SERVER + "/forms/getmyapplications",
|
||||||
|
headers: {
|
||||||
|
Authorization: req.cookies.token,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
axios
|
||||||
|
.request(options)
|
||||||
|
.then(function (response) {
|
||||||
|
const authorizationHeader = response.headers["authorization"];
|
||||||
|
|
||||||
|
res.cookie("token", authorizationHeader, {
|
||||||
|
maxAge: twelveHoursInSeconds * 1000,
|
||||||
|
});
|
||||||
|
|
||||||
|
var templateData = {
|
||||||
|
API_SERVER: process.env.API_SERVER,
|
||||||
|
User: response.data.userData,
|
||||||
|
Role: response.data.role,
|
||||||
|
Applications: response.data.applications,
|
||||||
|
Total: response.data.totalCount,
|
||||||
|
};
|
||||||
|
|
||||||
|
const source = fs.readFileSync(
|
||||||
|
"static/templates/account/myapplications.html",
|
||||||
|
"utf8"
|
||||||
|
);
|
||||||
|
const template = handlebars.compile(source);
|
||||||
|
const resultT = template(templateData);
|
||||||
|
res.send(resultT);
|
||||||
|
})
|
||||||
|
.catch(function (error) {
|
||||||
|
if (error.response) {
|
||||||
|
console.error("Ошибка при отправке GET-запроса:", error);
|
||||||
|
res.status(500).send("Произошла ошибка при выполнении запроса.");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
app.get("/passes", checkAuthorization, async (req, res) => {
|
app.get("/passes", checkAuthorization, async (req, res) => {
|
||||||
const token = req.cookies.token;
|
const token = req.cookies.token;
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ const createTable = () => {
|
|||||||
type.textContent = application.type;
|
type.textContent = application.type;
|
||||||
row.appendChild(type);
|
row.appendChild(type);
|
||||||
const worker = document.createElement("td");
|
const worker = document.createElement("td");
|
||||||
worker.textContent = application.worker;
|
worker.innerHTML = application.worker;
|
||||||
row.appendChild(worker);
|
row.appendChild(worker);
|
||||||
const legal = document.createElement("td");
|
const legal = document.createElement("td");
|
||||||
legal.innerHTML = application.legal;
|
legal.innerHTML = application.legal;
|
||||||
|
141
static/scripts/myapplications-table.js
Normal file
141
static/scripts/myapplications-table.js
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
const createTable = () => {
|
||||||
|
const table = document.getElementById("applicationsTable");
|
||||||
|
const tbody = table.querySelector("tbody");
|
||||||
|
|
||||||
|
// Очищаем таблицу
|
||||||
|
tbody.innerHTML = "";
|
||||||
|
|
||||||
|
applications.forEach((application) => {
|
||||||
|
const row = document.createElement("tr");
|
||||||
|
row.setAttribute("onclick", `openApplication(${application.id});`);
|
||||||
|
|
||||||
|
// Добавляем ячейки с данными
|
||||||
|
const id = document.createElement("td");
|
||||||
|
id.textContent = application.id;
|
||||||
|
row.appendChild(id);
|
||||||
|
const status = document.createElement("td");
|
||||||
|
status.textContent = application.status;
|
||||||
|
row.appendChild(status);
|
||||||
|
const type = document.createElement("td");
|
||||||
|
type.textContent = application.type;
|
||||||
|
row.appendChild(type);
|
||||||
|
const worker = document.createElement("td");
|
||||||
|
worker.innerHTML = application.worker;
|
||||||
|
row.appendChild(worker);
|
||||||
|
const legal = document.createElement("td");
|
||||||
|
legal.innerHTML = application.legal;
|
||||||
|
row.appendChild(legal);
|
||||||
|
const date = document.createElement("td");
|
||||||
|
const rawDate = new Date(application.date);
|
||||||
|
const formattedDate = `${rawDate.getDate().toString().padStart(2, "0")}/${(
|
||||||
|
rawDate.getMonth() + 1
|
||||||
|
)
|
||||||
|
.toString()
|
||||||
|
.padStart(2, "0")}/${rawDate.getFullYear()}`;
|
||||||
|
date.textContent = formattedDate;
|
||||||
|
row.appendChild(date);
|
||||||
|
|
||||||
|
const finaldate = document.createElement("td");
|
||||||
|
if (application.finaldate) {
|
||||||
|
const rawFinalDate = new Date(application.finaldate);
|
||||||
|
const formattedfinalDate = `${rawFinalDate
|
||||||
|
.getDate()
|
||||||
|
.toString()
|
||||||
|
.padStart(2, "0")}/${(rawFinalDate.getMonth() + 1)
|
||||||
|
.toString()
|
||||||
|
.padStart(2, "0")}/${rawFinalDate.getFullYear()}`;
|
||||||
|
finaldate.textContent = formattedfinalDate;
|
||||||
|
} else {
|
||||||
|
finaldate.textContent = "";
|
||||||
|
}
|
||||||
|
row.appendChild(finaldate);
|
||||||
|
const car = document.createElement("td");
|
||||||
|
if (application.car) {
|
||||||
|
let carText = application.car.replace(/"/g, '"');
|
||||||
|
carText = JSON.parse(carText).join(", ");
|
||||||
|
car.textContent = carText;
|
||||||
|
}
|
||||||
|
row.appendChild(car);
|
||||||
|
|
||||||
|
tbody.appendChild(row);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
document.addEventListener("DOMContentLoaded", function () {
|
||||||
|
createTable();
|
||||||
|
});
|
||||||
|
|
||||||
|
function getCookie(name) {
|
||||||
|
var cookies = document.cookie.split(";");
|
||||||
|
for (var i = 0; i < cookies.length; i++) {
|
||||||
|
var cookie = cookies[i].trim();
|
||||||
|
if (cookie.startsWith(name + "=")) {
|
||||||
|
return cookie.substring(name.length + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function requestUpdate() {
|
||||||
|
document.getElementById("applicationsTable").style.filter =
|
||||||
|
"brightness(0.85)";
|
||||||
|
|
||||||
|
const formData = new FormData();
|
||||||
|
formData.append(
|
||||||
|
"page",
|
||||||
|
parseInt(document.getElementById("page-number").textContent)
|
||||||
|
);
|
||||||
|
|
||||||
|
const requestOptions = {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
Authorization: getCookie("token"),
|
||||||
|
},
|
||||||
|
body: formData,
|
||||||
|
};
|
||||||
|
|
||||||
|
fetch(API_SERVER + "/forms/getmyapplications", requestOptions)
|
||||||
|
.then((response) => {
|
||||||
|
document.getElementById("applicationsTable").style.filter =
|
||||||
|
"brightness(1)";
|
||||||
|
if (response.ok) {
|
||||||
|
return response.json();
|
||||||
|
} else {
|
||||||
|
console.error("Ошибка при отправке POST запроса.");
|
||||||
|
return "Ошибка при отправке запроса.";
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.then((data) => {
|
||||||
|
applications.splice(0, applications.length);
|
||||||
|
|
||||||
|
applications.push(
|
||||||
|
...data.applications.map((item) => ({
|
||||||
|
id: item.id,
|
||||||
|
status: item.Статус,
|
||||||
|
type: item.Вид_заявки,
|
||||||
|
worker: item.Работник,
|
||||||
|
date: item.Дата_заявки,
|
||||||
|
finaldate: item.Дата_решения,
|
||||||
|
legal: item.Организация,
|
||||||
|
car: item.Авто_гос_номер,
|
||||||
|
}))
|
||||||
|
);
|
||||||
|
|
||||||
|
createTable();
|
||||||
|
|
||||||
|
totalMax = Math.ceil(data.totalCount / 15);
|
||||||
|
|
||||||
|
if (totalMax === 0) {
|
||||||
|
totalMax = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
var currentPage = parseInt(pageNumberInput.textContent, 10);
|
||||||
|
if (currentPage > totalMax) {
|
||||||
|
pageNumberInput.textContent = totalMax;
|
||||||
|
requestUpdate();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
console.error("Ошибка при отправке запроса:", error);
|
||||||
|
});
|
||||||
|
}
|
@ -29,7 +29,7 @@ const createTable = () => {
|
|||||||
type.textContent = pass.type;
|
type.textContent = pass.type;
|
||||||
row.appendChild(type);
|
row.appendChild(type);
|
||||||
const worker = document.createElement("td");
|
const worker = document.createElement("td");
|
||||||
worker.textContent = pass.name;
|
worker.innerHTML = pass.name;
|
||||||
row.appendChild(worker);
|
row.appendChild(worker);
|
||||||
const legal = document.createElement("td");
|
const legal = document.createElement("td");
|
||||||
legal.innerHTML = pass.legal;
|
legal.innerHTML = pass.legal;
|
||||||
|
@ -26,10 +26,10 @@ const createTable = () => {
|
|||||||
date.textContent = formattedDate;
|
date.textContent = formattedDate;
|
||||||
row.appendChild(date);
|
row.appendChild(date);
|
||||||
const type = document.createElement("td");
|
const type = document.createElement("td");
|
||||||
type.textContent = pass.type;
|
type.innerHTML = pass.type;
|
||||||
row.appendChild(type);
|
row.appendChild(type);
|
||||||
const object = document.createElement("td");
|
const object = document.createElement("td");
|
||||||
object.textContent = pass.object;
|
object.innerHTML = pass.object;
|
||||||
row.appendChild(object);
|
row.appendChild(object);
|
||||||
const editdate = document.createElement("td");
|
const editdate = document.createElement("td");
|
||||||
if (pass.editdate) {
|
if (pass.editdate) {
|
||||||
@ -46,7 +46,7 @@ const createTable = () => {
|
|||||||
}
|
}
|
||||||
row.appendChild(editdate);
|
row.appendChild(editdate);
|
||||||
const executor = document.createElement("td");
|
const executor = document.createElement("td");
|
||||||
executor.textContent = pass.executor;
|
executor.innerHTML = pass.executor;
|
||||||
row.appendChild(executor);
|
row.appendChild(executor);
|
||||||
|
|
||||||
tbody.appendChild(row);
|
tbody.appendChild(row);
|
||||||
|
@ -20,13 +20,13 @@ const createTable = () => {
|
|||||||
id.textContent = user.id;
|
id.textContent = user.id;
|
||||||
row.appendChild(id);
|
row.appendChild(id);
|
||||||
const surname = document.createElement("td");
|
const surname = document.createElement("td");
|
||||||
surname.textContent = user.surname;
|
surname.innerHTML = user.surname;
|
||||||
row.appendChild(surname);
|
row.appendChild(surname);
|
||||||
const name = document.createElement("td");
|
const name = document.createElement("td");
|
||||||
name.textContent = user.name;
|
name.innerHTML = user.name;
|
||||||
row.appendChild(name);
|
row.appendChild(name);
|
||||||
const secondname = document.createElement("td");
|
const secondname = document.createElement("td");
|
||||||
secondname.textContent = user.secondname;
|
secondname.innerHTML = user.secondname;
|
||||||
row.appendChild(secondname);
|
row.appendChild(secondname);
|
||||||
const role = document.createElement("td");
|
const role = document.createElement("td");
|
||||||
if (user.role) {
|
if (user.role) {
|
||||||
@ -36,10 +36,10 @@ const createTable = () => {
|
|||||||
}
|
}
|
||||||
row.appendChild(role);
|
row.appendChild(role);
|
||||||
const phone = document.createElement("td");
|
const phone = document.createElement("td");
|
||||||
phone.textContent = user.phone;
|
phone.innerHTML = user.phone;
|
||||||
row.appendChild(phone);
|
row.appendChild(phone);
|
||||||
const email = document.createElement("td");
|
const email = document.createElement("td");
|
||||||
email.textContent = user.email;
|
email.innerHTML = user.email;
|
||||||
row.appendChild(email);
|
row.appendChild(email);
|
||||||
const sub = document.createElement("td");
|
const sub = document.createElement("td");
|
||||||
sub.textContent = user.sub;
|
sub.textContent = user.sub;
|
||||||
|
@ -77,6 +77,24 @@
|
|||||||
<h1>Настройки</h1>
|
<h1>Настройки</h1>
|
||||||
<h2>Изменить информацию профиля</h2>
|
<h2>Изменить информацию профиля</h2>
|
||||||
</div>
|
</div>
|
||||||
|
<div onclick="location.href='/myapplications'" class="hub-element">
|
||||||
|
<div class="icon">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="32" fill="none" viewBox="0 0 20 32">
|
||||||
|
<g clip-path="url(#a)">
|
||||||
|
<path fill="#000" fill-opacity=".85" d="M19.424 8.188v17.507c0 2.425-1.19 3.626-3.58 3.626H3.58C1.19 29.32 0 28.12 0 25.695V8.188c0-2.425 1.19-3.626 3.58-3.626h.153a2.71 2.71 0 0 0-.014.288v1.213c0 .123.007.243.023.358h-.07c-1.2 0-1.813.646-1.813 1.79v17.46c0 1.155.612 1.79 1.813 1.79h12.08c1.2 0 1.813-.635 1.813-1.79V8.212c0-1.144-.612-1.79-1.813-1.79h-.07a2.5 2.5 0 0 0 .024-.358V4.85c0-.098-.005-.195-.015-.288h.153c2.39 0 3.58 1.2 3.58 3.626Z"/>
|
||||||
|
<path fill="#000" fill-opacity=".85" d="M6.144 7.206h7.136c.67 0 1.074-.427 1.074-1.143V4.85c0-.716-.404-1.143-1.074-1.143h-1.062c-.08-1.305-1.166-2.367-2.506-2.367-1.34 0-2.425 1.062-2.506 2.367H6.144c-.67 0-1.074.427-1.074 1.143v1.213c0 .716.404 1.143 1.074 1.143Zm3.568-2.402a1.013 1.013 0 0 1-1.005-1.005c0-.566.45-1.016 1.005-1.016.554 0 1.005.45 1.005 1.016 0 .543-.45 1.005-1.005 1.005ZM4.62 22.069h5.127a.72.72 0 0 0 .716-.716.712.712 0 0 0-.716-.716H4.619a.722.722 0 0 0-.727.716.73.73 0 0 0 .727.716Zm0-4.319h10.185a.725.725 0 0 0 .727-.728.712.712 0 0 0-.727-.704H4.619a.712.712 0 0 0-.727.704c0 .404.323.728.727.728Zm0-4.1h10.185a.73.73 0 0 0 .727-.716.74.74 0 0 0-.727-.728H4.619a.74.74 0 0 0-.727.728.73.73 0 0 0 .727.716Z"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="a">
|
||||||
|
<path fill="#fff" d="M0 0h19.424v32H0z"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<h1>Мои заявки</h1>
|
||||||
|
<h2>Отслеживание ваших заявок на пропуска</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
{{#if (eq Role 'Дирекция')}}
|
{{#if (eq Role 'Дирекция')}}
|
||||||
<div onclick="location.href='/users'" class="hub-element">
|
<div onclick="location.href='/users'" class="hub-element">
|
||||||
|
@ -144,8 +144,8 @@
|
|||||||
<input type="date" id="editdate-input" required>
|
<input type="date" id="editdate-input" required>
|
||||||
</div>
|
</div>
|
||||||
<div class="input-area">
|
<div class="input-area">
|
||||||
<label for="editdate-input">Действие до*</label>
|
<label for="editdate-input">Действие до</label>
|
||||||
<input type="date" id="edittodate-input" required>
|
<input type="date" id="edittodate-input">
|
||||||
</div>
|
</div>
|
||||||
<div class="input-area">
|
<div class="input-area">
|
||||||
<label for="editfinaldate-input">Дата решения</label>
|
<label for="editfinaldate-input">Дата решения</label>
|
||||||
@ -253,6 +253,7 @@
|
|||||||
const name = $('#editname-input').val();
|
const name = $('#editname-input').val();
|
||||||
const legal = $('#editlegal-input').val();
|
const legal = $('#editlegal-input').val();
|
||||||
const date = $('#editdate-input').val();
|
const date = $('#editdate-input').val();
|
||||||
|
const todate = $('#edittodate-input').val();
|
||||||
const finaldate = $('#editfinaldate-input').val();
|
const finaldate = $('#editfinaldate-input').val();
|
||||||
const decision = $('#editdecision-input').val();
|
const decision = $('#editdecision-input').val();
|
||||||
const carnumber = $('#editcarnumber-input').val();
|
const carnumber = $('#editcarnumber-input').val();
|
||||||
@ -271,7 +272,7 @@
|
|||||||
"Content-Type": "application/json",
|
"Content-Type": "application/json",
|
||||||
Authorization: getCookie("token"),
|
Authorization: getCookie("token"),
|
||||||
},
|
},
|
||||||
body: JSON.stringify({ id, status, name, legal, date, finaldate, decision, carnumber, carbrand, carmodel, carcolor, tmcname, tmcunit, tmcquantity, additional })
|
body: JSON.stringify({ id, status, name, legal, date, todate, finaldate, decision, carnumber, carbrand, carmodel, carcolor, tmcname, tmcunit, tmcquantity, additional })
|
||||||
});
|
});
|
||||||
if (response.status === 201) {
|
if (response.status === 201) {
|
||||||
location.reload();
|
location.reload();
|
||||||
@ -314,7 +315,7 @@
|
|||||||
$("#deleteApplication-button").attr("onclick", `deleteApplication(${id})`);
|
$("#deleteApplication-button").attr("onclick", `deleteApplication(${id})`);
|
||||||
$("#makePass-button").attr("onclick", `makePass(${id})`);
|
$("#makePass-button").attr("onclick", `makePass(${id})`);
|
||||||
|
|
||||||
if (data.data.Вид_заявки === "Временный") {
|
if (data.data.Вид_заявки === "Временный" || data.data.Вид_заявки === "Разовый") {
|
||||||
$("#car-inputs").css("display", "none");
|
$("#car-inputs").css("display", "none");
|
||||||
$("#tmc-inputs").css("display", "none");
|
$("#tmc-inputs").css("display", "none");
|
||||||
} else if (data.data.Вид_заявки === "Автомобильный") {
|
} else if (data.data.Вид_заявки === "Автомобильный") {
|
||||||
@ -402,7 +403,13 @@
|
|||||||
} else {
|
} else {
|
||||||
$("#editfinaldate-input").val("");
|
$("#editfinaldate-input").val("");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (data.data.Действие_до) {
|
||||||
|
formatDateForDateInput(data.data.Действие_до, "edittodate-input");
|
||||||
|
} else {
|
||||||
$("#edittodate-input").val("");
|
$("#edittodate-input").val("");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -443,7 +450,7 @@
|
|||||||
|
|
||||||
|
|
||||||
if (!todate || !date || !name ) {
|
if (!todate || !date || !name ) {
|
||||||
alert("Пожалуйста, заполните все поля со звездочками.")
|
alert("Пожалуйста, заполните все поля.")
|
||||||
$('#makePass-button').removeClass('inactive');
|
$('#makePass-button').removeClass('inactive');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -50,12 +50,16 @@
|
|||||||
<h1>Новая заявка на пропуск</h1>
|
<h1>Новая заявка на пропуск</h1>
|
||||||
<div class="radio-inputs">
|
<div class="radio-inputs">
|
||||||
<label class="radio">
|
<label class="radio">
|
||||||
<input autocomplete="off" type="radio" id="temp-radio" name="form-type" value="temp" checked>
|
<input autocomplete="off" type="radio" id="onetime-radio" name="form-type" value="onetime" checked>
|
||||||
<span class="name">Временный пропуск</span>
|
<span class="name">Разовый</span>
|
||||||
|
</label>
|
||||||
|
<label class="radio">
|
||||||
|
<input autocomplete="off" type="radio" id="temp-radio" name="form-type" value="temp">
|
||||||
|
<span class="name">Временный</span>
|
||||||
</label>
|
</label>
|
||||||
<label class="radio">
|
<label class="radio">
|
||||||
<input autocomplete="off" type="radio" id="car-radio" name="form-type" value="car">
|
<input autocomplete="off" type="radio" id="car-radio" name="form-type" value="car">
|
||||||
<span class="name">Автомобильный пропуск</span>
|
<span class="name">Автомобильный</span>
|
||||||
</label>
|
</label>
|
||||||
<label class="radio">
|
<label class="radio">
|
||||||
<input autocomplete="off" type="radio" id="tmc-radio" name="form-type" value="tmc">
|
<input autocomplete="off" type="radio" id="tmc-radio" name="form-type" value="tmc">
|
||||||
@ -254,6 +258,28 @@
|
|||||||
$('#send-button').removeClass('inactive');
|
$('#send-button').removeClass('inactive');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (document.getElementById('onetime-radio').checked) {
|
||||||
|
type = "Разовый";
|
||||||
|
// Отправляем запрос на сервер для авторизации
|
||||||
|
const response = await fetch("{{API_SERVER}}/passes/newform", {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
Authorization: getCookie("token"),
|
||||||
|
},
|
||||||
|
body: JSON.stringify({ formrole, passtext, type, fullnames, legalname, date })
|
||||||
|
});
|
||||||
|
if (response.status === 201) {
|
||||||
|
const data = await response.json();
|
||||||
|
alert("Ваша заявка принята к рассмотрению!")
|
||||||
|
|
||||||
|
window.location.href = "/";
|
||||||
|
$('#send-button').removeClass('inactive');
|
||||||
|
} else {
|
||||||
|
alert("Произошла ошибка при попытке отправить заявку");
|
||||||
|
$('#send-button').removeClass('inactive');
|
||||||
|
}
|
||||||
|
}
|
||||||
if (document.getElementById('car-radio').checked) {
|
if (document.getElementById('car-radio').checked) {
|
||||||
type = "Автомобильный";
|
type = "Автомобильный";
|
||||||
|
|
||||||
@ -338,7 +364,7 @@
|
|||||||
} else if (this.value === "tmc") {
|
} else if (this.value === "tmc") {
|
||||||
carInputs.style.display = 'none';
|
carInputs.style.display = 'none';
|
||||||
tmcInputs.style.display = 'flex';
|
tmcInputs.style.display = 'flex';
|
||||||
} else if (this.value === "temp") {
|
} else if (this.value === "temp" || this.value === "onetime") {
|
||||||
carInputs.style.display = 'none';
|
carInputs.style.display = 'none';
|
||||||
tmcInputs.style.display = 'none';
|
tmcInputs.style.display = 'none';
|
||||||
}
|
}
|
||||||
|
352
static/templates/account/myapplications.html
Normal file
352
static/templates/account/myapplications.html
Normal file
@ -0,0 +1,352 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100..900;1,100..900&display=swap" rel="stylesheet">
|
||||||
|
<link rel="stylesheet" href="../styles/main.css">
|
||||||
|
<script src="../scripts/jquery.min.js"></script>
|
||||||
|
<script src="../scripts/helpPopup.js"></script>
|
||||||
|
<title>Мои заявки</title>
|
||||||
|
<script>
|
||||||
|
const API_SERVER = "{{API_SERVER}}";
|
||||||
|
let applications = [
|
||||||
|
{{#each Applications}}
|
||||||
|
{
|
||||||
|
id: {{this.id}},
|
||||||
|
status: "{{this.Статус}}",
|
||||||
|
type: "{{this.Вид_заявки}}",
|
||||||
|
worker: "{{this.Работник}}",
|
||||||
|
date: "{{this.Дата_заявки}}",
|
||||||
|
finaldate: "{{this.Дата_решения}}",
|
||||||
|
legal: "{{this.Организация}}",
|
||||||
|
car: "{{this.Авто_гос_номер}}",
|
||||||
|
},
|
||||||
|
{{/each}}
|
||||||
|
];
|
||||||
|
</script>
|
||||||
|
<script src="../scripts/myapplications-table.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<a href="/account"><h1>Система управления пользователями</h1></a>
|
||||||
|
<nav>
|
||||||
|
<div class="dropdown">
|
||||||
|
<a class="help-button" onclick="toggleDropdown('dropdownHelp-1')">Техническая поддержка</a>
|
||||||
|
<div id="dropdownHelp-1" class="dropdown-help">
|
||||||
|
<a href="tel:83477527706">8 (34775) 2-77-06</a>
|
||||||
|
<a href="tel:89174023516">8 (917) 402-35-16</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="dropdown">
|
||||||
|
<a class="help-button" onclick="toggleDropdown('dropdownHelp-2')">Инструкции</a>
|
||||||
|
<div id="dropdownHelp-2" class="dropdown-help dropdown-manual">
|
||||||
|
<a href="/docs/manual.pdf" target="_blank">Текст</a>
|
||||||
|
<a href="https://drive.google.com/file/d/1CxrAgr2brQclZqtbbreSUU9tN-jsNTwf/view?usp=sharing" target="_blank">Видео</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a href="/account">Профиль</a>
|
||||||
|
{{#if (eq Role 'legal')}}
|
||||||
|
<span>{{User.Наименование}}</span>
|
||||||
|
{{else}}
|
||||||
|
<span>{{User.Фамилия}} {{User.Имя}} {{User.Отчество}}</span>
|
||||||
|
{{/if}}
|
||||||
|
<a class="exit-button" href="/logout"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="16" fill="none" viewBox="0 0 20 16">
|
||||||
|
<path fill="#6B7A99" d="m4.016 7.13 2.608-2.606-1.226-1.226L.696 8l4.702 4.702 1.226-1.226L4.016 8.87h4.858V7.131H4.016ZM8.874.179v6.953h5.215V8.87H8.874v6.953h10.43V.178H8.873Z"/>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div id="applicationsWrapper" class="table-wrapper">
|
||||||
|
<table id="applicationsTable">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>ID</th>
|
||||||
|
<th>Статус</th>
|
||||||
|
<th>Вид</th>
|
||||||
|
<th>ФИО</th>
|
||||||
|
<th>Организация</th>
|
||||||
|
<th>Дата пропуска</th>
|
||||||
|
<th>Дата решения</th>
|
||||||
|
<th>Автомобиль</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<!-- Сюда будут добавляться строки таблицы -->
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="pagination">
|
||||||
|
<div id="left-slider" onclick="decrementPage()">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="11" height="19" fill="none" viewBox="0 0 11 19">
|
||||||
|
<path fill="#000" fill-opacity=".75" d="M0 9.495c0 .273.101.514.315.722l8.92 8.477a.981.981 0 0 0 .73.295c.585 0 1.035-.427 1.035-.995 0-.285-.124-.525-.304-.711L2.508 9.495l8.188-7.789c.18-.186.304-.437.304-.71C11 .425 10.55 0 9.965 0c-.292 0-.54.098-.73.284L.314 8.773A.955.955 0 0 0 0 9.495Z"/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<div id="page-number">1</div>
|
||||||
|
<div id="right-slider" onclick="incrementPage()">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="11" height="19" fill="none" viewBox="0 0 11 19">
|
||||||
|
<path fill="#000" fill-opacity=".75" d="M11 9.495a.967.967 0 0 0-.326-.722L1.766.284A1.062 1.062 0 0 0 1.024 0C.45 0 0 .427 0 .995c0 .274.112.525.292.711l8.189 7.789-8.189 7.788c-.18.186-.292.426-.292.71 0 .57.45.996 1.024.996.292 0 .54-.098.742-.295l8.908-8.477c.213-.208.326-.449.326-.722Z"/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form id="editApplicationForm">
|
||||||
|
<input type="text" id="editapplicationid-input" hidden>
|
||||||
|
<input type="text" id="editapplicationtype-input" hidden>
|
||||||
|
<div id="editapplication-form-popup-bg" class="form-popup-bg not-main" >
|
||||||
|
<div class="form-container">
|
||||||
|
<div id="btnCloseForm" class="close-button"><svg onclick="closeForm();" id="btnCloseFormSvg" xmlns="http://www.w3.org/2000/svg" width="14" height="14" fill="none" viewBox="0 0 14 14">
|
||||||
|
<path fill="#0050CF" fill-rule="evenodd" d="M14 1.41 12.59 0 7 5.59 1.41 0 0 1.41 5.59 7 0 12.59 1.41 14 7 8.41 12.59 14 14 12.59 8.41 7 14 1.41Z" clip-rule="evenodd"/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<h1>Заявка на <span id="editApplication"></span> пропуск</h1>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<div class="input-area">
|
||||||
|
<label for="editauthor-input">Автор</label>
|
||||||
|
<input type="text" id="editauthor-input" readonly>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="input-area">
|
||||||
|
<label for="editstatus-input">Статус</label>
|
||||||
|
<input type="text" id="editstatus-input" readonly>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="input-area">
|
||||||
|
<label for="editname-input">ФИО*</label>
|
||||||
|
<input type="text" id="editname-input" required readonly>
|
||||||
|
</div>
|
||||||
|
<div class="input-area">
|
||||||
|
<label for="editlegal-input">Организация</label>
|
||||||
|
<input type="text" id="editlegal-input" readonly>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="input-area">
|
||||||
|
<label for="editdate-input">Дата выдачи</label>
|
||||||
|
<input type="date" id="editdate-input" required readonly>
|
||||||
|
</div>
|
||||||
|
<div class="input-area">
|
||||||
|
<label for="editdate-input">Действие до</label>
|
||||||
|
<input type="date" id="edittodate-input" required readonly>
|
||||||
|
</div>
|
||||||
|
<div class="input-area">
|
||||||
|
<label for="editfinaldate-input">Дата решения</label>
|
||||||
|
<input type="date" id="editfinaldate-input" readonly>
|
||||||
|
</div>
|
||||||
|
<div class="input-area">
|
||||||
|
<label for="editdecision-input">Решение</label>
|
||||||
|
<input type="text" id="editdecision-input" readonly>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="display: none;" class="inputs" id="car-inputs">
|
||||||
|
<ul id="carlist"></ul>
|
||||||
|
<input type="text" id="editcarnumber-input" hidden readonly>
|
||||||
|
<input type="text" id="editcarbrand-input" hidden readonly>
|
||||||
|
<input type="text" id="editcarmodel-input" hidden readonly>
|
||||||
|
<input type="text" id="editcarcolor-input" hidden readonly>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="display: none;" class="inputs" id="tmc-inputs">
|
||||||
|
<ul id="tmclist"></ul>
|
||||||
|
<input type="text" id="edittmcname-input" hidden readonly>
|
||||||
|
<input type="text" id="edittmcunit-input" hidden readonly>
|
||||||
|
<input type="text" id="edittmcquantity-input" hidden readonly>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="input-area">
|
||||||
|
<label for="editadditional-input">Дополнительно</label>
|
||||||
|
<textarea id="editadditional-input" readonly></textarea>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
var pageNumberInput = document.getElementById('page-number');
|
||||||
|
var totalMax = Math.ceil({{Total}} / 15);
|
||||||
|
|
||||||
|
function decrementPage() {
|
||||||
|
var currentPage = parseInt(pageNumberInput.textContent, 10);
|
||||||
|
if (currentPage > 1) {
|
||||||
|
pageNumberInput.textContent = currentPage - 1;
|
||||||
|
requestUpdate();
|
||||||
|
} else {
|
||||||
|
requestUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function incrementPage() {
|
||||||
|
var currentPage = parseInt(pageNumberInput.textContent, 10);
|
||||||
|
|
||||||
|
if (currentPage === totalMax || currentPage > totalMax) {
|
||||||
|
pageNumberInput.textContent = totalMax;
|
||||||
|
requestUpdate();
|
||||||
|
}
|
||||||
|
if (currentPage < totalMax) {
|
||||||
|
pageNumberInput.textContent = currentPage + 1;
|
||||||
|
requestUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function closeForm() {
|
||||||
|
$('.form-popup-bg').removeClass('is-visible');
|
||||||
|
}
|
||||||
|
|
||||||
|
$(document).ready(function($) {
|
||||||
|
|
||||||
|
$('#addUser').on('click', function(event) {
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
$('#adduser-form-popup-bg').addClass('is-visible');
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#editapplication-form-popup-bg').on('click', function(event) {
|
||||||
|
if ($(event.target).is('#editapplication-form-popup-bg') || $(event.target).is('#btnCloseForm')) {
|
||||||
|
event.preventDefault();
|
||||||
|
$(this).removeClass('is-visible');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
function openApplication(id) {
|
||||||
|
const requestOptions = {
|
||||||
|
method: "GET",
|
||||||
|
headers: {
|
||||||
|
Authorization: getCookie("token"),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
fetch(API_SERVER + "/forms/application?id=" + id, requestOptions)
|
||||||
|
.then((response) => {
|
||||||
|
if (response.ok) {
|
||||||
|
$("#editapplication-form-popup-bg").addClass("is-visible");
|
||||||
|
return response.json();
|
||||||
|
} else {
|
||||||
|
console.error("Ошибка при отправке POST запроса.");
|
||||||
|
return "Ошибка при отправке запроса.";
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.then((data) => {
|
||||||
|
|
||||||
|
$("#editapplicationid-input").val(id);
|
||||||
|
|
||||||
|
$("#editApplication").html(data.data.Вид_заявки);
|
||||||
|
|
||||||
|
if (data.data.Вид_заявки === "Временный" || data.data.Вид_заявки === "Разовый") {
|
||||||
|
$("#car-inputs").css("display", "none");
|
||||||
|
$("#tmc-inputs").css("display", "none");
|
||||||
|
} else if (data.data.Вид_заявки === "Автомобильный") {
|
||||||
|
$("#car-inputs").css("display", "flex");
|
||||||
|
$("#tmc-inputs").css("display", "none");
|
||||||
|
} else if (data.data.Вид_заявки === "ТМЦ") {
|
||||||
|
$("#car-inputs").css("display", "none");
|
||||||
|
$("#tmc-inputs").css("display", "flex");
|
||||||
|
}
|
||||||
|
|
||||||
|
$("#editauthor-input").val(data.data.Автор);
|
||||||
|
|
||||||
|
$("#editname-input").val(data.data.Работник);
|
||||||
|
$("#editlegal-input").val(data.data.Организация);
|
||||||
|
$("#editstatus-input").val(data.data.Статус);
|
||||||
|
$("#editdecision-input").val(data.data.Решение);
|
||||||
|
|
||||||
|
$("#editcarnumber-input").val(data.data.Авто_гос_номер);
|
||||||
|
$("#editcarbrand-input").val(data.data.Авто_марка);
|
||||||
|
$("#editcarmodel-input").val(data.data.Авто_модель);
|
||||||
|
$("#editcarcolor-input").val(data.data.Авто_цвет);
|
||||||
|
|
||||||
|
$("#edittmcname-input").val(data.data.Наименование);
|
||||||
|
$("#edittmcunit-input").val(data.data.Единица_измерения);
|
||||||
|
$("#edittmcquantity-input").val(data.data.Количество);
|
||||||
|
|
||||||
|
if (data.data.Вид_заявки === "ТМЦ") {
|
||||||
|
var tmcnames = JSON.parse(data.data.Наименование);
|
||||||
|
var tmcunits = JSON.parse(data.data.Единица_измерения);
|
||||||
|
var tmcquantitys = JSON.parse(data.data.Количество);
|
||||||
|
|
||||||
|
var tmclist = "";
|
||||||
|
|
||||||
|
for (var i = 0; i < tmcnames.length; i++) {
|
||||||
|
tmclist += "<li><span style='font-weight: 600;'>Позиция " + (i + 1) + ":</span> <br>" +
|
||||||
|
"Наименование ТМЦ - " + tmcnames[i] + "<br>" +
|
||||||
|
"Единица измерения - " + tmcunits[i] + "<br>" +
|
||||||
|
"Количество - " + tmcquantitys[i] +
|
||||||
|
"</li>";
|
||||||
|
}
|
||||||
|
|
||||||
|
$("#tmclist").html(tmclist);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (data.data.Вид_заявки === "Автомобильный") {
|
||||||
|
var carnumbers = JSON.parse(data.data.Авто_гос_номер);
|
||||||
|
var carbrands = JSON.parse(data.data.Авто_марка);
|
||||||
|
var carmodels = JSON.parse(data.data.Авто_модель);
|
||||||
|
var carcolors = JSON.parse(data.data.Авто_цвет);
|
||||||
|
|
||||||
|
var carlist = "";
|
||||||
|
|
||||||
|
for (var i = 0; i < carnumbers.length; i++) {
|
||||||
|
carlist += "<li><span style='font-weight: 600;'>Авто " + (i + 1) + ":</span> <br>" +
|
||||||
|
"Номер - " + carnumbers[i] + "<br>" +
|
||||||
|
"Марка - " + carbrands[i] + "<br>" +
|
||||||
|
"Модель - " + carmodels[i] + "<br>" +
|
||||||
|
"Цвет - " + carcolors[i] +
|
||||||
|
"</li>";
|
||||||
|
}
|
||||||
|
|
||||||
|
$("#carlist").html(carlist);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$("#editadditional-input").val(data.data.Дополнение);
|
||||||
|
$("#editapplicationtype-input").val(data.data.Вид_заявки);
|
||||||
|
|
||||||
|
|
||||||
|
function formatDateForDateInput(dateString, inputId) {
|
||||||
|
const date = new Date(dateString);
|
||||||
|
const year = date.getFullYear();
|
||||||
|
const month = (date.getMonth() + 1).toString().padStart(2, '0');
|
||||||
|
const day = date.getDate().toString().padStart(2, '0');
|
||||||
|
const formattedDate = `${year}-${month}-${day}`;
|
||||||
|
|
||||||
|
document.getElementById(inputId).value = formattedDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
formatDateForDateInput(data.data.Дата_заявки, "editdate-input");
|
||||||
|
if (data.data.Дата_решения) {
|
||||||
|
formatDateForDateInput(data.data.Дата_решения, "editfinaldate-input");
|
||||||
|
} else {
|
||||||
|
$("#editfinaldate-input").val("");
|
||||||
|
}
|
||||||
|
if (data.data.Действие_до) {
|
||||||
|
formatDateForDateInput(data.data.Действие_до, "edittodate-input");
|
||||||
|
} else {
|
||||||
|
$("#edittodate-input").val("");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
console.error("Ошибка при отправке запроса:", error);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -33,7 +33,7 @@
|
|||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<header>
|
<header>
|
||||||
<a href="/account"><h1>Система управления заявками на пропуска</h1></a>
|
<a href="/account"><h1>Система управления пропусками</h1></a>
|
||||||
<nav>
|
<nav>
|
||||||
<div class="dropdown">
|
<div class="dropdown">
|
||||||
<a class="help-button" onclick="toggleDropdown('dropdownHelp-1')">Техническая поддержка</a>
|
<a class="help-button" onclick="toggleDropdown('dropdownHelp-1')">Техническая поддержка</a>
|
||||||
@ -120,6 +120,7 @@
|
|||||||
<div class="input-area">
|
<div class="input-area">
|
||||||
<label for="newPassType">Вид пропуска*</label>
|
<label for="newPassType">Вид пропуска*</label>
|
||||||
<select name="pass-type" id="newPassType">
|
<select name="pass-type" id="newPassType">
|
||||||
|
<option value="Разовый">Разовый пропуск</option>
|
||||||
<option value="Временный">Временный пропуск</option>
|
<option value="Временный">Временный пропуск</option>
|
||||||
<option value="Автомобильный">Автомобильный пропуск</option>
|
<option value="Автомобильный">Автомобильный пропуск</option>
|
||||||
<option value="ТМЦ">Ввоз-Вывоз ТМЦ</option>
|
<option value="ТМЦ">Ввоз-Вывоз ТМЦ</option>
|
||||||
@ -428,7 +429,7 @@
|
|||||||
const tmcInputs = document.getElementById('tmc-inputs');
|
const tmcInputs = document.getElementById('tmc-inputs');
|
||||||
|
|
||||||
typeSelect.addEventListener('change', function() {
|
typeSelect.addEventListener('change', function() {
|
||||||
if (this.value === "Временный" || this.value === "Материальный") {
|
if (this.value === "Временный" || this.value === "Материальный" || this.value === "Разовый") {
|
||||||
carInputs.style.display = 'none';
|
carInputs.style.display = 'none';
|
||||||
tmcInputs.style.display = 'none';
|
tmcInputs.style.display = 'none';
|
||||||
} else if (this.value === "Автомобильный") {
|
} else if (this.value === "Автомобильный") {
|
||||||
@ -461,7 +462,7 @@
|
|||||||
const additional = $('#additional-input').val();
|
const additional = $('#additional-input').val();
|
||||||
|
|
||||||
|
|
||||||
if ($('#newPassType').val() === "Временный" || $('#newPassType').val() === "Материальный") {
|
if ($('#newPassType').val() === "Временный" || $('#newPassType').val() === "Материальный" || $('#newPassType').val() === "Разовый") {
|
||||||
// Отправляем запрос на сервер для авторизации
|
// Отправляем запрос на сервер для авторизации
|
||||||
const response = await fetch("{{API_SERVER}}/passes/newpass", {
|
const response = await fetch("{{API_SERVER}}/passes/newpass", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
@ -558,7 +559,7 @@
|
|||||||
const additional = $('#editadditional-input').val();
|
const additional = $('#editadditional-input').val();
|
||||||
|
|
||||||
|
|
||||||
if ($('#editpasstype-input').val() === "Временный" || $('#editpasstype-input').val() === "Материальный") {
|
if ($('#editpasstype-input').val() === "Временный" || $('#editpasstype-input').val() === "Материальный" || $('#editpasstype-input').val() === "Разовый") {
|
||||||
// Отправляем запрос на сервер для авторизации
|
// Отправляем запрос на сервер для авторизации
|
||||||
const response = await fetch("{{API_SERVER}}/passes/update", {
|
const response = await fetch("{{API_SERVER}}/passes/update", {
|
||||||
method: "PUT",
|
method: "PUT",
|
||||||
@ -670,7 +671,7 @@
|
|||||||
|
|
||||||
$("#deletePass-button").attr("onclick", `deletePass(${id})`);
|
$("#deletePass-button").attr("onclick", `deletePass(${id})`);
|
||||||
|
|
||||||
if (data.data.Вид_пропуска === "Временный" || data.data.Вид_пропуска === "Материальный") {
|
if (data.data.Вид_пропуска === "Временный" || data.data.Вид_пропуска === "Материальный" || data.data.Вид_пропуска === "Разовый") {
|
||||||
$("#editcar-inputs").css("display", "none");
|
$("#editcar-inputs").css("display", "none");
|
||||||
$("#edittmc-inputs").css("display", "none");
|
$("#edittmc-inputs").css("display", "none");
|
||||||
} else if (data.data.Вид_пропуска === "Автомобильный") {
|
} else if (data.data.Вид_пропуска === "Автомобильный") {
|
||||||
|
@ -12,9 +12,7 @@
|
|||||||
<title>Бюро пропусков</title>
|
<title>Бюро пропусков</title>
|
||||||
<style>
|
<style>
|
||||||
body {
|
body {
|
||||||
/* background-color: #EEEFF5; */
|
background-color: #EEEFF5;
|
||||||
background: url(../img/bg.jpeg) no-repeat center center fixed;
|
|
||||||
background-size: cover;
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
|
Loading…
Reference in New Issue
Block a user