From f9083edfc473a5d64c2d05a0f7da2630d2bacb00 Mon Sep 17 00:00:00 2001 From: celestora Date: Mon, 12 Dec 2022 01:23:42 +0200 Subject: [PATCH] Add l-lacker social-styled page backrops (#805) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit чокопай --- Web/Models/Entities/Club.php | 1 + Web/Models/Entities/Traits/TBackDrops.php | 44 ++++++++++++ Web/Models/Entities/User.php | 3 +- Web/Presenters/GroupPresenter.php | 42 +++++++++++- Web/Presenters/UserPresenter.php | 27 +++++++- Web/Presenters/templates/@layout.xml | 6 ++ Web/Presenters/templates/Group/Edit.xml | 5 ++ .../templates/Group/EditBackdrop.xml | 63 ++++++++++++++++++ Web/Presenters/templates/Group/Followers.xml | 5 ++ Web/Presenters/templates/Group/Statistics.xml | 5 ++ Web/Presenters/templates/Group/View.xml | 1 + Web/Presenters/templates/User/Edit.xml | 46 +++++++++++-- Web/Presenters/templates/User/View.xml | 4 ++ Web/routes.yml | 2 + Web/static/css/style.css | 48 +++++++++++++ Web/static/img/backdrop-editor.gif | Bin 0 -> 23161 bytes install/sqls/00035-backdrops.sql | 7 ++ locales/en.strings | 13 ++++ locales/ru.strings | 12 ++++ 19 files changed, 327 insertions(+), 7 deletions(-) create mode 100644 Web/Models/Entities/Traits/TBackDrops.php create mode 100644 Web/Presenters/templates/Group/EditBackdrop.xml create mode 100644 Web/static/img/backdrop-editor.gif create mode 100644 install/sqls/00035-backdrops.sql diff --git a/Web/Models/Entities/Club.php b/Web/Models/Entities/Club.php index a5a3027b..db5baa88 100644 --- a/Web/Models/Entities/Club.php +++ b/Web/Models/Entities/Club.php @@ -360,5 +360,6 @@ class Club extends RowModel return $this->getRecord()->alert; } + use Traits\TBackDrops; use Traits\TSubscribable; } diff --git a/Web/Models/Entities/Traits/TBackDrops.php b/Web/Models/Entities/Traits/TBackDrops.php new file mode 100644 index 00000000..cab67138 --- /dev/null +++ b/Web/Models/Entities/Traits/TBackDrops.php @@ -0,0 +1,44 @@ +getRecord()->backdrop_1; + $photo2 = $this->getRecord()->backdrop_2; + if(is_null($photo1) && is_null($photo2)) + return NULL; + + $photo1obj = $photo2obj = NULL; + if(!is_null($photo1)) + $photo1obj = (new Photos)->get($photo1); + if(!is_null($photo2)) + $photo2obj = (new Photos)->get($photo2); + + if(is_null($photo1obj) && is_null($photo2obj)) + return NULL; + + return [ + is_null($photo1obj) ? "" : $photo1obj->getURL(), + is_null($photo2obj) ? "" : $photo2obj->getURL(), + ]; + } + + function setBackDropPictures(?Photo $first, ?Photo $second): void + { + if(!is_null($first)) + $this->stateChanges("backdrop_1", $first->getId()); + + if(!is_null($second)) + $this->stateChanges("backdrop_2", $second->getId()); + } + + function unsetBackDropPictures(): void + { + $this->stateChanges("backdrop_1", NULL); + $this->stateChanges("backdrop_2", NULL); + } +} \ No newline at end of file diff --git a/Web/Models/Entities/User.php b/Web/Models/Entities/User.php index 59cb33ad..31d8f4c8 100644 --- a/Web/Models/Entities/User.php +++ b/Web/Models/Entities/User.php @@ -5,7 +5,7 @@ use openvk\Web\Themes\{Themepack, Themepacks}; use openvk\Web\Util\DateTime; use openvk\Web\Models\RowModel; use openvk\Web\Models\Entities\{Photo, Message, Correspondence, Gift}; -use openvk\Web\Models\Repositories\{Users, Clubs, Albums, Gifts, Notifications}; +use openvk\Web\Models\Repositories\{Photos, Users, Clubs, Albums, Gifts, Notifications}; use openvk\Web\Models\Exceptions\InvalidUserNameException; use Nette\Database\Table\ActiveRow; use Chandler\Database\DatabaseConnection; @@ -1044,5 +1044,6 @@ class User extends RowModel return true; } + use Traits\TBackDrops; use Traits\TSubscribable; } diff --git a/Web/Presenters/GroupPresenter.php b/Web/Presenters/GroupPresenter.php index 00d74c2e..a0b83a59 100644 --- a/Web/Presenters/GroupPresenter.php +++ b/Web/Presenters/GroupPresenter.php @@ -1,6 +1,7 @@ willExecuteWriteAction(); $club = $this->clubs->get($id); - if(!$club->canBeModifiedBy($this->user->identity)) + if(!$club || !$club->canBeModifiedBy($this->user->identity)) $this->notFound(); else $this->template->club = $club; @@ -250,6 +251,45 @@ final class GroupPresenter extends OpenVKPresenter } } + function renderEditBackdrop(int $id): void + { + $this->assertUserLoggedIn(); + $this->willExecuteWriteAction(); + + $club = $this->clubs->get($id); + if(!$club || !$club->canBeModifiedBy($this->user->identity)) + $this->notFound(); + else + $this->template->club = $club; + + if($_SERVER["REQUEST_METHOD"] !== "POST") + return; + + if($this->postParam("subact") === "remove") { + $club->unsetBackDropPictures(); + $club->save(); + $this->flashFail("succ", tr("backdrop_succ_rem"), tr("backdrop_succ_desc")); # will exit + } + + $pic1 = $pic2 = NULL; + try { + if($_FILES["backdrop1"]["error"] !== UPLOAD_ERR_NO_FILE) + $pic1 = Photo::fastMake($this->user->id, "Profile backdrop (system)", $_FILES["backdrop1"]); + + if($_FILES["backdrop2"]["error"] !== UPLOAD_ERR_NO_FILE) + $pic2 = Photo::fastMake($this->user->id, "Profile backdrop (system)", $_FILES["backdrop2"]); + } catch(InvalidStateException $e) { + $this->flashFail("err", tr("backdrop_error_title"), tr("backdrop_error_no_media")); + } + + if($pic1 == $pic2 && is_null($pic1)) + $this->flashFail("err", tr("backdrop_error_title"), tr("backdrop_error_no_media")); + + $club->setBackDropPictures($pic1, $pic2); + $club->save(); + $this->flashFail("succ", tr("backdrop_succ"), tr("backdrop_succ_desc")); + } + function renderStatistics(int $id): void { $this->assertUserLoggedIn(); diff --git a/Web/Presenters/UserPresenter.php b/Web/Presenters/UserPresenter.php index 3acabc84..3cf68757 100644 --- a/Web/Presenters/UserPresenter.php +++ b/Web/Presenters/UserPresenter.php @@ -1,5 +1,6 @@ setFav_Books(empty($this->postParam("fav_books")) ? NULL : ovk_proc_strtr($this->postParam("fav_books"), 300)); $user->setFav_Quote(empty($this->postParam("fav_quote")) ? NULL : ovk_proc_strtr($this->postParam("fav_quote"), 300)); $user->setAbout(empty($this->postParam("about")) ? NULL : ovk_proc_strtr($this->postParam("about"), 300)); + } elseif($_GET["act"] === "backdrop") { + if($this->postParam("subact") === "remove") { + $user->unsetBackDropPictures(); + $user->save(); + $this->flashFail("succ", tr("backdrop_succ_rem"), tr("backdrop_succ_desc")); # will exit + } + + $pic1 = $pic2 = NULL; + try { + if($_FILES["backdrop1"]["error"] !== UPLOAD_ERR_NO_FILE) + $pic1 = Photo::fastMake($user->getId(), "Profile backdrop (system)", $_FILES["backdrop1"]); + + if($_FILES["backdrop2"]["error"] !== UPLOAD_ERR_NO_FILE) + $pic2 = Photo::fastMake($user->getId(), "Profile backdrop (system)", $_FILES["backdrop2"]); + } catch(InvalidStateException $e) { + $this->flashFail("err", tr("backdrop_error_title"), tr("backdrop_error_no_media")); + } + + if($pic1 == $pic2 && is_null($pic1)) + $this->flashFail("err", tr("backdrop_error_title"), tr("backdrop_error_no_media")); + + $user->setBackDropPictures($pic1, $pic2); + $user->save(); + $this->flashFail("succ", tr("backdrop_succ"), tr("backdrop_succ_desc")); } elseif($_GET['act'] === "status") { if(mb_strlen($this->postParam("status")) > 255) { $statusLength = (string) mb_strlen($this->postParam("status")); @@ -235,7 +260,7 @@ final class UserPresenter extends OpenVKPresenter } $this->template->mode = in_array($this->queryParam("act"), [ - "main", "contacts", "interests", "avatar" + "main", "contacts", "interests", "avatar", "backdrop" ]) ? $this->queryParam("act") : "main"; diff --git a/Web/Presenters/templates/@layout.xml b/Web/Presenters/templates/@layout.xml index 9b5b9de1..8cff0bb8 100644 --- a/Web/Presenters/templates/@layout.xml +++ b/Web/Presenters/templates/@layout.xml @@ -49,6 +49,12 @@
+ {if isset($backdrops) && !is_null($backdrops)} +
+
+
+ {/if} +
⬆ {_to_top}
diff --git a/Web/Presenters/templates/Group/Edit.xml b/Web/Presenters/templates/Group/Edit.xml index 6eb763ee..ce9a8f04 100644 --- a/Web/Presenters/templates/Group/Edit.xml +++ b/Web/Presenters/templates/Group/Edit.xml @@ -12,6 +12,11 @@ {_main} +
+ + {_backdrop_short} + +
{_followers} diff --git a/Web/Presenters/templates/Group/EditBackdrop.xml b/Web/Presenters/templates/Group/EditBackdrop.xml new file mode 100644 index 00000000..f5127e9a --- /dev/null +++ b/Web/Presenters/templates/Group/EditBackdrop.xml @@ -0,0 +1,63 @@ +{extends "../@layout.xml"} +{var $backdrops = $club->getBackDropPictureURLs()} + +{block title}{$club->getName()} | {_backdrop}{/block} + +{block header} +{$club->getName()} » {_backdrop} +{/block} + +{block content} + + +
+

{_backdrop}

+

{_backdrop_desc}

+
+
+
+ +
+ +
+
+ +

+ {_backdrop_warn} +

+

+ {_backdrop_about_adding} +

+


+ + +
+
+ + +
+
+
+
+{/block} diff --git a/Web/Presenters/templates/Group/Followers.xml b/Web/Presenters/templates/Group/Followers.xml index ee2cd5ab..5e2b09b0 100644 --- a/Web/Presenters/templates/Group/Followers.xml +++ b/Web/Presenters/templates/Group/Followers.xml @@ -23,6 +23,11 @@ {_main}
+
+ + {_backdrop_short} + +
{_followers} diff --git a/Web/Presenters/templates/Group/Statistics.xml b/Web/Presenters/templates/Group/Statistics.xml index 470d14e5..c005c663 100644 --- a/Web/Presenters/templates/Group/Statistics.xml +++ b/Web/Presenters/templates/Group/Statistics.xml @@ -12,6 +12,11 @@ {_main}
+
+ + {_backdrop_short} + +
{_followers} diff --git a/Web/Presenters/templates/Group/View.xml b/Web/Presenters/templates/Group/View.xml index dc223af1..e09e3f5f 100644 --- a/Web/Presenters/templates/Group/View.xml +++ b/Web/Presenters/templates/Group/View.xml @@ -1,4 +1,5 @@ {extends "../@layout.xml"} +{var $backdrops = $club->getBackDropPictureURLs()} {block title}{$club->getName()}{/block} diff --git a/Web/Presenters/templates/User/Edit.xml b/Web/Presenters/templates/User/Edit.xml index 18703fcf..b74f04b3 100644 --- a/Web/Presenters/templates/User/Edit.xml +++ b/Web/Presenters/templates/User/Edit.xml @@ -1,4 +1,8 @@ {extends "../@layout.xml"} +{if $mode === 'backdrop'} + {var $backdrops = $user->getBackDropPictureURLs()} +{/if} + {block title}{_edit_page}{/block} {block header} @@ -6,11 +10,12 @@ {/block} {block content} + {var $isMain = $mode === 'main'} + {var $isContacts = $mode === 'contacts'} + {var $isInterests = $mode === 'interests'} + {var $isAvatar = $mode === 'avatar'} + {var $isBackDrop = $mode === 'backdrop'} -{var $isMain = $mode === 'main'} -{var $isContacts = $mode === 'contacts'} -{var $isInterests = $mode === 'interests'} -{var $isAvatar = $mode === 'avatar'}
@@ -326,6 +334,36 @@ + {elseif $isBackDrop} + +

{_backdrop}

+

{_backdrop_desc}

+
+
+
+ +
+ +
+
+ +

+ {_backdrop_warn} +

+

+ {_backdrop_about_adding} +

+


+ + +
+
+ + +
+
+
+ {/if}
diff --git a/Web/Presenters/templates/User/View.xml b/Web/Presenters/templates/User/View.xml index a0619a16..61acc215 100644 --- a/Web/Presenters/templates/User/View.xml +++ b/Web/Presenters/templates/User/View.xml @@ -1,5 +1,9 @@ {extends "../@layout.xml"} +{if !$user->isBanned()} + {var $backdrops = $user->getBackDropPictureURLs()} +{/if} + {block title}{$user->getCanonicalName()}{/block} {block headIncludes} diff --git a/Web/routes.yml b/Web/routes.yml index d3dcbc83..e5639a08 100644 --- a/Web/routes.yml +++ b/Web/routes.yml @@ -187,6 +187,8 @@ routes: club: "club|public|event" - url: "/club{num}/edit" handler: "Group->edit" + - url: "/club{num}/backdrop" + handler: "Group->editBackdrop" - url: "/club{num}/stats" handler: "Group->statistics" - url: "/club{num}/followers" diff --git a/Web/static/css/style.css b/Web/static/css/style.css index 7f17adf4..e6796082 100644 --- a/Web/static/css/style.css +++ b/Web/static/css/style.css @@ -190,6 +190,54 @@ p { border-top: 1px solid #CCCCCC; } +#backdrop { + position: fixed; + top: 0; + bottom: 0; + right: 0; + left: 0; + z-index: -100; + background-repeat: no-repeat; + background-size: contain; + background-position: center left, center right; + pointer-events: none; + opacity: .8; +} + +#backdropDripper { + width: 800px; + height: 100%; + margin: auto; + background-color: #fff; + box-shadow: -30px 0px 20px 20px #fff, -50px 0px 20px 20px hsl(0deg 0% 100% / 59%), -70px 0px 20px 20px hsl(0deg 0% 100% / 43%), -90px 0px 20px 20px hsl(0deg 0% 100% / 35%), -110px 0px 20px 20px hsl(0deg 0% 100% / 28%), -130px 0px 20px 20px hsl(0deg 0% 100% / 16%), 30px 0px 20px 20px #fff, 50px 0px 20px 20px hsl(0deg 0% 100% / 59%), 70px 0px 20px 20px hsl(0deg 0% 100% / 43%), 90px 0px 20px 20px hsl(0deg 0% 100% / 35%), 110px 0px 20px 20px hsl(0deg 0% 100% / 28%), 130px 0px 20px 20px hsl(0deg 0% 100% / 16%); +} + +#backdropEditor { + position: relative; + border: 4px inset #cfcfcf; + padding: 8px; + width: 550px; + height: 270px; + margin: 8px auto; + background-image: url("../img/backdrop-editor.gif"); + background-size: cover; +} + +#backdropFilePicker { + position: absolute; + top: 140px; + padding: 0 19px; +} + +#backdropFilePicker > input { + width: 90px; +} + +#backdropFilePicker > #spacer { + display: inline-block; + width: calc(550px - 16px - 38px - 171px); +} + .page_body { width: 632px; float: right; diff --git a/Web/static/img/backdrop-editor.gif b/Web/static/img/backdrop-editor.gif new file mode 100644 index 0000000000000000000000000000000000000000..1b891403580e9b35111ca618f357c923a1e6f128 GIT binary patch literal 23161 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 I(F6nlJ7`AQMF0Q* literal 0 HcmV?d00001 diff --git a/install/sqls/00035-backdrops.sql b/install/sqls/00035-backdrops.sql new file mode 100644 index 00000000..c8014e82 --- /dev/null +++ b/install/sqls/00035-backdrops.sql @@ -0,0 +1,7 @@ +ALTER TABLE `profiles` + ADD COLUMN `backdrop_1` BIGINT UNSIGNED NULL DEFAULT NULL AFTER `birthday_privacy`, + ADD COLUMN `backdrop_2` BIGINT UNSIGNED NULL DEFAULT NULL AFTER `backdrop_1`; + +ALTER TABLE `groups` + ADD COLUMN `backdrop_1` BIGINT UNSIGNED NULL DEFAULT NULL AFTER `alert`, + ADD COLUMN `backdrop_2` BIGINT UNSIGNED NULL DEFAULT NULL AFTER `backdrop_1`; diff --git a/locales/en.strings b/locales/en.strings index 5a2c7e71..0fc7fa97 100644 --- a/locales/en.strings +++ b/locales/en.strings @@ -531,6 +531,19 @@ "end_all_sessions_done" = "All sessions was ended, including mobile apps"; +"backdrop_short" = "Backdrop"; +"backdrop" = "Page backdrop"; +"backdrop_desc" = "Вы можете установить два изображения в качестве фона вашей страницы. Они будут отображаться по бокам у тех, кто зайдёт на вашу страницу. С помощью этой возможности вы можете добавить своему профилю больше индивидуальности."; +"backdrop_warn" = "You can set two pictures as your profile or group backdrop. They will be displayed on left and right edges of page. You can customize your profile with this feature, but use it responsibly." +"backdrop_about_adding" = "You can upload only one picture, although depending on design, the ending result may look ugly. You can also change only one pic: if you already have two images set up and you want to change one - upload only one, the other won't be removed. To remove both images press the button below, you can't remove pictures individually." +"backdrop_save" = "Save backdrop picture(s)"; +"backdrop_remove" = "Remove all backdrop pictures"; +"backdrop_error_title" = "Error saving backdrop settings"; +"backdrop_error_no_media" = "Images are corrupted or haven't been uploaded in their entirety"; +"backdrop_succ" = "Backdrop settings saved"; +"backdrop_succ_rem" = "Backdrop images have been removed"; +"backdrop_succ_desc" = "Users will start seeing changes in 5 minutes."; + /* Two-factor authentication */ "two_factor_authentication" = "Two-factor authentication"; diff --git a/locales/ru.strings b/locales/ru.strings index 75adf21f..9fa6284a 100644 --- a/locales/ru.strings +++ b/locales/ru.strings @@ -491,6 +491,18 @@ "end_all_sessions" = "Сбросить все сессии"; "end_all_sessions_description" = "Если вы хотите выйти из $1 со всех устройств, нажмите на кнопку ниже"; "end_all_sessions_done" = "Все сессии сброшены, включая мобильные приложения"; +"backdrop_short" = "Фон"; +"backdrop" = "Фон страницы"; +"backdrop_desc" = "Вы можете установить два изображения в качестве фона вашей страницы. Они будут отображаться по бокам у тех, кто зайдёт на вашу страницу. С помощью этой возможности вы можете добавить своему профилю больше индивидуальности."; +"backdrop_warn" = "Изображения будут расположены так, как на схеме выше, их высота будет автоматически увеличена чтобы они занимали 100% высоты экрана, посередине будет размытие, заменить фон основного интерфейса OpenVK или добавить аудиозапись нельзя."; +"backdrop_about_adding" = "Вы можете установить только 1 изображение (но будет некрасиво), а так же заменить только одно: если у вас уже стоит два, а вы хотите заменить второе - то загружайте только второе, первое сохранится, а чтобы удалить надо нажать на соответствующую кнопку внизу, удалять по одной нельзя."; +"backdrop_save" = "Сохранить фон"; +"backdrop_remove" = "Удалить фон"; +"backdrop_error_title" = "Не удалось сохранить фон"; +"backdrop_error_no_media" = "Изображения повреждены или загружены не полностью"; +"backdrop_succ" = "Фон сохранён"; +"backdrop_succ_rem" = "Фон удалён"; +"backdrop_succ_desc" = "Изменения будут заметны другим пользователям через 5 минут."; /* Two-factor authentication */