@opengis/fastify-table 2.6.0 → 2.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +86 -86
- package/dist/functions.js +20 -20
- package/dist/helper.d.ts +1 -20
- package/dist/helper.d.ts.map +1 -1
- package/dist/module/core/cls/constraint_action.json +9 -9
- package/dist/module/core/cls/constraint_matchtype.json +5 -5
- package/dist/module/core/cls/constraint_type_full.json +17 -17
- package/dist/module/core/cls/core.user_type.json +13 -13
- package/dist/module/core/pt/schemaItem.pt.hbs +17 -17
- package/dist/module/core/select/core.user_mentioned.sql +1 -1
- package/dist/script/adduser +14 -14
- package/dist/script/dump.js +48 -48
- package/dist/script/dump.ts +216 -216
- package/dist/script/migrate.ts +23 -23
- package/dist/server/helpers/core/badge.js +1 -1
- package/dist/server/helpers/list/descriptionList.js +8 -8
- package/dist/server/helpers/list/tableList.js +4 -4
- package/dist/server/helpers/list/utils/button.js +1 -1
- package/dist/server/helpers/list/utils/buttonDel.js +3 -3
- package/dist/server/helpers/list/utils/buttonEdit.js +3 -3
- package/dist/server/helpers/utils/button.js +1 -1
- package/dist/server/helpers/utils/buttonAdd.js +15 -15
- package/dist/server/helpers/utils/buttonDel.js +11 -11
- package/dist/server/helpers/utils/buttonEdit.js +3 -3
- package/dist/server/migrations/0.sql +99 -99
- package/dist/server/migrations/1_users.sql +145 -145
- package/dist/server/migrations/cls.sql +105 -105
- package/dist/server/migrations/context.sql +136 -136
- package/dist/server/migrations/dictionaries.sql +78 -78
- package/dist/server/migrations/oauth.sql +79 -79
- package/dist/server/migrations/properties.sql +115 -115
- package/dist/server/migrations/roles.sql +201 -200
- package/dist/server/migrations/template.sql +43 -43
- package/dist/server/plugins/access/funcs/getUserPermissions.js +7 -7
- package/dist/server/plugins/auth/funcs/authorizeUser.js +4 -4
- package/dist/server/plugins/auth/funcs/getQuery.js +20 -20
- package/dist/server/plugins/crud/funcs/dataUpdate.js +7 -7
- package/dist/server/plugins/crud/funcs/getAccess.js +14 -14
- package/dist/server/plugins/crud/funcs/utils/getInsertQuery.js +6 -6
- package/dist/server/plugins/crud/funcs/utils/logChanges.js +18 -18
- package/dist/server/plugins/grpc/utils/convertp.proto +143 -143
- package/dist/server/plugins/grpc/utils/htmlTemplate.js +10 -10
- package/dist/server/plugins/grpc/utils/office2pdf.proto +13 -13
- package/dist/server/plugins/metric/loggerSystem.js +1 -1
- package/dist/server/plugins/pg/funcs/autoIndex.js +5 -5
- package/dist/server/plugins/pg/funcs/getMeta.js +15 -15
- package/dist/server/plugins/pg/funcs/init.js +36 -36
- package/dist/server/plugins/sqlite/funcs/init.js +22 -22
- package/dist/server/plugins/table/funcs/getData.js +13 -13
- package/dist/server/plugins/table/funcs/getFilterSQL/util/getCustomQuery.js +1 -1
- package/dist/server/plugins/table/funcs/getSelect.js +1 -1
- package/dist/server/plugins/table/funcs/gisIRColumn.js +3 -3
- package/dist/server/plugins/usercls/index.js +2 -2
- package/dist/server/routes/access/controllers/access.group.js +6 -6
- package/dist/server/routes/access/controllers/access.group.post.js +3 -3
- package/dist/server/routes/access/controllers/access.interface.js +14 -14
- package/dist/server/routes/access/controllers/access.user.js +6 -6
- package/dist/server/routes/access/schema.js +2 -2
- package/dist/server/routes/auth/controllers/2factor/providers/totp.js +5 -5
- package/dist/server/routes/auth/controllers/2factor/qrcode.js +1 -1
- package/dist/server/routes/auth/controllers/2factor/recovery.js +1 -1
- package/dist/server/routes/auth/controllers/2factor/verify.js +1 -1
- package/dist/server/routes/auth/controllers/core/getUserInfo.js +33 -33
- package/dist/server/routes/auth/controllers/core/passwordRecovery.js +1 -1
- package/dist/server/routes/auth/controllers/core/registration.js +2 -2
- package/dist/server/routes/auth/controllers/page/login2faTemplate.js +1 -1
- package/dist/server/routes/crud/functions/deleteTableRelation.js +9 -9
- package/dist/server/routes/crud/functions/updateTableRelation.js +9 -9
- package/dist/server/routes/file/controllers/resizeAll.js +7 -7
- package/dist/server/routes/grpc/controllers/file2geojson.js +13 -13
- package/dist/server/routes/menu/controllers/getMenu.js +9 -9
- package/dist/server/routes/notifications/controllers/readNotifications.js +4 -4
- package/dist/server/routes/notifications/controllers/userNotifications.js +3 -3
- package/dist/server/routes/table/controllers/card.js +1 -1
- package/dist/server/routes/table/controllers/filter.js +6 -6
- package/dist/server/routes/table/controllers/form.js +1 -1
- package/dist/server/routes/table/controllers/getFormByTable.js +6 -6
- package/dist/server/routes/table/controllers/suggest.js +10 -10
- package/dist/server/routes/table/controllers/tableData.js +2 -2
- package/dist/server/routes/table/controllers/tableInfo.js +10 -10
- package/dist/server/routes/table/functions/getData.js +13 -13
- package/dist/server/routes/widget/controllers/widget.get.js +33 -33
- package/dist/server/routes/widget/controllers/widget.set.js +4 -4
- package/dist/server/routes/widget/services/widget.entity.get.js +33 -33
- package/dist/server/routes/widget/services/widget.entity.set.js +4 -4
- package/dist/server/templates/page/2factor-recovery.html +101 -101
- package/dist/server/templates/page/2factor.html +140 -140
- package/dist/server/templates/page/login.html +90 -90
- package/dist/server/templates/pt/recovery-codes-email-template.hbs +12 -12
- package/dist/server/templates/pt/recovery-password-email-template.html +20 -20
- package/package.json +99 -99
- package/dist/module/core/select/core.user_mentioned.json +0 -3
|
@@ -1,141 +1,141 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="en" dir="" class="relative min-h-full">
|
|
3
|
-
<head>
|
|
4
|
-
<!-- scripts -->
|
|
5
|
-
<script src="https://cdn.tailwindcss.com"></script>
|
|
6
|
-
</head>
|
|
7
|
-
<body class="bg-white dark:bg-neutral-900">
|
|
8
|
-
<main class="flex min-h-full">
|
|
9
|
-
|
|
10
|
-
<!-- Content -->
|
|
11
|
-
<div class="grow px-5">
|
|
12
|
-
<div class="h-full min-h-screen sm:w-[448px] flex flex-col justify-center mx-auto space-y-5">
|
|
13
|
-
{{#if enabled}}
|
|
14
|
-
<a href="/2factor?recovery=1" class="py-2.5 px-3 w-full inline-flex justify-center items-center gap-x-2 text-sm font-medium rounded-lg border border-gray-200 bg-white text-gray-800 shadow-sm hover:bg-gray-50 disabled:opacity-50 disabled:pointer-events-none focus:outline-none focus:bg-gray-50 dark:bg-neutral-800 dark:border-neutral-700 dark:text-neutral-300 dark:hover:bg-neutral-700 dark:focus:bg-neutral-700">
|
|
15
|
-
<svg class="flex-shrink-0 size-4" width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
16
|
-
<path d="M27.2192 10.9088C27.0336 11.0528 23.7568 12.8992 23.7568 17.0048C23.7568 21.7536 27.9264 23.4336 28.0512 23.4752C28.032 23.5776 27.3888 25.776 25.8528 28.016C24.4832 29.9872 23.0528 31.9552 20.8768 31.9552C18.7008 31.9552 18.1408 30.6912 15.6288 30.6912C13.1808 30.6912 12.3104 31.9968 10.32 31.9968C8.3296 31.9968 6.9408 30.1728 5.344 27.9328C3.4944 25.3024 2 21.216 2 17.3376C2 11.1168 6.0448 7.8176 10.0256 7.8176C12.1408 7.8176 13.904 9.2064 15.232 9.2064C16.496 9.2064 18.4672 7.7344 20.8736 7.7344C21.7856 7.7344 25.0624 7.8176 27.2192 10.9088ZM19.7312 5.1008C20.7264 3.92 21.4304 2.2816 21.4304 0.6432C21.4304 0.416 21.4112 0.1856 21.3696 0C19.7504 0.0608 17.824 1.0784 16.6624 2.4256C15.7504 3.4624 14.8992 5.1008 14.8992 6.7616C14.8992 7.0112 14.9408 7.2608 14.96 7.3408C15.0624 7.36 15.2288 7.3824 15.3952 7.3824C16.848 7.3824 18.6752 6.4096 19.7312 5.1008Z" class="fill-black dark:fill-neutral-200" fill="currentColor"/>
|
|
17
|
-
</svg>
|
|
18
|
-
I lost access to my 2factor app
|
|
19
|
-
</a>
|
|
20
|
-
{{/if}}
|
|
21
|
-
<ul>
|
|
22
|
-
<!-- Step -->
|
|
23
|
-
<li class="relative ps-12 pb-10 last:pb-0 before:content-[counter(step)] before:absolute before:start-0 before:flex before:items-center before:justify-center before:size-7 before:text-xs before:font-semibold before:text-gray-800 before:rounded-full before:bg-gray-100 dark:before:bg-neutral-700 dark:before:text-neutral-200 last:after:hidden after:absolute after:top-9 after:bottom-2 after:start-3.5 after:w-px after:-translate-x-[0.5px] after:bg-gray-200 dark:after:bg-neutral-700" style="counter-increment: step 1;">
|
|
24
|
-
<span class="block font-semibold text-sm text-gray-800 dark:text-neutral-200">
|
|
25
|
-
Download app
|
|
26
|
-
</span>
|
|
27
|
-
<a target="_blank" href="{{coalesce url 'https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&pcampaignid=web_share'}}" class="text-[13px] text-gray-500 dark:text-neutral-500">
|
|
28
|
-
Download a mobile authentication app.
|
|
29
|
-
</a>
|
|
30
|
-
</li>
|
|
31
|
-
<!-- End Step -->
|
|
32
|
-
|
|
33
|
-
{{#if qrCode}}
|
|
34
|
-
{{#unless enabled}}
|
|
35
|
-
<!-- Step -->
|
|
36
|
-
<li class="relative ps-12 pb-10 last:pb-0 before:content-[counter(step)] before:absolute before:start-0 before:flex before:items-center before:justify-center before:size-7 before:text-xs before:font-semibold before:text-gray-800 before:rounded-full before:bg-gray-100 dark:before:bg-neutral-700 dark:before:text-neutral-200 last:after:hidden after:absolute after:top-9 after:bottom-2 after:start-3.5 after:w-px after:-translate-x-[0.5px] after:bg-gray-200 dark:after:bg-neutral-700" style="counter-increment: step 1;">
|
|
37
|
-
<span class="block font-semibold text-sm text-gray-800 dark:text-neutral-200">
|
|
38
|
-
Scan QR Code
|
|
39
|
-
</span>
|
|
40
|
-
<p class="text-[13px] text-gray-500 dark:text-neutral-500">
|
|
41
|
-
Scan this QR code using a mobile authentication app. This will generate a verification code.
|
|
42
|
-
</p>
|
|
43
|
-
|
|
44
|
-
<div class="mt-3">
|
|
45
|
-
<span class="p-1 inline-block border border-gray-300 rounded-lg dark:border-neutral-600">
|
|
46
|
-
{{{qrCode}}}
|
|
47
|
-
</span>
|
|
48
|
-
</div>
|
|
49
|
-
<div class="mt-3">
|
|
50
|
-
<span class="p-1 inline-block border border-gray-300 rounded-lg dark:border-neutral-600">
|
|
51
|
-
{{secretKey}}
|
|
52
|
-
</span>
|
|
53
|
-
</div>
|
|
54
|
-
</li>
|
|
55
|
-
{{/unless}}
|
|
56
|
-
<!-- End Step -->
|
|
57
|
-
{{/if}}
|
|
58
|
-
|
|
59
|
-
<!-- Step -->
|
|
60
|
-
<li class="relative ps-12 pb-10 last:pb-0 before:content-[counter(step)] before:absolute before:start-0 before:flex before:items-center before:justify-center before:size-7 before:text-xs before:font-semibold before:text-gray-800 before:rounded-full before:bg-gray-100 dark:before:bg-neutral-700 dark:before:text-neutral-200 last:after:hidden after:absolute after:top-9 after:bottom-2 after:start-3.5 after:w-px after:-translate-x-[0.5px] after:bg-gray-200 dark:after:bg-neutral-700" style="counter-increment: step 1;">
|
|
61
|
-
<span class="block font-semibold text-sm text-gray-800 dark:text-neutral-200">
|
|
62
|
-
Enter Code
|
|
63
|
-
</span>
|
|
64
|
-
<p class="text-[13px] text-gray-500 dark:text-neutral-500">
|
|
65
|
-
Enter the 2-step verification code from your authenticator app.
|
|
66
|
-
</p>
|
|
67
|
-
|
|
68
|
-
<form action="/2factor/verify" method="get">
|
|
69
|
-
<div class="space-y-5">
|
|
70
|
-
<div>
|
|
71
|
-
<input type="text" name="code" class="form-input hidden">
|
|
72
|
-
<div class="space-y-5">
|
|
73
|
-
<div class="my-3 flex gap-x-2" data-hs-pin-input>
|
|
74
|
-
<input id="input-1" type="text" class="input-code block w-[38px] h-[38px] text-center border rounded-md focus:outline-blue-600" >
|
|
75
|
-
<input id="input-2" type="text" class="input-code block w-[38px] h-[38px] text-center border rounded-md focus:outline-blue-600" >
|
|
76
|
-
<input id="input-3" type="text" class="input-code block w-[38px] h-[38px] text-center border rounded-md focus:outline-blue-600" >
|
|
77
|
-
<input id="input-4" type="text" class="input-code block w-[38px] h-[38px] text-center border rounded-md focus:outline-blue-600" >
|
|
78
|
-
<input id="input-5" type="text" class="input-code block w-[38px] h-[38px] text-center border rounded-md focus:outline-blue-600" >
|
|
79
|
-
<input id="input-6" type="text" class="input-code block w-[38px] h-[38px] text-center border rounded-md focus:outline-blue-600" >
|
|
80
|
-
</div>
|
|
81
|
-
</div>
|
|
82
|
-
|
|
83
|
-
<button type="submit" class="py-2.5 px-3 w-full inline-flex justify-center items-center gap-x-2 text-sm font-semibold rounded-lg border border-transparent bg-blue-600 text-white hover:bg-blue-700 disabled:opacity-50 disabled:pointer-events-none dark:focus:outline-none dark:focus:ring-1 dark:focus:ring-neutral-600">
|
|
84
|
-
Sign in
|
|
85
|
-
</button>
|
|
86
|
-
</div>
|
|
87
|
-
</form>
|
|
88
|
-
</li>
|
|
89
|
-
<!-- End Step -->
|
|
90
|
-
|
|
91
|
-
</ul>
|
|
92
|
-
</div>
|
|
93
|
-
</div>
|
|
94
|
-
<!-- End Content -->
|
|
95
|
-
</main>
|
|
96
|
-
<script>
|
|
97
|
-
const inputs = document.querySelectorAll(".input-code");
|
|
98
|
-
const formInput = document.querySelector(".form-input");
|
|
99
|
-
|
|
100
|
-
const inputTextToInput = (event) => {
|
|
101
|
-
const input = event.target;
|
|
102
|
-
const value = input.value;
|
|
103
|
-
|
|
104
|
-
if (value.length > 1) {
|
|
105
|
-
input.value = value.slice(-1);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
const currentIndex = Array.from(inputs).indexOf(input);
|
|
109
|
-
if (value && currentIndex < inputs.length - 1) {
|
|
110
|
-
inputs[currentIndex + 1].focus();
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
const combinedValue = Array.from(inputs)
|
|
114
|
-
.map((input) => input.value)
|
|
115
|
-
.join("");
|
|
116
|
-
|
|
117
|
-
formInput.value = combinedValue;
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
const handleBackspace = (event) => {
|
|
121
|
-
const input = event.target;
|
|
122
|
-
|
|
123
|
-
if (event.key === "Backspace" && input.value === "") {
|
|
124
|
-
const currentIndex = Array.from(inputs).indexOf(input);
|
|
125
|
-
if (currentIndex > 0) {
|
|
126
|
-
inputs[currentIndex - 1].focus();
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
};
|
|
130
|
-
|
|
131
|
-
inputs.forEach((input) => {
|
|
132
|
-
input.addEventListener("input", inputTextToInput);
|
|
133
|
-
input.addEventListener("keydown", handleBackspace);
|
|
134
|
-
});
|
|
135
|
-
</script>
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
</body>
|
|
140
|
-
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en" dir="" class="relative min-h-full">
|
|
3
|
+
<head>
|
|
4
|
+
<!-- scripts -->
|
|
5
|
+
<script src="https://cdn.tailwindcss.com"></script>
|
|
6
|
+
</head>
|
|
7
|
+
<body class="bg-white dark:bg-neutral-900">
|
|
8
|
+
<main class="flex min-h-full">
|
|
9
|
+
|
|
10
|
+
<!-- Content -->
|
|
11
|
+
<div class="grow px-5">
|
|
12
|
+
<div class="h-full min-h-screen sm:w-[448px] flex flex-col justify-center mx-auto space-y-5">
|
|
13
|
+
{{#if enabled}}
|
|
14
|
+
<a href="/2factor?recovery=1" class="py-2.5 px-3 w-full inline-flex justify-center items-center gap-x-2 text-sm font-medium rounded-lg border border-gray-200 bg-white text-gray-800 shadow-sm hover:bg-gray-50 disabled:opacity-50 disabled:pointer-events-none focus:outline-none focus:bg-gray-50 dark:bg-neutral-800 dark:border-neutral-700 dark:text-neutral-300 dark:hover:bg-neutral-700 dark:focus:bg-neutral-700">
|
|
15
|
+
<svg class="flex-shrink-0 size-4" width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
16
|
+
<path d="M27.2192 10.9088C27.0336 11.0528 23.7568 12.8992 23.7568 17.0048C23.7568 21.7536 27.9264 23.4336 28.0512 23.4752C28.032 23.5776 27.3888 25.776 25.8528 28.016C24.4832 29.9872 23.0528 31.9552 20.8768 31.9552C18.7008 31.9552 18.1408 30.6912 15.6288 30.6912C13.1808 30.6912 12.3104 31.9968 10.32 31.9968C8.3296 31.9968 6.9408 30.1728 5.344 27.9328C3.4944 25.3024 2 21.216 2 17.3376C2 11.1168 6.0448 7.8176 10.0256 7.8176C12.1408 7.8176 13.904 9.2064 15.232 9.2064C16.496 9.2064 18.4672 7.7344 20.8736 7.7344C21.7856 7.7344 25.0624 7.8176 27.2192 10.9088ZM19.7312 5.1008C20.7264 3.92 21.4304 2.2816 21.4304 0.6432C21.4304 0.416 21.4112 0.1856 21.3696 0C19.7504 0.0608 17.824 1.0784 16.6624 2.4256C15.7504 3.4624 14.8992 5.1008 14.8992 6.7616C14.8992 7.0112 14.9408 7.2608 14.96 7.3408C15.0624 7.36 15.2288 7.3824 15.3952 7.3824C16.848 7.3824 18.6752 6.4096 19.7312 5.1008Z" class="fill-black dark:fill-neutral-200" fill="currentColor"/>
|
|
17
|
+
</svg>
|
|
18
|
+
I lost access to my 2factor app
|
|
19
|
+
</a>
|
|
20
|
+
{{/if}}
|
|
21
|
+
<ul>
|
|
22
|
+
<!-- Step -->
|
|
23
|
+
<li class="relative ps-12 pb-10 last:pb-0 before:content-[counter(step)] before:absolute before:start-0 before:flex before:items-center before:justify-center before:size-7 before:text-xs before:font-semibold before:text-gray-800 before:rounded-full before:bg-gray-100 dark:before:bg-neutral-700 dark:before:text-neutral-200 last:after:hidden after:absolute after:top-9 after:bottom-2 after:start-3.5 after:w-px after:-translate-x-[0.5px] after:bg-gray-200 dark:after:bg-neutral-700" style="counter-increment: step 1;">
|
|
24
|
+
<span class="block font-semibold text-sm text-gray-800 dark:text-neutral-200">
|
|
25
|
+
Download app
|
|
26
|
+
</span>
|
|
27
|
+
<a target="_blank" href="{{coalesce url 'https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&pcampaignid=web_share'}}" class="text-[13px] text-gray-500 dark:text-neutral-500">
|
|
28
|
+
Download a mobile authentication app.
|
|
29
|
+
</a>
|
|
30
|
+
</li>
|
|
31
|
+
<!-- End Step -->
|
|
32
|
+
|
|
33
|
+
{{#if qrCode}}
|
|
34
|
+
{{#unless enabled}}
|
|
35
|
+
<!-- Step -->
|
|
36
|
+
<li class="relative ps-12 pb-10 last:pb-0 before:content-[counter(step)] before:absolute before:start-0 before:flex before:items-center before:justify-center before:size-7 before:text-xs before:font-semibold before:text-gray-800 before:rounded-full before:bg-gray-100 dark:before:bg-neutral-700 dark:before:text-neutral-200 last:after:hidden after:absolute after:top-9 after:bottom-2 after:start-3.5 after:w-px after:-translate-x-[0.5px] after:bg-gray-200 dark:after:bg-neutral-700" style="counter-increment: step 1;">
|
|
37
|
+
<span class="block font-semibold text-sm text-gray-800 dark:text-neutral-200">
|
|
38
|
+
Scan QR Code
|
|
39
|
+
</span>
|
|
40
|
+
<p class="text-[13px] text-gray-500 dark:text-neutral-500">
|
|
41
|
+
Scan this QR code using a mobile authentication app. This will generate a verification code.
|
|
42
|
+
</p>
|
|
43
|
+
|
|
44
|
+
<div class="mt-3">
|
|
45
|
+
<span class="p-1 inline-block border border-gray-300 rounded-lg dark:border-neutral-600">
|
|
46
|
+
{{{qrCode}}}
|
|
47
|
+
</span>
|
|
48
|
+
</div>
|
|
49
|
+
<div class="mt-3">
|
|
50
|
+
<span class="p-1 inline-block border border-gray-300 rounded-lg dark:border-neutral-600">
|
|
51
|
+
{{secretKey}}
|
|
52
|
+
</span>
|
|
53
|
+
</div>
|
|
54
|
+
</li>
|
|
55
|
+
{{/unless}}
|
|
56
|
+
<!-- End Step -->
|
|
57
|
+
{{/if}}
|
|
58
|
+
|
|
59
|
+
<!-- Step -->
|
|
60
|
+
<li class="relative ps-12 pb-10 last:pb-0 before:content-[counter(step)] before:absolute before:start-0 before:flex before:items-center before:justify-center before:size-7 before:text-xs before:font-semibold before:text-gray-800 before:rounded-full before:bg-gray-100 dark:before:bg-neutral-700 dark:before:text-neutral-200 last:after:hidden after:absolute after:top-9 after:bottom-2 after:start-3.5 after:w-px after:-translate-x-[0.5px] after:bg-gray-200 dark:after:bg-neutral-700" style="counter-increment: step 1;">
|
|
61
|
+
<span class="block font-semibold text-sm text-gray-800 dark:text-neutral-200">
|
|
62
|
+
Enter Code
|
|
63
|
+
</span>
|
|
64
|
+
<p class="text-[13px] text-gray-500 dark:text-neutral-500">
|
|
65
|
+
Enter the 2-step verification code from your authenticator app.
|
|
66
|
+
</p>
|
|
67
|
+
|
|
68
|
+
<form action="/2factor/verify" method="get">
|
|
69
|
+
<div class="space-y-5">
|
|
70
|
+
<div>
|
|
71
|
+
<input type="text" name="code" class="form-input hidden">
|
|
72
|
+
<div class="space-y-5">
|
|
73
|
+
<div class="my-3 flex gap-x-2" data-hs-pin-input>
|
|
74
|
+
<input id="input-1" type="text" class="input-code block w-[38px] h-[38px] text-center border rounded-md focus:outline-blue-600" >
|
|
75
|
+
<input id="input-2" type="text" class="input-code block w-[38px] h-[38px] text-center border rounded-md focus:outline-blue-600" >
|
|
76
|
+
<input id="input-3" type="text" class="input-code block w-[38px] h-[38px] text-center border rounded-md focus:outline-blue-600" >
|
|
77
|
+
<input id="input-4" type="text" class="input-code block w-[38px] h-[38px] text-center border rounded-md focus:outline-blue-600" >
|
|
78
|
+
<input id="input-5" type="text" class="input-code block w-[38px] h-[38px] text-center border rounded-md focus:outline-blue-600" >
|
|
79
|
+
<input id="input-6" type="text" class="input-code block w-[38px] h-[38px] text-center border rounded-md focus:outline-blue-600" >
|
|
80
|
+
</div>
|
|
81
|
+
</div>
|
|
82
|
+
|
|
83
|
+
<button type="submit" class="py-2.5 px-3 w-full inline-flex justify-center items-center gap-x-2 text-sm font-semibold rounded-lg border border-transparent bg-blue-600 text-white hover:bg-blue-700 disabled:opacity-50 disabled:pointer-events-none dark:focus:outline-none dark:focus:ring-1 dark:focus:ring-neutral-600">
|
|
84
|
+
Sign in
|
|
85
|
+
</button>
|
|
86
|
+
</div>
|
|
87
|
+
</form>
|
|
88
|
+
</li>
|
|
89
|
+
<!-- End Step -->
|
|
90
|
+
|
|
91
|
+
</ul>
|
|
92
|
+
</div>
|
|
93
|
+
</div>
|
|
94
|
+
<!-- End Content -->
|
|
95
|
+
</main>
|
|
96
|
+
<script>
|
|
97
|
+
const inputs = document.querySelectorAll(".input-code");
|
|
98
|
+
const formInput = document.querySelector(".form-input");
|
|
99
|
+
|
|
100
|
+
const inputTextToInput = (event) => {
|
|
101
|
+
const input = event.target;
|
|
102
|
+
const value = input.value;
|
|
103
|
+
|
|
104
|
+
if (value.length > 1) {
|
|
105
|
+
input.value = value.slice(-1);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const currentIndex = Array.from(inputs).indexOf(input);
|
|
109
|
+
if (value && currentIndex < inputs.length - 1) {
|
|
110
|
+
inputs[currentIndex + 1].focus();
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const combinedValue = Array.from(inputs)
|
|
114
|
+
.map((input) => input.value)
|
|
115
|
+
.join("");
|
|
116
|
+
|
|
117
|
+
formInput.value = combinedValue;
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
const handleBackspace = (event) => {
|
|
121
|
+
const input = event.target;
|
|
122
|
+
|
|
123
|
+
if (event.key === "Backspace" && input.value === "") {
|
|
124
|
+
const currentIndex = Array.from(inputs).indexOf(input);
|
|
125
|
+
if (currentIndex > 0) {
|
|
126
|
+
inputs[currentIndex - 1].focus();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
inputs.forEach((input) => {
|
|
132
|
+
input.addEventListener("input", inputTextToInput);
|
|
133
|
+
input.addEventListener("keydown", handleBackspace);
|
|
134
|
+
});
|
|
135
|
+
</script>
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
</body>
|
|
140
|
+
|
|
141
141
|
</html>
|
|
@@ -1,91 +1,91 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="en" dir="">
|
|
3
|
-
<head>
|
|
4
|
-
<!-- scripts -->
|
|
5
|
-
<script src="https://cdn.tailwindcss.com"></script>
|
|
6
|
-
</head>
|
|
7
|
-
<body class="bg-white ">
|
|
8
|
-
<main class="flex h-[90vh] justify-center items-center">
|
|
9
|
-
<div class="space-y-8 w-[385px]">
|
|
10
|
-
<div class="text-center">
|
|
11
|
-
{{#if settings.admin.logo}}
|
|
12
|
-
<img style="margin-left: auto; margin-right: auto; display: block;" src="{{settings.admin.logo}}" alt="logo">
|
|
13
|
-
{{/if}}
|
|
14
|
-
<h2 class="font-medium text-xl text-gray-800 ">
|
|
15
|
-
{{#if settings.admin.title}}
|
|
16
|
-
{{settings.admin.title}}
|
|
17
|
-
{{^}}
|
|
18
|
-
Вхід в систему
|
|
19
|
-
{{/if}}
|
|
20
|
-
</h2>
|
|
21
|
-
</div>
|
|
22
|
-
<div id="login_error" style="color: maroon;font-weight: 500;"></div>
|
|
23
|
-
<form action="/api/login" method="get" class="space-y-3">
|
|
24
|
-
<div>
|
|
25
|
-
<label for="hs-pro-shlgfem" class="sr-only">Email</label>
|
|
26
|
-
<input id="hs-pro-shlgfem" type="text" name="username"
|
|
27
|
-
class="py-3 px-4 block w-full border border-gray-200 rounded-lg sm:text-sm placeholder:text-gray-400 focus:outline-none h-[50px] focus:border-indigo-500 focus:border-2 disabled:opacity-50 disabled:pointer-events-none "
|
|
28
|
-
placeholder="Email">
|
|
29
|
-
</div>
|
|
30
|
-
|
|
31
|
-
<div>
|
|
32
|
-
<label for="hs-pro-shlgfps" class="sr-only">Password</label>
|
|
33
|
-
<div class="relative">
|
|
34
|
-
<input id="hs-pro-shlgfps" name="password" type="password"
|
|
35
|
-
class="py-3 px-4 block w-full border border-gray-200 rounded-lg sm:text-sm placeholder:text-gray-400 focus:border-indigo-500 focus:outline-none h-[50px] focus:border-indigo-500 focus:border-2 disabled:opacity-50 disabled:pointer-events-none "
|
|
36
|
-
placeholder="Password">
|
|
37
|
-
<button type="button" data-hs-toggle-password="{
|
|
38
|
-
"target": "#hs-pro-shlgfps"
|
|
39
|
-
}"
|
|
40
|
-
class="absolute inset-y-0 end-0 flex items-center z-20 px-3 cursor-pointer text-gray-400 rounded-e-md focus:outline-none">
|
|
41
|
-
<!--svg class="shrink-0 size-3.5" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor"
|
|
42
|
-
viewBox="0 0 16 16">
|
|
43
|
-
<path class="hs-password-active:hidden"
|
|
44
|
-
d="M13.359 11.238C15.06 9.72 16 8 16 8s-3-5.5-8-5.5a7.028 7.028 0 0 0-2.79.588l.77.771A5.944 5.944 0 0 1 8 3.5c2.12 0 3.879 1.168 5.168 2.457A13.134 13.134 0 0 1 14.828 8c-.058.087-.122.183-.195.288-.335.48-.83 1.12-1.465 1.755-.165.165-.337.328-.517.486l.708.709z">
|
|
45
|
-
</path>
|
|
46
|
-
<path class="hs-password-active:hidden"
|
|
47
|
-
d="M11.297 9.176a3.5 3.5 0 0 0-4.474-4.474l.823.823a2.5 2.5 0 0 1 2.829 2.829l.822.822zm-2.943 1.299.822.822a3.5 3.5 0 0 1-4.474-4.474l.823.823a2.5 2.5 0 0 0 2.829 2.829z">
|
|
48
|
-
</path>
|
|
49
|
-
<path class="hs-password-active:hidden"
|
|
50
|
-
d="M3.35 5.47c-.18.16-.353.322-.518.487A13.134 13.134 0 0 0 1.172 8l.195.288c.335.48.83 1.12 1.465 1.755C4.121 11.332 5.881 12.5 8 12.5c.716 0 1.39-.133 2.02-.36l.77.772A7.029 7.029 0 0 1 8 13.5C3 13.5 0 8 0 8s.939-1.721 2.641-3.238l.708.709zm10.296 8.884-12-12 .708-.708 12 12-.708.708z">
|
|
51
|
-
</path>
|
|
52
|
-
<path class="hidden hs-password-active:block"
|
|
53
|
-
d="M16 8s-3-5.5-8-5.5S0 8 0 8s3 5.5 8 5.5S16 8 16 8zM1.173 8a13.133 13.133 0 0 1 1.66-2.043C4.12 4.668 5.88 3.5 8 3.5c2.12 0 3.879 1.168 5.168 2.457A13.133 13.133 0 0 1 14.828 8c-.058.087-.122.183-.195.288-.335.48-.83 1.12-1.465 1.755C11.879 11.332 10.119 12.5 8 12.5c-2.12 0-3.879-1.168-5.168-2.457A13.134 13.134 0 0 1 1.172 8z">
|
|
54
|
-
</path>
|
|
55
|
-
<path class="hidden hs-password-active:block"
|
|
56
|
-
d="M8 5.5a2.5 2.5 0 1 0 0 5 2.5 2.5 0 0 0 0-5zM4.5 8a3.5 3.5 0 1 1 7 0 3.5 3.5 0 0 1-7 0z"></path>
|
|
57
|
-
</svg-->
|
|
58
|
-
</button>
|
|
59
|
-
</div>
|
|
60
|
-
</div>
|
|
61
|
-
|
|
62
|
-
<div class="flex flex-wrap justify-between items-center gap-3">
|
|
63
|
-
<div class="flex gap-x-1">
|
|
64
|
-
<input type="checkbox" name="keep"
|
|
65
|
-
class="shrink-0 border-gray-300 size-[18px] rounded text-indigo-600 focus:ring-indigo-600 disabled:opacity-50 disabled:pointer-events-none "
|
|
66
|
-
id="hs-pro-shlgfemch">
|
|
67
|
-
<label for="hs-pro-shlgfemch" class="text-[13px] text-gray-500 ms-1.5">
|
|
68
|
-
Remember me
|
|
69
|
-
</label>
|
|
70
|
-
</div>
|
|
71
|
-
<a class="text-[13px] text-gray-500 underline underline-offset-4 hover:text-indigo-600 focus:outline-none focus:text-indigo-600 "
|
|
72
|
-
href="#">Forgot your password?</a>
|
|
73
|
-
</div>
|
|
74
|
-
|
|
75
|
-
<div class="space-y-4">
|
|
76
|
-
<button type="submit"
|
|
77
|
-
class="py-3 px-4 w-full inline-flex justify-center items-center gap-x-2 sm:text-sm font-medium rounded-lg border border-transparent bg-indigo-600 text-white hover:bg-indigo-700 disabled:opacity-50 disabled:pointer-events-none focus:outline-none focus:bg-indigo-700">
|
|
78
|
-
Log in
|
|
79
|
-
</button>
|
|
80
|
-
</div>
|
|
81
|
-
</form>
|
|
82
|
-
</div>
|
|
83
|
-
</main>
|
|
84
|
-
</body>
|
|
85
|
-
<script>
|
|
86
|
-
const error = location.search.includes('wrong_pass')
|
|
87
|
-
if(error){
|
|
88
|
-
document.getElementById('login_error').innerHTML='Не вірний користувач або пароль';
|
|
89
|
-
}
|
|
90
|
-
</script>
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en" dir="">
|
|
3
|
+
<head>
|
|
4
|
+
<!-- scripts -->
|
|
5
|
+
<script src="https://cdn.tailwindcss.com"></script>
|
|
6
|
+
</head>
|
|
7
|
+
<body class="bg-white ">
|
|
8
|
+
<main class="flex h-[90vh] justify-center items-center">
|
|
9
|
+
<div class="space-y-8 w-[385px]">
|
|
10
|
+
<div class="text-center">
|
|
11
|
+
{{#if settings.admin.logo}}
|
|
12
|
+
<img style="margin-left: auto; margin-right: auto; display: block;" src="{{settings.admin.logo}}" alt="logo">
|
|
13
|
+
{{/if}}
|
|
14
|
+
<h2 class="font-medium text-xl text-gray-800 ">
|
|
15
|
+
{{#if settings.admin.title}}
|
|
16
|
+
{{settings.admin.title}}
|
|
17
|
+
{{^}}
|
|
18
|
+
Вхід в систему
|
|
19
|
+
{{/if}}
|
|
20
|
+
</h2>
|
|
21
|
+
</div>
|
|
22
|
+
<div id="login_error" style="color: maroon;font-weight: 500;"></div>
|
|
23
|
+
<form action="/api/login" method="get" class="space-y-3">
|
|
24
|
+
<div>
|
|
25
|
+
<label for="hs-pro-shlgfem" class="sr-only">Email</label>
|
|
26
|
+
<input id="hs-pro-shlgfem" type="text" name="username"
|
|
27
|
+
class="py-3 px-4 block w-full border border-gray-200 rounded-lg sm:text-sm placeholder:text-gray-400 focus:outline-none h-[50px] focus:border-indigo-500 focus:border-2 disabled:opacity-50 disabled:pointer-events-none "
|
|
28
|
+
placeholder="Email">
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<div>
|
|
32
|
+
<label for="hs-pro-shlgfps" class="sr-only">Password</label>
|
|
33
|
+
<div class="relative">
|
|
34
|
+
<input id="hs-pro-shlgfps" name="password" type="password"
|
|
35
|
+
class="py-3 px-4 block w-full border border-gray-200 rounded-lg sm:text-sm placeholder:text-gray-400 focus:border-indigo-500 focus:outline-none h-[50px] focus:border-indigo-500 focus:border-2 disabled:opacity-50 disabled:pointer-events-none "
|
|
36
|
+
placeholder="Password">
|
|
37
|
+
<button type="button" data-hs-toggle-password="{
|
|
38
|
+
"target": "#hs-pro-shlgfps"
|
|
39
|
+
}"
|
|
40
|
+
class="absolute inset-y-0 end-0 flex items-center z-20 px-3 cursor-pointer text-gray-400 rounded-e-md focus:outline-none">
|
|
41
|
+
<!--svg class="shrink-0 size-3.5" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor"
|
|
42
|
+
viewBox="0 0 16 16">
|
|
43
|
+
<path class="hs-password-active:hidden"
|
|
44
|
+
d="M13.359 11.238C15.06 9.72 16 8 16 8s-3-5.5-8-5.5a7.028 7.028 0 0 0-2.79.588l.77.771A5.944 5.944 0 0 1 8 3.5c2.12 0 3.879 1.168 5.168 2.457A13.134 13.134 0 0 1 14.828 8c-.058.087-.122.183-.195.288-.335.48-.83 1.12-1.465 1.755-.165.165-.337.328-.517.486l.708.709z">
|
|
45
|
+
</path>
|
|
46
|
+
<path class="hs-password-active:hidden"
|
|
47
|
+
d="M11.297 9.176a3.5 3.5 0 0 0-4.474-4.474l.823.823a2.5 2.5 0 0 1 2.829 2.829l.822.822zm-2.943 1.299.822.822a3.5 3.5 0 0 1-4.474-4.474l.823.823a2.5 2.5 0 0 0 2.829 2.829z">
|
|
48
|
+
</path>
|
|
49
|
+
<path class="hs-password-active:hidden"
|
|
50
|
+
d="M3.35 5.47c-.18.16-.353.322-.518.487A13.134 13.134 0 0 0 1.172 8l.195.288c.335.48.83 1.12 1.465 1.755C4.121 11.332 5.881 12.5 8 12.5c.716 0 1.39-.133 2.02-.36l.77.772A7.029 7.029 0 0 1 8 13.5C3 13.5 0 8 0 8s.939-1.721 2.641-3.238l.708.709zm10.296 8.884-12-12 .708-.708 12 12-.708.708z">
|
|
51
|
+
</path>
|
|
52
|
+
<path class="hidden hs-password-active:block"
|
|
53
|
+
d="M16 8s-3-5.5-8-5.5S0 8 0 8s3 5.5 8 5.5S16 8 16 8zM1.173 8a13.133 13.133 0 0 1 1.66-2.043C4.12 4.668 5.88 3.5 8 3.5c2.12 0 3.879 1.168 5.168 2.457A13.133 13.133 0 0 1 14.828 8c-.058.087-.122.183-.195.288-.335.48-.83 1.12-1.465 1.755C11.879 11.332 10.119 12.5 8 12.5c-2.12 0-3.879-1.168-5.168-2.457A13.134 13.134 0 0 1 1.172 8z">
|
|
54
|
+
</path>
|
|
55
|
+
<path class="hidden hs-password-active:block"
|
|
56
|
+
d="M8 5.5a2.5 2.5 0 1 0 0 5 2.5 2.5 0 0 0 0-5zM4.5 8a3.5 3.5 0 1 1 7 0 3.5 3.5 0 0 1-7 0z"></path>
|
|
57
|
+
</svg-->
|
|
58
|
+
</button>
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<div class="flex flex-wrap justify-between items-center gap-3">
|
|
63
|
+
<div class="flex gap-x-1">
|
|
64
|
+
<input type="checkbox" name="keep"
|
|
65
|
+
class="shrink-0 border-gray-300 size-[18px] rounded text-indigo-600 focus:ring-indigo-600 disabled:opacity-50 disabled:pointer-events-none "
|
|
66
|
+
id="hs-pro-shlgfemch">
|
|
67
|
+
<label for="hs-pro-shlgfemch" class="text-[13px] text-gray-500 ms-1.5">
|
|
68
|
+
Remember me
|
|
69
|
+
</label>
|
|
70
|
+
</div>
|
|
71
|
+
<a class="text-[13px] text-gray-500 underline underline-offset-4 hover:text-indigo-600 focus:outline-none focus:text-indigo-600 "
|
|
72
|
+
href="#">Forgot your password?</a>
|
|
73
|
+
</div>
|
|
74
|
+
|
|
75
|
+
<div class="space-y-4">
|
|
76
|
+
<button type="submit"
|
|
77
|
+
class="py-3 px-4 w-full inline-flex justify-center items-center gap-x-2 sm:text-sm font-medium rounded-lg border border-transparent bg-indigo-600 text-white hover:bg-indigo-700 disabled:opacity-50 disabled:pointer-events-none focus:outline-none focus:bg-indigo-700">
|
|
78
|
+
Log in
|
|
79
|
+
</button>
|
|
80
|
+
</div>
|
|
81
|
+
</form>
|
|
82
|
+
</div>
|
|
83
|
+
</main>
|
|
84
|
+
</body>
|
|
85
|
+
<script>
|
|
86
|
+
const error = location.search.includes('wrong_pass')
|
|
87
|
+
if(error){
|
|
88
|
+
document.getElementById('login_error').innerHTML='Не вірний користувач або пароль';
|
|
89
|
+
}
|
|
90
|
+
</script>
|
|
91
91
|
</html>
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
<div style="background:#eee;padding:30px;">
|
|
2
|
-
<div
|
|
3
|
-
style="background:#fff;padding: 15px 20px;width: 550px;border: 1px solid #e3e3e5;border-radius:3px;margin: 0 auto;font: normal 13px/19px Verdana;box-shadow: 0 3px 7px rgba(0,0,0,.1);">
|
|
4
|
-
<h2 style="font:normal 21px/48px Arial;color: #222;text-align:center">
|
|
5
|
-
Коди відновлення на випадок втрати доступу до застосунку для двофакторної аутентифікації порталу {{domain}}
|
|
6
|
-
</h2>
|
|
7
|
-
{{#each recoveryCodes}}
|
|
8
|
-
<p style="width: 400px;margin:0 auto;display: block;background: #4CAF50;color: #fff;font-weight:bold; line-height: 44px;text-align: center;text-decoration: none;border-radius: 3px;text-shadow: 0 1px 3px rgba(0,0,0,.35);border: 1px solid #388E3C;box-shadow: inset 0 1px rgba(255,255,255,.4);">
|
|
9
|
-
{{this}}<hr>
|
|
10
|
-
</p>
|
|
11
|
-
{{/each}}
|
|
12
|
-
</div>
|
|
1
|
+
<div style="background:#eee;padding:30px;">
|
|
2
|
+
<div
|
|
3
|
+
style="background:#fff;padding: 15px 20px;width: 550px;border: 1px solid #e3e3e5;border-radius:3px;margin: 0 auto;font: normal 13px/19px Verdana;box-shadow: 0 3px 7px rgba(0,0,0,.1);">
|
|
4
|
+
<h2 style="font:normal 21px/48px Arial;color: #222;text-align:center">
|
|
5
|
+
Коди відновлення на випадок втрати доступу до застосунку для двофакторної аутентифікації порталу {{domain}}
|
|
6
|
+
</h2>
|
|
7
|
+
{{#each recoveryCodes}}
|
|
8
|
+
<p style="width: 400px;margin:0 auto;display: block;background: #4CAF50;color: #fff;font-weight:bold; line-height: 44px;text-align: center;text-decoration: none;border-radius: 3px;text-shadow: 0 1px 3px rgba(0,0,0,.35);border: 1px solid #388E3C;box-shadow: inset 0 1px rgba(255,255,255,.4);">
|
|
9
|
+
{{this}}<hr>
|
|
10
|
+
</p>
|
|
11
|
+
{{/each}}
|
|
12
|
+
</div>
|
|
13
13
|
</div>
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
<div style="background:#eee;padding:30px;">
|
|
2
|
-
<div
|
|
3
|
-
style="background:#fff;padding: 15px 20px;width: 550px;border: 1px solid #e3e3e5;border-radius:3px;margin: 0 auto;font: normal 13px/19px Verdana;box-shadow: 0 3px 7px rgba(0,0,0,.1);">
|
|
4
|
-
<h2 style="font:normal 21px/48px Arial;color: #222;text-align:center">
|
|
5
|
-
Відновлення паролю
|
|
6
|
-
</h2>
|
|
7
|
-
|
|
8
|
-
<div style="padding: 15px 0;">
|
|
9
|
-
Шановний <b>{{login}}</b>. Ви зробили запит на відновлення пароля на сайті <a
|
|
10
|
-
href="{{{domain}}}/{{{url}}}">{{{domain}}}/{{{url}}}</a>. Для того, щоб отримати новий пароль, перейдіть за
|
|
11
|
-
посиланням та введіть код:
|
|
12
|
-
</div>
|
|
13
|
-
<p style="width: 400px;margin:0 auto;display: block;background: #4CAF50;color: #fff;font-weight:bold; line-height: 44px;text-align: center;text-decoration: none;border-radius: 3px;text-shadow: 0 1px 3px rgba(0,0,0,.35);border: 1px solid #388E3C;box-shadow: inset 0 1px rgba(255,255,255,.4);">
|
|
14
|
-
{{{code}}}
|
|
15
|
-
</p>
|
|
16
|
-
<div style="padding: 15px 0;">
|
|
17
|
-
Якщо ви не робили запит для отримання пароля, просто видаліть цей лист. Ваш пароль зберігається в надійному
|
|
18
|
-
місці та недоступний стороннім особам.
|
|
19
|
-
</div>
|
|
20
|
-
</div>
|
|
1
|
+
<div style="background:#eee;padding:30px;">
|
|
2
|
+
<div
|
|
3
|
+
style="background:#fff;padding: 15px 20px;width: 550px;border: 1px solid #e3e3e5;border-radius:3px;margin: 0 auto;font: normal 13px/19px Verdana;box-shadow: 0 3px 7px rgba(0,0,0,.1);">
|
|
4
|
+
<h2 style="font:normal 21px/48px Arial;color: #222;text-align:center">
|
|
5
|
+
Відновлення паролю
|
|
6
|
+
</h2>
|
|
7
|
+
|
|
8
|
+
<div style="padding: 15px 0;">
|
|
9
|
+
Шановний <b>{{login}}</b>. Ви зробили запит на відновлення пароля на сайті <a
|
|
10
|
+
href="{{{domain}}}/{{{url}}}">{{{domain}}}/{{{url}}}</a>. Для того, щоб отримати новий пароль, перейдіть за
|
|
11
|
+
посиланням та введіть код:
|
|
12
|
+
</div>
|
|
13
|
+
<p style="width: 400px;margin:0 auto;display: block;background: #4CAF50;color: #fff;font-weight:bold; line-height: 44px;text-align: center;text-decoration: none;border-radius: 3px;text-shadow: 0 1px 3px rgba(0,0,0,.35);border: 1px solid #388E3C;box-shadow: inset 0 1px rgba(255,255,255,.4);">
|
|
14
|
+
{{{code}}}
|
|
15
|
+
</p>
|
|
16
|
+
<div style="padding: 15px 0;">
|
|
17
|
+
Якщо ви не робили запит для отримання пароля, просто видаліть цей лист. Ваш пароль зберігається в надійному
|
|
18
|
+
місці та недоступний стороннім особам.
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
21
|
</div>
|