From 36b4d71dce0191f2523c4ce3889f0da2da1d8c09 Mon Sep 17 00:00:00 2001 From: F4ilji Date: Tue, 27 May 2025 19:47:45 +0500 Subject: [PATCH] added date filter --- .../Article/Tasks/BuildFiltersTask.php | 7 ++ app/Containers/Article/Tasks/GetPostsTask.php | 12 ++ .../WEB/Controllers/IndexPostController.php | 2 +- package-lock.json | 26 +++++ package.json | 1 + resources/js/Pages/Client/Posts/Index.vue | 5 +- resources/js/app.js | 1 + .../shared/badge/BasicListBadge.vue | 7 +- .../shared/badge/badges/DateBadge.vue | 64 +++++++++++ .../shared/filter/filters/DateFilter.vue | 108 ++++++++++++++++++ 10 files changed, 229 insertions(+), 4 deletions(-) create mode 100644 resources/js/componentss/shared/badge/badges/DateBadge.vue create mode 100644 resources/js/componentss/shared/filter/filters/DateFilter.vue diff --git a/app/Containers/Article/Tasks/BuildFiltersTask.php b/app/Containers/Article/Tasks/BuildFiltersTask.php index 84fc130..d1b25d3 100644 --- a/app/Containers/Article/Tasks/BuildFiltersTask.php +++ b/app/Containers/Article/Tasks/BuildFiltersTask.php @@ -82,6 +82,13 @@ class BuildFiltersTask param: 'sort' ); + $this->filterBuilder->add( + key: 'date_filter', + type: 'date', + value: $filters['date'] ?? null, + param: 'date' + ); + return $this->filterBuilder->get(); } diff --git a/app/Containers/Article/Tasks/GetPostsTask.php b/app/Containers/Article/Tasks/GetPostsTask.php index fc05738..bd6ceaf 100644 --- a/app/Containers/Article/Tasks/GetPostsTask.php +++ b/app/Containers/Article/Tasks/GetPostsTask.php @@ -34,6 +34,18 @@ class GetPostsTask }); } }) + ->when(!empty($filters['date']), function ($query) use ($filters) { + $dates = $filters['date']; + if ($dates[1] === null) { + // Если пришла одна дата, ищем по конкретной дате + $query->whereDate('publish_at', \Carbon\Carbon::createFromFormat('d.m.Y', $dates[0])->format('Y-m-d')); + } else { + // Если пришли две даты, ищем в диапазоне + $startDate = \Carbon\Carbon::createFromFormat('d.m.Y', $dates[0])->format('Y-m-d'); + $endDate = \Carbon\Carbon::createFromFormat('d.m.Y', $dates[1])->format('Y-m-d'); + $query->whereBetween('publish_at', [$startDate, $endDate]); + } + }) ->when(!empty($filters['search']), function ($query) use ($filters) { $query->whereRaw('LOWER(title) like ?', ["%".strtolower($filters['search'])."%"]); }); diff --git a/app/Containers/Article/UI/WEB/Controllers/IndexPostController.php b/app/Containers/Article/UI/WEB/Controllers/IndexPostController.php index 3d48f10..b982a72 100644 --- a/app/Containers/Article/UI/WEB/Controllers/IndexPostController.php +++ b/app/Containers/Article/UI/WEB/Controllers/IndexPostController.php @@ -14,7 +14,7 @@ class IndexPostController extends Controller public function __invoke(Request $request) { - $filters = $request->only(['search', 'category', 'tag', 'sort', 'page']); + $filters = $request->only(['search', 'category', 'tag', 'sort', 'page', 'date']); $data = $this->listPostsAction->run($filters); diff --git a/package-lock.json b/package-lock.json index 1123f17..8dbbbd8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,7 @@ "@preline/scrollspy": "^2.0.0", "@preline/select": "^2.5.0", "@vue/server-renderer": "^3.5.12", + "@vuepic/vue-datepicker": "^11.0.2", "daisyui": "^4.12.14", "flowbite": "^2.5.2", "fslightbox": "^3.4.1", @@ -1247,6 +1248,21 @@ "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", "license": "MIT" }, + "node_modules/@vuepic/vue-datepicker": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@vuepic/vue-datepicker/-/vue-datepicker-11.0.2.tgz", + "integrity": "sha512-uHh78mVBXCEjam1uVfTzZ/HkyDwut/H6b2djSN9YTF+l/EA+XONfdCnOVSi1g+qVGSy65DcQAwyBNidAssnudQ==", + "license": "MIT", + "dependencies": { + "date-fns": "^4.1.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "vue": ">=3.3.0" + } + }, "node_modules/acorn": { "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", @@ -2283,6 +2299,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, "node_modules/debug": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", diff --git a/package.json b/package.json index 4ef5616..aabaaaf 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "@preline/scrollspy": "^2.0.0", "@preline/select": "^2.5.0", "@vue/server-renderer": "^3.5.12", + "@vuepic/vue-datepicker": "^11.0.2", "daisyui": "^4.12.14", "flowbite": "^2.5.2", "fslightbox": "^3.4.1", diff --git a/resources/js/Pages/Client/Posts/Index.vue b/resources/js/Pages/Client/Posts/Index.vue index 15ce7ee..10a246c 100644 --- a/resources/js/Pages/Client/Posts/Index.vue +++ b/resources/js/Pages/Client/Posts/Index.vue @@ -21,9 +21,11 @@ import IsOnlineFilter from "@/componentss/shared/filter/filters/IsOnlineFilter.v import EventListSearch from "@/componentss/features/events/components/EventListSearch.vue"; import BreadcrumbsItem from "@/componentss/shared/Breadcrumbs/BreadcrumbsItem.vue"; import BaseBreadcrumbs from "@/componentss/shared/Breadcrumbs/BaseBreadcrumbs.vue"; +import DateFilter from "@/componentss/shared/filter/filters/DateFilter.vue"; export default { name: "Index", components: { + DateFilter, BaseBreadcrumbs, BreadcrumbsItem, WhenVisible, EventListSearch, IsOnlineFilter, BasicPagination, EventArchiveListBreadcrumbs, BasicPageWrapper, BasicPageContainer, @@ -76,7 +78,7 @@ export default { }, computed: { hasActiveFilters() { - return this.filters.category_filter.value || this.filters.tag_filter.value || this.filters.search_filter.value; + return this.filters.category_filter.value || this.filters.tag_filter.value || this.filters.search_filter.value || this.filters.date_filter.value; } }, @@ -102,6 +104,7 @@ export default { + diff --git a/resources/js/app.js b/resources/js/app.js index a580e2f..e89162e 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -11,6 +11,7 @@ import {linksReform} from "@/mixins/LinksReform.js"; import YSmartCaptcha from 'vue3-yandex-smartcaptcha' import cookieMixin from "@/mixins/cookieMixin.js"; import store from '@/store/index.js'; +import '@vuepic/vue-datepicker/dist/main.css'; diff --git a/resources/js/componentss/shared/badge/BasicListBadge.vue b/resources/js/componentss/shared/badge/BasicListBadge.vue index ecaa3f2..777cbee 100644 --- a/resources/js/componentss/shared/badge/BasicListBadge.vue +++ b/resources/js/componentss/shared/badge/BasicListBadge.vue @@ -14,6 +14,7 @@ import TagBadge from "@/componentss/shared/badge/badges/TagBadge.vue"; import SortingByBadge from "@/componentss/shared/badge/badges/SortingByBadge.vue"; import IsOnlineBadge from "@/componentss/shared/badge/badges/IsOnlineBadge.vue"; import EduBudgetBadge from "@/componentss/shared/badge/badges/EduBudgetBadge.vue"; +import DateBadge from "@/componentss/shared/badge/badges/DateBadge.vue"; export default { name: "BasicListBadge", components: { @@ -23,7 +24,8 @@ export default { TagBadge, SortingByBadge, IsOnlineBadge, - EduBudgetBadge + EduBudgetBadge, + DateBadge }, data() { return { @@ -37,7 +39,8 @@ export default { tag: 'TagBadge', sort: 'SortingByBadge', is_online: 'IsOnlineBadge', - budget: 'EduBudgetBadge' + budget: 'EduBudgetBadge', + date: 'DateBadge' }; return componentMap[type] || null; }, diff --git a/resources/js/componentss/shared/badge/badges/DateBadge.vue b/resources/js/componentss/shared/badge/badges/DateBadge.vue new file mode 100644 index 0000000..7a647a2 --- /dev/null +++ b/resources/js/componentss/shared/badge/badges/DateBadge.vue @@ -0,0 +1,64 @@ + + + + + \ No newline at end of file diff --git a/resources/js/componentss/shared/filter/filters/DateFilter.vue b/resources/js/componentss/shared/filter/filters/DateFilter.vue new file mode 100644 index 0000000..cad7dff --- /dev/null +++ b/resources/js/componentss/shared/filter/filters/DateFilter.vue @@ -0,0 +1,108 @@ + + + + + \ No newline at end of file