diff --git a/app/Controllers/ActionController.php b/app/Controllers/ActionController.php index 23990214..958e24e0 100644 --- a/app/Controllers/ActionController.php +++ b/app/Controllers/ActionController.php @@ -15,7 +15,7 @@ class ActionController extends Controller $content_id = Request::getPostInt('content_id'); $type = Request::getPost('type'); - $allowed = ['post', 'comment', 'answer', 'reply', 'item']; + $allowed = ['post', 'comment', 'reply', 'item']; if (!in_array($type, $allowed)) { return false; } @@ -23,6 +23,7 @@ class ActionController extends Controller // Access check // Проверка доступа $info_type = ActionModel::getInfoTypeContent($content_id, $type); + if (Access::author($type, $info_type) == false) { redirect('/'); } @@ -37,11 +38,6 @@ class ActionController extends Controller $url = post_slug($info_type['comment_post_id'], $post['post_slug']) . '#comment_' . $info_type['comment_id']; $action_type = 'comment'; break; - case 'answer': - $post = PostModel::getPost($info_type['answer_post_id'], 'id', $this->user); - $url = post_slug($info_type['answer_post_id'], $post['post_slug']) . '#answer_' . $info_type['answer_id']; - $action_type = 'answer'; - break; case 'reply': $url = '/'; $action_type = 'reply'; diff --git a/app/Controllers/Answer/AddAnswerController.php b/app/Controllers/Answer/AddAnswerController.php deleted file mode 100644 index 88281c09..00000000 --- a/app/Controllers/Answer/AddAnswerController.php +++ /dev/null @@ -1,97 +0,0 @@ -prohibitedContent($content); - - $this->union($post, $url_post, $content); - - $last_id = AnswerModel::add($post['post_id'], $content, $trigger); - - // Add an audit entry and an alert to the admin - // Аудит и оповещение персоналу - if ($trigger === false) { - (new \App\Services\Audit())->create('answer', $last_id, url('admin.audits')); - } - - $url = $url_post . '#answer_' . $last_id; - - $this->notif($content, $post, $url); - - ActionModel::addLogs( - [ - 'id_content' => $last_id, - 'action_type' => 'answer', - 'action_name' => 'added', - 'url_content' => $url, - ] - ); - - redirect($url); - } - - public function union($post, $url_post, $content) - { - if (config('publication.merge_answer_post') == false) { - return true; - } - - // Staff can write a response under their post - // Персонал может писать ответ под своим постом - if (UserData::checkAdmin()) { - return true; - } - - // If there are no replies to the post and the author of the post = the author of the answer, then add the answer to the end of the post - // Если ответов на пост нет и автор поста = автора ответа, то дописываем ответ в конец поста - if ((AnswerModel::getNumberAnswers($post['post_id']) == null) && ($post['post_user_id'] == $this->user['id'])) { - - AnswerModel::mergePost($post['post_id'], $content); - - redirect($url_post); - } - - return true; - } - - - // Notifications when adding a answer - // Уведомления при добавлении ответа - public function notif($content, $post, $url) - { - // Contact via @ - // Обращение через @ - if ($message = \App\Services\Parser\Content::parseUsers($content, true, true)) { - (new \App\Controllers\NotificationController())->mention(NotificationModel::TYPE_ADDRESSED_ANSWER, $message, $url, $post['post_user_id']); - } - - // Who is following this question/post - // Кто подписан на данный вопрос / пост - if ($focus_all = PostModel::getFocusUsersPost($post['post_id'])) { - foreach ($focus_all as $focus_user) { - if ($focus_user['signed_user_id'] != $this->user['id']) { - NotificationModel::send($focus_user['signed_user_id'], NotificationModel::TYPE_AMSWER_POST, $url); - } - } - } - } -} diff --git a/app/Controllers/Answer/EditAnswerController.php b/app/Controllers/Answer/EditAnswerController.php deleted file mode 100644 index 20cbea9b..00000000 --- a/app/Controllers/Answer/EditAnswerController.php +++ /dev/null @@ -1,74 +0,0 @@ -render( - '/answer/edit', - [ - 'meta' => Meta::get(__('app.edit_answer')), - 'data' => [ - 'post' => $post, - 'answer' => $answer, - 'user' => UserModel::getUser($answer['answer_user_id'], 'id'), - 'sheet' => 'edit-answers', - 'type' => 'answer', - ] - ] - ); - } - - public function change() - { - $answer_id = Request::getPostInt('answer_id'); - $content = $_POST['content']; // для Markdown - - // Access check - $answer = AnswerModel::getAnswerId($answer_id); - - if (Access::author('answer', $answer) == false) { - return false; - } - - $post = PostPresence::index($answer['answer_post_id'], 'id'); - - $url_post = post_slug($answer['answer_post_id'], $post['post_slug']); - - Validator::Length($content, 6, 5000, 'content', url('content.edit', ['type' => 'answer', 'id' => $answer['answer_id']])); - - AnswerModel::edit( - [ - 'answer_id' => $answer['answer_id'], - 'answer_content' => $content, - 'answer_user_id' => $this->selectAuthor($answer['answer_user_id'], Request::getPost('user_id')), - 'answer_modified' => date("Y-m-d H:i:s"), - ] - ); - - is_return(__('msg.change_saved'), 'success', $url_post . '#answer_' . $answer['answer_id']); - } -} diff --git a/app/Controllers/Comment/AddCommentController.php b/app/Controllers/Comment/AddCommentController.php index d8bf3ffa..c4f88d69 100644 --- a/app/Controllers/Comment/AddCommentController.php +++ b/app/Controllers/Comment/AddCommentController.php @@ -4,47 +4,42 @@ namespace App\Controllers\Comment; use Hleb\Constructor\Handlers\Request; use App\Controllers\Controller; -use App\Services\Сheck\PostPresence; -use App\Services\Сheck\AnswerPresence; -use App\Models\{NotificationModel, ActionModel, AnswerModel, CommentModel}; +use App\Services\Сheck\{PostPresence, CommentPresence}; +use App\Models\{NotificationModel, ActionModel, CommentModel, PostModel}; use App\Validate\Validator; +use UserData; class AddCommentController extends Controller { - // Show the form for adding a comment + // Show the form for adding a комментария // Покажем форму добавление комментария public function index() { - insert( - '/_block/form/add-comment', - [ - 'data' => [ - 'answer_id' => Request::getPostInt('answer_id'), - 'comment_id' => Request::getPostInt('comment_id'), - ], - ] - ); + insert('/_block/form/add-comment'); } - - // Adding a comment + public function create() - { - $answer_id = Request::getPostInt('answer_id'); // на какой ответ - $comment_id = Request::getPostInt('comment_id'); // на какой комментарий - - $answer = AnswerPresence::index($answer_id); - - $post = PostPresence::index($answer['answer_post_id'], 'id'); - + { + if ($post_id = Request::getPostInt('post_id')) { + $post = PostPresence::index($post_id, 'id'); + } + + if ($comment_id = Request::getPostInt('comment_id')) { + $comment = CommentPresence::index($comment_id); + $post = PostPresence::index($comment['comment_post_id'], 'id'); + } + $url_post = post_slug($post['post_id'], $post['post_slug']); - - Validator::Length($content = $_POST['comment'], 6, 2024, 'content', $url_post); + + Validator::Length($content = $_POST['content'], 6, 5000, 'content', $url_post); // Let's check the stop words, url - // Проверим стоп слова, url + // Проверим стоп слова и url $trigger = (new \App\Services\Audit())->prohibitedContent($content); - $last_id = CommentModel::add($post['post_id'], $answer_id, $comment_id, $content, $trigger); + $this->union($post, $url_post, $content); + + $last_id = CommentModel::add($post['post_id'], $comment_id, $content, $trigger); // Add an audit entry and an alert to the admin // Аудит и оповещение персоналу @@ -54,13 +49,13 @@ class AddCommentController extends Controller $url = $url_post . '#comment_' . $last_id; - $this->notif($answer_id, $comment_id, $content, $url); + $this->notifPost($content, $post, $comment_id, $url); ActionModel::addLogs( [ 'id_content' => $last_id, 'action_type' => 'comment', - 'action_name' => 'added', + 'action_name' => 'comment', 'url_content' => $url, ] ); @@ -68,30 +63,57 @@ class AddCommentController extends Controller redirect($url); } - // Notifications when adding a comment - // Уведомления при добавлении комментария - public function notif($answer_id, $comment_id, $content, $url) + public function union($post, $url_post, $content) { - // Notification to the author of the answer that there is a comment (do not write to ourselves) - // Оповещение автору ответа, что есть комментарий (себе не записываем) - $answ = AnswerModel::getAnswerId($answer_id); - if ($this->user['id'] != $answ['answer_user_id']) { - NotificationModel::send($answ['answer_user_id'], NotificationModel::TYPE_COMMENT_ANSWER, $url); + if (config('publication.merge_answer_post') == false) { + return true; } - if ($comment_id) { - $comment = CommentModel::getCommentsId($comment_id); - if ($this->user['id'] != $comment['comment_user_id']) { - if ($answ['answer_user_id'] != $comment['comment_user_id']) { - NotificationModel::send($comment['comment_user_id'], NotificationModel::TYPE_COMMENT_COMMENT, $url); - } - } + // Staff can write a response under their post + // Персонал может писать ответ под своим постом + if (UserData::checkAdmin()) { + return true; } + // If there are no replies to the post and the author of the post = the author of the comment, then add the comment to the end of the post + // Если ответов на пост нет и автор поста = автора ответа, то дописываем ответ в конец поста + if ((CommentModel::getNumberComment($post['post_id']) == null) && ($post['post_user_id'] == $this->user['id'])) { + + CommentModel::mergePost($post['post_id'], $content); + + redirect($url_post); + } + + return true; + } + + // Notifications when adding a answer + // Уведомления при добавлении ответа + public function notifPost($content, $post, $comment_id, $url) + { // Contact via @ // Обращение через @ if ($message = \App\Services\Parser\Content::parseUsers($content, true, true)) { - (new \App\Controllers\NotificationController())->mention(NotificationModel::TYPE_ADDRESSED_COMMENT, $message, $url, $comment['comment_user_id']); + (new \App\Controllers\NotificationController())->mention(NotificationModel::TYPE_ADDRESSED_ANSWER, $message, $url, $post['post_user_id']); + } + + // Who is following this question/post + // Кто подписан на данный вопрос / пост + if ($focus_all = PostModel::getFocusUsersPost($post['post_id'])) { + foreach ($focus_all as $focus_user) { + if ($focus_user['signed_user_id'] != $this->user['id']) { + NotificationModel::send($focus_user['signed_user_id'], NotificationModel::TYPE_AMSWER_POST, $url); + } + } + } + + // Notifications when adding a comment + // Уведомления при добавлении комментария + if ($comment_id) { + $comment = CommentModel::getCommentId($comment_id); + if ($this->user['id'] != $comment['comment_user_id']) { + NotificationModel::send($comment['comment_user_id'], NotificationModel::TYPE_COMMENT_COMMENT, $url); + } } } } diff --git a/app/Controllers/Comment/CommentController.php b/app/Controllers/Comment/CommentController.php index 3a4c71ad..2414617e 100644 --- a/app/Controllers/Comment/CommentController.php +++ b/app/Controllers/Comment/CommentController.php @@ -3,35 +3,27 @@ namespace App\Controllers\Comment; use App\Controllers\Controller; -use App\Models\{CommentModel, AnswerModel}; +use App\Models\CommentModel; use Meta, Html; class CommentController extends Controller { protected $limit = 10; - // All comments (combining answers and comments for UX) - // Все комментарии (объединение ответов и комментариев для UX) + // All comments + // Все комменатрии public function index($sheet) { $pagesCount = CommentModel::getCommentsCount($sheet); - $comments = CommentModel::getComments($this->pageNumber, $this->limit, $sheet); - - $pagesCount = AnswerModel::getAnswersCount($sheet); - $answers = AnswerModel::getAnswers($this->pageNumber, $this->limit, $sheet); + $comments = CommentModel::getComments($this->pageNumber, $sheet); $m = [ 'og' => false, 'url' => url('comments'), ]; - $mergedArr = array_merge($comments, $answers); - usort($mergedArr, function ($a, $b) { - return ($b['comment_date'] ?? $b['answer_date']) <=> ($a['comment_date'] ?? $a['answer_date']); - }); - return $this->render( - '/comment/comments', + '/comments/all', [ 'meta' => Meta::get(__('meta.all_comments'), __('meta.comments_desc'), $m), 'data' => [ @@ -39,25 +31,10 @@ class CommentController extends Controller 'pNum' => $this->pageNumber, 'sheet' => $sheet, 'type' => 'comments', - 'comments' => $mergedArr, + 'comments' => $comments, ] ] ); } - // On the home page - // На главной странице - public function lastComment() - { - $comments = CommentModel::getComments(1, 5, 'all'); - - $result = []; - foreach ($comments as $ind => $row) { - $row['content'] = fragment($row['comment_content'], 98); - $row['date'] = Html::langDate($row['comment_date']); - $result[$ind] = $row; - } - - return json_encode($result, JSON_PRETTY_PRINT); - } } diff --git a/app/Controllers/Comment/EditCommentController.php b/app/Controllers/Comment/EditCommentController.php index aa92ac11..d65deafe 100644 --- a/app/Controllers/Comment/EditCommentController.php +++ b/app/Controllers/Comment/EditCommentController.php @@ -4,59 +4,71 @@ namespace App\Controllers\Comment; use Hleb\Constructor\Handlers\Request; use App\Controllers\Controller; -use App\Services\Сheck\{PostPresence, CommentPresence}; +use App\Services\Сheck\PostPresence; +use App\Services\Сheck\CommentPresence; use App\Models\CommentModel; +use App\Models\User\UserModel; use App\Validate\Validator; -use Access; +use Meta, Access; + +use App\Traits\Author; class EditCommentController extends Controller { - // Comment Editing Form - // Форма редактирования комментария + use Author; + + // Edit form comment public function index() { - // Access verification - // Проверка доступа - $comment = CommentPresence::index(Request::getPostInt('comment_id')); + $comment = CommentPresence::index(Request::getInt('id')); if (Access::author('comment', $comment) == false) { return false; } - insert( - '/_block/form/edit-comment', + $post = PostPresence::index($comment['comment_post_id'], 'id'); + + return $this->render( + '/comments/edit', [ + 'meta' => Meta::get(__('app.edit_comment')), 'data' => [ - 'comment_id' => $comment['comment_id'], - 'comment_content' => $comment['comment_content'], - ], - 'user' => $this->user + 'post' => $post, + 'comment' => $comment, + 'user' => UserModel::getUser($comment['comment_user_id'], 'id'), + 'sheet' => 'edit-answers', + 'type' => 'comment', + ] ] ); } public function change() { - // Access verification - $comment = CommentPresence::index(Request::getPostInt('comment_id')); + $comment_id = Request::getPostInt('comment_id'); + $content = $_POST['content']; // для Markdown + + // Access check + $comment = CommentModel::getCommentId($comment_id); + if (Access::author('comment', $comment) == false) { - redirect('/'); + return false; } $post = PostPresence::index($comment['comment_post_id'], 'id'); - $redirect = post_slug($post['post_id'], $post['post_slug']) . '#comment_' . $comment['comment_id']; + $url_post = post_slug($comment['comment_post_id'], $post['post_slug']); - $content = $_POST['comment']; // для Markdown - Validator::length($content, 3, 5500, 'content', $redirect); + Validator::Length($content, 6, 5000, 'content', url('content.edit', ['type' => 'comment', 'id' => $comment['comment_id']])); CommentModel::edit( [ - 'comment_id' => $comment['comment_id'], - 'comment_content' => $content, - 'comment_modified' => date("Y-m-d H:i:s"), + 'comment_id' => $comment['comment_id'], + 'comment_content' => $content, + 'comment_user_id' => $this->selectAuthor($comment['comment_user_id'], Request::getPost('user_id')), + 'comment_modified' => date("Y-m-d H:i:s"), ] ); - redirect($redirect); + is_return(__('msg.change_saved'), 'success', $url_post . '#comment_' . $comment['comment_id']); } } diff --git a/app/Controllers/FormController.php b/app/Controllers/FormController.php index a89c1c21..f2beb46c 100644 --- a/app/Controllers/FormController.php +++ b/app/Controllers/FormController.php @@ -55,8 +55,8 @@ class FormController extends Controller return (new Poll\EditPollController)->index(); } - if ($this->type === 'answer') { - return (new Answer\EditAnswerController)->index(); + if ($this->type === 'comment') { + return (new Comment\EditCommentController)->index(); } if ($this->type === 'item') { @@ -83,10 +83,6 @@ class FormController extends Controller return (new Facets\AddFacetController)->create($this->type); } - if ($this->type === 'answer') { - return (new Answer\AddAnswerController)->create(); - } - if ($this->type === 'comment') { return (new Comment\AddCommentController)->create(); } @@ -131,10 +127,6 @@ class FormController extends Controller return (new Poll\EditPollController)->change(); } - if ($this->type === 'answer') { - return (new Answer\EditAnswerController)->change(); - } - if ($this->type === 'comment') { return (new Comment\EditCommentController)->change(); } diff --git a/app/Controllers/HomeController.php b/app/Controllers/HomeController.php index ff062195..50bda3c4 100644 --- a/app/Controllers/HomeController.php +++ b/app/Controllers/HomeController.php @@ -24,7 +24,7 @@ class HomeController extends Controller 'sheet' => $sheet, 'topics' => $topics, 'type' => 'main', - 'latest_answers' => HomeModel::latestAnswers(), + 'latest_comments' => HomeModel::latestComments(), 'topics_user' => HomeModel::subscription(), 'posts' => HomeModel::feed($this->pageNumber, $sheet), 'items' => HomeModel::latestItems(), diff --git a/app/Controllers/Post/EditPostController.php b/app/Controllers/Post/EditPostController.php index 12c59662..0f9fe076 100644 --- a/app/Controllers/Post/EditPostController.php +++ b/app/Controllers/Post/EditPostController.php @@ -183,7 +183,7 @@ class EditPostController extends Controller $type = Request::get('type'); $id = Request::getInt('id'); - if (!in_array($type, ['post-telo', 'answer'])) { + if (!in_array($type, ['post-telo', 'comment'])) { return false; } diff --git a/app/Controllers/Post/PostController.php b/app/Controllers/Post/PostController.php index 6f66f2a7..9d616a65 100644 --- a/app/Controllers/Post/PostController.php +++ b/app/Controllers/Post/PostController.php @@ -7,7 +7,8 @@ use App\Controllers\Controller; use App\Services\Сheck\PostPresence; use App\Services\Сheck\FacetPresence; use App\Services\Meta\Post; -use App\Models\{PostModel, AnswerModel, CommentModel, SubscriptionModel, FeedModel}; +use App\Services\Tree\BuildTree; +use App\Models\{PostModel, CommentModel, SubscriptionModel, FeedModel}; use Meta, UserData; use App\Traits\Views; @@ -28,6 +29,7 @@ class PostController extends Controller { $slug = Request::get('slug'); $id = Request::getInt('id'); + $sorting = Request::getGet('sort'); $content = self::presence($type, $id, $slug); @@ -48,12 +50,6 @@ class PostController extends Controller redirect(url('facet.article', ['facet_slug' => 'info', 'slug' => $content['post_slug']])); } - // Q&A (post_feature == 1) or Discussiona - $content['amount_content'] = ($content['post_feature'] == 0) ? $content['post_comments_count'] + $content['post_answers_count'] : $content['post_answers_count']; - - // Get replies and comments on the post - $answers = $this->answersPost($content['post_id'], $content['post_feature'], $sorting = Request::getGet('sort')); - if ($content['post_related']) { $related_posts = PostModel::postRelated($content['post_related']); } @@ -61,6 +57,8 @@ class PostController extends Controller // Sending Last-Modified and handling HTTP_IF_MODIFIED_SINCE $this->getDataModified($content['post_modified']); + $comments = CommentModel::getCommentsPost($content['post_id'], $content['post_feature'], $sorting); + if ($type == 'post') { return $this->render( '/post/post-view', @@ -68,7 +66,7 @@ class PostController extends Controller 'meta' => Post::metadata($content), 'data' => [ 'post' => $content, - 'answers' => $answers, + 'comments' => BuildTree::index(0, $comments), 'recommend' => PostModel::postSimilars($content['post_id'], $facets[0]['facet_id'] ?? null), 'related_posts' => $related_posts ?? '', 'post_signed' => SubscriptionModel::getFocus($content['post_id'], 'post'), @@ -103,26 +101,6 @@ class PostController extends Controller ); } - // Get replies and comments on the post - // Получим ответы и комментарии на пост - public function answersPost($post_id, $post_feature, $sorting) - { - $post_answers = AnswerModel::getAnswersPost($post_id, $post_feature, $sorting); - - $answers = []; - foreach ($post_answers as $ind => $row) { - - if (strtotime($row['answer_modified']) < strtotime($row['answer_date'])) { - $row['edit'] = 1; - } - // TODO: N+1 см. AnswerModel() - $row['comments'] = CommentModel::getCommentsAnswer($row['answer_id']); - $answers[$ind] = $row; - } - - return $answers; - } - public static function presence($type, $id, $slug) { // Check id and get content data diff --git a/app/Controllers/SearchController.php b/app/Controllers/SearchController.php index 9c68106f..9102cd28 100644 --- a/app/Controllers/SearchController.php +++ b/app/Controllers/SearchController.php @@ -30,7 +30,7 @@ class SearchController extends Controller $q = Request::getGet('q'); $type = Request::getGet('cat'); - if (!in_array($type, ['post', 'website', 'answer'])) { + if (!in_array($type, ['post', 'website', 'comment'])) { $type = 'post'; } @@ -44,6 +44,7 @@ class SearchController extends Controller } $results = SearchModel::getSearch($this->pageNumber, $this->limit, $q, $type); + $count_results = SearchModel::getSearchCount($q, $type); $user_id = UserData::getUserId(); diff --git a/app/Controllers/User/ProfileController.php b/app/Controllers/User/ProfileController.php index c7a2321b..a3f9f1f8 100644 --- a/app/Controllers/User/ProfileController.php +++ b/app/Controllers/User/ProfileController.php @@ -6,7 +6,7 @@ use Hleb\Constructor\Handlers\Request; use App\Services\Meta\Profile; use App\Controllers\Controller; use App\Models\User\{UserModel, BadgeModel}; -use App\Models\{FacetModel, FeedModel, AnswerModel, CommentModel, PostModel, IgnoredModel}; +use App\Models\{FacetModel, FeedModel, CommentModel, PostModel, IgnoredModel}; use UserData; use App\Traits\Views; @@ -71,18 +71,8 @@ class ProfileController extends Controller { $profile = $this->profile(); - $answers = AnswerModel::userAnswers($this->pageNumber, $this->limit, $profile['id'], $this->user['id']); - $answerCount = AnswerModel::userAnswersCount($profile['id']); - - $comments = CommentModel::userComments($this->pageNumber, $this->limit, $profile['id'], $this->user['id']); - $commentCount = CommentModel::userCommentsCount($profile['id']); - - $pagesCount = $answerCount + $commentCount; - - $mergedArr = array_merge($comments, $answers); - usort($mergedArr, function ($a, $b) { - return ($b['comment_date'] ?? $b['answer_date']) <=> ($a['comment_date'] ?? $a['answer_date']); - }); + $comments = CommentModel::userComments($this->pageNumber, $profile['id'], $this->user['id']); + $commentsCount = CommentModel::userCommentsCount($profile['id']); $this->indexing($profile['id']); @@ -90,7 +80,7 @@ class ProfileController extends Controller '/user/profile/comments', [ 'meta' => Profile::metadata('profile_comments', $profile), - 'data' => array_merge($this->sidebar($pagesCount, $profile), ['comments' => $mergedArr]), + 'data' => array_merge($this->sidebar($commentsCount, $profile), ['comments' => $comments]), ] ); } @@ -151,7 +141,7 @@ class ProfileController extends Controller public function indexing($profile_id) { $amount = UserModel::contentCount($profile_id, 'active'); - if (($amount['count_answers'] + $amount['count_comments']) < 3) { + if (($amount['count_comments']) < 3) { Request::getHead()->addMeta('robots', 'noindex'); } diff --git a/app/Controllers/User/SettingController.php b/app/Controllers/User/SettingController.php index 2617f4da..98912712 100644 --- a/app/Controllers/User/SettingController.php +++ b/app/Controllers/User/SettingController.php @@ -250,7 +250,6 @@ class SettingController extends Controller 'setting_email_appealed' => Request::getPostInt('setting_email_appealed'), 'setting_email_post' => 0, 'setting_email_answer' => 0, - 'setting_email_comment' => 0, ] ); diff --git a/app/Controllers/User/UserController.php b/app/Controllers/User/UserController.php index 7a0def2c..393161f5 100644 --- a/app/Controllers/User/UserController.php +++ b/app/Controllers/User/UserController.php @@ -49,10 +49,10 @@ class UserController extends Controller $result = []; foreach ($favorites as $ind => $row) { if ($row['action_type'] == 'post') { - $row['answer_post_id'] = $row['post_id']; + $row['comment_post_id'] = $row['post_id']; } - $row['post'] = PostModel::getPost($row['answer_post_id'], 'id', $this->user); + $row['post'] = PostModel::getPost($row['comment_post_id'], 'id', $this->user); $result[$ind] = $row; } diff --git a/app/Core/Html.php b/app/Core/Html.php index 9acc699c..1a489f97 100644 --- a/app/Core/Html.php +++ b/app/Core/Html.php @@ -76,7 +76,7 @@ class Html return ((int)$a[2] . " " . $months[$later] . " " . $a[0]); } - // Voting for posts, replies, comments and sites + // Voting for posts, replies, answer and sites public static function votes($content, $type, $icon = 'heart') { $count = $content[$type . '_votes'] > 0 ? $content[$type . '_votes'] : ''; diff --git a/app/Languages/ar/app.php b/app/Languages/ar/app.php index a8df66ea..9ee5439f 100644 --- a/app/Languages/ar/app.php +++ b/app/Languages/ar/app.php @@ -311,6 +311,7 @@ return [ 'num_message' => ['رسالة', 'رسائل', 'رسائل'], 'num_answer' => ['اجابة', 'اجابات', 'اجابات'], + 'num_comment' => ['تعليق', 'تعليقات', 'تعليقات'], 'num_post' => ['منشور', 'منشورات', 'منشورات'], 'num_view' => ['مشاهدة', 'مشاهدات', 'مشاهدات'], 'num_up' => ['اعجابات', 'اعجابات', 'اعجابات'], @@ -356,7 +357,7 @@ return [ 'slug' => 'اختصار', 'email' => 'بريد الكتروني', 'wiki' => 'ويكي', - 'edit_answer' => 'لـ\'تعديل الاجابة', + 'edit_comment' => 'دعونا نغير التعليق', 'enter' => 'ادخل', 'enter_password' => 'ادخل كلمة السر', diff --git a/app/Languages/ar/search.php b/app/Languages/ar/search.php index e3a80283..5a49b34b 100644 --- a/app/Languages/ar/search.php +++ b/app/Languages/ar/search.php @@ -10,7 +10,7 @@ return [ 'all' => 'الكل', 'posts' => 'المنشورات', 'websites' => 'المواقع', - 'answers' => 'اجابات', + 'comments' => 'تعليقات', 'registration' => 'التسجيل', 'sign_in' => 'تسجيل الدخول', 'find' => 'البحث...', diff --git a/app/Languages/en/app.php b/app/Languages/en/app.php index 955ae02a..6e2484e4 100644 --- a/app/Languages/en/app.php +++ b/app/Languages/en/app.php @@ -315,6 +315,7 @@ return [ 'num_message' => ['Message', 'Messages', 'Messages'], 'num_answer' => ['Answer', 'Answers', 'Answers'], + 'num_comment' => ['Comment', 'Comments', 'Comments'], 'num_post' => ['Post', 'Posts', 'Posts'], 'num_view' => ['View', 'Views', 'Views'], 'num_up' => ['likes', 'likes', 'likes'], @@ -360,7 +361,7 @@ return [ 'slug' => 'SLUG', 'email' => 'Email', 'wiki' => 'Wiki', - 'edit_answer' => 'Let\'s change the answer', + 'edit_comment' => 'Change the comment', 'enter' => 'Enter', 'enter_password' => 'Enter password', diff --git a/app/Languages/en/search.php b/app/Languages/en/search.php index bf449b2b..e42d1696 100644 --- a/app/Languages/en/search.php +++ b/app/Languages/en/search.php @@ -9,7 +9,7 @@ return [ 'all' => 'All', 'posts' => 'Posts', - 'answers' => 'Answers', + 'comments' => 'Comments', 'websites' => 'Sites', 'registration' => 'Registration', 'sign_in' => 'To come in', diff --git a/app/Languages/ro/app.php b/app/Languages/ro/app.php index 3ca37852..709218fd 100644 --- a/app/Languages/ro/app.php +++ b/app/Languages/ro/app.php @@ -314,6 +314,7 @@ return [ 'num_message' => ['Mesaj', 'Mesaje', 'Mesaje'], 'num_answer' => ['Răspuns', 'Răspuns', 'Răspunsuri'], + 'num_comment' => ['Comentariu', 'Comentariu', 'Comentarii'], 'num_post' => ['Postează', 'Postează', 'Postează'], 'num_view' => ['Vizualizare', 'Vizualizare', 'Vizualizare'], 'num_up' => ['Voce', 'Voci', 'Voci'], @@ -359,7 +360,7 @@ return [ 'slug' => 'SLUG', 'email' => 'Email', 'wiki' => 'Wiki', - 'edit_answer' => 'Să schimbăm răspunsul', + 'edit_comment' => 'Schimbă comentariul', 'enter' => 'Introduce', 'enter_password' => 'Introdu parola', diff --git a/app/Languages/ro/search.php b/app/Languages/ro/search.php index dd195089..6f7a32f5 100644 --- a/app/Languages/ro/search.php +++ b/app/Languages/ro/search.php @@ -9,7 +9,7 @@ return [ 'all' => 'Toate', 'posts' => 'Postări', - 'answers' => 'Răspunsuri', + 'comments' => 'Comentarii', 'websites' => 'Site-uri', 'registration' => 'Înregistrare', 'sign_in' => 'Conectare', diff --git a/app/Languages/ru/app.php b/app/Languages/ru/app.php index deda48a3..2d6e32c6 100644 --- a/app/Languages/ru/app.php +++ b/app/Languages/ru/app.php @@ -245,7 +245,7 @@ return [ 'default' => '(по умолчанию)', 'qa' => 'Вопросы и ответы', 'best_answer' => 'Лучший ответ', - 'raise_answer' => 'Поднять ответ', + 'raise_answer' => 'Поднять ответ', 'answered' => 'Ответили', 'post_translation' => 'Пост является переводом?', 'translation' => 'Перевод', @@ -314,6 +314,7 @@ return [ 'num_message' => ['Сообщение', 'Сообщения', 'Сообщений'], 'num_answer' => ['Ответ', 'Ответа', 'Ответов'], + 'num_comment' => ['Комментарий', 'Комментария', 'Комментариев'], 'num_post' => ['Пост', 'Поста', 'Постов'], 'num_view' => ['Просмотр', 'Просмотра', 'Просмотров'], 'num_up' => ['Голос', 'Голоса', 'Голосов'], @@ -359,7 +360,7 @@ return [ 'slug' => 'SLUG', 'email' => 'Email', 'wiki' => 'Wiki', - 'edit_answer' => 'Изменим ответ', + 'edit_comment' => 'Изменим комментарий', 'enter' => 'Введите', 'enter_password' => 'Введите пароль', diff --git a/app/Languages/ru/search.php b/app/Languages/ru/search.php index d330be0e..a2780e79 100644 --- a/app/Languages/ru/search.php +++ b/app/Languages/ru/search.php @@ -9,7 +9,7 @@ return [ 'all' => 'Все', 'posts' => 'Посты', - 'answers' => 'Ответы', + 'comments' => 'Комментарии', 'websites' => 'Сайты', 'registration' => 'Регистрация', 'sign_in' => 'Войти', diff --git a/app/Languages/ua/app.php b/app/Languages/ua/app.php index 20a3c031..752409c1 100644 --- a/app/Languages/ua/app.php +++ b/app/Languages/ua/app.php @@ -314,6 +314,7 @@ return [ 'num_message' => ['Повідомлення', 'Повідомлення', 'Повідомлень'], 'num_answer' => ['Відповідь', 'Відповіді', 'Відповідей'], + 'num_comment' => ['Коментар', 'Коментаря', 'Коментарів'], 'num_post' => ['Пост', 'Поста', 'Постів'], 'num_view' => ['Перегляд', 'Перегляду', 'Переглядів'], 'num_up' => ['Голос', 'Голосу', 'Голосів'], @@ -359,7 +360,7 @@ return [ 'slug' => 'SLUG', 'email' => 'Email', 'wiki' => 'Wiki', - 'edit_answer' => 'Змінимо відповідь', + 'edit_comment' => 'Змінимо коментар', 'enter' => 'Введіть', 'enter_password' => 'Введіть пароль', diff --git a/app/Languages/ua/search.php b/app/Languages/ua/search.php index e5a2ef1e..50c5b17b 100644 --- a/app/Languages/ua/search.php +++ b/app/Languages/ua/search.php @@ -9,7 +9,7 @@ return [ 'all' => 'Всі', 'posts' => 'Пости', - 'answers' => 'Відповіді', + 'comments' => 'Коментарі', 'websites' => 'Сайти', 'registration' => 'Реєстрація', 'sign_in' => 'Увійти', diff --git a/app/Languages/vi/app.php b/app/Languages/vi/app.php index 12cbd1f0..22593ceb 100644 --- a/app/Languages/vi/app.php +++ b/app/Languages/vi/app.php @@ -314,6 +314,7 @@ return [ 'num_message' => ['Tin nhắn', 'Tin nhắn', 'Tin nhắn'], 'num_answer' => ['Trả lời', 'Trả lời', 'Câu trả lời'], + 'num_comment' => ['Bình Luận', 'Bình Luận', 'Bình Luận'], 'num_post' => ['Bài đăng', 'Bài đăng', 'Postov'], 'num_view' => ['Chế độ xem', 'Lượt xem', 'Lượt xem'], 'num_up' => ['Giọng nói', 'Giọng nói', 'Giọng nói'], @@ -359,7 +360,7 @@ return [ 'slug' => 'SLUG', 'email' => 'Email', 'wiki' => 'Wiki', - 'edit_answer' => 'Hãy thay đổi câu trả lời', + 'edit_comment' => 'Thay đổi nhận xé', 'enter' => 'Đi vào', 'enter_password' => 'Nhập mật khẩu', diff --git a/app/Languages/vi/search.php b/app/Languages/vi/search.php index 50d6cb74..eb85cb0a 100644 --- a/app/Languages/vi/search.php +++ b/app/Languages/vi/search.php @@ -9,7 +9,7 @@ return [ 'all' => 'Tất cả', 'posts' => 'Bài viết', - 'answers' => 'Trả lời', + 'comments' => 'Bình luận', 'websites' => 'Trang', 'registration' => 'Đăng ký', 'sign_in' => 'Cần đi vào', diff --git a/app/Languages/zh_CN/app.php b/app/Languages/zh_CN/app.php index d17b9380..8c75c6a2 100644 --- a/app/Languages/zh_CN/app.php +++ b/app/Languages/zh_CN/app.php @@ -312,11 +312,12 @@ return [ 'today' => '今天', 'yesterday' => '昨天', - 'num_message' => ['消息', '消息', '消息'], - 'num_answer' => ['回复', '回复', '回复'], - 'num_post' => ['帖子', '帖子', '帖子'], - 'num_view' => ['查看', '查看', '查看'], - 'num_up' => ['喜欢', '喜欢', '喜欢'], + 'num_message' => ['消息', '消息', '消息'], + 'num_answer' => ['回复', '回复', '回复'], + 'num_comment' => ['注释','注释','注释'], + 'num_post' => ['帖子', '帖子', '帖子'], + 'num_view' => ['查看', '查看', '查看'], + 'num_up' => ['喜欢', '喜欢', '喜欢'], 'comment' => '评论', 'comments' => '评论', @@ -360,7 +361,7 @@ return [ 'slug' => '别名', 'email' => '邮箱', 'wiki' => 'Wiki', - 'edit_answer' => '让我们更改答复', + 'edit_comment' => '更改注释', 'enter' => '输入', 'enter_password' => '输入密码', diff --git a/app/Languages/zh_CN/search.php b/app/Languages/zh_CN/search.php index 910db803..f47068c0 100644 --- a/app/Languages/zh_CN/search.php +++ b/app/Languages/zh_CN/search.php @@ -9,7 +9,7 @@ return [ 'all' => '全部', 'posts' => '帖子', - 'answers' => '答案', + 'comments' => '评论', 'websites' => '网站', 'registration' => '注册', 'sign_in' => '登录', diff --git a/app/Languages/zh_TW/app.php b/app/Languages/zh_TW/app.php index 6779df4d..5d3ea99e 100644 --- a/app/Languages/zh_TW/app.php +++ b/app/Languages/zh_TW/app.php @@ -313,11 +313,12 @@ return [ 'today' => '今天', 'yesterday' => '昨天', - 'num_message' => ['消息', '消息', '消息'], - 'num_answer' => ['答案', '答案', '答案'], - 'num_post' => ['后', '后', '后'], - 'num_view' => ['视图', '视图', '视图'], - 'num_up' => ['声音', '声音', '声音'], + 'num_message' => ['消息', '消息', '消息'], + 'num_answer' => ['答案', '答案', '答案'], + 'num_comment' => ['注释','注释','注释'], + 'num_post' => ['后', '后', '后'], + 'num_view' => ['视图', '视图', '视图'], + 'num_up' => ['声音', '声音', '声音'], 'comment' => '评论', 'comments' => '评论', @@ -360,7 +361,7 @@ return [ 'slug' => 'SLUG', 'email' => 'Email', 'wiki' => 'Wiki', - 'edit_answer' => '让我们改变答案', + 'edit_comment' => '更改注释', 'enter' => '进入', 'enter_password' => '输入密码', diff --git a/app/Languages/zh_TW/search.php b/app/Languages/zh_TW/search.php index 8984f032..a8f2abcd 100644 --- a/app/Languages/zh_TW/search.php +++ b/app/Languages/zh_TW/search.php @@ -9,7 +9,7 @@ return [ 'all' => '全部', 'posts' => '帖子', - 'answers' => '答案', + 'comments' => '评论', 'websites' => '網站', 'registration' => '登記', 'sign_in' => '進來', diff --git a/app/Models/ActionModel.php b/app/Models/ActionModel.php index 05e610ad..bc221772 100644 --- a/app/Models/ActionModel.php +++ b/app/Models/ActionModel.php @@ -72,13 +72,11 @@ class ActionModel extends \Hleb\Scheme\App\Models\MainModel (SELECT COUNT(*) FROM posts WHERE post_user_id = $user_id and post_is_deleted = 0) AS t1Count, (SELECT COUNT(*) FROM - answers WHERE answer_user_id = $user_id and answer_is_deleted = 0) AS t2Count, - (SELECT COUNT(*) FROM - comments WHERE comment_user_id = $user_id and comment_is_deleted = 0) AS t3Count"; + comments WHERE comment_user_id = $user_id and comment_is_deleted = 0) AS t2Count"; $lists = DB::run($sql)->fetch(); - return $lists['t1Count'] + $lists['t2Count'] + $lists['t3Count']; + return $lists['t1Count'] + $lists['t2Count']; } // Member Content Posting Frequency diff --git a/app/Models/AnswerModel.php b/app/Models/AnswerModel.php deleted file mode 100644 index 09f7aa9c..00000000 --- a/app/Models/AnswerModel.php +++ /dev/null @@ -1,324 +0,0 @@ - $post_id, - 'answer_content' => $content, - 'answer_published' => ($trigger === false) ? 0 : 1, - 'answer_ip' => Request::getRemoteAddress(), - 'answer_user_id' => UserData::getUserId(), - ]; - - $sql = "INSERT INTO answers(answer_post_id, - answer_content, - answer_published, - answer_ip, - answer_user_id) - VALUES(:answer_post_id, - :answer_content, - :answer_published, - :answer_ip, - :answer_user_id)"; - - DB::run($sql, $params); - - $sql_last_id = DB::run("SELECT LAST_INSERT_ID() as last_id")->fetch(); - - // Recalculating the number of responses for the post + 1 - // Пересчитываем количество ответов для поста + 1 - PostModel::updateCount($post_id, 'answers'); - - return $sql_last_id['last_id']; - } - - // Editing the answer - // Редактируем ответ - public static function edit($params) - { - $sql_two = "UPDATE answers SET answer_content = :answer_content, - answer_modified = :answer_modified, answer_user_id = :answer_user_id - WHERE answer_id = :answer_id"; - - return DB::run($sql_two, $params); - } - - // All answers - // Все ответы - public static function getAnswers($page, $limit, $sheet) - { - $user_id = UserData::getUserId(); - $sort = self::sorts($sheet); - $start = ($page - 1) * $limit; - $sql = "SELECT - post_id, - post_title, - post_slug, - post_user_id, - post_closed, - post_feature, - post_is_deleted, - answer_id, - answer_content, - answer_date, - answer_after, - answer_user_id, - answer_ip, - answer_post_id, - answer_votes, - answer_is_deleted, - answer_published, - votes_answer_item_id, - votes_answer_user_id, - fav.tid, - fav.user_id, - fav.action_type, - u.id, - u.login, - u.avatar - FROM answers - INNER JOIN users u ON u.id = answer_user_id - INNER JOIN posts ON answer_post_id = post_id - LEFT JOIN votes_answer ON votes_answer_item_id = answer_id - AND votes_answer_user_id = $user_id - LEFT JOIN favorites fav ON fav.tid = answer_id - AND fav.user_id = $user_id - AND fav.action_type = 'answer' - $sort - ORDER BY answer_id DESC LIMIT :start, :limit "; - - return DB::run($sql, ['start' => $start, 'limit' => $limit])->fetchAll(); - } - - public static function getAnswersCount($sheet) - { - $sort = self::sorts($sheet); - - $sql = "SELECT answer_id FROM answers INNER JOIN posts ON answer_post_id = post_id $sort"; - - return DB::run($sql)->rowCount(); - } - - public static function sorts($sheet) - { - $hidden = UserData::checkAdmin() ? "" : "AND post_hidden = 0"; - - switch ($sheet) { - case 'all': - $sort = "WHERE answer_is_deleted = 0 AND post_tl = 0 AND post_is_deleted = 0 $hidden"; - break; - case 'deleted': - $sort = "WHERE answer_is_deleted = 1"; - break; - } - - return $sort; - } - - // Number of replies per post - // Количество ответов на пост - public static function getNumberAnswers($post_id) - { - $sql = "SELECT answer_id FROM answers WHERE answer_post_id = :id AND answer_is_deleted = 0"; - - return DB::run($sql, ['id' => $post_id])->rowCount(); - } - - // Add the answer to the end of the post - // Добавим ответ в конец поста - public static function mergePost($post_id, $content) - { - $sql = "UPDATE posts SET post_content = CONCAT(post_content, :content) WHERE post_id = :post_id"; - - $content = "\n\n `+` " . $content; - - return DB::run($sql, ['post_id' => $post_id, 'content' => $content]); - } - - // Getting answers in a post - // Получаем ответы в посте - public static function getAnswersPost($post_id, $type, $sorting = 'new') - { - $user_id = UserData::getUserId(); - - if ($type == 1) { - $sorting = 'top'; - } - - switch ($sorting) { - case 'top': - $sort = 'ORDER BY answer_lo DESC, answer_votes DESC'; - break; - case 'old': - $sort = 'ORDER BY answer_id DESC'; - break; - // new - default: - $sort = ''; - break; - } - - // TODO: Сгруппировать комментарии по ответу (избавимся N+1) - // LEFT JOIN comments ON comment_answer_id = answer_id - // comment_answer_id, - // comment_user_id, - // comment_date, - // comment_ip, - // comment_content, - $sql = "SELECT - answer_id, - answer_user_id, - answer_post_id, - answer_date, - answer_content, - answer_modified, - answer_published, - answer_ip, - answer_votes, - answer_after, - answer_lo, - answer_is_deleted, - votes_answer_item_id, - votes_answer_user_id, - fav.tid, - fav.user_id, - fav.action_type, - u.id, - u.login, - u.avatar, - u.created_at - FROM answers - LEFT JOIN users u ON u.id = answer_user_id - LEFT JOIN votes_answer ON votes_answer_item_id = answer_id - AND votes_answer_user_id = $user_id - LEFT JOIN favorites fav ON fav.tid = answer_id - AND fav.user_id = $user_id - AND fav.action_type = 'answer' - WHERE answer_post_id = $post_id - $sort "; - - return DB::run($sql)->fetchAll(); - } - - // User responses - // Ответы участника - public static function userAnswers($page, $limit, $user_id, $uid_vote) - { - $start = ($page - 1) * $limit; - $sql = "SELECT - answer_id, - answer_user_id, - answer_post_id, - answer_date, - answer_content, - answer_modified, - answer_published, - answer_ip, - answer_votes, - answer_after, - answer_is_deleted, - votes_answer_item_id, - votes_answer_user_id, - post_id, - post_title, - post_slug, - post_user_id, - post_closed, - post_is_deleted, - id, - login, - avatar - FROM answers - LEFT JOIN users ON id = answer_user_id - LEFT JOIN posts ON answer_post_id = post_id - LEFT JOIN votes_answer ON votes_answer_item_id = answer_id - AND votes_answer_user_id = :uid_vote - WHERE answer_user_id = :user_id AND post_hidden = 0 - AND answer_is_deleted = 0 AND post_is_deleted = 0 AND post_tl = 0 AND post_tl = 0 - ORDER BY answer_id DESC LIMIT :start, :limit "; - - return DB::run($sql, ['user_id' => $user_id, 'uid_vote' => $uid_vote, 'start' => $start, 'limit' => $limit])->fetchAll(); - } - - public static function userAnswersCount($user_id) - { - $sql = "SELECT - answer_id - FROM answers - LEFT JOIN posts ON answer_post_id = post_id - WHERE answer_user_id = :user_id AND answer_is_deleted = 0 - AND post_is_deleted = 0 AND post_tl = 0 AND post_tl = 0"; - - return DB::run($sql, ['user_id' => $user_id])->rowCount(); - } - - // Information on the id of the answer - // Информацию по id ответа - public static function getAnswerId($answer_id) - { - $sql = "SELECT - answer_id, - answer_post_id, - answer_user_id, - answer_date, - answer_modified, - answer_published, - answer_ip, - answer_order, - answer_after, - answer_votes, - answer_content, - answer_lo, - answer_is_deleted - FROM answers - WHERE answer_id = :answer_id"; - - return DB::run($sql, ['answer_id' => $answer_id])->fetch(); - } - - /* - * Best answer - */ - - // Choice of the best answer - // Выбор лучшего ответа - public static function setBest($post_id, $answer_id, $selected_best_answer) - { - if ($selected_best_answer) { - DB::run("UPDATE answers SET answer_lo = 0 WHERE answer_id = :id", ['id' => $selected_best_answer]); - } - - self::setAnswerBest($answer_id); - - self::answerPostBest($post_id, $answer_id); - } - - // Let's write down the id of the participant who chose the best answer - // Запишем id участника выбравший лучший ответ - public static function setAnswerBest($answer_id) - { - $sql = "UPDATE answers SET answer_lo = :user_id WHERE answer_id = :answer_id"; - - return DB::run($sql, ['answer_id' => $answer_id, 'user_id' => UserData::getUserId()]); - } - - // Rewriting the number of the selected best answer in the post - // Переписываем номер выбранного лучший ответ в посте - public static function answerPostBest($post_id, $answer_id) - { - $sql_two = "UPDATE posts SET post_lo = :answer_id WHERE post_id = :post_id"; - - return DB::run($sql_two, ['post_id' => $post_id, 'answer_id' => $answer_id]); - } -} diff --git a/app/Models/CommentModel.php b/app/Models/CommentModel.php index d9d41abe..2e04cbc7 100644 --- a/app/Models/CommentModel.php +++ b/app/Models/CommentModel.php @@ -9,246 +9,309 @@ use DB; class CommentModel extends \Hleb\Scheme\App\Models\MainModel { - // Adding a comment - // Добавляем комментарий - public static function add($post_id, $answer_id, $comment_id, $content, $trigger) + public static $limit = 15; + + // Add an comment + // Добавим ответ + public static function add($post_id, $comment_id, $content, $trigger) { - $params = [ - 'comment_post_id' => $post_id, - 'comment_answer_id' => $answer_id, - 'comment_parent_id' => $comment_id, - 'comment_content' => $content, - 'comment_published' => ($trigger === false) ? 0 : 1, - 'comment_ip' => Request::getRemoteAddress(), - 'comment_user_id' => UserData::getUserId(), + 'comment_post_id' => $post_id, + 'comment_parent_id' => $comment_id, + 'comment_content' => $content, + 'comment_published' => ($trigger === false) ? 0 : 1, + 'comment_ip' => Request::getRemoteAddress(), + 'comment_user_id' => UserData::getUserId(), ]; $sql = "INSERT INTO comments(comment_post_id, - comment_answer_id, - comment_parent_id, - comment_content, - comment_published, - comment_ip, - comment_user_id) - - VALUES(:comment_post_id, - :comment_answer_id, - :comment_parent_id, - :comment_content, - :comment_published, - :comment_ip, - :comment_user_id)"; + comment_parent_id, + comment_content, + comment_published, + comment_ip, + comment_user_id) + VALUES(:comment_post_id, + :comment_parent_id, + :comment_content, + :comment_published, + :comment_ip, + :comment_user_id)"; DB::run($sql, $params); - $sql_last_id = DB::run("SELECT LAST_INSERT_ID() as last_id")->fetch(); - $last_id = $sql_last_id['last_id']; + $sql_last_id = DB::run("SELECT LAST_INSERT_ID() as last_id")->fetch(); - // Отмечаем комментарий, что за ним есть ответ - self::setThereComment($last_id, $params['comment_parent_id']); - - $sql = "SELECT * FROM answers WHERE answer_id = :comment_answer_id"; - $answer = DB::run($sql, ['comment_answer_id' => $params['comment_answer_id']])->fetch(); - - if ($answer['answer_after'] == 0) { - self::setThereAnswer($last_id, $params['comment_answer_id']); - } - - // Add the number of comments for the post + 1 + // Recalculating the number of responses for the post + 1 + // Пересчитываем количество ответов для поста + 1 PostModel::updateCount($post_id, 'comments'); - return $last_id; + return $sql_last_id['last_id']; } - // Editing a comment - // Редактируем комментарий + // Editing the comment + // Редактируем ответ public static function edit($params) { - $sql = "UPDATE comments SET - comment_content = :comment_content, - comment_modified = :comment_modified - WHERE comment_id = :comment_id"; + $sql_two = "UPDATE comments SET comment_content = :comment_content, + comment_modified = :comment_modified, comment_user_id = :comment_user_id + WHERE comment_id = :comment_id"; - return DB::run($sql, $params); + return DB::run($sql_two, $params); } - // Отметим комментарий, что за ним есть ответ - public static function setThereComment($last_id, $comment_id) + // All comments + // Все ответы + public static function getComments($page, $sheet) { - $sql = "UPDATE comments SET comment_after = :last_id WHERE comment_id = :comment_id"; - - return DB::run($sql, ['last_id' => $last_id, 'comment_id' => $comment_id]); - } - - - // Отмечаем ответ, что за ним есть комментарии - public static function setThereAnswer($last_id, $answer_id) - { - $sql = "UPDATE answers SET answer_after = :last_id WHERE answer_id = :answer_id"; - - return DB::run($sql, ['last_id' => $last_id, 'answer_id' => $answer_id]); - } - - // Все комментарии - public static function getComments($page, $limit, $sheet) - { - $hidden = UserData::checkAdmin() ? "" : "AND post_hidden = 0"; + $user_id = UserData::getUserId(); $sort = self::sorts($sheet); - $start = ($page - 1) * $limit; - - $sql = "SELECT + $start = ($page - 1) * self::$limit; + $sql = "SELECT post_id, post_title, post_slug, - post_tl, - post_hidden, - post_feature, post_user_id, post_closed, + post_feature, post_is_deleted, comment_id, - comment_ip, - comment_date, comment_content, - comment_post_id, + comment_date, comment_user_id, - comment_parent_id, - comment_published, + comment_ip, + comment_post_id, comment_votes, - comment_after, comment_is_deleted, + comment_published, votes_comment_item_id, votes_comment_user_id, - id, - login, - avatar, - created_at - FROM comments - JOIN users ON id = comment_user_id - JOIN posts ON comment_post_id = post_id AND post_tl <= :tl - LEFT JOIN votes_comment ON votes_comment_item_id = comment_id - AND votes_comment_user_id = :uid - WHERE $sort $hidden - ORDER BY comment_id DESC LIMIT :start, :limit"; + fav.tid, + fav.user_id, + fav.action_type, + u.id, + u.login, + u.avatar + FROM comments + INNER JOIN users u ON u.id = comment_user_id + INNER JOIN posts ON comment_post_id = post_id + LEFT JOIN votes_comment ON votes_comment_item_id = comment_id + AND votes_comment_user_id = $user_id + LEFT JOIN favorites fav ON fav.tid = comment_id + AND fav.user_id = $user_id + AND fav.action_type = 'comment' + $sort + ORDER BY comment_id DESC LIMIT :start, :limit "; - return DB::run($sql, ['uid' => UserData::getUserId(), 'start' => $start, 'limit' => $limit, 'tl' => UserData::getUserTl()])->fetchAll(); + return DB::run($sql, ['start' => $start, 'limit' => self::$limit])->fetchAll(); } - // Количество комментариев public static function getCommentsCount($sheet) { $sort = self::sorts($sheet); - $sql = "SELECT - comment_id, - comment_is_deleted - FROM comments - JOIN posts ON comment_post_id = post_id AND post_tl <= :tl - WHERE $sort"; + $sql = "SELECT comment_id FROM comments INNER JOIN posts ON comment_post_id = post_id $sort"; - return DB::run($sql, ['tl' => UserData::getUserTl()])->rowCount(); + return DB::run($sql)->rowCount(); } public static function sorts($sheet) { - return $sheet == 'all' ? "comment_is_deleted = 0" : "comment_is_deleted = 1"; + $hidden = UserData::checkAdmin() ? "" : "AND post_hidden = 0"; + + switch ($sheet) { + case 'all': + $sort = "WHERE comment_is_deleted = 0 AND post_tl = 0 AND post_is_deleted = 0 $hidden"; + break; + case 'deleted': + $sort = "WHERE comment_is_deleted = 1"; + break; + } + + return $sort; } - // Получаем комментарии к ответу - public static function getCommentsAnswer($answer_id) + // Number of replies per post + // Количество ответов на пост + public static function getNumberComment($post_id) { + $sql = "SELECT comment_id FROM comments WHERE comment_post_id = :id AND comment_is_deleted = 0"; + + return DB::run($sql, ['id' => $post_id])->rowCount(); + } + + // Add the comment to the end of the post + // Добавим ответ в конец поста + public static function mergePost($post_id, $content) + { + $sql = "UPDATE posts SET post_content = CONCAT(post_content, :content) WHERE post_id = :post_id"; + + $content = "\n\n `+` " . $content; + + return DB::run($sql, ['post_id' => $post_id, 'content' => $content]); + } + + // Getting comments in a post + // Получаем ответы в посте + public static function getCommentsPost($post_id, $type, $sorting = 'new') + { + $user_id = UserData::getUserId(); + + if ($type == 1) { + $sorting = 'top'; + } + + switch ($sorting) { + case 'top': + $sort = 'ORDER BY comment_lo DESC, comment_votes DESC'; + break; + case 'old': + $sort = 'ORDER BY comment_id DESC'; + break; + // new + default: + $sort = ''; + break; + } + $sql = "SELECT comment_id, - comment_user_id, - comment_answer_id, - comment_parent_id, - comment_content, + comment_user_id, + comment_post_id, + comment_parent_id, comment_date, - comment_votes, + comment_content, + comment_modified, comment_published, comment_ip, - comment_after, + comment_votes, + comment_lo, comment_is_deleted, votes_comment_item_id, votes_comment_user_id, - id, - login, - avatar, - created_at - FROM comments - LEFT JOIN users ON id = comment_user_id - LEFT JOIN votes_comment ON votes_comment_item_id = comment_id - AND votes_comment_user_id = :user_id - WHERE comment_answer_id = :answer_id"; + fav.tid, + fav.user_id, + fav.action_type, + u.id, + u.login, + u.avatar, + u.created_at + FROM comments + LEFT JOIN users u ON u.id = comment_user_id + LEFT JOIN votes_comment ON votes_comment_item_id = comment_id + AND votes_comment_user_id = $user_id + LEFT JOIN favorites fav ON fav.tid = comment_id + AND fav.user_id = $user_id + AND fav.action_type = 'comment' + WHERE comment_post_id = $post_id $sort"; - return DB::run($sql, ['user_id' => UserData::getUserId(), 'answer_id' => $answer_id])->fetchAll(); + return DB::run($sql)->fetchAll(); } - // Страница комментариев участника - public static function userComments($page, $limit, $user_id, $id) + // User responses + // Ответы участника + public static function userComments($page, $user_id, $uid_vote) { - $start = ($page - 1) * $limit; + $start = ($page - 1) * self::$limit; $sql = "SELECT comment_id, - comment_user_id, - comment_answer_id, - comment_parent_id, - comment_content, + comment_user_id, + comment_post_id, comment_date, + comment_content, + comment_modified, comment_published, - comment_votes, comment_ip, - comment_after, + comment_votes, comment_is_deleted, votes_comment_item_id, votes_comment_user_id, - post_id, - post_slug, + post_id, post_title, + post_slug, post_user_id, post_closed, post_is_deleted, id, login, avatar - FROM comments - LEFT JOIN users ON id = comment_user_id - LEFT JOIN posts ON comment_post_id = post_id - LEFT JOIN votes_comment ON votes_comment_item_id = comment_id - AND votes_comment_user_id = :id - WHERE comment_user_id = :user_id AND comment_is_deleted = 0 - AND post_is_deleted = 0 AND post_tl = 0 AND post_hidden = 0 - ORDER BY comment_id DESC LIMIT :start, :limit"; + FROM comments + LEFT JOIN users ON id = comment_user_id + LEFT JOIN posts ON comment_post_id = post_id + LEFT JOIN votes_comment ON votes_comment_item_id = comment_id + AND votes_comment_user_id = :uid_vote + WHERE comment_user_id = :user_id AND post_hidden = 0 + AND comment_is_deleted = 0 AND post_is_deleted = 0 AND post_tl = 0 AND post_tl = 0 + ORDER BY comment_id DESC LIMIT :start, :limit "; - return DB::run($sql, ['user_id' => $user_id, 'id' => $id, 'start' => $start, 'limit' => $limit])->fetchAll(); + return DB::run($sql, ['user_id' => $user_id, 'uid_vote' => $uid_vote, 'start' => $start, 'limit' => self::$limit])->fetchAll(); } - // Количество комментариев участника public static function userCommentsCount($user_id) { $sql = "SELECT comment_id - FROM comments - LEFT JOIN posts ON comment_post_id = post_id + FROM comments + LEFT JOIN posts ON comment_post_id = post_id WHERE comment_user_id = :user_id AND comment_is_deleted = 0 - AND post_is_deleted = 0 AND post_tl = 0"; + AND post_is_deleted = 0 AND post_tl = 0 AND post_tl = 0"; return DB::run($sql, ['user_id' => $user_id])->rowCount(); } - // Получаем комментарий по id комментария - public static function getCommentsId($comment_id) + // Information on the id of the comment + // Информацию по id ответа + public static function getCommentId($comment_id) { $sql = "SELECT comment_id, - comment_content, + comment_post_id, comment_user_id, comment_date, - comment_post_id, + comment_modified, + comment_published, + comment_ip, + comment_votes, + comment_content, + comment_lo, comment_is_deleted - FROM comments WHERE comment_id = :comment_id"; + FROM comments + WHERE comment_id = :comment_id"; - return DB::run($sql, ['comment_id' => $comment_id])->fetch(); + return DB::run($sql, ['comment_id' => $comment_id])->fetch(); + } + + /* + * Best comment + */ + + // Choice of the best comment + // Выбор лучшего ответа + public static function setBest($post_id, $comment_id, $selected_best_comment) + { + if ($selected_best_comment) { + DB::run("UPDATE comments SET comment_lo = 0 WHERE comment_id = :id", ['id' => $selected_best_comment]); + } + + self::setCommentBest($comment_id); + + self::commentPostBest($post_id, $comment_id); + } + + // Let's write down the id of the participant who chose the best comment + // Запишем id участника выбравший лучший ответ + public static function setCommentBest($comment_id) + { + $sql = "UPDATE comments SET comment_lo = :user_id WHERE comment_id = :comment_id"; + + return DB::run($sql, ['comment_id' => $comment_id, 'user_id' => UserData::getUserId()]); + } + + // Rewriting the number of the selected best comment in the post + // Переписываем номер выбранного лучший ответ в посте + public static function commentPostBest($post_id, $comment_id) + { + $sql_two = "UPDATE posts SET post_lo = :comment_id WHERE post_id = :post_id"; + + return DB::run($sql_two, ['post_id' => $post_id, 'comment_id' => $comment_id]); } } diff --git a/app/Models/FeedModel.php b/app/Models/FeedModel.php index f06b527f..9fe48de6 100644 --- a/app/Models/FeedModel.php +++ b/app/Models/FeedModel.php @@ -19,7 +19,7 @@ class FeedModel extends \Hleb\Scheme\App\Models\MainModel // Sorting posts by conditions // Сортировка постов по условиям - $sort = "ORDER BY post_answers_count DESC"; + $sort = "ORDER BY post_comments_count DESC"; if (in_array($sheet, ['facet.feed', 'web.feed', 'questions', 'posts'])) { $sort = "ORDER BY post_top DESC, post_date DESC"; } elseif (in_array($sheet, ['admin.posts.all', 'admin.posts.ban', 'profile.posts'])) { @@ -41,7 +41,6 @@ class FeedModel extends \Hleb\Scheme\App\Models\MainModel post_user_id, post_votes, post_hits_count, - post_answers_count, post_comments_count, post_content, post_content_img, diff --git a/app/Models/HomeModel.php b/app/Models/HomeModel.php index 32d4df29..38fc4100 100644 --- a/app/Models/HomeModel.php +++ b/app/Models/HomeModel.php @@ -59,7 +59,6 @@ class HomeModel extends \Hleb\Scheme\App\Models\MainModel post_user_id, post_votes, post_hits_count, - post_answers_count, post_comments_count, post_content, post_content_img, @@ -172,33 +171,33 @@ class HomeModel extends \Hleb\Scheme\App\Models\MainModel // The last 5 responses on the main page // Последние 5 ответа на главной - public static function latestAnswers() + public static function latestComments() { $trust_level = UserData::getUserTl(); - $user_answer = "AND post_tl = 0"; + $user_comment = "AND post_tl = 0"; if ($user_id = UserData::getUserId()) { - $user_answer = "AND answer_user_id != $user_id AND post_tl <= $trust_level"; + $user_comment = "AND comment_user_id != $user_id AND post_tl <= $trust_level"; } $hidden = UserData::checkAdmin() ? "" : "AND post_hidden = 0"; $sql = "SELECT - answer_id, - answer_post_id, - answer_content, - answer_date, + comment_id, + comment_post_id, + comment_content, + comment_date, post_id, post_slug, post_hidden, login, avatar - FROM answers - LEFT JOIN users ON id = answer_user_id - RIGHT JOIN posts ON post_id = answer_post_id - WHERE answer_is_deleted = 0 AND post_is_deleted = 0 $hidden - $user_answer AND post_type = 'post' - ORDER BY answer_id DESC LIMIT 5"; + FROM comments + LEFT JOIN users ON id = comment_user_id + RIGHT JOIN posts ON post_id = comment_post_id + WHERE comment_is_deleted = 0 AND post_is_deleted = 0 $hidden + $user_comment AND post_type = 'post' + ORDER BY comment_id DESC LIMIT 5"; return DB::run($sql)->fetchAll(); } diff --git a/app/Models/PostModel.php b/app/Models/PostModel.php index 69529c94..d094ed77 100644 --- a/app/Models/PostModel.php +++ b/app/Models/PostModel.php @@ -94,7 +94,6 @@ class PostModel extends \Hleb\Scheme\App\Models\MainModel post_user_id, post_ip, post_votes, - post_answers_count, post_comments_count, post_content, post_content_img, @@ -147,7 +146,7 @@ class PostModel extends \Hleb\Scheme\App\Models\MainModel post_title, post_slug, post_feature, - post_answers_count, + post_comments_count, post_type FROM posts LEFT JOIN facets_posts_relation on post_id = relation_post_id @@ -163,7 +162,7 @@ class PostModel extends \Hleb\Scheme\App\Models\MainModel return DB::run($sql, ['post_id' => $post_id, 'user_id' => UserData::getUserId(), 'tl' => $tl, 'limit' => $limit, 'facet_id' => $facet_id])->fetchAll(); } - // $type (comments / answers / hits) + // $type (comments / hits) public static function updateCount($post_id, $type) { $sql = "UPDATE posts SET post_" . $type . "_count = (post_" . $type . "_count + 1) WHERE post_id = :post_id"; @@ -397,7 +396,6 @@ class PostModel extends \Hleb\Scheme\App\Models\MainModel post_user_id, post_votes, post_hits_count, - post_answers_count, post_comments_count, post_content, post_content_img, diff --git a/app/Models/RssModel.php b/app/Models/RssModel.php index 7a05b08f..c0b2b403 100644 --- a/app/Models/RssModel.php +++ b/app/Models/RssModel.php @@ -41,7 +41,6 @@ class RssModel extends \Hleb\Scheme\App\Models\MainModel post_published, post_user_id, post_votes, - post_answers_count, post_comments_count, post_content, post_content_img, diff --git a/app/Models/SearchModel.php b/app/Models/SearchModel.php index 2a166bbe..fa9541ee 100644 --- a/app/Models/SearchModel.php +++ b/app/Models/SearchModel.php @@ -14,8 +14,8 @@ class SearchModel extends \Hleb\Scheme\App\Models\MainModel return self::getWebsite($page, $limit, $query); } - if ($type == 'answer') { - return self::getAnswers($page, $limit, $query); + if ($type == 'comment') { + return self::getComments($page, $limit, $query); } return self::getPosts($page, $limit, $query); @@ -52,14 +52,14 @@ class SearchModel extends \Hleb\Scheme\App\Models\MainModel return DB::run($sql, ['qa' => $query, 'start' => $start, 'limit' => $limit])->fetchAll(); } - public static function getAnswers($page, $limit, $query) + public static function getComments($page, $limit, $query) { $start = ($page - 1) * $limit; - $sql = "SELECT answer_id, answer_content, post_id, post_slug, post_title as title - FROM answers - LEFT JOIN posts ON answer_post_id = post_id + $sql = "SELECT comment_id, comment_content, post_id, post_slug, post_title as title + FROM comments + LEFT JOIN posts ON comment_post_id = post_id WHERE post_is_deleted = 0 - AND answer_content LIKE :qa LIMIT :start, :limit"; + AND comment_content LIKE :qa LIMIT :start, :limit"; return DB::run($sql, ['qa' => "%" . $query . "%", 'start' => $start, 'limit' => $limit])->fetchAll(); } @@ -94,8 +94,8 @@ class SearchModel extends \Hleb\Scheme\App\Models\MainModel public static function getSearchCount($query, $type) { - if ($type == 'answer') { - $sql = "SELECT answer_id FROM answers LEFT JOIN posts ON answer_post_id = post_id WHERE post_is_deleted = 0 AND answer_content LIKE :qa"; + if ($type == 'comment') { + $sql = "SELECT comment_id FROM comments LEFT JOIN posts ON comment_post_id = post_id WHERE post_is_deleted = 0 AND comment_content LIKE :qa"; return DB::run($sql, ['qa' => "%" . $query . "%"])->rowCount(); } diff --git a/app/Models/User/SettingModel.php b/app/Models/User/SettingModel.php index 61cd6c6c..d111cd82 100644 --- a/app/Models/User/SettingModel.php +++ b/app/Models/User/SettingModel.php @@ -89,8 +89,7 @@ class SettingModel extends \Hleb\Scheme\App\Models\MainModel setting_email_pm = :setting_email_pm, setting_email_appealed = :setting_email_appealed, setting_email_post = :setting_email_post, - setting_email_answer = :setting_email_answer, - setting_email_comment = :setting_email_comment + setting_email_answer = :setting_email_answer WHERE setting_user_id = :setting_user_id"; if (!self::countNotifications($params['setting_user_id'])) { @@ -99,14 +98,12 @@ class SettingModel extends \Hleb\Scheme\App\Models\MainModel setting_email_pm, setting_email_appealed, setting_email_post, - setting_email_answer, - setting_email_comment) + setting_email_answer) VALUES(:setting_user_id, :setting_email_pm, :setting_email_appealed, :setting_email_post, - :setting_email_answer, - :setting_email_comment)"; + :setting_email_answer)"; } return DB::run($sql, $params); diff --git a/app/Models/User/UserModel.php b/app/Models/User/UserModel.php index 97ae84ec..ecaea8b8 100644 --- a/app/Models/User/UserModel.php +++ b/app/Models/User/UserModel.php @@ -145,9 +145,9 @@ class UserModel extends \Hleb\Scheme\App\Models\MainModel post_id, post_title, post_slug, - answer_id, - answer_post_id, - answer_content, + comment_id, + comment_post_id, + comment_content, item_id, item_title, item_url, @@ -156,7 +156,7 @@ class UserModel extends \Hleb\Scheme\App\Models\MainModel item_domain FROM favorites fav LEFT JOIN posts ON post_id = fav.tid AND fav.action_type = 'post' - LEFT JOIN answers ON answer_id = fav.tid AND fav.action_type = 'answer' + LEFT JOIN comments ON comment_id = fav.tid AND fav.action_type = 'comment' LEFT JOIN items ON item_id = fav.tid AND fav.action_type = 'website' LEFT JOIN folders_relation fr ON fr.tid = fav.tid LEFT JOIN folders fol ON folder_id = fol.id AND fol.user_id = :uid2 @@ -219,8 +219,6 @@ class UserModel extends \Hleb\Scheme\App\Models\MainModel $sql = "SELECT (SELECT COUNT(post_id) FROM posts WHERE post_user_id = $user_id and post_draft = 0 and post_is_deleted = $condition) AS count_posts, - (SELECT COUNT(answer_id) FROM answers WHERE answer_user_id = $user_id and answer_is_deleted = $condition) AS count_answers, - (SELECT COUNT(comment_id) FROM comments WHERE comment_user_id = $user_id and comment_is_deleted = $condition) AS count_comments, (SELECT COUNT(item_id) FROM items WHERE item_user_id = $user_id and item_is_deleted = $condition) AS count_items"; diff --git a/app/Services/Audit.php b/app/Services/Audit.php index c1682526..9649454e 100644 --- a/app/Services/Audit.php +++ b/app/Services/Audit.php @@ -23,20 +23,17 @@ class Audit extends Base $content_type = Request::getPost('type'); $post_id = Request::getPostInt('post_id'); $content_id = Request::getPostInt('content_id'); - + // Limit the flags if ($this->user['trust_level'] < config('trust-levels.tl_add_report')) return 1; if (AuditModel::getSpeedReport($this->user['id']) > config('trust-levels.perDay_report')) return 1; - + $post = PostPresence::index($post_id, 'id'); + + if (!in_array($content_type, ['post', 'comment'])) return false; - if (!in_array($content_type, ['post', 'answer', 'comment'])) return false; - - $type_id = $content_type == 'answer' ? 'answer_' . $content_id : 'comment_' . $content_id; - $url = post_slug($post['post_id'], $post['post_slug']) . '#' . $type_id; - - $this->create($content_type, $content_id, $url, 'report'); + $this->create($content_type, $content_id, $post, 'report'); return true; } @@ -127,7 +124,7 @@ class Audit extends Base return false; } - public function create(string $type, int $last_content_id, string $url, string $type_notification = 'audit') + public function create(string $type, int $last_content_id, array $post, string $type_notification = 'audit') { $action_type = ($type_notification == 'audit') ? NotificationModel::TYPE_AUDIT : NotificationModel::TYPE_REPORT; @@ -140,6 +137,8 @@ class Audit extends Base ] ); + $url = '/post/' . $post['post_id'] . '/' . $post['post_slug'] . '#' . 'comment_' . $last_content_id; + // Send notification type 21 (audit) to administrator (id 1) // Отправим тип уведомления 21 (аудит) администратору (id 1) NotificationModel::send(UserData::REGISTERED_ADMIN_ID, $action_type, $url); diff --git a/app/Services/AnswerBest.php b/app/Services/CommentBest.php similarity index 61% rename from app/Services/AnswerBest.php rename to app/Services/CommentBest.php index 024f6fa4..cdeb81f5 100644 --- a/app/Services/AnswerBest.php +++ b/app/Services/CommentBest.php @@ -6,42 +6,42 @@ namespace App\Services; use Hleb\Constructor\Handlers\Request; use App\Services\Сheck\PostPresence; -use App\Services\Сheck\AnswerPresence; -use App\Models\AnswerModel; +use App\Services\Сheck\CommentPresence; +use App\Models\CommentModel; use UserData, Access; -class AnswerBest extends Base +class CommentBest extends Base { public function index() { - // Get the answer data (for which the "best answer" is selected) - // Получим данные ответа (на который выбирается "лучший ответ") - $answer = AnswerPresence::index(Request::getPostInt('answer_id')); + // Get the comment data (for which the "best comment" is selected) + // Получим данные комментария (на который выбирается "лучший ответ") + $comment = CommentPresence::index(Request::getPostInt('comment_id')); - // Get the data of the post that has this answer + // Get the data of the post that has this comment // Получим данные поста в котором есть этот ответ - $post = PostPresence::index($answer['answer_post_id'], 'id'); + $post = PostPresence::index($comment['comment_post_id'], 'id'); - // Let's check the access. Only the staff and the author of the post can choose the best answer (without regard to time) + // Let's check the access. Only the staff and the author of the post can choose the best comment (without regard to time) // Проверим доступ. Только персонал и автор поста может выбирать лучший ответ (без учета времени) if ($post['post_user_id'] != UserData::getUserId() && !UserData::checkAdmin()) { return false; } - // If the number of answers is less than 2, then we will not let you choose the best answer + // If the number of answers is less than 2, then we will not let you choose the best comment // Если количество ответов меньше 2, то не дадим выбирать лучший ответ - if ($post['post_answers_count'] < 2) { + if ($post['post_comments_count'] < 2) { return false; } // Если Лучший Ответ уже выбран, то переписываем... if ($post['post_lo']) { - AnswerModel::setBest($post['post_id'], $answer['answer_id'], $post['post_lo']); + CommentModel::setBest($post['post_id'], $comment['comment_id'], $post['post_lo']); return true; } // Если Лучшего ответа нет, то первичная запись - AnswerModel::setBest($post['post_id'], $answer['answer_id'], false); + CommentModel::setBest($post['post_id'], $comment['comment_id'], false); return true; } } diff --git a/app/Services/Favorite.php b/app/Services/Favorite.php index 62cea3dc..cb836e63 100644 --- a/app/Services/Favorite.php +++ b/app/Services/Favorite.php @@ -6,7 +6,7 @@ namespace App\Services; use Hleb\Constructor\Handlers\Request; use App\Models\Item\WebModel; -use App\Models\{FavoriteModel, PostModel, AnswerModel}; +use App\Models\{FavoriteModel, PostModel, CommentModel}; class Favorite extends Base { @@ -15,7 +15,7 @@ class Favorite extends Base $content_id = Request::getPostInt('content_id'); $type = Request::getPost('type'); - $allowed = ['post', 'website', 'answer']; + $allowed = ['post', 'website', 'comment']; if (!in_array($type, $allowed)) { return false; } @@ -36,8 +36,8 @@ class Favorite extends Base case 'website': $content = WebModel::getItemId($content_id); break; - case 'answer': - $content = AnswerModel::getAnswerId($content_id); + case 'comment': + $content = CommentModel::getCommentId($content_id); break; } diff --git a/app/Services/Tree/BuildTree.php b/app/Services/Tree/BuildTree.php index d4512b04..14d50d71 100644 --- a/app/Services/Tree/BuildTree.php +++ b/app/Services/Tree/BuildTree.php @@ -27,10 +27,9 @@ class BuildTree return $siblings; }; + $tree = []; if (isset($grouped[$group])) { $tree = $fnBuilder($grouped[$group]); - } else { - $tree = []; } return $tree; diff --git a/app/Services/Сheck/AnswerPresence.php b/app/Services/Сheck/AnswerPresence.php deleted file mode 100644 index 181cc9a8..00000000 --- a/app/Services/Сheck/AnswerPresence.php +++ /dev/null @@ -1,19 +0,0 @@ -user); - } elseif ($row['action_type'] == 'answer') { - $row['content'] = AnswerModel::getAnswerId($row['content_id']); - - $row['post'] = PostModel::getPost($row['content']['answer_post_id'], 'id', $this->user); } elseif ($row['action_type'] == 'comment') { - $row['content'] = CommentModel::getCommentsId($row['content_id']); - } + $row['content'] = CommentModel::getCommentId($row['content_id']); + + $row['post'] = PostModel::getPost($row['content']['comment_post_id'], 'id', $this->user); + } $result[$ind] = $row; } diff --git a/modules/admin/App/Console.php b/modules/admin/App/Console.php index 0bfd01bc..b76e8c12 100644 --- a/modules/admin/App/Console.php +++ b/modules/admin/App/Console.php @@ -11,7 +11,7 @@ class Console public static function index() { $choice = Request::getPost('type'); - $allowed = ['css', 'topic', 'up', 'tl', 'indexer']; + $allowed = ['css', 'topic', 'post', 'up', 'tl']; if (!in_array($choice, $allowed)) { redirect(url('admin.tools')); } @@ -25,6 +25,13 @@ class Console self::consoleRedirect(); } + public static function post() + { + ConsoleModel::recalculateCountCommentPost(); + + self::consoleRedirect(); + } + public static function up() { $users = ConsoleModel::allUsers(); diff --git a/modules/admin/App/Models/ConsoleModel.php b/modules/admin/App/Models/ConsoleModel.php index 3c5ad939..30055a8f 100644 --- a/modules/admin/App/Models/ConsoleModel.php +++ b/modules/admin/App/Models/ConsoleModel.php @@ -6,28 +6,36 @@ use DB; class ConsoleModel extends \Hleb\Scheme\App\Models\MainModel { + // Let's recalculate the number of posts in the Topics + // Пересчитаем количество постов в Темах public static function recalculateTopic() { $sql = "UPDATE facets SET facet_count = (SELECT count(relation_post_id) FROM facets_posts_relation - LEFT JOIN posts ON relation_post_id = post_id WHERE relation_facet_id = facet_id AND post_is_deleted = 0)"; return DB::run($sql); } + // Let's recalculate the number of сщььутеы in the Posts + // Пересчитаем количество комментариев в Постах + public static function recalculateCountCommentPost() + { + $sql = "UPDATE posts SET post_comments_count = (SELECT count(comment_post_id) FROM comments WHERE comment_post_id = post_id AND comment_is_deleted = 0)"; + + return DB::run($sql); + } + public static function allUp($uid) { $sql = "SELECT (SELECT SUM(post_votes) FROM posts WHERE post_user_id = $uid) AS count_posts, - (SELECT SUM(answer_votes) FROM answers WHERE answer_user_id = $uid) - AS count_answers, (SELECT SUM(comment_votes) FROM comments WHERE comment_user_id = $uid) AS count_comments"; $user = DB::run($sql)->fetch(); - // Вернем сумму, но этот запрос необходим будет далее именно по отдельным типам - return $user['count_posts'] + $user['count_answers'] + $user['count_comments']; + + return $user['count_posts'] + $user['count_comments']; } public static function allUsers() diff --git a/modules/admin/view/default/audit/audits.php b/modules/admin/view/default/audit/audits.php index 55d5c867..769fd93e 100644 --- a/modules/admin/view/default/audit/audits.php +++ b/modules/admin/view/default/audit/audits.php @@ -38,7 +38,7 @@
- +
(id:) diff --git a/modules/admin/view/default/tools/tools.php b/modules/admin/view/default/tools/tools.php index 87d61db5..9c8eea17 100644 --- a/modules/admin/view/default/tools/tools.php +++ b/modules/admin/view/default/tools/tools.php @@ -21,6 +21,10 @@
+
+ +
+
diff --git a/public/assets/css/rtl.css b/public/assets/css/rtl.css index cdaa1c93..6536c577 100644 --- a/public/assets/css/rtl.css +++ b/public/assets/css/rtl.css @@ -1 +1 @@ -.dropdown,.delet-count{right:unset;left:0}.mr5{margin-right:0;margin-left:5px}.mr10{margin-right:0;margin-left:10px}.ml5{margin-left:0;margin-right:5px}.right-close{padding:5px;float:left}.showPassword{left:5px;right:auto}.dropdown.user{padding:1rem .7rem .7rem 0}.d-header_contents .btn-outline-primary{width:120px}.box-search{margin:10px 0 10px 45px}.block-answer .right{float:left} \ No newline at end of file +.dropdown,.delet-count{right:unset;left:0}.mr5{margin-right:0;margin-left:5px}.mr10{margin-right:0;margin-left:10px}.ml5{margin-left:0;margin-right:5px}.right-close{padding:5px;float:left}.showPassword{left:5px;right:auto}.dropdown.user{padding:1rem .7rem .7rem 0}.d-header_contents .btn-outline-primary{width:120px}.box-search{margin:10px 0 10px 45px}.block-comment .right{float:left} \ No newline at end of file diff --git a/public/assets/css/style.css b/public/assets/css/style.css index 880856d3..4b241b6f 100644 --- a/public/assets/css/style.css +++ b/public/assets/css/style.css @@ -1 +1 @@ -:root{--font-family:-apple-system, BlinkMacSystemFont, Arial, sans-serif;--line-height:1.5;--font-size:1rem;--bg-color:#fff;--text-color:#030303;--link-color:#118bee;--link-color-hover:#ef4444;--nav-bg-active:#fcebd9;--nav-color-active:#332f2f;--dropdown-bg:#fff;--dropdown-box-shadow:0 6px 18px 0 rgba(14, 21, 47, .13), 0 -2px 6px rgba(14, 21, 47, .03);--border-radius:3px;--form-color-active:#3595f6;--form-bg-color:#fff;--form-border-color:#ddd;--form-text-color:#111;--button-text-color:#fff;--button-bg-color:#0085ee;--button-border-color:#0379d7;--button-border-color-hover:#fff;--button-outline-text-color:#0085ee;--button-outline-bg-color:#fff;--button-outline-border-color:#0379d7;--button-outline-text-color-hover:#fff;--button-outline-bg-color-hover:#0085ee;--button-outline-border-color-hover:#0379d7;--header-bg:#fff;--header-box-shadow:0 1px 2px -1px rgb(0 0 0 / 25%);--header-text-color:#9ca3af;--header-logo-color:#111;--header-form-bg-color:#f3f4f6;--header-form-text-color:#333;--footer-bg:#fff;--footer-box-shadow:0 -5px 5px -5px rgb(0 0 0 / 15%);--footer-text-color:#9ca3af;--footer-color-active:#332f2f;--black:#030303;--white:#fff;--yellow:#f7f7eb;--brown:#bb6619;--green:#16a34a;--sky:#0ea5e9;--violet:#f3f1ed;--red:#ef4444;--red-200:#fecaca;--gray:#4b5563;--gray-100:#f3f4f6;--gray-600:#9ca3af;--blue:#3b82f6;--slate:#cbd5e1;--beige:#fff4e8}body.dark{--bg-color:#202b38;--text-color:#fff;--link-color:#118bee;--link-color-hover:#ef4444;--nav-bg-active:#161f27;--nav-color-active:#fff;--dropdown-bg:#202b38;--dropdown-box-shadow:0 6px 18px 0 rgba(14, 21, 47, .13), 0 -2px 6px rgba(14, 21, 47, .03);--form-color-active:#1e2830;--form-bg-color:#283541;--form-border-color:#252830;--form-text-color:#fff;--border-radius:3px;--button-text-color:#bfcad3;--button-bg-color:#1e2226;--button-border-color:#1e2226;--button-border-color-hover:#ddd;--button-outline-text-color:#bfcad3;--button-outline-bg-color:#3f4851;--button-outline-border-color:#3f4851;--button-outline-text-color-hover:#bfcad3;--button-outline-bg-color-hover:#555f6a;--button-outline-border-color-hover:#555f6a;--header-bg:#1a2630;--header-box-shadow:0 1px 2px -1px rgb(0 0 0 / 25%);--header-text-color:#fff;--header-logo-color:#fff;--header-form-bg-color:#161f27;--header-form-text-color:#fff;--footer-bg:#1a2630;--footer-box-shadow:0 -5px 5px -5px rgb(0 0 0 / 15%);--footer-text-color:#eee;--footer-color-active:#ccc;--black:#fff;--white:#161f27;--gray:#a7a7a7;--gray-100:#161f27;--violet:#161f27;--slate-100:#161f27}body.dark .EasyMDEContainer .CodeMirror{background-color:var(--form-bg-color);color:var(--form-text-color)}body.dark .box{background-color:var(--gray-100)}body.dark .tagify{background-color:var(--form-bg-color)}body.dark .bg-lightyellow,body.dark .menu__left.menu__active .menu li{background-color:var(--form-bg-color)}body.dark .content_tree:target,body.dark .content_tree.edit{background-color:var(--form-bg-color)}body.dark blockquote{background-color:#5f5f67;border-left:3px solid #6d6e6f}#contentWrapper{display:flex;gap:1.25rem}h1,h2,h3,h4,h5{font-weight:600}.number-notif{display:none;font-size:.72rem;color:#fff;background-color:red;padding:1px 6px;border-radius:50%;position:absolute;top:-5px;right:-10px}.number-notif.show,.video-pl{display:block}.icons{width:21px;height:21px;fill:none;stroke:currentColor;vertical-align:middle}.icon-max{width:121px;height:121px}.icon-base{width:48px;height:48px}.icon-small{width:15px}.list-none{list-style:none;padding:0;margin:0}.d-header{top:0;z-index:6;position:sticky;background-color:var(--header-bg);color:var(--header-text-color);box-shadow:var(--header-box-shadow);backface-visibility:hidden;height:3.5em;margin-bottom:15px}.medium-zoom--opened .d-header{display:none}.banner{background-image:url(/assets/images/banner-fon.jpg);background-size:cover;filter:brightness(1.1);text-align:center;border-radius:5px;padding:1.25rem 0;margin-top:-1rem;margin-bottom:1.25rem;color:#333}.wrap{margin:0 auto;height:100%;max-width:1436px;padding-left:1rem;padding-right:1rem}.wrap.wrap-max{max-width:100%;padding-left:2rem;padding-right:2rem}.d-header_contents{display:flex;align-items:center;height:100%;position:relative;justify-content:space-between;margin:0 .5rem 0 .5rem}.search{width:100%;border-radius:5px;background-color:var(--header-form-bg-color);color:var(--header-form-text-color);padding:9px;border-color:transparent}.box-search{position:relative;width:63%;margin:10px 45px 10px 0}.box-results{position:absolute;border-radius:3px;box-shadow:0 2px 4px -1px rgba(0,0,0,.15);background-color:var(--white);padding:15px;z-index:2}.d-header.show .d-header-post.none,.d-header.show .d-header-facet.none{display:block;position:relative;width:100%;font-size:18px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.v-line{border-left:1px solid var(--gray-600);height:20px;display:inline-block;margin:0 10px 0 15px;vertical-align:middle}.d-header.scroll-hide-search.show .box-search{display:none}.box-logo{width:209px;align-items:center;display:flex;gap:.5rem;color:var(--gray-600)}.cut-off{width:75%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}aside{width:340px}aside ul{list-style:none;padding:0;margin:0;font-size:.9375rem}aside ul a{color:var(--gray)}blockquote{margin-left:15px;background-color:#f3f3f6;padding:.1rem 1rem;border-left:3px solid #d2d6dd;display:table}.blockquote-profile{margin-bottom:20px;max-width:300px;word-wrap:break-word;padding:.1rem 1rem;border-left:3px solid #d2d6dd;font-size:.91rem}.blockquote-profile p{margin:2px}hr{border:none;clear:both;background-color:#ddd;height:1px}details{border-radius:0 0 3px 3px;background-color:#f5f5fa;padding:2px 6px;margin:0 0 15px 0}summary{background-color:#f5f5fa;color:#666;font-size:14px}details[open]>summary{padding:0 0 10px 0;color:#666}.title{margin:0;font-weight:500;font-size:1.3125rem}.txt-closed{padding:10px;background-color:lightyellow;margin-bottom:15px;display:inherit;color:var(--gray-600)}.box{border-radius:5px;padding:1.25rem;margin-bottom:1.25rem;overflow-wrap:break-word}.box-small{border-radius:3px;color:var(--white);text-align:center;padding:5px 10px}.box-flex{display:flex;border-radius:5px;position:relative;flex-direction:row;align-items:center;padding:1.25rem;margin-bottom:1.25rem}.box-center{position:absolute;top:50%;left:50%;margin-right:-50%;transform:translate(-50%,-50%)}.search-input{width:300px;height:50px;padding-left:1.25rem;border-radius:3px}.search-button-icon{border:none;height:50px;width:50px;color:#4f5b66;font-size:18px;border-radius:3px}.list-post{display:flex;padding:.5rem 0}ul.last-content li{margin-bottom:15px}ul.last-content a.last-content_telo{display:block;word-wrap:break-word}.uppercase-box{font-size:.75rem;text-transform:uppercase;margin:0 0 10px 0;letter-spacing:1.5px;font-weight:500}.trigger img,a:hover>img{opacity:.8}.focus-id:hover{cursor:pointer}.underline-hover:hover{text-decoration:underline}.content-body{max-width:810px;overflow-wrap:break-word}.content_tree{word-wrap:break-word}.content_tree:target,.content_tree.edit{background-clip:content-box;background-color:lightyellow;margin-top:-70px;padding-top:70px}ol.bg-red-200{display:table;width:100%}.bg-red-200 .content_tree,.content_tree.bg-red-200{background-color:var(--red-200)}.ind-first-p p{margin:.5em 0;max-width:780px}article iframe{max-width:560px;max-height:320px}video{max-width:560px}.qa-comment{font-size:.875rem;padding:.24rem 0}.showPassword{position:absolute;color:var(--gray-600);right:5px;margin:5px}.scroll-menu{overflow-x:auto;scrollbar-width:none}.scroll-menu::-webkit-scrollbar{width:0;height:0}.scroll-wrapper{overflow:hidden;padding:0;position:relative}.scroll-wrapper.conversationMessages{height:calc(100% - 62px)}.delet-count{z-index:3;right:10px;font-size:.8em;color:#fff;background-color:rgba(0,0,0,.3);padding:1px 6px;position:absolute;display:flex;gap:1rem}.icon-share{color:#fff;height:28px;width:28px;margin:3px}.bg-vk{background-color:#07f}.bg-ok{background-color:#eb722e}.bg-tg{background-color:#64a9dc}.bg-fb{background-color:#3b5998}.bg-lj{background-color:#0d425a}.bg-tw{background-color:#00aced}.menu__left{width:210px;padding-right:20px}.menuno .menu__left{display:none}.dropdown,.menu,.breadcrumbs{list-style:none;margin:0;padding:0}.menu a i{font-size:1.25rem;margin:0 .5rem}.dropdown{display:none;position:absolute;right:0;background-color:var(--dropdown-bg);box-shadow:var(--dropdown-box-shadow);padding:.5rem;z-index:15;min-width:215px}.dropdown.user{top:0;padding:1rem 0 .7rem 0}.right-close{color:var(--gray-600);padding:3px 8px 0 0;margin-top:-20px;float:right;display:block}.user-box{padding:0 0 .7rem 1rem;display:flex;align-items:center;font-size:.975rem}.user-nav li a{margin-left:10px}.dropdown.left{left:0;width:150px}.menu a,.dropdown li>a,.dropdown li>div{color:var(--gray);padding:5px;display:flex;flex-direction:row;align-items:center;gap:.7rem}.dropdown li:hover>a,.dropdown li>a.active,.dropdown li>div.active{color:var(--link-color-hover)}.menu__left:not(.menu__active) li{margin-bottom:3px}.menu li.active,.menu li:hover{background-color:var(--gray-100);border-radius:var(--border-radius)}.menu li:hover{transition-duration:.3s}.menu li:hover>a{color:var(--gray)}.breadcrumbs li{display:inline;color:var(--gray-600)}.breadcrumbs li:not(:last-child):after{content:" / "}ul.nav{list-style:none;align-items:center;display:flex;gap:.7rem;margin:0;padding:0}ul.nav>li{padding:6px 12px}ul.nav.small>li{padding:3px 6px}ul.nav>li>a{color:var(--gray-600)}ul.nav>li.active{background-color:var(--nav-bg-active);border-radius:var(--border-radius);color:var(--nav-color-active)}ul.nav>li.active>a{color:var(--nav-color-active)}ul.nav>li a:hover{color:var(--link-color-hover)}ul.nav>li.active a:hover{color:var(--nav-color-active)}.content-tabs{display:none}.content-tabs.tab_active{display:block;color:var(--nav-color-active)}html{height:100%;overflow-y:scroll}*,*::before,*::after{box-sizing:border-box}:active,:hover,:focus{outline:0;outline-offset:0}body{line-height:var(--line-height);font-family:var(--font-family);font-size:var(--font-size);background-color:var(--bg-color);color:var(--text-color);padding:0;margin:0}a{color:var(--link-color);cursor:pointer;text-decoration:none}a:hover,a:focus,a:active{color:var(--link-color-hover)}img{border-radius:var(--border-radius);vertical-align:middle}.top-sm{top:70px}.mr-auto{margin:0 auto}.m0{margin:0}.m5{margin:5px}.mt5{margin-top:5px}.mr5{margin-right:5px}.mb5{margin-bottom:5px}.ml5{margin-left:5px}.m10{margin:10px}.mt10{margin-top:10px}.mr10{margin-right:10px}.mb10{margin-bottom:10px}.ml10{margin-left:10px}.m15{margin:15px}.mt15{margin-top:15px}.mr15{margin-right:15px}.mb15{margin-bottom:15px}.ml15{margin-left:15px}.mt20{margin-top:20px}.mr20{margin-right:20px}.mb20{margin-bottom:20px}.ml20{margin-left:20px}.ml30{margin-left:30px}.p5{padding:5px}.p15{padding:15px}.p5-10{padding:5px 10px}.p10-5{padding:10px 5px}.indent-body{margin:0 8px}.black{color:var(--black)}.white{color:var(--white)}.yellow{color:var(--yellow)}.green{color:var(--green)}.gray{color:var(--gray)}.gray-600{color:var(--gray-600)}.sky{color:var(--sky)}.red{color:var(--red)}.brown{color:var(--brown)}.bg-black{background-color:var(--black)}.bg-white{background-color:var(--white)}.bg-green{background-color:var(--green)}.bg-yellow{background-color:var(--yellow)}.bg-lightyellow{background-color:lightyellow}.bg-lightgray{background-color:var(--gray-100)}.bg-violet{background-color:var(--violet)}.bg-blue{background-color:var(--blue)}.bg-red-200{background-color:var(--red-200)}.bg-beige{background-color:var(--beige)}.active{color:var(--red)}.shadow{box-shadow:0 4px 14px rgba(0,0,0,.15)}.shadow-bottom{box-shadow:0 10px 20px rgba(0,0,0,.1)}.br-gray{border:1px solid var(--gray-100)}.br-dotted{border:1px dotted var(--form-border-color)}.br-bottom{border-bottom:1px solid var(--form-border-color)}.br-lightgray{border:5px solid var(--gray-100)}li.br-top-zebra+li{border-top:1px solid var(--gray-100)}li.br-li-bottom-no:last-child{border-bottom:1px solid transparent}.w-auto{width:auto}.w-20{width:20%}.w-30{width:30%}.w-40{width:40%}.w-50{width:50%}.w-60{width:60%}.w-70{width:70%}.w-90{width:90%}.w-100{width:100%}.w20{width:20px}.w30{width:30px}.w40{width:40px}.w50{width:50px}.w60{width:60px}.w94{width:94px}.w160{width:160px}.w200{width:200px}.max-w-100{max-width:100%}.max-w780{max-width:780px}.max-w300{max-width:300px}.min-w75{min-width:75px}.text-xs{font-size:.75rem}.text-sm{font-size:.875rem}.text-base{font-size:1rem}.text-lg{font-size:1.125rem}.text-xl{font-size:1.25rem}.text-2xl{font-size:1.5rem}.text-3xl{font-size:1.875rem}.text-4xl{font-size:2.25rem}.text-5xl{font-size:3rem}.text-6xl{font-size:3.75rem}.text-7xl{font-size:4.5rem}.text-8xl{font-size:6rem}.grid{display:grid}.gap{gap:1rem}.gap-min{gap:.5rem}.gap-max{gap:2.5rem}.flex{display:flex}.fixed{position:fixed}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.flex-auto{flex:1 1 0%}.clear{clear:both}.left{float:left}.right{float:right}.center{text-align:center}.align-right{text-align:right}.middle{vertical-align:middle}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.items-center{align-items:center}.italic{font-style:italic}.sticky{position:sticky}.absolute{position:absolute}.relative{position:relative}.hidden{overflow:hidden}.none{display:none}.block{display:block}.table{display:table}.inline{display:inline-block}.break-all{word-break:break-all}.pointer{cursor:pointer}.logo{color:var(--header-logo-color);font-size:21px}.favicons{height:18px;width:18px}.img-sm{width:24px;height:24px}.img-base{width:36px;height:36px}.img-lg{width:64px;height:64px}.img-xl{width:94px;height:94px}.img-2xl{width:160px;height:160px}.trigger img.img-base:hover{opacity:.7}.profile-ava{position:absolute;z-index:5;margin:60px 10px 0 15px;border-radius:var(--border-radius)}.box-cover-img{height:200px;width:100%}.profile-bg-img.bg-profile{height:90px}.medium-zoom-overlay{position:fixed;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .3s;will-change:opacity}.medium-zoom--opened .medium-zoom-overlay{cursor:pointer;cursor:zoom-out;opacity:1}.medium-zoom-image{cursor:pointer;cursor:zoom-in;transition:transform .3s cubic-bezier(.2,0,.2,1)}.medium-zoom-image--hidden{visibility:hidden}.medium-zoom-image--opened{position:relative;cursor:pointer;cursor:zoom-out;will-change:transform}.img-preview{max-width:780px;position:relative}.img-preview img{max-width:100%;border:1px solid #f3f3f3}.cut-post img,.content-body img,.medium-zoom-image{max-width:100%}.img-preview img:hover{box-shadow:0 1px 8px 0 rgb(0 0 0 / 20%)}.CodeMirror-line{max-width:800px}img.emoji{max-width:20px;display:inline-block;border-color:transparent}input,select,textarea{background-color:var(--form-bg-color);border:1px solid var(--form-border-color);color:var(--form-text-color);font-size:16px}textarea{width:100%}fieldset input:not([type=radio]):not([type=checkbox]):not([type=range]),fieldset select{width:100%;min-height:34px;padding:5px}fieldset{padding:0;border:0;position:relative;margin:10px 0}fieldset.error input{border-color:var(--red)}.help{font-size:.875rem;color:var(--gray-600)}input:focus,textarea:focus{border:1px solid var(--form-color-active)}label{display:block;margin-bottom:4px;font-size:.875rem}::placeholder{color:var(--gray)}table{margin-bottom:1.5rem;width:100%;border-collapse:collapse;border-spacing:0}table td,table th{font-size:14px;padding:5px}table thead th{border-bottom:2px solid rgba(222,226,230,.5);text-align:left}table tr:nth-of-type(2n){background-color:var(--gray-100)}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;background-color:transparent;border:1px solid transparent;padding:.35rem 1rem;border-radius:.2rem}.btn-small{padding:.15rem .35rem;font-size:.775rem}.btn-primary{color:var(--button-text-color);background-color:var(--button-bg-color);border-color:var(--button-border-color)}.btn-outline-primary{color:var(--button-outline-text-color);background-color:var(--button-outline-bg-color);border-color:var(--button-outline-border-color)}.btn-primary:hover,.btn-primary:focus{color:var(--button-border-color-hover);opacity:.8}.btn-outline-primary:hover,.btn-outline-primary:focus{color:var(--button-outline-text-color-hover);background-color:var(--button-outline-bg-color-hover);border-color:var(--button-outline-border-color-hover)}.focus-id:hover{opacity:.8}.tag,.tag-grey,.tag-yellow,.tag-violet,.tag-clear{font-size:.9rem;border-radius:var(--border-radius);margin-left:.25em;padding:.08rem .35rem .15rem .35rem;text-transform:lowercase;text-decoration:none}.tag{background-color:#ddebf9;color:#4596de}.tag:hover{background-color:#5fb878;color:#fff}.tag-grey{background-color:#ececec;color:#6b3e4a}.tag-grey:hover{background-color:#fff;color:#444}.tag-yellow{background-color:#fffcd7;color:#7b5d5d}.tag-violet{background-color:var(--violet);color:#544e4e}.tag-clear{color:#707476;background-color:var(--white);border:1px solid #e8ebed}.tag-clear:hover{color:#707476;background-color:#f5f7f8}.label{font-style:italic;text-transform:lowercase;font-size:.875rem;padding:3px 10px;font-weight:400}.label-grey{background-color:var(--violet);color:var(--gray-600)}.label-orange{background-color:#f9ddde;color:var(--gray)}.label-green{background-color:#f0f6f3;color:var(--green)}.label-red{background-color:#fff4e8;color:var(--red)}.label-teal{background-color:var(--teal);color:var(--white)}.label-teal:hover{background-color:#339a9c;transition:background .2s ease-out}.tagify{width:100%;max-width:780px}.tagify--noTags[required]{--tags-border-color:var(--red)}.poll{padding:5px 10px;list-style:none;box-shadow:0 0 5px rgb(0 0 0 / 10%);border:1px solid #f3f4f6}.poll-count{float:left;padding-right:10px;width:48px;font-size:.8em;margin-top:1px;color:var(--gray-600)}.poll-result{padding-left:48px}.poll-label{font-size:.9em;color:var(--gray)}progress,progress[role]{appearance:none;-moz-appearance:none;-webkit-appearance:none;background-size:auto}progress{vertical-align:baseline;display:block;width:100%;border:0;margin-bottom:20px;background:#f8f8f8;height:7px;border-radius:500px;overflow:hidden}::-webkit-progress-bar{background:#f8f8f8}progress[value^="0"]::-moz-progress-bar,progress[value^="1"]::-moz-progress-bar,progress[value^="2"]::-moz-progress-bar,progress[value^="0"]::-webkit-progress-value,progress[value^="1"]::-webkit-progress-value,progress[value^="2"]::-webkit-progress-value{background-color:#0ea5e9}progress[value^="3"]::-moz-progress-bar,progress[value^="4"]::-moz-progress-bar,progress[value^="5"]::-moz-progress-bar,progress[value^="3"]::-webkit-progress-value,progress[value^="4"]::-webkit-progress-value,progress[value^="5"]::-webkit-progress-value{background-color:#0085ee}progress[value^="6"]::-moz-progress-bar,progress[value^="7"]::-moz-progress-bar,progress[value^="8"]::-moz-progress-bar,progress[value^="6"]::-webkit-progress-value,progress[value^="7"]::-webkit-progress-value,progress[value^="8"]::-webkit-progress-value{background-color:green}progress[value^="9"]::-moz-progress-bar,progress[value="100"]::-moz-progress-bar,progress[value^="9"]::-webkit-progress-value,progress[value="100"]::-webkit-progress-value{background-color:red}.modal{display:flex;align-items:center;justify-content:center;position:fixed;z-index:10;width:100%;height:100%}.model-inner{background-color:#fff;border-radius:var(--border-radius);max-width:600px;padding:2em;margin:auto}.modal-header{display:flex;align-items:center;justify-content:space-between;border-bottom:2px solid #000}.overlay{width:100%;height:100%;position:fixed;top:0;left:0;background:#000;opacity:.75}.dialog-container{display:flex;position:fixed;top:0;left:0;bottom:0;right:0;z-index:6}.dialog-container[aria-hidden='true']{display:none}.dialog-overlay{position:fixed;top:0;left:0;bottom:0;right:0;background-color:rgba(43,46,56,.9);animation:fade-in 200ms both}.dialog-content{background-color:rgb(255,255,255);margin:auto;z-index:6;position:relative;animation:fade-in 400ms 200ms both,slide-up 400ms 200ms both;padding:1em;max-width:90%;width:600px;border-radius:var(--border-radius)}@media screen and (min-width:700px){.dialog-content{padding:2em}}.dialog-close{position:absolute;top:.5em;right:.5em;border:0;padding:0;background-color:transparent;font-size:2em;text-align:center;cursor:pointer;transition:0.15s;color:var(--gray-600)}@media screen and (min-width:700px){.dialog-close{top:5px}}footer{background-color:var(--footer-bg);color:var(--footer-text-color);padding:.5rem;overflow:hidden;margin-top:1rem;box-shadow:var(--footer-box-shadow)}footer.small-sidebar{background-color:transparent;color:var(--footer-text-color);font-size:.875rem;padding:0 .25rem;margin:0 .25rem}footer .icon{color:var(--footer-text-color);margin-right:1rem}footer ul{padding-left:60px;list-style:none;margin:0}footer ul li a{font-size:14px;color:var(--footer-text-color);margin-bottom:5px}footer ul li a:hover,footer .icon:hover{color:var(--footer-color-active)}.notice{animation-name:toastEffect;animation-timing-function:ease-in;background-color:var(--gray);border-radius:var(--border-radius);box-shadow:0 5px 15px 0 rgba(221,221,221,1);color:var(--white);display:inline-block;padding:2px 20px;position:fixed;text-align:center;text-decoration:none;z-index:2147483647}.notice-bottom{bottom:1rem}.notice-center{left:0;margin-left:auto;margin-right:auto;max-width:fit-content;right:0}.notice-left{left:1rem}.notice-right{right:1rem}.notice-top{top:1rem}@keyframes toastEffect{0%{opacity:0}100%{opacity:0}20%{opacity:1}80%{opacity:1}}main{width:calc(100% - 590px)}.admin main{width:calc(100% - 210px)}.menuno main{width:calc(100% - 340px)}.menuno main.w-100{width:100%}@media (max-width:1050px){.menu__left,#togglemenu{display:none}aside{min-width:240px}main{width:calc(100% - 250px)}.admin main{width:100%}.menu__button{transition:0.3s ease;display:block}.menu__left{opacity:0;visibility:hidden;transition-property:opacity,visibility;z-index:98;left:0;top:0;bottom:0;min-width:180px;background-color:var(--dropdown-bg);box-shadow:5px 0 5px -5px rgba(0,0,0,.25);overflow-x:hidden;position:absolute;padding-right:0}.menu__left.menu__active,.menu__left.menu-none.menu__active{opacity:1;visibility:visible;transition:0.25s;position:fixed;display:block}.menu__left.menu__active ul.top-sm{top:0}.menu__left.menu__active .menu li{background-color:#fff;padding-left:10px}}@media (max-width:780px){.mb-w80{width:80px}.mb-w150{width:150px}.mb-p10{padding:10px}.mb-mt5{margin-top:5px}.mb-mt25{margin-top:25px}.mb-ml10{margin-left:10px}.mb-text-xl{font-size:1.25rem}.logo{font-size:18px}.gap-max{gap:1.5rem}.footer ul{padding-left:0}.mb-img-2xl{height:65px;width:65px}.box-cover-img{height:75px}.title{font-size:1.2125rem}.mb-block,#contentWrapper{display:block}.mb-w-100,iframe,video{width:100%}.box{padding:1rem;border-radius:0}aside,.mb-none,ul.setting>li>a>i{display:none}main,.menuno main{width:100%}.wrap{padding-left:0;padding-right:0}}code{color:#9b4f5e;background-color:#f5f2f0;padding:3px;border-radius:var(--border-radius);font-size:14px}pre{white-space:pre-wrap;word-wrap:break-word;background:#f5f2f0;padding:.2em .5em}.token.tag,.token.tag:hover{background-color:transparent}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}div.code-toolbar{position:relative}div.code-toolbar>.toolbar{position:absolute;z-index:10;top:.3em;right:.2em;transition:opacity .3s ease-in-out;opacity:0}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar:focus-within>.toolbar{opacity:1}div.code-toolbar>.toolbar>.toolbar-item{display:inline-block}div.code-toolbar>.toolbar>.toolbar-item>a{cursor:pointer}div.code-toolbar>.toolbar>.toolbar-item>button{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-toolbar>.toolbar>.toolbar-item>a,div.code-toolbar>.toolbar>.toolbar-item>button,div.code-toolbar>.toolbar>.toolbar-item>span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224,224,224,.2);box-shadow:0 2px 0 0 rgba(0,0,0,.2);border-radius:.5em}div.code-toolbar>.toolbar>.toolbar-item>a:focus,div.code-toolbar>.toolbar>.toolbar-item>a:hover,div.code-toolbar>.toolbar>.toolbar-item>button:focus,div.code-toolbar>.toolbar>.toolbar-item>button:hover,div.code-toolbar>.toolbar>.toolbar-item>span:focus,div.code-toolbar>.toolbar>.toolbar-item>span:hover{color:inherit;text-decoration:none} \ No newline at end of file +:root{--font-family:-apple-system, BlinkMacSystemFont, Arial, sans-serif;--line-height:1.5;--font-size:1rem;--bg-color:#fff;--text-color:#030303;--link-color:#118bee;--link-color-hover:#ef4444;--nav-bg-active:#fcebd9;--nav-color-active:#332f2f;--dropdown-bg:#fff;--dropdown-box-shadow:0 6px 18px 0 rgba(14, 21, 47, .13), 0 -2px 6px rgba(14, 21, 47, .03);--border-radius:3px;--form-color-active:#3595f6;--form-bg-color:#fff;--form-border-color:#ddd;--form-text-color:#111;--button-text-color:#fff;--button-bg-color:#0085ee;--button-border-color:#0379d7;--button-border-color-hover:#fff;--button-outline-text-color:#0085ee;--button-outline-bg-color:#fff;--button-outline-border-color:#0379d7;--button-outline-text-color-hover:#fff;--button-outline-bg-color-hover:#0085ee;--button-outline-border-color-hover:#0379d7;--header-bg:#fff;--header-box-shadow:0 1px 2px -1px rgb(0 0 0 / 25%);--header-text-color:#9ca3af;--header-logo-color:#111;--header-form-bg-color:#f3f4f6;--header-form-text-color:#333;--footer-bg:#fff;--footer-box-shadow:0 -5px 5px -5px rgb(0 0 0 / 15%);--footer-text-color:#9ca3af;--footer-color-active:#332f2f;--blockquote-bg:#f3f3f6;--black:#030303;--white:#fff;--yellow:#f7f7eb;--brown:#bb6619;--green:#16a34a;--sky:#0ea5e9;--violet:#f3f1ed;--red:#ef4444;--red-200:#fecaca;--gray:#4b5563;--gray-100:#f3f4f6;--gray-600:#9ca3af;--blue:#3b82f6;--slate:#cbd5e1;--beige:#fff4e8}body.dark{--bg-color:#202b38;--text-color:#fff;--link-color:#118bee;--link-color-hover:#ef4444;--nav-bg-active:#161f27;--nav-color-active:#fff;--dropdown-bg:#202b38;--dropdown-box-shadow:0 6px 18px 0 rgba(14, 21, 47, .13), 0 -2px 6px rgba(14, 21, 47, .03);--form-color-active:#1e2830;--form-bg-color:#283541;--form-border-color:#252830;--form-text-color:#fff;--border-radius:3px;--button-text-color:#bfcad3;--button-bg-color:#1e2226;--button-border-color:#1e2226;--button-border-color-hover:#ddd;--button-outline-text-color:#bfcad3;--button-outline-bg-color:#3f4851;--button-outline-border-color:#3f4851;--button-outline-text-color-hover:#bfcad3;--button-outline-bg-color-hover:#555f6a;--button-outline-border-color-hover:#555f6a;--header-bg:#1a2630;--header-box-shadow:0 1px 2px -1px rgb(0 0 0 / 25%);--header-text-color:#fff;--header-logo-color:#fff;--header-form-bg-color:#161f27;--header-form-text-color:#fff;--footer-bg:#1a2630;--footer-box-shadow:0 -5px 5px -5px rgb(0 0 0 / 15%);--footer-text-color:#eee;--footer-color-active:#ccc;--blockquote-bg:#2e3d49;--black:#fff;--white:#161f27;--gray:#a7a7a7;--gray-100:#161f27;--violet:#161f27;--slate-100:#161f27}body.dark .EasyMDEContainer .CodeMirror{background-color:var(--form-bg-color);color:var(--form-text-color)}body.dark .box{background-color:var(--gray-100)}body.dark .tagify{background-color:var(--form-bg-color)}body.dark .bg-lightyellow,body.dark .menu__left.menu__active .menu li{background-color:var(--form-bg-color)}body.dark .content_tree:target,body.dark .content_tree.edit{background-color:var(--form-bg-color)}body.dark .content_tree{word-wrap:break-word;box-shadow:0 15px 25px rgba(0,0,0,.1);padding:5px}body.dark blockquote{background-color:var(--blockquote-bg);border-left:3px solid #6d6e6f}body.dark :not(pre)>code[class*=language-],pre[class*=language-]{background:var(--blockquote-bg)}body.dark code[class*=language-],pre[class*=language-]{color:#eee;text-shadow:none}#contentWrapper{display:flex;gap:1.25rem}h1,h2,h3,h4,h5{font-weight:600}.number-notif{display:none;font-size:.72rem;color:#fff;background-color:var(--red);padding:1px 6px;border-radius:50%;position:absolute;top:-5px;right:-10px}.number-notif.show,.video-pl{display:block}.icons{width:21px;height:21px;fill:none;stroke:currentColor;vertical-align:middle}.icon-max{width:121px;height:121px}.icon-base{width:48px;height:48px}.icon-small{width:15px}.list-none{list-style:none;padding:0;margin:0}.d-header{top:0;z-index:6;position:sticky;background-color:var(--header-bg);color:var(--header-text-color);box-shadow:var(--header-box-shadow);backface-visibility:hidden;height:3.5em;margin-bottom:15px}.medium-zoom--opened .d-header{display:none}.banner{background-image:url(/assets/images/banner-fon.jpg);background-size:cover;filter:brightness(1.1);text-align:center;border-radius:5px;padding:1.25rem 0;margin-top:-1rem;margin-bottom:1.25rem;color:#333}.wrap{margin:0 auto;height:100%;max-width:1436px;padding-left:1rem;padding-right:1rem}.wrap.wrap-max{max-width:100%;padding-left:2rem;padding-right:2rem}.d-header_contents{display:flex;align-items:center;height:100%;position:relative;justify-content:space-between;margin:0 .5rem 0 .5rem}.search{width:100%;border-radius:5px;background-color:var(--header-form-bg-color);color:var(--header-form-text-color);padding:9px;border-color:transparent}.box-search{position:relative;width:63%;margin:10px 45px 10px 0}.box-results{position:absolute;border-radius:3px;box-shadow:0 2px 4px -1px rgba(0,0,0,.15);background-color:var(--white);padding:15px;z-index:2}.d-header.show .d-header-post.none,.d-header.show .d-header-facet.none{display:block;position:relative;width:100%;font-size:18px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.v-line{border-left:1px solid var(--gray-600);height:20px;display:inline-block;margin:0 10px 0 15px;vertical-align:middle}.d-header.scroll-hide-search.show .box-search{display:none}.box-logo{width:209px;align-items:center;display:flex;gap:.5rem;color:var(--gray-600)}.cut-off{width:75%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}aside{width:340px}aside ul{list-style:none;padding:0;margin:0;font-size:.9375rem}aside ul a{color:var(--gray)}blockquote{margin-left:15px;background-color:var(--blockquote-bg);padding:.1rem 1rem;border-left:3px solid #d2d6dd;display:table}.blockquote-profile{margin-bottom:20px;max-width:300px;word-wrap:break-word;padding:.1rem 1rem;border-left:3px solid #d2d6dd;font-size:.91rem}.blockquote-profile p{margin:2px}hr{border:none;clear:both;background-color:#ddd;height:1px}details{border-radius:0 0 3px 3px;background-color:#f5f5fa;padding:2px 6px;margin:0 0 15px 0}summary{background-color:#f5f5fa;color:#666;font-size:14px}details[open]>summary{padding:0 0 10px 0;color:#666}.title{margin:0;font-weight:500;font-size:1.3125rem}.txt-closed{padding:10px;background-color:lightyellow;margin-bottom:15px;display:inherit;color:var(--gray-600)}.box{border-radius:5px;padding:1.25rem;margin-bottom:1.25rem;overflow-wrap:break-word}.box-small{border-radius:3px;color:var(--white);text-align:center;padding:5px 10px}.box-flex{display:flex;border-radius:5px;position:relative;flex-direction:row;align-items:center;padding:1.25rem;margin-bottom:1.25rem}.box-center{position:absolute;top:50%;left:50%;margin-right:-50%;transform:translate(-50%,-50%)}.search-input{width:300px;height:50px;padding-left:1.25rem;border-radius:3px}.search-button-icon{border:none;height:50px;width:50px;color:#4f5b66;font-size:18px;border-radius:3px}.list-post{display:flex;padding:.5rem 0}ul.last-content li{margin-bottom:15px}ul.last-content a.last-content_telo{display:block;word-wrap:break-word}.uppercase-box{font-size:.75rem;text-transform:uppercase;margin:0 0 10px 0;letter-spacing:1.5px;font-weight:500}.trigger img,a:hover>img{opacity:.8}.focus-id:hover{cursor:pointer}.underline-hover:hover{text-decoration:underline}.content-body{max-width:810px;overflow-wrap:break-word;margin:5px}.content_tree:target,.content_tree.edit{background-clip:content-box;background-color:lightyellow}.comment-telo{margin:20px 5px 20px 0;list-style:none;padding:0}.comment-level-1{width:32px}.comment-level-2{width:52px}.comment-level-3{width:72px}.comment-level-4{width:92px}.comment-level-5{width:112px}.comment-level-left-1{margin-left:36px}.comment-level-left-2{margin-left:56px}.comment-level-left-3{margin-left:76px}.comment-level-left-4{margin-left:96px}.comment-level-left-5{margin-left:116px}.comment-thread{border:0;padding:0;height:100%}.qa-comment{font-size:.875rem;padding:.24rem 0}.bg-red-200 .content_tree,.content_tree.bg-red-200{background-color:var(--red-200)}.ind-first-p p{margin:.5em 0;max-width:780px}article iframe{max-width:560px;max-height:320px}video{max-width:560px}.showPassword{position:absolute;color:var(--gray-600);right:5px;margin:5px}.scroll-menu{overflow-x:auto;scrollbar-width:none}.scroll-menu::-webkit-scrollbar{width:0;height:0}.scroll-wrapper{overflow:hidden;padding:0;position:relative}.scroll-wrapper.conversationMessages{height:calc(100% - 62px)}.delet-count{z-index:3;right:10px;font-size:.8em;color:#fff;background-color:rgba(0,0,0,.3);padding:1px 6px;position:absolute;display:flex;gap:1rem}.icon-share{color:#fff;height:28px;width:28px;margin:3px}.bg-vk{background-color:#07f}.bg-ok{background-color:#eb722e}.bg-tg{background-color:#64a9dc}.bg-fb{background-color:#3b5998}.bg-lj{background-color:#0d425a}.bg-tw{background-color:#00aced}.menu__left{width:210px;padding-right:20px}.menuno .menu__left{display:none}.dropdown,.menu,.breadcrumbs{list-style:none;margin:0;padding:0}.menu a i{font-size:1.25rem;margin:0 .5rem}.dropdown{display:none;position:absolute;right:0;background-color:var(--dropdown-bg);box-shadow:var(--dropdown-box-shadow);padding:.5rem;z-index:15;min-width:215px}.dropdown.user{top:0;padding:1rem 0 .7rem 0}.right-close{color:var(--gray-600);padding:3px 8px 0 0;margin-top:-20px;float:right;display:block}.user-box{padding:0 0 .7rem 1rem;display:flex;align-items:center;font-size:.975rem}.user-nav li a{margin-left:10px}.dropdown.left{left:0;width:150px}.menu a,.dropdown li>a,.dropdown li>div{color:var(--gray);padding:5px;display:flex;flex-direction:row;align-items:center;gap:.7rem}.dropdown li:hover>a,.dropdown li>a.active,.dropdown li>div.active{color:var(--link-color-hover)}.menu__left:not(.menu__active) li{margin-bottom:3px}.menu li.active,.menu li:hover{background-color:var(--gray-100);border-radius:var(--border-radius)}.menu li:hover{transition-duration:.3s}.menu li:hover>a{color:var(--gray)}.breadcrumbs li{display:inline;color:var(--gray-600)}.breadcrumbs li:not(:last-child):after{content:" / "}ul.nav{list-style:none;align-items:center;display:flex;gap:.7rem;margin:0;padding:0}ul.nav>li{padding:6px 12px}ul.nav.small>li{padding:3px 6px}ul.nav>li>a{color:var(--gray-600)}ul.nav>li.active{background-color:var(--nav-bg-active);border-radius:var(--border-radius);color:var(--nav-color-active)}ul.nav>li.active>a{color:var(--nav-color-active)}ul.nav>li a:hover{color:var(--link-color-hover)}ul.nav>li.active a:hover{color:var(--nav-color-active)}.content-tabs{display:none}.content-tabs.tab_active{display:block;color:var(--nav-color-active)}html{height:100%;overflow-y:scroll}*,*::before,*::after{box-sizing:border-box}:active,:hover,:focus{outline:0;outline-offset:0}body{line-height:var(--line-height);font-family:var(--font-family);font-size:var(--font-size);background-color:var(--bg-color);color:var(--text-color);padding:0;margin:0}a{color:var(--link-color);cursor:pointer;text-decoration:none}a:hover,a:focus,a:active{color:var(--link-color-hover)}img{border-radius:var(--border-radius);vertical-align:middle}.top-sm{top:70px}.mr-auto{margin:0 auto}.m0{margin:0}.m5{margin:5px}.mt5{margin-top:5px}.mr5{margin-right:5px}.mb5{margin-bottom:5px}.ml5{margin-left:5px}.m10{margin:10px}.mt10{margin-top:10px}.mr10{margin-right:10px}.mb10{margin-bottom:10px}.ml10{margin-left:10px}.m15{margin:15px}.mt15{margin-top:15px}.mr15{margin-right:15px}.mb15{margin-bottom:15px}.ml15{margin-left:15px}.mt20{margin-top:20px}.mr20{margin-right:20px}.mb20{margin-bottom:20px}.ml20{margin-left:20px}.ml30{margin-left:30px}.p5{padding:5px}.p15{padding:15px}.p5-10{padding:5px 10px}.p10-5{padding:10px 5px}.indent-body{margin:0 8px}.black{color:var(--black)}.white{color:var(--white)}.yellow{color:var(--yellow)}.green{color:var(--green)}.gray{color:var(--gray)}.gray-600{color:var(--gray-600)}.sky{color:var(--sky)}.red{color:var(--red)}.brown{color:var(--brown)}.bg-black{background-color:var(--black)}.bg-white{background-color:var(--white)}.bg-green{background-color:var(--green)}.bg-yellow{background-color:var(--yellow)}.bg-lightyellow{background-color:lightyellow}.bg-lightgray{background-color:var(--gray-100)}.bg-violet{background-color:var(--violet)}.bg-blue{background-color:var(--blue)}.bg-red-200{background-color:var(--red-200)}.bg-beige{background-color:var(--beige)}.active{color:var(--red)}.shadow{box-shadow:0 4px 14px rgba(0,0,0,.15)}.shadow-bottom{box-shadow:0 10px 20px rgba(0,0,0,.1)}.br-gray{border:1px solid var(--gray-100)}.br-dotted{border:1px dotted var(--form-border-color)}.br-bottom{border-bottom:1px solid var(--form-border-color)}.br-lightgray{border:5px solid var(--gray-100)}li.br-top-zebra+li{border-top:1px solid var(--gray-100)}li.br-li-bottom-no:last-child{border-bottom:1px solid transparent}.w-auto{width:auto}.w-20{width:20%}.w-30{width:30%}.w-40{width:40%}.w-50{width:50%}.w-60{width:60%}.w-70{width:70%}.w-90{width:90%}.w-100{width:100%}.w20{width:20px}.w30{width:30px}.w40{width:40px}.w50{width:50px}.w60{width:60px}.w94{width:94px}.w160{width:160px}.w200{width:200px}.max-w-100{max-width:100%}.max-w780{max-width:780px}.max-w300{max-width:300px}.min-w75{min-width:75px}.text-xs{font-size:.75rem}.text-sm{font-size:.875rem}.text-base{font-size:1rem}.text-lg{font-size:1.125rem}.text-xl{font-size:1.25rem}.text-2xl{font-size:1.5rem}.text-3xl{font-size:1.875rem}.text-4xl{font-size:2.25rem}.text-5xl{font-size:3rem}.text-6xl{font-size:3.75rem}.text-7xl{font-size:4.5rem}.text-8xl{font-size:6rem}.grid{display:grid}.gap{gap:1rem}.gap-min{gap:.5rem}.gap-max{gap:2.5rem}.flex{display:flex}.fixed{position:fixed}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.flex-auto{flex:1 1 0%}.clear{clear:both}.left{float:left}.right{float:right}.center{text-align:center}.align-right{text-align:right}.middle{vertical-align:middle}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.items-center{align-items:center}.italic{font-style:italic}.sticky{position:sticky}.absolute{position:absolute}.relative{position:relative}.hidden{overflow:hidden}.none{display:none}.block{display:block}.table{display:table}.inline{display:inline-block}.break-all{word-break:break-all}.pointer{cursor:pointer}.logo{color:var(--header-logo-color);font-size:21px}.favicons{height:18px;width:18px}.img-sm{width:24px;height:24px}.img-base{width:36px;height:36px}.img-lg{width:64px;height:64px}.img-xl{width:94px;height:94px}.img-2xl{width:160px;height:160px}.trigger img.img-base:hover{opacity:.7}.profile-ava{position:absolute;z-index:5;margin:60px 10px 0 15px;border-radius:var(--border-radius)}.box-cover-img{height:200px;width:100%}.profile-bg-img.bg-profile{height:90px}.medium-zoom-overlay{position:fixed;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .3s;will-change:opacity}.medium-zoom--opened .medium-zoom-overlay{cursor:pointer;cursor:zoom-out;opacity:1}.medium-zoom-image{cursor:pointer;cursor:zoom-in;transition:transform .3s cubic-bezier(.2,0,.2,1)}.medium-zoom-image--hidden{visibility:hidden}.medium-zoom-image--opened{position:relative;cursor:pointer;cursor:zoom-out;will-change:transform}.img-preview{max-width:780px;position:relative}.img-preview img{max-width:100%;border:1px solid #f3f3f3}.cut-post img,.content-body img,.medium-zoom-image{max-width:100%}.img-preview img:hover{box-shadow:0 1px 8px 0 rgb(0 0 0 / 20%)}.CodeMirror-line{max-width:800px}img.emoji{max-width:20px;display:inline-block;border-color:transparent}input,select,textarea{background-color:var(--form-bg-color);border:1px solid var(--form-border-color);color:var(--form-text-color);font-size:16px}textarea{width:100%}fieldset input:not([type=radio]):not([type=checkbox]):not([type=range]),fieldset select{width:100%;min-height:34px;padding:5px}fieldset{padding:0;border:0;position:relative;margin:10px 0}fieldset.error input{border-color:var(--red)}.help{font-size:.875rem;color:var(--gray-600)}input:focus,textarea:focus{border:1px solid var(--form-color-active)}label{display:block;margin-bottom:4px;font-size:.875rem}::placeholder{color:var(--gray)}table{margin-bottom:1.5rem;width:100%;border-collapse:collapse;border-spacing:0}table td,table th{font-size:14px;padding:5px}table thead th{border-bottom:2px solid rgba(222,226,230,.5);text-align:left}table tr:nth-of-type(2n){background-color:var(--gray-100)}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;background-color:transparent;border:1px solid transparent;padding:.35rem 1rem;border-radius:.2rem}.btn-small{padding:.15rem .35rem;font-size:.775rem}.btn-primary{color:var(--button-text-color);background-color:var(--button-bg-color);border-color:var(--button-border-color)}.btn-outline-primary{color:var(--button-outline-text-color);background-color:var(--button-outline-bg-color);border-color:var(--button-outline-border-color)}.btn-primary:hover,.btn-primary:focus{color:var(--button-border-color-hover);opacity:.8}.btn-outline-primary:hover,.btn-outline-primary:focus{color:var(--button-outline-text-color-hover);background-color:var(--button-outline-bg-color-hover);border-color:var(--button-outline-border-color-hover)}.focus-id:hover{opacity:.8}.tag,.tag-grey,.tag-yellow,.tag-violet,.tag-clear{font-size:.9rem;border-radius:var(--border-radius);margin-left:.25em;padding:.08rem .35rem .15rem .35rem;text-transform:lowercase;text-decoration:none}.tag{background-color:#ddebf9;color:#4596de}.tag:hover{background-color:#5fb878;color:#fff}.tag-grey{background-color:#ececec;color:#6b3e4a}.tag-grey:hover{background-color:#fff;color:#444}.tag-yellow{background-color:#fffcd7;color:#7b5d5d}.tag-violet{background-color:var(--violet);color:#544e4e}.tag-clear{color:#707476;background-color:var(--white);border:1px solid #e8ebed}.tag-clear:hover{color:#707476;background-color:#f5f7f8}.label{font-style:italic;text-transform:lowercase;font-size:.875rem;padding:3px 10px;font-weight:400}.label-grey{background-color:var(--violet);color:var(--gray-600)}.label-orange{background-color:#f9ddde;color:var(--gray)}.label-green{background-color:#f0f6f3;color:var(--green)}.label-red{background-color:#fff4e8;color:var(--red)}.label-teal{background-color:var(--teal);color:var(--white)}.label-teal:hover{background-color:#339a9c;transition:background .2s ease-out}.tagify{width:100%;max-width:780px}.tagify--noTags[required]{--tags-border-color:var(--red)}.poll{padding:5px 10px;list-style:none;box-shadow:0 0 5px rgb(0 0 0 / 10%);border:1px solid #f3f4f6}.poll-count{float:left;padding-right:10px;width:48px;font-size:.8em;margin-top:1px;color:var(--gray-600)}.poll-result{padding-left:48px}.poll-label{font-size:.9em;color:var(--gray)}progress,progress[role]{appearance:none;-moz-appearance:none;-webkit-appearance:none;background-size:auto}progress{vertical-align:baseline;display:block;width:100%;border:0;margin-bottom:20px;background:#f8f8f8;height:7px;border-radius:500px;overflow:hidden}::-webkit-progress-bar{background:#f8f8f8}progress[value^="0"]::-moz-progress-bar,progress[value^="1"]::-moz-progress-bar,progress[value^="2"]::-moz-progress-bar,progress[value^="0"]::-webkit-progress-value,progress[value^="1"]::-webkit-progress-value,progress[value^="2"]::-webkit-progress-value{background-color:#0ea5e9}progress[value^="3"]::-moz-progress-bar,progress[value^="4"]::-moz-progress-bar,progress[value^="5"]::-moz-progress-bar,progress[value^="3"]::-webkit-progress-value,progress[value^="4"]::-webkit-progress-value,progress[value^="5"]::-webkit-progress-value{background-color:#0085ee}progress[value^="6"]::-moz-progress-bar,progress[value^="7"]::-moz-progress-bar,progress[value^="8"]::-moz-progress-bar,progress[value^="6"]::-webkit-progress-value,progress[value^="7"]::-webkit-progress-value,progress[value^="8"]::-webkit-progress-value{background-color:green}progress[value^="9"]::-moz-progress-bar,progress[value="100"]::-moz-progress-bar,progress[value^="9"]::-webkit-progress-value,progress[value="100"]::-webkit-progress-value{background-color:red}.modal{display:flex;align-items:center;justify-content:center;position:fixed;z-index:10;width:100%;height:100%}.model-inner{background-color:#fff;border-radius:var(--border-radius);max-width:600px;padding:2em;margin:auto}.modal-header{display:flex;align-items:center;justify-content:space-between;border-bottom:2px solid #000}.overlay{width:100%;height:100%;position:fixed;top:0;left:0;background:#000;opacity:.75}.dialog-container{display:flex;position:fixed;top:0;left:0;bottom:0;right:0;z-index:6}.dialog-container[aria-hidden='true']{display:none}.dialog-overlay{position:fixed;top:0;left:0;bottom:0;right:0;background-color:rgba(43,46,56,.9);animation:fade-in 200ms both}.dialog-content{background-color:rgb(255,255,255);margin:auto;z-index:6;position:relative;animation:fade-in 400ms 200ms both,slide-up 400ms 200ms both;padding:1em;max-width:90%;width:600px;border-radius:var(--border-radius)}@media screen and (min-width:700px){.dialog-content{padding:2em}}.dialog-close{position:absolute;top:.5em;right:.5em;border:0;padding:0;background-color:transparent;font-size:2em;text-align:center;cursor:pointer;transition:0.15s;color:var(--gray-600)}@media screen and (min-width:700px){.dialog-close{top:5px}}footer{background-color:var(--footer-bg);color:var(--footer-text-color);padding:.5rem;overflow:hidden;margin-top:1rem;box-shadow:var(--footer-box-shadow)}footer.small-sidebar{background-color:transparent;color:var(--footer-text-color);font-size:.875rem;padding:0 .25rem;margin:0 .25rem}footer .icon{color:var(--footer-text-color);margin-right:1rem}footer ul{padding-left:60px;list-style:none;margin:0}footer ul li a{font-size:14px;color:var(--footer-text-color);margin-bottom:5px}footer ul li a:hover,footer .icon:hover{color:var(--footer-color-active)}.notice{animation-name:toastEffect;animation-timing-function:ease-in;background-color:var(--gray);border-radius:var(--border-radius);box-shadow:0 5px 15px 0 rgba(221,221,221,1);color:var(--white);display:inline-block;padding:2px 20px;position:fixed;text-align:center;text-decoration:none;z-index:2147483647}.notice-bottom{bottom:1rem}.notice-center{left:0;margin-left:auto;margin-right:auto;max-width:fit-content;right:0}.notice-left{left:1rem}.notice-right{right:1rem}.notice-top{top:1rem}@keyframes toastEffect{0%{opacity:0}100%{opacity:0}20%{opacity:1}80%{opacity:1}}main{width:calc(100% - 590px)}.admin main{width:calc(100% - 210px)}.menuno main{width:calc(100% - 340px)}.menuno main.w-100{width:100%}@media (max-width:1050px){.menu__left,#togglemenu{display:none}aside{min-width:240px}main{width:calc(100% - 250px)}.admin main{width:100%}.menu__button{transition:0.3s ease;display:block}.menu__left{opacity:0;visibility:hidden;transition-property:opacity,visibility;z-index:98;left:0;top:0;bottom:0;min-width:180px;background-color:var(--dropdown-bg);box-shadow:5px 0 5px -5px rgba(0,0,0,.25);overflow-x:hidden;position:absolute;padding-right:0}.menu__left.menu__active,.menu__left.menu-none.menu__active{opacity:1;visibility:visible;transition:0.25s;position:fixed;display:block}.menu__left.menu__active ul.top-sm{top:0}.menu__left.menu__active .menu li{background-color:#fff;padding-left:10px}}@media (max-width:780px){.mb-w80{width:80px}.mb-w150{width:150px}.mb-p10{padding:10px}.mb-mt5{margin-top:5px}.mb-mt25{margin-top:25px}.mb-ml10{margin-left:10px}.mb-text-xl{font-size:1.25rem}.logo{font-size:18px}.gap-max{gap:1.5rem}.footer ul{padding-left:0}.mb-img-2xl{height:65px;width:65px}.box-cover-img{height:75px}.title{font-size:1.2125rem}.mb-block,#contentWrapper{display:block}.mb-w-100,iframe,video{width:100%}.box{padding:1rem;border-radius:0}aside,.mb-none,ul.setting>li>a>i{display:none}main,.menuno main{width:100%}.wrap{padding-left:0;padding-right:0}}code{color:#9b4f5e;background-color:#f5f2f0;padding:3px;border-radius:var(--border-radius);font-size:14px}pre{white-space:pre-wrap;word-wrap:break-word;background:#f5f2f0;padding:.2em .5em}.token.tag,.token.tag:hover{background-color:transparent}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}div.code-toolbar{position:relative}div.code-toolbar>.toolbar{position:absolute;z-index:10;top:.3em;right:.2em;transition:opacity .3s ease-in-out;opacity:0}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar:focus-within>.toolbar{opacity:1}div.code-toolbar>.toolbar>.toolbar-item{display:inline-block}div.code-toolbar>.toolbar>.toolbar-item>a{cursor:pointer}div.code-toolbar>.toolbar>.toolbar-item>button{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-toolbar>.toolbar>.toolbar-item>a,div.code-toolbar>.toolbar>.toolbar-item>button,div.code-toolbar>.toolbar>.toolbar-item>span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224,224,224,.2);box-shadow:0 2px 0 0 rgba(0,0,0,.2);border-radius:.5em}div.code-toolbar>.toolbar>.toolbar-item>a:focus,div.code-toolbar>.toolbar>.toolbar-item>a:hover,div.code-toolbar>.toolbar>.toolbar-item>button:focus,div.code-toolbar>.toolbar>.toolbar-item>button:hover,div.code-toolbar>.toolbar>.toolbar-item>span:focus,div.code-toolbar>.toolbar>.toolbar-item>span:hover{color:inherit;text-decoration:none} \ No newline at end of file diff --git a/public/assets/js/app.js b/public/assets/js/app.js index fb12ddfb..f65f62e6 100644 --- a/public/assets/js/app.js +++ b/public/assets/js/app.js @@ -1,7 +1,7 @@ const focusId=queryAll(".focus-id"),saveFolder=queryAll(".save-folder"),delFolderContent=queryAll(".del-folder-content"),delFolder=queryAll(".del-folder"),delVotingOption=queryAll(".del-voting-option"),addProfile=queryAll(".add-profile"),postRecommend=queryAll(".post-recommend"),typeAction=queryAll(".type-action"),reply=queryAll(".actreply");focusId.forEach(el=>el.addEventListener("click",function(e){makeRequest("/focus",options={body:"content_id="+el.dataset.id+"&type="+el.dataset.type+"&_token="+token})}));saveFolder.forEach(el=>el.addEventListener("click",function(e){makeRequest("/folder/content/save",options={body:"id="+el.dataset.id+"&type="+el.dataset.type+"&tid="+el.dataset.tid})}));addProfile.forEach(el=>el.addEventListener("click",function(e){makeRequest("/post/profile",options={body:"post_id="+el.dataset.post+"&_token="+token})}));delFolderContent.forEach(el=>el.addEventListener("click",function(e){makeRequest("/folder/content/del",options={body:"id="+el.dataset.id+"&type="+el.dataset.type+"&tid="+el.dataset.tid+"&_token="+token})}));delFolder.forEach(el=>el.addEventListener("click",function(e){makeRequest("/folder/del",options={body:"id="+el.dataset.id+"&type="+el.dataset.type+"&_token="+token})}));postRecommend.forEach(el=>el.addEventListener("click",function(e){makeRequest("/post/recommend",options={body:"post_id="+el.dataset.id+"&_token="+token})}));typeAction.forEach(el=>el.addEventListener("click",function(e){makeRequest("/status/action",options={body:"content_id="+el.dataset.id+"&type="+el.dataset.type+"&_token="+token})}));isIdEmpty('colorPicker').onclick=function(){let box=getById("box");let color=getById("color");box.style.borderColor=colorPicker.value;colorPicker.addEventListener("input",function(event){box.style.borderColor=event.target.value},!1);colorPicker.addEventListener("change",function(event){color.value=colorPicker.value},!1)} -reply.forEach(el=>el.addEventListener("click",function(e){let reply=document.querySelector('#reply_addentry'+el.dataset.id);fetch("/reply/"+el.dataset.type,{method:"POST",body:"id="+el.dataset.id+"&item_id="+el.dataset.item_id+"&_token="+token,headers:{'Content-Type':'application/x-www-form-urlencoded'}}).then(response=>response.text()).then(text=>{reply.classList.add("block");reply.innerHTML=text;queryAll("#cancel_comment").forEach(el=>el.addEventListener("click",function(e){reply.classList.remove("block")}))})}));queryAll(".up-id").forEach(el=>el.addEventListener("click",function(e){fetch("/votes",{method:"POST",body:"content_id="+el.dataset.id+"&type="+el.dataset.type+"&_token="+token,headers:{'Content-Type':'application/x-www-form-urlencoded'}}).then((response)=>{return}).then((text)=>{let upVot=document.querySelector('#up'+el.dataset.id);let act=upVot.classList.contains('active');let upScr=upVot.querySelector('.score');let number=parseInt(upScr.innerText);if(!number){number=0} +queryAll(".up-id").forEach(el=>el.addEventListener("click",function(e){fetch("/votes",{method:"POST",body:"content_id="+el.dataset.id+"&type="+el.dataset.type+"&_token="+token,headers:{'Content-Type':'application/x-www-form-urlencoded'}}).then((response)=>{return}).then((text)=>{let upVot=document.querySelector('#up'+el.dataset.id);let act=upVot.classList.contains('active');let upScr=upVot.querySelector('.score');let number=parseInt(upScr.innerText);if(!number){number=0} if(act==!0){new_cont=(number-parseInt(1))}else{new_cont=(number+parseInt(1))} -upVot.classList.toggle('active');upScr.innerHTML=new_cont})}));queryAll(".add-favorite").forEach(el=>el.addEventListener("click",function(e){fetch("/favorite",{method:"POST",headers:{'Content-Type':'application/x-www-form-urlencoded'},body:"content_id="+el.dataset.id+"&type="+el.dataset.type+"&_token="+token,}).then(response=>response.text()).then(text=>{if(el.dataset.front=='personal'){location.reload()}else{let dom=document.querySelector("#favorite_"+el.dataset.id);dom.classList.toggle("active")}})}));queryAll(".add-poll").forEach(el=>el.addEventListener("click",function(e){fetch("/poll",{method:"POST",headers:{'Content-Type':'application/x-www-form-urlencoded'},body:"question_id="+el.dataset.id+"&answer_id="+el.dataset.answer+"&_token="+token,}).then(response=>response.text()).then(text=>{location.reload()})}));delVotingOption.forEach(el=>el.addEventListener("click",function(e){makeRequest("/poll/option/del",options={body:"id="+el.dataset.id+"&_token="+token})}));queryAll(".add-ignore").forEach(el=>el.addEventListener("click",function(e){fetch("/ignored",{method:"POST",headers:{'Content-Type':'application/x-www-form-urlencoded'},body:"user_id="+el.dataset.id+"&_token="+token,}).then(response=>response.text()).then(text=>{location.reload()})}));queryAll(".answer-best").forEach(el=>el.addEventListener("click",function(e){fetch("/best",{method:"POST",headers:{'Content-Type':'application/x-www-form-urlencoded'},body:"answer_id="+el.dataset.id+"&_token="+token,}).then(response=>response.text()).then(text=>{let dom=document.querySelector("#best_"+el.dataset.id);dom.classList.toggle("active");location.reload()})}));queryAll("#graburl").forEach(el=>el.addEventListener("click",function(e){let uri=getById('link').value;if(uri===''){return} +upVot.classList.toggle('active');upScr.innerHTML=new_cont})}));queryAll(".add-favorite").forEach(el=>el.addEventListener("click",function(e){fetch("/favorite",{method:"POST",headers:{'Content-Type':'application/x-www-form-urlencoded'},body:"content_id="+el.dataset.id+"&type="+el.dataset.type+"&_token="+token,}).then(response=>response.text()).then(text=>{if(el.dataset.front=='personal'){location.reload()}else{let dom=document.querySelector("#favorite_"+el.dataset.id);dom.classList.toggle("active")}})}));queryAll(".add-poll").forEach(el=>el.addEventListener("click",function(e){fetch("/poll",{method:"POST",headers:{'Content-Type':'application/x-www-form-urlencoded'},body:"question_id="+el.dataset.id+"&answer_id="+el.dataset.answer+"&_token="+token,}).then(response=>response.text()).then(text=>{location.reload()})}));delVotingOption.forEach(el=>el.addEventListener("click",function(e){makeRequest("/poll/option/del",options={body:"id="+el.dataset.id+"&_token="+token})}));queryAll(".add-ignore").forEach(el=>el.addEventListener("click",function(e){fetch("/ignored",{method:"POST",headers:{'Content-Type':'application/x-www-form-urlencoded'},body:"user_id="+el.dataset.id+"&_token="+token,}).then(response=>response.text()).then(text=>{location.reload()})}));queryAll(".comment-best").forEach(el=>el.addEventListener("click",function(e){fetch("/best",{method:"POST",headers:{'Content-Type':'application/x-www-form-urlencoded'},body:"comment_id="+el.dataset.id+"&_token="+token,}).then(response=>response.text()).then(text=>{let dom=document.querySelector("#best_"+el.dataset.id);dom.classList.toggle("active");location.reload()})}));queryAll("#graburl").forEach(el=>el.addEventListener("click",function(e){let uri=getById('link').value;if(uri===''){return} fetch("/post/grabtitle",{method:"POST",body:"uri="+uri,headers:{'Content-Type':'application/x-www-form-urlencoded'}}).then(function(response){if(!response.ok){return Promise.reject(new Error('Response failed: '+response.status+' ('+response.statusText+')'))} -return response.json()}).then(function(data){document.querySelector('input[name=post_title]').value=data.title;document.querySelector('textarea.url').insertAdjacentHTML('afterBegin',data.description)}).catch(function(error){})}));queryAll(".editcomm").forEach(el=>el.addEventListener("click",function(e){let comment_id=el.dataset.comment_id;let comment=document.querySelector('#insert_id_'+el.dataset.comment_id);fetch("/comment/editform",{method:"POST",body:"comment_id="+comment_id,headers:{'Content-Type':'application/x-www-form-urlencoded'}}).then(response=>{return response.text()}).then(text=>{getById("comment_"+comment_id).classList.add("edit");comment.classList.add("block");comment.innerHTML=text;queryAll("#cancel_comment").forEach(el=>el.addEventListener("click",function(e){comment.classList.remove("block")}))})}));const tabs_post=document.querySelector(".tabs-post");if(tabs_post){const tabButton=queryAll(".tab-button");const contents=queryAll(".content-tabs");tabs_post.onclick=e=>{const id=e.target.dataset.id;if(id){tabButton.forEach(btn=>{btn.classList.remove("active")});e.target.classList.add("active");contents.forEach(content=>{content.classList.remove("tab_active")});getById('inputQa').value=0;if(id=='qa'){getById('inputQa').value=1} +return response.json()}).then(function(data){document.querySelector('input[name=post_title]').value=data.title;document.querySelector('textarea.url').insertAdjacentHTML('afterBegin',data.description)}).catch(function(error){})}));const tabs_post=document.querySelector(".tabs-post");if(tabs_post){const tabButton=queryAll(".tab-button");const contents=queryAll(".content-tabs");tabs_post.onclick=e=>{const id=e.target.dataset.id;if(id){tabButton.forEach(btn=>{btn.classList.remove("active")});e.target.classList.add("active");contents.forEach(content=>{content.classList.remove("tab_active")});getById('inputQa').value=0;if(id=='qa'){getById('inputQa').value=1} const element=getById(id);element.classList.add("tab_active")}}} \ No newline at end of file diff --git a/public/assets/js/catalog.js b/public/assets/js/catalog.js index 4859bc7f..72205d56 100644 --- a/public/assets/js/catalog.js +++ b/public/assets/js/catalog.js @@ -2,4 +2,5 @@ const favicon=queryAll(".add-favicon"),sturl=queryAll(".status"),screenshot=quer sturl.forEach(el=>el.addEventListener("click",function(e){makeRequest("/web/status/update")}));function fetchSearchUrl(){let url=getById("find-url").value;if(url.length<5)return;fetch("/search/web/url",{method:"POST",headers:{'Content-Type':'application/x-www-form-urlencoded'},body:"url="+url+"&_token="+token,}).then(response=>{return response.text()}).then(text=>{let obj=JSON.parse(text);let html='
';for(let key in obj){if(obj[key].item_id){html+=''+obj[key].item_url+''} html+='
'} if(!Object.keys(obj).length==0){let items=getById("search_url");items.classList.add("block");items.innerHTML=html} -let menu=document.querySelector('.none.block');if(menu){document.onclick=function(e){if(event.target.className!='.none.block'){let items=getById("search_url");items.classList.remove("block")}}}})} \ No newline at end of file +let menu=document.querySelector('.none.block');if(menu){document.onclick=function(e){if(event.target.className!='.none.block'){let items=getById("search_url");items.classList.remove("block")}}}})} +reply.forEach(el=>el.addEventListener("click",function(e){let reply=document.querySelector('#reply_addentry'+el.dataset.id);fetch("/reply/"+el.dataset.type,{method:"POST",body:"id="+el.dataset.id+"&item_id="+el.dataset.item_id+"&_token="+token,headers:{'Content-Type':'application/x-www-form-urlencoded'}}).then(response=>response.text()).then(text=>{reply.classList.add("block");reply.innerHTML=text;queryAll("#cancel_comment").forEach(el=>el.addEventListener("click",function(e){reply.classList.remove("block")}))})})) \ No newline at end of file diff --git a/public/assets/js/common.js b/public/assets/js/common.js index bb120f09..43033b28 100644 --- a/public/assets/js/common.js +++ b/public/assets/js/common.js @@ -1,7 +1,7 @@ let scrolled;let dHeader=document.querySelector(".d-header");if(dHeader){window.onscroll=function(){scrolled=window.pageYOffset||document.documentElement.scrollTop;if(scrolled>70){document.querySelector(".d-header").classList.add('show')} if(70>scrolled){document.querySelector(".d-header").classList.remove('show')}}} -let token=document.querySelector("meta[name='csrf-token']").getAttribute("content");queryAll(".add-comment").forEach(el=>el.addEventListener("click",function(e){let answer_id=insert_id=el.dataset.answer_id;let comment_id=el.dataset.comment_id;if(comment_id){insert_id=el.dataset.comment_id} -let comment=document.querySelector('#insert_id_'+insert_id);comment.classList.add("block");fetch("/comments/addform",{method:"POST",body:"answer_id="+answer_id+"&comment_id="+comment_id+"&_token="+token,headers:{'Content-Type':'application/x-www-form-urlencoded'}}).then(response=>{return response.text()}).then(text=>{comment.innerHTML=text;queryAll("#cancel_comment").forEach(el=>el.addEventListener("click",function(e){comment.classList.remove("block")}))})}));isIdEmpty('toggledark').onclick=function(){let mode=getCookie("dayNight");let expires=defTime();if(mode=="dark"){document.cookie="dayNight"+"="+"light"+"; "+expires+";path=/";document.getElementsByTagName('body')[0].classList.remove('dark')}else{document.cookie="dayNight"+"="+"dark"+"; "+expires+";path=/";document.getElementsByTagName('body')[0].classList.add('dark')}} +let token=document.querySelector("meta[name='csrf-token']").getAttribute("content");queryAll(".add-comment").forEach(el=>el.addEventListener("click",function(e){let comment_id=insert_id=el.dataset.comment_id;let post_id=el.dataset.post_id;if(post_id){insert_id=el.dataset.post_id} +let comment=document.querySelector('#insert_id_'+insert_id);comment.classList.add("block");fetch("/comment/addform",{method:"POST",body:"post_id="+post_id+"&comment_id="+comment_id+"&_token="+token,headers:{'Content-Type':'application/x-www-form-urlencoded'}}).then(response=>{return response.text()}).then(text=>{comment.innerHTML=text;queryAll("#cancel_comment").forEach(el=>el.addEventListener("click",function(e){comment.classList.remove("block")}))})}));isIdEmpty('toggledark').onclick=function(){let mode=getCookie("dayNight");let expires=defTime();if(mode=="dark"){document.cookie="dayNight"+"="+"light"+"; "+expires+";path=/";document.getElementsByTagName('body')[0].classList.remove('dark')}else{document.cookie="dayNight"+"="+"dark"+"; "+expires+";path=/";document.getElementsByTagName('body')[0].classList.add('dark')}} isIdEmpty('togglemenu').onclick=function(){let mode=getCookie("menuYesNo");let expires=defTime();if(mode=="menuno"){document.cookie="menuYesNo"+"="+"menuyes"+"; "+expires+";path=/";document.getElementsByTagName('body')[0].classList.remove('menuno')}else{document.cookie="menuYesNo"+"="+"menuno"+"; "+expires+";path=/";document.getElementsByTagName('body')[0].classList.add('menuno')}} isIdEmpty('postmenu').onclick=function(){let mode=getCookie("postAppearance");let expires=defTime();if(mode=="classic"){document.cookie="postAppearance"+"="+"card"+"; "+expires+";path=/";location.reload()}else{document.cookie="postAppearance"+"="+"classic"+"; "+expires+";path=/"} location.reload()} diff --git a/resources/views/default/_block/form/add-comment.php b/resources/views/default/_block/form/add-comment.php index b5e46515..66e2eee1 100644 --- a/resources/views/default/_block/form/add-comment.php +++ b/resources/views/default/_block/form/add-comment.php @@ -1,11 +1,12 @@ + +
- +
- - +
diff --git a/resources/views/default/_block/form/edit-comment.php b/resources/views/default/_block/form/edit-comment.php deleted file mode 100644 index 46bdbc76..00000000 --- a/resources/views/default/_block/form/edit-comment.php +++ /dev/null @@ -1,14 +0,0 @@ -
- - - - -
- - - -
-
- - -
\ No newline at end of file diff --git a/resources/views/default/_block/latest-answers-tabs.php b/resources/views/default/_block/latest-answers-tabs.php deleted file mode 100644 index 5c560a43..00000000 --- a/resources/views/default/_block/latest-answers-tabs.php +++ /dev/null @@ -1,36 +0,0 @@ - -
-
- -
- -
    -
-
- \ No newline at end of file diff --git a/resources/views/default/_block/latest-comments-tabs.php b/resources/views/default/_block/latest-comments-tabs.php new file mode 100644 index 00000000..18708a03 --- /dev/null +++ b/resources/views/default/_block/latest-comments-tabs.php @@ -0,0 +1,31 @@ + +
+
+ +
+ +
+ \ No newline at end of file diff --git a/resources/views/default/content/comment/comment.php b/resources/views/default/content/comment/comment.php deleted file mode 100644 index ef59c29e..00000000 --- a/resources/views/default/content/comment/comment.php +++ /dev/null @@ -1,46 +0,0 @@ - -
- - - -
-
-
- - - - - -
-
-
- - - -
-
- - -
-
- -
-
- - - -
-
- - - \ No newline at end of file diff --git a/resources/views/default/content/comment/comments.php b/resources/views/default/content/comments/all.php similarity index 88% rename from resources/views/default/content/comment/comments.php rename to resources/views/default/content/comments/all.php index d6aa8692..7f481fed 100644 --- a/resources/views/default/content/comment/comments.php +++ b/resources/views/default/content/comments/all.php @@ -6,7 +6,7 @@
- $data['comments']]); ?> + $data['comments']]); ?> diff --git a/resources/views/default/content/comments/comment.php b/resources/views/default/content/comments/comment.php new file mode 100644 index 00000000..06cd65db --- /dev/null +++ b/resources/views/default/content/comments/comment.php @@ -0,0 +1,22 @@ + +
+ +
+
+
+ + + + + +
+
+
+ + + +
+
+ \ No newline at end of file diff --git a/resources/views/default/content/answer/edit.php b/resources/views/default/content/comments/edit.php similarity index 60% rename from resources/views/default/content/answer/edit.php rename to resources/views/default/content/comments/edit.php index 3727d4c3..033bb57d 100644 --- a/resources/views/default/content/answer/edit.php +++ b/resources/views/default/content/comments/edit.php @@ -1,20 +1,20 @@
- / : + / : -
+ - '300px', 'content' => $data['answer']['answer_content'], 'type' => 'answer', 'id' => $data['post']['post_id']]); ?> + '300px', 'content' => $data['comment']['comment_content'], 'type' => 'comment', 'id' => $data['post']['post_id']]); ?> $data['user']]); ?> - + - +
\ No newline at end of file diff --git a/resources/views/default/content/comments/menu.php b/resources/views/default/content/comments/menu.php new file mode 100644 index 00000000..2e835c08 --- /dev/null +++ b/resources/views/default/content/comments/menu.php @@ -0,0 +1,82 @@ +
+
+ + + + + + +
+
\ No newline at end of file diff --git a/resources/views/default/content/home.php b/resources/views/default/content/home.php index c0ebeb80..e95782ba 100644 --- a/resources/views/default/content/home.php +++ b/resources/views/default/content/home.php @@ -89,7 +89,7 @@ use Hleb\Constructor\Handlers\Request; ?>
- $data['latest_answers']]); ?> + $data['latest_comments']]); ?> diff --git a/resources/views/default/content/post/answer-menu.php b/resources/views/default/content/post/answer-menu.php deleted file mode 100644 index f9fa1257..00000000 --- a/resources/views/default/content/post/answer-menu.php +++ /dev/null @@ -1,80 +0,0 @@ -
-
- - - - - - -
-
\ No newline at end of file diff --git a/resources/views/default/content/post/format-discussion.php b/resources/views/default/content/post/format-discussion.php index 034c42d1..4c9a68f6 100644 --- a/resources/views/default/content/post/format-discussion.php +++ b/resources/views/default/content/post/format-discussion.php @@ -1,209 +1,111 @@ - +
-

+

- 5 ? 5 : $level; ?> - -
__('app.answer')]); ?>...
- + +
__('app.comment')]); ?>...
+ -
+ - +
    +
  1. +
    -
      - -
    1. -
      -
      -
      - - - - - - - - - - - - - - - - - (.) - - - - - - - - - - -
      - $post_url, 'post' => $post, 'answer' => $answer]); ?> -
      -
      - -
      -
      -
      - - - - - - -
      -
      -
    2. -
    - - - - - - - - -
      -
    1. -
      -
      - - - - - - - - - - - - - - - 0) : ?> - - - - - - - - - - - - -
      - -
      -
      - - - - - - + 0) : ?> + + + + + + + + вложение - +
      + $post, 'comment' => $node, 'type' => 'discussion']); ?> +
      +
      + +
      +
      + + + + + + +
      +
-
-
- -
-
- - - - - - + -
-
- - - - + + + + + - - - 'small', 'text' => __('app.no_comments'), 'icon' => 'info']); ?> - - 'small', 'text' => __('app.no_auth'), 'icon' => 'info']); ?> - + + 'small', 'text' => __('app.close'), 'icon' => 'closed']); ?> + + 'small', 'text' => __('app.no_auth'), 'icon' => 'info']); ?> + + 'small', 'text' => __('app.no_comments'), 'icon' => 'info']); ?> - - - 'small', 'text' => __('app.close'), 'icon' => 'closed']); -endif; ?> \ No newline at end of file + \ No newline at end of file diff --git a/resources/views/default/content/post/format-qa.php b/resources/views/default/content/post/format-qa.php index ab41cb39..aea52f4a 100644 --- a/resources/views/default/content/post/format-qa.php +++ b/resources/views/default/content/post/format-qa.php @@ -1,125 +1,83 @@ - +

- +

1 ? 1 : $level; ?> - - + + -
+
- $post_url, 'post' => $post, 'answer' => $answer]); ?> + $post, 'comment' => $node, 'type' => 'qa', 'level' => $level]); ?> - -
- + +
+ - -
-
    -
  1. -
    - -
    -
    -
    - - - - - - - - -
    -
    - - - - - - (.) - - - - -
    -
    -
    -
  2. -
-
- -
    - - - - - -
  1. -
    -
    - - - - - - - - - - - - - - - + +
    +
      +
    1. +
      +
      +
      + +
      +
      +
      + + - - - - - - - - - + + + + + +
      +
      + + + + + + + (.) + + + + + + +
      +
      +
      +
    2. +
    +
    - - - - - - - + - - - - - - - + -
    -
    -
- - - - -
- 'small', 'text' => __('app.no_answers'), 'icon' => 'info']); ?> + 'small', 'text' => __('app.no_comments'), 'icon' => 'info']); ?> @@ -129,17 +87,17 @@ -
+ '250px', 'id' => $post['post_id'], - 'type' => 'answer', + 'type' => 'comment', ]); ?>
- +
diff --git a/resources/views/default/content/post/post-card.php b/resources/views/default/content/post/post-card.php index 906fe457..28379dd7 100644 --- a/resources/views/default/content/post/post-card.php +++ b/resources/views/default/content/post/post-card.php @@ -8,11 +8,11 @@ - + - + - +
- + - +
diff --git a/resources/views/default/content/post/post-classic.php b/resources/views/default/content/post/post-classic.php index 32d2a321..a288e467 100644 --- a/resources/views/default/content/post/post-classic.php +++ b/resources/views/default/content/post/post-classic.php @@ -11,11 +11,11 @@ use Hleb\Constructor\Handlers\Request; ?> - + - + - +
@@ -72,17 +72,17 @@ use Hleb\Constructor\Handlers\Request; ?> - +
- + - + diff --git a/resources/views/default/content/post/post-view.php b/resources/views/default/content/post/post-view.php index 2d5cfd46..7d3743c4 100644 --- a/resources/views/default/content/post/post-view.php +++ b/resources/views/default/content/post/post-view.php @@ -170,14 +170,14 @@ $blog = $data['blog'][0] ?? null; -
+ - '170px', 'type' => 'answer', 'id' => $post['post_id']]); ?> + '170px', 'type' => 'comment', 'id' => $post['post_id']]); ?>
- +
@@ -246,9 +246,9 @@ $blog = $data['blog'][0] ?? null; - - - + +
diff --git a/resources/views/default/content/user/favorite/all.php b/resources/views/default/content/user/favorite/all.php index 813a2ac3..fb630e9c 100644 --- a/resources/views/default/content/user/favorite/all.php +++ b/resources/views/default/content/user/favorite/all.php @@ -55,13 +55,13 @@
- + - -
+ +
diff --git a/resources/views/default/content/user/profile/comments.php b/resources/views/default/content/user/profile/comments.php index 53ad7879..cf423677 100644 --- a/resources/views/default/content/user/profile/comments.php +++ b/resources/views/default/content/user/profile/comments.php @@ -8,7 +8,7 @@
- $data['comments']]); ?> + $data['comments']]); ?>
diff --git a/resources/views/default/content/user/profile/deletion-statistics.php b/resources/views/default/content/user/profile/deletion-statistics.php index e9d11afa..54c6900e 100644 --- a/resources/views/default/content/user/profile/deletion-statistics.php +++ b/resources/views/default/content/user/profile/deletion-statistics.php @@ -1,4 +1,4 @@ - 0) : ?> + 0) : ?>
: @@ -6,10 +6,6 @@ - 0) : ?> - - - 0) : ?> diff --git a/resources/views/default/content/user/profile/header.php b/resources/views/default/content/user/profile/header.php index 0cca08a8..e0f99f66 100644 --- a/resources/views/default/content/user/profile/header.php +++ b/resources/views/default/content/user/profile/header.php @@ -85,12 +85,10 @@ endif;
- - - 0) : ?> + 0) : ?> diff --git a/resources/views/default/content/user/profile/index.php b/resources/views/default/content/user/profile/index.php index 1686177d..764ca0d9 100644 --- a/resources/views/default/content/user/profile/index.php +++ b/resources/views/default/content/user/profile/index.php @@ -25,11 +25,11 @@
- + - +
diff --git a/resources/views/default/css/parts/_components.css b/resources/views/default/css/parts/_components.css index 4ba0ef81..586a1c95 100644 --- a/resources/views/default/css/parts/_components.css +++ b/resources/views/default/css/parts/_components.css @@ -21,7 +21,7 @@ h5 { display: none; font-size: .72rem; color: #fff; - background-color: red; + background-color: var(--red); padding: 1px 6px; border-radius: 50%; position: absolute; @@ -30,9 +30,7 @@ h5 { } .number-notif.show, -.video-pl { - display: block; -} +.video-pl { display: block; } /* См. https://feathericons.com/ и https://tabler-icons.io/ */ .icons { @@ -53,9 +51,7 @@ h5 { height: 48px; } -.icon-small { - width: 15px; -} +.icon-small { width: 15px; } .list-none { list-style: none; @@ -75,9 +71,7 @@ h5 { margin-bottom: 15px; } -.medium-zoom--opened .d-header { - display: none; -} +.medium-zoom--opened .d-header { display: none; } .banner { background-image: url(/assets/images/banner-fon.jpg); @@ -133,7 +127,7 @@ h5 { .box-results { position: absolute; border-radius: 3px; - box-shadow: 0 2px 4px -1px rgba(0, 0, 0, .15); + box-shadow: 0 2px 4px -1px rgba(0,0,0,.15); background-color: var(--white); padding: 15px; z-index: 2; @@ -158,9 +152,7 @@ h5 { vertical-align: middle; } -.d-header.scroll-hide-search.show .box-search { - display: none; -} +.d-header.scroll-hide-search.show .box-search { display: none; } .box-logo { width: 209px; @@ -177,9 +169,7 @@ h5 { text-overflow: ellipsis; } -aside { - width: 340px; -} +aside { width: 340px; } aside ul { list-style: none; @@ -188,13 +178,11 @@ aside ul { font-size: 0.9375rem; } -aside ul a { - color: var(--gray); -} +aside ul a { color: var(--gray); } blockquote { margin-left: 15px; - background-color: #f3f3f6; + background-color: var(--blockquote-bg); padding: 0.1rem 1rem; border-left: 3px solid #d2d6dd; display: table; @@ -206,12 +194,10 @@ blockquote { word-wrap: break-word; padding: 0.1rem 1rem; border-left: 3px solid #d2d6dd; - font-size: .91rem + font-size:.91rem } -.blockquote-profile p { - margin: 2px; -} +.blockquote-profile p { margin: 2px; } hr { border: none; @@ -233,7 +219,7 @@ summary { font-size: 14px; } -details[open]>summary { +details[open] > summary { padding: 0 0 10px 0; color: #666; } @@ -305,9 +291,7 @@ details[open]>summary { padding: 0.5rem 0; } -ul.last-content li { - margin-bottom: 15px; -} +ul.last-content li { margin-bottom: 15px; } ul.last-content a.last-content_telo { display: block; @@ -323,44 +307,82 @@ ul.last-content a.last-content_telo { } .trigger img, -a:hover>img { - opacity: 0.8; -} +a:hover > img { opacity: 0.8; } -.focus-id:hover { - cursor: pointer -} - -.underline-hover:hover { - text-decoration: underline; -} +.focus-id:hover { cursor: pointer } +.underline-hover:hover { text-decoration: underline; } .content-body { max-width: 810px; overflow-wrap: break-word; -} - -.content_tree { - word-wrap: break-word; + margin: 5px; } .content_tree:target, .content_tree.edit { background-clip: content-box; background-color: lightyellow; - margin-top: -70px; - padding-top: 70px; } -ol.bg-red-200 { - display: table; - width: 100%; +.comment-telo { + margin: 20px 5px 20px 0; + list-style: none; + padding: 0; +} + +.comment-level-1 { + width: 32px; +} + +.comment-level-2 { + width: 52px; +} + +.comment-level-3 { + width: 72px; +} + +.comment-level-4 { + width: 92px; +} + +.comment-level-5 { + width: 112px; +} + +.comment-level-left-1 { + margin-left: 36px; +} + +.comment-level-left-2 { + margin-left: 56px; +} + +.comment-level-left-3 { + margin-left: 76px; +} + +.comment-level-left-4 { + margin-left: 96px; +} + +.comment-level-left-5 { + margin-left: 116px; +} + +.comment-thread { + border: 0; + padding: 0; + height: 100%; +} + +.qa-comment { + font-size: 0.875rem; + padding: 0.24rem 0; } .bg-red-200 .content_tree, -.content_tree.bg-red-200 { - background-color: var(--red-200); -} +.content_tree.bg-red-200 { background-color: var(--red-200); } .ind-first-p p { margin: 0.5em 0; @@ -372,14 +394,7 @@ article iframe { max-height: 320px; } -video { - max-width: 560px; -} - -.qa-comment { - font-size: 0.875rem; - padding: 0.24rem 0; -} +video { max-width: 560px; } .showPassword { position: absolute; @@ -394,8 +409,8 @@ video { } .scroll-menu::-webkit-scrollbar { - width: 0; - height: 0 + width:0; + height:0 } .scroll-wrapper { @@ -425,34 +440,17 @@ video { * * Иконки, поделиться */ - + .icon-share { color: #fff; height: 28px; width: 28px; margin: 3px; } - -.bg-vk { - background-color: #07f; -} - -.bg-ok { - background-color: #eb722e; -} - -.bg-tg { - background-color: #64a9dc; -} - -.bg-fb { - background-color: #3b5998; -} - -.bg-lj { - background-color: #0d425a; -} - -.bg-tw { - background-color: #00aced; -} \ No newline at end of file + +.bg-vk { background-color: #07f; } +.bg-ok { background-color: #eb722e; } +.bg-tg { background-color: #64a9dc; } +.bg-fb { background-color: #3b5998; } +.bg-lj { background-color: #0d425a; } +.bg-tw { background-color: #00aced; } \ No newline at end of file diff --git a/resources/views/default/css/rtl.css b/resources/views/default/css/rtl.css index 8d79fcbb..092048ea 100644 --- a/resources/views/default/css/rtl.css +++ b/resources/views/default/css/rtl.css @@ -41,6 +41,6 @@ margin: 10px 0 10px 45px; } -.block-answer .right { +.block-comment .right { float: left; } \ No newline at end of file diff --git a/resources/views/default/css/theme/_variables-dark.css b/resources/views/default/css/theme/_variables-dark.css index e13b8f75..2b043d12 100644 --- a/resources/views/default/css/theme/_variables-dark.css +++ b/resources/views/default/css/theme/_variables-dark.css @@ -49,6 +49,8 @@ body.dark { --footer-text-color: #eee; --footer-color-active: #ccc; + --blockquote-bg: #2e3d49; + /* Colors used */ --black: #fff; --white: #161f27; @@ -81,7 +83,22 @@ body.dark .content_tree.edit { background-color: var(--form-bg-color); } +body.dark .content_tree { + word-wrap: break-word; + box-shadow: 0 15px 25px rgba(0,0,0,.1); + padding: 5px; +} + body.dark blockquote { - background-color: #5f5f67; + background-color: var(--blockquote-bg); border-left: 3px solid #6d6e6f; +} + +body.dark :not(pre)>code[class*=language-], pre[class*=language-] { + background: var(--blockquote-bg); +} + +body.dark code[class*=language-], pre[class*=language-] { + color: #eee; + text-shadow: none; } \ No newline at end of file diff --git a/resources/views/default/css/theme/_variables-light.css b/resources/views/default/css/theme/_variables-light.css index 3233790a..03cc8b39 100644 --- a/resources/views/default/css/theme/_variables-light.css +++ b/resources/views/default/css/theme/_variables-light.css @@ -52,6 +52,8 @@ --footer-box-shadow: 0 -5px 5px -5px rgb(0 0 0 / 15%); --footer-text-color: #9ca3af; --footer-color-active: #332f2f; + + --blockquote-bg: #f3f3f6; /* Colors used */ --black: #030303; diff --git a/resources/views/default/global/search-header.php b/resources/views/default/global/search-header.php index 944b14ef..dc4976e4 100644 --- a/resources/views/default/global/search-header.php +++ b/resources/views/default/global/search-header.php @@ -74,8 +74,8 @@ $q = $data['q']; class="active" > - class="active" > - + class="active" > + class="active" > diff --git a/resources/views/default/js/app.js b/resources/views/default/js/app.js index 0a711b13..d86aea9c 100644 --- a/resources/views/default/js/app.js +++ b/resources/views/default/js/app.js @@ -59,25 +59,6 @@ isIdEmpty('colorPicker').onclick = function () { }, false); } -// Call the form for adding / edit a reply -reply.forEach(el => el.addEventListener("click", function (e) { - let reply = document.querySelector('#reply_addentry' + el.dataset.id); - fetch("/reply/" + el.dataset.type, { - method: "POST", - body: "id=" + el.dataset.id + "&item_id=" + el.dataset.item_id + "&_token=" + token, - headers: { 'Content-Type': 'application/x-www-form-urlencoded' } - }) - .then(response => response.text()) - .then(text => { - reply.classList.add("block"); - reply.innerHTML = text; - queryAll("#cancel_comment") - .forEach(el => el.addEventListener("click", function (e) { - reply.classList.remove("block"); - })); - }); -})); - // Up queryAll(".up-id") .forEach(el => el.addEventListener("click", function (e) { @@ -164,13 +145,13 @@ queryAll(".add-ignore") })); -// Choice of Best Answer -queryAll(".answer-best") +// Choice of Best Comment +queryAll(".comment-best") .forEach(el => el.addEventListener("click", function (e) { fetch("/best", { method: "POST", headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - body: "answer_id=" + el.dataset.id + "&_token=" + token, + body: "comment_id=" + el.dataset.id + "&_token=" + token, }) .then(response => response.text()) .then(text => { @@ -209,35 +190,6 @@ queryAll("#graburl") }) })); -// Edit comment -queryAll(".editcomm") - .forEach(el => el.addEventListener("click", function (e) { - let comment_id = el.dataset.comment_id; - let comment = document.querySelector('#insert_id_' + el.dataset.comment_id); - - fetch("/comment/editform", { - method: "POST", - body: "comment_id=" + comment_id, - headers: { 'Content-Type': 'application/x-www-form-urlencoded' } - }) - .then( - response => { - return response.text(); - } - ).then( - text => { - getById("comment_" + comment_id).classList.add("edit"); - comment.classList.add("block"); - comment.innerHTML = text; - - queryAll("#cancel_comment") - .forEach(el => el.addEventListener("click", function (e) { - comment.classList.remove("block"); - })); - } - ); - })); - // Add post tab const tabs_post = document.querySelector(".tabs-post"); if (tabs_post) { diff --git a/resources/views/default/js/catalog.js b/resources/views/default/js/catalog.js index 5bc54031..c2bab8e5 100644 --- a/resources/views/default/js/catalog.js +++ b/resources/views/default/js/catalog.js @@ -67,4 +67,23 @@ function fetchSearchUrl() { } } ); -} \ No newline at end of file +} + +// Call the form for adding / edit a reply +reply.forEach(el => el.addEventListener("click", function (e) { + let reply = document.querySelector('#reply_addentry' + el.dataset.id); + fetch("/reply/" + el.dataset.type, { + method: "POST", + body: "id=" + el.dataset.id + "&item_id=" + el.dataset.item_id + "&_token=" + token, + headers: { 'Content-Type': 'application/x-www-form-urlencoded' } + }) + .then(response => response.text()) + .then(text => { + reply.classList.add("block"); + reply.innerHTML = text; + queryAll("#cancel_comment") + .forEach(el => el.addEventListener("click", function (e) { + reply.classList.remove("block"); + })); + }); +})); \ No newline at end of file diff --git a/resources/views/default/js/common.js b/resources/views/default/js/common.js index bc65c7f8..0eb9ac9a 100644 --- a/resources/views/default/js/common.js +++ b/resources/views/default/js/common.js @@ -18,19 +18,19 @@ let token = document.querySelector("meta[name='csrf-token']").getAttribute("cont queryAll(".add-comment") .forEach(el => el.addEventListener("click", function (e) { - let answer_id = insert_id = el.dataset.answer_id; - let comment_id = el.dataset.comment_id; + let comment_id = insert_id = el.dataset.comment_id; + let post_id = el.dataset.post_id; - if (comment_id) { - insert_id = el.dataset.comment_id; + if (post_id) { + insert_id = el.dataset.post_id; } let comment = document.querySelector('#insert_id_' + insert_id); comment.classList.add("block"); - fetch("/comments/addform", { + fetch("/comment/addform", { method: "POST", - body: "answer_id=" + answer_id + "&comment_id=" + comment_id + "&_token=" + token, + body: "post_id=" + post_id + "&comment_id=" + comment_id + "&_token=" + token, headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }) .then( @@ -301,8 +301,7 @@ if (tabs) { element.classList.remove("pointer"); } } -} - +} /* MIT license https://github.com/vivekweb2013/toastmaker */ (function (global, factory) { if (typeof define === "function" && define.amd) { diff --git a/resources/views/default/site-off.php b/resources/views/default/site-off.php index 2d2979ea..70f6c8c7 100644 --- a/resources/views/default/site-off.php +++ b/resources/views/default/site-off.php @@ -10,7 +10,7 @@
-

+

...

diff --git a/resources/views/light/css/custom.css b/resources/views/light/css/custom.css index 47025f1a..8975322a 100644 --- a/resources/views/light/css/custom.css +++ b/resources/views/light/css/custom.css @@ -35,10 +35,11 @@ body.dark ul.nav > li.active { color: #fff; } - ul.nav > li.active > a { color: var(--nav-color-active); } -.user-nav li:hover, .menu li.active, .menu li:hover { background-color: var(--nav-bg-active); } +.user-nav li:hover, +.menu li.active, +.menu li:hover { background-color: var(--nav-bg-active); } .active { color: #eab308; } .menu .active .icons { stroke: #eab308; } diff --git a/resources/views/minimum/content/post/post-view.php b/resources/views/minimum/content/post/post-view.php index 641a5f7b..9094a5b2 100644 --- a/resources/views/minimum/content/post/post-view.php +++ b/resources/views/minimum/content/post/post-view.php @@ -123,7 +123,7 @@ $post = $data['post'];
- +
diff --git a/resources/views/minimum/content/post/post.php b/resources/views/minimum/content/post/post.php index 50adf1e5..deaf7f50 100644 --- a/resources/views/minimum/content/post/post.php +++ b/resources/views/minimum/content/post/post.php @@ -28,10 +28,10 @@
- + · - +
diff --git a/resources/views/qa/content/home.php b/resources/views/qa/content/home.php index 7a180ed8..63775918 100644 --- a/resources/views/qa/content/home.php +++ b/resources/views/qa/content/home.php @@ -50,7 +50,7 @@
- $data['latest_answers']]); ?> + $data['latest_answers']]); ?> diff --git a/resources/views/qa/content/post/post.php b/resources/views/qa/content/post/post.php index 90826112..d85f0444 100644 --- a/resources/views/qa/content/post/post.php +++ b/resources/views/qa/content/post/post.php @@ -21,10 +21,9 @@ use Hleb\Constructor\Handlers\Request; ?>
- + -
+
diff --git a/routes/main.php b/routes/main.php index 6484d75d..13da4b66 100644 --- a/routes/main.php +++ b/routes/main.php @@ -5,7 +5,6 @@ Route::before('Designator', [UserData::USER_FIRST_LEVEL, '>='])->getGroup(); Route::post('/backend/upload/{type}/{id}')->controller('Post\EditPostController@uploadContentImage')->where(['type' => '[a-z-]+', 'id' => '[0-9]+']); Route::post('/status/action')->controller('ActionController@deletingAndRestoring'); Route::post('/post/grabtitle')->controller('Post\AddPostController@grabMeta'); - Route::post('/comment/editform')->controller('Comment\EditCommentController'); Route::post('/reply/editform')->controller('Item\ReplyController'); // @ users | posts | topics | category Route::post('/search/{type}')->controller('SearchController@select')->where(['type' => '[a-z]+']); @@ -80,7 +79,7 @@ Route::before('Designator', [UserData::USER_ZERO_LEVEL, '='])->getGroup(); Route::endGroup(); Route::getProtect(); - Route::post('/comments/addform')->controller('Comment\AddCommentController'); + Route::post('/comment/addform')->controller('Comment\AddCommentController'); Route::post('/reply/addform')->controller('Item\ReplyController@addForma'); Route::endProtect(); diff --git a/routes/radjax.php b/routes/radjax.php index 004b4934..dd2c31ef 100644 --- a/routes/radjax.php +++ b/routes/radjax.php @@ -1,7 +1,6 @@ true, "session_saved" => false]); -Radjax\Route::get("/more/comments", ["post"], "App\Controllers\Comment\CommentController@lastComment", ["protected" => true, "session_saved" => false]); $access = 'App\Middleware\Before\UserAuth@index'; Radjax\Route::get("/post/profile", ["post"], "App\Controllers\Post\PostController@postProfile", ["protected" => true, "before" => $access]); @@ -16,6 +15,6 @@ Radjax\Route::get("/votes", ["post"], "App\Services\Votes", ["protected" => true Radjax\Route::get("/poll", ["post"], "App\Controllers\Poll\PollController@vote", ["protected" => true, "before" => $access]); Radjax\Route::get("/favorite", ["post"], "App\Services\Favorite", ["protected" => true, "before" => $access]); Radjax\Route::get("/ignored", ["post"], "App\Services\Ignored", ["protected" => true, "before" => $access]); -Radjax\Route::get("/best", ["post"], "App\Services\AnswerBest", ["protected" => true, "before" => $access]); +Radjax\Route::get("/best", ["post"], "App\Services\CommentBest", ["protected" => true, "before" => $access]); Radjax\Route::get("/flag/repost", ["post"], "App\Services\Audit", ["protected" => true, "before" => $access]); Radjax\Route::get("/notif", ["post"], "App\Controllers\NotificationController@get", ["protected" => false, "before" => $access]); \ No newline at end of file