+ {% endif %}
+{% endblock %}
\ No newline at end of file
diff --git a/core/templates/admin/dropdown_date_range_filter.html b/core/templates/admin/dropdown_date_range_filter.html
deleted file mode 100644
index 7bbde95..0000000
--- a/core/templates/admin/dropdown_date_range_filter.html
+++ /dev/null
@@ -1,213 +0,0 @@
-{% load i18n rangefilter_compat static %}
-
{{ title }}
-
-
-
-
-
-
-
-
-
diff --git a/static/css/custom.css b/static/css/custom.css
index 0749166..b3c7f4b 100644
--- a/static/css/custom.css
+++ b/static/css/custom.css
@@ -177,4 +177,39 @@ body.model-platformprofile label[for="id_admin_panel_logo"] {
.form-row {
padding: 15px 10px;
border-bottom: 1px solid #f0f0f0;
+}
+
+/* --- Fix Admin Search Box Layout --- */
+
+/* Target the search form container in Jazzmin/AdminLTE */
+#changelist-search,
+#changelist-search .form-group,
+#changelist-search .input-group {
+ display: flex !important;
+ align-items: center !important;
+ flex-wrap: nowrap !important; /* Prevent wrapping */
+ max-width: 400px !important; /* Reduce the overall width */
+}
+
+/* Make the input field take available space but respect the container width */
+#changelist-search input[type="text"] {
+ width: auto !important;
+ flex-grow: 1 !important;
+ margin-right: 8px !important; /* Space between input and button */
+}
+
+/* Fix for RTL */
+[dir="rtl"] #changelist-search input[type="text"] {
+ margin-right: 0 !important;
+ margin-left: 8px !important;
+}
+
+/* Ensure the button stays inline and overrides any block behavior */
+#changelist-search button[type="submit"],
+#changelist-search .btn {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ white-space: nowrap !important;
+ width: auto !important;
+ height: auto !important;
}
\ No newline at end of file
diff --git a/static/js/admin_date_range_dropdown.js b/static/js/admin_date_range_dropdown.js
new file mode 100644
index 0000000..80b92ae
--- /dev/null
+++ b/static/js/admin_date_range_dropdown.js
@@ -0,0 +1,135 @@
+(function($) {
+ $(document).ready(function() {
+ // Helper to format date as YYYY-MM-DD
+ function formatDate(d) {
+ var year = d.getFullYear();
+ var month = ('0' + (d.getMonth() + 1)).slice(-2);
+ var day = ('0' + d.getDate()).slice(-2);
+ return year + '-' + month + '-' + day;
+ }
+
+ function initDateRangeDropdown() {
+ // Find start date inputs for 'created_at' (or generic generic approach for any range filter)
+ // rangefilter inputs typically have names ending in __gte and __lte
+ var $gteInputs = $('input[name$="__gte"]');
+
+ $gteInputs.each(function() {
+ var $gte = $(this);
+ var name = $gte.attr('name');
+ var prefix = name.substring(0, name.lastIndexOf('__gte'));
+ var $lte = $('input[name="' + prefix + '__lte"]');
+
+ if ($lte.length === 0) return; // Not a pair
+
+ // Find a container to inject the dropdown.
+ // In Jazzmin/Standard, this might be inside a .admindatefilter div,
+ // or just a li, or a div.controls.
+ // We'll look for the closest container that seems to wrap the filter.
+
+ // Try to find .admindatefilter first
+ var $container = $gte.closest('.admindatefilter');
+ if ($container.length === 0) {
+ // Fallback for Jazzmin or other themes: closest .card-body or similar?
+ // Or just the parent form/div
+ $container = $gte.closest('div[data-filter-name], li, .form-row, .card-body');
+ }
+
+ if ($container.length === 0) $container = $gte.parent();
+
+ if ($container.data('dropdown-init')) return;
+ $container.data('dropdown-init', true);
+
+ // Hide the original inputs/controls container
+ // We need to be careful not to hide the form itself if it's the main filter form
+ // Usually rangefilter puts inputs in a 'controls' div or paragraphs.
+ var $controls = $gte.closest('.controls');
+ if ($controls.length === 0) {
+ // Try to find the immediate parent if it contains both inputs
+ $controls = $gte.parent();
+ }
+
+ // Create Select
+ var $select = $('');
+
+ // Inject before the controls (inputs)
+ if ($controls.length) {
+ $controls.before($select);
+ } else {
+ $gte.before($select);
+ }
+
+ // Initial State
+ var gteVal = $gte.val();
+ var lteVal = $lte.val();
+
+ if (gteVal || lteVal) {
+ $select.val('custom');
+ $controls.show();
+ } else {
+ $select.val('any');
+ $controls.hide();
+ }
+
+ $select.on('change', function() {
+ var val = $(this).val();
+ var today = new Date();
+
+ if (val === 'custom') {
+ $controls.slideDown();
+ } else {
+ if (val === 'any') {
+ $gte.val('');
+ $lte.val('');
+ } else {
+ var startStr = '';
+ var endStr = formatDate(today);
+
+ if (val === 'today') {
+ startStr = formatDate(today);
+ } else if (val === '7days') {
+ var past = new Date();
+ past.setDate(today.getDate() - 7);
+ startStr = formatDate(past);
+ } else if (val === 'month') {
+ var firstDay = new Date(today.getFullYear(), today.getMonth(), 1);
+ startStr = formatDate(firstDay);
+ } else if (val === 'year') {
+ var firstDay = new Date(today.getFullYear(), 0, 1);
+ startStr = formatDate(firstDay);
+ }
+
+ $gte.val(startStr);
+ $lte.val(endStr);
+ }
+
+ // Submit form
+ // In Jazzmin, the filter form might be #changelist-search or similiar
+ var $form = $gte.closest('form');
+ if ($form.length) {
+ $form.submit();
+ } else {
+ // Try to find a global apply button or trigger change?
+ // Some admin themes auto-submit on change.
+ // rangefilter usually has a submit button.
+ var $btn = $container.find('input[type="submit"], button[type="submit"]');
+ if ($btn.length) $btn.click();
+ }
+ }
+ });
+ });
+ }
+
+ // Run init
+ initDateRangeDropdown();
+
+ // Safety: Run again after a slight delay in case of dynamic loading (unlikely in admin but possible)
+ setTimeout(initDateRangeDropdown, 500);
+ });
+})(django.jQuery);
\ No newline at end of file