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 @@
+
+
+ Дата: {{ firstDate }} {{ secondDate }}
+
+
+
+
+
+
+
\ 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