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 or_, and_, select
|
||||||
|
|
||||||
from sqlalchemy import null
|
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 routers.auth import get_current_user
|
||||||
from model.database import get_async_session, Job, Client, AppliedJob, User
|
from model.database import get_async_session, Job, Client, AppliedJob, User
|
||||||
|
@ -265,18 +266,26 @@ async def product_filtered(
|
||||||
|
|
||||||
# Добавляем условия фильтрации
|
# Добавляем условия фильтрации
|
||||||
conditions = []
|
conditions = []
|
||||||
|
# http://127.0.0.1:8120/product
|
||||||
# Фильтр по дате requested
|
# Фильтр по дате requested
|
||||||
if date_requested == 'custom_date_requested' and date_requested_from and date_requested_to:
|
if date_requested == 'custom_date_requested' and date_requested_from and date_requested_to:
|
||||||
start = datetime.strptime(date_requested_from, '%Y-%m-%d')
|
start = datetime.strptime(date_requested_from, '%Y-%m-%d')
|
||||||
end = datetime.strptime(date_requested_to, '%Y-%m-%d')
|
end = datetime.strptime(date_requested_to, '%Y-%m-%d')
|
||||||
conditions.append(Job.data_requested.between(start, end))
|
conditions.append(Job.data_requested.between(start, end))
|
||||||
elif date_requested == 'Today':
|
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':
|
elif date_requested == 'Yesterday':
|
||||||
conditions.append(func.date(Job.data_requested) == func.date_sub(func.current_date(), 1))
|
conditions.append(func.date(Job.data_requested) == func.date_sub(func.current_date(), 1))
|
||||||
elif date_requested == 'Last 7 days':
|
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
|
# Фильтр по дате posted
|
||||||
if date_posted == 'custom_date_posted' and date_posted_from and date_posted_to:
|
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')
|
end = datetime.strptime(date_posted_to, '%Y-%m-%d')
|
||||||
conditions.append(Job.date_posted.between(start, end))
|
conditions.append(Job.date_posted.between(start, end))
|
||||||
elif date_posted == 'Today':
|
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':
|
elif date_posted == 'Yesterday':
|
||||||
conditions.append(func.date(Job.date_posted) == func.date_sub(func.current_date(), 1))
|
conditions.append(func.date(Job.date_posted) == func.date_sub(func.current_date(), 1))
|
||||||
elif date_posted == 'Last 7 days':
|
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
|
# Фильтр по дате applied
|
||||||
if date_applied == 'custom_date_applied' and date_applied_from and date_applied_to:
|
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))
|
conditions.append(AppliedJob.applied_on.between(start, end))
|
||||||
elif date_applied == 'Today':
|
elif date_applied == 'Today':
|
||||||
conditions.append(func.date(AppliedJob.applied_on) == func.current_date())
|
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':
|
elif date_applied == 'Yesterday':
|
||||||
conditions.append(func.date(AppliedJob.applied_on) == func.date_sub(func.current_date(), 1))
|
conditions.append(func.date(AppliedJob.applied_on) == func.date_sub(func.current_date(), 1))
|
||||||
elif date_applied == 'Last 7 days':
|
elif date_applied == 'Last 7 days':
|
||||||
|
@ -329,26 +349,6 @@ async def product_filtered(
|
||||||
result1 = await session.execute(select(User))
|
result1 = await session.execute(select(User))
|
||||||
users = result1.scalars().all()
|
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:
|
except Exception as e:
|
||||||
await session.rollback()
|
await session.rollback()
|
||||||
raise HTTPException(status_code=500, detail=str(e))
|
raise HTTPException(status_code=500, detail=str(e))
|
||||||
|
@ -365,7 +365,16 @@ async def product_filtered(
|
||||||
"role": username["role"],
|
"role": username["role"],
|
||||||
"status": status, "assigned_users_ids": assignees,
|
"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
|
"current_path": request.url.path
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,87 +1,100 @@
|
||||||
<!-- BEGIN: Inbox Filter -->
|
|
||||||
<div class="intro-y flex flex-col-reverse sm:flex-row items-center">
|
<div class="p-5" id="boxed-accordion">
|
||||||
<div class="w-full sm:w-auto relative mr-auto mt-3 sm:mt-0">
|
<div class="preview">
|
||||||
<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>
|
<div class="accordion">
|
||||||
<input type="text" class="input w-full sm:w-64 box px-10 text-gray-700 placeholder-theme-13" placeholder="Filter">
|
<div class="accordion__pane border border-gray-200 p-4 mt-3">
|
||||||
<div class="inbox-filter dropdown absolute inset-y-0 mr-3 right-0 flex items-center">
|
<a href="javascript:;" class="accordion__pane__toggle filter-link font-medium block">Filter</a>
|
||||||
<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="accordion__pane__content mt-3 text-gray-800 leading-relaxed">
|
||||||
<div class="dropdown-box__content box p-5">
|
<div class="dropdown-box__content box p-5">
|
||||||
<div class="grid grid-cols-12 gap-4 row-gap-3">
|
<form method="POST" action="/productf">
|
||||||
<div class="col-span-6">
|
<!-- Дата-фильтры (Requested, Posted, Applied) -->
|
||||||
<div class="text-xs">Requested o</div>
|
<div class="flex gap-4">
|
||||||
<select id="" class="input w-full border mt-2 flex-1">
|
<!-- 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="Today">Today</option>
|
||||||
<option value="Last 7 days">Last 7 days</option>
|
<option value="Last 7 days">Last 7 days</option>
|
||||||
<option value="For all time">For all time</option>
|
<!--<option value="For all time">For all time</option>-->
|
||||||
<option value="date_range1">from date to date</option>
|
<option value="custom_date_requested">from date to date</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
<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-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 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">
|
<div class="col-span-12 sm:col-span-6">
|
||||||
<label>From</label>
|
<label>From</label>
|
||||||
<input id="date-from" class="datepicker input w-full border mt-2">
|
<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>
|
</div>
|
||||||
<div class="col-span-12 sm:col-span-6">
|
<div class="col-span-12 sm:col-span-6">
|
||||||
<label>To</label>
|
<label>To</label>
|
||||||
<input id="date-to" class="datepicker input w-full border mt-2">
|
<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>
|
</div>
|
||||||
|
|
||||||
<script>
|
<!-- Posted on -->
|
||||||
const select = document.getElementById('applied-select');
|
<div class="w-1/2">
|
||||||
const dateRangeWrapper = document.getElementById('date-range-wrapper');
|
<div class="text-xs">Posted on</div>
|
||||||
const dateFrom = document.getElementById('date-from');
|
<select id="date_posted" class="input w-full border mt-2 flex-1" name="date_posted">
|
||||||
const dateTo = document.getElementById('date-to');
|
<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>
|
||||||
|
|
||||||
select.addEventListener('change', function () {
|
|
||||||
if (this.value === 'date_applied') {
|
|
||||||
dateRangeWrapper.style.display = 'grid';
|
|
||||||
} else {
|
|
||||||
dateRangeWrapper.style.display = 'none';
|
|
||||||
dateFrom.value = '';
|
|
||||||
dateTo.value = '';
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Если хочешь — можно сохранить даты как data-атрибут или передать их куда нужно
|
<!-- Applied on -->
|
||||||
dateFrom.addEventListener('change', function () {
|
<div class="w-1/2">
|
||||||
select.setAttribute('data-date-from', this.value);
|
<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>
|
||||||
|
|
||||||
dateTo.addEventListener('change', function () {
|
<div class="flex flex-nowrap gap-4 mt-4"> <!-- flex-nowrap запрещает перенос на новую строку -->
|
||||||
select.setAttribute('data-date-to', this.value);
|
<!-- Clients (50% ширины) -->
|
||||||
});
|
<div class="flex-1 min-w-0"> <!-- flex-1 + min-w-0 предотвращает "расползание" -->
|
||||||
</script>
|
<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">
|
||||||
<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 = [] %}
|
{% set seen_ids = [] %}
|
||||||
{% for job in jobs %}
|
{% for job in jobs %}
|
||||||
{% if job.client.id not in seen_ids %}
|
{% if job.client.id not in seen_ids %}
|
||||||
|
@ -91,60 +104,81 @@
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
|
<!-- Assignee (50% ширины) -->
|
||||||
</div>
|
<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">
|
||||||
<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>
|
<option value="">— Not selected —</option>
|
||||||
{% for user in users %}
|
{% for user in users %}
|
||||||
<option value="{{ user.id }}"
|
<option value="{{ user.id }}" {% if user.id in assigned_users_ids %}selected{% endif %}>{{ user.username }}</option>
|
||||||
{% if user.id in assigned_users_ids %}selected{% endif %}>
|
|
||||||
{{ user.username }}
|
|
||||||
</option>
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-span-6">
|
|
||||||
|
|
||||||
<div class="mt-3">
|
|
||||||
|
<!-- Status и кнопка Apply Filters -->
|
||||||
|
<div class="flex-1 min-w-0">
|
||||||
<label>Status</label>
|
<label>Status</label>
|
||||||
<div class="mt-2">
|
<div class="mt-2">
|
||||||
<select data-placeholder="Select Status" class="select2 w-full" multiple>
|
<!-- <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="Scheduled">Scheduled</option>
|
||||||
<option value="Requested">Requested</option>
|
<option value="Requested">Requested</option>
|
||||||
<option value="In-Progress">In-Progress</option>
|
<option value="In-Progress">In-Progress</option>
|
||||||
|
<option value="Paused">Paused</option>
|
||||||
<option value="Applied">Applied</option>
|
<option value="Applied">Applied</option>
|
||||||
<option value="Issues Applying">Issues Applying</option>
|
<option value="Issues Applying">Issues Applying</option>
|
||||||
<option value="Cancelled">Cancelled</option>
|
<option value="Cancelled">Cancelled</option>
|
||||||
|
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
<button type="submit" class="button bg-theme-1 text-white mt-5">Apply Filters</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-span-12 flex items-center mt-3">
|
</form>
|
||||||
|
|
||||||
<button class="button w-32 justify-center block bg-theme-1 text-white ml-2">Search</button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="w-full sm:w-auto flex">
|
|
||||||
|
|
||||||
<div class="dropdown relative">
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
<script>
|
||||||
</div>
|
// Функция для настройки обработчиков событий для каждого селекта
|
||||||
</div>
|
function setupDateSelect(selectId, wrapperId, customValue) {
|
||||||
<!-- END: Inbox Filter -->
|
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>
|
|
||||||
|
|
||||||
|
|
||||||
<!-- 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>
|
{% include "filtr.html" %}
|
||||||
// Функция для настройки обработчиков событий для каждого селекта
|
|
||||||
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 -->
|
<!-- BEGIN: Datatable -->
|
||||||
|
|
||||||
|
|
||||||
|
@ -231,7 +85,9 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||||
<option value="Scheduled" {% if job.status == "Scheduled" %}selected{% endif %}>Scheduled</option>
|
<option value="Scheduled" {% if job.status == "Scheduled" %}selected{% endif %}>Scheduled</option>
|
||||||
<option value="Requested" {% if job.status == "Requested" %}selected{% endif %}>Requested</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="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="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="Issues Applying" {% if job.status == "Issues Applying" %}selected{% endif %}>Issues Applying</option>
|
||||||
<option value="Cancelled" {% if job.status == "Cancelled" %}selected{% endif %}>Cancelled</option>
|
<option value="Cancelled" {% if job.status == "Cancelled" %}selected{% endif %}>Cancelled</option>
|
||||||
|
|
|
@ -49,19 +49,32 @@
|
||||||
<div class="text-xs">Requested on</div>
|
<div class="text-xs">Requested on</div>
|
||||||
<select id="date_requested" class="input w-full border mt-2 flex-1" name="date_requested">
|
<select id="date_requested" class="input w-full border mt-2 flex-1" name="date_requested">
|
||||||
<option value=""></option>
|
<option value=""></option>
|
||||||
<option value="Today">Today</option>
|
<option value="Today" {% if date_requested == "Today" %}selected{% endif %}>Today</option>
|
||||||
<option value="Last 7 days">Last 7 days</option>
|
<option value="Last 7 days" {% if date_requested == "Last 7 days" %}selected{% endif %}>Last 7 days</option>
|
||||||
<option value="For all time">For all time</option>
|
<option value="For all time" {% if date_requested == "For all time" %}selected{% endif %}>For all time</option>
|
||||||
<option value="custom_date_requested">from date to date</option>
|
<option value="custom_date_requested" {% if date_requested == "custom_date_requested" %}selected{% endif %}>from date to date</option>
|
||||||
|
|
||||||
</select>
|
</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 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">
|
<div class="col-span-12 sm:col-span-6">
|
||||||
<label>From</label>
|
<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>
|
||||||
<div class="col-span-12 sm:col-span-6">
|
<div class="col-span-12 sm:col-span-6">
|
||||||
<label>To</label>
|
<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>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -75,15 +88,32 @@
|
||||||
<option value="Last 7 days">Last 7 days</option>
|
<option value="Last 7 days">Last 7 days</option>
|
||||||
<option value="For all time">For all time</option>
|
<option value="For all time">For all time</option>
|
||||||
<option value="custom_date_posted">from date to date</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>
|
</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 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">
|
<div class="col-span-12 sm:col-span-6">
|
||||||
<label>From</label>
|
<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>
|
||||||
<div class="col-span-12 sm:col-span-6">
|
<div class="col-span-12 sm:col-span-6">
|
||||||
<label>To</label>
|
<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>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -94,19 +124,31 @@
|
||||||
<div class="text-xs">Applied on</div>
|
<div class="text-xs">Applied on</div>
|
||||||
<select id="date_applied" class="input w-full border mt-2 flex-1" name="date_applied">
|
<select id="date_applied" class="input w-full border mt-2 flex-1" name="date_applied">
|
||||||
<option value=""></option>
|
<option value=""></option>
|
||||||
<option value="Today">Today</option>
|
<option value="Today" {% if date_applied == "Today" %}selected{% endif %}>Today</option>
|
||||||
<option value="Last 7 days">Last 7 days</option>
|
<option value="Last 7 days" {% if date_applied == "Last 7 days" %}selected{% endif %}>Last 7 days</option>
|
||||||
<option value="For all time">For all time</option>
|
<option value="For all time" {% if date_applied == "For all time" %}selected{% endif %}>For all time</option>
|
||||||
<option value="custom_date_applied">from date to date</option>
|
<option value="custom_date_applied" {% if date_applied == "custom_date_applied" %}selected{% endif %}>from date to date</option>
|
||||||
</select>
|
</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 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">
|
<div class="col-span-12 sm:col-span-6">
|
||||||
<label>From</label>
|
<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>
|
||||||
<div class="col-span-12 sm:col-span-6">
|
<div class="col-span-12 sm:col-span-6">
|
||||||
<label>To</label>
|
<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>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -27,161 +27,7 @@
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<div class="p-5" id="boxed-accordion">
|
{% include "filtr.html" %}
|
||||||
<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>
|
|
||||||
<!-- BEGIN: Datatable -->
|
<!-- BEGIN: Datatable -->
|
||||||
<div class="intro-y datatable-wrapper box p-5 mt-5">
|
<div class="intro-y datatable-wrapper box p-5 mt-5">
|
||||||
<table class="table table-report table-report--bordered display datatable w-full">
|
<table class="table table-report table-report--bordered display datatable w-full">
|
||||||
|
|
|
@ -29,110 +29,7 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="p-5" id="boxed-accordion">
|
{% include "filtr.html" %}
|
||||||
<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 -->
|
<!-- Status и кнопка Apply Filters -->
|
||||||
<div class="col-span-6 mt-4">
|
<div class="col-span-6 mt-4">
|
||||||
|
|
|
@ -29,161 +29,7 @@
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
|
||||||
<div class="p-5" id="boxed-accordion">
|
{% include "filtr.html" %}
|
||||||
<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>
|
|
||||||
<!-- BEGIN: Datatable -->
|
<!-- BEGIN: Datatable -->
|
||||||
<div class="intro-y datatable-wrapper box p-5 mt-5">
|
<div class="intro-y datatable-wrapper box p-5 mt-5">
|
||||||
<table class="table table-report table-report--bordered display datatable w-full">
|
<table class="table table-report table-report--bordered display datatable w-full">
|
||||||
|
|
|
@ -27,29 +27,35 @@
|
||||||
</form>-->
|
</form>-->
|
||||||
|
|
||||||
|
|
||||||
<div class="intro-y box">
|
<div class="intro-y box p-5">
|
||||||
<h2 class="text-lg font-medium mr-auto">Add Users</h2>
|
<h2 class="text-lg font-medium mr-auto">Add Users</h2>
|
||||||
|
<div class="overflow-x-auto mt-5">
|
||||||
<form action="/users/create" method="post">
|
<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">
|
||||||
<div class="mt-3"> <label>Password</label> <input type="password" name="password"class="input w-full border mt-2" placeholder="secret"> </div>
|
<label class="block">Login</label>
|
||||||
|
<input type="text" class="input w-full border mt-2" name="username" placeholder="username">
|
||||||
|
</div>
|
||||||
|
|
||||||
<label>Role:</label>
|
<div class="mt-3">
|
||||||
<div class="sm:mt-2"> <select class="input input--sm border mr-2" name="role">
|
<label class="block">Password</label>
|
||||||
<option value="user">Users</option>
|
<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>
|
<option value="admin">Admin</option>
|
||||||
</select></div>
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
<button type="submit" class="button bg-theme-1 text-white mt-5">Register</button>
|
<div class="mt-5">
|
||||||
|
<button type="submit" class="button bg-theme-1 text-white w-full">Register</button>
|
||||||
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
|
||||||
<div class="overflow-y-auto mt-3">
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div class="intro-y box mt-5">
|
<div class="intro-y box mt-5">
|
||||||
|
|
||||||
<div class="overflow-x-auto">
|
<div class="overflow-x-auto">
|
||||||
|
|
|
@ -1,5 +1,46 @@
|
||||||
<!DOCTYPE html>
|
<!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>
|
<head>
|
||||||
<title>В работе</title>
|
<title>В работе</title>
|
||||||
</head>
|
</head>
|
||||||
|
@ -7,4 +48,5 @@
|
||||||
<h2>Страница в работе...</h2>
|
<h2>Страница в работе...</h2>
|
||||||
<a href="/">Вернуться на главную</a>
|
<a href="/">Вернуться на главную</a>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>-->
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue