update Filters
This commit is contained in:
		
							parent
							
								
									13f065d4fc
								
							
						
					
					
						commit
						249c19e456
					
				
							
								
								
									
										3466
									
								
								logs/app.log
								
								
								
								
							
							
						
						
									
										3466
									
								
								logs/app.log
								
								
								
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										12255
									
								
								logs/app.log.1
								
								
								
								
							
							
						
						
									
										12255
									
								
								logs/app.log.1
								
								
								
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
				
			
			@ -14,7 +14,8 @@ from sqlalchemy.sql import func
 | 
			
		|||
from sqlalchemy import or_, and_, select
 | 
			
		||||
 | 
			
		||||
from sqlalchemy import null
 | 
			
		||||
from datetime import datetime
 | 
			
		||||
from datetime import datetime, timedelta
 | 
			
		||||
from sqlalchemy import func
 | 
			
		||||
 | 
			
		||||
from routers.auth import get_current_user
 | 
			
		||||
from model.database import get_async_session, Job, Client, AppliedJob, User
 | 
			
		||||
| 
						 | 
				
			
			@ -265,18 +266,26 @@ async def product_filtered(
 | 
			
		|||
    
 | 
			
		||||
    # Добавляем условия фильтрации
 | 
			
		||||
    conditions = []
 | 
			
		||||
    
 | 
			
		||||
    # http://127.0.0.1:8120/product
 | 
			
		||||
    # Фильтр по дате requested
 | 
			
		||||
    if date_requested == 'custom_date_requested' and date_requested_from and date_requested_to:
 | 
			
		||||
        start = datetime.strptime(date_requested_from, '%Y-%m-%d')
 | 
			
		||||
        end = datetime.strptime(date_requested_to, '%Y-%m-%d')
 | 
			
		||||
        conditions.append(Job.data_requested.between(start, end))
 | 
			
		||||
    elif date_requested == 'Today':
 | 
			
		||||
        conditions.append(func.date(Job.data_requested) == func.current_date())
 | 
			
		||||
        # conditions.append(func.date(Job.data_requested) == func.current_date())
 | 
			
		||||
        today = datetime.now().date()  # Получаем сегодняшнюю дату
 | 
			
		||||
        conditions.append(Job.data_requested >= today)
 | 
			
		||||
        conditions.append(Job.data_requested < today + timedelta(days=1))
 | 
			
		||||
    elif date_requested == 'Yesterday':
 | 
			
		||||
        conditions.append(func.date(Job.data_requested) == func.date_sub(func.current_date(), 1))
 | 
			
		||||
    elif date_requested == 'Last 7 days':
 | 
			
		||||
        conditions.append(Job.data_requested >= func.date_sub(func.current_date(), 7))
 | 
			
		||||
        seven_days_ago = datetime.now().date() - timedelta(days=6)
 | 
			
		||||
        tomorrow = datetime.now().date() + timedelta(days=1)
 | 
			
		||||
        
 | 
			
		||||
        conditions.append(Job.data_requested >= seven_days_ago)
 | 
			
		||||
        conditions.append(Job.data_requested < tomorrow)
 | 
			
		||||
        print(f"++++++++++++++++++++++++++++++++++++++++++{ (conditions)}")
 | 
			
		||||
    
 | 
			
		||||
    # Фильтр по дате posted
 | 
			
		||||
    if date_posted == 'custom_date_posted' and date_posted_from and date_posted_to:
 | 
			
		||||
| 
						 | 
				
			
			@ -284,11 +293,18 @@ async def product_filtered(
 | 
			
		|||
        end = datetime.strptime(date_posted_to, '%Y-%m-%d')
 | 
			
		||||
        conditions.append(Job.date_posted.between(start, end))
 | 
			
		||||
    elif date_posted == 'Today':
 | 
			
		||||
        conditions.append(func.date(Job.date_posted) == func.current_date())
 | 
			
		||||
        # conditions.append(func.date(Job.date_posted) == func.current_date())
 | 
			
		||||
        today = datetime.now().date()  # Получаем сегодняшнюю дату
 | 
			
		||||
        conditions.append(Job.date_posted >= today)
 | 
			
		||||
        conditions.append(Job.date_posted < today + timedelta(days=1))
 | 
			
		||||
    elif date_posted == 'Yesterday':
 | 
			
		||||
        conditions.append(func.date(Job.date_posted) == func.date_sub(func.current_date(), 1))
 | 
			
		||||
    elif date_posted == 'Last 7 days':
 | 
			
		||||
        conditions.append(Job.date_posted >= func.date_sub(func.current_date(), 7))
 | 
			
		||||
        seven_days_ago = datetime.now().date() - timedelta(days=6)
 | 
			
		||||
        tomorrow = datetime.now().date() + timedelta(days=1)
 | 
			
		||||
        
 | 
			
		||||
        conditions.append(Job.date_posted >= seven_days_ago)
 | 
			
		||||
        conditions.append(Job.date_posted < tomorrow)
 | 
			
		||||
    
 | 
			
		||||
    # Фильтр по дате applied
 | 
			
		||||
    if date_applied == 'custom_date_applied' and date_applied_from and date_applied_to:
 | 
			
		||||
| 
						 | 
				
			
			@ -297,6 +313,10 @@ async def product_filtered(
 | 
			
		|||
        conditions.append(AppliedJob.applied_on.between(start, end))
 | 
			
		||||
    elif date_applied == 'Today':
 | 
			
		||||
        conditions.append(func.date(AppliedJob.applied_on) == func.current_date())
 | 
			
		||||
        today = datetime.now().date()  # Получаем сегодняшнюю дату
 | 
			
		||||
        conditions.append(AppliedJob.applied_on >= today)
 | 
			
		||||
        conditions.append(AppliedJob.applied_on < today + timedelta(days=1))
 | 
			
		||||
        
 | 
			
		||||
    elif date_applied == 'Yesterday':
 | 
			
		||||
        conditions.append(func.date(AppliedJob.applied_on) == func.date_sub(func.current_date(), 1))
 | 
			
		||||
    elif date_applied == 'Last 7 days':
 | 
			
		||||
| 
						 | 
				
			
			@ -329,26 +349,6 @@ async def product_filtered(
 | 
			
		|||
        result1 = await session.execute(select(User))
 | 
			
		||||
        users = result1.scalars().all()
 | 
			
		||||
        
 | 
			
		||||
        # # Форматируем результат
 | 
			
		||||
        # response_data = []
 | 
			
		||||
        # for job in applied_jobs:
 | 
			
		||||
        #     response_data.append({
 | 
			
		||||
        #         "id": job.id,
 | 
			
		||||
        #         "client_id": job.client_id,
 | 
			
		||||
        #         "job_id": job.job_id,
 | 
			
		||||
        #         "applied_on": job.applied_on.isoformat() if job.applied_on else None,
 | 
			
		||||
        #         "status": job.status,
 | 
			
		||||
        #         "assignee": job.assignee,
 | 
			
		||||
        #         "priority": job.priority,
 | 
			
		||||
        #         "job": {
 | 
			
		||||
        #             "job_title": job.job.job_title,
 | 
			
		||||
        #             "company": job.job.job_company,
 | 
			
		||||
        #             "date_posted": job.job.date_posted.isoformat() if job.job.date_posted else None
 | 
			
		||||
        #         } if job.job else None
 | 
			
		||||
        #     })
 | 
			
		||||
        
 | 
			
		||||
        # print(f'{"status": "success", "data": response_data}')
 | 
			
		||||
    
 | 
			
		||||
    except Exception as e:
 | 
			
		||||
        await session.rollback()
 | 
			
		||||
        raise HTTPException(status_code=500, detail=str(e))
 | 
			
		||||
| 
						 | 
				
			
			@ -364,8 +364,17 @@ async def product_filtered(
 | 
			
		|||
            "username": username['username'], "users": users,
 | 
			
		||||
            "role": username["role"],
 | 
			
		||||
            "status": status, "assigned_users_ids": assignees,
 | 
			
		||||
            "client_id": client,
 | 
			
		||||
            "client_id": client, 
 | 
			
		||||
            "date_requested":date_requested,
 | 
			
		||||
            "date_requested_from": date_requested_from, 
 | 
			
		||||
            "date_requested_to":date_requested_to,
 | 
			
		||||
            "date_posted": date_posted,
 | 
			
		||||
            "date_posted_from": date_posted_from,
 | 
			
		||||
            "date_posted_to": date_posted_to,
 | 
			
		||||
            
 | 
			
		||||
            "date_applied":date_applied,
 | 
			
		||||
            "date_applied_from": date_applied_from,
 | 
			
		||||
            "date_applied_to": date_applied_to,
 | 
			
		||||
            "current_path": request.url.path
 | 
			
		||||
        }
 | 
			
		||||
    )
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,150 +1,184 @@
 | 
			
		|||
                    <!-- BEGIN: Inbox Filter -->
 | 
			
		||||
                        <div class="intro-y flex flex-col-reverse sm:flex-row items-center">
 | 
			
		||||
                            <div class="w-full sm:w-auto relative mr-auto mt-3 sm:mt-0">
 | 
			
		||||
                                <i class="w-4 h-4 absolute my-auto inset-y-0 ml-3 left-0 z-10 text-gray-700" data-feather="search"></i> 
 | 
			
		||||
                                <input type="text" class="input w-full sm:w-64 box px-10 text-gray-700 placeholder-theme-13" placeholder="Filter">
 | 
			
		||||
                                <div class="inbox-filter dropdown absolute inset-y-0 mr-3 right-0 flex items-center">
 | 
			
		||||
                                    <i class="dropdown-toggle w-4 h-4 cursor-pointer text-gray-700" data-feather="chevron-down"></i> 
 | 
			
		||||
                                    <div class="inbox-filter__dropdown-box dropdown-box mt-10 absolute top-0 left-0 z-20">
 | 
			
		||||
                                        <div class="dropdown-box__content box p-5">
 | 
			
		||||
                                            <div class="grid grid-cols-12 gap-4 row-gap-3">
 | 
			
		||||
                                                <div class="col-span-6">
 | 
			
		||||
                                                    <div class="text-xs">Requested o</div>
 | 
			
		||||
                                                    <select id="" class="input w-full border mt-2 flex-1">
 | 
			
		||||
                                                        
 | 
			
		||||
                                                        <option value="Today">Today</option>
 | 
			
		||||
                                                        <option value="Last 7 days">Last 7 days</option>
 | 
			
		||||
                                                        <option value="For all time">For all time</option>
 | 
			
		||||
                                                        <option value="date_range1">from date to date</option>
 | 
			
		||||
                                                    </select>
 | 
			
		||||
                                                </div>
 | 
			
		||||
                                                <div class="col-span-6">
 | 
			
		||||
                                                    <div class="text-xs">Posted on</div>
 | 
			
		||||
                                                    <select data-placeholder="Select Posted on"  id="" class="input w-full border mt-2 flex-1">
 | 
			
		||||
                                                        
 | 
			
		||||
                                                        <option value="Today">Today</option>
 | 
			
		||||
                                                        <option value="Last 7 days">Last 7 days</option>
 | 
			
		||||
                                                        <option value="For all time">For all time</option>
 | 
			
		||||
                                                        <option value="date_range">from date to date</option>
 | 
			
		||||
                                                    </select>
 | 
			
		||||
                                                </div>
 | 
			
		||||
                                                <div class="col-span-6">
 | 
			
		||||
                                                        <div class="text-xs">Applied on</div>
 | 
			
		||||
                                                        <select id="applied-select" class="input w-full border mt-2 flex-1">
 | 
			
		||||
                                                            <option value="Today">Today</option>
 | 
			
		||||
                                                            <option value="Last 7 days">Last 7 days</option>
 | 
			
		||||
                                                            <option value="For all time">For all time</option>
 | 
			
		||||
                                                            <option value="date_applied">from date to date</option>
 | 
			
		||||
                                                        </select>
 | 
			
		||||
                
 | 
			
		||||
<div class="p-5" id="boxed-accordion">
 | 
			
		||||
    <div class="preview">
 | 
			
		||||
        <div class="accordion">
 | 
			
		||||
            <div class="accordion__pane border border-gray-200 p-4 mt-3">
 | 
			
		||||
                <a href="javascript:;" class="accordion__pane__toggle filter-link font-medium block">Filter</a>
 | 
			
		||||
 | 
			
		||||
                                                        <!-- обёртка для диапазона дат (по умолчанию скрыта) -->
 | 
			
		||||
                                                        <div id="date-range-wrapper" class="p-5 grid grid-cols-12 gap-4 row-gap-3 mt-4" style="display: none;">
 | 
			
		||||
                                                            <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                                                <label>From</label>
 | 
			
		||||
                                                                <input id="date-from" class="datepicker input w-full border mt-2">
 | 
			
		||||
                                                            </div>
 | 
			
		||||
                                                            <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                                                <label>To</label>
 | 
			
		||||
                                                                <input id="date-to" class="datepicker input w-full border mt-2">
 | 
			
		||||
                                                            </div>
 | 
			
		||||
                                                        </div>
 | 
			
		||||
                                                    </div>
 | 
			
		||||
 | 
			
		||||
                                                    <script>
 | 
			
		||||
                                                        const select = document.getElementById('applied-select');
 | 
			
		||||
                                                        const dateRangeWrapper = document.getElementById('date-range-wrapper');
 | 
			
		||||
                                                        const dateFrom = document.getElementById('date-from');
 | 
			
		||||
                                                        const dateTo = document.getElementById('date-to');
 | 
			
		||||
 | 
			
		||||
                                                        select.addEventListener('change', function () {
 | 
			
		||||
                                                            if (this.value === 'date_applied') {
 | 
			
		||||
                                                                dateRangeWrapper.style.display = 'grid';
 | 
			
		||||
                                                            } else {
 | 
			
		||||
                                                                dateRangeWrapper.style.display = 'none';
 | 
			
		||||
                                                                dateFrom.value = '';
 | 
			
		||||
                                                                dateTo.value = '';
 | 
			
		||||
                                                            }
 | 
			
		||||
                                                        });
 | 
			
		||||
 | 
			
		||||
                                                        // Если хочешь — можно сохранить даты как data-атрибут или передать их куда нужно
 | 
			
		||||
                                                        dateFrom.addEventListener('change', function () {
 | 
			
		||||
                                                            select.setAttribute('data-date-from', this.value);
 | 
			
		||||
                                                        });
 | 
			
		||||
 | 
			
		||||
                                                        dateTo.addEventListener('change', function () {
 | 
			
		||||
                                                            select.setAttribute('data-date-to', this.value);
 | 
			
		||||
                                                        });
 | 
			
		||||
                                                    </script>
 | 
			
		||||
                                               
 | 
			
		||||
                                                <div class="col-span-6">
 | 
			
		||||
                                                     
 | 
			
		||||
                                                    <div class="mt-3">
 | 
			
		||||
                                                        <label>Clients</label>
 | 
			
		||||
                                                        <div class="mt-2">
 | 
			
		||||
                                                            <select data-placeholder="Select Clients" id="clients-multiselect" class="select2 w-full" multiple="multiple">
 | 
			
		||||
                                                                {% set seen_ids = [] %}
 | 
			
		||||
                                                                {% for job in jobs %}
 | 
			
		||||
                                                                    {% if job.client.id not in seen_ids %}
 | 
			
		||||
                                                                        <option value="{{ job.client.id }}">{{ job.client.user_nicename }}</option>
 | 
			
		||||
                                                                        {% set _ = seen_ids.append(job.client.id) %}
 | 
			
		||||
                                                                    {% endif %}
 | 
			
		||||
                                                                {% endfor %}
 | 
			
		||||
                                                            </select>
 | 
			
		||||
                                                        </div>
 | 
			
		||||
                                                    </div>
 | 
			
		||||
                                                    
 | 
			
		||||
                                                    
 | 
			
		||||
                                                    </div>
 | 
			
		||||
                                                    
 | 
			
		||||
                                                
 | 
			
		||||
                                                <div class="col-span-6">
 | 
			
		||||
                                                <div class="mt-3">
 | 
			
		||||
                                                    <label>Assignee</label>
 | 
			
		||||
                                                    <div class="mt-2">
 | 
			
		||||
                                                        <select data-placeholder="Select Assignee" class="select2 w-full" multiple="multiple" name="assignee">
 | 
			
		||||
                                                            <option value="">— Not selected —</option>
 | 
			
		||||
                                                            {% for user in users %}
 | 
			
		||||
                                                                <option value="{{ user.id }}" 
 | 
			
		||||
                                                                    {% if user.id in assigned_users_ids %}selected{% endif %}>
 | 
			
		||||
                                                                    {{ user.username }}
 | 
			
		||||
                                                                </option>
 | 
			
		||||
                                                            {% endfor %}
 | 
			
		||||
                                                        </select>
 | 
			
		||||
                                                    </div>
 | 
			
		||||
                                                </div>
 | 
			
		||||
                <div class="accordion__pane__content mt-3 text-gray-800 leading-relaxed">
 | 
			
		||||
                    <div class="dropdown-box__content box p-5">
 | 
			
		||||
                        <form method="POST" action="/productf">
 | 
			
		||||
                            <!-- Дата-фильтры (Requested, Posted, Applied) -->
 | 
			
		||||
                            <div class="flex gap-4">
 | 
			
		||||
                                <!-- Requested on -->
 | 
			
		||||
                                <div class="w-1/2">
 | 
			
		||||
                                    <div class="text-xs">Requested on</div>
 | 
			
		||||
                                    <select id="date_requested" class="input w-full border mt-2 flex-1" name="date_requested">
 | 
			
		||||
                                        <option value=""></option>
 | 
			
		||||
                                        <option value="Today">Today</option>
 | 
			
		||||
                                        <option value="Last 7 days">Last 7 days</option>
 | 
			
		||||
                                        <!--<option value="For all time">For all time</option>-->
 | 
			
		||||
                                        <option value="custom_date_requested">from date to date</option>
 | 
			
		||||
                                    </select>
 | 
			
		||||
                                    <div id="date-requested-range-wrapper" class="p-5 grid grid-cols-12 gap-4 row-gap-3 mt-4" style="display: none;">
 | 
			
		||||
                                        <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                            <label>From</label>
 | 
			
		||||
                                            <div class="relative">
 | 
			
		||||
                                                <input type="date" id="date-requested-from" class="input w-full border mt-2 cursor-pointer" name="date_requested_from">
 | 
			
		||||
                                            </div>
 | 
			
		||||
                                                <div class="col-span-6">
 | 
			
		||||
                                                   
 | 
			
		||||
                                                    <div class="mt-3">
 | 
			
		||||
                                                        <label>Status</label>
 | 
			
		||||
                                                        <div class="mt-2">
 | 
			
		||||
                                                            <select data-placeholder="Select Status" class="select2 w-full" multiple>
 | 
			
		||||
                                                                <option value="Scheduled" >Scheduled</option>
 | 
			
		||||
                                                                <option value="Requested">Requested</option>
 | 
			
		||||
                                                                <option value="In-Progress">In-Progress</option>
 | 
			
		||||
                                                                <option value="Applied">Applied</option>
 | 
			
		||||
                                                                <option value="Issues Applying">Issues Applying</option>
 | 
			
		||||
                                                                <option value="Cancelled">Cancelled</option>
 | 
			
		||||
 | 
			
		||||
                                                            </select>
 | 
			
		||||
                                                        </div>
 | 
			
		||||
                                                    </div>
 | 
			
		||||
                                                </div>
 | 
			
		||||
                                                <div class="col-span-12 flex items-center mt-3">
 | 
			
		||||
                                                    
 | 
			
		||||
                                                    <button class="button w-32 justify-center block bg-theme-1 text-white ml-2">Search</button>
 | 
			
		||||
                                                </div>
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                        <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                            <label>To</label>
 | 
			
		||||
                                            <div class="relative">
 | 
			
		||||
                                                <input type="date" id="date-requested-to" class="input w-full border mt-2 cursor-pointer" name="date_requested_to">
 | 
			
		||||
                                            </div>
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                    </div>
 | 
			
		||||
                                </div>
 | 
			
		||||
                            </div>
 | 
			
		||||
                            <div class="w-full sm:w-auto flex">
 | 
			
		||||
                                
 | 
			
		||||
                                <div class="dropdown relative">
 | 
			
		||||
                                
 | 
			
		||||
                                        
 | 
			
		||||
 | 
			
		||||
                                <!-- Posted on -->
 | 
			
		||||
                                <div class="w-1/2">
 | 
			
		||||
                                    <div class="text-xs">Posted on</div>
 | 
			
		||||
                                    <select id="date_posted" class="input w-full border mt-2 flex-1" name="date_posted">
 | 
			
		||||
                                        <option value=""></option>
 | 
			
		||||
                                        <option value="Today">Today</option>
 | 
			
		||||
                                        <option value="Last 7 days">Last 7 days</option>
 | 
			
		||||
                                       <!--<option value="For all time">For all time</option>-->
 | 
			
		||||
                                        <option value="custom_date_posted">from date to date</option>
 | 
			
		||||
                                    </select>
 | 
			
		||||
                                    <div id="date-posted-range-wrapper" class="p-5 grid grid-cols-12 gap-4 row-gap-3 mt-4" style="display: none;">
 | 
			
		||||
                                        <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                            <label>From</label>
 | 
			
		||||
                                            <div class="relative">
 | 
			
		||||
                                                <input type="date" id="date-posted-from" class="input w-full border mt-2 cursor-pointer" name="date_posted_from">
 | 
			
		||||
                                            </div>
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                        <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                            <label>To</label>
 | 
			
		||||
                                            <div class="relative">
 | 
			
		||||
                                                <input type="date" id="date-posted-to" class="input w-full border mt-2 cursor-pointer" name="date_posted_to">
 | 
			
		||||
                                            </div>
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                    </div>
 | 
			
		||||
                                </div>
 | 
			
		||||
                            
 | 
			
		||||
 | 
			
		||||
                            <!-- Applied on -->
 | 
			
		||||
                            <div class="w-1/2">
 | 
			
		||||
                                <div class="text-xs">Applied on</div>
 | 
			
		||||
                                <select id="date_applied" class="input w-full border mt-2 flex-1" name="date_applied">
 | 
			
		||||
                                    <option value=""></option>
 | 
			
		||||
                                    <option value="Today">Today</option>
 | 
			
		||||
                                    <option value="Last 7 days">Last 7 days</option>
 | 
			
		||||
                                    <!--<option value="For all time">For all time</option>-->
 | 
			
		||||
                                    <option value="custom_date_applied">from date to date</option>
 | 
			
		||||
                                </select>
 | 
			
		||||
                                <div id="date-applied-range-wrapper" class="p-5 grid grid-cols-12 gap-4 row-gap-3 mt-4" style="display: none;">
 | 
			
		||||
                                    <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                        <label>From</label>
 | 
			
		||||
                                        <div class="relative">
 | 
			
		||||
                                            <input type="date" id="date-applied-from" class="input w-full border mt-2 cursor-pointer" name="date_applied_from">
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                    </div>
 | 
			
		||||
                                    <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                        <label>To</label>
 | 
			
		||||
                                        <div class="relative">
 | 
			
		||||
                                            <input type="date" id="date-applied-to" class="input w-full border mt-2 cursor-pointer" name="date_applied_to">
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                    </div>
 | 
			
		||||
                                </div>
 | 
			
		||||
                            </div>
 | 
			
		||||
                        </div>
 | 
			
		||||
                        <!-- END: Inbox Filter -->
 | 
			
		||||
                            </div>
 | 
			
		||||
 | 
			
		||||
<div class="flex flex-nowrap gap-4 mt-4">  <!-- flex-nowrap запрещает перенос на новую строку -->
 | 
			
		||||
    <!-- Clients (50% ширины) -->
 | 
			
		||||
    <div class="flex-1 min-w-0">  <!-- flex-1 + min-w-0 предотвращает "расползание" -->
 | 
			
		||||
        <label class="block mb-1 text-sm">Clients</label>
 | 
			
		||||
        <select id="clients-multiselect1" class="select2 w-full" multiple="multiple" data-placeholder="Select Clients" name="client">
 | 
			
		||||
            {% set seen_ids = [] %}
 | 
			
		||||
            {% for job in jobs %}
 | 
			
		||||
                {% if job.client.id not in seen_ids %}
 | 
			
		||||
                    <option value="{{ job.client.id }}">{{ job.client.user_nicename }}</option>
 | 
			
		||||
                    {% set _ = seen_ids.append(job.client.id) %}
 | 
			
		||||
                {% endif %}
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </select>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <!-- Assignee (50% ширины) -->
 | 
			
		||||
    <div class="flex-1 min-w-0">  <!-- flex-1 дает равную ширину -->
 | 
			
		||||
        <label class="block mb-1 text-sm">Assignee</label>
 | 
			
		||||
        <select id="assignee-multiselect" class="select2 w-full" multiple="multiple" data-placeholder="Select Assignee" name="assignee">
 | 
			
		||||
            <option value="">— Not selected —</option>
 | 
			
		||||
            {% for user in users %}
 | 
			
		||||
                <option value="{{ user.id }}" {% if user.id in assigned_users_ids %}selected{% endif %}>{{ user.username }}</option>
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </select>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                            <!-- Status и кнопка Apply Filters -->
 | 
			
		||||
                            <div class="flex-1 min-w-0">
 | 
			
		||||
                                <label>Status</label>
 | 
			
		||||
                                <div class="mt-2">
 | 
			
		||||
                                    <!-- <select data-placeholder="Select Status" class="select2 w-full" multiple name="status">-->
 | 
			
		||||
                                        <select data-placeholder="Select Status" class="select2 w-full" multiple name="status">
 | 
			
		||||
                                        <option value="Scheduled">Scheduled</option>
 | 
			
		||||
                                        <option value="Requested">Requested</option>
 | 
			
		||||
                                        <option value="In-Progress">In-Progress</option>
 | 
			
		||||
                                        <option value="Paused">Paused</option>
 | 
			
		||||
                                        <option value="Applied">Applied</option>
 | 
			
		||||
                                        <option value="Issues Applying">Issues Applying</option>
 | 
			
		||||
                                        <option value="Cancelled">Cancelled</option>
 | 
			
		||||
                                    </select>
 | 
			
		||||
                                </div>
 | 
			
		||||
                                <button type="submit" class="button bg-theme-1 text-white mt-5">Apply Filters</button>
 | 
			
		||||
                            </div>
 | 
			
		||||
                            </div>
 | 
			
		||||
                        </form>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
// Функция для настройки обработчиков событий для каждого селекта
 | 
			
		||||
function setupDateSelect(selectId, wrapperId, customValue) {
 | 
			
		||||
    const select = document.getElementById(selectId);
 | 
			
		||||
    const dateRangeWrapper = document.getElementById(wrapperId);
 | 
			
		||||
 | 
			
		||||
    select.addEventListener('change', function() {
 | 
			
		||||
        if (this.value === customValue) {
 | 
			
		||||
            dateRangeWrapper.style.display = 'grid';
 | 
			
		||||
            
 | 
			
		||||
        } else {
 | 
			
		||||
            dateRangeWrapper.style.display = 'none';
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // Инициализация при загрузке страницы
 | 
			
		||||
    if (select.value === customValue) {
 | 
			
		||||
        dateRangeWrapper.style.display = 'grid';
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Настройка всех трех селектов
 | 
			
		||||
document.addEventListener('DOMContentLoaded', function() {
 | 
			
		||||
    setupDateSelect('date_requested', 'date-requested-range-wrapper', 'custom_date_requested');
 | 
			
		||||
    setupDateSelect('date_posted', 'date-posted-range-wrapper', 'custom_date_posted');
 | 
			
		||||
    setupDateSelect('date_applied', 'date-applied-range-wrapper', 'custom_date_applied');
 | 
			
		||||
    
 | 
			
		||||
    // Добавляем обработчики для полей ввода даты
 | 
			
		||||
    document.querySelectorAll('input[type="date"]').forEach(input => {
 | 
			
		||||
        input.addEventListener('focus', function() {
 | 
			
		||||
            this.showPicker();
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
</script>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,164 +31,18 @@
 | 
			
		|||
                
 | 
			
		||||
                
 | 
			
		||||
                
 | 
			
		||||
<div class="p-5" id="boxed-accordion">
 | 
			
		||||
    <div class="preview">
 | 
			
		||||
        <div class="accordion">
 | 
			
		||||
            <div class="accordion__pane border border-gray-200 p-4 mt-3">
 | 
			
		||||
                <a href="javascript:;" class="accordion__pane__toggle filter-link font-medium block">Filter</a>
 | 
			
		||||
 | 
			
		||||
                <div class="accordion__pane__content mt-3 text-gray-800 leading-relaxed">
 | 
			
		||||
                    <div class="dropdown-box__content box p-5">
 | 
			
		||||
                        <form method="POST" action="/productf">
 | 
			
		||||
                            <!-- Дата-фильтры (Requested, Posted, Applied) -->
 | 
			
		||||
                            <div class="flex gap-4">
 | 
			
		||||
                                <!-- Requested on -->
 | 
			
		||||
                                <div class="w-1/2">
 | 
			
		||||
                                    <div class="text-xs">Requested on</div>
 | 
			
		||||
                                    <select id="date_requested" class="input w-full border mt-2 flex-1" name="date_requested">
 | 
			
		||||
                                        <option value=""></option>
 | 
			
		||||
                                        <option value="Today">Today</option>
 | 
			
		||||
                                        <option value="Last 7 days">Last 7 days</option>
 | 
			
		||||
                                        <option value="For all time">For all time</option>
 | 
			
		||||
                                        <option value="custom_date_requested">from date to date</option>
 | 
			
		||||
                                    </select>
 | 
			
		||||
                                    <div id="date-requested-range-wrapper" class="p-5 grid grid-cols-12 gap-4 row-gap-3 mt-4" style="display: none;">
 | 
			
		||||
                                        <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                            <label>From</label>
 | 
			
		||||
                                            <input type="date" id="date-requested-from" class="input w-full border mt-2" name="date_requested_from">
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                        <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                            <label>To</label>
 | 
			
		||||
                                            <input type="date" id="date-requested-to" class="input w-full border mt-2" name="date_requested_to">
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                    </div>
 | 
			
		||||
                                </div>
 | 
			
		||||
   
 | 
			
		||||
        <!-- Другие поля формы -->
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
                                <!-- Posted on -->
 | 
			
		||||
                                <div class="w-1/2">
 | 
			
		||||
                                    <div class="text-xs">Posted on</div>
 | 
			
		||||
                                    <select id="date_posted" class="input w-full border mt-2 flex-1" name="date_posted">
 | 
			
		||||
                                        <option value=""></option>
 | 
			
		||||
                                        <option value="Today">Today</option>
 | 
			
		||||
                                        <option value="Last 7 days">Last 7 days</option>
 | 
			
		||||
                                        <option value="For all time">For all time</option>
 | 
			
		||||
                                        <option value="custom_date_posted">from date to date</option>
 | 
			
		||||
                                    </select>
 | 
			
		||||
                                    <div id="date-posted-range-wrapper" class="p-5 grid grid-cols-12 gap-4 row-gap-3 mt-4" style="display: none;">
 | 
			
		||||
                                        <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                            <label>From</label>
 | 
			
		||||
                                            <input type="date" id="date-posted-from" class="input w-full border mt-2" name="date_posted_from">
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                        <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                            <label>To</label>
 | 
			
		||||
                                            <input type="date" id="date-posted-to" class="input w-full border mt-2" name="date_posted_to">
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                    </div>
 | 
			
		||||
                                </div>
 | 
			
		||||
                            
 | 
			
		||||
    
 | 
			
		||||
    {% include "filtr.html" %}
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
                            <!-- Applied on -->
 | 
			
		||||
                            <div class="w-1/2">
 | 
			
		||||
                                <div class="text-xs">Applied on</div>
 | 
			
		||||
                                <select id="date_applied" class="input w-full border mt-2 flex-1" name="date_applied">
 | 
			
		||||
                                    <option value=""></option>
 | 
			
		||||
                                    <option value="Today">Today</option>
 | 
			
		||||
                                    <option value="Last 7 days">Last 7 days</option>
 | 
			
		||||
                                    <option value="For all time">For all time</option>
 | 
			
		||||
                                    <option value="custom_date_applied">from date to date</option>
 | 
			
		||||
                                </select>
 | 
			
		||||
                                <div id="date-applied-range-wrapper" class="p-5 grid grid-cols-12 gap-4 row-gap-3 mt-4" style="display: none;">
 | 
			
		||||
                                    <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                        <label>From</label>
 | 
			
		||||
                                        <input type="date" id="date-applied-from" class="input w-full border mt-2" name="date_applied_from">
 | 
			
		||||
                                    </div>
 | 
			
		||||
                                    <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                        <label>To</label>
 | 
			
		||||
                                        <input type="date" id="date-applied-to" class="input w-full border mt-2" name="date_applied_to">
 | 
			
		||||
                                    </div>
 | 
			
		||||
                                </div>
 | 
			
		||||
                            </div>
 | 
			
		||||
                            </div>
 | 
			
		||||
        
 | 
			
		||||
     
 | 
			
		||||
 | 
			
		||||
<div class="flex flex-nowrap gap-4 mt-4">  <!-- flex-nowrap запрещает перенос на новую строку -->
 | 
			
		||||
    <!-- Clients (50% ширины) -->
 | 
			
		||||
    <div class="flex-1 min-w-0">  <!-- flex-1 + min-w-0 предотвращает "расползание" -->
 | 
			
		||||
        <label class="block mb-1 text-sm">Clients</label>
 | 
			
		||||
        <select id="clients-multiselect1" class="select2 w-full" multiple="multiple" data-placeholder="Select Clients" name="client">
 | 
			
		||||
            {% set seen_ids = [] %}
 | 
			
		||||
            {% for job in jobs %}
 | 
			
		||||
                {% if job.client.id not in seen_ids %}
 | 
			
		||||
                    <option value="{{ job.client.id }}">{{ job.client.user_nicename }}</option>
 | 
			
		||||
                    {% set _ = seen_ids.append(job.client.id) %}
 | 
			
		||||
                {% endif %}
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </select>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <!-- Assignee (50% ширины) -->
 | 
			
		||||
    <div class="flex-1 min-w-0">  <!-- flex-1 дает равную ширину -->
 | 
			
		||||
        <label class="block mb-1 text-sm">Assignee</label>
 | 
			
		||||
        <select id="assignee-multiselect" class="select2 w-full" multiple="multiple" data-placeholder="Select Assignee" name="assignee">
 | 
			
		||||
            <option value="">— Not selected —</option>
 | 
			
		||||
            {% for user in users %}
 | 
			
		||||
                <option value="{{ user.id }}" {% if user.id in assigned_users_ids %}selected{% endif %}>{{ user.username }}</option>
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </select>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                            <!-- Status и кнопка Apply Filters -->
 | 
			
		||||
                            <div class="flex-1 min-w-0">
 | 
			
		||||
                                <label>Status</label>
 | 
			
		||||
                                <div class="mt-2">
 | 
			
		||||
                                    <select data-placeholder="Select Status" class="select2 w-full" multiple name="status">
 | 
			
		||||
                                        <option value="Scheduled">Scheduled</option>
 | 
			
		||||
                                        <option value="Requested">Requested</option>
 | 
			
		||||
                                        <option value="In-Progress">In-Progress</option>
 | 
			
		||||
                                        <option value="Paused">Paused</option>
 | 
			
		||||
                                        <option value="Applied">Applied</option>
 | 
			
		||||
                                        <option value="Issues Applying">Issues Applying</option>
 | 
			
		||||
                                        <option value="Cancelled">Cancelled</option>
 | 
			
		||||
                                    </select>
 | 
			
		||||
                                </div>
 | 
			
		||||
                                <button type="submit" class="button bg-theme-1 text-white mt-5">Apply Filters</button>
 | 
			
		||||
                            </div>
 | 
			
		||||
                            </div>
 | 
			
		||||
                        </form>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
// Функция для настройки обработчиков событий для каждого селекта
 | 
			
		||||
function setupDateSelect(selectId, wrapperId, customValue) {
 | 
			
		||||
    const select = document.getElementById(selectId);
 | 
			
		||||
    const dateRangeWrapper = document.getElementById(wrapperId);
 | 
			
		||||
 | 
			
		||||
    select.addEventListener('change', function() {
 | 
			
		||||
        if (this.value === customValue) {
 | 
			
		||||
            dateRangeWrapper.style.display = 'grid';
 | 
			
		||||
        } else {
 | 
			
		||||
            dateRangeWrapper.style.display = 'none';
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // Инициализация при загрузке страницы
 | 
			
		||||
    if (select.value === customValue) {
 | 
			
		||||
        dateRangeWrapper.style.display = 'grid';
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Настройка всех трех селектов
 | 
			
		||||
document.addEventListener('DOMContentLoaded', function() {
 | 
			
		||||
    setupDateSelect('date_requested', 'date-requested-range-wrapper', 'custom_date_requested');
 | 
			
		||||
    setupDateSelect('date_posted', 'date-posted-range-wrapper', 'custom_date_posted');
 | 
			
		||||
    setupDateSelect('date_applied', 'date-applied-range-wrapper', 'custom_date_applied');
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
                <!-- BEGIN: Datatable -->
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -231,7 +85,9 @@ document.addEventListener('DOMContentLoaded', function() {
 | 
			
		|||
                                        <option value="Scheduled" {% if job.status == "Scheduled" %}selected{% endif %}>Scheduled</option>
 | 
			
		||||
                                        <option value="Requested" {% if job.status == "Requested" %}selected{% endif %}>Requested</option>
 | 
			
		||||
                                        <option value="In-Progress" {% if job.status == "In-Progress" %}selected{% endif %}>In-Progress</option>
 | 
			
		||||
                                        <option value="Paused" {% if job.status == "Paused" %}selected{% endif %}>Paused</option>
 | 
			
		||||
                                        
 | 
			
		||||
                                        <option value="Paused" {% if job.status == "Paused" %}selected{% endif %} disabled>Paused</option>
 | 
			
		||||
 | 
			
		||||
                                        <option value="Applied" {% if job.status == "Applied" %}selected{% endif %}>Applied</option>
 | 
			
		||||
                                        <option value="Issues Applying" {% if job.status == "Issues Applying" %}selected{% endif %}>Issues Applying</option>
 | 
			
		||||
                                        <option value="Cancelled" {% if job.status == "Cancelled" %}selected{% endif %}>Cancelled</option>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -49,19 +49,32 @@
 | 
			
		|||
                                    <div class="text-xs">Requested on</div>
 | 
			
		||||
                                    <select id="date_requested" class="input w-full border mt-2 flex-1" name="date_requested">
 | 
			
		||||
                                        <option value=""></option>
 | 
			
		||||
                                        <option value="Today">Today</option>
 | 
			
		||||
                                        <option value="Last 7 days">Last 7 days</option>
 | 
			
		||||
                                        <option value="For all time">For all time</option>
 | 
			
		||||
                                        <option value="custom_date_requested">from date to date</option>
 | 
			
		||||
                                        <option value="Today" {% if date_requested == "Today" %}selected{% endif %}>Today</option>
 | 
			
		||||
                                        <option value="Last 7 days" {% if date_requested == "Last 7 days" %}selected{% endif %}>Last 7 days</option>
 | 
			
		||||
                                        <option value="For all time" {% if date_requested == "For all time" %}selected{% endif %}>For all time</option>
 | 
			
		||||
                                        <option value="custom_date_requested" {% if date_requested == "custom_date_requested" %}selected{% endif %}>from date to date</option>
 | 
			
		||||
                                        
 | 
			
		||||
                                    </select>
 | 
			
		||||
                                    <div id="date-requested-range-wrapper" class="p-5 grid grid-cols-12 gap-4 row-gap-3 mt-4" style="display: none;">
 | 
			
		||||
                                        <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                            <label>From</label>
 | 
			
		||||
                                            <input type="date" id="date-requested-from" class="input w-full border mt-2" name="date_requested_from">
 | 
			
		||||
                                             <input 
 | 
			
		||||
                                                type="date" 
 | 
			
		||||
                                                id="date-requested-from" 
 | 
			
		||||
                                                class="input w-full border mt-2" 
 | 
			
		||||
                                                name="date_requested_from" 
 | 
			
		||||
                                                value="{{ date_requested_from if date_requested_from else '' }}"
 | 
			
		||||
                                            >
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                        <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                            <label>To</label>
 | 
			
		||||
                                            <input type="date" id="date-requested-to" class="input w-full border mt-2" name="date_requested_to">
 | 
			
		||||
                                             <input 
 | 
			
		||||
                                                type="date" 
 | 
			
		||||
                                                id="date-requested-to" 
 | 
			
		||||
                                                class="input w-full border mt-2" 
 | 
			
		||||
                                                name="date_requested_to" 
 | 
			
		||||
                                                value="{{ date_requested_to if date_requested_to else '' }}"
 | 
			
		||||
                                            >
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                    </div>
 | 
			
		||||
                                </div>
 | 
			
		||||
| 
						 | 
				
			
			@ -75,15 +88,32 @@
 | 
			
		|||
                                        <option value="Last 7 days">Last 7 days</option>
 | 
			
		||||
                                        <option value="For all time">For all time</option>
 | 
			
		||||
                                        <option value="custom_date_posted">from date to date</option>
 | 
			
		||||
                                        <option value="Today" {% if date_posted == "Today" %}selected{% endif %}>Today</option>
 | 
			
		||||
                                        <option value="Last 7 days" {% if date_posted == "Last 7 days" %}selected{% endif %}>Last 7 days</option>
 | 
			
		||||
                                        <option value="For all time" {% if date_posted == "For all time" %}selected{% endif %}>For all time</option>
 | 
			
		||||
                                        <option value="custom_date_posted" {% if date_posted == "custom_date_posted" %}selected{% endif %}>from date to date</option>
 | 
			
		||||
                                    </select>
 | 
			
		||||
                                    <div id="date-posted-range-wrapper" class="p-5 grid grid-cols-12 gap-4 row-gap-3 mt-4" style="display: none;">
 | 
			
		||||
                                        <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                            <label>From</label>
 | 
			
		||||
                                            <input type="date" id="date-posted-from" class="input w-full border mt-2" name="date_posted_from">
 | 
			
		||||
                                           
 | 
			
		||||
                                            <input 
 | 
			
		||||
                                                type="date" 
 | 
			
		||||
                                                id="date-posted-from" 
 | 
			
		||||
                                                class="input w-full border mt-2" 
 | 
			
		||||
                                                name="date_posted_from" 
 | 
			
		||||
                                                value="{{ date_posted_from if date_posted_from else '' }}"
 | 
			
		||||
                                            >
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                        <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                            <label>To</label>
 | 
			
		||||
                                            <input type="date" id="date-posted-to" class="input w-full border mt-2" name="date_posted_to">
 | 
			
		||||
                                             <input 
 | 
			
		||||
                                                type="date" 
 | 
			
		||||
                                                id="date-posted-to" 
 | 
			
		||||
                                                class="input w-full border mt-2" 
 | 
			
		||||
                                                name="date_posted_to" 
 | 
			
		||||
                                                value="{{ date_posted_to if date_posted_to else '' }}"
 | 
			
		||||
                                            >
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                    </div>
 | 
			
		||||
                                </div>
 | 
			
		||||
| 
						 | 
				
			
			@ -94,19 +124,31 @@
 | 
			
		|||
                                <div class="text-xs">Applied on</div>
 | 
			
		||||
                                <select id="date_applied" class="input w-full border mt-2 flex-1" name="date_applied">
 | 
			
		||||
                                    <option value=""></option>
 | 
			
		||||
                                    <option value="Today">Today</option>
 | 
			
		||||
                                    <option value="Last 7 days">Last 7 days</option>
 | 
			
		||||
                                    <option value="For all time">For all time</option>
 | 
			
		||||
                                    <option value="custom_date_applied">from date to date</option>
 | 
			
		||||
                                    <option value="Today" {% if date_applied == "Today" %}selected{% endif %}>Today</option>
 | 
			
		||||
                                    <option value="Last 7 days" {% if date_applied == "Last 7 days" %}selected{% endif %}>Last 7 days</option>
 | 
			
		||||
                                    <option value="For all time" {% if date_applied == "For all time" %}selected{% endif %}>For all time</option>
 | 
			
		||||
                                    <option value="custom_date_applied" {% if date_applied == "custom_date_applied" %}selected{% endif %}>from date to date</option>
 | 
			
		||||
                                </select>
 | 
			
		||||
                                <div id="date-applied-range-wrapper" class="p-5 grid grid-cols-12 gap-4 row-gap-3 mt-4" style="display: none;">
 | 
			
		||||
                                    <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                        <label>From</label>
 | 
			
		||||
                                        <input type="date" id="date-applied-from" class="input w-full border mt-2" name="date_applied_from">
 | 
			
		||||
                                        <input 
 | 
			
		||||
                                            type="date" 
 | 
			
		||||
                                            id="date-applied-from" 
 | 
			
		||||
                                            class="input w-full border mt-2" 
 | 
			
		||||
                                            name="date_applied_from" 
 | 
			
		||||
                                            value="{{ date_applied_from if date_applied_from else '' }}"
 | 
			
		||||
                                        >
 | 
			
		||||
                                    </div>
 | 
			
		||||
                                    <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                        <label>To</label>
 | 
			
		||||
                                        <input type="date" id="date-applied-to" class="input w-full border mt-2" name="date_applied_to">
 | 
			
		||||
                                         <input 
 | 
			
		||||
                                            type="date" 
 | 
			
		||||
                                            id="date-applied-to" 
 | 
			
		||||
                                            class="input w-full border mt-2" 
 | 
			
		||||
                                            name="date_applied_to" 
 | 
			
		||||
                                            value="{{ date_applied_to if date_applied_to else '' }}"
 | 
			
		||||
                                        >
 | 
			
		||||
                                    </div>
 | 
			
		||||
                                </div>
 | 
			
		||||
                            </div>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,161 +27,7 @@
 | 
			
		|||
  }
 | 
			
		||||
</style>
 | 
			
		||||
                
 | 
			
		||||
<div class="p-5" id="boxed-accordion">
 | 
			
		||||
    <div class="preview">
 | 
			
		||||
        <div class="accordion">
 | 
			
		||||
            <div class="accordion__pane border border-gray-200 p-4 mt-3">
 | 
			
		||||
                <a href="javascript:;" class="accordion__pane__toggle filter-link font-medium block">Filter</a>
 | 
			
		||||
 | 
			
		||||
                <div class="accordion__pane__content mt-3 text-gray-800 leading-relaxed">
 | 
			
		||||
                    <div class="dropdown-box__content box p-5">
 | 
			
		||||
                        <form method="POST" action="/productf">
 | 
			
		||||
                            <!-- Дата-фильтры (Requested, Posted, Applied) -->
 | 
			
		||||
                            <div class="flex gap-4">
 | 
			
		||||
                                <!-- Requested on -->
 | 
			
		||||
                                <div class="w-1/2">
 | 
			
		||||
                                    <div class="text-xs">Requested on</div>
 | 
			
		||||
                                    <select id="date_requested" class="input w-full border mt-2 flex-1" name="date_requested">
 | 
			
		||||
                                        <option value=""></option>
 | 
			
		||||
                                        <option value="Today">Today</option>
 | 
			
		||||
                                        <option value="Last 7 days">Last 7 days</option>
 | 
			
		||||
                                        <option value="For all time">For all time</option>
 | 
			
		||||
                                        <option value="custom_date_requested">from date to date</option>
 | 
			
		||||
                                    </select>
 | 
			
		||||
                                    <div id="date-requested-range-wrapper" class="p-5 grid grid-cols-12 gap-4 row-gap-3 mt-4" style="display: none;">
 | 
			
		||||
                                        <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                            <label>From</label>
 | 
			
		||||
                                            <input type="date" id="date-requested-from" class="input w-full border mt-2" name="date_requested_from">
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                        <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                            <label>To</label>
 | 
			
		||||
                                            <input type="date" id="date-requested-to" class="input w-full border mt-2" name="date_requested_to">
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                    </div>
 | 
			
		||||
                                </div>
 | 
			
		||||
 | 
			
		||||
                                <!-- Posted on -->
 | 
			
		||||
                                <div class="w-1/2">
 | 
			
		||||
                                    <div class="text-xs">Posted on</div>
 | 
			
		||||
                                    <select id="date_posted" class="input w-full border mt-2 flex-1" name="date_posted">
 | 
			
		||||
                                        <option value=""></option>
 | 
			
		||||
                                        <option value="Today">Today</option>
 | 
			
		||||
                                        <option value="Last 7 days">Last 7 days</option>
 | 
			
		||||
                                        <option value="For all time">For all time</option>
 | 
			
		||||
                                        <option value="custom_date_posted">from date to date</option>
 | 
			
		||||
                                    </select>
 | 
			
		||||
                                    <div id="date-posted-range-wrapper" class="p-5 grid grid-cols-12 gap-4 row-gap-3 mt-4" style="display: none;">
 | 
			
		||||
                                        <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                            <label>From</label>
 | 
			
		||||
                                            <input type="date" id="date-posted-from" class="input w-full border mt-2" name="date_posted_from">
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                        <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                            <label>To</label>
 | 
			
		||||
                                            <input type="date" id="date-posted-to" class="input w-full border mt-2" name="date_posted_to">
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                    </div>
 | 
			
		||||
                                </div>
 | 
			
		||||
                            </div>
 | 
			
		||||
 | 
			
		||||
                            <!-- Applied on -->
 | 
			
		||||
                            <div class="col-span-6 mt-4">
 | 
			
		||||
                                <div class="text-xs">Applied on</div>
 | 
			
		||||
                                <select id="date_applied" class="input w-full border mt-2 flex-1" name="date_applied">
 | 
			
		||||
                                    <option value=""></option>
 | 
			
		||||
                                    <option value="Today">Today</option>
 | 
			
		||||
                                    <option value="Last 7 days">Last 7 days</option>
 | 
			
		||||
                                    <option value="For all time">For all time</option>
 | 
			
		||||
                                    <option value="custom_date_applied">from date to date</option>
 | 
			
		||||
                                </select>
 | 
			
		||||
                                <div id="date-applied-range-wrapper" class="p-5 grid grid-cols-12 gap-4 row-gap-3 mt-4" style="display: none;">
 | 
			
		||||
                                    <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                        <label>From</label>
 | 
			
		||||
                                        <input type="date" id="date-applied-from" class="input w-full border mt-2" name="date_applied_from">
 | 
			
		||||
                                    </div>
 | 
			
		||||
                                    <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                        <label>To</label>
 | 
			
		||||
                                        <input type="date" id="date-applied-to" class="input w-full border mt-2" name="date_applied_to">
 | 
			
		||||
                                    </div>
 | 
			
		||||
                                </div>
 | 
			
		||||
                            </div>
 | 
			
		||||
 | 
			
		||||
                           <div class="flex flex-nowrap gap-4 mt-4">  <!-- flex-nowrap запрещает перенос на новую строку -->
 | 
			
		||||
    <!-- Clients (50% ширины) -->
 | 
			
		||||
    <div class="flex-1 min-w-0">  <!-- flex-1 + min-w-0 предотвращает "расползание" -->
 | 
			
		||||
        <label class="block mb-1 text-sm">Clients</label>
 | 
			
		||||
        <select id="clients-multiselect1" class="select2 w-full" multiple="multiple" data-placeholder="Select Clients" name="client">
 | 
			
		||||
            {% set seen_ids = [] %}
 | 
			
		||||
            {% for job in jobs %}
 | 
			
		||||
                {% if job.client.id not in seen_ids %}
 | 
			
		||||
                    <option value="{{ job.client.id }}">{{ job.client.user_nicename }}</option>
 | 
			
		||||
                    {% set _ = seen_ids.append(job.client.id) %}
 | 
			
		||||
                {% endif %}
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </select>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <!-- Assignee (50% ширины) -->
 | 
			
		||||
    <div class="flex-1 min-w-0">  <!-- flex-1 дает равную ширину -->
 | 
			
		||||
        <label class="block mb-1 text-sm">Assignee</label>
 | 
			
		||||
        <select id="assignee-multiselect" class="select2 w-full" multiple="multiple" data-placeholder="Select Assignee" name="assignee">
 | 
			
		||||
            <option value="">— Not selected —</option>
 | 
			
		||||
            {% for user in users %}
 | 
			
		||||
                <option value="{{ user.id }}" {% if user.id in assigned_users_ids %}selected{% endif %}>{{ user.username }}</option>
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </select>
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
                            <!-- Status и кнопка Apply Filters -->
 | 
			
		||||
                            <div class="col-span-6 mt-4">
 | 
			
		||||
                                <label>Status</label>
 | 
			
		||||
                                <div class="mt-2">
 | 
			
		||||
                                    <select data-placeholder="Select Status" class="select2 w-full" multiple name="status">
 | 
			
		||||
                                        <option value="Scheduled">Scheduled</option>
 | 
			
		||||
                                        <option value="Requested">Requested</option>
 | 
			
		||||
                                        <option value="In-Progress">In-Progress</option>
 | 
			
		||||
                                        <option value="Applied">Applied</option>
 | 
			
		||||
                                        <option value="Issues Applying">Issues Applying</option>
 | 
			
		||||
                                        <option value="Cancelled">Cancelled</option>
 | 
			
		||||
                                    </select>
 | 
			
		||||
                                </div>
 | 
			
		||||
                                <button type="submit" class="button bg-theme-1 text-white mt-5">Apply Filters</button>
 | 
			
		||||
                            </div>
 | 
			
		||||
                        </form>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
// Функция для настройки обработчиков событий для каждого селекта
 | 
			
		||||
function setupDateSelect(selectId, wrapperId, customValue) {
 | 
			
		||||
    const select = document.getElementById(selectId);
 | 
			
		||||
    const dateRangeWrapper = document.getElementById(wrapperId);
 | 
			
		||||
 | 
			
		||||
    select.addEventListener('change', function() {
 | 
			
		||||
        if (this.value === customValue) {
 | 
			
		||||
            dateRangeWrapper.style.display = 'grid';
 | 
			
		||||
        } else {
 | 
			
		||||
            dateRangeWrapper.style.display = 'none';
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // Инициализация при загрузке страницы
 | 
			
		||||
    if (select.value === customValue) {
 | 
			
		||||
        dateRangeWrapper.style.display = 'grid';
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Настройка всех трех селектов
 | 
			
		||||
document.addEventListener('DOMContentLoaded', function() {
 | 
			
		||||
    setupDateSelect('date_requested', 'date-requested-range-wrapper', 'custom_date_requested');
 | 
			
		||||
    setupDateSelect('date_posted', 'date-posted-range-wrapper', 'custom_date_posted');
 | 
			
		||||
    setupDateSelect('date_applied', 'date-applied-range-wrapper', 'custom_date_applied');
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
    {% include "filtr.html" %}
 | 
			
		||||
                <!-- BEGIN: Datatable -->
 | 
			
		||||
                <div class="intro-y datatable-wrapper box p-5 mt-5">
 | 
			
		||||
                    <table class="table table-report table-report--bordered display datatable w-full">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,110 +29,7 @@
 | 
			
		|||
 | 
			
		||||
                
 | 
			
		||||
                
 | 
			
		||||
<div class="p-5" id="boxed-accordion">
 | 
			
		||||
    <div class="preview">
 | 
			
		||||
        <div class="accordion">
 | 
			
		||||
            <div class="accordion__pane border border-gray-200 p-4 mt-3">
 | 
			
		||||
                <a href="javascript:;" class="accordion__pane__toggle filter-link font-medium block">Filter</a>
 | 
			
		||||
 | 
			
		||||
                <div class="accordion__pane__content mt-3 text-gray-800 leading-relaxed">
 | 
			
		||||
                    <div class="dropdown-box__content box p-5">
 | 
			
		||||
                        <form method="POST" action="/productf">
 | 
			
		||||
                            <!-- Дата-фильтры (Requested, Posted, Applied) -->
 | 
			
		||||
                            <div class="flex gap-4">
 | 
			
		||||
                                <!-- Requested on -->
 | 
			
		||||
                                <div class="w-1/2">
 | 
			
		||||
                                    <div class="text-xs">Requested on</div>
 | 
			
		||||
                                    <select id="date_requested" class="input w-full border mt-2 flex-1" name="date_requested">
 | 
			
		||||
                                        <option value=""></option>
 | 
			
		||||
                                        <option value="Today">Today</option>
 | 
			
		||||
                                        <option value="Last 7 days">Last 7 days</option>
 | 
			
		||||
                                        <option value="For all time">For all time</option>
 | 
			
		||||
                                        <option value="custom_date_requested">from date to date</option>
 | 
			
		||||
                                    </select>
 | 
			
		||||
                                    <div id="date-requested-range-wrapper" class="p-5 grid grid-cols-12 gap-4 row-gap-3 mt-4" style="display: none;">
 | 
			
		||||
                                        <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                            <label>From</label>
 | 
			
		||||
                                            <input type="date" id="date-requested-from" class="input w-full border mt-2" name="date_requested_from">
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                        <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                            <label>To</label>
 | 
			
		||||
                                            <input type="date" id="date-requested-to" class="input w-full border mt-2" name="date_requested_to">
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                    </div>
 | 
			
		||||
                                </div>
 | 
			
		||||
 | 
			
		||||
                                <!-- Posted on -->
 | 
			
		||||
                                <div class="w-1/2">
 | 
			
		||||
                                    <div class="text-xs">Posted on</div>
 | 
			
		||||
                                    <select id="date_posted" class="input w-full border mt-2 flex-1" name="date_posted">
 | 
			
		||||
                                        <option value=""></option>
 | 
			
		||||
                                        <option value="Today">Today</option>
 | 
			
		||||
                                        <option value="Last 7 days">Last 7 days</option>
 | 
			
		||||
                                        <option value="For all time">For all time</option>
 | 
			
		||||
                                        <option value="custom_date_posted">from date to date</option>
 | 
			
		||||
                                    </select>
 | 
			
		||||
                                    <div id="date-posted-range-wrapper" class="p-5 grid grid-cols-12 gap-4 row-gap-3 mt-4" style="display: none;">
 | 
			
		||||
                                        <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                            <label>From</label>
 | 
			
		||||
                                            <input type="date" id="date-posted-from" class="input w-full border mt-2" name="date_posted_from">
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                        <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                            <label>To</label>
 | 
			
		||||
                                            <input type="date" id="date-posted-to" class="input w-full border mt-2" name="date_posted_to">
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                    </div>
 | 
			
		||||
                                </div>
 | 
			
		||||
                            </div>
 | 
			
		||||
 | 
			
		||||
                            <!-- Applied on -->
 | 
			
		||||
                            <div class="col-span-6 mt-4">
 | 
			
		||||
                                <div class="text-xs">Applied on</div>
 | 
			
		||||
                                <select id="date_applied" class="input w-full border mt-2 flex-1" name="date_applied">
 | 
			
		||||
                                    <option value=""></option>
 | 
			
		||||
                                    <option value="Today">Today</option>
 | 
			
		||||
                                    <option value="Last 7 days">Last 7 days</option>
 | 
			
		||||
                                    <option value="For all time">For all time</option>
 | 
			
		||||
                                    <option value="custom_date_applied">from date to date</option>
 | 
			
		||||
                                </select>
 | 
			
		||||
                                <div id="date-applied-range-wrapper" class="p-5 grid grid-cols-12 gap-4 row-gap-3 mt-4" style="display: none;">
 | 
			
		||||
                                    <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                        <label>From</label>
 | 
			
		||||
                                        <input type="date" id="date-applied-from" class="input w-full border mt-2" name="date_applied_from">
 | 
			
		||||
                                    </div>
 | 
			
		||||
                                    <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                        <label>To</label>
 | 
			
		||||
                                        <input type="date" id="date-applied-to" class="input w-full border mt-2" name="date_applied_to">
 | 
			
		||||
                                    </div>
 | 
			
		||||
                                </div>
 | 
			
		||||
                            </div>
 | 
			
		||||
 | 
			
		||||
                           <div class="flex flex-nowrap gap-4 mt-4">  <!-- flex-nowrap запрещает перенос на новую строку -->
 | 
			
		||||
    <!-- Clients (50% ширины) -->
 | 
			
		||||
    <div class="flex-1 min-w-0">  <!-- flex-1 + min-w-0 предотвращает "расползание" -->
 | 
			
		||||
        <label class="block mb-1 text-sm">Clients</label>
 | 
			
		||||
        <select id="clients-multiselect1" class="select2 w-full" multiple="multiple" data-placeholder="Select Clients" name="client">
 | 
			
		||||
            {% set seen_ids = [] %}
 | 
			
		||||
            {% for job in jobs %}
 | 
			
		||||
                {% if job.client.id not in seen_ids %}
 | 
			
		||||
                    <option value="{{ job.client.id }}">{{ job.client.user_nicename }}</option>
 | 
			
		||||
                    {% set _ = seen_ids.append(job.client.id) %}
 | 
			
		||||
                {% endif %}
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </select>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <!-- Assignee (50% ширины) -->
 | 
			
		||||
    <div class="flex-1 min-w-0">  <!-- flex-1 дает равную ширину -->
 | 
			
		||||
        <label class="block mb-1 text-sm">Assignee</label>
 | 
			
		||||
        <select id="assignee-multiselect" class="select2 w-full" multiple="multiple" data-placeholder="Select Assignee" name="assignee">
 | 
			
		||||
            <option value="">— Not selected —</option>
 | 
			
		||||
            {% for user in users %}
 | 
			
		||||
                <option value="{{ user.id }}" {% if user.id in assigned_users_ids %}selected{% endif %}>{{ user.username }}</option>
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </select>
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
    {% include "filtr.html" %}
 | 
			
		||||
 | 
			
		||||
                            <!-- Status и кнопка Apply Filters -->
 | 
			
		||||
                            <div class="col-span-6 mt-4">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,161 +29,7 @@
 | 
			
		|||
</style>
 | 
			
		||||
 
 | 
			
		||||
                
 | 
			
		||||
<div class="p-5" id="boxed-accordion">
 | 
			
		||||
    <div class="preview">
 | 
			
		||||
        <div class="accordion">
 | 
			
		||||
            <div class="accordion__pane border border-gray-200 p-4 mt-3">
 | 
			
		||||
                <a href="javascript:;" class="accordion__pane__toggle filter-link font-medium block">Filter</a>
 | 
			
		||||
 | 
			
		||||
                <div class="accordion__pane__content mt-3 text-gray-800 leading-relaxed">
 | 
			
		||||
                    <div class="dropdown-box__content box p-5">
 | 
			
		||||
                        <form method="POST" action="/productf">
 | 
			
		||||
                            <!-- Дата-фильтры (Requested, Posted, Applied) -->
 | 
			
		||||
                            <div class="flex gap-4">
 | 
			
		||||
                                <!-- Requested on -->
 | 
			
		||||
                                <div class="w-1/2">
 | 
			
		||||
                                    <div class="text-xs">Requested on</div>
 | 
			
		||||
                                    <select id="date_requested" class="input w-full border mt-2 flex-1" name="date_requested">
 | 
			
		||||
                                        <option value=""></option>
 | 
			
		||||
                                        <option value="Today">Today</option>
 | 
			
		||||
                                        <option value="Last 7 days">Last 7 days</option>
 | 
			
		||||
                                        <option value="For all time">For all time</option>
 | 
			
		||||
                                        <option value="custom_date_requested">from date to date</option>
 | 
			
		||||
                                    </select>
 | 
			
		||||
                                    <div id="date-requested-range-wrapper" class="p-5 grid grid-cols-12 gap-4 row-gap-3 mt-4" style="display: none;">
 | 
			
		||||
                                        <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                            <label>From</label>
 | 
			
		||||
                                            <input type="date" id="date-requested-from" class="input w-full border mt-2" name="date_requested_from">
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                        <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                            <label>To</label>
 | 
			
		||||
                                            <input type="date" id="date-requested-to" class="input w-full border mt-2" name="date_requested_to">
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                    </div>
 | 
			
		||||
                                </div>
 | 
			
		||||
 | 
			
		||||
                                <!-- Posted on -->
 | 
			
		||||
                                <div class="w-1/2">
 | 
			
		||||
                                    <div class="text-xs">Posted on</div>
 | 
			
		||||
                                    <select id="date_posted" class="input w-full border mt-2 flex-1" name="date_posted">
 | 
			
		||||
                                        <option value=""></option>
 | 
			
		||||
                                        <option value="Today">Today</option>
 | 
			
		||||
                                        <option value="Last 7 days">Last 7 days</option>
 | 
			
		||||
                                        <option value="For all time">For all time</option>
 | 
			
		||||
                                        <option value="custom_date_posted">from date to date</option>
 | 
			
		||||
                                    </select>
 | 
			
		||||
                                    <div id="date-posted-range-wrapper" class="p-5 grid grid-cols-12 gap-4 row-gap-3 mt-4" style="display: none;">
 | 
			
		||||
                                        <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                            <label>From</label>
 | 
			
		||||
                                            <input type="date" id="date-posted-from" class="input w-full border mt-2" name="date_posted_from">
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                        <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                            <label>To</label>
 | 
			
		||||
                                            <input type="date" id="date-posted-to" class="input w-full border mt-2" name="date_posted_to">
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                    </div>
 | 
			
		||||
                                </div>
 | 
			
		||||
                            </div>
 | 
			
		||||
 | 
			
		||||
                            <!-- Applied on -->
 | 
			
		||||
                            <div class="col-span-6 mt-4">
 | 
			
		||||
                                <div class="text-xs">Applied on</div>
 | 
			
		||||
                                <select id="date_applied" class="input w-full border mt-2 flex-1" name="date_applied">
 | 
			
		||||
                                    <option value=""></option>
 | 
			
		||||
                                    <option value="Today">Today</option>
 | 
			
		||||
                                    <option value="Last 7 days">Last 7 days</option>
 | 
			
		||||
                                    <option value="For all time">For all time</option>
 | 
			
		||||
                                    <option value="custom_date_applied">from date to date</option>
 | 
			
		||||
                                </select>
 | 
			
		||||
                                <div id="date-applied-range-wrapper" class="p-5 grid grid-cols-12 gap-4 row-gap-3 mt-4" style="display: none;">
 | 
			
		||||
                                    <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                        <label>From</label>
 | 
			
		||||
                                        <input type="date" id="date-applied-from" class="input w-full border mt-2" name="date_applied_from">
 | 
			
		||||
                                    </div>
 | 
			
		||||
                                    <div class="col-span-12 sm:col-span-6">
 | 
			
		||||
                                        <label>To</label>
 | 
			
		||||
                                        <input type="date" id="date-applied-to" class="input w-full border mt-2" name="date_applied_to">
 | 
			
		||||
                                    </div>
 | 
			
		||||
                                </div>
 | 
			
		||||
                            </div>
 | 
			
		||||
 | 
			
		||||
                           <div class="flex flex-nowrap gap-4 mt-4">  <!-- flex-nowrap запрещает перенос на новую строку -->
 | 
			
		||||
    <!-- Clients (50% ширины) -->
 | 
			
		||||
    <div class="flex-1 min-w-0">  <!-- flex-1 + min-w-0 предотвращает "расползание" -->
 | 
			
		||||
        <label class="block mb-1 text-sm">Clients</label>
 | 
			
		||||
        <select id="clients-multiselect1" class="select2 w-full" multiple="multiple" data-placeholder="Select Clients" name="client">
 | 
			
		||||
            {% set seen_ids = [] %}
 | 
			
		||||
            {% for job in jobs %}
 | 
			
		||||
                {% if job.client.id not in seen_ids %}
 | 
			
		||||
                    <option value="{{ job.client.id }}">{{ job.client.user_nicename }}</option>
 | 
			
		||||
                    {% set _ = seen_ids.append(job.client.id) %}
 | 
			
		||||
                {% endif %}
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </select>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <!-- Assignee (50% ширины) -->
 | 
			
		||||
    <div class="flex-1 min-w-0">  <!-- flex-1 дает равную ширину -->
 | 
			
		||||
        <label class="block mb-1 text-sm">Assignee</label>
 | 
			
		||||
        <select id="assignee-multiselect" class="select2 w-full" multiple="multiple" data-placeholder="Select Assignee" name="assignee">
 | 
			
		||||
            <option value="">— Not selected —</option>
 | 
			
		||||
            {% for user in users %}
 | 
			
		||||
                <option value="{{ user.id }}" {% if user.id in assigned_users_ids %}selected{% endif %}>{{ user.username }}</option>
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </select>
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
                            <!-- Status и кнопка Apply Filters -->
 | 
			
		||||
                            <div class="col-span-6 mt-4">
 | 
			
		||||
                                <label>Status</label>
 | 
			
		||||
                                <div class="mt-2">
 | 
			
		||||
                                    <select data-placeholder="Select Status" class="select2 w-full" multiple name="status">
 | 
			
		||||
                                        <option value="Scheduled">Scheduled</option>
 | 
			
		||||
                                        <option value="Requested">Requested</option>
 | 
			
		||||
                                        <option value="In-Progress">In-Progress</option>
 | 
			
		||||
                                        <option value="Applied">Applied</option>
 | 
			
		||||
                                        <option value="Issues Applying">Issues Applying</option>
 | 
			
		||||
                                        <option value="Cancelled">Cancelled</option>
 | 
			
		||||
                                    </select>
 | 
			
		||||
                                </div>
 | 
			
		||||
                                <button type="submit" class="button bg-theme-1 text-white mt-5">Apply Filters</button>
 | 
			
		||||
                            </div>
 | 
			
		||||
                        </form>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
// Функция для настройки обработчиков событий для каждого селекта
 | 
			
		||||
function setupDateSelect(selectId, wrapperId, customValue) {
 | 
			
		||||
    const select = document.getElementById(selectId);
 | 
			
		||||
    const dateRangeWrapper = document.getElementById(wrapperId);
 | 
			
		||||
 | 
			
		||||
    select.addEventListener('change', function() {
 | 
			
		||||
        if (this.value === customValue) {
 | 
			
		||||
            dateRangeWrapper.style.display = 'grid';
 | 
			
		||||
        } else {
 | 
			
		||||
            dateRangeWrapper.style.display = 'none';
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // Инициализация при загрузке страницы
 | 
			
		||||
    if (select.value === customValue) {
 | 
			
		||||
        dateRangeWrapper.style.display = 'grid';
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Настройка всех трех селектов
 | 
			
		||||
document.addEventListener('DOMContentLoaded', function() {
 | 
			
		||||
    setupDateSelect('date_requested', 'date-requested-range-wrapper', 'custom_date_requested');
 | 
			
		||||
    setupDateSelect('date_posted', 'date-posted-range-wrapper', 'custom_date_posted');
 | 
			
		||||
    setupDateSelect('date_applied', 'date-applied-range-wrapper', 'custom_date_applied');
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
    {% include "filtr.html" %}
 | 
			
		||||
                <!-- BEGIN: Datatable -->
 | 
			
		||||
                <div class="intro-y datatable-wrapper box p-5 mt-5">
 | 
			
		||||
                    <table class="table table-report table-report--bordered display datatable w-full">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,28 +27,34 @@
 | 
			
		|||
</form>-->
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<div class="intro-y box">
 | 
			
		||||
<h2 class="text-lg font-medium mr-auto">Add Users</h2>
 | 
			
		||||
 | 
			
		||||
<form action="/users/create" method="post">
 | 
			
		||||
 <div class="mt-3"> <label>Username</label> <input type="text" class="input w-full border mt-2" name="username" placeholder="username"> </div>
 | 
			
		||||
 <div class="mt-3"> <label>Password</label> <input type="password"   name="password"class="input w-full border mt-2" placeholder="secret"> </div>
 | 
			
		||||
 | 
			
		||||
 <label>Role:</label>
 | 
			
		||||
    <div class="sm:mt-2"> <select class="input input--sm border mr-2" name="role">
 | 
			
		||||
        <option value="user">Users</option>
 | 
			
		||||
        <option value="admin">Admin</option>
 | 
			
		||||
    </select></div>
 | 
			
		||||
 
 | 
			
		||||
 <button type="submit" class="button bg-theme-1 text-white mt-5">Register</button>
 | 
			
		||||
</form> 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<div class="overflow-y-auto mt-3">
 | 
			
		||||
 | 
			
		||||
<div class="intro-y box p-5">
 | 
			
		||||
    <h2 class="text-lg font-medium mr-auto">Add Users</h2>
 | 
			
		||||
    <div class="overflow-x-auto mt-5">
 | 
			
		||||
        <form action="/users/create" method="post">
 | 
			
		||||
            <div class="mt-3">
 | 
			
		||||
                <label class="block">Login</label>
 | 
			
		||||
                <input type="text" class="input w-full border mt-2" name="username" placeholder="username">
 | 
			
		||||
            </div>
 | 
			
		||||
            
 | 
			
		||||
            <div class="mt-3">
 | 
			
		||||
                <label class="block">Password</label>
 | 
			
		||||
                <input type="password" class="input w-full border mt-2" name="password" placeholder="secret">
 | 
			
		||||
            </div>
 | 
			
		||||
            
 | 
			
		||||
            <div class="mt-3">
 | 
			
		||||
                <label class="block">Role:</label>
 | 
			
		||||
                <select class="input w-full border mt-2" name="role">
 | 
			
		||||
                    <option value="user">User</option>
 | 
			
		||||
                    <option value="admin">Admin</option>
 | 
			
		||||
                </select>
 | 
			
		||||
            </div>
 | 
			
		||||
            
 | 
			
		||||
            <div class="mt-5">
 | 
			
		||||
                <button type="submit" class="button bg-theme-1 text-white w-full">Register</button>
 | 
			
		||||
            </div>
 | 
			
		||||
        </form>
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<div class="intro-y box mt-5">
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,46 @@
 | 
			
		|||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
    <!-- BEGIN: Head -->
 | 
			
		||||
    <head>
 | 
			
		||||
        <meta charset="utf-8">
 | 
			
		||||
        <link href="dist/images/logo.svg" rel="shortcut icon">
 | 
			
		||||
        <meta name="viewport" content="width=device-width, initial-scale=1">
 | 
			
		||||
        <meta name="description" content="Midone admin is super flexible, powerful, clean & modern responsive tailwind admin template with unlimited possibilities.">
 | 
			
		||||
        <meta name="keywords" content="admin template, Midone admin template, dashboard template, flat admin template, responsive admin template, web app">
 | 
			
		||||
        <meta name="author" content="LEFT4CODE">
 | 
			
		||||
        <title>Error Page - Midone - Tailwind HTML Admin Template</title>
 | 
			
		||||
        <!-- BEGIN: CSS Assets-->
 | 
			
		||||
        
 | 
			
		||||
        <link rel="stylesheet" href="/static/dist/css/app.css" />
 | 
			
		||||
        <!-- END: CSS Assets-->
 | 
			
		||||
    </head>
 | 
			
		||||
    <!-- END: Head -->
 | 
			
		||||
    <body class="app">
 | 
			
		||||
        <div class="container">
 | 
			
		||||
            <!-- BEGIN: Error Page -->
 | 
			
		||||
            <div class="error-page flex flex-col lg:flex-row items-center justify-center h-screen text-center lg:text-left">
 | 
			
		||||
                <div class="-intro-x lg:mr-20">
 | 
			
		||||
                    <img alt="Midone Tailwind HTML Admin Template" class="h-48 lg:h-auto" src="/static/dist/images/error-illustration.svg">
 | 
			
		||||
                </div>
 | 
			
		||||
                <div class="text-white mt-10 lg:mt-0">
 | 
			
		||||
                    <div class="intro-x text-6xl font-medium">404</div>
 | 
			
		||||
                    <div class="intro-x text-xl lg:text-3xl font-medium">Oops. This page has gone missing.</div>
 | 
			
		||||
                    <div class="intro-x text-lg mt-3">You may have mistyped the address or the page may have moved.</div>
 | 
			
		||||
                </br>
 | 
			
		||||
                    <a class="intro-x button button--lg border border-white mt-10" href="/product">Back to Home</a>
 | 
			
		||||
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <!-- END: Error Page -->
 | 
			
		||||
        </div>
 | 
			
		||||
        <!-- BEGIN: JS Assets-->
 | 
			
		||||
        <script src="https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/markerclusterer.js"></script>
 | 
			
		||||
        <script src="https://maps.googleapis.com/maps/api/js?key=["your-google-map-api"]&libraries=places"></script>
 | 
			
		||||
        <script src="/static/dist/js/app.js"></script>
 | 
			
		||||
        <!-- END: JS Assets-->
 | 
			
		||||
    </body>
 | 
			
		||||
</html>
 | 
			
		||||
<!--<html>
 | 
			
		||||
<head>
 | 
			
		||||
    <title>В работе</title>
 | 
			
		||||
</head>
 | 
			
		||||
| 
						 | 
				
			
			@ -7,4 +48,5 @@
 | 
			
		|||
    <h2>Страница в работе...</h2>
 | 
			
		||||
    <a href="/">Вернуться на главную</a>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
</html>-->
 | 
			
		||||
    
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue