[UPDT] RECRUITMENT: Updated recruitment app by field label on filter form intead of a static label

This commit is contained in:
Horilla
2025-05-31 00:25:39 +05:30
parent f7cc746b5e
commit f1bf524b11
13 changed files with 803 additions and 732 deletions

View File

@@ -9,6 +9,7 @@ import uuid
import django_filters
from django import forms
from django.utils.translation import gettext_lazy as _
from base.filters import FilterSet
from recruitment.models import (
@@ -169,9 +170,57 @@ class CandidateFilter(FilterSet):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.form.fields["is_active"].initial = True
for field in self.form.fields.keys():
self.form.fields[field].widget.attrs["id"] = f"{uuid.uuid4()}"
form_fields = self.form.fields
form_fields["is_active"].initial = True
for field in form_fields:
form_fields[field].widget.attrs["id"] = str(uuid.uuid4())
self._update_field_labels(form_fields)
def _update_field_labels(self, form_fields):
"""Helper method to update field labels from model verbose names"""
models = {
"recruitment": Recruitment(),
"interview": InterviewSchedule(),
"skill_zone": SkillZoneCandidate(),
}
interview_date_label = (
models["interview"]._meta.get_field("interview_date").verbose_name
)
field_label_map = {
"interview_date": interview_date_label,
"scheduled_from": f"{interview_date_label} From",
"scheduled_till": f"{interview_date_label} Till",
"rejected_candidate__reject_reason_id": _("Reject Reason"),
"job_position_id__department_id": _("Department"),
"stage_id__stage_type": _("Stage Type"),
"stage_id__stage_managers": _("Stage Managers"),
"skillzonecandidate_set__skill_zone_id": models["skill_zone"]
._meta.get_field("skill_zone_id")
.verbose_name,
"start_date": models["recruitment"]
._meta.get_field("start_date")
.verbose_name,
"end_date": models["recruitment"]._meta.get_field("end_date").verbose_name,
"recruitment_id__company_id": models["recruitment"]
._meta.get_field("company_id")
.verbose_name,
"recruitment_id__closed": models["recruitment"]
._meta.get_field("closed")
.verbose_name,
"recruitment_id__recruitment_managers": models["recruitment"]
._meta.get_field("recruitment_managers")
.verbose_name,
}
for field_name, label in field_label_map.items():
if field_name in form_fields:
form_fields[field_name].label = label
def filter_mail_sent(self, queryset, name, value):
return queryset.filter(onboarding_portal__isnull=(not value))
@@ -246,6 +295,13 @@ class RecruitmentFilter(FilterSet):
"open_positions",
]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
start_date_verbose = self.Meta.model._meta.get_field("start_date").verbose_name
end_date_verbose = self.Meta.model._meta.get_field("end_date").verbose_name
self.form.fields["start_from"].label = f"{start_date_verbose} From"
self.form.fields["end_till"].label = f"{end_date_verbose} Till"
def filter_by_name(self, queryset, _, value):
"""
Filter queryset by first name or last name.
@@ -474,6 +530,7 @@ class SkillZoneCandFilter(FilterSet):
field_name="candidate__id__joining_date",
lookup_expr="gte",
widget=forms.DateInput(attrs={"type": "date"}),
label=_("Joining From"),
)
probation_end = django_filters.DateFilter(
field_name="candidate__id__probation_end",
@@ -483,11 +540,13 @@ class SkillZoneCandFilter(FilterSet):
field_name="candidate__id__probation_end",
lookup_expr="lte",
widget=forms.DateInput(attrs={"type": "date"}),
label=_("Probation Till"),
)
probation_end_from = django_filters.DateFilter(
field_name="candidate__id__probation_end",
lookup_expr="gte",
widget=forms.DateInput(attrs={"type": "date"}),
label=_("Probation From"),
)
schedule_date = django_filters.DateFilter(
field_name="candidate__id__schedule_date",
@@ -497,6 +556,7 @@ class SkillZoneCandFilter(FilterSet):
field_name="candidate__id__joining_date",
lookup_expr="lte",
widget=forms.DateInput(attrs={"type": "date"}),
label=_("Joining Till"),
)
recruitment = django_filters.CharFilter(
field_name="candidate__id__recruitment_id__title", lookup_expr="icontains"
@@ -506,11 +566,13 @@ class SkillZoneCandFilter(FilterSet):
field_name="candidate__id__onboarding_portal",
method="filter_mail_sent",
widget=django_filters.widgets.BooleanWidget(),
label=_("Portal Sent"),
)
joining_set = django_filters.BooleanFilter(
field_name="candidate__id__joining_date",
method="filter_joining_set",
widget=django_filters.widgets.BooleanWidget(),
label=_("Joining Set"),
)
class Meta:
@@ -583,10 +645,6 @@ class InterviewFilter(FilterSet):
lookup_expr="gte",
widget=forms.DateInput(attrs={"type": "date"}),
)
# schedule_date = django_filters.DateFilter(
# field_name="interview_date",
# widget=forms.DateInput(attrs={"type": "date"}),
# )
scheduled_till = django_filters.DateFilter(
field_name="interview_date",
lookup_expr="lte",
@@ -603,40 +661,17 @@ class InterviewFilter(FilterSet):
"candidate_id",
"employee_id",
"interview_date",
# "recruitment",
# "recruitment_id",
# "stage_id",
# "schedule_date",
# "email",
# "mobile",
# "country",
# "state",
# "city",
# "zip",
# "gender",
# "start_onboard",
# "hired",
# "canceled",
# "is_active",
# "recruitment_id__company_id",
# "job_position_id",
# "recruitment_id__closed",
# "recruitment_id__is_active",
# "job_position_id__department_id",
# "recruitment_id__recruitment_managers",
# "stage_id__stage_managers",
# "stage_id__stage_type",
# "joining_date",
# "skillzonecandidate_set__skill_zone_id",
# "skillzonecandidate_set__candidate_id",
# "portal_sent",
# "joining_set",
# "rejected_candidate__reject_reason_id",
# "offer_letter_status",
# "candidate_rating__rating",
# "candidate_interview__employee_id",
]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.form["scheduled_from"].label = (
f"{self.Meta.model()._meta.get_field('interview_date').verbose_name} From"
)
self.form["scheduled_till"].label = (
f"{self.Meta.model()._meta.get_field('interview_date').verbose_name} Till"
)
class LinkedInAccountFilter(FilterSet):
"""LinkedInAccount filter"""

View File

@@ -134,6 +134,7 @@ class Recruitment(HorillaModel):
help_text=_(
"To close the recruitment, If closed then not visible on pipeline view."
),
verbose_name=_("Closed"),
)
is_published = models.BooleanField(
default=True,
@@ -143,13 +144,6 @@ class Recruitment(HorillaModel):
),
verbose_name=_("Is Published"),
)
is_active = models.BooleanField(
default=True,
help_text=_(
"To archive and un-archive a recruitment, if active is false then it \
will not appear on recruitment list view."
),
)
open_positions = models.ManyToManyField(
JobPosition,
related_name="open_positions",
@@ -178,8 +172,10 @@ class Recruitment(HorillaModel):
blank=True,
verbose_name=_("Company"),
)
start_date = models.DateField(default=django.utils.timezone.now)
end_date = models.DateField(blank=True, null=True)
start_date = models.DateField(
default=django.utils.timezone.now, verbose_name=_("Start Date")
)
end_date = models.DateField(blank=True, null=True, verbose_name=_("End Date"))
skills = models.ManyToManyField(Skill, blank=True, verbose_name=_("Skills"))
linkedin_account_id = models.ForeignKey(
"recruitment.LinkedInAccount",
@@ -335,6 +331,9 @@ class Stage(HorillaModel):
verbose_name = _("Stage")
verbose_name_plural = _("Stages")
def __str__(self):
return f"{self.stage} - ({self.recruitment_id.title})"
def active_candidates(self):
"""
This method is used to get all the active candidate like related objects
@@ -472,6 +471,7 @@ class Candidate(HorillaModel):
choices=offer_letter_statuses,
default="not_sent",
editable=False,
verbose_name=_("Offer Letter Status"),
)
objects = HorillaCompanyManager(related_company_field="recruitment_id__company_id")
last_updated = models.DateField(null=True, auto_now=True)

View File

@@ -104,11 +104,11 @@ x-data="{searchShow: false}"
style="display: none"
>
<div class="oh-accordion">
<label>{% trans "Group By" %}</label>
<label class="oh-label" for="id_field">{% trans "Group By" %}</label>
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">{% trans "Field" %}</label>
<label class="oh-label" for="id_field">{% trans "Field" %}</label>
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">

View File

@@ -1,205 +1,252 @@
{% load static %} {% load i18n %}
<div class="oh-modal__dialog-header">
<h2 class="oh-modal__dialog-title" id="candidateExportLavel">
{% trans "Export Candidates" %}
</h2>
<button class="oh-modal__close" aria-label="Close">
<ion-icon name="close-outline"></ion-icon>
</button>
<h2 class="oh-modal__dialog-title" id="candidateExportLavel">
{% trans "Export Candidates" %}
</h2>
<button class="oh-modal__close" aria-label="Close">
<ion-icon name="close-outline"></ion-icon>
</button>
</div>
<div class="oh-modal__dialog-body">
<form
action="{%url 'candidate-info-export' %}"
method="get"
class="oh-profile-section"
onsubmit="event.stopPropagation();$(this).parents().find('.oh-modal--show').last().toggleClass('oh-modal--show');"
id="candidateExportForm"
>
{% csrf_token %}
<div class="oh-dropdown__filter-body" id="export_attendance_form">
<div class="oh-accordion">
<div class="oh-accordion-header">{% trans "Excel columns" %}</div>
<div class="oh-accordion-body">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">
<input type="checkbox" id="select-all-fields" /> {% trans "Select All" %}
</label>
</div>
<form action="{%url 'candidate-info-export' %}" method="get" class="oh-profile-section"
onsubmit="event.stopPropagation();$(this).parents().find('.oh-modal--show').last().toggleClass('oh-modal--show');"
id="candidateExportForm">
{% csrf_token %}
<div class="oh-dropdown__filter-body" id="">
<div class="oh-accordion">
<div class="oh-accordion-header">{% trans "Excel columns" %}</div>
<div class="oh-accordion-body">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">
<input type="checkbox" id="select-all-fields" /> {% trans "Select All" %}
</label>
</div>
</div>
</div>
<div class="row">
{% for field in export_column.selected_fields %}
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label"> {{ field }} </label>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
</div>
<div class="row">
{% for field in export_column.selected_fields %}
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label"> {{ field }} </label>
</div>
<div class="oh-dropdown__filter-body">
<div class="oh-accordion">
<div class="oh-accordion-header">{% trans "Candidates" %}</div>
<div class="oh-accordion-body">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-12">
<div class="oh-input-group">
<label class="oh-label">{% trans "Candidate" %}</label>
{{export_filter.form.candidate}}
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label"
for="{{export_filter.form.mobile.id_for_label}}">{{export_filter.form.mobile.label}}</label>
{{ export_filter.form.mobile }}
</div>
<div class="oh-input-group">
<label class="oh-label"
for="{{export_filter.form.interview_date.id_for_label}}">{{export_filter.form.interview_date.label}}</label>
{{ export_filter.form.interview_date }}
</div>
<div class="oh-input-group">
<label class="oh-label">{{export_filter.form.country.label}}</label>
{{export_filter.form.country}}
</div>
<div class="oh-input-group">
<label class="oh-label"
for="{{export_filter.form.hired.id_for_label}}">{{export_filter.form.hired.label}}
?</label>
{{ export_filter.form.hired }}
</div>
<div class="col-sm-12 col-md-12 col-lg-12 mb-2">
<div class="oh-input-group">
<label class="oh-label"
for="{{export_filter.form.rejected_candidate__reject_reason_id.id_for_label}}">{{export_filter.form.rejected_candidate__reject_reason_id.label}}
</label>
{{export_filter.form.rejected_candidate__reject_reason_id}}
</div>
<div class="oh-input-group">
<label class="oh-label"
for="{{export_filter.form.converted.id_for_label}}">{{export_filter.form.converted.label}}
?</label>
{{ export_filter.form.converted }}
</div>
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label"
for="{{export_filter.form.email.id_for_label}}">{{export_filter.form.email.label}}</label>
{{ export_filter.form.email }}
</div>
<div class="oh-input-group">
<label class="oh-label"
for="{{export_filter.form.gender.id_for_label}}">{{export_filter.form.gender.label}}</label>
{{ export_filter.form.gender }}
</div>
<div class="oh-input-group">
<label class="oh-label">{{export_filter.form.state.label}}</label>
{{export_filter.form.state}}
</div>
<div class="oh-input-group">
<label class="oh-label"
for="{{export_filter.form.canceled.id_for_label}}">{{export_filter.form.canceled.label}}
?</label>
{{ export_filter.form.canceled }}
</div>
<div class="col-sm-12 col-md-12 col-lg-12 mb-2">
<div class="oh-input-group">
<label class="oh-label"
for="{{export_filter.form.offer_letter_status.id_for_label}}">{{export_filter.form.offer_letter_status.label}}
</label>
{{export_filter.form.offer_letter_status}}
</div>
</div>
</div>
</div>
</div>
</div>
<div class="oh-accordion">
<div class="oh-accordion-header">
{% trans 'Recruitment' %}
</div>
<div class="oh-accordion-body">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label"
for="{{export_filter.form.recruitment_id.id_for_label}}">{{export_filter.form.recruitment_id.label}}</label>
{{ export_filter.form.recruitment_id }}
</div>
<div class="oh-input-group">
<label class="oh-label"
for="{{export_filter.form.job_position_id__department_id.id_for_label}}">{{export_filter.form.job_position_id__department_id.label}}</label>
{{ export_filter.form.job_position_id__department_id }}
</div>
<div class="oh-input-group">
<label class="oh-label"
for="{{export_filter.form.recruitment_id__recruitment_managers.id_for_label}}">{{export_filter.form.recruitment_id__recruitment_managers.label}}</label>
{{ export_filter.form.recruitment_id__recruitment_managers }}
</div>
<div class="oh-input-group">
<label class="oh-label"
for="{{export_filter.form.stage_id.id_for_label}}">{{export_filter.form.stage_id.label}}
</label>
{{ export_filter.form.stage_id }}
</div>
<div class="oh-input-group">
<label class="oh-label"
for="{{export_filter.form.stage_id__stage_type.id_for_label}}">{{export_filter.form.stage_id__stage_type.label}}</label>
{{ export_filter.form.stage_id__stage_type }}
</div>
<div class="oh-input-group">
<label class="oh-label"
for="{{export_filter.form.start_date.id_for_label}}">{{export_filter.form.start_date.label}}</label>
{{ export_filter.form.start_date }}
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label"
for="{{export_filter.form.recruitment_id__company_id.id_for_label}}">{{export_filter.form.recruitment_id__company_id.label}}</label>
{{ export_filter.form.recruitment_id__company_id }}
</div>
<div class="oh-input-group">
<label class="oh-label"
for="{{export_filter.form.job_position_id.id_for_label}}">{{export_filter.form.job_position_id.label}}</label>
{{ export_filter.form.job_position_id }}
</div>
<div class="oh-input-group">
<label class="oh-label"
for="{{export_filter.form.skillzonecandidate_set__skill_zone_id.id_for_label}}">{{export_filter.form.skillzonecandidate_set__skill_zone_id.label}}
</label>
{{ export_filter.form.skillzonecandidate_set__skill_zone_id }}
</div>
<div class="oh-input-group">
<label class="oh-label"
for="{{export_filter.form.stage_id__stage_managers.id_for_label}}">{{export_filter.form.stage_id__stage_managers.label}}
</label>
{{ export_filter.form.stage_id__stage_managers }}
</div>
<div class="oh-input-group">
<label class="oh-label"
for="{{export_filter.form.recruitment_id__closed.id_for_label}}">{{export_filter.form.recruitment_id__closed.label}}
?</label>
{{ export_filter.form.recruitment_id__closed }}
</div>
<div class="oh-input-group">
<label class="oh-label"
for="{{export_filter.form.end_date.id_for_label}}">{{export_filter.form.end_date.label}}</label>
{{ export_filter.form.end_date }}
</div>
</div>
</div>
</div>
</div>
<div class="oh-accordion">
<div class="oh-accordion-header">
{% trans 'Advanced' %}
</div>
<div class="oh-accordion-body">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label"
for="{{export_filter.form.scheduled_from.id_for_label}}">{{export_filter.form.scheduled_from.label}}
</label>
{{ export_filter.form.scheduled_from }}
</div>
<div class="oh-input-group">
<label class="oh-label"
for="{{export_filter.form.is_active.id_for_label}}">{{export_filter.form.is_active.label}}
?</label>
{{ export_filter.form.is_active }}
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label"
for="{{export_filter.form.scheduled_till.id_for_label}}">{{export_filter.form.scheduled_till.label}}
</label>
{{ export_filter.form.scheduled_till }}
</div>
</div>
</div>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
<div class="oh-dropdown__filter-body">
<div class="oh-accordion">
<div class="oh-accordion-header">{% trans "Candidates" %}</div>
<div class="oh-accordion-body">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-12">
<div class="oh-input-group">
<label class="oh-label">{% trans "Candidate" %}</label>
{{export_filter.form.candidate}}
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">{% trans "Phone" %}</label>
{{export_filter.form.mobile}}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans "Interview Date" %}</label>
{{export_filter.form.interview_date}}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans "Country" %}</label>
{{export_filter.form.country}}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans "Is Hired" %}?</label>
{{export_filter.form.hired}}
</div>
<div class="col-sm-12 col-md-12 mb-2">
<div class="oh-input-group">
<label class="oh-label">{% trans "Reject Reason" %}</label>
{{export_filter.form.rejected_candidate__reject_reason_id}}
</div>
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">{% trans "Email" %}</label>
{{export_filter.form.email}}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans "Gender" %}</label>
{{export_filter.form.gender}}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans "State" %}</label>
{{export_filter.form.state}}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans "Is Canceled" %}?</label>
{{export_filter.form.canceled}}
</div>
<div class="col-sm-12 col-md-12 mb-2">
<div class="oh-input-group">
<label class="oh-label">{% trans "Offer Status" %}</label>
{{export_filter.form.offer_letter_status}}
</div>
</div>
</div>
</div>
</div>
</div>
<div class="oh-accordion">
<div class="oh-accordion-header">{% trans "Recruitment" %}</div>
<div class="oh-accordion-body">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">{% trans "Recruitment" %}</label>
{{export_filter.form.recruitment_id}}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans "Job Position" %}</label>
{{export_filter.form.job_position_id}}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans "Start Date" %}</label>
{{export_filter.form.start_date}}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans "Is Closed" %}?</label>
{{export_filter.form.recruitment_id__closed}}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans "Stage Type" %}</label>
{{export_filter.form.stage_id__stage_type}}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans "Stage Managers" %}</label>
{{export_filter.form.stage_id__stage_managers}}
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">{% trans "Stage" %}</label>
{{export_filter.form.stage_id}}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans "Department" %}</label>
{{export_filter.form.job_position_id__department_id}}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans "Company" %}</label>
{{export_filter.form.recruitment_id__company_id}}
</div>
<div class="oh-input-group">
<label class="oh-label"
>{% trans "Recruitment Managers" %}</label
>
{{export_filter.form.recruitment_id__recruitment_managers}}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans "End Date" %}</label>
{{export_filter.form.end_date}}
</div>
</div>
</div>
</div>
</div>
<div class="oh-accordion">
<div class="oh-accordion-header">{% trans "Advanced" %}</div>
<div class="oh-accordion-body">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">{% trans "Interview From" %}</label>
{{export_filter.form.scheduled_from}}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans "Is Active" %}?</label>
{{export_filter.form.is_active}}
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">{% trans "Interview Till" %}</label>
{{export_filter.form.scheduled_till}}
</div>
</div>
</div>
</div>
<div class="oh-modal__dialog-footer p-0 mt-3">
<button type="submit" class="oh-btn oh-btn--secondary oh-btn--shadow">
{% trans "Export" %}
</button>
</div>
</div>
</div>
<div class="oh-modal__dialog-footer p-0 mt-3">
<button type="submit" class="oh-btn oh-btn--secondary oh-btn--shadow">
{% trans "Export" %}
</button>
</div>
</form>
</form>
</div>

View File

@@ -2,169 +2,200 @@
{% load static %}
<input type="hidden" name="search" id="filterSearch" />
<div class="oh-dropdown__filter-body">
<div class="oh-accordion">
<div class="oh-accordion-header">
{% trans 'Candidates' %}
</div>
<div class="oh-accordion-body">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">{% trans 'Phone' %}</label>
{{ f.form.mobile }}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans 'Interview Date' %}</label>
{{ f.form.interview_date }}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans 'Country' %}</label>
<select name="country" class="oh-select-2 w-100 country" id="country">
</select>
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans 'Is Hired' %}?</label>
{{ f.form.hired }}
</div>
<div class="col-sm-12 col-md-12 col-lg-12 mb-2">
<div class="oh-input-group">
<label class="oh-label">{% trans "Reject Reason" %}</label>
{{f.form.rejected_candidate__reject_reason_id}}
<div class="oh-accordion">
<div class="oh-accordion-header">
{% trans 'Candidates' %}
</div>
<div class="oh-accordion-body">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label" for="{{f.form.mobile.id_for_label}}">{{f.form.mobile.label}}</label>
{{ f.form.mobile }}
</div>
<div class="oh-input-group">
<label class="oh-label"
for="{{f.form.interview_date.id_for_label}}">{{f.form.interview_date.label}}</label>
{{ f.form.interview_date }}
</div>
<div class="oh-input-group">
<label class="oh-label" for="country">{{f.form.country.label}}</label>
<select name="country" class="oh-select-2 w-100 country" id="country">
</select>
</div>
<div class="oh-input-group">
<label class="oh-label" for="{{f.form.hired.id_for_label}}">{{f.form.hired.label}} ?</label>
{{ f.form.hired }}
</div>
<div class="col-sm-12 col-md-12 col-lg-12 mb-2">
<div class="oh-input-group">
<label class="oh-label"
for="{{f.form.rejected_candidate__reject_reason_id.id_for_label}}">{{f.form.rejected_candidate__reject_reason_id.label}}
</label>
{{f.form.rejected_candidate__reject_reason_id}}
</div>
<div class="oh-input-group">
<label class="oh-label" for="{{f.form.converted.id_for_label}}">{{f.form.converted.label}}
?</label>
{{ f.form.converted }}
</div>
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label" for="{{f.form.email.id_for_label}}">{{f.form.email.label}}</label>
{{ f.form.email }}
</div>
<div class="oh-input-group">
<label class="oh-label" for="{{f.form.gender.id_for_label}}">{{f.form.gender.label}}</label>
{{ f.form.gender }}
</div>
<div class="oh-input-group">
<label class="oh-label" for="state">{{f.form.state.label}}</label>
<select name="state" class="oh-select-2 w-100 country" id="state">
</select>
</div>
<div class="oh-input-group">
<label class="oh-label" for="{{f.form.canceled.id_for_label}}">{{f.form.canceled.label}}
?</label>
{{ f.form.canceled }}
</div>
<div class="col-sm-12 col-md-12 col-lg-12 mb-2">
<div class="oh-input-group">
<label class="oh-label"
for="{{f.form.offer_letter_status.id_for_label}}">{{f.form.offer_letter_status.label}}
</label>
{{f.form.offer_letter_status}}
</div>
</div>
</div>
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans 'Is Converted' %}?</label>
{{ f.form.converted }}
</div>
</div>
<div class="oh-accordion">
<div class="oh-accordion-header">
{% trans 'Recruitment' %}
</div>
<div class="oh-accordion-body">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label"
for="{{f.form.recruitment_id.id_for_label}}">{{f.form.recruitment_id.label}}</label>
{{ f.form.recruitment_id }}
</div>
<div class="oh-input-group">
<label class="oh-label"
for="{{f.form.job_position_id__department_id.id_for_label}}">{{f.form.job_position_id__department_id.label}}</label>
{{ f.form.job_position_id__department_id }}
</div>
<div class="oh-input-group">
<label class="oh-label"
for="{{f.form.recruitment_id__recruitment_managers.id_for_label}}">{{f.form.recruitment_id__recruitment_managers.label}}</label>
{{ f.form.recruitment_id__recruitment_managers }}
</div>
<div class="oh-input-group">
<label class="oh-label" for="{{f.form.stage_id.id_for_label}}">{{f.form.stage_id.label}}
</label>
{{ f.form.stage_id }}
</div>
<div class="oh-input-group">
<label class="oh-label"
for="{{f.form.stage_id__stage_type.id_for_label}}">{{f.form.stage_id__stage_type.label}}</label>
{{ f.form.stage_id__stage_type }}
</div>
<div class="oh-input-group">
<label class="oh-label"
for="{{f.form.start_date.id_for_label}}">{{f.form.start_date.label}}</label>
{{ f.form.start_date }}
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label"
for="{{f.form.recruitment_id__company_id.id_for_label}}">{{f.form.recruitment_id__company_id.label}}</label>
{{ f.form.recruitment_id__company_id }}
</div>
<div class="oh-input-group">
<label class="oh-label"
for="{{f.form.job_position_id.id_for_label}}">{{f.form.job_position_id.label}}</label>
{{ f.form.job_position_id }}
</div>
<div class="oh-input-group">
<label class="oh-label"
for="{{f.form.skillzonecandidate_set__skill_zone_id.id_for_label}}">{{f.form.skillzonecandidate_set__skill_zone_id.label}}
</label>
{{ f.form.skillzonecandidate_set__skill_zone_id }}
</div>
<div class="oh-input-group">
<label class="oh-label"
for="{{f.form.stage_id__stage_managers.id_for_label}}">{{f.form.stage_id__stage_managers.label}}
</label>
{{ f.form.stage_id__stage_managers }}
</div>
<div class="oh-input-group">
<label class="oh-label"
for="{{f.form.recruitment_id__closed.id_for_label}}">{{f.form.recruitment_id__closed.label}}
?</label>
{{ f.form.recruitment_id__closed }}
</div>
<div class="oh-input-group">
<label class="oh-label" for="{{f.form.end_date.id_for_label}}">{{f.form.end_date.label}}</label>
{{ f.form.end_date }}
</div>
</div>
</div>
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">{% trans 'Email' %}</label>
{{ f.form.email }}
</div>
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans 'Gender' %}</label>
{{ f.form.gender }}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans 'State' %}</label>
<select name="state" class="oh-select-2 w-100 country" id="state">
</select>
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans 'Is Canceled' %}?</label>
{{ f.form.canceled }}
</div>
<div class="col-sm-12 col-md-12 col-lg-12 mb-2">
<div class="oh-input-group">
<label class="oh-label">{% trans "Offer Status" %}</label>
{{f.form.offer_letter_status}}
<div class="oh-accordion">
<div class="oh-accordion-header">
{% trans 'Advanced' %}
</div>
<div class="oh-accordion-body">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label"
for="{{f.form.scheduled_from.id_for_label}}">{{f.form.scheduled_from.label}} </label>
{{ f.form.scheduled_from }}
</div>
<div class="oh-input-group">
<label class="oh-label" for="{{f.form.is_active.id_for_label}}">{{f.form.is_active.label}}
?</label>
{{ f.form.is_active }}
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label"
for="{{f.form.scheduled_till.id_for_label}}">{{f.form.scheduled_till.label}} </label>
{{ f.form.scheduled_till }}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="oh-accordion">
<div class="oh-accordion-header">
{% trans 'Recruitment' %}
</div>
<div class="oh-accordion-body">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">{% trans 'Recruitment' %}</label>
{{ f.form.recruitment_id }}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans 'Job Position' %}</label>
{{ f.form.job_position_id }}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans 'Start Date' %}</label>
{{ f.form.start_date }}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans 'Is Closed' %}?</label>
{{ f.form.recruitment_id__closed }}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans 'Stage Type' %}</label>
{{ f.form.stage_id__stage_type }}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans 'Stage Managers' %}</label>
{{ f.form.stage_id__stage_managers }}
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">{% trans 'Stage' %}</label>
{{ f.form.stage_id }}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans 'Department' %}</label>
{{ f.form.job_position_id__department_id }}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans 'Company' %}</label>
{{ f.form.recruitment_id__company_id }}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans 'Recruitment Managers' %}</label>
{{ f.form.recruitment_id__recruitment_managers }}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans 'End Date' %}</label>
{{ f.form.end_date }}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans 'Skill Zone' %}</label>
{{ f.form.skillzonecandidate_set__skill_zone_id }}
</div>
</div>
</div>
</div>
</div>
<div class="oh-accordion">
<div class="oh-accordion-header">
{% trans 'Advanced' %}
</div>
<div class="oh-accordion-body">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">{% trans 'Interview From' %}</label>
{{ f.form.scheduled_from }}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans 'Is Active' %}?</label>
{{ f.form.is_active }}
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">{% trans 'Interview Till' %}</label>
{{ f.form.scheduled_till }}
</div>
</div>
</div>
</div>
</div>
</div>
<div class="oh-dropdown__filter-footer">
<button class="oh-btn oh-btn--secondary oh-btn--small w-100 filterButton" id="#candidateFilter" onclick="event.stopPropagation()" >{% trans 'Filter' %}</button>
<button class="oh-btn oh-btn--secondary oh-btn--small w-100 filterButton" id="#candidateFilter"
onclick="event.stopPropagation()">{% trans 'Filter' %}
</button>
</div>
<script src="{% static '/base/filter.js' %}"></script>
<script>
{% include "country.js" %}
</script>
{% include "country.js" %}
</script>

View File

@@ -86,7 +86,7 @@
{% if perms.recruitment.change_interviewschedule or request.user.employee_get in interview.employee_id.all %}
<a hx-confirm="{% trans 'Are you sure you want to remove this interviewer?' %}"
hx-post="{% url 'interview-employee-remove' interview.id employee.id %}"
title="{% trans " Remove" %}" hx-swap="outerHTML" hx-target="#section"
title="{% trans " Remove" %}" hx-swap="outerHTML"
onclick="event.stopPropagation()">
<ion-icon name="close-outline"></ion-icon>
</a>

View File

@@ -1,155 +1,133 @@
{% load i18n %}{% load static recruitmentfilters %}
<section
class="oh-wrapper oh-main__topbar"
x-data="{searchShow: false}"
>
<div class="oh-main__titlebar oh-main__titlebar--left">
<h1 class="oh-main__titlebar-title fw-bold">
{% trans "Scheduled Interviews" %}
</h1>
</div>
<form
hx-get="{% url 'interview-filter-view' %}"
hx-target="#section"
id="filterForm"
class="d-flex"
onsubmit = "event.preventDefault()"
>
<div class="oh-main__titlebar oh-main__titlebar--right oh-d-flex-column--resp oh-mb-3--small">
<section class="oh-wrapper oh-main__topbar" x-data="{searchShow: false}">
<div class="oh-main__titlebar oh-main__titlebar--left">
<h1 class="oh-main__titlebar-title fw-bold">
{% trans "Scheduled Interviews" %}
</h1>
</div>
<form hx-get="{% url 'interview-filter-view' %}" hx-target="#section" id="filterForm" class="d-flex"
onsubmit="event.preventDefault()">
<div class="oh-main__titlebar oh-main__titlebar--right oh-d-flex-column--resp oh-mb-3--small">
<div class="oh-main__titlebar-button-container">
<div class="oh-input-group oh-input__search-group mr-4">
<ion-icon name="search-outline" class="oh-input-group__icon oh-input-group__icon--left md hydrated" role="img" aria-label="search outline"></ion-icon>
<input
name="search" type="text" placeholder="Search"
style="margin-right:10px" class="oh-input oh-input__icon mr-3"
autocomplete="false"
aria-label="Search Input"
onkeyup="$('.filterButton')[0].click()"
/>
</div>
<div class="oh-dropdown" x-data="{open: false}">
<button
class="oh-btn ml-2"
@click="open = !open"
onclick="event.preventDefault()"
>
<ion-icon name="filter" class="mr-1"></ion-icon>{% trans "Filter" %}
<div id="filterCount"></div>
</button>
<div
class="oh-dropdown__menu oh-dropdown__menu--right oh-dropdown__filter p-4"
x-show="open"
@click.outside="open = false"
style="display: none"
>
<div class="oh-dropdown__filter-body">
<div class="oh-accordion">
<div class="oh-accordion-header">{% trans "Interview" %}</div>
<div class="oh-accordion-body">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label" for="{{f.form.employee_id.id_for_label}}">{% trans "Candidate" %}</label>
{{f.form.candidate_id}}
<div class="oh-main__titlebar-button-container">
<div class="oh-input-group oh-input__search-group mr-4">
<ion-icon name="search-outline" class="oh-input-group__icon oh-input-group__icon--left md hydrated"
role="img" aria-label="search outline"></ion-icon>
<input name="search" type="text" placeholder="Search" style="margin-right:10px"
class="oh-input oh-input__icon mr-3" autocomplete="false" aria-label="Search Input"
onkeyup="$('.filterButton')[0].click()" />
</div>
<div class="oh-dropdown" x-data="{open: false}">
<button class="oh-btn ml-2" @click="open = !open" onclick="event.preventDefault()">
<ion-icon name="filter" class="mr-1"></ion-icon>{% trans "Filter" %}
<div id="filterCount"></div>
</button>
<div class="oh-dropdown__menu oh-dropdown__menu--right oh-dropdown__filter p-4" x-show="open"
@click.outside="open = false" style="display: none">
<div class="oh-dropdown__filter-body">
<div class="oh-accordion">
<div class="oh-accordion-header">{% trans "Interview" %}</div>
<div class="oh-accordion-body">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label" for="{{f.form.start_date.id_for_label}}">{% trans "Interview Date From" %}</label>
{{f.form.scheduled_from}}
<div class="oh-input-group">
<label class="oh-label" for="{{f.form.candidate_id.id_for_label}}">
{{f.form.candidate_id.label}}</label>
{{f.form.candidate_id}}
</div>
<div class="oh-input-group">
<label class="oh-label" for="{{f.form.scheduled_from.id_for_label}}">
{{f.form.scheduled_from.label}}</label>
{{f.form.scheduled_from}}
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label" for="{{f.form.employee_id.id_for_label}}">
{{f.form.employee_id.label}}</label>
{{f.form.employee_id}}
</div>
<div class="oh-input-group">
<label class="oh-label" for="{{f.form.scheduled_till.id_for_label}}">
{{f.form.scheduled_till.label}}</label>
{{f.form.scheduled_till}}
</div>
</div>
</div>
</div>
</div>
</div>
<div class="oh-dropdown__filter-footer">
<button class="oh-btn oh-btn--secondary oh-btn--small w-100 filterButton">
{% trans "Filter" %}
</button>
</div>
</div>
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label" for ="{{f.form.action.id_for_label}}">{% trans "Interviewer" %}</label>
{{f.form.employee_id}}
<div class="oh-btn-group ml-2">
<div class="oh-dropdown">
{% if perms.recruitment.add_interviewschedule %}
<a hx-get='{% url "create-interview-schedule" %}' hx-target="#createTarget" hx-swap="innerHTML"
data-target="#createModal" data-toggle="oh-modal-toggle" class='oh-btn oh-btn--secondary'>
<ion-icon name="add-sharp" class="mr-1"></ion-icon>{% trans "Create" %}
</a>
{% endif %}
</div>
</div>
<div class="oh-input-group">
<label class="oh-label" for="{{f.form.start_date.id_for_label}}">{% trans "Interview Date Till" %}</label>
{{f.form.scheduled_till}}
</div>
</div>
</div>
</div>
</div>
</div>
<div class="oh-dropdown__filter-footer">
<button
class="oh-btn oh-btn--secondary oh-btn--small w-100 filterButton"
>
{% trans "Filter" %}
</button>
</div>
</div>
</div>
<div class="oh-btn-group ml-2">
<div class="oh-dropdown" >
{% if perms.recruitment.add_interviewschedule %}
<a hx-get='{% url "create-interview-schedule" %}'
hx-target="#createTarget"
hx-swap="innerHTML"
data-target="#createModal"
data-toggle="oh-modal-toggle"
class='oh-btn oh-btn--secondary'
>
<ion-icon name="add-sharp" class="mr-1"></ion-icon>{% trans "Create" %}
</a>
{% endif %}
</div>
</div>
</div>
</div>
</form>
</form>
</section>
<script>
$(document).ready(function () {
function candidateFilter(element) {
var search = $("#candidate-search").val();
const form = document.querySelector("#filterForm");
const formData = new FormData(form);
const queryString = new URLSearchParams(formData).toString();
const searchParams = new URLSearchParams(queryString);
const queryObject = Object.fromEntries(searchParams.entries());
view = $(element).attr("data-view");
queryObject["search"] = search;
queryObject["view"] = view;
stringQueyObject = JSON.stringify(queryObject);
// $('#list').attr('hx-vals', stringQueyObject);
// $('#card').attr('hx-vals', stringQueyObject);
}
$("#candidate-search").keyup(function (e) {
$(".candidate-view-type").attr(
"hx-vals",
`{"search":"${$(this).val()}"}`
);
});
$(".candidate-view-type").on("click", function (e) {
let view = $(this).attr("data-view");
var currentURL = window.location.href;
if (view != undefined) {
if (/\?view=[^&]+/.test(currentURL)) {
newURL = currentURL.replace(/\?view=[^&]+/, "?view=" + view);
} else {
var separator = currentURL.includes("?") ? "&" : "?";
newURL = currentURL + separator + "view=" + view;
$(document).ready(function () {
function candidateFilter(element) {
var search = $("#candidate-search").val();
const form = document.querySelector("#filterForm");
const formData = new FormData(form);
const queryString = new URLSearchParams(formData).toString();
const searchParams = new URLSearchParams(queryString);
const queryObject = Object.fromEntries(searchParams.entries());
view = $(element).attr("data-view");
queryObject["search"] = search;
queryObject["view"] = view;
stringQueyObject = JSON.stringify(queryObject);
// $('#list').attr('hx-vals', stringQueyObject);
// $('#card').attr('hx-vals', stringQueyObject);
}
history.pushState({}, "", newURL);
$("#candidate-search").attr("hx-vals", `{"view":"${view}"}`);
$("#filterForm").attr("hx-vals", `{"view":"${view}"}`);
$(".oh-btn--view-active").removeClass("oh-btn--view-active");
$(this).children("a").addClass("oh-btn--view-active");
}
$("#candidate-search").keyup(function (e) {
$(".candidate-view-type").attr(
"hx-vals",
`{"search":"${$(this).val()}"}`
);
});
$(".candidate-view-type").on("click", function (e) {
let view = $(this).attr("data-view");
var currentURL = window.location.href;
if (view != undefined) {
if (/\?view=[^&]+/.test(currentURL)) {
newURL = currentURL.replace(/\?view=[^&]+/, "?view=" + view);
} else {
var separator = currentURL.includes("?") ? "&" : "?";
newURL = currentURL + separator + "view=" + view;
}
history.pushState({}, "", newURL);
$("#candidate-search").attr("hx-vals", `{"view":"${view}"}`);
$("#filterForm").attr("hx-vals", `{"view":"${view}"}`);
$(".oh-btn--view-active").removeClass("oh-btn--view-active");
$(this).children("a").addClass("oh-btn--view-active");
}
});
$('#id_field').on('change', function () {
$('.filterButton')[0].click();
})
});
$('#id_field').on('change',function(){
$('.filterButton')[0].click();
})
});
</script>
<script src="{% static '/candidate/bulk.js' %}"></script>

View File

@@ -9,72 +9,42 @@
</form>
<script>
$("#skillform .col-md-6").toggleClass("col-md-6");
$(document).ready(function () {
const $candidateSelect = $("[name=candidate_id]");
const $managerSelect = $("[name=employee_id]");
const selectedManagers = $managerSelect.val();
$(document).ready(function(){
var candidate_id = $('[name=candidate_id]').val();
var selectedmanagers = $('[name=employee_id]').val();
function fetchManagers(candidateId, selected = null) {
if (!candidateId) return;
// Make AJAX request to fetch available Managers for the selected Candidate
$.ajax({
url: '{% url "get_managers" %}',
method: 'GET',
data: {
'cand_id': candidate_id
},
success: function(data) {
// Clear existing options in the Managers dropdown
$('[name=employee_id]').empty();
// Append new options based on the response
$.each(data.employees, function(key, value) {
$('[name=employee_id]').append($('<option>', {
value: key,
text: value
}));
$.ajax({
url: '{% url "get_managers" %}',
method: "GET",
data: { cand_id: candidateId },
success: function (data) {
$managerSelect.empty();
$.each(data.employees, function (key, value) {
$managerSelect.append(
$("<option>", {
value: key,
text: value,
})
);
});
if (selected) {
$managerSelect.val(selected);
}
},
});
}
// Set the selected Managers back to the dropdown
if (selectedmanagers) {
$('[name=employee_id]').val(selectedmanagers);
}
}
});
// Initial load
fetchManagers($candidateSelect.val(), selectedManagers);
})
$('[name=candidate_id]').change(function(){
var candidate_id = $('[name=candidate_id]').val();
var selectedmanagers = $('[name=employee_id]').val();
// Make AJAX request to fetch available Managers for the selected Candidate
$.ajax({
url: '{% url "get_managers" %}',
method: 'GET',
data: {
'cand_id': candidate_id
},
success: function(data) {
// Clear existing options in the Managers dropdown
$('[name=employee_id]').empty();
// Append new options based on the response
$.each(data.employees, function(key, value) {
$('[name=employee_id]').append($('<option>', {
value: key,
text: value
}));
});
// Set the selected Managers back to the dropdown
if (selectedmanagers) {
$('[name=employee_id]').val(selectedmanagers);
}
}
// On candidate change
$candidateSelect.on("change", function () {
fetchManagers(this.value, $managerSelect.val());
});
});
</script>

View File

@@ -1,73 +1,69 @@
{% load i18n %}{% load static %}
<div class="oh-dropdown__filter-body">
<div class="oh-dropdown__filter-body">
<div class="oh-accordion">
<div class="oh-accordion-header">{% trans "Recruitment" %}</div>
<div class="oh-accordion-body">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">{% trans "Managers" %}</label>
{{f.form.recruitment_managers}}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans "Start Date" %}</label>
{{f.form.start_date}}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans "Is Closed" %}</label>
{% comment %} {{f.form.closed}} {% endcomment %}
<select name="closed" id="closed" class="oh-select oh-select-2 w-100">
<option value="unknown">{% trans "Unknown" %}</option>
<option value="true">{% trans "True" %}</option>
<option value="false" selected>{% trans "False" %}</option>
</select>
</div>
<div class="oh-accordion-header">{% trans "Recruitment" %}</div>
<div class="oh-accordion-body">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label" for="{{f.form.recruitment_managers.id_for_label}}">{{f.form.recruitment_managers.label}}</label>
{{f.form.recruitment_managers}}
</div>
<div class="oh-input-group">
<label class="oh-label" for="{{f.form.start_date.id_for_label}}">{{f.form.start_date.label}}</label>
{{f.form.start_date}}
</div>
<div class="oh-input-group">
<label class="oh-label" for="{{f.form.closed.id_for_label}}">{{f.form.closed.label}}</label>
{% comment %} {{f.form.closed}} {% endcomment %}
{{f.form.closed}}
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label" for="{{f.form.company_id.id_for_label}}">{{f.form.company_id.label}}</label>
{{f.form.company_id}}
</div>
<div class="oh-input-group">
<label class="oh-label" for="{{f.form.end_date.id_for_label}}">{{f.form.end_date.label}}</label>
{{f.form.end_date}}
</div>
<div class="oh-input-group">
<label class="oh-label" for="{{f.form.is_published.id_for_label}}">{{f.form.is_published.label}}</label>
{{f.form.is_published}}
</div>
</div>
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">{% trans "Company" %}</label>
{{f.form.company_id}}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans "End Date" %}</label>
{{f.form.end_date}}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans "Is Published" %}</label>
{{f.form.is_published}}
</div>
</div>
</div>
</div>
</div>
<div class="oh-accordion">
<div class="oh-accordion-header">{% trans "Advanced" %}</div>
<div class="oh-accordion-body">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">{% trans "Start Date From" %}</label>
{{f.form.start_from}}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans "Is Active" %}?</label>
{{f.form.is_active}}
</div>
<div class="oh-accordion">
<div class="oh-accordion-header">{% trans "Advanced" %}</div>
<div class="oh-accordion-body">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label" for="{{f.form.start_from.id_for_label}}"> {{f.form.start_from.label}}</label>
{{f.form.start_from}}
</div>
<div class="oh-input-group">
<label class="oh-label" for="{{f.form.is_active.id_for_label}}">{{f.form.is_active.label}} ?</label>
{{f.form.is_active}}
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label" for="{{f.form.end_till.id_for_label}}">{{f.form.end_till.label}}</label>
{{f.form.end_till}}
</div>
</div>
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">{% trans "Till End Date" %}</label>
{{f.form.end_till}}
</div>
</div>
</div>
</div>
</div>
</div>
<div class="oh-dropdown__filter-footer">
<button class="oh-btn oh-btn--secondary oh-btn--small w-100 filterButton" id="">{% trans "Filter" %}</button>
<button class="oh-btn oh-btn--secondary oh-btn--small w-100 filterButton" id="">{% trans "Filter" %}</button>
</div>
</form>
<script src="{% static '/base/filter.js' %}"></script>
<script src="{% static '/base/filter.js' %}"></script>

View File

@@ -18,8 +18,7 @@
<ion-icon name="search-outline" class="oh-input-group__icon oh-input-group__icon--left"></ion-icon>
<input type="text" class="oh-input oh-input__icon" aria-label="Search Input"
placeholder="{% trans 'Search' %}" name="search" hx-get="{% url 'skill-zone-filter' %}"
onkeyup="$('.filterButton').click()"
/>
onkeyup="$('.filterButton').click()" />
</div>
<div class="oh-main__titlebar-button-container">
@@ -28,7 +27,8 @@
<ion-icon name="filter" class="mr-1"></ion-icon>{% trans "Filter" %}<div id="filterCount"></div>
</button>
<div class="oh-dropdown__menu oh-dropdown__menu--right oh-dropdown__filter p-4" x-show="open" style="display: none" @click.outside="open = false">
<div class="oh-dropdown__menu oh-dropdown__menu--right oh-dropdown__filter p-4" x-show="open"
style="display: none" @click.outside="open = false">
<div class="oh-dropdown__filter-body">
<div class="oh-accordion">
<div class="oh-accordion-header">{% trans "Candidate Filter" %}</div>
@@ -36,84 +36,92 @@
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">{% trans "Recruitment" %}</label>
<label class="oh-label"
for="{{f.form.candidate_id.id_for_label}}">{{f.form.candidate_id.label}}</label>
{{f.form.candidate_id}}
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label"
for="{{f.form.candidate_id__recruitment_id.id_for_label}}">{{f.form.candidate_id__recruitment_id.label}}</label>
{{f.form.candidate_id__recruitment_id}}
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">{% trans "Candidates" %}</label>
{{f.form.candidate_id}}
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">{% trans "Job Position" %}</label>
<label class="oh-label"
for="{{f.form.candidate_id__job_position_id.id_for_label}}">{{f.form.candidate_id__job_position_id.label}}</label>
{{f.form.candidate_id__job_position_id}}
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="col-sm-12 col-md-12 col-lg-6 mb-2">
<div class="oh-input-group">
<label class="oh-label">{% trans "Joining From" %}</label>
{{f.form.scheduled_from}}
<label class="oh-label"
for="{{f.form.candidate_id__rejected_candidate__reject_reason_id.id_for_label}}">
{% trans "Reject Reason" %}
</label>
{{f.form.candidate_id__rejected_candidate__reject_reason_id}}
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">{% trans "Joining Till" %}</label>
<label class="oh-label"
for="{{f.form.scheduled_from.id_for_label}}">{{f.form.scheduled_from.label}}</label>
{{f.form.scheduled_from}}
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label"
for="{{f.form.scheduled_till.id_for_label}}">{{f.form.scheduled_till.label}}</label>
{{f.form.scheduled_till}}
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">{% trans "Probation From" %}</label>
<label class="oh-label"
for="{{f.form.probation_end_from.id_for_label}}">{{f.form.probation_end_from.label}}</label>
{{f.form.probation_end_from}}
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">{% trans "Probation Till" %}</label>
<label class="oh-label"
for="{{f.form.probation_end_till.id_for_label}}">{{f.form.probation_end_till.label}}</label>
{{f.form.probation_end_till}}
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">{% trans "Portal Sent" %}</label>
<label class="oh-label"
for="{{f.form.portal_sent.id_for_label}}">{{f.form.portal_sent.label}}</label>
{{f.form.portal_sent}}
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">{% trans "Joining Set" %}</label>
<label class="oh-label"
for="{{f.form.joining_set.id_for_label}}">{{f.form.joining_set.label}}</label>
{{f.form.joining_set}}
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6 mb-2">
<div class="oh-input-group">
<label class="oh-label">{% trans "Reject Reason" %}</label>
{{f.form.candidate_id__rejected_candidate__reject_reason_id}}
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6 mb-2">
<div class="oh-input-group">
<label class="oh-label">{% trans "Offer Status" %}</label>
<label class="oh-label"
for="{{f.form.candidate_id__offer_letter_status.id_for_label}}">{{f.form.candidate_id__offer_letter_status.label}}</label>
{{f.form.candidate_id__offer_letter_status}}
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">{% trans "Is Active" %}</label>
<label class="oh-label"
for="{{f.form.is_active.id_for_label}}">{{f.form.is_active.label}}</label>
{{f.form.is_active}}
</div>
</div>
@@ -134,8 +142,9 @@
</form>
<div class="oh-btn-group ml-2">
<a class="oh-btn oh-btn--secondary oh-btn--shadow" data-toggle="oh-modal-toggle" data-target="#objectCreateModal"
hx-get="{% url 'skill-zone-create' %}" hx-target="#objectCreateModalTarget">
<a class="oh-btn oh-btn--secondary oh-btn--shadow" data-toggle="oh-modal-toggle"
data-target="#objectCreateModal" hx-get="{% url 'skill-zone-create' %}"
hx-target="#objectCreateModalTarget">
<ion-icon name="add-outline" class="me-1"></ion-icon>
{% trans "Create" %}
</a>

View File

@@ -1,41 +1,44 @@
{% load i18n %}{% load static %}
<div class="oh-dropdown__filter-body">
<div class="oh-dropdown__filter-body">
<div class="oh-accordion">
<div class="oh-accordion-header">{% trans "Stage" %}</div>
<div class="oh-accordion-body">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">{% trans "Recruitment Managers" %}</label>
{{f.form.recruitment_id__recruitment_managers}}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans "Recruitment" %}</label>
{{f.form.recruitment_id}}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans "Stage Type" %}</label>
{{f.form.stage_type}}
</div>
<div class="oh-accordion-header">{% trans "Stage" %}</div>
<div class="oh-accordion-body">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label"
for="{{f.form.recruitment_id__recruitment_managers.id_for_label}}">{{f.form.recruitment_id__recruitment_managers.label}}</label>
{{f.form.recruitment_id__recruitment_managers}}
</div>
<div class="oh-input-group">
<label class="oh-label"
for="{{f.form.recruitment_id.id_for_label}}">{{f.form.recruitment_id.label}}</label>
{{f.form.recruitment_id}}
</div>
<div class="oh-input-group">
<label class="oh-label"
for="{{f.form.stage_type.id_for_label}}">{{f.form.stage_type.label}}</label>
{{f.form.stage_type}}
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label"
for="{{f.form.stage_managers.id_for_label}}">{{f.form.stage_managers.label}}</label>
{{f.form.stage_managers}}
</div>
<div class="oh-input-group">
<label class="oh-label"
for="{{f.form.recruitment_id__company_id.id_for_label}}">{{f.form.recruitment_id__company_id.label}}</label>
{{f.form.recruitment_id__company_id}}
</div>
</div>
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group">
<label class="oh-label">{% trans "Stage Managers" %}</label>
{{f.form.stage_managers}}
</div>
<div class="oh-input-group">
<label class="oh-label">{% trans "Company" %}</label>
{{f.form.recruitment_id__company_id}}
</div>
</div>
</div>
</div>
</div>
</div>
<div class="oh-dropdown__filter-footer">
<button class="oh-btn oh-btn--secondary oh-btn--small w-100 filterButton" id="">{% trans "Filter" %}</button>
<button class="oh-btn oh-btn--secondary oh-btn--small w-100 filterButton" id="">{% trans "Filter" %}</button>
</div>
<script src="{% static '/base/filter.js' %}"></script>
<script src="{% static '/base/filter.js' %}"></script>

View File

@@ -87,7 +87,7 @@
></ion-icon>
</span>
</button>
<span class="oh-permission-table__user">{{stage}}</span>
<span class="oh-permission-table__user">{{stage.stage}}</span>
</div>
</div>
<div data-cell-index="1" class="oh-sticky-table__td">

View File

@@ -1500,7 +1500,7 @@ def interview_employee_remove(request, interview_id, employee_id):
interview.employee_id.remove(employee_id)
messages.success(request, "Interviewer removed succesfully.")
interview.save()
return redirect(interview_filter_view)
return HttpResponse("<script>$('.filterButton')[0].click()</script>")
@login_required
@@ -2620,7 +2620,9 @@ def open_recruitments(request):
"""
This method is used to render the open recruitment page
"""
recruitments = Recruitment.default.filter(closed=False, is_published=True)
recruitments = Recruitment.default.filter(
closed=False, is_published=True, is_active=True
)
context = {
"recruitments": recruitments,
}