initial commit

This commit is contained in:
Ivan
2023-12-25 01:00:01 +03:00
commit d0158dad9a
36 changed files with 19627 additions and 0 deletions

BIN
static/img/argus.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 565 KiB

BIN
static/img/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

BIN
static/img/krbl.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

40
static/img/krbl.svg Normal file
View File

@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated by Pixelmator Pro 2.4.3 -->
<svg width="329" height="114" viewBox="0 0 329 114" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="Layer1-2">
<g id="KRBL" style="isolation:isolate">
<g id="Group">
<path id="Path" fill="#00b3e3" stroke="none" d="M 72.349998 1.289993 L 53 1.289993 L 53 31.520004 C 52.970001 39.93 46.490002 46.900002 38.099998 47.530006 C 46.740002 47.82 54.98 51.270004 61.25 57.220001 C 68.330002 50.550003 72.349998 41.25 72.339996 31.529999 L 72.339996 1.300003 M 36.869999 66.870003 L 20.74 66.870003 L 20.74 66.940002 L 36.869999 66.940002 C 37.279999 66.940002 37.689999 66.940002 38.09 66.920006 C 37.689999 66.889999 37.279999 66.870003 36.869999 66.870003"/>
<path id="path1" fill="#ff4338" stroke="none" d="M 36.880001 47.510002 L 20.75 47.510002 L 20.75 47.580002 L 36.880001 47.580002 C 37.290001 47.580002 37.700001 47.560005 38.099998 47.530006 C 37.689999 47.520004 37.290001 47.510002 36.880001 47.510002 M 61.260002 57.220001 C 54.990002 63.170006 46.75 66.620003 38.110001 66.910004 C 46.490002 67.540001 52.98 74.510002 53.009998 82.920006 L 53.009998 113.149994 L 72.360001 113.149994 L 72.360001 82.920006 C 72.360001 73.190002 68.349998 63.900002 61.269997 57.230003"/>
<path id="path2" fill="#002f32" stroke="none" d="M 38.099998 47.530006 C 37.700001 47.560005 37.290001 47.580002 36.880001 47.580002 L 20.75 47.580002 L 20.75 66.860001 L 36.880001 66.860001 C 37.290001 66.860001 37.700001 66.880005 38.099998 66.910004 C 46.740002 66.620003 54.98 63.170006 61.25 57.220001 C 54.98 51.270004 46.740002 47.82 38.099998 47.530006"/>
<path id="path3" fill="#ffc843" stroke="none" d="M 20.75 1.289993 L 1.4 1.289993 L 1.4 47.510002 L 20.75 47.510002 L 20.75 1.289993 M 20.75 66.93 L 1.4 66.93 L 1.4 113.220001 L 20.75 113.220001 L 20.75 66.93"/>
<path id="path4" fill="#008c3c" stroke="none" d="M 20.75 66.860001 L 1.4 66.860001 L 1.4 66.93 L 20.75 66.93 L 20.75 66.860001"/>
<path id="path5" fill="#ff350f" stroke="none" d="M 20.75 47.510002 L 1.4 47.510002 L 1.4 47.580002 L 20.75 47.580002 L 20.75 47.510002"/>
<path id="path6" fill="#00250d" stroke="none" d="M 20.75 47.580002 L 1.4 47.580002 L 1.4 66.860001 L 20.75 66.860001 L 20.75 47.580002"/>
</g>
<g id="g1">
<path id="path7" fill="#da3ab3" stroke="none" d="M 81.879997 1.029999 L 81.879997 1.029999 L 81.879997 20.380005 L 90.279999 20.380005 L 90.279999 112.949997 L 109.639999 112.949997 L 109.639999 66.620003 L 90.279999 66.620003 L 90.279999 47.270004 L 90.279999 47.260002 L 109.639999 47.260002 L 109.639999 20.380005 L 81.879997 20.380005 L 81.879997 1.029999"/>
<path id="path8" fill="#ffc843" stroke="none" d="M 123.080002 1.029999 L 91.550003 1.029999 C 101.529999 1.039993 109.620003 9.130005 109.629997 19.110001 L 109.629997 20.380005 L 123.080002 20.380005 C 130.410004 20.380005 136.399994 26.25 136.529999 33.589996 C 136.660004 40.920006 130.889999 47.010002 123.559998 47.270004 C 132.119995 47.389999 140.289993 50.870003 146.320007 56.950005 C 155.660004 47.560005 158.440002 33.470001 153.350006 21.240005 C 148.259995 9.009995 136.320007 1.039993 123.070007 1.039993 M 123.070007 66.620003 L 109.620003 66.620003 C 109.620003 66.620003 123.070007 66.630005 123.070007 66.630005 L 123.559998 66.630005 C 123.399994 66.630005 123.240005 66.630005 123.070007 66.630005"/>
<path id="path9" fill="#da2d2f" stroke="none" d="M 91.559998 1.029999 L 81.879997 1.029999 L 81.879997 20.380005 L 109.629997 20.380005 L 109.629997 19.100006 C 109.620003 9.119995 101.529999 1.029999 91.550003 1.020004 M 90.279999 47.270004 L 90.279999 47.270004 L 90.279999 66.620003 L 109.629997 66.620003 C 109.629997 66.620003 90.279999 66.610001 90.279999 66.610001 L 90.279999 47.270004"/>
<path id="path10" fill="#00b3e3" stroke="none" d="M 123.080002 47.260002 L 109.629997 47.260002 C 109.629997 47.260002 123.080002 47.270004 123.080002 47.270004 C 123.240005 47.270004 123.399994 47.270004 123.570007 47.270004 L 123.080002 47.270004 M 146.330002 56.950005 C 140.300003 63.030006 132.130005 66.5 123.570007 66.630005 C 130.800003 66.900002 136.520004 72.830002 136.529999 80.07 L 136.529999 112.970001 L 155.880005 112.970001 L 155.880005 80.07 C 155.880005 71.400002 152.449997 63.090004 146.330002 56.959999"/>
<path id="path11" fill="#00299f" stroke="none" d="M 109.639999 47.260002 L 90.279999 47.260002 L 90.279999 47.270004 L 109.639999 47.270004 L 109.639999 47.260002"/>
<path id="path12" fill="#008c3c" stroke="none" d="M 123.570007 47.270004 C 123.410004 47.270004 123.25 47.270004 123.080002 47.270004 L 109.629997 47.270004 L 109.629997 66.610001 L 123.080002 66.610001 C 123.240005 66.610001 123.399994 66.610001 123.570007 66.610001 C 132.130005 66.490005 140.300003 63.010002 146.330002 56.93 C 140.300003 50.850006 132.130005 47.380005 123.570007 47.25"/>
<path id="path13" fill="#00202a" stroke="none" d="M 109.639999 47.270004 L 90.279999 47.270004 L 90.279999 66.610001 L 109.639999 66.610001 L 109.639999 47.270004"/>
</g>
<g id="g2">
<path id="path14" fill="#ffc843" stroke="none" d="M 234.149994 52.010002 C 228.089996 61.230003 217.789993 66.790001 206.759995 66.790001 L 217.470001 66.790001 C 224.899994 66.790001 230.919998 72.810005 230.919998 80.240005 C 230.919998 87.670006 224.899994 93.69001 217.470001 93.69001 L 193.320007 93.69001 L 193.320007 113.039993 L 173.970001 113.039993 L 217.470001 113.039993 C 232.25 113.039993 245.220001 103.159988 249.119995 88.900002 C 253.019989 74.639999 246.889999 59.530006 234.160004 52.020004"/>
<path id="path15" fill="#00b3e3" stroke="none" d="M 165.559998 1.199997 L 165.559998 1.199997 L 165.559998 20.550003 L 173.960007 20.550003 L 173.960007 47.440002 L 193.309998 47.440002 L 193.309998 20.550003 L 165.550003 20.550003 L 165.550003 1.199997 M 193.300003 66.790001 L 173.949997 66.790001 L 173.949997 93.68 L 193.300003 93.68 L 193.300003 66.790001"/>
<path id="path16" fill="#008c3c" stroke="none" d="M 193.309998 93.69001 L 173.960007 93.69001 L 173.960007 113.039993 L 193.309998 113.039993 L 193.309998 93.69001"/>
<path id="path17" fill="#da3ab3" stroke="none" d="M 206.759995 1.199997 L 175.240005 1.199997 C 185.220001 1.210007 193.309998 9.300003 193.320007 19.279999 L 193.320007 20.550003 L 206.770004 20.550003 C 211.600006 20.509995 216.089996 23.059998 218.520004 27.240005 C 220.949997 31.419998 220.949997 36.580002 218.520004 40.760002 C 216.089996 44.940002 211.610001 47.490005 206.770004 47.450005 L 217.479996 47.450005 C 223.350006 47.450005 229.119995 49.020004 234.169998 52.020004 C 240.800003 41.950005 241.360001 29.050003 235.639999 18.440002 C 229.919998 7.830002 218.830002 1.210007 206.770004 1.210007"/>
<path id="path18" fill="#da2d2f" stroke="none" d="M 217.470001 47.440002 L 193.320007 47.440002 L 193.320007 66.790001 L 206.770004 66.790001 C 217.809998 66.790001 228.100006 61.230003 234.160004 52.010002 C 229.110001 49.010002 223.350006 47.43 217.470001 47.440002"/>
<path id="path19" fill="#00299f" stroke="none" d="M 175.229996 1.199997 L 165.550003 1.199997 L 165.550003 20.550003 L 193.300003 20.550003 L 193.300003 19.279999 C 193.289993 9.300003 185.199997 1.210007 175.220001 1.199997"/>
<path id="path20" fill="#00202a" stroke="none" d="M 193.309998 47.440002 L 173.960007 47.440002 L 173.960007 66.790001 L 193.309998 66.790001 L 193.309998 47.440002"/>
</g>
<g id="g3">
<path id="path21" fill="#da3ab3" stroke="none" d="M 327.700012 93.860008 L 282.350006 93.860008 L 282.350006 113.209991 L 263 113.209991 L 263 93.860008 L 263 113.209991 L 327.700012 113.209991 L 327.700012 93.860008"/>
<path id="path22" fill="#00b3e3" stroke="none" d="M 282.350006 1.289993 L 263 1.289993 L 263 93.860008 L 282.350006 93.860008 L 282.350006 1.289993"/>
<path id="path23" fill="#00299f" stroke="none" d="M 282.350006 93.860008 L 263 93.860008 L 263 113.209991 L 282.350006 113.209991 L 282.350006 93.860008"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.2 KiB

View File

@@ -0,0 +1,16 @@
<svg xmlns="http://www.w3.org/2000/svg" width="620" height="564" fill="none" viewBox="0 0 620 564">
<path stroke="url(#a)" stroke-linecap="round" stroke-opacity=".3" stroke-width="3" d="M169.279 190c5.039 319.778 448.994 285.135 448.994 161.651 0-161.651-448.994-41.612-448.994 210.143m0 0 66.508-52.016m-66.508 52.016L109 520.18"/>
<path stroke="url(#b)" stroke-linecap="round" stroke-width="3" d="M185.389 17.68c48.106 2.197 152.448 20.854 153.62 89.611 1.254 73.59-98.799 91.708-172.837 81.749-58.353-7.849-161.076-27.643-157.495-85.564 3.777-61.114 120.098-65.749 180.846-52.94"/>
<defs>
<radialGradient id="a" cx="0" cy="0" r="1" gradientTransform="matrix(-201.095 -542.55342 818.11807 -303.23182 510.728 652.012)" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFC843"/>
<stop offset=".477" stop-color="#00B3E3"/>
<stop offset="1" stop-color="#FF4338"/>
</radialGradient>
<radialGradient id="b" cx="0" cy="0" r="1" gradientTransform="matrix(-160.9414 -240.12117 445.53264 -298.61859 284.541 226.925)" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFC843"/>
<stop offset=".477" stop-color="#00B3E3"/>
<stop offset="1" stop-color="#FF4338"/>
</radialGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,16 @@
<svg xmlns="http://www.w3.org/2000/svg" width="468" height="425" fill="none" viewBox="0 0 468 425">
<path stroke="url(#a)" stroke-linecap="round" stroke-opacity=".3" stroke-width="3" d="M127.458 143.06c3.794 240.775 338.068 214.691 338.068 121.714 0-121.714-338.068-31.332-338.068 158.226m0 0 50.077-39.165M127.458 423l-45.387-31.333"/>
<path stroke="url(#b)" stroke-linecap="round" stroke-width="3" d="M139.588 13.312c36.221 1.655 114.785 15.702 115.667 67.472.945 55.41-74.39 69.051-130.136 61.553-43.938-5.91-121.282-20.814-118.586-64.425C9.377 31.896 96.96 28.406 142.701 38.051"/>
<defs>
<radialGradient id="a" cx="0" cy="0" r="1" gradientTransform="rotate(-110.337 363.077 111.673) scale(435.671 656.949)" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFC843"/>
<stop offset=".477" stop-color="#00B3E3"/>
<stop offset="1" stop-color="#FF4338"/>
</radialGradient>
<radialGradient id="b" cx="0" cy="0" r="1" gradientTransform="rotate(-123.832 152.707 28.272) scale(217.652 403.843)" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFC843"/>
<stop offset=".477" stop-color="#00B3E3"/>
<stop offset="1" stop-color="#FF4338"/>
</radialGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,28 @@
<svg xmlns="http://www.w3.org/2000/svg" width="325" height="412" fill="none" viewBox="0 0 325 412">
<path stroke="url(#a)" stroke-linecap="round" stroke-opacity=".1" stroke-width="3" d="M151.582 177.074c13.747 27.929 22.772 62.875 9.799 92.84-8.291 19.15-30.405 33.15-51.241 31.172-19.678-1.868-38.812-12.033-42.75-32.618-2.052-10.729.868-20.995 11.688-25.37 16.53-6.684 38.009 6.603 48.426 18.608 32.51 37.464 44.224 97.88 25.925 144.229"/>
<path stroke="url(#b)" stroke-linecap="round" stroke-opacity=".1" stroke-width="3" d="M181.287 381.224c-5.85 6.451-19.657 20.761-28.085 26.395"/>
<path stroke="url(#c)" stroke-linecap="round" stroke-opacity=".1" stroke-width="3" d="M153.202 407.619c-2.939-8.197-10.225-26.699-15.859-35.127"/>
<path stroke="url(#d)" stroke-linecap="round" stroke-width="3" d="M173.136 17.151c44.927 2.052 142.373 19.476 143.467 83.688 1.172 68.727-92.269 85.647-161.413 76.347-54.497-7.331-150.43-25.817-147.087-79.909 3.528-57.075 112.161-61.404 168.894-49.442"/>
<defs>
<radialGradient id="a" cx="0" cy="0" r="1" gradientTransform="matrix(-182.41424 53.97815 -102.85197 -347.57884 217.21 238.367)" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFC843"/>
<stop offset=".477" stop-color="#00B3E3"/>
<stop offset="1" stop-color="#FF4338"/>
</radialGradient>
<radialGradient id="b" cx="0" cy="0" r="1" gradientTransform="rotate(170.491 76.496 202.097) scale(34.9573 53.5866)" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFC843"/>
<stop offset=".477" stop-color="#00B3E3"/>
<stop offset="1" stop-color="#FF4338"/>
</radialGradient>
<radialGradient id="c" cx="0" cy="0" r="1" gradientTransform="matrix(-29.64967 -18.51782 28.38626 -45.45046 159.825 402.182)" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFC843"/>
<stop offset=".477" stop-color="#00B3E3"/>
<stop offset="1" stop-color="#FF4338"/>
</radialGradient>
<radialGradient id="d" cx="0" cy="0" r="1" gradientTransform="matrix(-150.3045 -224.25115 416.08692 -278.88257 265.735 212.567)" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFC843"/>
<stop offset=".477" stop-color="#00B3E3"/>
<stop offset="1" stop-color="#FF4338"/>
</radialGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--Generator: Apple Native CoreSVG 175.5-->
<!DOCTYPE svg
PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="19.082" height="19.2676">
<g>
<rect height="19.2676" opacity="0" width="19.082" x="0" y="0"/>
<path d="M0 7.79297C0 12.0898 3.49609 15.5859 7.79297 15.5859C9.49219 15.5859 11.0449 15.0391 12.3242 14.1211L17.1289 18.9355C17.3535 19.1602 17.6465 19.2676 17.959 19.2676C18.623 19.2676 19.082 18.7695 19.082 18.1152C19.082 17.8027 18.9648 17.5195 18.7598 17.3145L13.9844 12.5098C14.9902 11.2012 15.5859 9.57031 15.5859 7.79297C15.5859 3.49609 12.0898 0 7.79297 0C3.49609 0 0 3.49609 0 7.79297ZM1.66992 7.79297C1.66992 4.41406 4.41406 1.66992 7.79297 1.66992C11.1719 1.66992 13.916 4.41406 13.916 7.79297C13.916 11.1719 11.1719 13.916 7.79297 13.916C4.41406 13.916 1.66992 11.1719 1.66992 7.79297Z" fill="#000000" fill-opacity="0.75"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

20
static/img/maraku.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 86 KiB

BIN
static/img/test_avatar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

11
static/img/xmark.svg Normal file
View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--Generator: Apple Native CoreSVG 232.5-->
<!DOCTYPE svg
PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="387.147" height="387.391">
<g>
<rect height="387.391" opacity="0" width="387.147" x="0" y="0"/>
<path d="M6.31747 381.073C14.8624 389.374 29.0225 389.374 37.3233 381.073L193.573 224.823L349.823 381.073C358.124 389.374 372.528 389.618 380.829 381.073C389.13 372.528 389.13 358.612 380.829 350.312L224.579 193.817L380.829 37.5675C389.13 29.2667 389.374 15.1065 380.829 6.80575C372.284-1.73917 358.124-1.73917 349.823 6.80575L193.573 163.056L37.3233 6.80575C29.0225-1.73917 14.6183-1.98331 6.31747 6.80575C-1.98331 15.3507-1.98331 29.2667 6.31747 37.5675L162.567 193.817L6.31747 350.312C-1.98331 358.612-2.22745 372.773 6.31747 381.073Z" fill="#000000" fill-opacity="0.85"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 984 B

View File

@@ -0,0 +1,90 @@
$(document).ready(function () {
const createPaidTable = () => {
const table = document.getElementById("paidTable");
const tbody = table.querySelector("tbody");
// Очищаем таблицу
tbody.innerHTML = "";
paidPayments.forEach((payment) => {
const row = document.createElement("tr");
if (payment.path) {
row.setAttribute(
"onclick",
`window.open('` + API_SERVER + `/` + payment.path + `', '_blank')`
);
}
const data = document.createElement("td");
const rowContainer = document.createElement("div");
rowContainer.setAttribute("class", "row-container");
const rowContent = document.createElement("div");
rowContent.setAttribute("class", "row-content");
const paymentAmount = document.createElement("h1");
paymentAmount.textContent =
payment.amount.toLocaleString("ru-RU") + " рублей";
rowContent.appendChild(paymentAmount);
const paymentDate = document.createElement("h2");
paymentDate.textContent = payment.date;
rowContent.appendChild(paymentDate);
const paymentDescription = document.createElement("span");
paymentDescription.textContent = payment.name;
rowContent.appendChild(paymentDescription);
rowContainer.appendChild(rowContent);
data.appendChild(rowContainer);
row.appendChild(data);
tbody.appendChild(row);
});
};
const createNotPaidTable = () => {
const table = document.getElementById("notPaidTable");
const tbody = table.querySelector("tbody");
// Очищаем таблицу
tbody.innerHTML = "";
notPaidPayments.forEach((payment) => {
const row = document.createElement("tr");
if (payment.path) {
row.setAttribute(
"onclick",
`window.open('` + API_SERVER + `/` + payment.path + `', '_blank')`
);
}
const data = document.createElement("td");
const rowContainer = document.createElement("div");
rowContainer.setAttribute("class", "row-container");
const rowContent = document.createElement("div");
rowContent.setAttribute("class", "row-content");
const paymentAmount = document.createElement("h1");
paymentAmount.textContent =
payment.amount.toLocaleString("ru-RU") + " рублей";
rowContent.appendChild(paymentAmount);
const paymentDate = document.createElement("h2");
paymentDate.textContent = payment.date;
rowContent.appendChild(paymentDate);
const paymentDescription = document.createElement("span");
paymentDescription.textContent = payment.name;
rowContent.appendChild(paymentDescription);
rowContainer.appendChild(rowContent);
data.appendChild(rowContainer);
row.appendChild(data);
tbody.appendChild(row);
});
};
createPaidTable();
createNotPaidTable();
});

View File

@@ -0,0 +1,83 @@
$(document).ready(function () {
const createTable = () => {
const table = document.getElementById("documentsTable");
const tbody = table.querySelector("tbody");
// Очищаем таблицу
tbody.innerHTML = "";
documents.forEach((doc) => {
const row = document.createElement("tr");
row.setAttribute(
"onclick",
`window.open('` + API_SERVER + `/` + doc.path + `', '_blank')`
);
const data = document.createElement("td");
const rowContainer = document.createElement("div");
rowContainer.setAttribute("class", "row-container");
const rowIcon = document.createElement("div");
rowIcon.setAttribute("class", "row-icon");
let svgContent;
if (doc.type === "pdf") {
svgContent = `
<svg xmlns="http://www.w3.org/2000/svg" width="17" height="22" viewBox="0 0 17 22" fill="none">
<g clip-path="url(#clip0_209_356)">
<path d="M3.13331 22H13.8656C15.9588 22 16.9989 20.922 16.9989 18.788V9.471H9.68256C8.38844 9.471 7.77219 8.8451 7.77219 7.5317V0H3.13438C1.05081 0 0 1.0879 0 3.223V18.788C0 20.933 1.04125 22 3.13331 22ZM8.53081 14.7103C8.8655 14.7103 9.13963 14.773 9.35319 14.8984C9.56781 15.0238 9.72506 15.2042 9.82812 15.4374C9.93119 15.6706 9.98325 15.95 9.98325 16.2734C9.98325 16.6012 9.93013 16.8839 9.826 17.1215C9.72762 17.3531 9.56003 17.5459 9.34788 17.6715C9.13431 17.7991 8.86125 17.8629 8.53081 17.8629H7.27069V14.7103H8.53081ZM12.6267 14.7103V15.3197H11.2604V16.082H12.5035V16.6727H11.2604V17.8629H10.4869V14.7103H12.6267ZM5.70244 14.7103C5.95 14.7103 6.15719 14.7598 6.32294 14.8599C6.48975 14.9589 6.61513 15.0909 6.70013 15.2559C6.78513 15.422 6.82763 15.6046 6.82763 15.8037C6.82763 16.0039 6.78406 16.1865 6.698 16.3493C6.61061 16.515 6.47842 16.6507 6.31763 16.7398C6.12503 16.8423 5.91037 16.8923 5.69394 16.885H5.11912V17.8629H4.34563V14.7103H5.70244ZM8.40756 15.312H8.04419V17.2601H8.40756C8.54569 17.2601 8.66256 17.2403 8.76138 17.2007C8.85628 17.1636 8.9399 17.1009 9.00362 17.0192C9.07059 16.9298 9.11841 16.8267 9.14387 16.7167C9.17362 16.5957 9.1885 16.4538 9.1885 16.2921C9.1885 16.0765 9.16194 15.8961 9.10775 15.7498C9.06155 15.6139 8.97247 15.498 8.85487 15.4209C8.71883 15.3422 8.56434 15.3041 8.40863 15.3109L8.40756 15.312ZM5.525 15.2933H5.117V16.3141H5.525C5.6204 16.3168 5.71506 16.296 5.80125 16.2536C5.8771 16.216 5.9401 16.1554 5.98188 16.0798C6.02508 15.9948 6.04631 15.8997 6.0435 15.8037C6.0435 15.6387 5.99781 15.5111 5.90538 15.4242C5.79946 15.3316 5.6634 15.2855 5.525 15.2933ZM9.15875 0.1133C9.58269 0.1848 9.99706 0.4818 10.472 0.9746L16.0406 6.7309C16.5261 7.2336 16.8194 7.6439 16.8799 8.0652H9.71125C9.33831 8.0652 9.15556 7.8804 9.15556 7.5108L9.15875 0.1133Z" fill="#FF3B30"/>
</g>
<defs>
<clipPath id="clip0_209_356">
<rect width="17" height="22" fill="white"/>
</clipPath>
</defs>
</svg>
`;
} else if (doc.type === "doc" || doc.type === "docx") {
svgContent = `
<svg width="20" height="20" xmlns="http://www.w3.org/2000/svg" aria-label="Office Open XML word processing document" data-testid="word-icon"><path d="M16.795 0c1.115 0 1.519.116 1.926.334.407.218.727.538.945.945.218.407.334.811.334 1.926v13.59c0 1.115-.116 1.519-.334 1.926a2.272 2.272 0 01-.945.945c-.407.218-.811.334-1.926.334H3.205c-1.115 0-1.519-.116-1.926-.334a2.272 2.272 0 01-.945-.945C.116 18.314 0 17.91 0 16.795V3.205C0 2.09.116 1.686.334 1.279.552.872.872.552 1.279.334 1.686.116 2.09 0 3.205 0h13.59zM5.177 4.931H3.264L6.098 15.5h1.734L10 7.867h.105l2.179 7.633h1.727l2.834-10.569h-1.904l-1.83 7.99h-.105l-2.132-7.99H9.231l-2.11 7.99h-.106l-1.838-7.99z" fill="#205BC5" fill-rule="evenodd"></path></svg>
`;
} else {
svgContent = `
<svg xmlns="http://www.w3.org/2000/svg" width="17" height="22" viewBox="0 0 17 22" fill="none">
<g clip-path="url(#clip0_209_356)">
<path d="M3.13331 22H13.8656C15.9588 22 16.9989 20.922 16.9989 18.788V9.471H9.68256C8.38844 9.471 7.77219 8.8451 7.77219 7.5317V0H3.13438C1.05081 0 0 1.0879 0 3.223V18.788C0 20.933 1.04125 22 3.13331 22ZM8.53081 14.7103C8.8655 14.7103 9.13963 14.773 9.35319 14.8984C9.56781 15.0238 9.72506 15.2042 9.82812 15.4374C9.93119 15.6706 9.98325 15.95 9.98325 16.2734C9.98325 16.6012 9.93013 16.8839 9.826 17.1215C9.72762 17.3531 9.56003 17.5459 9.34788 17.6715C9.13431 17.7991 8.86125 17.8629 8.53081 17.8629H7.27069V14.7103H8.53081ZM12.6267 14.7103V15.3197H11.2604V16.082H12.5035V16.6727H11.2604V17.8629H10.4869V14.7103H12.6267ZM5.70244 14.7103C5.95 14.7103 6.15719 14.7598 6.32294 14.8599C6.48975 14.9589 6.61513 15.0909 6.70013 15.2559C6.78513 15.422 6.82763 15.6046 6.82763 15.8037C6.82763 16.0039 6.78406 16.1865 6.698 16.3493C6.61061 16.515 6.47842 16.6507 6.31763 16.7398C6.12503 16.8423 5.91037 16.8923 5.69394 16.885H5.11912V17.8629H4.34563V14.7103H5.70244ZM8.40756 15.312H8.04419V17.2601H8.40756C8.54569 17.2601 8.66256 17.2403 8.76138 17.2007C8.85628 17.1636 8.9399 17.1009 9.00362 17.0192C9.07059 16.9298 9.11841 16.8267 9.14387 16.7167C9.17362 16.5957 9.1885 16.4538 9.1885 16.2921C9.1885 16.0765 9.16194 15.8961 9.10775 15.7498C9.06155 15.6139 8.97247 15.498 8.85487 15.4209C8.71883 15.3422 8.56434 15.3041 8.40863 15.3109L8.40756 15.312ZM5.525 15.2933H5.117V16.3141H5.525C5.6204 16.3168 5.71506 16.296 5.80125 16.2536C5.8771 16.216 5.9401 16.1554 5.98188 16.0798C6.02508 15.9948 6.04631 15.8997 6.0435 15.8037C6.0435 15.6387 5.99781 15.5111 5.90538 15.4242C5.79946 15.3316 5.6634 15.2855 5.525 15.2933ZM9.15875 0.1133C9.58269 0.1848 9.99706 0.4818 10.472 0.9746L16.0406 6.7309C16.5261 7.2336 16.8194 7.6439 16.8799 8.0652H9.71125C9.33831 8.0652 9.15556 7.8804 9.15556 7.5108L9.15875 0.1133Z" fill="#FF3B30"/>
</g>
<defs>
<clipPath id="clip0_209_356">
<rect width="17" height="22" fill="white"/>
</clipPath>
</defs>
</svg>
`;
}
rowIcon.innerHTML = svgContent;
rowContainer.appendChild(rowIcon);
const rowContent = document.createElement("div");
rowContent.setAttribute("class", "row-content");
const documentName = document.createElement("h1");
documentName.textContent = doc.name;
rowContent.appendChild(documentName);
const documentType = document.createElement("h2");
documentType.textContent = doc.type;
rowContent.appendChild(documentType);
const date = document.createElement("span");
date.textContent = doc.date;
rowContent.appendChild(date);
rowContainer.appendChild(rowContent);
data.appendChild(rowContainer);
row.appendChild(data);
tbody.appendChild(row);
});
};
createTable();
});

File diff suppressed because one or more lines are too long

10965
static/scripts/jquery.min.js vendored Normal file

File diff suppressed because it is too large Load Diff

2
static/scripts/moment.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,46 @@
$(document).ready(function () {
const createTable = () => {
const table = document.getElementById("paymentsTable");
const tbody = table.querySelector("tbody");
// Очищаем таблицу
tbody.innerHTML = "";
payments.forEach((payment) => {
const row = document.createElement("tr");
if (payment.path) {
row.setAttribute(
"onclick",
`window.open('` + API_SERVER + `/` + payment.path + `', '_blank')`
);
}
const data = document.createElement("td");
const rowContainer = document.createElement("div");
rowContainer.setAttribute("class", "row-container");
const rowContent = document.createElement("div");
rowContent.setAttribute("class", "row-content");
const paymentAmount = document.createElement("h1");
paymentAmount.textContent =
payment.amount.toLocaleString("ru-RU") + " рублей";
rowContent.appendChild(paymentAmount);
const paymentDate = document.createElement("h2");
paymentDate.textContent = payment.date;
rowContent.appendChild(paymentDate);
const paymentDescription = document.createElement("span");
paymentDescription.textContent = payment.name;
rowContent.appendChild(paymentDescription);
rowContainer.appendChild(rowContent);
data.appendChild(rowContainer);
row.appendChild(data);
tbody.appendChild(row);
});
};
createTable();
});

View File

@@ -0,0 +1,67 @@
function toggleAccount() {
if ($("#dropdownAccount").hasClass("is-visible")) {
event.preventDefault();
$("#dropdownAccount").removeClass("is-visible");
$("#dropdownAccount").css("display", "none");
} else {
event.preventDefault();
$("#dropdownAccount").css("display", "inline-flex");
setTimeout(function () {
$("#dropdownAccount").addClass("is-visible");
}, 100);
}
}
$(document).on("click", function (event) {
if ($(event.target).closest("#userIcon").length) {
return;
} else {
if (!$(event.target).closest(".dropdown-account").length) {
$("#dropdownAccount").removeClass("is-visible");
setTimeout(function () {
$("#dropdownAccount").css("display", "none");
}, 200);
}
}
});
$(document).ready(function () {
$(document).keydown(function (e) {
if (e.key === "Escape" || e.key === "Esc") {
$("#dropdownAccount").removeClass("is-visible");
setTimeout(function () {
$("#dropdownAccount").css("display", "none");
}, 200);
}
});
});
function setTheme(theme) {
document.documentElement.setAttribute("data-theme", theme);
const themeButtons = document.querySelectorAll(".theme-btn");
themeButtons.forEach((button) => button.classList.remove("active"));
const selectedButton = document.getElementById(`${theme}-theme-btn`);
selectedButton.classList.add("active");
localStorage.setItem("theme", theme);
}
document.addEventListener("DOMContentLoaded", function () {
const savedTheme = localStorage.getItem("theme");
if (savedTheme) {
setTheme(savedTheme);
}
});
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;
}

View File

@@ -0,0 +1,119 @@
$(document).ready(function () {
$("#date-range").dateRangePicker({
autoClose: true,
format: "DD/MM/YYYY",
separator: " - ",
language: "ru",
startOfWeek: "monday",
getValue: function () {
return this.innerHTML;
},
setValue: function (s) {
this.innerHTML =
`<svg xmlns="http://www.w3.org/2000/svg" width="18" height="16" viewBox="0 0 18 16" fill="none">
<g clip-path="url(#clip0_89_144)">
<path d="M2.72599 16H14.5849C16.3994 16 17.3022 15.0971 17.3022 13.3087V2.7086C17.3022 0.92021 16.3994 0.017334 14.5849 0.017334H2.72599C0.911559 0.017334 0 0.91153 0 2.7086V13.3087C0 15.1058 0.911559 16 2.72599 16ZM2.59577 14.6023C1.82311 14.6023 1.39772 14.1942 1.39772 13.3869V5.20018C1.39772 4.40148 1.82311 3.9848 2.59577 3.9848H14.6978C15.4704 3.9848 15.9045 4.40148 15.9045 5.20018V13.3869C15.9045 14.1942 15.4704 14.6023 14.6978 14.6023H2.59577ZM6.96257 7.10144H7.47477C7.77862 7.10144 7.87414 7.01464 7.87414 6.71078V6.19855C7.87414 5.89469 7.77862 5.79922 7.47477 5.79922H6.96257C6.65872 5.79922 6.55453 5.89469 6.55453 6.19855V6.71078C6.55453 7.01464 6.65872 7.10144 6.96257 7.10144ZM9.84481 7.10144H10.357C10.6609 7.10144 10.765 7.01464 10.765 6.71078V6.19855C10.765 5.89469 10.6609 5.79922 10.357 5.79922H9.84481C9.54099 5.79922 9.4368 5.89469 9.4368 6.19855V6.71078C9.4368 7.01464 9.54099 7.10144 9.84481 7.10144ZM12.7271 7.10144H13.2393C13.5431 7.10144 13.6473 7.01464 13.6473 6.71078V6.19855C13.6473 5.89469 13.5431 5.79922 13.2393 5.79922H12.7271C12.4232 5.79922 12.3277 5.89469 12.3277 6.19855V6.71078C12.3277 7.01464 12.4232 7.10144 12.7271 7.10144ZM4.0803 9.94029H4.58382C4.89636 9.94029 4.99187 9.85349 4.99187 9.54963V9.0374C4.99187 8.73354 4.89636 8.64674 4.58382 8.64674H4.0803C3.76777 8.64674 3.67226 8.73354 3.67226 9.0374V9.54963C3.67226 9.85349 3.76777 9.94029 4.0803 9.94029ZM6.96257 9.94029H7.47477C7.77862 9.94029 7.87414 9.85349 7.87414 9.54963V9.0374C7.87414 8.73354 7.77862 8.64674 7.47477 8.64674H6.96257C6.65872 8.64674 6.55453 8.73354 6.55453 9.0374V9.54963C6.55453 9.85349 6.65872 9.94029 6.96257 9.94029ZM9.84481 9.94029H10.357C10.6609 9.94029 10.765 9.85349 10.765 9.54963V9.0374C10.765 8.73354 10.6609 8.64674 10.357 8.64674H9.84481C9.54099 8.64674 9.4368 8.73354 9.4368 9.0374V9.54963C9.4368 9.85349 9.54099 9.94029 9.84481 9.94029ZM12.7271 9.94029H13.2393C13.5431 9.94029 13.6473 9.85349 13.6473 9.54963V9.0374C13.6473 8.73354 13.5431 8.64674 13.2393 8.64674H12.7271C12.4232 8.64674 12.3277 8.73354 12.3277 9.0374V9.54963C12.3277 9.85349 12.4232 9.94029 12.7271 9.94029ZM4.0803 12.7878H4.58382C4.89636 12.7878 4.99187 12.6923 4.99187 12.3885V11.8763C4.99187 11.5724 4.89636 11.4856 4.58382 11.4856H4.0803C3.76777 11.4856 3.67226 11.5724 3.67226 11.8763V12.3885C3.67226 12.6923 3.76777 12.7878 4.0803 12.7878ZM6.96257 12.7878H7.47477C7.77862 12.7878 7.87414 12.6923 7.87414 12.3885V11.8763C7.87414 11.5724 7.77862 11.4856 7.47477 11.4856H6.96257C6.65872 11.4856 6.55453 11.5724 6.55453 11.8763V12.3885C6.55453 12.6923 6.65872 12.7878 6.96257 12.7878ZM9.84481 12.7878H10.357C10.6609 12.7878 10.765 12.6923 10.765 12.3885V11.8763C10.765 11.5724 10.6609 11.4856 10.357 11.4856H9.84481C9.54099 11.4856 9.4368 11.5724 9.4368 11.8763V12.3885C9.4368 12.6923 9.54099 12.7878 9.84481 12.7878Z" fill="black"/>
</g>
<defs>
<clipPath id="clip0_89_144">
<rect width="17.3022" height="16" fill="white"/>
</clipPath>
</defs>
</svg>` + s;
},
startDate: false,
endDate: false,
time: {
enabled: false,
},
minDays: 0,
maxDays: 0,
showShortcuts: false,
shortcuts: {
//'prev-days': [1,3,5,7],
//'next-days': [3,5,7],
//'prev' : ['week','month','year'],
//'next' : ['week','month','year']
},
customShortcuts: [],
inline: false,
container: "body",
alwaysOpen: false,
singleDate: false,
lookBehind: false,
batchMode: false,
duration: 200,
stickyMonths: false,
dayDivAttrs: [],
dayTdAttrs: [],
applyBtnClass: "",
singleMonth: "true",
hoveringTooltip: function (days, startTime, hoveringTime) {
return days > 1 ? days + " " + lang("days") : "";
},
showTopbar: false,
swapTime: false,
selectForward: false,
selectBackward: false,
showWeekNumbers: false,
getWeekNumber: function (date) {
return moment(date).format("w");
},
monthSelect: false,
yearSelect: false,
});
const createTable = () => {
const table = document.getElementById("modules-table");
const tbody = table.querySelector("tbody");
// Очищаем таблицу
tbody.innerHTML = "";
modules.forEach((modul) => {
const row = document.createElement("tr");
const data = document.createElement("td");
const rowContainer = document.createElement("div");
rowContainer.setAttribute("class", "row-container");
const rowContent = document.createElement("div");
rowContent.setAttribute("class", "row-content");
const moduleName = document.createElement("h1");
moduleName.textContent = modul.name;
rowContent.appendChild(moduleName);
const moduleStatus = document.createElement("h2");
moduleStatus.textContent = modul.status + "%";
rowContent.appendChild(moduleStatus);
const status = document.createElement("div");
status.setAttribute("class", "status");
status.style.backgroundColor = "rgba(0, 0, 0, 0.05)";
const fill = document.createElement("div");
if (modul.status === 100) {
fill.style.width = `${modul.status}%`;
fill.style.height = "100%";
fill.style.backgroundColor = "#32D74B";
fill.style.borderRadius = "5px";
} else {
fill.style.width = `${modul.status}%`;
fill.style.height = "100%";
fill.style.backgroundColor = "#FFB74B";
fill.style.borderRadius = "5px 0px 0px 5px";
}
status.appendChild(fill);
rowContent.appendChild(status);
rowContainer.appendChild(rowContent);
data.appendChild(rowContainer);
row.appendChild(data);
tbody.appendChild(row);
});
};
createTable();
});

View File

@@ -0,0 +1,482 @@
.date-picker {
width: 170px;
height: 25px;
padding: 0;
border: 0;
line-height: 25px;
padding-left: 10px;
font-size: 12px;
font-family: Arial, sans-serif;
font-weight: bold;
cursor: pointer;
color: #303030;
position: relative;
z-index: 2;
}
.date-picker-wrapper {
position: absolute;
z-index: 1;
border: 1px solid rgba(0, 0, 0, 0.1);
border-radius: 12px;
box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.02),
0px 4px 8px -4px rgba(0, 0, 0, 0.04), 0px 16px 24px -8px rgba(0, 0, 0, 0.06);
background-color: #fff;
padding: 5px 12px;
margin-top: 10px;
font-size: 12px;
line-height: 20px;
color: #aaa;
font-family: Arial, sans-serif;
-webkit-box-sizing: initial;
box-sizing: initial;
}
.dp-clearfix {
clear: both;
height: 0;
font-size: 0;
}
.date-picker-wrapper.inline-wrapper {
position: relative;
-webkit-box-shadow: none;
box-shadow: none;
display: inline-block;
}
.date-picker-wrapper.single-date {
width: auto;
}
.date-picker-wrapper.no-shortcuts {
padding-bottom: 12px;
}
.date-picker-wrapper.no-topbar {
padding-top: 12px;
}
.date-picker-wrapper .footer {
font-size: 11px;
padding-top: 3px;
}
.date-picker-wrapper b {
color: #666;
font-weight: 700;
}
.date-picker-wrapper a {
color: #6bb4d6;
text-decoration: underline;
}
.date-picker-wrapper .month-name {
text-transform: uppercase;
}
.date-picker-wrapper .select-wrapper {
position: relative;
overflow: hidden;
display: inline-block;
vertical-align: middle;
}
.date-picker-wrapper .select-wrapper:hover {
text-decoration: underline;
}
.date-picker-wrapper .month-element {
display: inline-block;
vertical-align: middle;
}
.date-picker-wrapper .select-wrapper select {
position: absolute;
margin: 0;
padding: 0;
left: 0;
top: -1px;
font-size: inherit;
font-style: inherit;
font-weight: inherit;
text-transform: inherit;
color: inherit;
cursor: pointer;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background: transparent;
border: 0;
outline: 0;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=1)";
filter: alpha(opacity=1);
opacity: 0.01;
}
.date-picker-wrapper .month-wrapper {
width: 245px;
border-radius: 3px;
background-color: #fff;
padding: 5px;
cursor: default;
position: relative;
_overflow: hidden;
}
.date-picker-wrapper .month-wrapper table {
width: 245px;
float: left;
border-spacing: 3px 3px;
}
.date-picker-wrapper .month-wrapper table.month2 {
width: 190px;
float: left;
}
.date-picker-wrapper .month-wrapper table th,
.date-picker-wrapper .month-wrapper table td {
vertical-align: middle;
text-align: center;
line-height: 14px;
margin: 0px;
padding: 0px;
}
.date-picker-wrapper .month-wrapper table .day {
/* padding: 8px 8px; */
height: 32px;
width: 32px;
display: flex;
justify-content: center;
align-items: center;
border-radius: 3px;
line-height: 1;
font-size: 14px;
margin-bottom: 1px;
color: #ccc;
cursor: default;
}
.date-picker-wrapper .month-wrapper table div.day.lastMonth,
.date-picker-wrapper .month-wrapper table div.day.nextMonth {
color: #999;
cursor: default;
}
.date-picker-wrapper .month-wrapper table .day.checked {
background-color: rgba(0, 0, 0, 0.06);
}
.date-picker-wrapper .month-wrapper table .week-name {
height: 20px;
line-height: 20px;
font-weight: 100;
text-transform: uppercase;
}
.date-picker-wrapper .month-wrapper table .day.has-tooltip {
cursor: help !important;
}
.date-picker-wrapper .month-wrapper table .day.has-tooltip .tooltip {
white-space: nowrap;
}
.date-picker-wrapper .time label {
white-space: nowrap;
}
.date-picker-wrapper .month-wrapper table .day.toMonth.valid {
color: #333;
cursor: pointer;
}
.date-picker-wrapper .month-wrapper table .day.toMonth.hovering {
background-color: rgba(0, 0, 0, 0.04);
}
.date-picker-wrapper .month-wrapper table .day.nextMonth,
.date-picker-wrapper .month-wrapper table .day.lastMonth {
display: none;
}
.date-picker-wrapper .month-wrapper table .day.real-today {
background-color: #ffe684;
}
.date-picker-wrapper .month-wrapper table .day.real-today.checked,
.date-picker-wrapper .month-wrapper table .day.real-today.hovering {
background-color: #70ccd5;
}
.date-picker-wrapper table .caption {
height: 40px;
}
.date-picker-wrapper table .caption > th:first-of-type,
.date-picker-wrapper table .caption > th:last-of-type {
width: 27px;
}
.date-picker-wrapper table .caption .next,
.date-picker-wrapper table .caption .prev {
padding: 5px 7px;
cursor: pointer;
border-radius: 3px;
transition: 0.1s;
}
.date-picker-wrapper table .caption .next:hover,
.date-picker-wrapper table .caption .prev:hover {
background-color: #ccc;
color: white;
}
.date-picker-wrapper .gap {
position: relative;
z-index: 1;
width: 15px;
height: 100%;
background-color: red;
font-size: 0;
line-height: 0;
float: left;
top: -5px;
margin: 0 10px -10px;
visibility: hidden;
height: 0;
}
.date-picker-wrapper .gap .gap-lines {
height: 100%;
overflow: hidden;
}
.date-picker-wrapper .gap .gap-line {
height: 15px;
width: 15px;
position: relative;
}
.date-picker-wrapper .gap .gap-line .gap-1 {
z-index: 1;
height: 0;
border-left: 8px solid white;
border-top: 8px solid #eee;
border-bottom: 8px solid #eee;
}
.date-picker-wrapper .gap .gap-line .gap-2 {
position: absolute;
right: 0;
top: 0px;
z-index: 2;
height: 0;
border-left: 8px solid transparent;
border-top: 8px solid white;
}
.date-picker-wrapper .gap .gap-line .gap-3 {
position: absolute;
right: 0;
top: 8px;
z-index: 2;
height: 0;
border-left: 8px solid transparent;
border-bottom: 8px solid white;
}
.date-picker-wrapper .gap .gap-top-mask {
width: 6px;
height: 1px;
position: absolute;
top: -1px;
left: 1px;
background-color: #eee;
z-index: 3;
}
.date-picker-wrapper .gap .gap-bottom-mask {
width: 6px;
height: 1px;
position: absolute;
bottom: -1px;
left: 7px;
background-color: #eee;
z-index: 3;
}
.date-picker-wrapper .selected-days {
display: none;
}
.date-picker-wrapper .drp_top-bar {
line-height: 1.4;
position: relative;
padding: 10px 40px 10px 0;
}
.date-picker-wrapper .drp_top-bar .error-top,
.date-picker-wrapper .drp_top-bar .normal-top {
display: none;
}
.date-picker-wrapper .drp_top-bar .default-top {
display: block;
}
.date-picker-wrapper .drp_top-bar.error .default-top {
display: none;
}
.date-picker-wrapper .drp_top-bar.error .error-top {
display: block;
color: red;
}
.date-picker-wrapper .drp_top-bar.normal .default-top {
display: none;
}
.date-picker-wrapper .drp_top-bar.normal .normal-top {
display: block;
}
.date-picker-wrapper .drp_top-bar.normal .normal-top .selection-top {
color: #333;
}
.date-picker-wrapper .drp_top-bar .apply-btn {
position: absolute;
right: 0px;
top: 6px;
padding: 3px 5px;
margin: 0;
font-size: 12px;
border-radius: 4px;
cursor: pointer;
color: #d9eef7;
border: solid 1px #0076a3;
background: #0095cd;
background: -moz-linear-gradient(top, #00adee, #0078a5);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00adee', endColorstr='#0078a5');
color: white;
line-height: initial;
}
.date-picker-wrapper .drp_top-bar .apply-btn.disabled {
cursor: pointer;
color: #606060;
border: solid 1px #b7b7b7;
background: #fff;
background: -moz-linear-gradient(top, #fff, #ededed);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#ededed');
}
.date-picker-wrapper .time {
position: relative;
}
.date-picker-wrapper.single-month .time {
display: block;
}
.date-picker-wrapper .time input[type="range"] {
vertical-align: middle;
width: 129px;
padding: 0;
margin: 0;
height: 20px;
}
.date-picker-wrapper .time1 {
width: 180px;
padding: 0 5px;
text-align: center;
}
/*time styling*/
.time2 {
width: 180px;
padding: 0 5px;
text-align: center;
}
.date-picker-wrapper .time1 {
float: left;
}
.date-picker-wrapper .time2 {
float: right;
}
.date-picker-wrapper .hour {
text-align: right;
}
.minute {
text-align: right;
}
.date-picker-wrapper .hide {
display: none;
}
.date-picker-wrapper .first-date-selected,
.date-picker-wrapper .last-date-selected {
background-color: #000 !important;
color: white !important;
border-radius: 5px;
}
.date-picker-wrapper .date-range-length-tip {
position: absolute;
margin-top: -4px;
margin-left: -8px;
-webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.3);
box-shadow: 0 0 3px rgba(0, 0, 0, 0.3);
display: none;
background-color: yellow;
padding: 0 6px;
border-radius: 2px;
font-size: 12px;
line-height: 16px;
-webkit-filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.3));
-moz-filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.3));
-ms-filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.3));
-o-filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.3));
filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.3));
}
.date-picker-wrapper .date-range-length-tip:after {
content: "";
position: absolute;
border-left: 4px solid transparent;
border-right: 4px solid transparent;
border-top: 4px solid yellow;
left: 50%;
margin-left: -4px;
bottom: -4px;
}
.date-picker-wrapper.two-months.no-gap .month1 .next,
.date-picker-wrapper.two-months.no-gap .month2 .prev {
display: none;
}
.date-picker-wrapper .week-number {
padding: 5px 0;
line-height: 1;
font-size: 12px;
margin-bottom: 1px;
color: #999;
cursor: pointer;
}
.date-picker-wrapper .week-number.week-number-selected {
color: #49e;
font-weight: bold;
}

2264
static/styles/main.css Normal file

File diff suppressed because it is too large Load Diff

332
static/templates/index.html Normal file
View File

@@ -0,0 +1,332 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>KRBL</title>
<link rel="icon" type="image/x-icon" href="../img/favicon.png">
<link href="https://fonts.googleapis.com/css?family=Montserrat" rel="stylesheet">
<link rel="stylesheet" href="../styles/main.css">
<script src="../scripts/jquery.min.js"></script>
<script>
const API_SERVER = "{{API_SERVER}}";
</script>
<script src="https://yastatic.net/s3/passport-sdk/autofill/v1/sdk-suggest-with-polyfills-latest.js"></script>
<meta name="google-signin-client_id" content="638774553513-tsobvdtj1g0p43obm3e9epekbjksdmoj.apps.googleusercontent.com">
<script src="https://accounts.google.com/gsi/client" async></script>
<script>
window.YaAuthSuggest.init(
{
client_id: '8976c8bc90784da89467f3abd34f0192',
response_type: 'token',
redirect_uri: '{{SITE_DOMAIN}}/yandexauth'
}
,
'{{SITE_DOMAIN}}',
{
view: "button",
parentId: "yandexButtonContainerId",
buttonSize: 's',
buttonView: 'main',
buttonTheme: 'dark',
buttonBorderRadius: "4",
buttonIcon: 'ya',
}
)
.then(({handler}) => handler())
.then(data => console.log('Сообщение с токеном', data))
.catch(error => console.log('Обработка ошибки', error))
</script>
</head>
<body>
<header>
<div class="burger-container" onclick="document.querySelector('header').classList.toggle('menu-opened');">
<div id="burger">
<div class="bar topBar"></div>
<div class="bar btmBar"></div>
</div>
</div>
<ul class="menu">
<li class="menu-item"><a onclick="alert('Этот раздел в разработке.');" href="#about">О нас</a></li>
<li class="menu-item"><a onclick="alert('Этот раздел в разработке.');" href="#projects">Проекты</a></li>
<li class="menu-item"><a onclick="alert('Этот раздел в разработке.');" href="#possibilities">Возможности</a></li>
<li class="menu-item">
<a href="mailto:contact@krbl.ru">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="16" fill="none" viewBox="0 0 20 16">
<path fill="#000" fill-opacity=".85" d="M10.018 9.08c.371 0 .716-.176 1.114-.584L19.012.51c-.335-.334-.96-.491-1.856-.491H2.572c-.76 0-1.295.148-1.594.454l7.926 8.023c.39.4.734.585 1.114.585ZM.226 14.508 6.63 8.023.208 1.54C.072 1.8 0 2.245 0 2.885v10.24c0 .658.072 1.122.226 1.382ZM2.844 16h14.584c.76 0 1.286-.148 1.585-.445l-6.531-6.623-.598.622c-.625.612-1.214.89-1.866.89-.661 0-1.25-.278-1.866-.89l-.607-.622-6.512 6.614c.344.306.942.454 1.811.454Zm16.939-1.503c.145-.269.217-.723.217-1.372V2.885c0-.622-.072-1.067-.2-1.317l-6.403 6.455 6.386 6.474Z"/>
</svg>
Написать нам
</a>
</li>
<li class="menu-item">
<a href="https://github.com/KRBL-Group" target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" width="21" height="20" fill="none" viewBox="0 0 21 20">
<path fill="#24292F" fill-rule="evenodd" d="M10.469 0C4.679 0 0 4.583 0 10.254c0 4.532 2.998 8.369 7.158 9.727.52.102.71-.221.71-.493 0-.237-.016-1.052-.016-1.9-2.913.61-3.519-1.223-3.519-1.223-.468-1.188-1.161-1.494-1.161-1.494-.954-.628.07-.628.07-.628 1.056.068 1.611 1.052 1.611 1.052.936 1.562 2.444 1.12 3.05.85.087-.663.365-1.121.66-1.376-2.323-.238-4.767-1.12-4.767-5.059 0-1.12.416-2.037 1.074-2.75-.104-.254-.468-1.307.104-2.716 0 0 .884-.272 2.877 1.052a10.335 10.335 0 0 1 2.618-.34c.884 0 1.785.12 2.617.34 1.993-1.324 2.877-1.052 2.877-1.052.572 1.409.208 2.462.104 2.716.676.713 1.075 1.63 1.075 2.75 0 3.939-2.444 4.804-4.784 5.06.381.322.71.933.71 1.9 0 1.375-.017 2.479-.017 2.818 0 .272.191.595.71.493 4.16-1.359 7.16-5.195 7.16-9.728C20.936 4.584 16.24 0 10.468 0Z" clip-rule="evenodd"/>
</svg>
Наш Github
</a>
</li>
</ul>
</header>
<section id="content">
<section id="main-section">
<img src="../img/krbl.svg">
<h1>Мы <span>разрабатываем</span> проекты <br> которые радуют ваших клиентов <br> и развивают ваш бизнес</h1>
</section>
<div id="writeUsButton">Связаться с нами</div>
<div id="accountButton">Личный кабинет</div>
<form id="loginForm">
<div id="login-form-popup-bg" class="form-popup-bg">
<div id="login-form-container" class="form-container">
<img src="../img/xmark.svg" id="btnCloseFormLogin" class="close-button">
<img id="logo" src="../img/krbl.svg">
<h1>Авторизация для клиентов</h1>
<div class="form-cell-wrapper form-textbox">
<input name="email" type="text" id="login-email" autocorrect="off" autocapitalize="off" aria-required="true" required="required" spellcheck="false" class="force-ltr form-textbox-input" aria-invalid="false" onfocus="focusHandler(this)" onblur="blurHandler(this)">
<span aria-hidden="true" id="login-email-label" class="form-textbox-label form-label-flyout">Электронная почта</span>
</div>
<div class="form-cell-wrapper form-textbox">
<input name="password" type="password" id="login-password" autocorrect="off" autocapitalize="off" aria-required="true" required="required" spellcheck="false" class="force-ltr form-textbox-input" aria-invalid="false" onfocus="focusHandler(this)" onblur="blurHandler(this)">
<span aria-hidden="true" id="login-password-label" class="form-textbox-label form-label-flyout">Пароль</span>
</div>
<button type="submit" class="form-button" id="loginButton">Войти с почтой</button>
<!-- <div id="g_id_onload"
data-client_id="638774553513-tsobvdtj1g0p43obm3e9epekbjksdmoj.apps.googleusercontent.com"
data-login_uri="{{SITE_DOMAIN}}"
data-auto_prompt="false">
</div>
<div class="g_id_signin"
data-type="standard"
data-shape="rectangular"
data-theme="outline"
data-text="signin_with"
data-size="large"
data-width="328"
data-logo_alignment="left">
</div>
<div class="form-button" id="yandexButtonContainerId"></div> -->
<a href="mailto:contact@krbl.ru" id="forgotLink">Забыли пароль? <svg width="9" height="9" viewBox="0 0 9 9" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8.2489 6.23474L8.24353 0.847534C8.24353 0.428589 7.96423 0.143921 7.53992 0.143921H2.14734C1.74988 0.143921 1.45984 0.444702 1.45984 0.804565C1.45984 1.15906 1.76599 1.4491 2.1366 1.4491H4.0863L6.16492 1.3739L5.20349 2.22791L0.245972 7.1908C0.106323 7.33044 0.0257568 7.50769 0.0257568 7.67957C0.0257568 8.02869 0.348022 8.36169 0.707886 8.36169C0.885132 8.36169 1.05164 8.2865 1.19666 8.14148L6.15955 3.18396L7.01892 2.22253L6.93298 4.22058V6.24548C6.93298 6.62146 7.22302 6.92761 7.58289 6.92761C7.94275 6.92761 8.2489 6.62683 8.2489 6.23474Z" fill="#4B80CB"/>
</svg>
</a>
</div>
</div>
</form>
<form id="feedbackForm">
<div id="feedback-form-popup-bg" class="form-popup-bg">
<div class="form-container" id="preFeedback">
<img src="../img/xmark.svg" id="btnCloseForm" class="close-button">
<img id="logo" src="../img/krbl.svg">
<h1>Запрос на обратную связь</h1>
<div class="form-cell-wrapper form-textbox">
<input type="text" id="feedback-name" autocorrect="off" autocapitalize="off" aria-required="true" required="required" spellcheck="false" class="force-ltr form-textbox-input" autocomplete="off" aria-invalid="false" onfocus="focusHandler(this)" onblur="blurHandler(this)">
<span aria-hidden="true" id="feedback-name-label" class="form-textbox-label form-label-flyout">Ваше имя</span>
</div>
<div class="form-cell-wrapper form-textbox">
<input data-inputmask-showmaskonhover="false" type="text" id="feedback-phone" autocorrect="off" autocapitalize="off" aria-required="true" required="required" spellcheck="false" class="force-ltr form-textbox-input" autocomplete="off" aria-invalid="false" onfocus="focusHandler(this)" onblur="blurHandler(this)">
<span aria-hidden="true" id="feedback-phone-label" class="form-textbox-label form-label-flyout">Номер телефона</span>
</div>
<div class="form-cell-wrapper form-textbox">
<input type="text" id="feedback-email" autocorrect="off" autocapitalize="off" aria-required="true" required="required" spellcheck="false" class="force-ltr form-textbox-input" autocomplete="off" aria-invalid="false" onfocus="focusHandler(this)" onblur="blurHandler(this)">
<span aria-hidden="true" id="feedback-email-label" class="form-textbox-label form-label-flyout">Электронная почта</span>
</div>
<div class="form-cell-wrapper form-textbox">
<textarea type="text" id="feedback-description" autocorrect="off" autocapitalize="off" spellcheck="false" class="force-ltr form-textbox-input autoExpand" autocomplete="off" aria-invalid="false" onfocus="focusHandler(this)" onblur="blurHandler(this)"></textarea>
<span aria-hidden="true" id="feedback-description-label" class="form-textbox-label form-label-flyout">Дополнительная информация</span>
</div>
<button type="submit" class="form-button" id="sendFeedback">Отправить запрос</button>
</div>
<div class="form-container" id="postFeedback" style="display: none;">
<img src="../img/xmark.svg" id="btnCloseForm" class="close-button">
<img id="logo" src="../img/krbl.svg">
<h1>Запрос успешно отправлен</h1>
<h2>В скором времени мы с вами свяжемся!</h2>
<button type="button" class="form-button" id="btnCloseForm">Закрыть</button>
</div>
</div>
</form>
<section id="main-links">
<a href="#about" onclick="alert('Этот раздел в разработке.');">/о нас</a>
<a href="#projects" onclick="alert('Этот раздел в разработке.');">/проекты</a>
<a href="#possibilities" onclick="alert('Этот раздел в разработке.');">/возможности</a>
<div id="icons">
<a href="mailto:contact@krbl.ru">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="16" fill="none" viewBox="0 0 20 16">
<path fill="#000" fill-opacity=".85" d="M10.018 9.08c.371 0 .716-.176 1.114-.584L19.012.51c-.335-.334-.96-.491-1.856-.491H2.572c-.76 0-1.295.148-1.594.454l7.926 8.023c.39.4.734.585 1.114.585ZM.226 14.508 6.63 8.023.208 1.54C.072 1.8 0 2.245 0 2.885v10.24c0 .658.072 1.122.226 1.382ZM2.844 16h14.584c.76 0 1.286-.148 1.585-.445l-6.531-6.623-.598.622c-.625.612-1.214.89-1.866.89-.661 0-1.25-.278-1.866-.89l-.607-.622-6.512 6.614c.344.306.942.454 1.811.454Zm16.939-1.503c.145-.269.217-.723.217-1.372V2.885c0-.622-.072-1.067-.2-1.317l-6.403 6.455 6.386 6.474Z"/>
</svg>
</a>
<a href="https://github.com/KRBL-Group" target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" width="21" height="20" fill="none" viewBox="0 0 21 20">
<path fill="#24292F" fill-rule="evenodd" d="M10.469 0C4.679 0 0 4.583 0 10.254c0 4.532 2.998 8.369 7.158 9.727.52.102.71-.221.71-.493 0-.237-.016-1.052-.016-1.9-2.913.61-3.519-1.223-3.519-1.223-.468-1.188-1.161-1.494-1.161-1.494-.954-.628.07-.628.07-.628 1.056.068 1.611 1.052 1.611 1.052.936 1.562 2.444 1.12 3.05.85.087-.663.365-1.121.66-1.376-2.323-.238-4.767-1.12-4.767-5.059 0-1.12.416-2.037 1.074-2.75-.104-.254-.468-1.307.104-2.716 0 0 .884-.272 2.877 1.052a10.335 10.335 0 0 1 2.618-.34c.884 0 1.785.12 2.617.34 1.993-1.324 2.877-1.052 2.877-1.052.572 1.409.208 2.462.104 2.716.676.713 1.075 1.63 1.075 2.75 0 3.939-2.444 4.804-4.784 5.06.381.322.71.933.71 1.9 0 1.375-.017 2.479-.017 2.818 0 .272.191.595.71.493 4.16-1.359 7.16-5.195 7.16-9.728C20.936 4.584 16.24 0 10.468 0Z" clip-rule="evenodd"/>
</svg>
</a>
</div>
</section>
</section>
<script src="https://rawgit.com/RobinHerbots/Inputmask/5.x/dist/jquery.inputmask.js"></script>
<script>
$(document).ready(function(){
var phoneInput = $('#feedback-phone');
phoneInput.inputmask({"mask": "+7 (999) 999-9999"});
$('textarea.autoExpand').on('input', function () {
this.style.height = 'auto';
this.style.height = (this.scrollHeight - 50) + 'px';
});
});
</script>
<script>
function closeForm() {
$('.form-popup-bg').removeClass('is-visible');
}
$(document).ready(function($) {
$('#writeUsButton').on('click', function(event) {
event.preventDefault();
$('#feedback-form-popup-bg').addClass('is-visible');
});
$('#feedback-form-popup-bg').on('click', function(event) {
if ($(event.target).is('#feedback-form-popup-bg') || $(event.target).is('#btnCloseForm')) {
event.preventDefault();
$(this).removeClass('is-visible');
}
});
$('#accountButton').on('click', function(event) {
event.preventDefault();
`{{#if isAuth}}`
location.href = "/projects";
`{{else}}`
$('#login-form-popup-bg').addClass('is-visible');
`{{/if}}`
});
$('#login-form-popup-bg').on('click', function(event) {
if ($(event.target).is('#login-form-popup-bg') || $(event.target).is('#btnCloseFormLogin')) {
event.preventDefault();
$(this).removeClass('is-visible');
}
});
});
</script>
<script>
function focusHandler(input) {
input.nextElementSibling.classList.add('form-label-focused');
}
function blurHandler(input) {
if (!input.value) {
input.nextElementSibling.classList.remove('form-label-focused');
}
}
</script>
<script>
document.addEventListener("DOMContentLoaded", function() {
const loginForm = document.getElementById("loginForm");
const emailInput = document.getElementById("login-email");
const passwordInput = document.getElementById("login-password");
loginForm.addEventListener("submit", async function(event) {
event.preventDefault();
const email = emailInput.value;
const password = passwordInput.value;
// Отправляем запрос на сервер для авторизации
const response = await fetch("{{API_SERVER}}/login", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({ email, password })
});
if (response.status === 200) {
const data = await response.json();
const token = data.token;
document.cookie = "token=" + token;
window.location.href = "/projects";
} else if (response.status === 401) {
alert("Неверные данные пользователя");
} else {
alert("Ошибка авторизации");
}
});
});
document.addEventListener("DOMContentLoaded", function() {
const feedbackForm = document.getElementById("feedbackForm");
const nameInput = document.getElementById("feedback-name");
const phoneInput = document.getElementById("feedback-phone");
const emailInput = document.getElementById("feedback-email");
const descriptionInput = document.getElementById("feedback-description");
feedbackForm.addEventListener("submit", async function(event) {
event.preventDefault();
const email = emailInput.value;
const name = nameInput.value;
const phone = phoneInput.value;
const description = descriptionInput.value;
// Отправляем запрос на сервер
const response = await fetch("{{API_SERVER}}/feedback", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({ name, phone, email, description }),
});
if (response.status === 200) {
$("#preFeedback").css("display", "none");
$("#postFeedback").css("display", "inline-flex");
} else {
alert("Ошибка отправки запроса");
}
});
});
</script>
</body>
</html>

View File

@@ -0,0 +1,470 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Документы</title>
<link rel="icon" type="image/x-icon" href="../../img/favicon.png">
<link href="https://fonts.googleapis.com/css?family=Montserrat" rel="stylesheet">
<link rel="stylesheet" href="../../styles/main.css">
<script src="../../scripts/jquery.min.js"></script>
<script>
const API_SERVER = "{{API_SERVER}}";
</script>
<script type="module">
import { minidenticonSvg } from 'https://cdn.jsdelivr.net/npm/minidenticons@4.2.0/minidenticons.min.js'
</script>
<script>
let documents = [
{{#each Documents}}
{
id: {{this.id}},
name: "{{this.name}}",
type: "{{this.format}}",
path: "{{this.path}}",
date: "{{this.uploaded}}",
},
{{/each}}
];
</script>
<script src="../../scripts/projects.js"></script>
<script src="../../scripts/documents-table.js"></script>
</head>
<body>
<header class="lk-header">
<div class="header-logo">
<a href="/projects"><img src="../../img/krbl.svg">{{#if Project.maraku}} X <img onclick="window.open('https://maraku.ru/', '_blank')" src="../../img/maraku.svg">{{/if}}</a>
<span class="slash">/</span>
<span>{{Project.displayname}}</span>
<div class="dropdown">
<button id="headerProjects" type="button" onclick="toggleProjects();">
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="18" viewBox="0 0 13 18" fill="none">
<path d="M6.93296 0.392929C6.70015 0.392929 6.49422 0.48226 6.31514 0.660923L1.20253 5.55627C1.06822 5.69026 0.969727 5.87786 0.969727 6.13691C0.969727 6.60146 1.31892 6.95876 1.78452 6.95876C1.9815 6.95876 2.1964 6.9052 2.38442 6.7176L6.93296 2.27782L11.4725 6.7176C11.6695 6.89623 11.8754 6.95876 12.0724 6.95876C12.538 6.95876 12.8872 6.60146 12.8872 6.13691C12.8872 5.87786 12.7977 5.69026 12.6544 5.55627L7.5418 0.660923C7.36271 0.48226 7.15679 0.392929 6.93296 0.392929ZM6.93296 17.5981C7.15679 17.5981 7.36271 17.4999 7.5418 17.3302L12.6544 12.4348C12.7977 12.2918 12.8872 12.1132 12.8872 11.8452C12.8872 11.3807 12.538 11.0323 12.0724 11.0323C11.8754 11.0323 11.6695 11.0948 11.4725 11.2735L6.93296 15.7132L2.38442 11.2735C2.1964 11.0859 1.9815 11.0323 1.78452 11.0323C1.31892 11.0323 0.969727 11.3807 0.969727 11.8452C0.969727 12.1132 1.06822 12.2918 1.20253 12.4348L6.31514 17.3302C6.49422 17.4999 6.70015 17.5981 6.93296 17.5981Z" fill="black" fill-opacity="0.6"/>
</svg>
</button>
<div id="dropdownProjects" class="dropdown-projects">
<input type="text" placeholder="Найти проект...">
<h1>Проекты</h1>
{{#each Projects}}
<div onclick="location.href='/project/{{this.name}}'" id="project-{{this.id}}" class="project"> {{#if this.avatar}} <div class="avatar-container"><img src="{{../API_SERVER}}/{{this.avatar}}"></div>{{/if}} {{this.displayname}}
<svg class="checkmark" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 20 20">
<g clip-path="url(#a)">
<path fill="#000" fill-opacity=".6" d="M7.388 20c.487 0 .873-.215 1.145-.635L19.24 2.505c.204-.33.283-.579.283-.84 0-.623-.408-1.03-1.031-1.03-.453 0-.703.147-.975.577L7.343 17.428l-5.28-6.912c-.284-.397-.567-.556-.975-.556C.442 9.96 0 10.402 0 11.025c0 .261.113.556.329.828l5.88 7.49c.34.442.692.657 1.18.657Z"/>
</g>
<defs>
<clipPath id="a">
<path fill="#fff" d="M0 0h19.524v20H0z"/>
</clipPath>
</defs>
</svg>
</div>
{{/each}}
</div>
</div>
</div>
<nav>
<a onclick="alert('Этот раздел в разработке.');">Новости</a>
<a onclick="alert('Этот раздел в разработке.');">Помощь</a>
<div class="user">
<svg class="user-svg ring" width="20" height="22" viewBox="0 0 20 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 16.8241C0 17.5978 0.593536 18.1066 1.60042 18.1066H6.07316C6.15794 20.1522 7.75836 21.9434 9.99473 21.9434C12.2416 21.9434 13.8421 20.1627 13.9269 18.1066H18.3996C19.3959 18.1066 20 17.5978 20 16.8241C20 15.7642 18.9189 14.8103 18.0074 13.867C17.3079 13.1357 17.1171 11.6307 17.0323 10.4118C16.9581 6.23586 15.8771 3.54376 13.0578 2.52627C12.6974 1.13782 11.5633 0.0461426 9.99473 0.0461426C8.43668 0.0461426 7.29201 1.13782 6.94224 2.52627C4.12295 3.54376 3.04187 6.23586 2.96768 10.4118C2.88288 11.6307 2.69211 13.1357 1.99258 13.867C1.07048 14.8103 0 15.7642 0 16.8241ZM2.05618 16.5061V16.379C2.24695 16.0716 2.88288 15.4462 3.43403 14.8315C4.19714 13.9836 4.55748 12.6164 4.6529 10.5496C4.73769 5.9179 6.11553 4.44465 7.92793 3.94652C8.19292 3.88292 8.3413 3.75574 8.3519 3.48017C8.38367 2.37789 9.01963 1.60417 9.99473 1.60417C10.9804 1.60417 11.6057 2.37789 11.6481 3.48017C11.6587 3.75574 11.7965 3.88292 12.0615 3.94652C13.8845 4.44465 15.2623 5.9179 15.3471 10.5496C15.4425 12.6164 15.8029 13.9836 16.5554 14.8315C17.1171 15.4462 17.7424 16.0716 17.9332 16.379V16.5061H2.05618ZM7.72658 18.1066H12.2735C12.1887 19.548 11.2772 20.4489 9.99473 20.4489C8.72286 20.4489 7.80077 19.548 7.72658 18.1066Z" fill="black" fill-opacity="0.85"/>
</svg>
<div class="dropdown">
<minidenticon-svg onclick="toggleAccount();" id="userIcon" style="height: 40px;" username="{{User.email}}"></minidenticon-svg>
<div id="dropdownAccount" class="dropdown-account">
<div class="user-name">
<h1>{{User.name}}</h1>
<h2>{{User.email}}</h2>
</div>
<a href="/user/settings">Настройки профиля <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="none" viewBox="0 0 18 18">
<g clip-path="url(#a)">
<path fill="#000" fill-opacity=".85" d="M8.15 17.992h1.7c.647 0 1.143-.396 1.295-1.019l.362-1.573.269-.093 1.37.842c.547.345 1.178.26 1.64-.202l1.178-1.17c.463-.463.547-1.102.202-1.64l-.858-1.364.101-.253 1.573-.37A1.301 1.301 0 0 0 18 9.854V8.188c0-.64-.395-1.145-1.018-1.296l-1.556-.379-.11-.269.859-1.363c.345-.539.26-1.17-.202-1.641l-1.178-1.178c-.454-.455-1.085-.539-1.631-.202l-1.371.841-.286-.11-.362-1.573C10.993.396 10.497 0 9.85 0h-1.7c-.647 0-1.143.396-1.295 1.018l-.37 1.574-.286.11-1.363-.842c-.546-.337-1.186-.253-1.64.202L2.027 3.24c-.463.471-.555 1.102-.202 1.64l.85 1.364-.101.27-1.556.378A1.293 1.293 0 0 0 0 8.188v1.666a1.3 1.3 0 0 0 1.018 1.296l1.573.37.092.253-.85 1.363c-.353.539-.26 1.178.203 1.641l1.169 1.17c.462.463 1.102.547 1.648.202l1.363-.842.269.093.37 1.573c.152.623.648 1.019 1.295 1.019Zm.135-1.313c-.143 0-.219-.06-.244-.194l-.505-2.087a4.748 4.748 0 0 1-1.354-.555L4.35 14.97c-.101.076-.21.06-.312-.042l-.992-.993c-.093-.092-.101-.193-.034-.31l1.127-1.819a6.132 6.132 0 0 1-.546-1.346l-2.086-.496c-.135-.026-.194-.101-.194-.245V8.314c0-.151.05-.219.194-.244l2.077-.505c.135-.547.387-1.043.538-1.355L3.003 4.393c-.076-.127-.067-.227.025-.328l1.001-.977c.1-.1.193-.117.32-.042L6.165 4.15a6.821 6.821 0 0 1 1.38-.556l.496-2.087c.025-.134.101-.193.244-.193h1.43c.143 0 .219.059.235.193l.514 2.104c.521.135.975.345 1.354.547l1.825-1.11c.135-.076.219-.06.328.041l.992.977c.102.1.102.201.026.328L13.87 6.21c.16.312.404.808.538 1.355l2.086.505c.135.025.194.093.194.244V9.72c0 .144-.067.22-.194.245l-2.094.496a5.75 5.75 0 0 1-.547 1.346l1.127 1.818c.068.118.068.219-.033.311l-.984.993c-.11.101-.21.118-.32.042l-1.834-1.127a4.69 4.69 0 0 1-1.345.555l-.514 2.087c-.016.135-.092.194-.235.194h-1.43ZM9 12.21c1.758 0 3.205-1.447 3.205-3.214 0-1.75-1.447-3.198-3.205-3.198S5.787 7.245 5.787 8.996A3.23 3.23 0 0 0 9 12.21Zm0-1.304a1.91 1.91 0 0 1-1.9-1.91c0-1.035.857-1.894 1.9-1.894 1.026 0 1.884.859 1.884 1.894 0 1.043-.858 1.91-1.884 1.91Z"/>
</g>
<defs>
<clipPath id="a">
<path fill="#fff" d="M0 0h18v18H0z"/>
</clipPath>
</defs>
</svg>
</a>
<a href="/projects">Смотреть проекты
<svg xmlns="http://www.w3.org/2000/svg" style="width: 16px !important; height: 16px !important;" width="16" height="16" fill="none" viewBox="0 0 16 16">
<g clip-path="url(#a)">
<path fill="#000" fill-opacity=".85" d="M1.973 11.72a.917.917 0 0 0-.911-.925c-.494 0-.895.42-.895.925a.901.901 0 1 0 1.805 0Zm0 3.355c0-.505-.401-.933-.911-.933-.494 0-.895.428-.895.933 0 .514.401.925.895.925.51 0 .91-.41.91-.925Zm13.726-3.355c0-.377-.3-.66-.71-.66H3.736c-.41 0-.71.283-.71.66 0 .376.3.667.71.667h11.252c.41 0 .71-.29.71-.667Zm0 3.355c0-.376-.3-.659-.71-.659H3.736c-.41 0-.71.283-.71.66 0 .376.3.667.71.667h11.252c.41 0 .71-.29.71-.668ZM2.316.205C.61.205 0 .967 0 2.628v3.98C0 8.27.61 9.033 2.316 9.033h11.368C15.39 9.032 16 8.27 16 6.609v-3.98C16 .966 15.39.204 13.684.204H2.316Zm-.97 6.447V2.585c0-.762.242-1.095.978-1.095h11.352c.736 0 .978.333.978 1.095v4.067c0 .762-.242 1.095-.978 1.095H2.324c-.736 0-.978-.333-.978-1.095Z"/>
</g>
<defs>
<clipPath id="a">
<path fill="#fff" d="M0 0h16v16H0z"/>
</clipPath>
</defs>
</svg>
</a>
<div class="line"></div>
<div class="theme-selector">
<span>Тема</span>
<div class="theme-switcher">
<button id="light-theme-btn" class="theme-btn" onclick="setTheme('light')">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<path d="M12.493 10.7193C8.11132 10.7193 5.39164 8.09866 5.39164 3.89146C5.39164 2.69166 5.59046 1.63394 5.88469 1.06561C6.00397 0.836704 6.02785 0.726195 6.02785 0.568327C6.02785 0.307844 5.7813 0 5.4473 0C5.38369 0 5.23262 0.0236803 5.00995 0.110508C2.0676 1.29453 0 4.37297 0 7.68821C0 12.4795 3.50696 15.9684 8.33398 15.9684C11.7933 15.9684 14.6004 14.1687 15.8887 11.2166C15.9841 11.0113 16 10.8377 16 10.7509C16 10.4272 15.7217 10.2062 15.4752 10.2062C15.3479 10.2062 15.2525 10.2141 15.0616 10.2851C14.4175 10.5456 13.4473 10.7193 12.493 10.7193ZM1.24851 7.63296C1.24851 5.17809 2.53678 2.84164 4.59641 1.55501C4.34196 2.2891 4.20675 3.10212 4.20675 4.00196C4.20675 8.93537 7.23658 11.8717 12.3101 11.8717C13.1292 11.8717 13.8211 11.777 14.4811 11.5481C13.2724 13.5294 10.9424 14.7371 8.3817 14.7371C4.25447 14.7371 1.24851 11.7533 1.24851 7.63296Z" fill="black" fill-opacity="0.85"/>
</svg>
</button>
<button id="dark-theme-btn" class="theme-btn" onclick="setTheme('dark')">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<g clip-path="url(#clip0_228_36)">
<path d="M8.0037 2.86688C8.35137 2.86688 8.63985 2.57946 8.63985 2.2257V0.641179C8.63985 0.287425 8.35137 0 8.0037 0C7.64863 0 7.36015 0.287425 7.36015 0.641179V2.2257C7.36015 2.57946 7.64863 2.86688 8.0037 2.86688ZM11.6283 4.37772C11.8798 4.62091 12.2867 4.62828 12.5381 4.37772L13.6699 3.25012C13.914 3.00691 13.914 2.5942 13.6699 2.34362C13.4258 2.10042 13.019 2.10042 12.7675 2.34362L11.6283 3.47857C11.3842 3.72915 11.3842 4.13451 11.6283 4.37772ZM13.1299 7.99633C13.1299 8.3427 13.4258 8.63014 13.7735 8.63014H15.3638C15.7115 8.63014 16 8.3427 16 7.99633C16 7.64994 15.7115 7.35513 15.3638 7.35513H13.7735C13.4258 7.35513 13.1299 7.64994 13.1299 7.99633ZM11.6283 11.6149C11.3842 11.8655 11.3842 12.2708 11.6283 12.5141L12.7675 13.6564C13.019 13.8922 13.4258 13.8849 13.6699 13.649C13.914 13.3985 13.914 12.9931 13.6699 12.7499L12.5307 11.6149C12.2867 11.3791 11.8798 11.3791 11.6283 11.6149ZM8.0037 13.1257C7.64863 13.1257 7.36015 13.4132 7.36015 13.7596V15.3515C7.36015 15.6979 7.64863 15.9853 8.0037 15.9853C8.35137 15.9853 8.63985 15.6979 8.63985 15.3515V13.7596C8.63985 13.4132 8.35137 13.1257 8.0037 13.1257ZM4.3717 11.6149C4.12019 11.3791 3.70595 11.3791 3.46187 11.6149L2.3301 12.7425C2.08599 12.9857 2.08599 13.3911 2.3227 13.6416C2.56681 13.8775 2.98105 13.8849 3.23253 13.649L4.36431 12.5141C4.60843 12.2708 4.60843 11.8655 4.3717 11.6149ZM2.87009 7.99633C2.87009 7.64994 2.5742 7.35513 2.22654 7.35513H0.636154C0.288488 7.35513 0 7.64994 0 7.99633C0 8.3427 0.288488 8.63014 0.636154 8.63014H2.22654C2.5742 8.63014 2.87009 8.3427 2.87009 7.99633ZM4.36431 4.37772C4.60843 4.14187 4.60843 3.72179 4.3717 3.47857L3.23996 2.34362C2.99584 2.10779 2.5816 2.10042 2.33749 2.34362C2.09339 2.5942 2.09339 3.00691 2.3301 3.24275L3.46187 4.37772C3.70595 4.62091 4.1128 4.62091 4.36431 4.37772Z" fill="black" fill-opacity="0.85"/>
<path d="M7.99611 11.755C10.0525 11.755 11.7613 10.0525 11.7613 7.99636C11.7613 5.93277 10.0525 4.23035 7.99611 4.23035C5.93971 4.23035 4.23096 5.93277 4.23096 7.99636C4.23096 10.0525 5.93971 11.755 7.99611 11.755ZM7.99611 10.6274C6.55368 10.6274 5.35534 9.43347 5.35534 7.99636C5.35534 6.55185 6.55368 5.35792 7.99611 5.35792C9.43854 5.35792 10.6369 6.55185 10.6369 7.99636C10.6369 9.43347 9.43854 10.6274 7.99611 10.6274Z" fill="black" fill-opacity="0.85"/>
</g>
<defs>
<clipPath id="clip0_228_36">
<rect width="16" height="16" fill="white"/>
</clipPath>
</defs>
</svg>
</button>
<button id="system-theme-btn" class="theme-btn" onclick="setTheme('system')">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<g clip-path="url(#clip0_228_46)">
<path d="M1.54362 13.2758H14.4497C15.4161 13.2758 16 12.6082 16 11.5031V2.30216C16 1.19712 15.4161 0.53717 14.4497 0.53717H1.54362C0.583892 0.53717 0 1.19712 0 2.30216V11.5031C0 12.6082 0.583892 13.2758 1.54362 13.2758ZM1.56376 12.0403C1.26846 12.0403 1.08054 11.8254 1.08054 11.4878V2.32518C1.08054 1.97986 1.26846 1.77266 1.56376 1.77266H14.4362C14.7316 1.77266 14.9195 1.97986 14.9195 2.32518V11.4878C14.9195 11.8254 14.7316 12.0403 14.4362 12.0403H1.56376ZM5.87919 15.1022H10.1208V13.176H5.87919V15.1022ZM5.83892 16H10.1611C10.4564 16 10.698 15.7237 10.698 15.3784C10.698 15.0331 10.4564 14.7568 10.1611 14.7568H5.83892C5.54362 14.7568 5.29531 15.0331 5.29531 15.3784C5.29531 15.7237 5.54362 16 5.83892 16Z" fill="black" fill-opacity="0.85"/>
</g>
<defs>
<clipPath id="clip0_228_46">
<rect width="16" height="16" fill="white"/>
</clipPath>
</defs>
</svg>
</button>
</div>
</div>
<div class="line"></div>
<a href="/" target="_blank">Главная страница
<svg data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="width: 20px; height: 20px;"><path d="M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6"></path><path d="M15 3h6v6"></path><path d="M10 14L21 3"></path></svg>
</a>
<a href="/logout">Выйти из аккаунта</a>
<div class="line"></div>
<button onclick="location.href='/'" class="button">Связаться с нами</button>
</div>
</div>
</div>
</nav>
</header>
<nav class="sections">
<a href="/project/{{Name}}">Обзор</a>
<a href="/project/{{Name}}/progress">Прогресс</a>
<a class="selected" href="/project/{{Name}}/documents">Документы</a>
<a href="/project/{{Name}}/payments">Оплата</a>
<a href="/project/{{Name}}/tests">Тесты</a>
</nav>
<section class="content-bg">
<div class="progress-name-section">
<h1>Документы проекта</h1>
<h2>Здесь можно посмотреть загруженные документы или загрузить новые</h2>
</div>
<div class="progress-content" style="gap: 11px;">
<div class="table-search-section">
<input type="text" class="updates-search search-input" placeholder="Название документа...">
<button id="uploadDocument" class="upload-button"><svg width="15" height="22" viewBox="0 0 15 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_286_22)">
<path d="M14.4043 8.94282V17.0417C14.4043 18.7134 13.5522 19.5574 11.8561 19.5574H2.54814C0.852086 19.5574 0 18.7134 0 17.0417V8.94282C0 7.27111 0.852086 6.42712 2.54814 6.42712H4.99076V7.73367H2.56437C1.75286 7.73367 1.30653 8.17189 1.30653 9.01584V16.9686C1.30653 17.8126 1.75286 18.2508 2.56437 18.2508H11.8318C12.6352 18.2508 13.0978 17.8126 13.0978 16.9686V9.01584C13.0978 8.17189 12.6352 7.73367 11.8318 7.73367H9.4135V6.42712H11.8561C13.5522 6.42712 14.4043 7.27111 14.4043 8.94282Z" fill="white" fill-opacity="0.85"/>
<path d="M7.19808 13.2033C7.54702 13.2033 7.84728 12.9111 7.84728 12.5703V4.23609L7.79858 3.01884L8.34231 3.595L9.57579 4.90966C9.6894 5.03949 9.85171 5.10441 10.014 5.10441C10.3467 5.10441 10.6064 4.86096 10.6064 4.52823C10.6064 4.35785 10.5334 4.22798 10.4116 4.10626L7.66875 1.46075C7.50644 1.29844 7.3685 1.24164 7.19808 1.24164C7.03577 1.24164 6.89783 1.29844 6.72741 1.46075L3.98449 4.10626C3.86277 4.22798 3.79785 4.35785 3.79785 4.52823C3.79785 4.86096 4.0413 5.10441 4.38213 5.10441C4.53633 5.10441 4.71486 5.03949 4.82847 4.90966L6.05384 3.595L6.60565 3.01884L6.55699 4.23609V12.5703C6.55699 12.9111 6.84913 13.2033 7.19808 13.2033Z" fill="white" fill-opacity="0.85"/>
</g>
<defs>
<clipPath id="clip0_286_22">
<rect width="14.4043" height="22" fill="white"/>
</clipPath>
</defs>
</svg>
Загрузить документ</button>
</div>
<div class="documents-table">
<table id="documentsTable">
<tbody>
<tr>
<td>
<div class="row-container">
<div class="row-icon">
<svg xmlns="http://www.w3.org/2000/svg" width="17" height="22" viewBox="0 0 17 22" fill="none">
<g clip-path="url(#clip0_209_356)">
<path d="M3.13331 22H13.8656C15.9588 22 16.9989 20.922 16.9989 18.788V9.471H9.68256C8.38844 9.471 7.77219 8.8451 7.77219 7.5317V0H3.13438C1.05081 0 0 1.0879 0 3.223V18.788C0 20.933 1.04125 22 3.13331 22ZM8.53081 14.7103C8.8655 14.7103 9.13963 14.773 9.35319 14.8984C9.56781 15.0238 9.72506 15.2042 9.82812 15.4374C9.93119 15.6706 9.98325 15.95 9.98325 16.2734C9.98325 16.6012 9.93013 16.8839 9.826 17.1215C9.72762 17.3531 9.56003 17.5459 9.34788 17.6715C9.13431 17.7991 8.86125 17.8629 8.53081 17.8629H7.27069V14.7103H8.53081ZM12.6267 14.7103V15.3197H11.2604V16.082H12.5035V16.6727H11.2604V17.8629H10.4869V14.7103H12.6267ZM5.70244 14.7103C5.95 14.7103 6.15719 14.7598 6.32294 14.8599C6.48975 14.9589 6.61513 15.0909 6.70013 15.2559C6.78513 15.422 6.82763 15.6046 6.82763 15.8037C6.82763 16.0039 6.78406 16.1865 6.698 16.3493C6.61061 16.515 6.47842 16.6507 6.31763 16.7398C6.12503 16.8423 5.91037 16.8923 5.69394 16.885H5.11912V17.8629H4.34563V14.7103H5.70244ZM8.40756 15.312H8.04419V17.2601H8.40756C8.54569 17.2601 8.66256 17.2403 8.76138 17.2007C8.85628 17.1636 8.9399 17.1009 9.00362 17.0192C9.07059 16.9298 9.11841 16.8267 9.14387 16.7167C9.17362 16.5957 9.1885 16.4538 9.1885 16.2921C9.1885 16.0765 9.16194 15.8961 9.10775 15.7498C9.06155 15.6139 8.97247 15.498 8.85487 15.4209C8.71883 15.3422 8.56434 15.3041 8.40863 15.3109L8.40756 15.312ZM5.525 15.2933H5.117V16.3141H5.525C5.6204 16.3168 5.71506 16.296 5.80125 16.2536C5.8771 16.216 5.9401 16.1554 5.98188 16.0798C6.02508 15.9948 6.04631 15.8997 6.0435 15.8037C6.0435 15.6387 5.99781 15.5111 5.90538 15.4242C5.79946 15.3316 5.6634 15.2855 5.525 15.2933ZM9.15875 0.1133C9.58269 0.1848 9.99706 0.4818 10.472 0.9746L16.0406 6.7309C16.5261 7.2336 16.8194 7.6439 16.8799 8.0652H9.71125C9.33831 8.0652 9.15556 7.8804 9.15556 7.5108L9.15875 0.1133Z" fill="#FF3B30"/>
</g>
<defs>
<clipPath id="clip0_209_356">
<rect width="17" height="22" fill="white"/>
</clipPath>
</defs>
</svg>
</div>
<div style="margin-left: 10px;" class="row-content">
<h1>Макет сайта</h1>
<h2>pdf</h2>
</div>
</div>
</td>
</tr>
<tr>
<td>
<div class="row-container">
<div class="row-icon">
<svg width="20" height="20" xmlns="http://www.w3.org/2000/svg" aria-label="Office Open XML word processing document" data-testid="word-icon"><path d="M16.795 0c1.115 0 1.519.116 1.926.334.407.218.727.538.945.945.218.407.334.811.334 1.926v13.59c0 1.115-.116 1.519-.334 1.926a2.272 2.272 0 01-.945.945c-.407.218-.811.334-1.926.334H3.205c-1.115 0-1.519-.116-1.926-.334a2.272 2.272 0 01-.945-.945C.116 18.314 0 17.91 0 16.795V3.205C0 2.09.116 1.686.334 1.279.552.872.872.552 1.279.334 1.686.116 2.09 0 3.205 0h13.59zM5.177 4.931H3.264L6.098 15.5h1.734L10 7.867h.105l2.179 7.633h1.727l2.834-10.569h-1.904l-1.83 7.99h-.105l-2.132-7.99H9.231l-2.11 7.99h-.106l-1.838-7.99z" fill="#205BC5" fill-rule="evenodd"></path></svg>
</div>
<div style="margin-left: 10px;" class="row-content">
<h1>Техническое задание</h1>
<h2>docx</h2>
</div>
</div>
</td>
</tr>
<tr>
<td>
<div class="row-container">
<div class="row-icon">
<svg xmlns="http://www.w3.org/2000/svg" width="17" height="22" viewBox="0 0 17 22" fill="none">
<g clip-path="url(#clip0_209_356)">
<path d="M3.13331 22H13.8656C15.9588 22 16.9989 20.922 16.9989 18.788V9.471H9.68256C8.38844 9.471 7.77219 8.8451 7.77219 7.5317V0H3.13438C1.05081 0 0 1.0879 0 3.223V18.788C0 20.933 1.04125 22 3.13331 22ZM8.53081 14.7103C8.8655 14.7103 9.13963 14.773 9.35319 14.8984C9.56781 15.0238 9.72506 15.2042 9.82812 15.4374C9.93119 15.6706 9.98325 15.95 9.98325 16.2734C9.98325 16.6012 9.93013 16.8839 9.826 17.1215C9.72762 17.3531 9.56003 17.5459 9.34788 17.6715C9.13431 17.7991 8.86125 17.8629 8.53081 17.8629H7.27069V14.7103H8.53081ZM12.6267 14.7103V15.3197H11.2604V16.082H12.5035V16.6727H11.2604V17.8629H10.4869V14.7103H12.6267ZM5.70244 14.7103C5.95 14.7103 6.15719 14.7598 6.32294 14.8599C6.48975 14.9589 6.61513 15.0909 6.70013 15.2559C6.78513 15.422 6.82763 15.6046 6.82763 15.8037C6.82763 16.0039 6.78406 16.1865 6.698 16.3493C6.61061 16.515 6.47842 16.6507 6.31763 16.7398C6.12503 16.8423 5.91037 16.8923 5.69394 16.885H5.11912V17.8629H4.34563V14.7103H5.70244ZM8.40756 15.312H8.04419V17.2601H8.40756C8.54569 17.2601 8.66256 17.2403 8.76138 17.2007C8.85628 17.1636 8.9399 17.1009 9.00362 17.0192C9.07059 16.9298 9.11841 16.8267 9.14387 16.7167C9.17362 16.5957 9.1885 16.4538 9.1885 16.2921C9.1885 16.0765 9.16194 15.8961 9.10775 15.7498C9.06155 15.6139 8.97247 15.498 8.85487 15.4209C8.71883 15.3422 8.56434 15.3041 8.40863 15.3109L8.40756 15.312ZM5.525 15.2933H5.117V16.3141H5.525C5.6204 16.3168 5.71506 16.296 5.80125 16.2536C5.8771 16.216 5.9401 16.1554 5.98188 16.0798C6.02508 15.9948 6.04631 15.8997 6.0435 15.8037C6.0435 15.6387 5.99781 15.5111 5.90538 15.4242C5.79946 15.3316 5.6634 15.2855 5.525 15.2933ZM9.15875 0.1133C9.58269 0.1848 9.99706 0.4818 10.472 0.9746L16.0406 6.7309C16.5261 7.2336 16.8194 7.6439 16.8799 8.0652H9.71125C9.33831 8.0652 9.15556 7.8804 9.15556 7.5108L9.15875 0.1133Z" fill="#FF3B30"/>
</g>
<defs>
<clipPath id="clip0_209_356">
<rect width="17" height="22" fill="white"/>
</clipPath>
</defs>
</svg>
</div>
<div style="margin-left: 10px;" class="row-content">
<h1>Договор на разработку сайта</h1>
<h2>pdf</h2>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
<form id="documentForm">
<div id="feedback-form-popup-bg" class="form-popup-bg not-main" >
<div class="form-container">
<img src="../../img/xmark.svg" id="btnCloseForm" class="close-button">
<h1>Загрузка нового документа</h1>
<div class="form-cell-wrapper form-textbox">
<input type="text" id="upload-name" autocorrect="off" autocapitalize="off" aria-required="true" required="required" spellcheck="false" class="force-ltr form-textbox-input" autocomplete="off" aria-invalid="false" onfocus="focusHandler(this)" onblur="blurHandler(this)">
<span aria-hidden="true" id="upload-name-label" class="form-textbox-label form-label-flyout">Название документа</span>
</div>
<input type="text" id="upload-type" hidden>
<div class="drop-zone">
<span class="drop-zone__prompt">Перетащите файл сюда или нажмите чтобы загрузить</span>
<input id="upload-file" type="file" name="file" class="drop-zone__input">
</div>
<button type="submit" class="form-button" id="sendFeedback">Добавить файл</button>
</div>
</div>
</form>
<script>
document.addEventListener("DOMContentLoaded", function() {
document.getElementById("project-{{Project.id}}").classList.add("selected");
});
</script>
<script>
function toggleProjects() {
if ($('#dropdownProjects').hasClass('is-visible')) {
event.preventDefault();
$('#dropdownProjects').removeClass('is-visible');
setTimeout(function() {
$("#dropdownProjects").css("display", "none");
}, 200);
} else {
event.preventDefault();
$("#dropdownProjects").css("display", "inline-flex");
$('#dropdownProjects').addClass('is-visible');
}
}
$(document).on('click', function(event) {
if ($(event.target).closest('#headerProjects').length) {
return;
} else {
if (!$(event.target).closest('.dropdown-projects').length) {
$('#dropdownProjects').removeClass('is-visible');
setTimeout(function() {
$("#dropdownProjects").css("display", "none");
}, 200);
}
}
});
$(document).ready(function() {
$(document).keydown(function(e) {
if (e.key === "Escape" || e.key === "Esc") {
console.log("Escape")
$('#dropdownProjects').removeClass('is-visible');
setTimeout(function() {
$("#dropdownProjects").css("display", "none");
}, 200);
}
});
});
function closeForm() {
$('.form-popup-bg').removeClass('is-visible');
}
$(document).ready(function($) {
$('#uploadDocument').on('click', function(event) {
event.preventDefault();
$('#feedback-form-popup-bg').addClass('is-visible');
});
$('#feedback-form-popup-bg').on('click', function(event) {
if ($(event.target).is('#feedback-form-popup-bg') || $(event.target).is('#btnCloseForm')) {
event.preventDefault();
$(this).removeClass('is-visible');
}
});
});
document.querySelectorAll(".drop-zone__input").forEach((inputElement) => {
const dropZoneElement = inputElement.closest(".drop-zone");
const uploadNameElement = document.getElementById("upload-name");
const uploadTypeElement = document.getElementById("upload-type");
dropZoneElement.addEventListener("click", (e) => {
inputElement.click();
});
inputElement.addEventListener("change", (e) => {
if (inputElement.files.length) {
updateThumbnail(dropZoneElement, inputElement.files[0]);
if (!uploadNameElement.value) {
const fileNameWithoutExtension = inputElement.files[0].name.replace(/\.[^/.]+$/, "");
const fileExtension = inputElement.files[0].name.split('.').pop();
uploadNameElement.value = fileNameWithoutExtension;
uploadTypeElement.value = fileExtension;
}
const fileExtension = inputElement.files[0].name.split('.').pop();
uploadTypeElement.value = fileExtension;
}
});
dropZoneElement.addEventListener("dragover", (e) => {
e.preventDefault();
dropZoneElement.classList.add("drop-zone--over");
});
["dragleave", "dragend"].forEach((type) => {
dropZoneElement.addEventListener(type, (e) => {
dropZoneElement.classList.remove("drop-zone--over");
});
});
dropZoneElement.addEventListener("drop", (e) => {
e.preventDefault();
if (e.dataTransfer.files.length) {
inputElement.files = e.dataTransfer.files;
updateThumbnail(dropZoneElement, e.dataTransfer.files[0]);
if (!uploadNameElement.value) {
// Заполняем upload-name и upload-type, если upload-name пустой
const fileNameWithoutExtension = e.dataTransfer.files[0].name.replace(/\.[^/.]+$/, ""); // удаляем расширение файла
const fileExtension = e.dataTransfer.files[0].name.split('.').pop(); // получаем расширение файла
uploadNameElement.value = fileNameWithoutExtension;
uploadTypeElement.value = fileExtension;
}
}
dropZoneElement.classList.remove("drop-zone--over");
});
});
function updateThumbnail(dropZoneElement, file) {
let thumbnailElement = dropZoneElement.querySelector(".drop-zone__thumb");
if (dropZoneElement.querySelector(".drop-zone__prompt")) {
dropZoneElement.querySelector(".drop-zone__prompt").remove();
}
if (!thumbnailElement) {
thumbnailElement = document.createElement("div");
thumbnailElement.classList.add("drop-zone__thumb");
dropZoneElement.appendChild(thumbnailElement);
}
thumbnailElement.dataset.label = file.name;
if (file.type.startsWith("image/")) {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => {
thumbnailElement.style.backgroundImage = `url('${reader.result}')`;
};
} else {
thumbnailElement.style.backgroundImage = null;
}
}
document.addEventListener("DOMContentLoaded", function() {
const documentForm = document.getElementById("documentForm");
const nameInput = document.getElementById("upload-name");
const fileInput = document.getElementById("upload-file");
documentForm.addEventListener("submit", async function(event) {
event.preventDefault();
const formData = new FormData();
formData.append("project", "{{Project.name}}");
formData.append("name", nameInput.value);
formData.append("files", fileInput.files[0]);
// Отправляем запрос на сервер для авторизации
const response = await fetch("{{API_SERVER}}/document", {
method: "POST",
headers: {
"Authorization": getCookie("token"),
},
body: formData,
});
if (response.status === 201) {
const data = await response.json();
location.reload();
} else {
alert("Ошибка загрузки");
}
});
});
</script>
</body>
</html>

View File

@@ -0,0 +1,418 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Оплата</title>
<link rel="icon" type="image/x-icon" href="../../img/favicon.png">
<link href="https://fonts.googleapis.com/css?family=Montserrat" rel="stylesheet">
<link rel="stylesheet" href="../../styles/main.css">
<script src="../../scripts/jquery.min.js"></script>
<script>
const API_SERVER = "{{API_SERVER}}";
</script>
<script type="module">
import { minidenticonSvg } from 'https://cdn.jsdelivr.net/npm/minidenticons@4.2.0/minidenticons.min.js'
</script>
<script>
let paidPayments = [
{{#each Paid}}
{
id: {{this.id}},
name: "{{this.name}}",
amount: {{this.amount}},
path: "{{this.filepath}}",
date: "{{this.lastupdate}}",
},
{{/each}}
];
let notPaidPayments = [
{{#each NotPaid}}
{
id: {{this.id}},
name: "{{this.name}}",
amount: {{this.amount}},
path: "{{this.filepath}}",
date: "{{this.lastupdate}}",
},
{{/each}}
];
</script>
<script src="../../scripts/projects.js"></script>
<script src="../../scripts/different-payments-table.js"></script>
</head>
<body>
<header class="lk-header">
<div class="header-logo">
<a href="/projects"><img src="../../img/krbl.svg">{{#if Project.maraku}} X <img onclick="window.open('https://maraku.ru/', '_blank')" src="../../img/maraku.svg">{{/if}}</a>
<span class="slash">/</span>
<span>{{Project.displayname}}</span>
<div class="dropdown">
<button id="headerProjects" type="button" onclick="toggleProjects();">
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="18" viewBox="0 0 13 18" fill="none">
<path d="M6.93296 0.392929C6.70015 0.392929 6.49422 0.48226 6.31514 0.660923L1.20253 5.55627C1.06822 5.69026 0.969727 5.87786 0.969727 6.13691C0.969727 6.60146 1.31892 6.95876 1.78452 6.95876C1.9815 6.95876 2.1964 6.9052 2.38442 6.7176L6.93296 2.27782L11.4725 6.7176C11.6695 6.89623 11.8754 6.95876 12.0724 6.95876C12.538 6.95876 12.8872 6.60146 12.8872 6.13691C12.8872 5.87786 12.7977 5.69026 12.6544 5.55627L7.5418 0.660923C7.36271 0.48226 7.15679 0.392929 6.93296 0.392929ZM6.93296 17.5981C7.15679 17.5981 7.36271 17.4999 7.5418 17.3302L12.6544 12.4348C12.7977 12.2918 12.8872 12.1132 12.8872 11.8452C12.8872 11.3807 12.538 11.0323 12.0724 11.0323C11.8754 11.0323 11.6695 11.0948 11.4725 11.2735L6.93296 15.7132L2.38442 11.2735C2.1964 11.0859 1.9815 11.0323 1.78452 11.0323C1.31892 11.0323 0.969727 11.3807 0.969727 11.8452C0.969727 12.1132 1.06822 12.2918 1.20253 12.4348L6.31514 17.3302C6.49422 17.4999 6.70015 17.5981 6.93296 17.5981Z" fill="black" fill-opacity="0.6"/>
</svg>
</button>
<div id="dropdownProjects" class="dropdown-projects">
<input type="text" placeholder="Найти проект...">
<h1>Проекты</h1>
{{#each Projects}}
<div onclick="location.href='/project/{{this.name}}'" id="project-{{this.id}}" class="project"> {{#if this.avatar}} <div class="avatar-container"><img src="{{../API_SERVER}}/{{this.avatar}}"></div>{{/if}} {{this.displayname}}
<svg class="checkmark" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 20 20">
<g clip-path="url(#a)">
<path fill="#000" fill-opacity=".6" d="M7.388 20c.487 0 .873-.215 1.145-.635L19.24 2.505c.204-.33.283-.579.283-.84 0-.623-.408-1.03-1.031-1.03-.453 0-.703.147-.975.577L7.343 17.428l-5.28-6.912c-.284-.397-.567-.556-.975-.556C.442 9.96 0 10.402 0 11.025c0 .261.113.556.329.828l5.88 7.49c.34.442.692.657 1.18.657Z"/>
</g>
<defs>
<clipPath id="a">
<path fill="#fff" d="M0 0h19.524v20H0z"/>
</clipPath>
</defs>
</svg>
</div>
{{/each}}
</div>
</div>
</div>
<nav>
<a onclick="alert('Этот раздел в разработке.');">Новости</a>
<a onclick="alert('Этот раздел в разработке.');">Помощь</a>
<div class="user">
<svg class="user-svg ring" width="20" height="22" viewBox="0 0 20 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 16.8241C0 17.5978 0.593536 18.1066 1.60042 18.1066H6.07316C6.15794 20.1522 7.75836 21.9434 9.99473 21.9434C12.2416 21.9434 13.8421 20.1627 13.9269 18.1066H18.3996C19.3959 18.1066 20 17.5978 20 16.8241C20 15.7642 18.9189 14.8103 18.0074 13.867C17.3079 13.1357 17.1171 11.6307 17.0323 10.4118C16.9581 6.23586 15.8771 3.54376 13.0578 2.52627C12.6974 1.13782 11.5633 0.0461426 9.99473 0.0461426C8.43668 0.0461426 7.29201 1.13782 6.94224 2.52627C4.12295 3.54376 3.04187 6.23586 2.96768 10.4118C2.88288 11.6307 2.69211 13.1357 1.99258 13.867C1.07048 14.8103 0 15.7642 0 16.8241ZM2.05618 16.5061V16.379C2.24695 16.0716 2.88288 15.4462 3.43403 14.8315C4.19714 13.9836 4.55748 12.6164 4.6529 10.5496C4.73769 5.9179 6.11553 4.44465 7.92793 3.94652C8.19292 3.88292 8.3413 3.75574 8.3519 3.48017C8.38367 2.37789 9.01963 1.60417 9.99473 1.60417C10.9804 1.60417 11.6057 2.37789 11.6481 3.48017C11.6587 3.75574 11.7965 3.88292 12.0615 3.94652C13.8845 4.44465 15.2623 5.9179 15.3471 10.5496C15.4425 12.6164 15.8029 13.9836 16.5554 14.8315C17.1171 15.4462 17.7424 16.0716 17.9332 16.379V16.5061H2.05618ZM7.72658 18.1066H12.2735C12.1887 19.548 11.2772 20.4489 9.99473 20.4489C8.72286 20.4489 7.80077 19.548 7.72658 18.1066Z" fill="black" fill-opacity="0.85"/>
</svg>
<div class="dropdown">
<minidenticon-svg onclick="toggleAccount();" id="userIcon" style="height: 40px;" username="{{User.email}}"></minidenticon-svg>
<div id="dropdownAccount" class="dropdown-account">
<div class="user-name">
<h1>{{User.name}}</h1>
<h2>{{User.email}}</h2>
</div>
<a href="/user/settings">Настройки профиля <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="none" viewBox="0 0 18 18">
<g clip-path="url(#a)">
<path fill="#000" fill-opacity=".85" d="M8.15 17.992h1.7c.647 0 1.143-.396 1.295-1.019l.362-1.573.269-.093 1.37.842c.547.345 1.178.26 1.64-.202l1.178-1.17c.463-.463.547-1.102.202-1.64l-.858-1.364.101-.253 1.573-.37A1.301 1.301 0 0 0 18 9.854V8.188c0-.64-.395-1.145-1.018-1.296l-1.556-.379-.11-.269.859-1.363c.345-.539.26-1.17-.202-1.641l-1.178-1.178c-.454-.455-1.085-.539-1.631-.202l-1.371.841-.286-.11-.362-1.573C10.993.396 10.497 0 9.85 0h-1.7c-.647 0-1.143.396-1.295 1.018l-.37 1.574-.286.11-1.363-.842c-.546-.337-1.186-.253-1.64.202L2.027 3.24c-.463.471-.555 1.102-.202 1.64l.85 1.364-.101.27-1.556.378A1.293 1.293 0 0 0 0 8.188v1.666a1.3 1.3 0 0 0 1.018 1.296l1.573.37.092.253-.85 1.363c-.353.539-.26 1.178.203 1.641l1.169 1.17c.462.463 1.102.547 1.648.202l1.363-.842.269.093.37 1.573c.152.623.648 1.019 1.295 1.019Zm.135-1.313c-.143 0-.219-.06-.244-.194l-.505-2.087a4.748 4.748 0 0 1-1.354-.555L4.35 14.97c-.101.076-.21.06-.312-.042l-.992-.993c-.093-.092-.101-.193-.034-.31l1.127-1.819a6.132 6.132 0 0 1-.546-1.346l-2.086-.496c-.135-.026-.194-.101-.194-.245V8.314c0-.151.05-.219.194-.244l2.077-.505c.135-.547.387-1.043.538-1.355L3.003 4.393c-.076-.127-.067-.227.025-.328l1.001-.977c.1-.1.193-.117.32-.042L6.165 4.15a6.821 6.821 0 0 1 1.38-.556l.496-2.087c.025-.134.101-.193.244-.193h1.43c.143 0 .219.059.235.193l.514 2.104c.521.135.975.345 1.354.547l1.825-1.11c.135-.076.219-.06.328.041l.992.977c.102.1.102.201.026.328L13.87 6.21c.16.312.404.808.538 1.355l2.086.505c.135.025.194.093.194.244V9.72c0 .144-.067.22-.194.245l-2.094.496a5.75 5.75 0 0 1-.547 1.346l1.127 1.818c.068.118.068.219-.033.311l-.984.993c-.11.101-.21.118-.32.042l-1.834-1.127a4.69 4.69 0 0 1-1.345.555l-.514 2.087c-.016.135-.092.194-.235.194h-1.43ZM9 12.21c1.758 0 3.205-1.447 3.205-3.214 0-1.75-1.447-3.198-3.205-3.198S5.787 7.245 5.787 8.996A3.23 3.23 0 0 0 9 12.21Zm0-1.304a1.91 1.91 0 0 1-1.9-1.91c0-1.035.857-1.894 1.9-1.894 1.026 0 1.884.859 1.884 1.894 0 1.043-.858 1.91-1.884 1.91Z"/>
</g>
<defs>
<clipPath id="a">
<path fill="#fff" d="M0 0h18v18H0z"/>
</clipPath>
</defs>
</svg>
</a>
<a href="/projects">Смотреть проекты
<svg xmlns="http://www.w3.org/2000/svg" style="width: 16px !important; height: 16px !important;" width="16" height="16" fill="none" viewBox="0 0 16 16">
<g clip-path="url(#a)">
<path fill="#000" fill-opacity=".85" d="M1.973 11.72a.917.917 0 0 0-.911-.925c-.494 0-.895.42-.895.925a.901.901 0 1 0 1.805 0Zm0 3.355c0-.505-.401-.933-.911-.933-.494 0-.895.428-.895.933 0 .514.401.925.895.925.51 0 .91-.41.91-.925Zm13.726-3.355c0-.377-.3-.66-.71-.66H3.736c-.41 0-.71.283-.71.66 0 .376.3.667.71.667h11.252c.41 0 .71-.29.71-.667Zm0 3.355c0-.376-.3-.659-.71-.659H3.736c-.41 0-.71.283-.71.66 0 .376.3.667.71.667h11.252c.41 0 .71-.29.71-.668ZM2.316.205C.61.205 0 .967 0 2.628v3.98C0 8.27.61 9.033 2.316 9.033h11.368C15.39 9.032 16 8.27 16 6.609v-3.98C16 .966 15.39.204 13.684.204H2.316Zm-.97 6.447V2.585c0-.762.242-1.095.978-1.095h11.352c.736 0 .978.333.978 1.095v4.067c0 .762-.242 1.095-.978 1.095H2.324c-.736 0-.978-.333-.978-1.095Z"/>
</g>
<defs>
<clipPath id="a">
<path fill="#fff" d="M0 0h16v16H0z"/>
</clipPath>
</defs>
</svg>
</a>
<div class="line"></div>
<div class="theme-selector">
<span>Тема</span>
<div class="theme-switcher">
<button id="light-theme-btn" class="theme-btn" onclick="setTheme('light')">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<path d="M12.493 10.7193C8.11132 10.7193 5.39164 8.09866 5.39164 3.89146C5.39164 2.69166 5.59046 1.63394 5.88469 1.06561C6.00397 0.836704 6.02785 0.726195 6.02785 0.568327C6.02785 0.307844 5.7813 0 5.4473 0C5.38369 0 5.23262 0.0236803 5.00995 0.110508C2.0676 1.29453 0 4.37297 0 7.68821C0 12.4795 3.50696 15.9684 8.33398 15.9684C11.7933 15.9684 14.6004 14.1687 15.8887 11.2166C15.9841 11.0113 16 10.8377 16 10.7509C16 10.4272 15.7217 10.2062 15.4752 10.2062C15.3479 10.2062 15.2525 10.2141 15.0616 10.2851C14.4175 10.5456 13.4473 10.7193 12.493 10.7193ZM1.24851 7.63296C1.24851 5.17809 2.53678 2.84164 4.59641 1.55501C4.34196 2.2891 4.20675 3.10212 4.20675 4.00196C4.20675 8.93537 7.23658 11.8717 12.3101 11.8717C13.1292 11.8717 13.8211 11.777 14.4811 11.5481C13.2724 13.5294 10.9424 14.7371 8.3817 14.7371C4.25447 14.7371 1.24851 11.7533 1.24851 7.63296Z" fill="black" fill-opacity="0.85"/>
</svg>
</button>
<button id="dark-theme-btn" class="theme-btn" onclick="setTheme('dark')">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<g clip-path="url(#clip0_228_36)">
<path d="M8.0037 2.86688C8.35137 2.86688 8.63985 2.57946 8.63985 2.2257V0.641179C8.63985 0.287425 8.35137 0 8.0037 0C7.64863 0 7.36015 0.287425 7.36015 0.641179V2.2257C7.36015 2.57946 7.64863 2.86688 8.0037 2.86688ZM11.6283 4.37772C11.8798 4.62091 12.2867 4.62828 12.5381 4.37772L13.6699 3.25012C13.914 3.00691 13.914 2.5942 13.6699 2.34362C13.4258 2.10042 13.019 2.10042 12.7675 2.34362L11.6283 3.47857C11.3842 3.72915 11.3842 4.13451 11.6283 4.37772ZM13.1299 7.99633C13.1299 8.3427 13.4258 8.63014 13.7735 8.63014H15.3638C15.7115 8.63014 16 8.3427 16 7.99633C16 7.64994 15.7115 7.35513 15.3638 7.35513H13.7735C13.4258 7.35513 13.1299 7.64994 13.1299 7.99633ZM11.6283 11.6149C11.3842 11.8655 11.3842 12.2708 11.6283 12.5141L12.7675 13.6564C13.019 13.8922 13.4258 13.8849 13.6699 13.649C13.914 13.3985 13.914 12.9931 13.6699 12.7499L12.5307 11.6149C12.2867 11.3791 11.8798 11.3791 11.6283 11.6149ZM8.0037 13.1257C7.64863 13.1257 7.36015 13.4132 7.36015 13.7596V15.3515C7.36015 15.6979 7.64863 15.9853 8.0037 15.9853C8.35137 15.9853 8.63985 15.6979 8.63985 15.3515V13.7596C8.63985 13.4132 8.35137 13.1257 8.0037 13.1257ZM4.3717 11.6149C4.12019 11.3791 3.70595 11.3791 3.46187 11.6149L2.3301 12.7425C2.08599 12.9857 2.08599 13.3911 2.3227 13.6416C2.56681 13.8775 2.98105 13.8849 3.23253 13.649L4.36431 12.5141C4.60843 12.2708 4.60843 11.8655 4.3717 11.6149ZM2.87009 7.99633C2.87009 7.64994 2.5742 7.35513 2.22654 7.35513H0.636154C0.288488 7.35513 0 7.64994 0 7.99633C0 8.3427 0.288488 8.63014 0.636154 8.63014H2.22654C2.5742 8.63014 2.87009 8.3427 2.87009 7.99633ZM4.36431 4.37772C4.60843 4.14187 4.60843 3.72179 4.3717 3.47857L3.23996 2.34362C2.99584 2.10779 2.5816 2.10042 2.33749 2.34362C2.09339 2.5942 2.09339 3.00691 2.3301 3.24275L3.46187 4.37772C3.70595 4.62091 4.1128 4.62091 4.36431 4.37772Z" fill="black" fill-opacity="0.85"/>
<path d="M7.99611 11.755C10.0525 11.755 11.7613 10.0525 11.7613 7.99636C11.7613 5.93277 10.0525 4.23035 7.99611 4.23035C5.93971 4.23035 4.23096 5.93277 4.23096 7.99636C4.23096 10.0525 5.93971 11.755 7.99611 11.755ZM7.99611 10.6274C6.55368 10.6274 5.35534 9.43347 5.35534 7.99636C5.35534 6.55185 6.55368 5.35792 7.99611 5.35792C9.43854 5.35792 10.6369 6.55185 10.6369 7.99636C10.6369 9.43347 9.43854 10.6274 7.99611 10.6274Z" fill="black" fill-opacity="0.85"/>
</g>
<defs>
<clipPath id="clip0_228_36">
<rect width="16" height="16" fill="white"/>
</clipPath>
</defs>
</svg>
</button>
<button id="system-theme-btn" class="theme-btn" onclick="setTheme('system')">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<g clip-path="url(#clip0_228_46)">
<path d="M1.54362 13.2758H14.4497C15.4161 13.2758 16 12.6082 16 11.5031V2.30216C16 1.19712 15.4161 0.53717 14.4497 0.53717H1.54362C0.583892 0.53717 0 1.19712 0 2.30216V11.5031C0 12.6082 0.583892 13.2758 1.54362 13.2758ZM1.56376 12.0403C1.26846 12.0403 1.08054 11.8254 1.08054 11.4878V2.32518C1.08054 1.97986 1.26846 1.77266 1.56376 1.77266H14.4362C14.7316 1.77266 14.9195 1.97986 14.9195 2.32518V11.4878C14.9195 11.8254 14.7316 12.0403 14.4362 12.0403H1.56376ZM5.87919 15.1022H10.1208V13.176H5.87919V15.1022ZM5.83892 16H10.1611C10.4564 16 10.698 15.7237 10.698 15.3784C10.698 15.0331 10.4564 14.7568 10.1611 14.7568H5.83892C5.54362 14.7568 5.29531 15.0331 5.29531 15.3784C5.29531 15.7237 5.54362 16 5.83892 16Z" fill="black" fill-opacity="0.85"/>
</g>
<defs>
<clipPath id="clip0_228_46">
<rect width="16" height="16" fill="white"/>
</clipPath>
</defs>
</svg>
</button>
</div>
</div>
<div class="line"></div>
<a href="/" target="_blank">Главная страница
<svg data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="width: 20px; height: 20px;"><path d="M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6"></path><path d="M15 3h6v6"></path><path d="M10 14L21 3"></path></svg>
</a>
<a href="/logout">Выйти из аккаунта</a>
<div class="line"></div>
<button onclick="location.href='/'" class="button">Связаться с нами</button>
</div>
</div>
</div>
</nav>
</header>
<nav class="sections">
<a href="/project/{{Name}}">Обзор</a>
<a href="/project/{{Name}}/progress">Прогресс</a>
<a href="/project/{{Name}}/documents">Документы</a>
<a class="selected" href="/project/{{Name}}/payments">Оплата</a>
<a href="/project/{{Name}}/tests">Тесты</a>
</nav>
<section class="content-bg">
<div class="progress-name-section">
<h1>Оплата проекта</h1>
<h2>Здесь можно посмотреть выставленные и оплаченные счета на оплату</h2>
</div>
<div class="progress-content">
<div class="payments-table-section" style="width: 50%;">
<div class="section-header">
<div class="icon">
<svg xmlns="http://www.w3.org/2000/svg" width="28" height="35" viewBox="0 0 28 35" fill="none">
<g clip-path="url(#clip0_68_211)">
<path d="M0.891602 19.2161C0.891602 19.8531 1.43584 20.3663 2.11144 20.3663H5.99616V31.3014C5.99616 32.2392 6.78437 33 7.77901 33C8.77364 33 9.58061 32.2392 9.58061 31.3014V20.3663H16.4868C22.9801 20.3663 27.1087 16.2966 27.1087 10.6166C27.1087 4.95446 23.0176 0.831665 16.5243 0.831665H7.77901C6.69054 0.831665 5.99616 1.52175 5.99616 2.58341V18.066H2.11144C1.43584 18.066 0.891602 18.5792 0.891602 19.2161ZM9.58061 17.429V3.83971H15.6423C20.8031 3.83971 23.4305 6.45848 23.4305 10.6166C23.4305 14.7926 20.7656 17.429 15.6423 17.429H9.58061ZM0.891602 26.0638C0.891602 26.7008 1.43584 27.2317 2.11144 27.2317H18.7012C19.3769 27.2317 19.9211 26.7008 19.9211 26.0638C19.9211 25.4445 19.3769 24.9137 18.7012 24.9137H2.11144C1.43584 24.9137 0.891602 25.4445 0.891602 26.0638Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_68_211">
<rect width="26.2171" height="35" fill="white" transform="translate(0.891602)"/>
</clipPath>
</defs>
</svg>
</div>
<div class="header-name">
<h1>Оплаченные счета</h1>
<h2>детали при нажатии</h2>
</div>
</div>
<table id="paidTable">
<tbody>
</tbody>
</table>
</div>
<div class="payments-table-section">
<div class="section-header">
<div class="icon">
<svg xmlns="http://www.w3.org/2000/svg" width="28" height="35" viewBox="0 0 28 35" fill="none">
<g clip-path="url(#clip0_68_211)">
<path d="M0.891602 19.2161C0.891602 19.8531 1.43584 20.3663 2.11144 20.3663H5.99616V31.3014C5.99616 32.2392 6.78437 33 7.77901 33C8.77364 33 9.58061 32.2392 9.58061 31.3014V20.3663H16.4868C22.9801 20.3663 27.1087 16.2966 27.1087 10.6166C27.1087 4.95446 23.0176 0.831665 16.5243 0.831665H7.77901C6.69054 0.831665 5.99616 1.52175 5.99616 2.58341V18.066H2.11144C1.43584 18.066 0.891602 18.5792 0.891602 19.2161ZM9.58061 17.429V3.83971H15.6423C20.8031 3.83971 23.4305 6.45848 23.4305 10.6166C23.4305 14.7926 20.7656 17.429 15.6423 17.429H9.58061ZM0.891602 26.0638C0.891602 26.7008 1.43584 27.2317 2.11144 27.2317H18.7012C19.3769 27.2317 19.9211 26.7008 19.9211 26.0638C19.9211 25.4445 19.3769 24.9137 18.7012 24.9137H2.11144C1.43584 24.9137 0.891602 25.4445 0.891602 26.0638Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_68_211">
<rect width="26.2171" height="35" fill="white" transform="translate(0.891602)"/>
</clipPath>
</defs>
</svg>
</div>
<div class="header-name">
<h1>Выставленные счета</h1>
<h2>нажмите на счет чтобы скачать</h2>
</div>
</div>
<table id="notPaidTable">
<tbody>
</tbody>
</table>
</div>
</div>
</section>
<div id="feedback-form-popup-bg" class="form-popup-bg not-main" >
<div class="form-container">
<img src="../../img/xmark.svg" id="btnCloseForm" class="close-button">
<h1>Загрузка нового документа</h1>
<div class="form-cell-wrapper form-textbox">
<input type="text" id="upload-name" autocorrect="off" autocapitalize="off" aria-required="true" required="required" spellcheck="false" class="force-ltr form-textbox-input" autocomplete="off" aria-invalid="false" onfocus="focusHandler(this)" onblur="blurHandler(this)">
<span aria-hidden="true" id="upload-name-label" class="form-textbox-label form-label-flyout">Название документа</span>
</div>
<input type="text" id="upload-type" hidden>
<div class="drop-zone">
<span class="drop-zone__prompt">Перетащите файл сюда или нажмите чтобы загрузить</span>
<input type="file" name="file" class="drop-zone__input">
</div>
<div class="form-button" id="sendFeedback">Добавить файл</div>
</div>
</div>
<script>
document.addEventListener("DOMContentLoaded", function() {
document.getElementById("project-{{Project.id}}").classList.add("selected");
});
</script>
<script>
function toggleProjects() {
if ($('#dropdownProjects').hasClass('is-visible')) {
event.preventDefault();
$('#dropdownProjects').removeClass('is-visible');
setTimeout(function() {
$("#dropdownProjects").css("display", "none");
}, 200);
} else {
event.preventDefault();
$("#dropdownProjects").css("display", "inline-flex");
$('#dropdownProjects').addClass('is-visible');
}
}
$(document).on('click', function(event) {
if ($(event.target).closest('#headerProjects').length) {
return;
} else {
if (!$(event.target).closest('.dropdown-projects').length) {
$('#dropdownProjects').removeClass('is-visible');
setTimeout(function() {
$("#dropdownProjects").css("display", "none");
}, 200);
}
}
});
$(document).ready(function() {
$(document).keydown(function(e) {
if (e.key === "Escape" || e.key === "Esc") {
console.log("Escape")
$('#dropdownProjects').removeClass('is-visible');
setTimeout(function() {
$("#dropdownProjects").css("display", "none");
}, 200);
}
});
});
function closeForm() {
$('.form-popup-bg').removeClass('is-visible');
}
$(document).ready(function($) {
$('#uploadDocument').on('click', function(event) {
event.preventDefault();
$('#feedback-form-popup-bg').addClass('is-visible');
});
$('#feedback-form-popup-bg').on('click', function(event) {
if ($(event.target).is('#feedback-form-popup-bg') || $(event.target).is('#btnCloseForm')) {
event.preventDefault();
$(this).removeClass('is-visible');
}
});
});
document.querySelectorAll(".drop-zone__input").forEach((inputElement) => {
const dropZoneElement = inputElement.closest(".drop-zone");
const uploadNameElement = document.getElementById("upload-name");
const uploadTypeElement = document.getElementById("upload-type");
dropZoneElement.addEventListener("click", (e) => {
inputElement.click();
});
inputElement.addEventListener("change", (e) => {
if (inputElement.files.length) {
updateThumbnail(dropZoneElement, inputElement.files[0]);
if (!uploadNameElement.value) {
const fileNameWithoutExtension = inputElement.files[0].name.replace(/\.[^/.]+$/, "");
const fileExtension = inputElement.files[0].name.split('.').pop();
uploadNameElement.value = fileNameWithoutExtension;
uploadTypeElement.value = fileExtension;
}
const fileExtension = inputElement.files[0].name.split('.').pop();
uploadTypeElement.value = fileExtension;
}
});
dropZoneElement.addEventListener("dragover", (e) => {
e.preventDefault();
dropZoneElement.classList.add("drop-zone--over");
});
["dragleave", "dragend"].forEach((type) => {
dropZoneElement.addEventListener(type, (e) => {
dropZoneElement.classList.remove("drop-zone--over");
});
});
dropZoneElement.addEventListener("drop", (e) => {
e.preventDefault();
if (e.dataTransfer.files.length) {
inputElement.files = e.dataTransfer.files;
updateThumbnail(dropZoneElement, e.dataTransfer.files[0]);
if (!uploadNameElement.value) {
// Заполняем upload-name и upload-type, если upload-name пустой
const fileNameWithoutExtension = e.dataTransfer.files[0].name.replace(/\.[^/.]+$/, ""); // удаляем расширение файла
const fileExtension = e.dataTransfer.files[0].name.split('.').pop(); // получаем расширение файла
uploadNameElement.value = fileNameWithoutExtension;
uploadTypeElement.value = fileExtension;
}
}
dropZoneElement.classList.remove("drop-zone--over");
});
});
function updateThumbnail(dropZoneElement, file) {
let thumbnailElement = dropZoneElement.querySelector(".drop-zone__thumb");
if (dropZoneElement.querySelector(".drop-zone__prompt")) {
dropZoneElement.querySelector(".drop-zone__prompt").remove();
}
if (!thumbnailElement) {
thumbnailElement = document.createElement("div");
thumbnailElement.classList.add("drop-zone__thumb");
dropZoneElement.appendChild(thumbnailElement);
}
thumbnailElement.dataset.label = file.name;
if (file.type.startsWith("image/")) {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => {
thumbnailElement.style.backgroundImage = `url('${reader.result}')`;
};
} else {
thumbnailElement.style.backgroundImage = null;
}
}
</script>
</body>
</html>

View File

@@ -0,0 +1,312 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Прогресс</title>
<link rel="icon" type="image/x-icon" href="../../img/favicon.png">
<link href="https://fonts.googleapis.com/css?family=Montserrat" rel="stylesheet">
<link rel="stylesheet" href="../../styles/main.css">
<script src="../../scripts/jquery.min.js"></script>
<script>
const API_SERVER = "{{API_SERVER}}";
</script>
<script type="module">
import { minidenticonSvg } from 'https://cdn.jsdelivr.net/npm/minidenticons@4.2.0/minidenticons.min.js'
</script>
<link rel="stylesheet" href="../../styles/daterangepicker.css">
<script type="text/javascript" src="../../scripts/moment.min.js"></script>
<script type="text/javascript" src="../../scripts/jquery.daterangepicker.min.js"></script>
<script>
let modules = [
{{#each Modules}}
{
id: {{this.id}},
name: "{{this.name}}",
status: {{this.procent}},
},
{{/each}}
];
</script>
<script src="../../scripts/projects.js"></script>
<script src="../../scripts/update-calendar.js"></script>
</head>
<body>
<header class="lk-header">
<div class="header-logo">
<a href="/projects"><img src="../../img/krbl.svg">{{#if Project.maraku}} X <img onclick="window.open('https://maraku.ru/', '_blank')" src="../../img/maraku.svg">{{/if}}</a>
<span class="slash">/</span>
<span>{{Project.displayname}}</span>
<div class="dropdown">
<button id="headerProjects" type="button" onclick="toggleProjects();">
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="18" viewBox="0 0 13 18" fill="none">
<path d="M6.93296 0.392929C6.70015 0.392929 6.49422 0.48226 6.31514 0.660923L1.20253 5.55627C1.06822 5.69026 0.969727 5.87786 0.969727 6.13691C0.969727 6.60146 1.31892 6.95876 1.78452 6.95876C1.9815 6.95876 2.1964 6.9052 2.38442 6.7176L6.93296 2.27782L11.4725 6.7176C11.6695 6.89623 11.8754 6.95876 12.0724 6.95876C12.538 6.95876 12.8872 6.60146 12.8872 6.13691C12.8872 5.87786 12.7977 5.69026 12.6544 5.55627L7.5418 0.660923C7.36271 0.48226 7.15679 0.392929 6.93296 0.392929ZM6.93296 17.5981C7.15679 17.5981 7.36271 17.4999 7.5418 17.3302L12.6544 12.4348C12.7977 12.2918 12.8872 12.1132 12.8872 11.8452C12.8872 11.3807 12.538 11.0323 12.0724 11.0323C11.8754 11.0323 11.6695 11.0948 11.4725 11.2735L6.93296 15.7132L2.38442 11.2735C2.1964 11.0859 1.9815 11.0323 1.78452 11.0323C1.31892 11.0323 0.969727 11.3807 0.969727 11.8452C0.969727 12.1132 1.06822 12.2918 1.20253 12.4348L6.31514 17.3302C6.49422 17.4999 6.70015 17.5981 6.93296 17.5981Z" fill="black" fill-opacity="0.6"/>
</svg>
</button>
<div id="dropdownProjects" class="dropdown-projects">
<input type="text" placeholder="Найти проект...">
<h1>Проекты</h1>
{{#each Projects}}
<div onclick="location.href='/project/{{this.name}}'" id="project-{{this.id}}" class="project"> {{#if this.avatar}} <div class="avatar-container"><img src="{{../API_SERVER}}/{{this.avatar}}"></div>{{/if}} {{this.displayname}}
<svg class="checkmark" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 20 20">
<g clip-path="url(#a)">
<path fill="#000" fill-opacity=".6" d="M7.388 20c.487 0 .873-.215 1.145-.635L19.24 2.505c.204-.33.283-.579.283-.84 0-.623-.408-1.03-1.031-1.03-.453 0-.703.147-.975.577L7.343 17.428l-5.28-6.912c-.284-.397-.567-.556-.975-.556C.442 9.96 0 10.402 0 11.025c0 .261.113.556.329.828l5.88 7.49c.34.442.692.657 1.18.657Z"/>
</g>
<defs>
<clipPath id="a">
<path fill="#fff" d="M0 0h19.524v20H0z"/>
</clipPath>
</defs>
</svg>
</div>
{{/each}}
</div>
</div>
</div>
<nav>
<a onclick="alert('Этот раздел в разработке.');">Новости</a>
<a onclick="alert('Этот раздел в разработке.');">Помощь</a>
<div class="user">
<svg class="user-svg ring" width="20" height="22" viewBox="0 0 20 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 16.8241C0 17.5978 0.593536 18.1066 1.60042 18.1066H6.07316C6.15794 20.1522 7.75836 21.9434 9.99473 21.9434C12.2416 21.9434 13.8421 20.1627 13.9269 18.1066H18.3996C19.3959 18.1066 20 17.5978 20 16.8241C20 15.7642 18.9189 14.8103 18.0074 13.867C17.3079 13.1357 17.1171 11.6307 17.0323 10.4118C16.9581 6.23586 15.8771 3.54376 13.0578 2.52627C12.6974 1.13782 11.5633 0.0461426 9.99473 0.0461426C8.43668 0.0461426 7.29201 1.13782 6.94224 2.52627C4.12295 3.54376 3.04187 6.23586 2.96768 10.4118C2.88288 11.6307 2.69211 13.1357 1.99258 13.867C1.07048 14.8103 0 15.7642 0 16.8241ZM2.05618 16.5061V16.379C2.24695 16.0716 2.88288 15.4462 3.43403 14.8315C4.19714 13.9836 4.55748 12.6164 4.6529 10.5496C4.73769 5.9179 6.11553 4.44465 7.92793 3.94652C8.19292 3.88292 8.3413 3.75574 8.3519 3.48017C8.38367 2.37789 9.01963 1.60417 9.99473 1.60417C10.9804 1.60417 11.6057 2.37789 11.6481 3.48017C11.6587 3.75574 11.7965 3.88292 12.0615 3.94652C13.8845 4.44465 15.2623 5.9179 15.3471 10.5496C15.4425 12.6164 15.8029 13.9836 16.5554 14.8315C17.1171 15.4462 17.7424 16.0716 17.9332 16.379V16.5061H2.05618ZM7.72658 18.1066H12.2735C12.1887 19.548 11.2772 20.4489 9.99473 20.4489C8.72286 20.4489 7.80077 19.548 7.72658 18.1066Z" fill="black" fill-opacity="0.85"/>
</svg>
<div class="dropdown">
<minidenticon-svg onclick="toggleAccount();" id="userIcon" style="height: 40px;" username="{{User.email}}"></minidenticon-svg>
<div id="dropdownAccount" class="dropdown-account">
<div class="user-name">
<h1>{{User.name}}</h1>
<h2>{{User.email}}</h2>
</div>
<a href="/user/settings">Настройки профиля <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="none" viewBox="0 0 18 18">
<g clip-path="url(#a)">
<path fill="#000" fill-opacity=".85" d="M8.15 17.992h1.7c.647 0 1.143-.396 1.295-1.019l.362-1.573.269-.093 1.37.842c.547.345 1.178.26 1.64-.202l1.178-1.17c.463-.463.547-1.102.202-1.64l-.858-1.364.101-.253 1.573-.37A1.301 1.301 0 0 0 18 9.854V8.188c0-.64-.395-1.145-1.018-1.296l-1.556-.379-.11-.269.859-1.363c.345-.539.26-1.17-.202-1.641l-1.178-1.178c-.454-.455-1.085-.539-1.631-.202l-1.371.841-.286-.11-.362-1.573C10.993.396 10.497 0 9.85 0h-1.7c-.647 0-1.143.396-1.295 1.018l-.37 1.574-.286.11-1.363-.842c-.546-.337-1.186-.253-1.64.202L2.027 3.24c-.463.471-.555 1.102-.202 1.64l.85 1.364-.101.27-1.556.378A1.293 1.293 0 0 0 0 8.188v1.666a1.3 1.3 0 0 0 1.018 1.296l1.573.37.092.253-.85 1.363c-.353.539-.26 1.178.203 1.641l1.169 1.17c.462.463 1.102.547 1.648.202l1.363-.842.269.093.37 1.573c.152.623.648 1.019 1.295 1.019Zm.135-1.313c-.143 0-.219-.06-.244-.194l-.505-2.087a4.748 4.748 0 0 1-1.354-.555L4.35 14.97c-.101.076-.21.06-.312-.042l-.992-.993c-.093-.092-.101-.193-.034-.31l1.127-1.819a6.132 6.132 0 0 1-.546-1.346l-2.086-.496c-.135-.026-.194-.101-.194-.245V8.314c0-.151.05-.219.194-.244l2.077-.505c.135-.547.387-1.043.538-1.355L3.003 4.393c-.076-.127-.067-.227.025-.328l1.001-.977c.1-.1.193-.117.32-.042L6.165 4.15a6.821 6.821 0 0 1 1.38-.556l.496-2.087c.025-.134.101-.193.244-.193h1.43c.143 0 .219.059.235.193l.514 2.104c.521.135.975.345 1.354.547l1.825-1.11c.135-.076.219-.06.328.041l.992.977c.102.1.102.201.026.328L13.87 6.21c.16.312.404.808.538 1.355l2.086.505c.135.025.194.093.194.244V9.72c0 .144-.067.22-.194.245l-2.094.496a5.75 5.75 0 0 1-.547 1.346l1.127 1.818c.068.118.068.219-.033.311l-.984.993c-.11.101-.21.118-.32.042l-1.834-1.127a4.69 4.69 0 0 1-1.345.555l-.514 2.087c-.016.135-.092.194-.235.194h-1.43ZM9 12.21c1.758 0 3.205-1.447 3.205-3.214 0-1.75-1.447-3.198-3.205-3.198S5.787 7.245 5.787 8.996A3.23 3.23 0 0 0 9 12.21Zm0-1.304a1.91 1.91 0 0 1-1.9-1.91c0-1.035.857-1.894 1.9-1.894 1.026 0 1.884.859 1.884 1.894 0 1.043-.858 1.91-1.884 1.91Z"/>
</g>
<defs>
<clipPath id="a">
<path fill="#fff" d="M0 0h18v18H0z"/>
</clipPath>
</defs>
</svg>
</a>
<a href="/projects">Смотреть проекты
<svg xmlns="http://www.w3.org/2000/svg" style="width: 16px !important; height: 16px !important;" width="16" height="16" fill="none" viewBox="0 0 16 16">
<g clip-path="url(#a)">
<path fill="#000" fill-opacity=".85" d="M1.973 11.72a.917.917 0 0 0-.911-.925c-.494 0-.895.42-.895.925a.901.901 0 1 0 1.805 0Zm0 3.355c0-.505-.401-.933-.911-.933-.494 0-.895.428-.895.933 0 .514.401.925.895.925.51 0 .91-.41.91-.925Zm13.726-3.355c0-.377-.3-.66-.71-.66H3.736c-.41 0-.71.283-.71.66 0 .376.3.667.71.667h11.252c.41 0 .71-.29.71-.667Zm0 3.355c0-.376-.3-.659-.71-.659H3.736c-.41 0-.71.283-.71.66 0 .376.3.667.71.667h11.252c.41 0 .71-.29.71-.668ZM2.316.205C.61.205 0 .967 0 2.628v3.98C0 8.27.61 9.033 2.316 9.033h11.368C15.39 9.032 16 8.27 16 6.609v-3.98C16 .966 15.39.204 13.684.204H2.316Zm-.97 6.447V2.585c0-.762.242-1.095.978-1.095h11.352c.736 0 .978.333.978 1.095v4.067c0 .762-.242 1.095-.978 1.095H2.324c-.736 0-.978-.333-.978-1.095Z"/>
</g>
<defs>
<clipPath id="a">
<path fill="#fff" d="M0 0h16v16H0z"/>
</clipPath>
</defs>
</svg>
</a>
<div class="line"></div>
<div class="theme-selector">
<span>Тема</span>
<div class="theme-switcher">
<button id="light-theme-btn" class="theme-btn" onclick="setTheme('light')">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<path d="M12.493 10.7193C8.11132 10.7193 5.39164 8.09866 5.39164 3.89146C5.39164 2.69166 5.59046 1.63394 5.88469 1.06561C6.00397 0.836704 6.02785 0.726195 6.02785 0.568327C6.02785 0.307844 5.7813 0 5.4473 0C5.38369 0 5.23262 0.0236803 5.00995 0.110508C2.0676 1.29453 0 4.37297 0 7.68821C0 12.4795 3.50696 15.9684 8.33398 15.9684C11.7933 15.9684 14.6004 14.1687 15.8887 11.2166C15.9841 11.0113 16 10.8377 16 10.7509C16 10.4272 15.7217 10.2062 15.4752 10.2062C15.3479 10.2062 15.2525 10.2141 15.0616 10.2851C14.4175 10.5456 13.4473 10.7193 12.493 10.7193ZM1.24851 7.63296C1.24851 5.17809 2.53678 2.84164 4.59641 1.55501C4.34196 2.2891 4.20675 3.10212 4.20675 4.00196C4.20675 8.93537 7.23658 11.8717 12.3101 11.8717C13.1292 11.8717 13.8211 11.777 14.4811 11.5481C13.2724 13.5294 10.9424 14.7371 8.3817 14.7371C4.25447 14.7371 1.24851 11.7533 1.24851 7.63296Z" fill="black" fill-opacity="0.85"/>
</svg>
</button>
<button id="dark-theme-btn" class="theme-btn" onclick="setTheme('dark')">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<g clip-path="url(#clip0_228_36)">
<path d="M8.0037 2.86688C8.35137 2.86688 8.63985 2.57946 8.63985 2.2257V0.641179C8.63985 0.287425 8.35137 0 8.0037 0C7.64863 0 7.36015 0.287425 7.36015 0.641179V2.2257C7.36015 2.57946 7.64863 2.86688 8.0037 2.86688ZM11.6283 4.37772C11.8798 4.62091 12.2867 4.62828 12.5381 4.37772L13.6699 3.25012C13.914 3.00691 13.914 2.5942 13.6699 2.34362C13.4258 2.10042 13.019 2.10042 12.7675 2.34362L11.6283 3.47857C11.3842 3.72915 11.3842 4.13451 11.6283 4.37772ZM13.1299 7.99633C13.1299 8.3427 13.4258 8.63014 13.7735 8.63014H15.3638C15.7115 8.63014 16 8.3427 16 7.99633C16 7.64994 15.7115 7.35513 15.3638 7.35513H13.7735C13.4258 7.35513 13.1299 7.64994 13.1299 7.99633ZM11.6283 11.6149C11.3842 11.8655 11.3842 12.2708 11.6283 12.5141L12.7675 13.6564C13.019 13.8922 13.4258 13.8849 13.6699 13.649C13.914 13.3985 13.914 12.9931 13.6699 12.7499L12.5307 11.6149C12.2867 11.3791 11.8798 11.3791 11.6283 11.6149ZM8.0037 13.1257C7.64863 13.1257 7.36015 13.4132 7.36015 13.7596V15.3515C7.36015 15.6979 7.64863 15.9853 8.0037 15.9853C8.35137 15.9853 8.63985 15.6979 8.63985 15.3515V13.7596C8.63985 13.4132 8.35137 13.1257 8.0037 13.1257ZM4.3717 11.6149C4.12019 11.3791 3.70595 11.3791 3.46187 11.6149L2.3301 12.7425C2.08599 12.9857 2.08599 13.3911 2.3227 13.6416C2.56681 13.8775 2.98105 13.8849 3.23253 13.649L4.36431 12.5141C4.60843 12.2708 4.60843 11.8655 4.3717 11.6149ZM2.87009 7.99633C2.87009 7.64994 2.5742 7.35513 2.22654 7.35513H0.636154C0.288488 7.35513 0 7.64994 0 7.99633C0 8.3427 0.288488 8.63014 0.636154 8.63014H2.22654C2.5742 8.63014 2.87009 8.3427 2.87009 7.99633ZM4.36431 4.37772C4.60843 4.14187 4.60843 3.72179 4.3717 3.47857L3.23996 2.34362C2.99584 2.10779 2.5816 2.10042 2.33749 2.34362C2.09339 2.5942 2.09339 3.00691 2.3301 3.24275L3.46187 4.37772C3.70595 4.62091 4.1128 4.62091 4.36431 4.37772Z" fill="black" fill-opacity="0.85"/>
<path d="M7.99611 11.755C10.0525 11.755 11.7613 10.0525 11.7613 7.99636C11.7613 5.93277 10.0525 4.23035 7.99611 4.23035C5.93971 4.23035 4.23096 5.93277 4.23096 7.99636C4.23096 10.0525 5.93971 11.755 7.99611 11.755ZM7.99611 10.6274C6.55368 10.6274 5.35534 9.43347 5.35534 7.99636C5.35534 6.55185 6.55368 5.35792 7.99611 5.35792C9.43854 5.35792 10.6369 6.55185 10.6369 7.99636C10.6369 9.43347 9.43854 10.6274 7.99611 10.6274Z" fill="black" fill-opacity="0.85"/>
</g>
<defs>
<clipPath id="clip0_228_36">
<rect width="16" height="16" fill="white"/>
</clipPath>
</defs>
</svg>
</button>
<button id="system-theme-btn" class="theme-btn" onclick="setTheme('system')">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<g clip-path="url(#clip0_228_46)">
<path d="M1.54362 13.2758H14.4497C15.4161 13.2758 16 12.6082 16 11.5031V2.30216C16 1.19712 15.4161 0.53717 14.4497 0.53717H1.54362C0.583892 0.53717 0 1.19712 0 2.30216V11.5031C0 12.6082 0.583892 13.2758 1.54362 13.2758ZM1.56376 12.0403C1.26846 12.0403 1.08054 11.8254 1.08054 11.4878V2.32518C1.08054 1.97986 1.26846 1.77266 1.56376 1.77266H14.4362C14.7316 1.77266 14.9195 1.97986 14.9195 2.32518V11.4878C14.9195 11.8254 14.7316 12.0403 14.4362 12.0403H1.56376ZM5.87919 15.1022H10.1208V13.176H5.87919V15.1022ZM5.83892 16H10.1611C10.4564 16 10.698 15.7237 10.698 15.3784C10.698 15.0331 10.4564 14.7568 10.1611 14.7568H5.83892C5.54362 14.7568 5.29531 15.0331 5.29531 15.3784C5.29531 15.7237 5.54362 16 5.83892 16Z" fill="black" fill-opacity="0.85"/>
</g>
<defs>
<clipPath id="clip0_228_46">
<rect width="16" height="16" fill="white"/>
</clipPath>
</defs>
</svg>
</button>
</div>
</div>
<div class="line"></div>
<a href="/" target="_blank">Главная страница
<svg data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="width: 20px; height: 20px;"><path d="M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6"></path><path d="M15 3h6v6"></path><path d="M10 14L21 3"></path></svg>
</a>
<a href="/logout">Выйти из аккаунта</a>
<div class="line"></div>
<button onclick="location.href='/'" class="button">Связаться с нами</button>
</div>
</div>
</div>
</nav>
</header>
<nav class="sections">
<a href="/project/{{Name}}">Обзор</a>
<a class="selected" href="/project/{{Name}}/progress">Прогресс</a>
<a href="/project/{{Name}}/documents">Документы</a>
<a href="/project/{{Name}}/payments">Оплата</a>
<a href="/project/{{Name}}/tests">Тесты</a>
</nav>
<section class="content-bg">
<div class="progress-name-section">
<h1>Отслеживание прогресса проекта</h1>
<h2>Здесь можно посмотреть список обновлений и приложения к ним</h2>
</div>
<div class="progress-content">
<div class="graph">
<ul class="squares">
<!-- added via javascript -->
</ul>
</div>
<div class="progress-update-section">
<div class="table-search-section">
<input type="text" class="search-input" placeholder="Название обновления...">
<div id="date-range" class="date-range"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="16" viewBox="0 0 18 16" fill="none">
<g clip-path="url(#clip0_89_144)">
<path d="M2.72599 16H14.5849C16.3994 16 17.3022 15.0971 17.3022 13.3087V2.7086C17.3022 0.92021 16.3994 0.017334 14.5849 0.017334H2.72599C0.911559 0.017334 0 0.91153 0 2.7086V13.3087C0 15.1058 0.911559 16 2.72599 16ZM2.59577 14.6023C1.82311 14.6023 1.39772 14.1942 1.39772 13.3869V5.20018C1.39772 4.40148 1.82311 3.9848 2.59577 3.9848H14.6978C15.4704 3.9848 15.9045 4.40148 15.9045 5.20018V13.3869C15.9045 14.1942 15.4704 14.6023 14.6978 14.6023H2.59577ZM6.96257 7.10144H7.47477C7.77862 7.10144 7.87414 7.01464 7.87414 6.71078V6.19855C7.87414 5.89469 7.77862 5.79922 7.47477 5.79922H6.96257C6.65872 5.79922 6.55453 5.89469 6.55453 6.19855V6.71078C6.55453 7.01464 6.65872 7.10144 6.96257 7.10144ZM9.84481 7.10144H10.357C10.6609 7.10144 10.765 7.01464 10.765 6.71078V6.19855C10.765 5.89469 10.6609 5.79922 10.357 5.79922H9.84481C9.54099 5.79922 9.4368 5.89469 9.4368 6.19855V6.71078C9.4368 7.01464 9.54099 7.10144 9.84481 7.10144ZM12.7271 7.10144H13.2393C13.5431 7.10144 13.6473 7.01464 13.6473 6.71078V6.19855C13.6473 5.89469 13.5431 5.79922 13.2393 5.79922H12.7271C12.4232 5.79922 12.3277 5.89469 12.3277 6.19855V6.71078C12.3277 7.01464 12.4232 7.10144 12.7271 7.10144ZM4.0803 9.94029H4.58382C4.89636 9.94029 4.99187 9.85349 4.99187 9.54963V9.0374C4.99187 8.73354 4.89636 8.64674 4.58382 8.64674H4.0803C3.76777 8.64674 3.67226 8.73354 3.67226 9.0374V9.54963C3.67226 9.85349 3.76777 9.94029 4.0803 9.94029ZM6.96257 9.94029H7.47477C7.77862 9.94029 7.87414 9.85349 7.87414 9.54963V9.0374C7.87414 8.73354 7.77862 8.64674 7.47477 8.64674H6.96257C6.65872 8.64674 6.55453 8.73354 6.55453 9.0374V9.54963C6.55453 9.85349 6.65872 9.94029 6.96257 9.94029ZM9.84481 9.94029H10.357C10.6609 9.94029 10.765 9.85349 10.765 9.54963V9.0374C10.765 8.73354 10.6609 8.64674 10.357 8.64674H9.84481C9.54099 8.64674 9.4368 8.73354 9.4368 9.0374V9.54963C9.4368 9.85349 9.54099 9.94029 9.84481 9.94029ZM12.7271 9.94029H13.2393C13.5431 9.94029 13.6473 9.85349 13.6473 9.54963V9.0374C13.6473 8.73354 13.5431 8.64674 13.2393 8.64674H12.7271C12.4232 8.64674 12.3277 8.73354 12.3277 9.0374V9.54963C12.3277 9.85349 12.4232 9.94029 12.7271 9.94029ZM4.0803 12.7878H4.58382C4.89636 12.7878 4.99187 12.6923 4.99187 12.3885V11.8763C4.99187 11.5724 4.89636 11.4856 4.58382 11.4856H4.0803C3.76777 11.4856 3.67226 11.5724 3.67226 11.8763V12.3885C3.67226 12.6923 3.76777 12.7878 4.0803 12.7878ZM6.96257 12.7878H7.47477C7.77862 12.7878 7.87414 12.6923 7.87414 12.3885V11.8763C7.87414 11.5724 7.77862 11.4856 7.47477 11.4856H6.96257C6.65872 11.4856 6.55453 11.5724 6.55453 11.8763V12.3885C6.55453 12.6923 6.65872 12.7878 6.96257 12.7878ZM9.84481 12.7878H10.357C10.6609 12.7878 10.765 12.6923 10.765 12.3885V11.8763C10.765 11.5724 10.6609 11.4856 10.357 11.4856H9.84481C9.54099 11.4856 9.4368 11.5724 9.4368 11.8763V12.3885C9.4368 12.6923 9.54099 12.7878 9.84481 12.7878Z" fill="black"/>
</g>
<defs>
<clipPath id="clip0_89_144">
<rect width="17.3022" height="16" fill="white"/>
</clipPath>
</defs>
</svg>
Выбрать даты
</div>
</div>
<div class="progress-update-table">
<table>
<tbody>
{{#each Releases}}
<tr>
<td>
<div class="row-container">
<div class="row-content">
<h1>{{this.body}}</h1>
<h2>{{this.published_at}}</h2>
<span>нет приложений</span>
</div>
</div>
</td>
</tr>
{{/each}}
</tbody>
</table>
</div>
</div>
<div class="progress-modules-section">
<div class="section-header">
<div class="icon">
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="31" viewBox="0 0 30 31" fill="none">
<g clip-path="url(#clip0_87_36)">
<path d="M6.09579 15.1313C9.46918 15.1313 11.5089 12.3541 11.5089 7.92945C11.5089 3.50485 9.4535 0.774759 6.09579 0.774759C2.7224 0.774759 0.666992 3.52054 0.666992 7.92945C0.666992 12.3698 2.70672 15.1313 6.09579 15.1313ZM6.09579 12.9346C4.27573 12.9346 3.19311 11.0989 3.19311 7.92945C3.19311 4.80713 4.29142 2.95569 6.09579 2.95569C7.90017 2.95569 8.98281 4.79144 8.98281 7.92945C8.98281 11.0989 7.91585 12.9346 6.09579 12.9346ZM23.9198 30.2252C27.2932 30.2252 29.3329 27.448 29.3329 23.0391C29.3329 18.5988 27.2775 15.8687 23.9198 15.8687C20.5464 15.8687 18.491 18.6145 18.491 23.0391C18.491 27.4637 20.5307 30.2252 23.9198 30.2252ZM23.9198 28.0443C22.0998 28.0443 21.0171 26.1928 21.0171 23.0391C21.0171 19.9011 22.1154 18.0653 23.9198 18.0653C25.7242 18.0653 26.8068 19.8854 26.8068 23.0391C26.8068 26.1928 25.7399 28.0443 23.9198 28.0443ZM4.9661 30.288C5.54663 30.6175 6.3939 30.5704 6.89599 29.8487L25.3319 2.59482C25.8811 1.81031 25.5516 1.01011 24.9711 0.664928C24.4219 0.366815 23.6531 0.429575 23.1039 1.21408L4.66799 28.3895C4.10314 29.1897 4.38556 29.9428 4.9661 30.288Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_87_36">
<rect width="28.6659" height="30" fill="white" transform="translate(0.666992 0.5)"/>
</clipPath>
</defs>
</svg>
</div>
<div class="header-name">
<h1>Прогресс модулей</h1>
<h2>функции сайта в модулях</h2>
</div>
</div>
<table id="modules-table">
<tbody>
</tbody>
</table>
</div>
</div>
</section>
<script>
document.addEventListener("DOMContentLoaded", function() {
document.getElementById("project-{{Project.id}}").classList.add("selected");
});
</script>
<script>
function toggleProjects() {
if ($('#dropdownProjects').hasClass('is-visible')) {
event.preventDefault();
$('#dropdownProjects').removeClass('is-visible');
setTimeout(function() {
$("#dropdownProjects").css("display", "none");
}, 200);
} else {
event.preventDefault();
$("#dropdownProjects").css("display", "inline-flex");
$('#dropdownProjects').addClass('is-visible');
}
}
$(document).on('click', function(event) {
if ($(event.target).closest('#headerProjects').length) {
return;
} else {
if (!$(event.target).closest('.dropdown-projects').length) {
$('#dropdownProjects').removeClass('is-visible');
setTimeout(function() {
$("#dropdownProjects").css("display", "none");
}, 200);
}
}
});
$(document).ready(function() {
$(document).keydown(function(e) {
if (e.key === "Escape" || e.key === "Esc") {
console.log("Escape")
$('#dropdownProjects').removeClass('is-visible');
setTimeout(function() {
$("#dropdownProjects").css("display", "none");
}, 200);
}
});
});
const squares = document.querySelector('.squares');
for (var i = 1; i < 358; i++) {
const level = Math.floor(Math.random() * 3);
squares.insertAdjacentHTML('beforeend', `<li data-level="${level}"></li>`);
squares.classList.add('rounded')
}
</script>
</body>
</html>

View File

@@ -0,0 +1,384 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Аргус</title>
<link rel="icon" type="image/x-icon" href="../img/favicon.png">
<link href="https://fonts.googleapis.com/css?family=Montserrat" rel="stylesheet">
<link rel="stylesheet" href="../styles/main.css">
<script src="../scripts/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/js-circle-progress/dist/circle-progress.min.js" type="module"></script>
<script>
const API_SERVER = "{{API_SERVER}}";
</script>
<script type="module">
import { minidenticonSvg } from 'https://cdn.jsdelivr.net/npm/minidenticons@4.2.0/minidenticons.min.js'
</script>
<script>
let documents = [
{{#each Documents}}
{
id: {{this.id}},
name: "{{this.name}}",
type: "{{this.format}}",
path: "{{this.path}}",
date: "{{this.uploaded}}",
},
{{/each}}
];
let payments = [
{{#each Payments}}
{
id: {{this.id}},
name: "{{this.name}}",
amount: {{this.amount}},
path: "{{this.filepath}}",
date: "{{this.lastupdate}}",
},
{{/each}}
];
</script>
<script src="../scripts/projects.js"></script>
<script src="../scripts/payments-table.js"></script>
<script src="../scripts/documents-table.js"></script>
</head>
<body>
<header class="lk-header">
<div class="header-logo">
<a href="/projects"><img src="../img/krbl.svg">{{#if Project.maraku}} X <img onclick="window.open('https://maraku.ru/', '_blank')" src="../img/maraku.svg">{{/if}}</a>
<span class="slash">/</span>
<span>{{Project.displayname}}</span>
<div class="dropdown">
<button id="headerProjects" type="button" onclick="toggleProjects();">
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="18" viewBox="0 0 13 18" fill="none">
<path d="M6.93296 0.392929C6.70015 0.392929 6.49422 0.48226 6.31514 0.660923L1.20253 5.55627C1.06822 5.69026 0.969727 5.87786 0.969727 6.13691C0.969727 6.60146 1.31892 6.95876 1.78452 6.95876C1.9815 6.95876 2.1964 6.9052 2.38442 6.7176L6.93296 2.27782L11.4725 6.7176C11.6695 6.89623 11.8754 6.95876 12.0724 6.95876C12.538 6.95876 12.8872 6.60146 12.8872 6.13691C12.8872 5.87786 12.7977 5.69026 12.6544 5.55627L7.5418 0.660923C7.36271 0.48226 7.15679 0.392929 6.93296 0.392929ZM6.93296 17.5981C7.15679 17.5981 7.36271 17.4999 7.5418 17.3302L12.6544 12.4348C12.7977 12.2918 12.8872 12.1132 12.8872 11.8452C12.8872 11.3807 12.538 11.0323 12.0724 11.0323C11.8754 11.0323 11.6695 11.0948 11.4725 11.2735L6.93296 15.7132L2.38442 11.2735C2.1964 11.0859 1.9815 11.0323 1.78452 11.0323C1.31892 11.0323 0.969727 11.3807 0.969727 11.8452C0.969727 12.1132 1.06822 12.2918 1.20253 12.4348L6.31514 17.3302C6.49422 17.4999 6.70015 17.5981 6.93296 17.5981Z" fill="black" fill-opacity="0.6"/>
</svg>
</button>
<div id="dropdownProjects" class="dropdown-projects">
<input type="text" placeholder="Найти проект...">
<h1>Проекты</h1>
{{#each Projects}}
<div onclick="location.href='/project/{{this.name}}'" id="project-{{this.id}}" class="project"> {{#if this.avatar}} <div class="avatar-container"><img src="{{../API_SERVER}}/{{this.avatar}}"></div>{{/if}} {{this.displayname}}
<svg class="checkmark" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 20 20">
<g clip-path="url(#a)">
<path fill="#000" fill-opacity=".6" d="M7.388 20c.487 0 .873-.215 1.145-.635L19.24 2.505c.204-.33.283-.579.283-.84 0-.623-.408-1.03-1.031-1.03-.453 0-.703.147-.975.577L7.343 17.428l-5.28-6.912c-.284-.397-.567-.556-.975-.556C.442 9.96 0 10.402 0 11.025c0 .261.113.556.329.828l5.88 7.49c.34.442.692.657 1.18.657Z"/>
</g>
<defs>
<clipPath id="a">
<path fill="#fff" d="M0 0h19.524v20H0z"/>
</clipPath>
</defs>
</svg>
</div>
{{/each}}
</div>
</div>
</div>
<nav>
<a onclick="alert('Этот раздел в разработке.');">Новости</a>
<a onclick="alert('Этот раздел в разработке.');">Помощь</a>
<div class="user">
<svg class="user-svg ring" width="20" height="22" viewBox="0 0 20 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 16.8241C0 17.5978 0.593536 18.1066 1.60042 18.1066H6.07316C6.15794 20.1522 7.75836 21.9434 9.99473 21.9434C12.2416 21.9434 13.8421 20.1627 13.9269 18.1066H18.3996C19.3959 18.1066 20 17.5978 20 16.8241C20 15.7642 18.9189 14.8103 18.0074 13.867C17.3079 13.1357 17.1171 11.6307 17.0323 10.4118C16.9581 6.23586 15.8771 3.54376 13.0578 2.52627C12.6974 1.13782 11.5633 0.0461426 9.99473 0.0461426C8.43668 0.0461426 7.29201 1.13782 6.94224 2.52627C4.12295 3.54376 3.04187 6.23586 2.96768 10.4118C2.88288 11.6307 2.69211 13.1357 1.99258 13.867C1.07048 14.8103 0 15.7642 0 16.8241ZM2.05618 16.5061V16.379C2.24695 16.0716 2.88288 15.4462 3.43403 14.8315C4.19714 13.9836 4.55748 12.6164 4.6529 10.5496C4.73769 5.9179 6.11553 4.44465 7.92793 3.94652C8.19292 3.88292 8.3413 3.75574 8.3519 3.48017C8.38367 2.37789 9.01963 1.60417 9.99473 1.60417C10.9804 1.60417 11.6057 2.37789 11.6481 3.48017C11.6587 3.75574 11.7965 3.88292 12.0615 3.94652C13.8845 4.44465 15.2623 5.9179 15.3471 10.5496C15.4425 12.6164 15.8029 13.9836 16.5554 14.8315C17.1171 15.4462 17.7424 16.0716 17.9332 16.379V16.5061H2.05618ZM7.72658 18.1066H12.2735C12.1887 19.548 11.2772 20.4489 9.99473 20.4489C8.72286 20.4489 7.80077 19.548 7.72658 18.1066Z" fill="black" fill-opacity="0.85"/>
</svg>
<div class="dropdown">
<minidenticon-svg onclick="toggleAccount();" id="userIcon" style="height: 40px;" username="{{User.email}}"></minidenticon-svg>
<div id="dropdownAccount" class="dropdown-account">
<div class="user-name">
<h1>{{User.name}}</h1>
<h2>{{User.email}}</h2>
</div>
<a href="/user/settings">Настройки профиля <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="none" viewBox="0 0 18 18">
<g clip-path="url(#a)">
<path fill="#000" fill-opacity=".85" d="M8.15 17.992h1.7c.647 0 1.143-.396 1.295-1.019l.362-1.573.269-.093 1.37.842c.547.345 1.178.26 1.64-.202l1.178-1.17c.463-.463.547-1.102.202-1.64l-.858-1.364.101-.253 1.573-.37A1.301 1.301 0 0 0 18 9.854V8.188c0-.64-.395-1.145-1.018-1.296l-1.556-.379-.11-.269.859-1.363c.345-.539.26-1.17-.202-1.641l-1.178-1.178c-.454-.455-1.085-.539-1.631-.202l-1.371.841-.286-.11-.362-1.573C10.993.396 10.497 0 9.85 0h-1.7c-.647 0-1.143.396-1.295 1.018l-.37 1.574-.286.11-1.363-.842c-.546-.337-1.186-.253-1.64.202L2.027 3.24c-.463.471-.555 1.102-.202 1.64l.85 1.364-.101.27-1.556.378A1.293 1.293 0 0 0 0 8.188v1.666a1.3 1.3 0 0 0 1.018 1.296l1.573.37.092.253-.85 1.363c-.353.539-.26 1.178.203 1.641l1.169 1.17c.462.463 1.102.547 1.648.202l1.363-.842.269.093.37 1.573c.152.623.648 1.019 1.295 1.019Zm.135-1.313c-.143 0-.219-.06-.244-.194l-.505-2.087a4.748 4.748 0 0 1-1.354-.555L4.35 14.97c-.101.076-.21.06-.312-.042l-.992-.993c-.093-.092-.101-.193-.034-.31l1.127-1.819a6.132 6.132 0 0 1-.546-1.346l-2.086-.496c-.135-.026-.194-.101-.194-.245V8.314c0-.151.05-.219.194-.244l2.077-.505c.135-.547.387-1.043.538-1.355L3.003 4.393c-.076-.127-.067-.227.025-.328l1.001-.977c.1-.1.193-.117.32-.042L6.165 4.15a6.821 6.821 0 0 1 1.38-.556l.496-2.087c.025-.134.101-.193.244-.193h1.43c.143 0 .219.059.235.193l.514 2.104c.521.135.975.345 1.354.547l1.825-1.11c.135-.076.219-.06.328.041l.992.977c.102.1.102.201.026.328L13.87 6.21c.16.312.404.808.538 1.355l2.086.505c.135.025.194.093.194.244V9.72c0 .144-.067.22-.194.245l-2.094.496a5.75 5.75 0 0 1-.547 1.346l1.127 1.818c.068.118.068.219-.033.311l-.984.993c-.11.101-.21.118-.32.042l-1.834-1.127a4.69 4.69 0 0 1-1.345.555l-.514 2.087c-.016.135-.092.194-.235.194h-1.43ZM9 12.21c1.758 0 3.205-1.447 3.205-3.214 0-1.75-1.447-3.198-3.205-3.198S5.787 7.245 5.787 8.996A3.23 3.23 0 0 0 9 12.21Zm0-1.304a1.91 1.91 0 0 1-1.9-1.91c0-1.035.857-1.894 1.9-1.894 1.026 0 1.884.859 1.884 1.894 0 1.043-.858 1.91-1.884 1.91Z"/>
</g>
<defs>
<clipPath id="a">
<path fill="#fff" d="M0 0h18v18H0z"/>
</clipPath>
</defs>
</svg>
</a>
<a href="/projects">Смотреть проекты
<svg xmlns="http://www.w3.org/2000/svg" style="width: 16px !important; height: 16px !important;" width="16" height="16" fill="none" viewBox="0 0 16 16">
<g clip-path="url(#a)">
<path fill="#000" fill-opacity=".85" d="M1.973 11.72a.917.917 0 0 0-.911-.925c-.494 0-.895.42-.895.925a.901.901 0 1 0 1.805 0Zm0 3.355c0-.505-.401-.933-.911-.933-.494 0-.895.428-.895.933 0 .514.401.925.895.925.51 0 .91-.41.91-.925Zm13.726-3.355c0-.377-.3-.66-.71-.66H3.736c-.41 0-.71.283-.71.66 0 .376.3.667.71.667h11.252c.41 0 .71-.29.71-.667Zm0 3.355c0-.376-.3-.659-.71-.659H3.736c-.41 0-.71.283-.71.66 0 .376.3.667.71.667h11.252c.41 0 .71-.29.71-.668ZM2.316.205C.61.205 0 .967 0 2.628v3.98C0 8.27.61 9.033 2.316 9.033h11.368C15.39 9.032 16 8.27 16 6.609v-3.98C16 .966 15.39.204 13.684.204H2.316Zm-.97 6.447V2.585c0-.762.242-1.095.978-1.095h11.352c.736 0 .978.333.978 1.095v4.067c0 .762-.242 1.095-.978 1.095H2.324c-.736 0-.978-.333-.978-1.095Z"/>
</g>
<defs>
<clipPath id="a">
<path fill="#fff" d="M0 0h16v16H0z"/>
</clipPath>
</defs>
</svg>
</a>
<div class="line"></div>
<div class="theme-selector">
<span>Тема</span>
<div class="theme-switcher">
<button id="light-theme-btn" class="theme-btn" onclick="setTheme('light')">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<path d="M12.493 10.7193C8.11132 10.7193 5.39164 8.09866 5.39164 3.89146C5.39164 2.69166 5.59046 1.63394 5.88469 1.06561C6.00397 0.836704 6.02785 0.726195 6.02785 0.568327C6.02785 0.307844 5.7813 0 5.4473 0C5.38369 0 5.23262 0.0236803 5.00995 0.110508C2.0676 1.29453 0 4.37297 0 7.68821C0 12.4795 3.50696 15.9684 8.33398 15.9684C11.7933 15.9684 14.6004 14.1687 15.8887 11.2166C15.9841 11.0113 16 10.8377 16 10.7509C16 10.4272 15.7217 10.2062 15.4752 10.2062C15.3479 10.2062 15.2525 10.2141 15.0616 10.2851C14.4175 10.5456 13.4473 10.7193 12.493 10.7193ZM1.24851 7.63296C1.24851 5.17809 2.53678 2.84164 4.59641 1.55501C4.34196 2.2891 4.20675 3.10212 4.20675 4.00196C4.20675 8.93537 7.23658 11.8717 12.3101 11.8717C13.1292 11.8717 13.8211 11.777 14.4811 11.5481C13.2724 13.5294 10.9424 14.7371 8.3817 14.7371C4.25447 14.7371 1.24851 11.7533 1.24851 7.63296Z" fill="black" fill-opacity="0.85"/>
</svg>
</button>
<button id="dark-theme-btn" class="theme-btn" onclick="setTheme('dark')">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<g clip-path="url(#clip0_228_36)">
<path d="M8.0037 2.86688C8.35137 2.86688 8.63985 2.57946 8.63985 2.2257V0.641179C8.63985 0.287425 8.35137 0 8.0037 0C7.64863 0 7.36015 0.287425 7.36015 0.641179V2.2257C7.36015 2.57946 7.64863 2.86688 8.0037 2.86688ZM11.6283 4.37772C11.8798 4.62091 12.2867 4.62828 12.5381 4.37772L13.6699 3.25012C13.914 3.00691 13.914 2.5942 13.6699 2.34362C13.4258 2.10042 13.019 2.10042 12.7675 2.34362L11.6283 3.47857C11.3842 3.72915 11.3842 4.13451 11.6283 4.37772ZM13.1299 7.99633C13.1299 8.3427 13.4258 8.63014 13.7735 8.63014H15.3638C15.7115 8.63014 16 8.3427 16 7.99633C16 7.64994 15.7115 7.35513 15.3638 7.35513H13.7735C13.4258 7.35513 13.1299 7.64994 13.1299 7.99633ZM11.6283 11.6149C11.3842 11.8655 11.3842 12.2708 11.6283 12.5141L12.7675 13.6564C13.019 13.8922 13.4258 13.8849 13.6699 13.649C13.914 13.3985 13.914 12.9931 13.6699 12.7499L12.5307 11.6149C12.2867 11.3791 11.8798 11.3791 11.6283 11.6149ZM8.0037 13.1257C7.64863 13.1257 7.36015 13.4132 7.36015 13.7596V15.3515C7.36015 15.6979 7.64863 15.9853 8.0037 15.9853C8.35137 15.9853 8.63985 15.6979 8.63985 15.3515V13.7596C8.63985 13.4132 8.35137 13.1257 8.0037 13.1257ZM4.3717 11.6149C4.12019 11.3791 3.70595 11.3791 3.46187 11.6149L2.3301 12.7425C2.08599 12.9857 2.08599 13.3911 2.3227 13.6416C2.56681 13.8775 2.98105 13.8849 3.23253 13.649L4.36431 12.5141C4.60843 12.2708 4.60843 11.8655 4.3717 11.6149ZM2.87009 7.99633C2.87009 7.64994 2.5742 7.35513 2.22654 7.35513H0.636154C0.288488 7.35513 0 7.64994 0 7.99633C0 8.3427 0.288488 8.63014 0.636154 8.63014H2.22654C2.5742 8.63014 2.87009 8.3427 2.87009 7.99633ZM4.36431 4.37772C4.60843 4.14187 4.60843 3.72179 4.3717 3.47857L3.23996 2.34362C2.99584 2.10779 2.5816 2.10042 2.33749 2.34362C2.09339 2.5942 2.09339 3.00691 2.3301 3.24275L3.46187 4.37772C3.70595 4.62091 4.1128 4.62091 4.36431 4.37772Z" fill="black" fill-opacity="0.85"/>
<path d="M7.99611 11.755C10.0525 11.755 11.7613 10.0525 11.7613 7.99636C11.7613 5.93277 10.0525 4.23035 7.99611 4.23035C5.93971 4.23035 4.23096 5.93277 4.23096 7.99636C4.23096 10.0525 5.93971 11.755 7.99611 11.755ZM7.99611 10.6274C6.55368 10.6274 5.35534 9.43347 5.35534 7.99636C5.35534 6.55185 6.55368 5.35792 7.99611 5.35792C9.43854 5.35792 10.6369 6.55185 10.6369 7.99636C10.6369 9.43347 9.43854 10.6274 7.99611 10.6274Z" fill="black" fill-opacity="0.85"/>
</g>
<defs>
<clipPath id="clip0_228_36">
<rect width="16" height="16" fill="white"/>
</clipPath>
</defs>
</svg>
</button>
<button id="system-theme-btn" class="theme-btn" onclick="setTheme('system')">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<g clip-path="url(#clip0_228_46)">
<path d="M1.54362 13.2758H14.4497C15.4161 13.2758 16 12.6082 16 11.5031V2.30216C16 1.19712 15.4161 0.53717 14.4497 0.53717H1.54362C0.583892 0.53717 0 1.19712 0 2.30216V11.5031C0 12.6082 0.583892 13.2758 1.54362 13.2758ZM1.56376 12.0403C1.26846 12.0403 1.08054 11.8254 1.08054 11.4878V2.32518C1.08054 1.97986 1.26846 1.77266 1.56376 1.77266H14.4362C14.7316 1.77266 14.9195 1.97986 14.9195 2.32518V11.4878C14.9195 11.8254 14.7316 12.0403 14.4362 12.0403H1.56376ZM5.87919 15.1022H10.1208V13.176H5.87919V15.1022ZM5.83892 16H10.1611C10.4564 16 10.698 15.7237 10.698 15.3784C10.698 15.0331 10.4564 14.7568 10.1611 14.7568H5.83892C5.54362 14.7568 5.29531 15.0331 5.29531 15.3784C5.29531 15.7237 5.54362 16 5.83892 16Z" fill="black" fill-opacity="0.85"/>
</g>
<defs>
<clipPath id="clip0_228_46">
<rect width="16" height="16" fill="white"/>
</clipPath>
</defs>
</svg>
</button>
</div>
</div>
<div class="line"></div>
<a href="/" target="_blank">Главная страница
<svg data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="width: 20px; height: 20px;"><path d="M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6"></path><path d="M15 3h6v6"></path><path d="M10 14L21 3"></path></svg>
</a>
<a href="/logout">Выйти из аккаунта</a>
<div class="line"></div>
<button onclick="location.href='/'" class="button">Связаться с нами</button>
</div>
</div>
</div>
</nav>
</header>
<nav class="sections">
<a class="selected" href="/project/{{Name}}">Обзор</a>
<a href="/project/{{Name}}/progress">Прогресс</a>
<a href="/project/{{Name}}/documents">Документы</a>
<a href="/project/{{Name}}/payments">Оплата</a>
<a href="/project/{{Name}}/tests">Тесты</a>
</nav>
<section class="content-bg">
<div class="project-name-section">
<h1>Аналитика проекта</h1>
<h2>Здесь можно посмотреть прогресс разработки и детали проекта в реальном времени</h2>
</div>
<div class="project-content">
<div class="updates">
<div class="section-header">
<div class="icon">
<svg xmlns="http://www.w3.org/2000/svg" width="36" height="35" viewBox="0 0 36 35" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.60417 5.46874C5.60417 4.05926 6.74677 2.91666 8.15625 2.91666H27.8438C29.2532 2.91666 30.3958 4.05926 30.3958 5.46874V16.4062C30.3958 17.8157 29.2532 18.9583 27.8438 18.9583H8.15625C6.74677 18.9583 5.60417 17.8157 5.60417 16.4062V5.46874ZM8.15625 5.10416C7.9549 5.10416 7.79167 5.26739 7.79167 5.46874V16.4062C7.79167 16.6076 7.9549 16.7708 8.15625 16.7708H27.8438C28.0451 16.7708 28.2083 16.6076 28.2083 16.4062V5.46874C28.2083 5.26739 28.0451 5.10416 27.8438 5.10416H8.15625Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M2.6875 22.9687C2.6875 21.5593 3.83011 20.4167 5.23958 20.4167H30.7604C32.1699 20.4167 33.3125 21.5593 33.3125 22.9687V28.8021C33.3125 30.2116 32.1699 31.3542 30.7604 31.3542H5.23958C3.83011 31.3542 2.6875 30.2116 2.6875 28.8021V22.9687ZM5.23958 22.6042C5.03823 22.6042 4.875 22.7674 4.875 22.9687V28.8021C4.875 29.0034 5.03823 29.1667 5.23958 29.1667H30.7604C30.9618 29.1667 31.125 29.0034 31.125 28.8021V22.9687C31.125 22.7674 30.9618 22.6042 30.7604 22.6042H5.23958Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M15.0833 25.8854C15.0833 25.2813 15.573 24.7917 16.1771 24.7917H25.6563C26.2603 24.7917 26.75 25.2813 26.75 25.8854C26.75 26.4895 26.2603 26.9792 25.6563 26.9792H16.1771C15.573 26.9792 15.0833 26.4895 15.0833 25.8854Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M9.25 25.8854C9.25 25.2813 9.73969 24.7917 10.3438 24.7917H11.0729C11.677 24.7917 12.1667 25.2813 12.1667 25.8854C12.1667 26.4895 11.677 26.9792 11.0729 26.9792H10.3438C9.73969 26.9792 9.25 26.4895 9.25 25.8854Z" fill="white"/>
</svg>
</div>
<div class="header-name">
<h1>История обновлений</h1>
<h2>последние 7 записей</h2>
</div>
</div>
<table>
<tbody>
{{#each Releases}}
<tr>
<td>
<div class="row-container">
<div class="row-content">
<h1>{{this.body}}</h1>
<h2>{{this.published_at}}</h2>
<span>нет приложений</span>
</div>
</div>
</td>
</tr>
{{/each}}
</tbody>
</table>
</div>
<div class="small">
<div class="project-info">
<a href="http://{{Project.domain}}" target="_blank">
<img id="page-preview" src="{{API_SERVER}}/{{Project.preview}}">
</a>
<div class="info-sections">
<div id="info-version" class="info-section large">
<h1>Версия</h1>
<h2>{{Releases.[0].tag_name}}</h2>
</div>
<div id="info-domain" class="info-section large">
<h1>Домен</h1>
<a id="projectDomainLink" href="http://{{Project.domain}}" target="_blank">
<span id="projectDomainSpan">{{Project.domain}}</span>
<svg xmlns="http://www.w3.org/2000/svg" width="17" height="16" viewBox="0 0 17 16" fill="none">
<path d="M12.9209 8.66667V12.6667C12.9209 13.0203 12.7804 13.3594 12.5304 13.6095C12.2803 13.8595 11.9412 14 11.5876 14H4.25423C3.90061 14 3.56147 13.8595 3.31142 13.6095C3.06137 13.3594 2.9209 13.0203 2.9209 12.6667V5.33333C2.9209 4.97971 3.06137 4.64057 3.31142 4.39052C3.56147 4.14048 3.90061 4 4.25423 4H8.25423" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M10.9209 2H14.9209V6" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M7.5874 9.33333L14.9207 2" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</a>
</div>
<div class="info-section small">
<h1>Статус</h1>
<h2 class="work-status" data-status="stable">Работает</h2>
</div>
<div class="info-section small">
<h1>Обновлено</h1>
<h2>{{Releases.[0].published_at}} / {{Releases.[0].author.full_name}} <img src="{{Releases.[0].author.avatar_url}}"></h2>
</div>
<div class="info-section large">
<h1>Источник</h1>
<h2>
<svg xmlns="http://www.w3.org/2000/svg" width="17" height="16" viewBox="0 0 17 16" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.6709 2.5C12.2567 2.5 11.9209 2.83579 11.9209 3.25C11.9209 3.66421 12.2567 4 12.6709 4C13.0851 4 13.4209 3.66421 13.4209 3.25C13.4209 2.83579 13.0851 2.5 12.6709 2.5ZM10.4209 3.25C10.4209 2.00736 11.4283 1 12.6709 1C13.9135 1 14.9209 2.00736 14.9209 3.25C14.9209 4.22966 14.2948 5.06309 13.4209 5.37197V6C13.4209 7.38071 12.3016 8.5 10.9209 8.5H6.9209C6.36862 8.5 5.9209 8.94772 5.9209 9.5V10.628C6.79479 10.9369 7.4209 11.7703 7.4209 12.75C7.4209 13.9926 6.41354 15 5.1709 15C3.92826 15 2.9209 13.9926 2.9209 12.75C2.9209 11.7703 3.54701 10.9369 4.4209 10.628V9.5V5.37197C3.54701 5.06309 2.9209 4.22966 2.9209 3.25C2.9209 2.00736 3.92826 1 5.1709 1C6.41354 1 7.4209 2.00736 7.4209 3.25C7.4209 4.22966 6.79479 5.06309 5.9209 5.37197V7.20802C6.22713 7.07422 6.56535 7 6.9209 7H10.9209C11.4732 7 11.9209 6.55228 11.9209 6V5.37197C11.047 5.06309 10.4209 4.22966 10.4209 3.25ZM5.1709 12C4.75669 12 4.4209 12.3358 4.4209 12.75C4.4209 13.1642 4.75669 13.5 5.1709 13.5C5.58511 13.5 5.9209 13.1642 5.9209 12.75C5.9209 12.3358 5.58511 12 5.1709 12ZM4.4209 3.25C4.4209 2.83579 4.75669 2.5 5.1709 2.5C5.58511 2.5 5.9209 2.83579 5.9209 3.25C5.9209 3.66421 5.58511 4 5.1709 4C4.75669 4 4.4209 3.66421 4.4209 3.25Z" fill="#1F2328"/>
</svg>
{{Releases.[0].target_commitish}}
</h2>
</div>
</div>
</div>
<div class="project-payments">
<div class="section-header">
<div class="icon">
<svg xmlns="http://www.w3.org/2000/svg" width="28" height="35" viewBox="0 0 28 35" fill="none">
<g clip-path="url(#clip0_68_211)">
<path d="M0.891602 19.2161C0.891602 19.8531 1.43584 20.3663 2.11144 20.3663H5.99616V31.3014C5.99616 32.2392 6.78437 33 7.77901 33C8.77364 33 9.58061 32.2392 9.58061 31.3014V20.3663H16.4868C22.9801 20.3663 27.1087 16.2966 27.1087 10.6166C27.1087 4.95446 23.0176 0.831665 16.5243 0.831665H7.77901C6.69054 0.831665 5.99616 1.52175 5.99616 2.58341V18.066H2.11144C1.43584 18.066 0.891602 18.5792 0.891602 19.2161ZM9.58061 17.429V3.83971H15.6423C20.8031 3.83971 23.4305 6.45848 23.4305 10.6166C23.4305 14.7926 20.7656 17.429 15.6423 17.429H9.58061ZM0.891602 26.0638C0.891602 26.7008 1.43584 27.2317 2.11144 27.2317H18.7012C19.3769 27.2317 19.9211 26.7008 19.9211 26.0638C19.9211 25.4445 19.3769 24.9137 18.7012 24.9137H2.11144C1.43584 24.9137 0.891602 25.4445 0.891602 26.0638Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_68_211">
<rect width="26.2171" height="35" fill="white" transform="translate(0.891602)"/>
</clipPath>
</defs>
</svg>
</div>
<div class="header-name">
<h1>Оплата проекта</h1>
<h2>последние 3 транзакции</h2>
</div>
</div>
<div class="project-payments-content">
<table id="paymentsTable">
<tbody>
</tbody>
</table>
<circle-progress text-format='percent' value="{{Project.procent}}" max="100"></circle-progress>
</div>
</div>
<div class="project-documents">
<div class="section-header">
<div class="icon">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="31" viewBox="0 0 24 31" fill="none">
<g clip-path="url(#clip0_68_294)">
<path d="M4.57345 30.486H19.4266C22.3217 30.486 23.7623 29.0175 23.7623 26.1083V13.4091H13.6364C11.8462 13.4091 10.993 12.5559 10.993 10.7657V0.5H4.57345C1.69234 0.5 0.237793 1.98252 0.237793 4.89161V26.1083C0.237793 29.0315 1.67835 30.486 4.57345 30.486ZM13.6783 11.493H23.5944C23.5105 10.9196 23.1049 10.3601 22.4336 9.6748L14.7273 1.82867C14.0699 1.15734 13.4965 0.751748 12.9091 0.653846V10.7378C12.9091 11.2413 13.1609 11.493 13.6783 11.493Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_68_294">
<rect width="23.5245" height="30" fill="white" transform="translate(0.237793 0.5)"/>
</clipPath>
</defs>
</svg>
</div>
<div class="header-name">
<h1>Документы проекта</h1>
<h2>последние 3 файла</h2>
</div>
</div>
<table id="documentsTable">
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</section>
<script>
document.addEventListener("DOMContentLoaded", function() {
document.getElementById("project-{{Project.id}}").classList.add("selected");
});
</script>
<script>
function toggleProjects() {
if ($('#dropdownProjects').hasClass('is-visible')) {
event.preventDefault();
$('#dropdownProjects').removeClass('is-visible');
setTimeout(function() {
$("#dropdownProjects").css("display", "none");
}, 200);
} else {
event.preventDefault();
$("#dropdownProjects").css("display", "inline-flex");
$('#dropdownProjects').addClass('is-visible');
}
}
$(document).on('click', function(event) {
if ($(event.target).closest('#headerProjects').length) {
return;
} else {
if (!$(event.target).closest('.dropdown-projects').length) {
$('#dropdownProjects').removeClass('is-visible');
setTimeout(function() {
$("#dropdownProjects").css("display", "none");
}, 200);
}
}
});
$(document).ready(function() {
$(document).keydown(function(e) {
if (e.key === "Escape" || e.key === "Esc") {
console.log("Escape")
$('#dropdownProjects').removeClass('is-visible');
setTimeout(function() {
$("#dropdownProjects").css("display", "none");
}, 200);
}
});
});
</script>
</body>
</html>

View File

@@ -0,0 +1,331 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Тесты</title>
<link rel="icon" type="image/x-icon" href="../../img/favicon.png">
<link href="https://fonts.googleapis.com/css?family=Montserrat" rel="stylesheet">
<link rel="stylesheet" href="../../styles/main.css">
<script src="../../scripts/jquery.min.js"></script>
<script>
const API_SERVER = "{{API_SERVER}}";
</script>
<script type="module">
import { minidenticonSvg } from 'https://cdn.jsdelivr.net/npm/minidenticons@4.2.0/minidenticons.min.js'
</script>
<script src="../../scripts/projects.js"></script>
</head>
<body>
<header class="lk-header">
<div class="header-logo">
<a href="/projects"><img src="../../img/krbl.svg">{{#if Project.maraku}} X <img onclick="window.open('https://maraku.ru/', '_blank')" src="../../img/maraku.svg">{{/if}}</a>
<span class="slash">/</span>
<span>{{Project.displayname}}</span>
<div class="dropdown">
<button id="headerProjects" type="button" onclick="toggleProjects();">
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="18" viewBox="0 0 13 18" fill="none">
<path d="M6.93296 0.392929C6.70015 0.392929 6.49422 0.48226 6.31514 0.660923L1.20253 5.55627C1.06822 5.69026 0.969727 5.87786 0.969727 6.13691C0.969727 6.60146 1.31892 6.95876 1.78452 6.95876C1.9815 6.95876 2.1964 6.9052 2.38442 6.7176L6.93296 2.27782L11.4725 6.7176C11.6695 6.89623 11.8754 6.95876 12.0724 6.95876C12.538 6.95876 12.8872 6.60146 12.8872 6.13691C12.8872 5.87786 12.7977 5.69026 12.6544 5.55627L7.5418 0.660923C7.36271 0.48226 7.15679 0.392929 6.93296 0.392929ZM6.93296 17.5981C7.15679 17.5981 7.36271 17.4999 7.5418 17.3302L12.6544 12.4348C12.7977 12.2918 12.8872 12.1132 12.8872 11.8452C12.8872 11.3807 12.538 11.0323 12.0724 11.0323C11.8754 11.0323 11.6695 11.0948 11.4725 11.2735L6.93296 15.7132L2.38442 11.2735C2.1964 11.0859 1.9815 11.0323 1.78452 11.0323C1.31892 11.0323 0.969727 11.3807 0.969727 11.8452C0.969727 12.1132 1.06822 12.2918 1.20253 12.4348L6.31514 17.3302C6.49422 17.4999 6.70015 17.5981 6.93296 17.5981Z" fill="black" fill-opacity="0.6"/>
</svg>
</button>
<div id="dropdownProjects" class="dropdown-projects">
<input type="text" placeholder="Найти проект...">
<h1>Проекты</h1>
{{#each Projects}}
<div onclick="location.href='/project/{{this.name}}'" id="project-{{this.id}}" class="project"> {{#if this.avatar}} <div class="avatar-container"><img src="{{../API_SERVER}}/{{this.avatar}}"></div>{{/if}} {{this.displayname}}
<svg class="checkmark" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 20 20">
<g clip-path="url(#a)">
<path fill="#000" fill-opacity=".6" d="M7.388 20c.487 0 .873-.215 1.145-.635L19.24 2.505c.204-.33.283-.579.283-.84 0-.623-.408-1.03-1.031-1.03-.453 0-.703.147-.975.577L7.343 17.428l-5.28-6.912c-.284-.397-.567-.556-.975-.556C.442 9.96 0 10.402 0 11.025c0 .261.113.556.329.828l5.88 7.49c.34.442.692.657 1.18.657Z"/>
</g>
<defs>
<clipPath id="a">
<path fill="#fff" d="M0 0h19.524v20H0z"/>
</clipPath>
</defs>
</svg>
</div>
{{/each}}
</div>
</div>
</div>
<nav>
<a onclick="alert('Этот раздел в разработке.');">Новости</a>
<a onclick="alert('Этот раздел в разработке.');">Помощь</a>
<div class="user">
<svg class="user-svg ring" width="20" height="22" viewBox="0 0 20 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 16.8241C0 17.5978 0.593536 18.1066 1.60042 18.1066H6.07316C6.15794 20.1522 7.75836 21.9434 9.99473 21.9434C12.2416 21.9434 13.8421 20.1627 13.9269 18.1066H18.3996C19.3959 18.1066 20 17.5978 20 16.8241C20 15.7642 18.9189 14.8103 18.0074 13.867C17.3079 13.1357 17.1171 11.6307 17.0323 10.4118C16.9581 6.23586 15.8771 3.54376 13.0578 2.52627C12.6974 1.13782 11.5633 0.0461426 9.99473 0.0461426C8.43668 0.0461426 7.29201 1.13782 6.94224 2.52627C4.12295 3.54376 3.04187 6.23586 2.96768 10.4118C2.88288 11.6307 2.69211 13.1357 1.99258 13.867C1.07048 14.8103 0 15.7642 0 16.8241ZM2.05618 16.5061V16.379C2.24695 16.0716 2.88288 15.4462 3.43403 14.8315C4.19714 13.9836 4.55748 12.6164 4.6529 10.5496C4.73769 5.9179 6.11553 4.44465 7.92793 3.94652C8.19292 3.88292 8.3413 3.75574 8.3519 3.48017C8.38367 2.37789 9.01963 1.60417 9.99473 1.60417C10.9804 1.60417 11.6057 2.37789 11.6481 3.48017C11.6587 3.75574 11.7965 3.88292 12.0615 3.94652C13.8845 4.44465 15.2623 5.9179 15.3471 10.5496C15.4425 12.6164 15.8029 13.9836 16.5554 14.8315C17.1171 15.4462 17.7424 16.0716 17.9332 16.379V16.5061H2.05618ZM7.72658 18.1066H12.2735C12.1887 19.548 11.2772 20.4489 9.99473 20.4489C8.72286 20.4489 7.80077 19.548 7.72658 18.1066Z" fill="black" fill-opacity="0.85"/>
</svg>
<div class="dropdown">
<minidenticon-svg onclick="toggleAccount();" id="userIcon" style="height: 40px;" username="{{User.email}}"></minidenticon-svg>
<div id="dropdownAccount" class="dropdown-account">
<div class="user-name">
<h1>{{User.name}}</h1>
<h2>{{User.email}}</h2>
</div>
<a href="/user/settings">Настройки профиля <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="none" viewBox="0 0 18 18">
<g clip-path="url(#a)">
<path fill="#000" fill-opacity=".85" d="M8.15 17.992h1.7c.647 0 1.143-.396 1.295-1.019l.362-1.573.269-.093 1.37.842c.547.345 1.178.26 1.64-.202l1.178-1.17c.463-.463.547-1.102.202-1.64l-.858-1.364.101-.253 1.573-.37A1.301 1.301 0 0 0 18 9.854V8.188c0-.64-.395-1.145-1.018-1.296l-1.556-.379-.11-.269.859-1.363c.345-.539.26-1.17-.202-1.641l-1.178-1.178c-.454-.455-1.085-.539-1.631-.202l-1.371.841-.286-.11-.362-1.573C10.993.396 10.497 0 9.85 0h-1.7c-.647 0-1.143.396-1.295 1.018l-.37 1.574-.286.11-1.363-.842c-.546-.337-1.186-.253-1.64.202L2.027 3.24c-.463.471-.555 1.102-.202 1.64l.85 1.364-.101.27-1.556.378A1.293 1.293 0 0 0 0 8.188v1.666a1.3 1.3 0 0 0 1.018 1.296l1.573.37.092.253-.85 1.363c-.353.539-.26 1.178.203 1.641l1.169 1.17c.462.463 1.102.547 1.648.202l1.363-.842.269.093.37 1.573c.152.623.648 1.019 1.295 1.019Zm.135-1.313c-.143 0-.219-.06-.244-.194l-.505-2.087a4.748 4.748 0 0 1-1.354-.555L4.35 14.97c-.101.076-.21.06-.312-.042l-.992-.993c-.093-.092-.101-.193-.034-.31l1.127-1.819a6.132 6.132 0 0 1-.546-1.346l-2.086-.496c-.135-.026-.194-.101-.194-.245V8.314c0-.151.05-.219.194-.244l2.077-.505c.135-.547.387-1.043.538-1.355L3.003 4.393c-.076-.127-.067-.227.025-.328l1.001-.977c.1-.1.193-.117.32-.042L6.165 4.15a6.821 6.821 0 0 1 1.38-.556l.496-2.087c.025-.134.101-.193.244-.193h1.43c.143 0 .219.059.235.193l.514 2.104c.521.135.975.345 1.354.547l1.825-1.11c.135-.076.219-.06.328.041l.992.977c.102.1.102.201.026.328L13.87 6.21c.16.312.404.808.538 1.355l2.086.505c.135.025.194.093.194.244V9.72c0 .144-.067.22-.194.245l-2.094.496a5.75 5.75 0 0 1-.547 1.346l1.127 1.818c.068.118.068.219-.033.311l-.984.993c-.11.101-.21.118-.32.042l-1.834-1.127a4.69 4.69 0 0 1-1.345.555l-.514 2.087c-.016.135-.092.194-.235.194h-1.43ZM9 12.21c1.758 0 3.205-1.447 3.205-3.214 0-1.75-1.447-3.198-3.205-3.198S5.787 7.245 5.787 8.996A3.23 3.23 0 0 0 9 12.21Zm0-1.304a1.91 1.91 0 0 1-1.9-1.91c0-1.035.857-1.894 1.9-1.894 1.026 0 1.884.859 1.884 1.894 0 1.043-.858 1.91-1.884 1.91Z"/>
</g>
<defs>
<clipPath id="a">
<path fill="#fff" d="M0 0h18v18H0z"/>
</clipPath>
</defs>
</svg>
</a>
<a href="/projects">Смотреть проекты
<svg xmlns="http://www.w3.org/2000/svg" style="width: 16px !important; height: 16px !important;" width="16" height="16" fill="none" viewBox="0 0 16 16">
<g clip-path="url(#a)">
<path fill="#000" fill-opacity=".85" d="M1.973 11.72a.917.917 0 0 0-.911-.925c-.494 0-.895.42-.895.925a.901.901 0 1 0 1.805 0Zm0 3.355c0-.505-.401-.933-.911-.933-.494 0-.895.428-.895.933 0 .514.401.925.895.925.51 0 .91-.41.91-.925Zm13.726-3.355c0-.377-.3-.66-.71-.66H3.736c-.41 0-.71.283-.71.66 0 .376.3.667.71.667h11.252c.41 0 .71-.29.71-.667Zm0 3.355c0-.376-.3-.659-.71-.659H3.736c-.41 0-.71.283-.71.66 0 .376.3.667.71.667h11.252c.41 0 .71-.29.71-.668ZM2.316.205C.61.205 0 .967 0 2.628v3.98C0 8.27.61 9.033 2.316 9.033h11.368C15.39 9.032 16 8.27 16 6.609v-3.98C16 .966 15.39.204 13.684.204H2.316Zm-.97 6.447V2.585c0-.762.242-1.095.978-1.095h11.352c.736 0 .978.333.978 1.095v4.067c0 .762-.242 1.095-.978 1.095H2.324c-.736 0-.978-.333-.978-1.095Z"/>
</g>
<defs>
<clipPath id="a">
<path fill="#fff" d="M0 0h16v16H0z"/>
</clipPath>
</defs>
</svg>
</a>
<div class="line"></div>
<div class="theme-selector">
<span>Тема</span>
<div class="theme-switcher">
<button id="light-theme-btn" class="theme-btn" onclick="setTheme('light')">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<path d="M12.493 10.7193C8.11132 10.7193 5.39164 8.09866 5.39164 3.89146C5.39164 2.69166 5.59046 1.63394 5.88469 1.06561C6.00397 0.836704 6.02785 0.726195 6.02785 0.568327C6.02785 0.307844 5.7813 0 5.4473 0C5.38369 0 5.23262 0.0236803 5.00995 0.110508C2.0676 1.29453 0 4.37297 0 7.68821C0 12.4795 3.50696 15.9684 8.33398 15.9684C11.7933 15.9684 14.6004 14.1687 15.8887 11.2166C15.9841 11.0113 16 10.8377 16 10.7509C16 10.4272 15.7217 10.2062 15.4752 10.2062C15.3479 10.2062 15.2525 10.2141 15.0616 10.2851C14.4175 10.5456 13.4473 10.7193 12.493 10.7193ZM1.24851 7.63296C1.24851 5.17809 2.53678 2.84164 4.59641 1.55501C4.34196 2.2891 4.20675 3.10212 4.20675 4.00196C4.20675 8.93537 7.23658 11.8717 12.3101 11.8717C13.1292 11.8717 13.8211 11.777 14.4811 11.5481C13.2724 13.5294 10.9424 14.7371 8.3817 14.7371C4.25447 14.7371 1.24851 11.7533 1.24851 7.63296Z" fill="black" fill-opacity="0.85"/>
</svg>
</button>
<button id="dark-theme-btn" class="theme-btn" onclick="setTheme('dark')">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<g clip-path="url(#clip0_228_36)">
<path d="M8.0037 2.86688C8.35137 2.86688 8.63985 2.57946 8.63985 2.2257V0.641179C8.63985 0.287425 8.35137 0 8.0037 0C7.64863 0 7.36015 0.287425 7.36015 0.641179V2.2257C7.36015 2.57946 7.64863 2.86688 8.0037 2.86688ZM11.6283 4.37772C11.8798 4.62091 12.2867 4.62828 12.5381 4.37772L13.6699 3.25012C13.914 3.00691 13.914 2.5942 13.6699 2.34362C13.4258 2.10042 13.019 2.10042 12.7675 2.34362L11.6283 3.47857C11.3842 3.72915 11.3842 4.13451 11.6283 4.37772ZM13.1299 7.99633C13.1299 8.3427 13.4258 8.63014 13.7735 8.63014H15.3638C15.7115 8.63014 16 8.3427 16 7.99633C16 7.64994 15.7115 7.35513 15.3638 7.35513H13.7735C13.4258 7.35513 13.1299 7.64994 13.1299 7.99633ZM11.6283 11.6149C11.3842 11.8655 11.3842 12.2708 11.6283 12.5141L12.7675 13.6564C13.019 13.8922 13.4258 13.8849 13.6699 13.649C13.914 13.3985 13.914 12.9931 13.6699 12.7499L12.5307 11.6149C12.2867 11.3791 11.8798 11.3791 11.6283 11.6149ZM8.0037 13.1257C7.64863 13.1257 7.36015 13.4132 7.36015 13.7596V15.3515C7.36015 15.6979 7.64863 15.9853 8.0037 15.9853C8.35137 15.9853 8.63985 15.6979 8.63985 15.3515V13.7596C8.63985 13.4132 8.35137 13.1257 8.0037 13.1257ZM4.3717 11.6149C4.12019 11.3791 3.70595 11.3791 3.46187 11.6149L2.3301 12.7425C2.08599 12.9857 2.08599 13.3911 2.3227 13.6416C2.56681 13.8775 2.98105 13.8849 3.23253 13.649L4.36431 12.5141C4.60843 12.2708 4.60843 11.8655 4.3717 11.6149ZM2.87009 7.99633C2.87009 7.64994 2.5742 7.35513 2.22654 7.35513H0.636154C0.288488 7.35513 0 7.64994 0 7.99633C0 8.3427 0.288488 8.63014 0.636154 8.63014H2.22654C2.5742 8.63014 2.87009 8.3427 2.87009 7.99633ZM4.36431 4.37772C4.60843 4.14187 4.60843 3.72179 4.3717 3.47857L3.23996 2.34362C2.99584 2.10779 2.5816 2.10042 2.33749 2.34362C2.09339 2.5942 2.09339 3.00691 2.3301 3.24275L3.46187 4.37772C3.70595 4.62091 4.1128 4.62091 4.36431 4.37772Z" fill="black" fill-opacity="0.85"/>
<path d="M7.99611 11.755C10.0525 11.755 11.7613 10.0525 11.7613 7.99636C11.7613 5.93277 10.0525 4.23035 7.99611 4.23035C5.93971 4.23035 4.23096 5.93277 4.23096 7.99636C4.23096 10.0525 5.93971 11.755 7.99611 11.755ZM7.99611 10.6274C6.55368 10.6274 5.35534 9.43347 5.35534 7.99636C5.35534 6.55185 6.55368 5.35792 7.99611 5.35792C9.43854 5.35792 10.6369 6.55185 10.6369 7.99636C10.6369 9.43347 9.43854 10.6274 7.99611 10.6274Z" fill="black" fill-opacity="0.85"/>
</g>
<defs>
<clipPath id="clip0_228_36">
<rect width="16" height="16" fill="white"/>
</clipPath>
</defs>
</svg>
</button>
<button id="system-theme-btn" class="theme-btn" onclick="setTheme('system')">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<g clip-path="url(#clip0_228_46)">
<path d="M1.54362 13.2758H14.4497C15.4161 13.2758 16 12.6082 16 11.5031V2.30216C16 1.19712 15.4161 0.53717 14.4497 0.53717H1.54362C0.583892 0.53717 0 1.19712 0 2.30216V11.5031C0 12.6082 0.583892 13.2758 1.54362 13.2758ZM1.56376 12.0403C1.26846 12.0403 1.08054 11.8254 1.08054 11.4878V2.32518C1.08054 1.97986 1.26846 1.77266 1.56376 1.77266H14.4362C14.7316 1.77266 14.9195 1.97986 14.9195 2.32518V11.4878C14.9195 11.8254 14.7316 12.0403 14.4362 12.0403H1.56376ZM5.87919 15.1022H10.1208V13.176H5.87919V15.1022ZM5.83892 16H10.1611C10.4564 16 10.698 15.7237 10.698 15.3784C10.698 15.0331 10.4564 14.7568 10.1611 14.7568H5.83892C5.54362 14.7568 5.29531 15.0331 5.29531 15.3784C5.29531 15.7237 5.54362 16 5.83892 16Z" fill="black" fill-opacity="0.85"/>
</g>
<defs>
<clipPath id="clip0_228_46">
<rect width="16" height="16" fill="white"/>
</clipPath>
</defs>
</svg>
</button>
</div>
</div>
<div class="line"></div>
<a href="/" target="_blank">Главная страница
<svg data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="width: 20px; height: 20px;"><path d="M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6"></path><path d="M15 3h6v6"></path><path d="M10 14L21 3"></path></svg>
</a>
<a href="/logout">Выйти из аккаунта</a>
<div class="line"></div>
<button onclick="location.href='/'" class="button">Связаться с нами</button>
</div>
</div>
</div>
</nav>
</header>
<nav class="sections">
<a href="/project/{{Name}}">Обзор</a>
<a href="/project/{{Name}}/progress">Прогресс</a>
<a href="/project/{{Name}}/documents">Документы</a>
<a href="/project/{{Name}}/payments">Оплата</a>
<a class="selected" href="/project/{{Name}}/tests">Тесты</a>
</nav>
<section class="content-bg">
<div class="progress-name-section">
<h1>Проведенные тесты</h1>
<h2>Здесь можно отслеживать тестирование проекта</h2>
</div>
<div class="progress-content" style="gap: 11px;">
<div class="table-search-section">
<input type="text" class="updates-search search-input" placeholder="Поиск...">
</div>
<div class="documents-table">
<span class="empty-span">нет доступных тестов</span>
</div>
</div>
</section>
<script>
document.addEventListener("DOMContentLoaded", function() {
document.getElementById("project-{{Project.id}}").classList.add("selected");
});
</script>
<script>
function toggleProjects() {
if ($('#dropdownProjects').hasClass('is-visible')) {
event.preventDefault();
$('#dropdownProjects').removeClass('is-visible');
setTimeout(function() {
$("#dropdownProjects").css("display", "none");
}, 200);
} else {
event.preventDefault();
$("#dropdownProjects").css("display", "inline-flex");
$('#dropdownProjects').addClass('is-visible');
}
}
$(document).on('click', function(event) {
if ($(event.target).closest('#headerProjects').length) {
return;
} else {
if (!$(event.target).closest('.dropdown-projects').length) {
$('#dropdownProjects').removeClass('is-visible');
setTimeout(function() {
$("#dropdownProjects").css("display", "none");
}, 200);
}
}
});
$(document).ready(function() {
$(document).keydown(function(e) {
if (e.key === "Escape" || e.key === "Esc") {
console.log("Escape")
$('#dropdownProjects').removeClass('is-visible');
setTimeout(function() {
$("#dropdownProjects").css("display", "none");
}, 200);
}
});
});
function closeForm() {
$('.form-popup-bg').removeClass('is-visible');
}
$(document).ready(function($) {
$('#uploadDocument').on('click', function(event) {
event.preventDefault();
$('#feedback-form-popup-bg').addClass('is-visible');
});
$('#feedback-form-popup-bg').on('click', function(event) {
if ($(event.target).is('#feedback-form-popup-bg') || $(event.target).is('#btnCloseForm')) {
event.preventDefault();
$(this).removeClass('is-visible');
}
});
});
document.querySelectorAll(".drop-zone__input").forEach((inputElement) => {
const dropZoneElement = inputElement.closest(".drop-zone");
const uploadNameElement = document.getElementById("upload-name");
const uploadTypeElement = document.getElementById("upload-type");
dropZoneElement.addEventListener("click", (e) => {
inputElement.click();
});
inputElement.addEventListener("change", (e) => {
if (inputElement.files.length) {
updateThumbnail(dropZoneElement, inputElement.files[0]);
if (!uploadNameElement.value) {
const fileNameWithoutExtension = inputElement.files[0].name.replace(/\.[^/.]+$/, "");
const fileExtension = inputElement.files[0].name.split('.').pop();
uploadNameElement.value = fileNameWithoutExtension;
uploadTypeElement.value = fileExtension;
}
const fileExtension = inputElement.files[0].name.split('.').pop();
uploadTypeElement.value = fileExtension;
}
});
dropZoneElement.addEventListener("dragover", (e) => {
e.preventDefault();
dropZoneElement.classList.add("drop-zone--over");
});
["dragleave", "dragend"].forEach((type) => {
dropZoneElement.addEventListener(type, (e) => {
dropZoneElement.classList.remove("drop-zone--over");
});
});
dropZoneElement.addEventListener("drop", (e) => {
e.preventDefault();
if (e.dataTransfer.files.length) {
inputElement.files = e.dataTransfer.files;
updateThumbnail(dropZoneElement, e.dataTransfer.files[0]);
if (!uploadNameElement.value) {
// Заполняем upload-name и upload-type, если upload-name пустой
const fileNameWithoutExtension = e.dataTransfer.files[0].name.replace(/\.[^/.]+$/, ""); // удаляем расширение файла
const fileExtension = e.dataTransfer.files[0].name.split('.').pop(); // получаем расширение файла
uploadNameElement.value = fileNameWithoutExtension;
uploadTypeElement.value = fileExtension;
}
}
dropZoneElement.classList.remove("drop-zone--over");
});
});
function updateThumbnail(dropZoneElement, file) {
let thumbnailElement = dropZoneElement.querySelector(".drop-zone__thumb");
if (dropZoneElement.querySelector(".drop-zone__prompt")) {
dropZoneElement.querySelector(".drop-zone__prompt").remove();
}
if (!thumbnailElement) {
thumbnailElement = document.createElement("div");
thumbnailElement.classList.add("drop-zone__thumb");
dropZoneElement.appendChild(thumbnailElement);
}
thumbnailElement.dataset.label = file.name;
if (file.type.startsWith("image/")) {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => {
thumbnailElement.style.backgroundImage = `url('${reader.result}')`;
};
} else {
thumbnailElement.style.backgroundImage = null;
}
}
</script>
</body>
</html>

View File

@@ -0,0 +1,221 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Проекты</title>
<link rel="icon" type="image/x-icon" href="../img/favicon.png">
<link href="https://fonts.googleapis.com/css?family=Montserrat" rel="stylesheet">
<link rel="stylesheet" href="../styles/main.css">
<script src="../scripts/jquery.min.js"></script>
<script>
const API_SERVER = "{{API_SERVER}}";
</script>
<script type="module">
import { minidenticonSvg } from 'https://cdn.jsdelivr.net/npm/minidenticons@4.2.0/minidenticons.min.js'
</script>
<script src="../scripts/projects.js"></script>
</head>
<body>
<header class="lk-header">
<div class="header-logo">
<a href="/projects"><img src="../img/krbl.svg"></a>
<span class="slash">/</span>
<span>Личный кабинет</span>
</div>
<nav>
<a onclick="alert('Этот раздел в разработке.');">Новости</a>
<a onclick="alert('Этот раздел в разработке.');">Помощь</a>
<div class="user">
<svg class="user-svg ring" width="20" height="22" viewBox="0 0 20 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 16.8241C0 17.5978 0.593536 18.1066 1.60042 18.1066H6.07316C6.15794 20.1522 7.75836 21.9434 9.99473 21.9434C12.2416 21.9434 13.8421 20.1627 13.9269 18.1066H18.3996C19.3959 18.1066 20 17.5978 20 16.8241C20 15.7642 18.9189 14.8103 18.0074 13.867C17.3079 13.1357 17.1171 11.6307 17.0323 10.4118C16.9581 6.23586 15.8771 3.54376 13.0578 2.52627C12.6974 1.13782 11.5633 0.0461426 9.99473 0.0461426C8.43668 0.0461426 7.29201 1.13782 6.94224 2.52627C4.12295 3.54376 3.04187 6.23586 2.96768 10.4118C2.88288 11.6307 2.69211 13.1357 1.99258 13.867C1.07048 14.8103 0 15.7642 0 16.8241ZM2.05618 16.5061V16.379C2.24695 16.0716 2.88288 15.4462 3.43403 14.8315C4.19714 13.9836 4.55748 12.6164 4.6529 10.5496C4.73769 5.9179 6.11553 4.44465 7.92793 3.94652C8.19292 3.88292 8.3413 3.75574 8.3519 3.48017C8.38367 2.37789 9.01963 1.60417 9.99473 1.60417C10.9804 1.60417 11.6057 2.37789 11.6481 3.48017C11.6587 3.75574 11.7965 3.88292 12.0615 3.94652C13.8845 4.44465 15.2623 5.9179 15.3471 10.5496C15.4425 12.6164 15.8029 13.9836 16.5554 14.8315C17.1171 15.4462 17.7424 16.0716 17.9332 16.379V16.5061H2.05618ZM7.72658 18.1066H12.2735C12.1887 19.548 11.2772 20.4489 9.99473 20.4489C8.72286 20.4489 7.80077 19.548 7.72658 18.1066Z" fill="black" fill-opacity="0.85"/>
</svg>
<div class="dropdown">
<minidenticon-svg onclick="toggleAccount();" id="userIcon" style="height: 40px;" username="{{User.email}}"></minidenticon-svg>
<div id="dropdownAccount" class="dropdown-account">
<div class="user-name">
<h1>{{User.name}}</h1>
<h2>{{User.email}}</h2>
</div>
<a href="/user/settings">Настройки профиля <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="none" viewBox="0 0 18 18">
<g clip-path="url(#a)">
<path fill="#000" fill-opacity=".85" d="M8.15 17.992h1.7c.647 0 1.143-.396 1.295-1.019l.362-1.573.269-.093 1.37.842c.547.345 1.178.26 1.64-.202l1.178-1.17c.463-.463.547-1.102.202-1.64l-.858-1.364.101-.253 1.573-.37A1.301 1.301 0 0 0 18 9.854V8.188c0-.64-.395-1.145-1.018-1.296l-1.556-.379-.11-.269.859-1.363c.345-.539.26-1.17-.202-1.641l-1.178-1.178c-.454-.455-1.085-.539-1.631-.202l-1.371.841-.286-.11-.362-1.573C10.993.396 10.497 0 9.85 0h-1.7c-.647 0-1.143.396-1.295 1.018l-.37 1.574-.286.11-1.363-.842c-.546-.337-1.186-.253-1.64.202L2.027 3.24c-.463.471-.555 1.102-.202 1.64l.85 1.364-.101.27-1.556.378A1.293 1.293 0 0 0 0 8.188v1.666a1.3 1.3 0 0 0 1.018 1.296l1.573.37.092.253-.85 1.363c-.353.539-.26 1.178.203 1.641l1.169 1.17c.462.463 1.102.547 1.648.202l1.363-.842.269.093.37 1.573c.152.623.648 1.019 1.295 1.019Zm.135-1.313c-.143 0-.219-.06-.244-.194l-.505-2.087a4.748 4.748 0 0 1-1.354-.555L4.35 14.97c-.101.076-.21.06-.312-.042l-.992-.993c-.093-.092-.101-.193-.034-.31l1.127-1.819a6.132 6.132 0 0 1-.546-1.346l-2.086-.496c-.135-.026-.194-.101-.194-.245V8.314c0-.151.05-.219.194-.244l2.077-.505c.135-.547.387-1.043.538-1.355L3.003 4.393c-.076-.127-.067-.227.025-.328l1.001-.977c.1-.1.193-.117.32-.042L6.165 4.15a6.821 6.821 0 0 1 1.38-.556l.496-2.087c.025-.134.101-.193.244-.193h1.43c.143 0 .219.059.235.193l.514 2.104c.521.135.975.345 1.354.547l1.825-1.11c.135-.076.219-.06.328.041l.992.977c.102.1.102.201.026.328L13.87 6.21c.16.312.404.808.538 1.355l2.086.505c.135.025.194.093.194.244V9.72c0 .144-.067.22-.194.245l-2.094.496a5.75 5.75 0 0 1-.547 1.346l1.127 1.818c.068.118.068.219-.033.311l-.984.993c-.11.101-.21.118-.32.042l-1.834-1.127a4.69 4.69 0 0 1-1.345.555l-.514 2.087c-.016.135-.092.194-.235.194h-1.43ZM9 12.21c1.758 0 3.205-1.447 3.205-3.214 0-1.75-1.447-3.198-3.205-3.198S5.787 7.245 5.787 8.996A3.23 3.23 0 0 0 9 12.21Zm0-1.304a1.91 1.91 0 0 1-1.9-1.91c0-1.035.857-1.894 1.9-1.894 1.026 0 1.884.859 1.884 1.894 0 1.043-.858 1.91-1.884 1.91Z"/>
</g>
<defs>
<clipPath id="a">
<path fill="#fff" d="M0 0h18v18H0z"/>
</clipPath>
</defs>
</svg>
</a>
<a href="/projects">Смотреть проекты
<svg xmlns="http://www.w3.org/2000/svg" style="width: 16px !important; height: 16px !important;" width="16" height="16" fill="none" viewBox="0 0 16 16">
<g clip-path="url(#a)">
<path fill="#000" fill-opacity=".85" d="M1.973 11.72a.917.917 0 0 0-.911-.925c-.494 0-.895.42-.895.925a.901.901 0 1 0 1.805 0Zm0 3.355c0-.505-.401-.933-.911-.933-.494 0-.895.428-.895.933 0 .514.401.925.895.925.51 0 .91-.41.91-.925Zm13.726-3.355c0-.377-.3-.66-.71-.66H3.736c-.41 0-.71.283-.71.66 0 .376.3.667.71.667h11.252c.41 0 .71-.29.71-.667Zm0 3.355c0-.376-.3-.659-.71-.659H3.736c-.41 0-.71.283-.71.66 0 .376.3.667.71.667h11.252c.41 0 .71-.29.71-.668ZM2.316.205C.61.205 0 .967 0 2.628v3.98C0 8.27.61 9.033 2.316 9.033h11.368C15.39 9.032 16 8.27 16 6.609v-3.98C16 .966 15.39.204 13.684.204H2.316Zm-.97 6.447V2.585c0-.762.242-1.095.978-1.095h11.352c.736 0 .978.333.978 1.095v4.067c0 .762-.242 1.095-.978 1.095H2.324c-.736 0-.978-.333-.978-1.095Z"/>
</g>
<defs>
<clipPath id="a">
<path fill="#fff" d="M0 0h16v16H0z"/>
</clipPath>
</defs>
</svg>
</a>
<div class="line"></div>
<div class="theme-selector">
<span>Тема</span>
<div class="theme-switcher">
<button id="light-theme-btn" class="theme-btn" onclick="setTheme('light')">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<path d="M12.493 10.7193C8.11132 10.7193 5.39164 8.09866 5.39164 3.89146C5.39164 2.69166 5.59046 1.63394 5.88469 1.06561C6.00397 0.836704 6.02785 0.726195 6.02785 0.568327C6.02785 0.307844 5.7813 0 5.4473 0C5.38369 0 5.23262 0.0236803 5.00995 0.110508C2.0676 1.29453 0 4.37297 0 7.68821C0 12.4795 3.50696 15.9684 8.33398 15.9684C11.7933 15.9684 14.6004 14.1687 15.8887 11.2166C15.9841 11.0113 16 10.8377 16 10.7509C16 10.4272 15.7217 10.2062 15.4752 10.2062C15.3479 10.2062 15.2525 10.2141 15.0616 10.2851C14.4175 10.5456 13.4473 10.7193 12.493 10.7193ZM1.24851 7.63296C1.24851 5.17809 2.53678 2.84164 4.59641 1.55501C4.34196 2.2891 4.20675 3.10212 4.20675 4.00196C4.20675 8.93537 7.23658 11.8717 12.3101 11.8717C13.1292 11.8717 13.8211 11.777 14.4811 11.5481C13.2724 13.5294 10.9424 14.7371 8.3817 14.7371C4.25447 14.7371 1.24851 11.7533 1.24851 7.63296Z" fill="black" fill-opacity="0.85"/>
</svg>
</button>
<button id="dark-theme-btn" class="theme-btn" onclick="setTheme('dark')">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<g clip-path="url(#clip0_228_36)">
<path d="M8.0037 2.86688C8.35137 2.86688 8.63985 2.57946 8.63985 2.2257V0.641179C8.63985 0.287425 8.35137 0 8.0037 0C7.64863 0 7.36015 0.287425 7.36015 0.641179V2.2257C7.36015 2.57946 7.64863 2.86688 8.0037 2.86688ZM11.6283 4.37772C11.8798 4.62091 12.2867 4.62828 12.5381 4.37772L13.6699 3.25012C13.914 3.00691 13.914 2.5942 13.6699 2.34362C13.4258 2.10042 13.019 2.10042 12.7675 2.34362L11.6283 3.47857C11.3842 3.72915 11.3842 4.13451 11.6283 4.37772ZM13.1299 7.99633C13.1299 8.3427 13.4258 8.63014 13.7735 8.63014H15.3638C15.7115 8.63014 16 8.3427 16 7.99633C16 7.64994 15.7115 7.35513 15.3638 7.35513H13.7735C13.4258 7.35513 13.1299 7.64994 13.1299 7.99633ZM11.6283 11.6149C11.3842 11.8655 11.3842 12.2708 11.6283 12.5141L12.7675 13.6564C13.019 13.8922 13.4258 13.8849 13.6699 13.649C13.914 13.3985 13.914 12.9931 13.6699 12.7499L12.5307 11.6149C12.2867 11.3791 11.8798 11.3791 11.6283 11.6149ZM8.0037 13.1257C7.64863 13.1257 7.36015 13.4132 7.36015 13.7596V15.3515C7.36015 15.6979 7.64863 15.9853 8.0037 15.9853C8.35137 15.9853 8.63985 15.6979 8.63985 15.3515V13.7596C8.63985 13.4132 8.35137 13.1257 8.0037 13.1257ZM4.3717 11.6149C4.12019 11.3791 3.70595 11.3791 3.46187 11.6149L2.3301 12.7425C2.08599 12.9857 2.08599 13.3911 2.3227 13.6416C2.56681 13.8775 2.98105 13.8849 3.23253 13.649L4.36431 12.5141C4.60843 12.2708 4.60843 11.8655 4.3717 11.6149ZM2.87009 7.99633C2.87009 7.64994 2.5742 7.35513 2.22654 7.35513H0.636154C0.288488 7.35513 0 7.64994 0 7.99633C0 8.3427 0.288488 8.63014 0.636154 8.63014H2.22654C2.5742 8.63014 2.87009 8.3427 2.87009 7.99633ZM4.36431 4.37772C4.60843 4.14187 4.60843 3.72179 4.3717 3.47857L3.23996 2.34362C2.99584 2.10779 2.5816 2.10042 2.33749 2.34362C2.09339 2.5942 2.09339 3.00691 2.3301 3.24275L3.46187 4.37772C3.70595 4.62091 4.1128 4.62091 4.36431 4.37772Z" fill="black" fill-opacity="0.85"/>
<path d="M7.99611 11.755C10.0525 11.755 11.7613 10.0525 11.7613 7.99636C11.7613 5.93277 10.0525 4.23035 7.99611 4.23035C5.93971 4.23035 4.23096 5.93277 4.23096 7.99636C4.23096 10.0525 5.93971 11.755 7.99611 11.755ZM7.99611 10.6274C6.55368 10.6274 5.35534 9.43347 5.35534 7.99636C5.35534 6.55185 6.55368 5.35792 7.99611 5.35792C9.43854 5.35792 10.6369 6.55185 10.6369 7.99636C10.6369 9.43347 9.43854 10.6274 7.99611 10.6274Z" fill="black" fill-opacity="0.85"/>
</g>
<defs>
<clipPath id="clip0_228_36">
<rect width="16" height="16" fill="white"/>
</clipPath>
</defs>
</svg>
</button>
<button id="system-theme-btn" class="theme-btn" onclick="setTheme('system')">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<g clip-path="url(#clip0_228_46)">
<path d="M1.54362 13.2758H14.4497C15.4161 13.2758 16 12.6082 16 11.5031V2.30216C16 1.19712 15.4161 0.53717 14.4497 0.53717H1.54362C0.583892 0.53717 0 1.19712 0 2.30216V11.5031C0 12.6082 0.583892 13.2758 1.54362 13.2758ZM1.56376 12.0403C1.26846 12.0403 1.08054 11.8254 1.08054 11.4878V2.32518C1.08054 1.97986 1.26846 1.77266 1.56376 1.77266H14.4362C14.7316 1.77266 14.9195 1.97986 14.9195 2.32518V11.4878C14.9195 11.8254 14.7316 12.0403 14.4362 12.0403H1.56376ZM5.87919 15.1022H10.1208V13.176H5.87919V15.1022ZM5.83892 16H10.1611C10.4564 16 10.698 15.7237 10.698 15.3784C10.698 15.0331 10.4564 14.7568 10.1611 14.7568H5.83892C5.54362 14.7568 5.29531 15.0331 5.29531 15.3784C5.29531 15.7237 5.54362 16 5.83892 16Z" fill="black" fill-opacity="0.85"/>
</g>
<defs>
<clipPath id="clip0_228_46">
<rect width="16" height="16" fill="white"/>
</clipPath>
</defs>
</svg>
</button>
</div>
</div>
<div class="line"></div>
<a href="/" target="_blank">Главная страница
<svg data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="width: 20px; height: 20px;"><path d="M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6"></path><path d="M15 3h6v6"></path><path d="M10 14L21 3"></path></svg>
</a>
<a href="/logout">Выйти из аккаунта</a>
<div class="line"></div>
<button onclick="location.href='/'" class="button">Связаться с нами</button>
</div>
</div>
</div>
</nav>
</header>
<nav class="sections">
<a class="selected" href="/projects">Проекты</a>
<a href="/user/settings">Настройки</a>
</nav>
<section class="content-bg">
<div class="account-content">
<input class="search-input" type="text" placeholder="Поиск...">
<div class="projects-list">
{{#each Projects}}
<div class="projects-project" id="project-{{this.id}}" onclick="redirectToURL(event, '/project/{{this.name}}')">
<div class="circle">
<svg height="16" stroke-linejoin="round" viewBox="0 0 16 16" width="16" style="color: white;"><path fill-rule="evenodd" clip-rule="evenodd" d="M11.5 9.75V11.25C11.5 11.3881 11.3881 11.5 11.25 11.5H4.75C4.61193 11.5 4.5 11.3881 4.5 11.25L4.5 4.75C4.5 4.61193 4.61193 4.5 4.75 4.5H6.25H7V3H6.25H4.75C3.7835 3 3 3.7835 3 4.75V11.25C3 12.2165 3.7835 13 4.75 13H11.25C12.2165 13 13 12.2165 13 11.25V9.75V9H11.5V9.75ZM8.5 3H9.25H12.2495C12.6637 3 12.9995 3.33579 12.9995 3.75V6.75V7.5H11.4995V6.75V5.56066L8.53033 8.52978L8 9.06011L6.93934 7.99945L7.46967 7.46912L10.4388 4.5H9.25H8.5V3Z" fill="white"></path></svg>
</div>
<div class="project-main-info">
{{#if this.avatar}}<div class="avatar-container"><img src="{{../API_SERVER}}/{{this.avatar}}"></div>{{/if}}
<div class="project-main-info-text">
<h1>{{this.displayname}}</h1>
<h2>{{this.domain}}</h2>
</div>
</div>
<div class="dropdown">
<button class="project-info-button" onclick="toggleDropdown('dropdownContent-{{this.id}}')" type="button">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M4 8C4 8.82843 3.32843 9.5 2.5 9.5C1.67157 9.5 1 8.82843 1 8C1 7.17157 1.67157 6.5 2.5 6.5C3.32843 6.5 4 7.17157 4 8ZM9.5 8C9.5 8.82843 8.82843 9.5 8 9.5C7.17157 9.5 6.5 8.82843 6.5 8C6.5 7.17157 7.17157 6.5 8 6.5C8.82843 6.5 9.5 7.17157 9.5 8ZM13.5 9.5C14.3284 9.5 15 8.82843 15 8C15 7.17157 14.3284 6.5 13.5 6.5C12.6716 6.5 12 7.17157 12 8C12 8.82843 12.6716 9.5 13.5 9.5Z" fill="black"/>
</svg>
</button>
<div id="dropdownContent-{{this.id}}" class="dropdown-content">
<a href="/project/{{this.name}}">Обзор</a>
<a href="/project/{{this.name}}/progress">Прогресс</a>
<a href="/project/{{this.name}}/documents">Документы</a>
<a href="/project/{{this.name}}/payments">Оплата</a>
</div>
</div>
<div class="project-last-update">
<h1>Скоро тут будет последнее обновление</h1>
<h2>точно-точно</h2>
</div>
</div>
{{/each}}
</div>
</div>
</section>
<script>
function toggleDropdown(dropdownId) {
$('.dropdown-content').not('#' + dropdownId).removeClass('is-visible');
setTimeout(function () {
$('.dropdown-content').not('#' + dropdownId).css('display', 'none');
}, 200);
const dropdownContent = $('#' + dropdownId);
if (dropdownContent.hasClass('is-visible')) {
event.preventDefault();
dropdownContent.removeClass('is-visible');
setTimeout(function () {
dropdownContent.css("display", "none");
}, 200);
} else {
event.preventDefault();
dropdownContent.css("display", "inline-flex");
dropdownContent.addClass('is-visible');
}
}
$(document).on('click', function (event) {
if ($(event.target).closest('.project-info-button').length) {
return;
} else {
if (!$(event.target).closest('.dropdown-content').length) {
$('.dropdown-content').removeClass('is-visible');
setTimeout(function () {
$(".dropdown-content").css("display", "none");
}, 200);
}
}
});
function redirectToURL(event, url) {
const targetElement = event.target;
if (!targetElement.closest('.dropdown')) {
window.location.href = url;
}
}
</script>
</body>
</html>

View File

@@ -0,0 +1,228 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Проекты</title>
<link rel="icon" type="image/x-icon" href="../img/favicon.png">
<link href="https://fonts.googleapis.com/css?family=Montserrat" rel="stylesheet">
<link rel="stylesheet" href="../styles/main.css">
<script src="../scripts/jquery.min.js"></script>
<script>
const API_SERVER = "{{API_SERVER}}";
</script>
<script type="module">
import { minidenticonSvg } from 'https://cdn.jsdelivr.net/npm/minidenticons@4.2.0/minidenticons.min.js'
</script>
<script src="../scripts/projects.js"></script>
</head>
<body>
<header class="lk-header">
<div class="header-logo">
<a href="/projects"><img src="../img/krbl.svg"></a>
<span class="slash">/</span>
<span>Личный кабинет</span>
</div>
<nav>
<a onclick="alert('Этот раздел в разработке.');">Новости</a>
<a onclick="alert('Этот раздел в разработке.');">Помощь</a>
<div class="user">
<svg class="user-svg ring" width="20" height="22" viewBox="0 0 20 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 16.8241C0 17.5978 0.593536 18.1066 1.60042 18.1066H6.07316C6.15794 20.1522 7.75836 21.9434 9.99473 21.9434C12.2416 21.9434 13.8421 20.1627 13.9269 18.1066H18.3996C19.3959 18.1066 20 17.5978 20 16.8241C20 15.7642 18.9189 14.8103 18.0074 13.867C17.3079 13.1357 17.1171 11.6307 17.0323 10.4118C16.9581 6.23586 15.8771 3.54376 13.0578 2.52627C12.6974 1.13782 11.5633 0.0461426 9.99473 0.0461426C8.43668 0.0461426 7.29201 1.13782 6.94224 2.52627C4.12295 3.54376 3.04187 6.23586 2.96768 10.4118C2.88288 11.6307 2.69211 13.1357 1.99258 13.867C1.07048 14.8103 0 15.7642 0 16.8241ZM2.05618 16.5061V16.379C2.24695 16.0716 2.88288 15.4462 3.43403 14.8315C4.19714 13.9836 4.55748 12.6164 4.6529 10.5496C4.73769 5.9179 6.11553 4.44465 7.92793 3.94652C8.19292 3.88292 8.3413 3.75574 8.3519 3.48017C8.38367 2.37789 9.01963 1.60417 9.99473 1.60417C10.9804 1.60417 11.6057 2.37789 11.6481 3.48017C11.6587 3.75574 11.7965 3.88292 12.0615 3.94652C13.8845 4.44465 15.2623 5.9179 15.3471 10.5496C15.4425 12.6164 15.8029 13.9836 16.5554 14.8315C17.1171 15.4462 17.7424 16.0716 17.9332 16.379V16.5061H2.05618ZM7.72658 18.1066H12.2735C12.1887 19.548 11.2772 20.4489 9.99473 20.4489C8.72286 20.4489 7.80077 19.548 7.72658 18.1066Z" fill="black" fill-opacity="0.85"/>
</svg>
<div class="dropdown">
<minidenticon-svg onclick="toggleAccount();" id="userIcon" style="height: 40px;" username="{{User.email}}"></minidenticon-svg>
<div id="dropdownAccount" class="dropdown-account">
<div class="user-name">
<h1>{{User.name}}</h1>
<h2>{{User.email}}</h2>
</div>
<a href="/user/settings">Настройки профиля <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="none" viewBox="0 0 18 18">
<g clip-path="url(#a)">
<path fill="#000" fill-opacity=".85" d="M8.15 17.992h1.7c.647 0 1.143-.396 1.295-1.019l.362-1.573.269-.093 1.37.842c.547.345 1.178.26 1.64-.202l1.178-1.17c.463-.463.547-1.102.202-1.64l-.858-1.364.101-.253 1.573-.37A1.301 1.301 0 0 0 18 9.854V8.188c0-.64-.395-1.145-1.018-1.296l-1.556-.379-.11-.269.859-1.363c.345-.539.26-1.17-.202-1.641l-1.178-1.178c-.454-.455-1.085-.539-1.631-.202l-1.371.841-.286-.11-.362-1.573C10.993.396 10.497 0 9.85 0h-1.7c-.647 0-1.143.396-1.295 1.018l-.37 1.574-.286.11-1.363-.842c-.546-.337-1.186-.253-1.64.202L2.027 3.24c-.463.471-.555 1.102-.202 1.64l.85 1.364-.101.27-1.556.378A1.293 1.293 0 0 0 0 8.188v1.666a1.3 1.3 0 0 0 1.018 1.296l1.573.37.092.253-.85 1.363c-.353.539-.26 1.178.203 1.641l1.169 1.17c.462.463 1.102.547 1.648.202l1.363-.842.269.093.37 1.573c.152.623.648 1.019 1.295 1.019Zm.135-1.313c-.143 0-.219-.06-.244-.194l-.505-2.087a4.748 4.748 0 0 1-1.354-.555L4.35 14.97c-.101.076-.21.06-.312-.042l-.992-.993c-.093-.092-.101-.193-.034-.31l1.127-1.819a6.132 6.132 0 0 1-.546-1.346l-2.086-.496c-.135-.026-.194-.101-.194-.245V8.314c0-.151.05-.219.194-.244l2.077-.505c.135-.547.387-1.043.538-1.355L3.003 4.393c-.076-.127-.067-.227.025-.328l1.001-.977c.1-.1.193-.117.32-.042L6.165 4.15a6.821 6.821 0 0 1 1.38-.556l.496-2.087c.025-.134.101-.193.244-.193h1.43c.143 0 .219.059.235.193l.514 2.104c.521.135.975.345 1.354.547l1.825-1.11c.135-.076.219-.06.328.041l.992.977c.102.1.102.201.026.328L13.87 6.21c.16.312.404.808.538 1.355l2.086.505c.135.025.194.093.194.244V9.72c0 .144-.067.22-.194.245l-2.094.496a5.75 5.75 0 0 1-.547 1.346l1.127 1.818c.068.118.068.219-.033.311l-.984.993c-.11.101-.21.118-.32.042l-1.834-1.127a4.69 4.69 0 0 1-1.345.555l-.514 2.087c-.016.135-.092.194-.235.194h-1.43ZM9 12.21c1.758 0 3.205-1.447 3.205-3.214 0-1.75-1.447-3.198-3.205-3.198S5.787 7.245 5.787 8.996A3.23 3.23 0 0 0 9 12.21Zm0-1.304a1.91 1.91 0 0 1-1.9-1.91c0-1.035.857-1.894 1.9-1.894 1.026 0 1.884.859 1.884 1.894 0 1.043-.858 1.91-1.884 1.91Z"/>
</g>
<defs>
<clipPath id="a">
<path fill="#fff" d="M0 0h18v18H0z"/>
</clipPath>
</defs>
</svg>
</a>
<a href="/projects">Смотреть проекты
<svg xmlns="http://www.w3.org/2000/svg" style="width: 16px !important; height: 16px !important;" width="16" height="16" fill="none" viewBox="0 0 16 16">
<g clip-path="url(#a)">
<path fill="#000" fill-opacity=".85" d="M1.973 11.72a.917.917 0 0 0-.911-.925c-.494 0-.895.42-.895.925a.901.901 0 1 0 1.805 0Zm0 3.355c0-.505-.401-.933-.911-.933-.494 0-.895.428-.895.933 0 .514.401.925.895.925.51 0 .91-.41.91-.925Zm13.726-3.355c0-.377-.3-.66-.71-.66H3.736c-.41 0-.71.283-.71.66 0 .376.3.667.71.667h11.252c.41 0 .71-.29.71-.667Zm0 3.355c0-.376-.3-.659-.71-.659H3.736c-.41 0-.71.283-.71.66 0 .376.3.667.71.667h11.252c.41 0 .71-.29.71-.668ZM2.316.205C.61.205 0 .967 0 2.628v3.98C0 8.27.61 9.033 2.316 9.033h11.368C15.39 9.032 16 8.27 16 6.609v-3.98C16 .966 15.39.204 13.684.204H2.316Zm-.97 6.447V2.585c0-.762.242-1.095.978-1.095h11.352c.736 0 .978.333.978 1.095v4.067c0 .762-.242 1.095-.978 1.095H2.324c-.736 0-.978-.333-.978-1.095Z"/>
</g>
<defs>
<clipPath id="a">
<path fill="#fff" d="M0 0h16v16H0z"/>
</clipPath>
</defs>
</svg>
</a>
<div class="line"></div>
<div class="theme-selector">
<span>Тема</span>
<div class="theme-switcher">
<button id="light-theme-btn" class="theme-btn" onclick="setTheme('light')">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<path d="M12.493 10.7193C8.11132 10.7193 5.39164 8.09866 5.39164 3.89146C5.39164 2.69166 5.59046 1.63394 5.88469 1.06561C6.00397 0.836704 6.02785 0.726195 6.02785 0.568327C6.02785 0.307844 5.7813 0 5.4473 0C5.38369 0 5.23262 0.0236803 5.00995 0.110508C2.0676 1.29453 0 4.37297 0 7.68821C0 12.4795 3.50696 15.9684 8.33398 15.9684C11.7933 15.9684 14.6004 14.1687 15.8887 11.2166C15.9841 11.0113 16 10.8377 16 10.7509C16 10.4272 15.7217 10.2062 15.4752 10.2062C15.3479 10.2062 15.2525 10.2141 15.0616 10.2851C14.4175 10.5456 13.4473 10.7193 12.493 10.7193ZM1.24851 7.63296C1.24851 5.17809 2.53678 2.84164 4.59641 1.55501C4.34196 2.2891 4.20675 3.10212 4.20675 4.00196C4.20675 8.93537 7.23658 11.8717 12.3101 11.8717C13.1292 11.8717 13.8211 11.777 14.4811 11.5481C13.2724 13.5294 10.9424 14.7371 8.3817 14.7371C4.25447 14.7371 1.24851 11.7533 1.24851 7.63296Z" fill="black" fill-opacity="0.85"/>
</svg>
</button>
<button id="dark-theme-btn" class="theme-btn" onclick="setTheme('dark')">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<g clip-path="url(#clip0_228_36)">
<path d="M8.0037 2.86688C8.35137 2.86688 8.63985 2.57946 8.63985 2.2257V0.641179C8.63985 0.287425 8.35137 0 8.0037 0C7.64863 0 7.36015 0.287425 7.36015 0.641179V2.2257C7.36015 2.57946 7.64863 2.86688 8.0037 2.86688ZM11.6283 4.37772C11.8798 4.62091 12.2867 4.62828 12.5381 4.37772L13.6699 3.25012C13.914 3.00691 13.914 2.5942 13.6699 2.34362C13.4258 2.10042 13.019 2.10042 12.7675 2.34362L11.6283 3.47857C11.3842 3.72915 11.3842 4.13451 11.6283 4.37772ZM13.1299 7.99633C13.1299 8.3427 13.4258 8.63014 13.7735 8.63014H15.3638C15.7115 8.63014 16 8.3427 16 7.99633C16 7.64994 15.7115 7.35513 15.3638 7.35513H13.7735C13.4258 7.35513 13.1299 7.64994 13.1299 7.99633ZM11.6283 11.6149C11.3842 11.8655 11.3842 12.2708 11.6283 12.5141L12.7675 13.6564C13.019 13.8922 13.4258 13.8849 13.6699 13.649C13.914 13.3985 13.914 12.9931 13.6699 12.7499L12.5307 11.6149C12.2867 11.3791 11.8798 11.3791 11.6283 11.6149ZM8.0037 13.1257C7.64863 13.1257 7.36015 13.4132 7.36015 13.7596V15.3515C7.36015 15.6979 7.64863 15.9853 8.0037 15.9853C8.35137 15.9853 8.63985 15.6979 8.63985 15.3515V13.7596C8.63985 13.4132 8.35137 13.1257 8.0037 13.1257ZM4.3717 11.6149C4.12019 11.3791 3.70595 11.3791 3.46187 11.6149L2.3301 12.7425C2.08599 12.9857 2.08599 13.3911 2.3227 13.6416C2.56681 13.8775 2.98105 13.8849 3.23253 13.649L4.36431 12.5141C4.60843 12.2708 4.60843 11.8655 4.3717 11.6149ZM2.87009 7.99633C2.87009 7.64994 2.5742 7.35513 2.22654 7.35513H0.636154C0.288488 7.35513 0 7.64994 0 7.99633C0 8.3427 0.288488 8.63014 0.636154 8.63014H2.22654C2.5742 8.63014 2.87009 8.3427 2.87009 7.99633ZM4.36431 4.37772C4.60843 4.14187 4.60843 3.72179 4.3717 3.47857L3.23996 2.34362C2.99584 2.10779 2.5816 2.10042 2.33749 2.34362C2.09339 2.5942 2.09339 3.00691 2.3301 3.24275L3.46187 4.37772C3.70595 4.62091 4.1128 4.62091 4.36431 4.37772Z" fill="black" fill-opacity="0.85"/>
<path d="M7.99611 11.755C10.0525 11.755 11.7613 10.0525 11.7613 7.99636C11.7613 5.93277 10.0525 4.23035 7.99611 4.23035C5.93971 4.23035 4.23096 5.93277 4.23096 7.99636C4.23096 10.0525 5.93971 11.755 7.99611 11.755ZM7.99611 10.6274C6.55368 10.6274 5.35534 9.43347 5.35534 7.99636C5.35534 6.55185 6.55368 5.35792 7.99611 5.35792C9.43854 5.35792 10.6369 6.55185 10.6369 7.99636C10.6369 9.43347 9.43854 10.6274 7.99611 10.6274Z" fill="black" fill-opacity="0.85"/>
</g>
<defs>
<clipPath id="clip0_228_36">
<rect width="16" height="16" fill="white"/>
</clipPath>
</defs>
</svg>
</button>
<button id="system-theme-btn" class="theme-btn" onclick="setTheme('system')">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<g clip-path="url(#clip0_228_46)">
<path d="M1.54362 13.2758H14.4497C15.4161 13.2758 16 12.6082 16 11.5031V2.30216C16 1.19712 15.4161 0.53717 14.4497 0.53717H1.54362C0.583892 0.53717 0 1.19712 0 2.30216V11.5031C0 12.6082 0.583892 13.2758 1.54362 13.2758ZM1.56376 12.0403C1.26846 12.0403 1.08054 11.8254 1.08054 11.4878V2.32518C1.08054 1.97986 1.26846 1.77266 1.56376 1.77266H14.4362C14.7316 1.77266 14.9195 1.97986 14.9195 2.32518V11.4878C14.9195 11.8254 14.7316 12.0403 14.4362 12.0403H1.56376ZM5.87919 15.1022H10.1208V13.176H5.87919V15.1022ZM5.83892 16H10.1611C10.4564 16 10.698 15.7237 10.698 15.3784C10.698 15.0331 10.4564 14.7568 10.1611 14.7568H5.83892C5.54362 14.7568 5.29531 15.0331 5.29531 15.3784C5.29531 15.7237 5.54362 16 5.83892 16Z" fill="black" fill-opacity="0.85"/>
</g>
<defs>
<clipPath id="clip0_228_46">
<rect width="16" height="16" fill="white"/>
</clipPath>
</defs>
</svg>
</button>
</div>
</div>
<div class="line"></div>
<a href="/" target="_blank">Главная страница
<svg data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="width: 20px; height: 20px;"><path d="M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6"></path><path d="M15 3h6v6"></path><path d="M10 14L21 3"></path></svg>
</a>
<a href="/logout">Выйти из аккаунта</a>
<div class="line"></div>
<button class="button">Связаться с нами</button>
</div>
</div>
</div>
</nav>
</header>
<nav class="sections">
<a href="/projects">Проекты</a>
<a class="selected" href="/user/settings">Настройки</a>
</nav>
<section class="content-bg">
<div class="project-name-section">
<h1>Настройки профиля</h1>
</div>
<div class="account-content">
<div class="setting-section">
<div class="setting-top">
<h1>Отображаемое Имя</h1>
<h2>Пожалуйста, укажите своё полное имя.</h2>
<input id="name-input" type="text" value="{{User.name}}" required>
</div>
<div class="setting-bottom">
<h2>Используйте максимум 20 символов.</h2>
<button type="button">Сохранить</button>
</div>
</div>
<div class="setting-section">
<div class="setting-top">
<h1>Электронная почта</h1>
<h2>Пожалуйста, укажите почту для авторизации.</h2>
<input id="email-input" type="text" value="{{User.email}}" required>
</div>
<div class="setting-bottom">
<h2>Используйте только свою актуальную почту.</h2>
<button type="button">Сохранить</button>
</div>
</div>
<div class="setting-section">
<div class="setting-top">
<h1>Номер телефона</h1>
<h2>Пожалуйста, укажите свой номер телефона.</h2>
<input id="phone-input" type="text" value="{{User.phone}}" required>
</div>
<div class="setting-bottom">
<h2>Необязательно, но определенно рекомендовано.</h2>
<button type="button">Сохранить</button>
</div>
</div>
</div>
</section>
<script src="https://rawgit.com/RobinHerbots/Inputmask/5.x/dist/jquery.inputmask.js"></script>
<script>
$(document).ready(function(){
$('#phone-input').inputmask({"mask": "+7 (999) 999-9999"});
});
</script>
<script>
function toggleDropdown() {
if ($('#dropdownContent').hasClass('is-visible')) {
event.preventDefault();
$('#dropdownContent').removeClass('is-visible');
setTimeout(function() {
$("#dropdownContent").css("display", "none");
}, 200);
} else {
event.preventDefault();
$("#dropdownContent").css("display", "inline-flex");
$('#dropdownContent').addClass('is-visible');
}
}
$(document).on('click', function(event) {
if ($(event.target).closest('.project-info-button').length) {
return;
} else {
if (!$(event.target).closest('.dropdown-content').length) {
$('#dropdownContent').removeClass('is-visible');
setTimeout(function() {
$("#dropdownContent").css("display", "none");
}, 200);
}
}
});
function redirectToURL(event, url) {
const targetElement = event.target;
if (!targetElement.closest('.dropdown')) {
window.location.href = url;
}
}
</script>
</body>
</html>

View File

@@ -0,0 +1,27 @@
<!doctype html>
<html lang="ru">
<head>
<meta charSet="utf-8" />
<meta name='viewport' content='width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, shrink-to-fit=no, viewport-fit=cover'>
<meta http-equiv='X-UA-Compatible' content='ie=edge'>
<style>
html,
body {
background: #eee;
}
</style>
<script src="https://yastatic.net/s3/passport-sdk/autofill/v1/sdk-suggest-token-with-polyfills-latest.js"></script>
</head>
<body>
<script>
window.onload = function() {
window.YaSendSuggestToken("{{SITE_DOMAIN}}", {
"kek": true,
});
};
</script>
</body>
</html>