update Filters

This commit is contained in:
Xander 2025-04-09 18:40:57 +03:00
parent 13f065d4fc
commit 249c19e456
11 changed files with 16074 additions and 775 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -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
} }
) )

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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>-->