diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 35caf56968..d801b623e1 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -68,7 +68,7 @@ private function getActivities(): array { $this->activity->pushCriteria(new OnlyThoseForumsWithAccess($this->auth)); $this->activity->pushCriteria(new SkipHiddenCategories($this->userId)); - return ActivityResource::collection($this->activity->latest(20)) + return ActivityResource::collection($this->activity->latest(30)) ->toArray($this->request); } diff --git a/app/Http/Resources/ActivityResource.php b/app/Http/Resources/ActivityResource.php index 1679bf8bf0..768e91fe35 100644 --- a/app/Http/Resources/ActivityResource.php +++ b/app/Http/Resources/ActivityResource.php @@ -38,6 +38,8 @@ public function toArray($request): array 'headline' => $this->headline(), 'user_id' => $this->user_id, 'object' => $this->objectType(), + 'type' => $this->objectType(), + 'icon' => $this->icon(), 'user' => ['photo' => $this->user_id ? $this->user->photo : ''] ]; } @@ -47,6 +49,15 @@ private function objectType(): string return [Post::class => 'post', Comment::class => 'comment'][$this->content_type]; } + private function icon(): string + { + $icons = [ + Comment::class => 'far fa-comment', + Post::class => 'fas fa-quote-right', + ]; + return $icons[$this->content_type]; + } + public function headline(): string { return trans("activity.headline.{$this->objectType()}", [ diff --git a/app/Listeners/ActivitySubscriber.php b/app/Listeners/ActivitySubscriber.php index ce104223de..1f632e113f 100644 --- a/app/Listeners/ActivitySubscriber.php +++ b/app/Listeners/ActivitySubscriber.php @@ -29,27 +29,34 @@ public function onPostSaved(PostSaved $event) 'user_id' => $event->post->user_id, 'forum_id' => $event->post->forum_id, 'topic_id' => $event->post->topic_id, - 'excerpt' => excerpt($event->post->html), + 'excerpt' => excerpt($event->post->html, 120), 'user_name' => $event->post->user_name ]); } - public function onPostDeleted(PostWasDeleted $event) + public function onPostDeleted(PostWasDeleted $event): void { - $this->activity->where('content_id', $event->post['id'])->where('content_type', Post::class)->delete(); + $this->activity + ->where('content_id', $event->post['id']) + ->where('content_type', Post::class) + ->delete(); } - public function onTopicDeleted(TopicDeleted $event) + public function onTopicDeleted(TopicDeleted $event): void { - $this->activity->where('topic_id', $event->topic['id'])->delete(); + $this->activity + ->where('topic_id', $event->topic['id']) + ->delete(); } - public function onTopicMoved(TopicMoved $event) + public function onTopicMoved(TopicMoved $event): void { - $this->activity->where('topic_id', $event->topic['id'])->update(['forum_id' => $event->topic['forum_id']]); + $this->activity + ->where('topic_id', $event->topic['id']) + ->update(['forum_id' => $event->topic['forum_id']]); } - public function onCommentSaved(CommentSaved $event) + public function onCommentSaved(CommentSaved $event): void { // post was removed? if (!$event->comment->post) { @@ -67,9 +74,12 @@ public function onCommentSaved(CommentSaved $event) ]); } - public function onCommentDeleted(CommentDeleted $event) + public function onCommentDeleted(CommentDeleted $event): void { - $this->activity->where('content_id', $event->comment['id'])->where('content_type', Post\Comment::class)->delete(); + $this->activity + ->where('content_id', $event->comment['id']) + ->where('content_type', Post\Comment::class) + ->delete(); } public function subscribe(Dispatcher $dispatcher): void diff --git a/app/Repositories/Contracts/ActivityRepositoryInterface.php b/app/Repositories/Contracts/ActivityRepositoryInterface.php index 39c683e2e7..431f5e6e7b 100644 --- a/app/Repositories/Contracts/ActivityRepositoryInterface.php +++ b/app/Repositories/Contracts/ActivityRepositoryInterface.php @@ -1,18 +1,9 @@ applyCriteria(function () use ($limit) { - return $this - ->model - ->select() - ->join('forums', 'forums.id', '=', 'forum_id') - ->with(['content', 'forum']) - ->with(['topic' => function ($builder) { - return $builder->withTrashed(); - }]) - ->with(['user' => function ($builder) { - return $builder->withTrashed(); - }]) - ->latest() - ->limit($limit) - ->get(); - }); + return $this->applyCriteria(fn() => $this + ->model + ->select() + ->join('forums', 'forums.id', '=', 'forum_id') + ->with(['content', 'forum']) + ->with(['topic' => fn($builder) => $builder->withTrashed()]) + ->with(['user' => fn($builder) => $builder->withTrashed()]) + ->latest() + ->limit($limit) + ->get()); } } diff --git a/resources/js/pages/homepage.js b/resources/js/pages/homepage.js index a0b45df61f..4a0e8d61f7 100644 --- a/resources/js/pages/homepage.js +++ b/resources/js/pages/homepage.js @@ -1,11 +1,10 @@ -import PerfectScrollbar from 'perfect-scrollbar'; import Vue from "vue"; import VueNotifications from "vue-notification"; import VueMicroblog from "../components/microblog/microblog"; import store from "../store"; import {mapGetters} from "vuex"; import axios from 'axios'; -import { default as LiveMixin } from './microblog/live'; +import {default as LiveMixin} from './microblog/live'; import VueModals from "@/plugins/modals"; import VuePaste from '@/plugins/paste'; @@ -39,8 +38,6 @@ function switchReputationTab(index) { } (function () { - new PerfectScrollbar(document.getElementById('stream')); - let tabs = document.querySelectorAll('#forum-tabs .nav-link'); for (let i = 0; i < tabs.length; i++) { diff --git a/resources/lang/pl/activity.php b/resources/lang/pl/activity.php index 78e7019d05..9c39a2a0e1 100644 --- a/resources/lang/pl/activity.php +++ b/resources/lang/pl/activity.php @@ -2,7 +2,7 @@ return [ 'headline' => [ - 'post' => ':user dodał post w :topic', - 'comment' => ':user dodał komentarz w :topic', + 'post' => ':user dodał post w :topic', + 'comment' => ':user dodał komentarz w :topic', ] ]; diff --git a/resources/sass/helpers/_sprites.scss b/resources/sass/helpers/_sprites.scss index 25d1b144aa..417981b05e 100644 --- a/resources/sass/helpers/_sprites.scss +++ b/resources/sass/helpers/_sprites.scss @@ -1,16 +1,16 @@ $sprites: ( - 'logo-php': "/img/sprites-4c0d3e0f0fbb5883.svg#sprite-logo-php-fragment", - 'logo-java': "/img/sprites-4c0d3e0f0fbb5883.svg#sprite-logo-java-fragment", - 'logo-javascript': "/img/sprites-4c0d3e0f0fbb5883.svg#sprite-logo-javascript-fragment", - 'logo-cpp': "/img/sprites-4c0d3e0f0fbb5883.svg#sprite-logo-cpp-fragment", - 'logo-csharp': "/img/sprites-4c0d3e0f0fbb5883.svg#sprite-logo-csharp-fragment", - 'logo-css': "/img/sprites-4c0d3e0f0fbb5883.svg#sprite-logo-css-fragment", - 'logo-android': "/img/sprites-4c0d3e0f0fbb5883.svg#sprite-logo-android-fragment", - 'logo-lazarus': "/img/sprites-4c0d3e0f0fbb5883.svg#sprite-logo-lazarus-fragment", - 'logo-postgresql': "/img/sprites-4c0d3e0f0fbb5883.svg#sprite-logo-postgresql-fragment", - 'logo-rust': "/img/sprites-4c0d3e0f0fbb5883.svg#sprite-logo-rust-fragment", - 'logo-go': "/img/sprites-4c0d3e0f0fbb5883.svg#sprite-logo-go-fragment", - 'logo-unity': "/img/sprites-4c0d3e0f0fbb5883.svg#sprite-logo-unity-fragment" + 'logo-php': "/img/sprites-3e9aacb8140a6312.svg#sprite-logo-php-fragment", + 'logo-java': "/img/sprites-3e9aacb8140a6312.svg#sprite-logo-java-fragment", + 'logo-javascript': "/img/sprites-3e9aacb8140a6312.svg#sprite-logo-javascript-fragment", + 'logo-cpp': "/img/sprites-3e9aacb8140a6312.svg#sprite-logo-cpp-fragment", + 'logo-csharp': "/img/sprites-3e9aacb8140a6312.svg#sprite-logo-csharp-fragment", + 'logo-css': "/img/sprites-3e9aacb8140a6312.svg#sprite-logo-css-fragment", + 'logo-android': "/img/sprites-3e9aacb8140a6312.svg#sprite-logo-android-fragment", + 'logo-lazarus': "/img/sprites-3e9aacb8140a6312.svg#sprite-logo-lazarus-fragment", + 'logo-postgresql': "/img/sprites-3e9aacb8140a6312.svg#sprite-logo-postgresql-fragment", + 'logo-rust': "/img/sprites-3e9aacb8140a6312.svg#sprite-logo-rust-fragment", + 'logo-go': "/img/sprites-3e9aacb8140a6312.svg#sprite-logo-go-fragment", + 'logo-unity': "/img/sprites-3e9aacb8140a6312.svg#sprite-logo-unity-fragment" ); $sizes: ( diff --git a/resources/sass/pages/_homepage.scss b/resources/sass/pages/_homepage.scss index e53ce0d314..24d0ad3d17 100644 --- a/resources/sass/pages/_homepage.scss +++ b/resources/sass/pages/_homepage.scss @@ -40,26 +40,9 @@ } #box-forum { - #stream-wrapper { - background: url('/img/stream-last-feed.png') no-repeat; - padding-top: 25px; - padding-left: 2px; - - @include media-breakpoint-down(lg) { - margin-top: 20px; - background-position-x: 10px; - padding-left: 15px; - } - } - - #stream { - height: 365px; - position: relative; - overflow: hidden; - - @include media-breakpoint-down(sm) { - padding-left: 15px; - } + > h2 { + color: $box-header-color; + font-size: 110%; } #box-forum-headline { @@ -105,8 +88,15 @@ font-size: 10px; } } +} + +#timeline { + > h2 { + color: $box-header-color; + font-size: 110%; + } - .overview { + .activities { border-left: 1px solid $card-border-color; margin: 10px 0 0 10px; @@ -114,88 +104,123 @@ border-left: none; margin-left: 0; } - } - .media { - padding: 0 0 0 20px; - font-size: 11px; - position: relative; - overflow: visible; + .activity { + padding: 0 0 0 20px; + font-size: 11px; + position: relative; - &:not(:first-child) { - margin-top: 15px; - } + &:not(:first-child) { + margin-top: 15px; + } - span { - box-shadow: 0 1px 2px #CCC; - border-radius: 50%; - border: 1px solid $card-border-color; - background: #fff; - position: absolute; - width: 20px; - height: 20px; - left: -11px; - top: 8px; - - &:after { - font-family: 'Font Awesome 5 Free'; - display: block; - margin-top: 1px; - text-align: center; - color: $gray-light; + @include media-breakpoint-down(sm) { + padding: 0; } - &::selection { - text-shadow: none; + span.icon { + display: none; + @extend .d-sm-block; + box-shadow: 0 1px 2px #CCC; + border-radius: 50%; + border: 1px solid $card-border-color; + background: #fff; + position: absolute; + width: 20px; + height: 20px; + left: -11px; + z-index: 1; + + &.post { + top: 10px; + } + + &.comment { + top: 5px; + } + + i { + display: none; + @extend .d-sm-block; + text-align: center; + margin-top: 1px; + line-height: 18px; + color: $gray-light; + } + + &::selection { + text-shadow: none; + } } - } - span.microblog:after { - content: fa-content($fa-var-male); - } + .item { + display: flex; + flex-direction: column; + word-wrap: break-word; + background-color: white; + border: 1px solid #ddd; + border-radius: 0.25rem; + padding: 0; + + @extend .col-md-12; + @extend .col-lg-10; + + &.post { + margin-bottom: 18px; + } + + &.comment { + margin-bottom: 14px; + background-color: transparent; + border: none; + padding: 0; + + @extend .col-sm-10; + @extend .ml-1; + } - span.comment:after { - content: fa-content($fa-var-comments); - } + .body { + display: flex; + + a img.user-avatar { + border: 1px solid #d0d0d0; + box-shadow: 0 2px 2px rgba(0, 0, 0, 0.1); + width: 38px; + height: 38px; + background: #fff; + padding: 2px; + border-radius: 3px; + } + + small { + color: #7d7d7d; + } + } - span.topic:after { - content: fa-content($fa-var-file); - font-weight: 400; - } + &.post .body { + @extend .p-2; + } - span.post:after { - content: fa-content($fa-var-file-alt); - } + &.comment .body { + padding: 0; + } - @include media-breakpoint-down(sm) { - padding: 0; - } - } + > p { + font-family: "Open Sans", sans-serif; + } - .media-body { - p { - margin: 0; - @include text-truncate(); - } + &.post > p { + margin: 0 10px 5px; + } - strong { - font-weight: normal; - border-left: 1px solid $card-border-color; - padding: 0 0 0 10px; - margin: 10px 0 0 1px; - display: block; - font-family: "Open Sans", sans-serif; + &.comment > p { + margin: 0 3rem; + border-left: 1px solid $card-border-color; + padding: 0 0 0 10px; + } + } } } - - .media-object { - border: 1px solid #d0d0d0; - box-shadow: 0 2px 2px rgba(0, 0, 0, 0.1); - width: 32px; - background: #fff; - padding: 2px; - border-radius: 3px; - } } .patronage-body { diff --git a/resources/sass/vendor/_font-awesome.scss b/resources/sass/vendor/_font-awesome.scss index ca836ee833..3e8a2f09d4 100644 --- a/resources/sass/vendor/_font-awesome.scss +++ b/resources/sass/vendor/_font-awesome.scss @@ -3,7 +3,7 @@ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ -$fa-font-path: "/fonts/font-awesome" !default; +$fa-font-path: "/fonts/font-awesome" !default; @import "~@fortawesome/fontawesome-free/scss/fontawesome"; @import "~@fortawesome/fontawesome-free/scss/solid"; diff --git a/resources/views/home.twig b/resources/views/home.twig index b361b74656..36704e01a8 100644 --- a/resources/views/home.twig +++ b/resources/views/home.twig @@ -20,22 +20,27 @@
-
-
-

Co nowego na forum?

-
-
-
-
+

+ + Co nowego na forum? +

@@ -44,12 +49,13 @@ {% for topic in interesting %}
- {{ topic.views }} - {{ declination(topic.views, ['wyświetlenie', 'wyświetlenia', 'wyświetleń'], true) }} + {{ topic.views }} + {{ declination(topic.views, ['wyświetlenie', 'wyświetlenia', 'wyświetleń'], true) }}
- {{ topic.title }} + {{ topic.title }} {{ topic.forum }} {{ topic.last_post_created_at|format_date }}
@@ -61,12 +67,13 @@ {% for topic in newest %}
- {{ topic.views }} - {{ declination(topic.views, ['wyświetlenie', 'wyświetlenia', 'wyświetleń'], true) }} + {{ topic.views }} + {{ declination(topic.views, ['wyświetlenie', 'wyświetlenia', 'wyświetleń'], true) }}
- {{ topic.title }} + {{ topic.title }} {{ topic.forum }} {{ topic.last_post_created_at|format_date }}
@@ -76,52 +83,55 @@
+
+
+
+
-
-
-
- {% for activity in activities %} -
- - -
- - activity.user.name - -
-
-

{{ activity.headline|raw }}

- {{ activity.created_at|format_date }} - - {{ activity.excerpt }} -
-
- {% endfor %} +
+

+ + Oś czasu +

+
+
+ {% for activity in activities %} +
+ + + +
+
+
+ + activity.user.name + +
+
+

{{ activity.headline|raw }}

+ {{ activity.created_at|format_date }} +
+

{{ activity.excerpt }}

-
+ {% endfor %}
-
- -
-

Popularne wpisy na mikroblogu

- - - - -