From 24e11e0d3d27838c84337e7a048edbcb9d00c84e Mon Sep 17 00:00:00 2001 From: yakovlevanton Date: Sat, 14 Sep 2024 03:17:47 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B0=D0=BD=D0=B0=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86?= =?UTF-8?q?=D0=B0=20=D0=BF=D1=80=D0=BE=D1=84=D0=B8=D0=BB=D1=8F,=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D0=B0=20=D0=BF=D1=80=D0=BE=D1=81?= =?UTF-8?q?=D0=BC=D0=BE=D1=82=D1=80=D0=B0=20=D1=87=D1=83=D0=B6=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D0=BF=D1=80=D0=BE=D1=84=D0=B8=D0=BB=D1=8F,=20=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D0=B0=20=D0=BD=D0=B0=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=B5=D0=BA=20=D1=87=D0=B0=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/HypertextPages/chat-members.nytl.html | 61 ++++++ assets/HypertextPages/chatSettings.nytl.html | 46 ---- assets/HypertextPages/edit-profile.nytl.html | 71 ++++++ .../pass-pres-userinfo.nytl.html | 6 - assets/HypertextPages/profile.nytl.html | 39 ---- assets/HypertextPages/registration.nytl.html | 27 --- assets/HypertextPages/view-profile.nytl.html | 36 +++ assets/css/chat-members.css | 33 +++ assets/css/chatSettings.css | 163 -------------- assets/css/common-popup.css | 50 +++++ assets/css/common.css | 206 ++++++++++++++++++ assets/css/edit-profile.css | 23 ++ assets/css/profile.css | 129 ----------- assets/css/registration.css | 77 ------- assets/img/add.svg | 20 ++ assets/img/empty_avatar.png | Bin 82618 -> 0 bytes assets/img/favicon.png | Bin 0 -> 824 bytes assets/img/list-rooms.svg | 28 +++ assets/img/return.svg | 20 ++ assets/img/user.svg | 24 ++ assets/js/chat-members.js | 188 ++++++++++++++++ assets/js/chatSettings.js | 146 ------------- assets/js/common-popup.js | 26 +++ assets/js/common.js | 77 +++++++ assets/js/profile.js | 10 - 25 files changed, 863 insertions(+), 643 deletions(-) create mode 100644 assets/HypertextPages/chat-members.nytl.html delete mode 100644 assets/HypertextPages/chatSettings.nytl.html create mode 100644 assets/HypertextPages/edit-profile.nytl.html delete mode 100644 assets/HypertextPages/pass-pres-userinfo.nytl.html delete mode 100644 assets/HypertextPages/profile.nytl.html delete mode 100644 assets/HypertextPages/registration.nytl.html create mode 100644 assets/HypertextPages/view-profile.nytl.html create mode 100644 assets/css/chat-members.css delete mode 100644 assets/css/chatSettings.css create mode 100644 assets/css/common-popup.css create mode 100644 assets/css/common.css create mode 100644 assets/css/edit-profile.css delete mode 100644 assets/css/profile.css delete mode 100644 assets/css/registration.css create mode 100644 assets/img/add.svg delete mode 100644 assets/img/empty_avatar.png create mode 100644 assets/img/favicon.png create mode 100644 assets/img/list-rooms.svg create mode 100644 assets/img/return.svg create mode 100644 assets/img/user.svg create mode 100644 assets/js/chat-members.js delete mode 100644 assets/js/chatSettings.js create mode 100644 assets/js/common-popup.js create mode 100644 assets/js/common.js delete mode 100644 assets/js/profile.js diff --git a/assets/HypertextPages/chat-members.nytl.html b/assets/HypertextPages/chat-members.nytl.html new file mode 100644 index 0000000..7a7b41c --- /dev/null +++ b/assets/HypertextPages/chat-members.nytl.html @@ -0,0 +1,61 @@ +{% ELDEF main JSON pres JSON userinfo JSON openedchat JSON initial_chatUpdResp %} + + + + + + + + + + {%w pres.chat-members.members-of %} {%w openedchat.name %} + + +{% PUT chat.pass pres userinfo openedchat initial_chatUpdResp %} + + + + + +
+ + +
+ New chat +
+ +
+
+
+ + + + + + +{% ENDELDEF %} diff --git a/assets/HypertextPages/chatSettings.nytl.html b/assets/HypertextPages/chatSettings.nytl.html deleted file mode 100644 index 71269c7..0000000 --- a/assets/HypertextPages/chatSettings.nytl.html +++ /dev/null @@ -1,46 +0,0 @@ -{% ELDEF main JSON pres JSON userinfo %} - - - - - - - Настройки комнаты - - -
-
- - -
-
-
    - -
  • Участник 1
  • -
  • Участник 2
  • -
  • Участник 3
  • -
-
-
- -
-
- -
-
-
- × -

Добавить участников

-
-
- -
- -
-
- - - -{% ENDELDEF%} \ No newline at end of file diff --git a/assets/HypertextPages/edit-profile.nytl.html b/assets/HypertextPages/edit-profile.nytl.html new file mode 100644 index 0000000..ebac231 --- /dev/null +++ b/assets/HypertextPages/edit-profile.nytl.html @@ -0,0 +1,71 @@ +{% ELDEF main JSON pres JSON userinfo JSON alienprofile JSON errors %} + + + + + + + + + {%w pres.edit-profile.header-profile-of %} {%w alienprofile.name %} + + + +
+ + + {% FOR error IN errors %} +
+ {% W error.text %} +
+ {% ENDFOR %} + +
+

{% W alienprofile.name %}

+

{%w pres.edit-profile.directive-nickname %} {% W alienprofile.nickname %}

+

+ {% W alienprofile.bio %} +

+
+ +
+

{%w pres.edit-profile.change-user-attributes %}

+
+ + + + + + + + + +
+ + + +
+ + + +
+ +
+ + +
+
+
+ + + +{% ENDELDEF%} diff --git a/assets/HypertextPages/pass-pres-userinfo.nytl.html b/assets/HypertextPages/pass-pres-userinfo.nytl.html deleted file mode 100644 index 8331b75..0000000 --- a/assets/HypertextPages/pass-pres-userinfo.nytl.html +++ /dev/null @@ -1,6 +0,0 @@ -{% ELDEF main JSON pres JSON userinfo %} - -{% ENDELDEF %} diff --git a/assets/HypertextPages/profile.nytl.html b/assets/HypertextPages/profile.nytl.html deleted file mode 100644 index 5c9505a..0000000 --- a/assets/HypertextPages/profile.nytl.html +++ /dev/null @@ -1,39 +0,0 @@ -{% ELDEF main JSON pres JSON userinfo %} - - - - - - Профиль - - -
-
-

Профиль пользователя

- Назад -
-
-
-
-
- -
-
-
-
-
-
-
-

О себе

-
- -
- -
-
- - - - - -{% ENDELDEF%} diff --git a/assets/HypertextPages/registration.nytl.html b/assets/HypertextPages/registration.nytl.html deleted file mode 100644 index e9810ba..0000000 --- a/assets/HypertextPages/registration.nytl.html +++ /dev/null @@ -1,27 +0,0 @@ -{% ELDEF main JSON pres JSON userinfo %} - - - - - - Страница Регистрации - - - - - -
-

Вход

-
-
-
-
- -
-
-
- - - - -{% ENDELDEF %} diff --git a/assets/HypertextPages/view-profile.nytl.html b/assets/HypertextPages/view-profile.nytl.html new file mode 100644 index 0000000..af04f9c --- /dev/null +++ b/assets/HypertextPages/view-profile.nytl.html @@ -0,0 +1,36 @@ +{% ELDEF main JSON pres JSON userinfo JSON alienprofile %} + + + + + + + + + {%w pres.view-profile.header-profile-of %} {%w alienprofile.name %} + + + +
+ + +
+

{%w alienprofile.name %}

+

{%w pres.view-profile.directive-nickname%} {%w alienprofile.nickname %}

+

+ {%w alienprofile.bio %} +

+
+
+ + + + +{% ENDELDEF%} diff --git a/assets/css/chat-members.css b/assets/css/chat-members.css new file mode 100644 index 0000000..af0d1c6 --- /dev/null +++ b/assets/css/chat-members.css @@ -0,0 +1,33 @@ +#CM-btn-add { + margin-top: 6px; + margin-bottom: 4px; + display: none; +} + +.CM-member-box { + display: flex; + flex-direction: row; +} + +.CL-member-box-nickname { + margin-left: 8px; + justify-self: flex-start; +} + +.CM-member-box-name { + margin-left: 14px; + justify-self: flex-start; +} + +.CM-member-box-role { + margin-left: auto; + justify-self: flex-end; +} + +.CM-member-box-leave-btn { + margin-left: 10px; + margin-right: 8px; + justify-self: flex-end; + width: 16px; + cursor: pointer; +} diff --git a/assets/css/chatSettings.css b/assets/css/chatSettings.css deleted file mode 100644 index ab8da39..0000000 --- a/assets/css/chatSettings.css +++ /dev/null @@ -1,163 +0,0 @@ -body { - font-family: Arial, sans-serif; - display: flex; - justify-content: center; - align-items: center; - height: 100vh; - margin: 0; - background-color: #e5e5e5; -} - -.chat-settings-container { - width: 100%; - max-width: 800px; - background-color: white; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); - display: flex; - flex-direction: column; - border-radius: 8px; - overflow: hidden; -} - -.chat-settings-container-header { - background-color: #007bb5; - color: white; - padding: 25px; - display: flex; - justify-content: center; - align-items: center; -} - -.room-name { - font-size: 24px; - width: 80%; - text-align: center; - border-radius: 10px; - border: none; -} -.changeName { - padding: 8px 10px; - background-color: #28a745; - color: white; - border-radius: 20px; - border: none; - cursor: pointer; -} -.changeName:hover { - background-color: #005f8c; -} -.chat-settings-container-body { - padding: 15px; - background-color: #f7f7f7; - flex: 1; -} - -#chat-settings-container-body { - list-style-type: none; - padding: 0; -} - -#chat-settings-container-body li { - margin-bottom: 10px; - background-color: white; - padding: 10px; - border-radius: 8px; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); -} -.remove-member-button { - background-color: red; - color: white; - border: none; - padding: 5px 10px; - cursor: pointer; - margin-left: 10px; - border-radius: 4px; -} -.remove-member-button:hover { - background-color: darkred; -} -.chat-settings-container-invite { - padding: 15px; - background-color: white; - text-align: center; -} - -.invite-member { - padding: 10px 20px; - border: none; - background-color: #28a745; - color: white; - border-radius: 20px; - cursor: pointer; - transition: background-color 0.3s ease; -} - -.invite-member:hover { - background-color: #218838; -} - -.overlay { - display: none; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: rgba(0, 0, 0, 0.5); - justify-content: center; - align-items: center; - z-index: 1000; -} - -.add-members { - background-color: white; - padding: 30px; - border-radius: 8px; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); - width: 100%; - max-width: 400px; - text-align: center; -} - -.add-members-header { - position: relative; - margin-bottom: 20px; -} - -.add-members-header h2 { - margin: 0; -} - -.close { - position: absolute; - right: 10px; - top: 0; - font-size: 24px; - font-weight: bold; - cursor: pointer; -} - -.add-members-body input { - width: 95%; - padding: 10px; - margin-bottom: 20px; - border: 1px solid #ddd; - border-radius: 4px; - margin-right: 15%; - outline: none; -} - -.add-member-button { - padding: 10px 20px; - border: none; - background-color: #007bb5; - color: white; - border-radius: 20px; - cursor: pointer; - outline: none; - transition: background-color 0.3s ease; -} - -.add-member-button:hover { - background-color: #005f8c; -} \ No newline at end of file diff --git a/assets/css/common-popup.css b/assets/css/common-popup.css new file mode 100644 index 0000000..c9dec24 --- /dev/null +++ b/assets/css/common-popup.css @@ -0,0 +1,50 @@ +.popup-overlay-veil { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.6); + + z-index: 99; + display: none; /* Hidden by default */ +} + +.popup-window { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + background: white; + padding: 20px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.5); + + z-index: 100; + display: none; +} + +.popup-btn { + display: inline; + padding: 5px; + border-bottom: 3px; +} + +.popup-window-btn-yes { + background-color: #0c7f0e; + border-radius: 5px; + padding: 12px; + color: white; +} + +.popup-window-btn-no { + background-color: #ff0005; + border-radius: 5px; + padding: 12px; + color: white; +} + +.popup-window-msg { + padding-left: 20px; + font-weight: bold; + font-size: 1.3em; +} \ No newline at end of file diff --git a/assets/css/common.css b/assets/css/common.css new file mode 100644 index 0000000..b5f7406 --- /dev/null +++ b/assets/css/common.css @@ -0,0 +1,206 @@ +/* Profile view elements */ +.profile-container { + background: white; + border-radius: 5px; + padding: 20px; + margin-top: 60px; /* Space below the fixed panel */ + box-shadow: 0 10px 15px rgba(0, 0, 0, 0.3); +} + +.profile-name-text { + color: black; +} + +.profile-nickname-text{ + color: #444; + text-align: left; +} + +.profile-bio-text { + padding-top: 40px; + text-align: left; + line-height: 1.6; + color: black; +} + +/* Panels */ +.panel { + width: 100%; + border: 2px solid blue; + background-color: #54b3ff; + display: flex; + flex-direction: row; + align-items: center; +} + +.panel-thing { + padding: 6px; +} + +.panel-header-txt{ + color: white; + font-size: 1.9em; + flex: 1; + text-align: center; +} + + +/* Containers for the whole document */ + +* { + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: Arial, sans-serif; +} + +.document-container { + width: 80%; /* Full width of the viewport */ + margin: 0 auto; /* Center the container horizontally */ +} + +.fullscreen-container { + width: 80%; /* Full width of the viewport */ + height: 100vh; /* Full height of the viewport */ + display: flex; + flex-direction: column; /* Stack children vertically */ + margin: 0 auto; /* Center the container horizontally */ +} + +@media (orientation: landscape) { + .resp-container{ + width: 80%; + } +} + +@media (orientation: portrait){ + .resp-container{ + width: 100%; + } +} + +body { + background-color: #f000f0; + background-image: url("/assets/img/clavicle-transparent.png"), url("/assets/img/broken-clavicle.png"); + background-repeat: revert; + background-size: 10%, 25%; +} + +/* Notifications, returned from server and embedded into html page at render-time */ + +.server-notif-error-msg-box{ + font-size: 1.3em; + text-align: center; + padding: 10px; + border: 2px solid red; + border-radius: 30px; + background-color: #ff5050; + max-width: 40%; + margin: 15px auto; +} + +/* Centered headers */ + +.wide-centered-header { + width: 100%; + text-align: center; + font-size: 1.4em; +} +/* Cool buttons with text */ + +.action-button { + padding: 10px 15px; + background-color: #007bff; + color: white; + border: none; + border-radius: 5px; + cursor: pointer; + transition: background-color 0.3s; +} + + +.action-button:hover { + background-color: #0056b3; /* Darker blue on hover */ +} + +/* This is for centering non-100%wide block */ + +.centered-block-el { + display: block; + margin-left: auto; + margin-right: auto; +} + +/* Beautiful text input */ + +.one-line-input { + width: 100%; + padding: 8px; + margin: 8px 0; + border: 1px solid #ccc; + border-radius: 4px; +} + +.multiline-input { + width: 100%; + /*max-width: 600px;*/ + height: 200px; + padding: 10px; + font-size: 1.15em; + border: 2px solid #ccc; + border-radius: 5px; + box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.1); /* Subtle shadow */ + outline: none; /* Remove default outline on focus */ + resize: vertical; /* Allow resizing vertically */ + transition: border-color 0.15s, box-shadow 0.15s; /* Smooth transition for border color and shadow */ +} + +.multiline-input:focus { + border-color: #007bff; /* Change border color on focus */ + box-shadow: 0 0 5px rgba(0, 123, 255, 0.5); /* Shadow on focus */ +} + +/* Handles the case of list of elements with dickanme, name, role and delete button + For list of chats and list of users in chat */ +.dynamic-block-list { + margin-top:12px; + display: flex; + flex-direction: column; + background-color: white; + border: 1px solid #c7c7c7; + align-items: stretch; + padding-left: 8px; + padding-right: 8px; + padding-bottom: 8px; +} + +.dynamic-block-list-el { + margin-top: 8px; + background-color: white; + border: 1px solid #c7c7c7; + color: black; + padding: 5px; +} + +.button-add{ + width: 50px; + cursor: pointer; +} + +.dynamic-block-list-el-container{ + width: 100%; +} + +.entity-nickname-txt { + font-weight: bold; + color: black; + text-decoration: none; + font-size: 1.5em; +} + +.entity-reg-field-txt { + /* For name and role */ + color: #242424; + text-decoration: none; + font-size: 1.5em; +} diff --git a/assets/css/edit-profile.css b/assets/css/edit-profile.css new file mode 100644 index 0000000..ae0932d --- /dev/null +++ b/assets/css/edit-profile.css @@ -0,0 +1,23 @@ +/* The morbid thing */ +table.logins-input-table { + width: 100%; + border-collapse: collapse; /* Combine borders */ +} +.logins-input-td1, .logins-input-td2 { + border: none; +} +.logins-input-td1 { + text-align: left; + padding-right: 5px; + white-space: nowrap; /* Prevent text wrap, keeping it in one line */ + overflow: hidden; /* Hide overflow content */ + text-overflow: ellipsis; /* Show ellipsis for overflowing text */ +} +.logins-input-td2 { + width: 100%; +} + +#input-change-bio{ + margin-top: 5px; + margin-bottom: 5px; +} diff --git a/assets/css/profile.css b/assets/css/profile.css deleted file mode 100644 index c60dbf5..0000000 --- a/assets/css/profile.css +++ /dev/null @@ -1,129 +0,0 @@ -body { - display: flex; - justify-content: center; - align-items: center; - height: 90vh; - background-color: #e5e5e5; - font-family: Arial, sans-serif; -} -.main-container { - width: 700px; - height: 700px; - border-color: antiquewhite; - background-color: white; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - text-align: center; - border-radius: 10px; -} -.profile-header { - width: 700px; - height: 160px; - border-color: antiquewhite; - background-color: #0088cc; - border-radius: 10px; - position: relative; -} -.return { - background-color: #f0f0f0; - cursor: pointer; - width: 100px; - text-decoration: none; - color: black; - display: flex; - justify-content: center; - align-items: center; - height: 30px; - border-radius: 10px; - position: absolute; - left: 20px; - top: 25px; - border: none; -} -.return:hover{ - text-decoration: underline; - color: #0088cc; -} -form { - display: flex; - flex-direction: column; - align-items: center; -} - -.columns { - display: flex; - justify-content: center; - align-items: flex-start; - gap: 20px; - margin-bottom: 20px; -} - -.column { - display: flex; - flex-direction: column; - align-items: center; -} -.add { - width: 100px; - height: 40px; - border-width: 2px; - cursor: pointer; - font-size: 16px; - border-radius: 10px; -} -.add:hover { - background-color: #007bb5; -} -.image-button:hover { - opacity: 0.8; -} - -.image-button:active { - transform: scale(0.95); -} -#login { - font-family: Arial, sans-serif; - font-size:16px; - width: 150px; - height: 20px; - border-radius: 10px; - border-color: #2F4F4F; -} -#username { - font-family: Arial, sans-serif; - font-size:16px; - width: 150px; - height: 20px; - margin-bottom: 1px; - margin-top: 50px; - border-radius: 10px; - border-color: #2F4F4F; -} -#bio { - height: 150px; - width: 500px; - padding: 10px; - box-sizing: border-box; - font-family: Arial, sans-serif; - font-size:14px; - text-align: left; - vertical-align: top; - margin-bottom: 5px; -} -.save { - cursor:pointer; - font-size: 16px; - border-radius: 15px; - border-color: #2F4F4F; - height: 40px; - width: 150px; -} -.save:hover { - background-color: #007bb5; -} -.avatar { - border-radius: 50%; - object-fit: cover; -} \ No newline at end of file diff --git a/assets/css/registration.css b/assets/css/registration.css deleted file mode 100644 index b42c992..0000000 --- a/assets/css/registration.css +++ /dev/null @@ -1,77 +0,0 @@ -dy { - font-family: Arial, sans-serif; - display: flex; - justify-content: center; - align-items: center; - height: 100vh; - margin: 0; - background-color: #e5e5e5; -} - -.form-container { - width: 100%; - max-width: 400px; - background-color: white; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); - display: flex; - flex-direction: column; - border-radius: 8px; - padding: 40px; - text-align: center; -} - -h1 { - margin-bottom: 20px; - color: #2F4F4F; -} - -input { - width: 100%; - background: #f7f7f7; - font-size: 16px; - padding: 10px; - border: 1px solid #ddd; - border-radius: 20px; - margin-bottom: 15px; - outline: none; -} - -button { - width: 100%; - padding: 15px; - border: none; - background-color: #0088cc; - color: white; - border-radius: 20px; - cursor: pointer; - outline: none; - font-size: 16px; - font-weight: bold; - transition: background-color 0.3s; -} - -button:hover, -button:focus-visible { - background-color: #007bb5; -} - -.hide-cursor::placeholder { - color: #000; -} - -.hide-cursor { - caret-color: transparent; -} - -.no-select { - -webkit-user-select: none; /* Для Safari */ - -moz-user-select: none; /* Для Firefox */ - user-select: none; /* Для всех остальных браузеров */ -} - -div { - color: red; - font-size: 15px; - margin-top: 10px; - display: none; -} diff --git a/assets/img/add.svg b/assets/img/add.svg new file mode 100644 index 0000000..e65c886 --- /dev/null +++ b/assets/img/add.svg @@ -0,0 +1,20 @@ + + + + + diff --git a/assets/img/empty_avatar.png b/assets/img/empty_avatar.png deleted file mode 100644 index c1aa7144b0f9654fb06bd3c26aad54a38836dd2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82618 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≫(d@WS7}%Zh@NVSqSkJvuh_ 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

-Z(Rm4M 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 + + + + + + + + + diff --git a/assets/img/return.svg b/assets/img/return.svg new file mode 100644 index 0000000..f3a18d4 --- /dev/null +++ b/assets/img/return.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/assets/img/user.svg b/assets/img/user.svg new file mode 100644 index 0000000..228c197 --- /dev/null +++ b/assets/img/user.svg @@ -0,0 +1,24 @@ + + + + + + + + + diff --git a/assets/js/chat-members.js b/assets/js/chat-members.js new file mode 100644 index 0000000..cf9f42a --- /dev/null +++ b/assets/js/chat-members.js @@ -0,0 +1,188 @@ +let LocalHistoryId = 0; + +function genSentBase(){ + return { + 'chatUpdReq': { + 'LocalHistoryId': LocalHistoryId, + 'chatId': openedchat.id + } + }; +} + +let members = new Map(); +let memberBoxes = new Map(); +let myRoleHere = null; // Dung local state updates should be updated first + +let userDeletionWinStoredUId = -1; + +function shouldShowDeleteButton(memberSt){ + return userinfo.uid !== memberSt.userId && myRoleHere === userChatRoleAdmin && memberSt.roleHere !== userChatRoleDeleted; +} + +function updateBoxWithSt(box, memberSt){ + let ID = memberSt.userId; + let roleP = box.querySelector(".CM-member-box-role"); + roleP.innerText = memberSt.roleHere; + box.style.backgroundColor = roleToColor(memberSt.roleHere); + box.querySelector(".CM-member-box-leave-btn").style.display = + (shouldShowDeleteButton(memberSt) ? "block" : "none"); +} + +function convertMemberStToBox(memberSt){ + let ID = memberSt.userId; + let userProfileURI = "/user/" + memberSt.nickname; + + let box = document.createElement("div"); + box.className = "dynamic-block-list-el CM-member-box"; + box.style.backgroundColor = roleToColor(memberSt.roleHere); + + let inBoxNickname = document.createElement("a"); + box.appendChild(inBoxNickname); + inBoxNickname.className = "entity-nickname-txt CM-member-box-nickname"; + inBoxNickname.innerText = memberSt.nickname; + inBoxNickname.href = userProfileURI; + + let inBoxName = document.createElement("a"); + box.appendChild(inBoxName); + inBoxName.className = "entity-reg-field-txt CM-member-box-name"; + inBoxName.innerText = memberSt.name; + inBoxName.href = userProfileURI; + + let inBoxUserRoleHere = document.createElement("p"); + box.appendChild(inBoxUserRoleHere); + inBoxUserRoleHere.className = "entity-reg-field-txt CM-member-box-role"; + inBoxUserRoleHere.innerText = memberSt.roleHere; + + let inBoxLeaveBtn = document.createElement("img"); + box.appendChild(inBoxLeaveBtn); + inBoxLeaveBtn.className = "CM-member-box-leave-btn"; + inBoxLeaveBtn.src = "/assets/img/delete.svg"; + inBoxLeaveBtn.onclick = function (ev) { + if (ev.button !== 0) + return; + userDeletionWinStoredUId = ID; + document.getElementById("user-deletion-win-title").innerText = + pres['chat-members']['reask-kick-user-X'] + " " + memberSt.nickname + "?"; + activatePopupWindowById("user-deletion-win"); + }; + box.querySelector(".CM-member-box-leave-btn").style.display = + (shouldShowDeleteButton(memberSt) ? "block" : "none"); + + return box; +} + +function updateLocalStateFromChatUpdResp(chatUpdResp){ + LocalHistoryId = chatUpdResp.HistoryId; + // If my role is updated, we need to update all the boes of already set users (kick button can appear and disappear) + let literalMemberList = document.getElementById("CM-list"); + // We ignore messages and everything related to them. Dang, I really should add an argument to disable message lookup here + for (let memberSt of chatUpdResp.members){ + console.log([memberSt, userinfo.uid, myRoleHere]); + if (memberSt.userId === userinfo.uid && myRoleHere !== memberSt.roleHere){ + myRoleHere = memberSt.roleHere; + for (let [id, memberSt] of members){ + let box = memberBoxes.get(id); + updateBoxWithSt(box, memberSt); + } + document.getElementById("CM-btn-add").style.display = + (memberSt.roleHere === userChatRoleAdmin ? "block" : "none"); + console.log("DEBUG " + (memberSt.roleHere === userChatRoleAdmin ? "block" : "none")); + break; + } + } + for (let memberSt of chatUpdResp.members){ + let id = memberSt.userId; + if (members.has(id)){ + updateBoxWithSt(memberBoxes.get(id), memberSt); + } else { + if (memberSt.roleHere !== userChatRoleDeleted){ + members.set(id, memberSt); + let box = convertMemberStToBox(memberSt); + memberBoxes.set(id, box); + literalMemberList.appendChild(box); + } + } + } +} + +function updateLocalStateFromRecv(Recv){ + updateLocalStateFromChatUpdResp(Recv.chatUpdResp); +} + +function configureSummonUserInterface(){ + document.getElementById("user-summoning-yes").onclick = function(ev ){ + if (ev.button !==0) + return; + let nickname = String(document.getElementById("summoned-user-nickname").value); + let isReadOnly = document.getElementById("summoned-user-is-read-only").checked; + deactivateActivePopup(); + let Sent = genSentBase(); + Sent.nickname = nickname; + Sent.makeReadOnly = Boolean(isReadOnly); + apiRequest("addMemberToChat", Sent). + then((Recv) => { + updateLocalStateFromRecv(Recv); + }).catch((e) => { + console.log(e); + alert(pres['chat-members']["failed-summon-member"]); + }); + }; + + document.getElementById("user-summoning-no").onclick = function (ev) { + if (ev.button !== 0) + return; + deactivateActivePopup(); + }; + + document.getElementById("CM-btn-add").onclick = function(ev) { + if (ev.button !== 0) + return; + document.getElementById("summoned-user-nickname").value = ""; + // read-only flag persists throughout user summoning sessions, and IT IS NOT A BUG + activatePopupWindowById("user-summoning-win"); + }; +} + +/* Popup activation button is configured for each box separately */ +function configureKickUserInterfaceWinPart(){ + document.getElementById("user-deletion-yes").onclick = function (ev){ + if (ev.button !== 0) + return; + deactivateActivePopup(); + if (userDeletionWinStoredUId < 0) + throw new Error("Karaul"); + let Sent = genSentBase(); + Sent.userId = userDeletionWinStoredUId; + apiRequest("removeMemberFromChat", Sent). + then((Recv) => { + updateLocalStateFromRecv(Recv); + }).catch((e) => { + console.log(e); + alert(pres['chat-members']["failed-kick-member"]); + }); + } + + document.getElementById("user-deletion-no").onclick = function (ev) { + if (ev.button !== 0) + return; + deactivateActivePopup(); + }; +} + +__mainloopDelayMS = 5000; +__guestMainloopPollerAction = function (){ + console.log("Hello, world"); + apiRequest("chatPollEvents", genSentBase()). + then((Recv) => { + console.log(Recv); + updateLocalStateFromRecv(Recv); + }); +} + +window.onload = function(){ + console.log("Page loaded"); + configureSummonUserInterface(); + configureKickUserInterfaceWinPart(); + updateLocalStateFromChatUpdResp(initial_chatUpdResp); + mainloopPoller(); +} diff --git a/assets/js/chatSettings.js b/assets/js/chatSettings.js deleted file mode 100644 index 337bc00..0000000 --- a/assets/js/chatSettings.js +++ /dev/null @@ -1,146 +0,0 @@ -const chatId = 123; -let localHistoryId = 0; - -function handleChangeName() { - const newName = document.getElementById('room-name').value; - changeChatName(chatId, localHistoryId, newName).then(() => { - }); -} -function handleAddMember() { - const login = document.getElementById('newMemberLogin').value; - if (login) { - addMemberToChat(chatId, localHistoryId, login).then(() => { - const list = document.getElementById("chat-settings-container-body"); - const listItem = document.createElement("li"); - listItem.textContent = login; - list.appendChild(listItem); - closeAdd(); - }); - } -} -function handleRemoveMember(userId) { - removeMemberFromChat(chatId, localHistoryId, userId).then(() => { - const listItem = document.getElementById(`member-${userId}`); - if (listItem) { - listItem.remove(); - } - }); -} -function openInvite() { - document.getElementById("add_members").style.display = "flex"; -} - -function closeAdd() { - document.getElementById("add_members").style.display = "none"; -} - -function updateChat() { - pollChatEvents(chatId, localHistoryId).then(() => { - }); -} -document.addEventListener('DOMContentLoaded', () => { - updateChat(); -}); -async function changeChatName(chatId, localHistoryId, newName) { - try { - const response = await fetch('/api/changeChatName', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - chatUpdReq: { - chatId: chatId, - LocalHistoryId: localHistoryId - }, - content: { - name: newName - } - }) - }); - const data = await response.json(); - if (data.status === 0) { - console.log('Название комнаты успешно изменено'); - } else { - console.error('Ошибка при изменении названия комнаты:', data.error); - } - } catch (error) { - console.error('Ошибка сети при изменении названия комнаты:', error); - } -} -async function addMemberToChat(chatId, localHistoryId, nickname) { - try { - const response = await fetch('/api/addMemberToChat', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - chatUpdReq: { - chatId: chatId, - LocalHistoryId: localHistoryId - }, - nickname: nickname - }) - }); - const data = await response.json(); - if (data.status === 0) { - console.log('Участник успешно добавлен'); - } else { - console.error('Ошибка при добавлении участника:', data.error); - } - } catch (error) { - console.error('Ошибка сети при добавлении участника:', error); - } -} - -async function removeMemberFromChat(chatId, localHistoryId, userId) { - try { - const response = await fetch('/api/removeMemberFromChat', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - chatUpdReq: { - chatId: chatId, - LocalHistoryId: localHistoryId - }, - userId: userId - }) - }); - const data = await response.json(); - if (data.status === 0) { - console.log('Участник успешно удален'); - } else { - console.error('Ошибка при удалении участника:', data.error); - } - } catch (error) { - console.error('Ошибка сети при удалении участника:', error); - } -} - -async function pollChatEvents(chatId, localHistoryId) { - try { - const response = await fetch('/api/chatPollEvents', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - chatUpdReq: { - chatId: chatId, - LocalHistoryId: localHistoryId - } - }) - }); - const data = await response.json(); - if (data.status === 0) { - console.log('События чата успешно обновлены'); - } else { - console.error('Ошибка при обновлении событий чата:', data.error); - } - } catch (error) { - console.error('Ошибка сети при обновлении событий чата:', error); - } -} \ No newline at end of file diff --git a/assets/js/common-popup.js b/assets/js/common-popup.js new file mode 100644 index 0000000..1148577 --- /dev/null +++ b/assets/js/common-popup.js @@ -0,0 +1,26 @@ +let activePopupWinId = ""; + +function activatePopupWindow__(el){ + let veil = document.createElement("div"); + veil.id = "popup-overlay-veil-OBJ" + veil.className = "popup-overlay-veil"; + veil.style.display = "block"; + document.body.appendChild(veil); + el.style.display = "block"; +} + +function activatePopupWindowById(id){ + if (activePopupWinId !== "") + return; + /* Lmao, this thing is just... SO unsafe */ + activePopupWinId = id; + activatePopupWindow__(document.getElementById(id)) +} + +function deactivateActivePopup(){ + if (activePopupWinId === "") + return + document.getElementById("popup-overlay-veil-OBJ").remove(); + document.getElementById(activePopupWinId).style.display = "none"; + activePopupWinId = ""; +} diff --git a/assets/js/common.js b/assets/js/common.js new file mode 100644 index 0000000..637b0b6 --- /dev/null +++ b/assets/js/common.js @@ -0,0 +1,77 @@ +let dopDopYesYes = (ign) => {}; + +function sleep(ms){ + return new Promise(res => setTimeout(res, ms)); +} + +async function apiRequest(type, req){ + let A = await fetch("/api/" + type, + {method: 'POST', body: JSON.stringify(req)}); + let B = await A.json(); + if (B.status !== 0) + throw Error("Server returned non-zero status"); + return B; +} + +/* Framework for pages with mainloop (it can be npt only polling, but also literally anything else */ +let __mainloopDelayMs = 3000; +let mainloopTimeout = null; +let __guestMainloopPollerAction = null; +function setMainloopTimeout(){ + if (mainloopTimeout !== null) + return; + mainloopTimeout = setTimeout(mainloopPoller, __mainloopDelayMs); +} +function cancelMainloopTimeout(){ + if (mainloopTimeout === null){ + console.log("cancelling nothing") + return; + } + clearTimeout(mainloopTimeout); + mainloopTimeout = null; +} +function mainloopPoller(){ + mainloopTimeout = null; + try { + if (__guestMainloopPollerAction) + __guestMainloopPollerAction(); + } catch (error){ + console.log(error) + } + setMainloopTimeout(); +} + +// 1 +const userChatRoleAdmin = "admin"; +// 2 +const userChatRoleRegular = "regular"; +// 3 +const userChatRoleReadOnly = "read-only"; +// 4 +const userChatRoleDeleted = "not-a-member"; + +function roleToColor(role) { + if (role === userChatRoleAdmin) { + return "#aafff3"; + } else if (role === userChatRoleRegular){ + return "#ffffff"; + + } else if (role === userChatRoleReadOnly){ + return "#bfb2b2"; + } else if (role === userChatRoleDeleted) { + return "#fb4a4a"; + } + return "#286500" // Bug +} + +function hideHTMLElement(el){ + el.style.display = "none"; +} + +function showHTMLElement(el){ + el.style.display = "block"; +} + +function setElementVisibility(el, isVisible, howVisible = "block"){ + el.style.display = isVisible ? howVisible : "none"; +} \ No newline at end of file diff --git a/assets/js/profile.js b/assets/js/profile.js deleted file mode 100644 index fc92988..0000000 --- a/assets/js/profile.js +++ /dev/null @@ -1,10 +0,0 @@ -document.getElementById('fileInput').addEventListener('change', function(event) { - const file = event.target.files[0]; - if (file) { - const reader = new FileReader(); - reader.onload = function(e) { - document.getElementById('avatar').src = e.target.result; - }; - reader.readAsDataURL(file); - } -}); \ No newline at end of file