[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 import django_filters
from django import forms from django import forms
from django.utils.translation import gettext_lazy as _
from base.filters import FilterSet from base.filters import FilterSet
from recruitment.models import ( from recruitment.models import (
@@ -169,9 +170,57 @@ class CandidateFilter(FilterSet):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.form.fields["is_active"].initial = True
for field in self.form.fields.keys(): form_fields = self.form.fields
self.form.fields[field].widget.attrs["id"] = f"{uuid.uuid4()}" 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): def filter_mail_sent(self, queryset, name, value):
return queryset.filter(onboarding_portal__isnull=(not value)) return queryset.filter(onboarding_portal__isnull=(not value))
@@ -246,6 +295,13 @@ class RecruitmentFilter(FilterSet):
"open_positions", "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): def filter_by_name(self, queryset, _, value):
""" """
Filter queryset by first name or last name. Filter queryset by first name or last name.
@@ -474,6 +530,7 @@ class SkillZoneCandFilter(FilterSet):
field_name="candidate__id__joining_date", field_name="candidate__id__joining_date",
lookup_expr="gte", lookup_expr="gte",
widget=forms.DateInput(attrs={"type": "date"}), widget=forms.DateInput(attrs={"type": "date"}),
label=_("Joining From"),
) )
probation_end = django_filters.DateFilter( probation_end = django_filters.DateFilter(
field_name="candidate__id__probation_end", field_name="candidate__id__probation_end",
@@ -483,11 +540,13 @@ class SkillZoneCandFilter(FilterSet):
field_name="candidate__id__probation_end", field_name="candidate__id__probation_end",
lookup_expr="lte", lookup_expr="lte",
widget=forms.DateInput(attrs={"type": "date"}), widget=forms.DateInput(attrs={"type": "date"}),
label=_("Probation Till"),
) )
probation_end_from = django_filters.DateFilter( probation_end_from = django_filters.DateFilter(
field_name="candidate__id__probation_end", field_name="candidate__id__probation_end",
lookup_expr="gte", lookup_expr="gte",
widget=forms.DateInput(attrs={"type": "date"}), widget=forms.DateInput(attrs={"type": "date"}),
label=_("Probation From"),
) )
schedule_date = django_filters.DateFilter( schedule_date = django_filters.DateFilter(
field_name="candidate__id__schedule_date", field_name="candidate__id__schedule_date",
@@ -497,6 +556,7 @@ class SkillZoneCandFilter(FilterSet):
field_name="candidate__id__joining_date", field_name="candidate__id__joining_date",
lookup_expr="lte", lookup_expr="lte",
widget=forms.DateInput(attrs={"type": "date"}), widget=forms.DateInput(attrs={"type": "date"}),
label=_("Joining Till"),
) )
recruitment = django_filters.CharFilter( recruitment = django_filters.CharFilter(
field_name="candidate__id__recruitment_id__title", lookup_expr="icontains" field_name="candidate__id__recruitment_id__title", lookup_expr="icontains"
@@ -506,11 +566,13 @@ class SkillZoneCandFilter(FilterSet):
field_name="candidate__id__onboarding_portal", field_name="candidate__id__onboarding_portal",
method="filter_mail_sent", method="filter_mail_sent",
widget=django_filters.widgets.BooleanWidget(), widget=django_filters.widgets.BooleanWidget(),
label=_("Portal Sent"),
) )
joining_set = django_filters.BooleanFilter( joining_set = django_filters.BooleanFilter(
field_name="candidate__id__joining_date", field_name="candidate__id__joining_date",
method="filter_joining_set", method="filter_joining_set",
widget=django_filters.widgets.BooleanWidget(), widget=django_filters.widgets.BooleanWidget(),
label=_("Joining Set"),
) )
class Meta: class Meta:
@@ -583,10 +645,6 @@ class InterviewFilter(FilterSet):
lookup_expr="gte", lookup_expr="gte",
widget=forms.DateInput(attrs={"type": "date"}), 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( scheduled_till = django_filters.DateFilter(
field_name="interview_date", field_name="interview_date",
lookup_expr="lte", lookup_expr="lte",
@@ -603,40 +661,17 @@ class InterviewFilter(FilterSet):
"candidate_id", "candidate_id",
"employee_id", "employee_id",
"interview_date", "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): class LinkedInAccountFilter(FilterSet):
"""LinkedInAccount filter""" """LinkedInAccount filter"""

View File

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

View File

@@ -104,11 +104,11 @@ x-data="{searchShow: false}"
style="display: none" style="display: none"
> >
<div class="oh-accordion"> <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="row">
<div class="col-sm-12 col-md-12 col-lg-6"> <div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group"> <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> </div>
<div class="col-sm-12 col-md-12 col-lg-6"> <div class="col-sm-12 col-md-12 col-lg-6">

View File

@@ -1,205 +1,252 @@
{% load static %} {% load i18n %} {% load static %} {% load i18n %}
<div class="oh-modal__dialog-header"> <div class="oh-modal__dialog-header">
<h2 class="oh-modal__dialog-title" id="candidateExportLavel"> <h2 class="oh-modal__dialog-title" id="candidateExportLavel">
{% trans "Export Candidates" %} {% trans "Export Candidates" %}
</h2> </h2>
<button class="oh-modal__close" aria-label="Close"> <button class="oh-modal__close" aria-label="Close">
<ion-icon name="close-outline"></ion-icon> <ion-icon name="close-outline"></ion-icon>
</button> </button>
</div> </div>
<div class="oh-modal__dialog-body"> <div class="oh-modal__dialog-body">
<form <form action="{%url 'candidate-info-export' %}" method="get" class="oh-profile-section"
action="{%url 'candidate-info-export' %}" onsubmit="event.stopPropagation();$(this).parents().find('.oh-modal--show').last().toggleClass('oh-modal--show');"
method="get" id="candidateExportForm">
class="oh-profile-section" {% csrf_token %}
onsubmit="event.stopPropagation();$(this).parents().find('.oh-modal--show').last().toggleClass('oh-modal--show');" <div class="oh-dropdown__filter-body" id="">
id="candidateExportForm" <div class="oh-accordion">
> <div class="oh-accordion-header">{% trans "Excel columns" %}</div>
{% csrf_token %} <div class="oh-accordion-body">
<div class="oh-dropdown__filter-body" id="export_attendance_form"> <div class="row">
<div class="oh-accordion"> <div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-accordion-header">{% trans "Excel columns" %}</div> <div class="oh-input-group">
<div class="oh-accordion-body"> <label class="oh-label">
<div class="row"> <input type="checkbox" id="select-all-fields" /> {% trans "Select All" %}
<div class="col-sm-12 col-md-12 col-lg-6"> </label>
<div class="oh-input-group"> </div>
<label class="oh-label"> </div>
<input type="checkbox" id="select-all-fields" /> {% trans "Select All" %} </div>
</label> <div class="row">
</div> {% 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> <div class="oh-dropdown__filter-body">
<div class="row"> <div class="oh-accordion">
{% for field in export_column.selected_fields %} <div class="oh-accordion-header">{% trans "Candidates" %}</div>
<div class="col-sm-12 col-md-12 col-lg-6"> <div class="oh-accordion-body">
<div class="oh-input-group"> <div class="row">
<label class="oh-label"> {{ field }} </label> <div class="col-sm-12 col-md-12 col-lg-12">
</div> <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> </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>
<div class="oh-accordion"> <div class="oh-modal__dialog-footer p-0 mt-3">
<div class="oh-accordion-header">{% trans "Advanced" %}</div> <button type="submit" class="oh-btn oh-btn--secondary oh-btn--shadow">
<div class="oh-accordion-body"> {% trans "Export" %}
<div class="row"> </button>
<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> </div>
</div> </form>
</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>
</div> </div>

View File

@@ -2,169 +2,200 @@
{% load static %} {% load static %}
<input type="hidden" name="search" id="filterSearch" /> <input type="hidden" name="search" id="filterSearch" />
<div class="oh-dropdown__filter-body"> <div class="oh-dropdown__filter-body">
<div class="oh-accordion"> <div class="oh-accordion">
<div class="oh-accordion-header"> <div class="oh-accordion-header">
{% trans 'Candidates' %} {% trans 'Candidates' %}
</div> </div>
<div class="oh-accordion-body"> <div class="oh-accordion-body">
<div class="row"> <div class="row">
<div class="col-sm-12 col-md-12 col-lg-6"> <div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group"> <div class="oh-input-group">
<label class="oh-label">{% trans 'Phone' %}</label> <label class="oh-label" for="{{f.form.mobile.id_for_label}}">{{f.form.mobile.label}}</label>
{{ f.form.mobile }} {{ f.form.mobile }}
</div> </div>
<div class="oh-input-group"> <div class="oh-input-group">
<label class="oh-label">{% trans 'Interview Date' %}</label> <label class="oh-label"
{{ f.form.interview_date }} for="{{f.form.interview_date.id_for_label}}">{{f.form.interview_date.label}}</label>
</div> {{ f.form.interview_date }}
<div class="oh-input-group"> </div>
<label class="oh-label">{% trans 'Country' %}</label> <div class="oh-input-group">
<select name="country" class="oh-select-2 w-100 country" id="country"> <label class="oh-label" for="country">{{f.form.country.label}}</label>
</select> <select name="country" class="oh-select-2 w-100 country" id="country">
</div> </select>
<div class="oh-input-group"> </div>
<label class="oh-label">{% trans 'Is Hired' %}?</label> <div class="oh-input-group">
{{ f.form.hired }} <label class="oh-label" for="{{f.form.hired.id_for_label}}">{{f.form.hired.label}} ?</label>
</div> {{ f.form.hired }}
<div class="col-sm-12 col-md-12 col-lg-12 mb-2"> </div>
<div class="oh-input-group"> <div class="col-sm-12 col-md-12 col-lg-12 mb-2">
<label class="oh-label">{% trans "Reject Reason" %}</label> <div class="oh-input-group">
{{f.form.rejected_candidate__reject_reason_id}} <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>
<div class="oh-input-group"> </div>
<label class="oh-label">{% trans 'Is Converted' %}?</label> </div>
{{ f.form.converted }} <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> </div>
<div class="col-sm-12 col-md-12 col-lg-6"> </div>
<div class="oh-input-group">
<label class="oh-label">{% trans 'Email' %}</label>
{{ f.form.email }}
</div>
<div class="oh-input-group"> <div class="oh-accordion">
<label class="oh-label">{% trans 'Gender' %}</label> <div class="oh-accordion-header">
{{ f.form.gender }} {% trans 'Advanced' %}
</div> </div>
<div class="oh-accordion-body">
<div class="oh-input-group"> <div class="row">
<label class="oh-label">{% trans 'State' %}</label> <div class="col-sm-12 col-md-12 col-lg-6">
<select name="state" class="oh-select-2 w-100 country" id="state"> <div class="oh-input-group">
</select> <label class="oh-label"
</div> for="{{f.form.scheduled_from.id_for_label}}">{{f.form.scheduled_from.label}} </label>
{{ f.form.scheduled_from }}
<div class="oh-input-group"> </div>
<label class="oh-label">{% trans 'Is Canceled' %}?</label> <div class="oh-input-group">
{{ f.form.canceled }} <label class="oh-label" for="{{f.form.is_active.id_for_label}}">{{f.form.is_active.label}}
</div> ?</label>
<div class="col-sm-12 col-md-12 col-lg-12 mb-2"> {{ f.form.is_active }}
<div class="oh-input-group"> </div>
<label class="oh-label">{% trans "Offer Status" %}</label> </div>
{{f.form.offer_letter_status}} <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> </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>
<div class="oh-dropdown__filter-footer"> <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> </div>
<script src="{% static '/base/filter.js' %}"></script> <script src="{% static '/base/filter.js' %}"></script>
<script> <script>
{% include "country.js" %} {% include "country.js" %}
</script> </script>

View File

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

View File

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

View File

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

View File

@@ -1,73 +1,69 @@
{% load i18n %}{% load static %} {% load i18n %}{% load static %}
<div class="oh-dropdown__filter-body"> <div class="oh-dropdown__filter-body">
<div class="oh-accordion"> <div class="oh-accordion">
<div class="oh-accordion-header">{% trans "Recruitment" %}</div> <div class="oh-accordion-header">{% trans "Recruitment" %}</div>
<div class="oh-accordion-body"> <div class="oh-accordion-body">
<div class="row"> <div class="row">
<div class="col-sm-12 col-md-12 col-lg-6"> <div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group"> <div class="oh-input-group">
<label class="oh-label">{% trans "Managers" %}</label> <label class="oh-label" for="{{f.form.recruitment_managers.id_for_label}}">{{f.form.recruitment_managers.label}}</label>
{{f.form.recruitment_managers}} {{f.form.recruitment_managers}}
</div> </div>
<div class="oh-input-group"> <div class="oh-input-group">
<label class="oh-label">{% trans "Start Date" %}</label> <label class="oh-label" for="{{f.form.start_date.id_for_label}}">{{f.form.start_date.label}}</label>
{{f.form.start_date}} {{f.form.start_date}}
</div> </div>
<div class="oh-input-group"> <div class="oh-input-group">
<label class="oh-label">{% trans "Is Closed" %}</label> <label class="oh-label" for="{{f.form.closed.id_for_label}}">{{f.form.closed.label}}</label>
{% comment %} {{f.form.closed}} {% endcomment %} {% comment %} {{f.form.closed}} {% endcomment %}
<select name="closed" id="closed" class="oh-select oh-select-2 w-100"> {{f.form.closed}}
<option value="unknown">{% trans "Unknown" %}</option> </div>
<option value="true">{% trans "True" %}</option> </div>
<option value="false" selected>{% trans "False" %}</option> <div class="col-sm-12 col-md-12 col-lg-6">
</select> <div class="oh-input-group">
</div> <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>
<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>
<div class="oh-accordion"> <div class="oh-accordion">
<div class="oh-accordion-header">{% trans "Advanced" %}</div> <div class="oh-accordion-header">{% trans "Advanced" %}</div>
<div class="oh-accordion-body"> <div class="oh-accordion-body">
<div class="row"> <div class="row">
<div class="col-sm-12 col-md-12 col-lg-6"> <div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group"> <div class="oh-input-group">
<label class="oh-label">{% trans "Start Date From" %}</label> <label class="oh-label" for="{{f.form.start_from.id_for_label}}"> {{f.form.start_from.label}}</label>
{{f.form.start_from}} {{f.form.start_from}}
</div> </div>
<div class="oh-input-group"> <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}} {{f.form.is_active}}
</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.end_till.id_for_label}}">{{f.form.end_till.label}}</label>
{{f.form.end_till}}
</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 "Till End Date" %}</label>
{{f.form.end_till}}
</div>
</div>
</div>
</div> </div>
</div>
</div> </div>
<div class="oh-dropdown__filter-footer"> <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> </div>
</form> </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> <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" <input type="text" class="oh-input oh-input__icon" aria-label="Search Input"
placeholder="{% trans 'Search' %}" name="search" hx-get="{% url 'skill-zone-filter' %}" placeholder="{% trans 'Search' %}" name="search" hx-get="{% url 'skill-zone-filter' %}"
onkeyup="$('.filterButton').click()" onkeyup="$('.filterButton').click()" />
/>
</div> </div>
<div class="oh-main__titlebar-button-container"> <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> <ion-icon name="filter" class="mr-1"></ion-icon>{% trans "Filter" %}<div id="filterCount"></div>
</button> </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-dropdown__filter-body">
<div class="oh-accordion"> <div class="oh-accordion">
<div class="oh-accordion-header">{% trans "Candidate Filter" %}</div> <div class="oh-accordion-header">{% trans "Candidate Filter" %}</div>
@@ -36,84 +36,92 @@
<div class="row"> <div class="row">
<div class="col-sm-12 col-md-12 col-lg-6"> <div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group"> <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}} {{f.form.candidate_id__recruitment_id}}
</div> </div>
</div> </div>
<div class="col-sm-12 col-md-12 col-lg-6"> <div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group"> <div class="oh-input-group">
<label class="oh-label">{% trans "Candidates" %}</label> <label class="oh-label"
{{f.form.candidate_id}} for="{{f.form.candidate_id__job_position_id.id_for_label}}">{{f.form.candidate_id__job_position_id.label}}</label>
</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>
{{f.form.candidate_id__job_position_id}} {{f.form.candidate_id__job_position_id}}
</div> </div>
</div> </div>
<div class="col-sm-12 col-md-12 col-lg-6 mb-2">
<div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group"> <div class="oh-input-group">
<label class="oh-label">{% trans "Joining From" %}</label> <label class="oh-label"
{{f.form.scheduled_from}} 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> </div>
<div class="col-sm-12 col-md-12 col-lg-6"> <div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group"> <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}} {{f.form.scheduled_till}}
</div> </div>
</div> </div>
<div class="col-sm-12 col-md-12 col-lg-6"> <div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group"> <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}} {{f.form.probation_end_from}}
</div> </div>
</div> </div>
<div class="col-sm-12 col-md-12 col-lg-6"> <div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group"> <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}} {{f.form.probation_end_till}}
</div> </div>
</div> </div>
<div class="col-sm-12 col-md-12 col-lg-6"> <div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group"> <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}} {{f.form.portal_sent}}
</div> </div>
</div> </div>
<div class="col-sm-12 col-md-12 col-lg-6"> <div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group"> <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}} {{f.form.joining_set}}
</div> </div>
</div> </div>
<div class="col-sm-12 col-md-12 col-lg-6 mb-2"> <div class="col-sm-12 col-md-12 col-lg-6 mb-2">
<div class="oh-input-group"> <div class="oh-input-group">
<label class="oh-label">{% trans "Reject Reason" %}</label> <label class="oh-label"
{{f.form.candidate_id__rejected_candidate__reject_reason_id}} for="{{f.form.candidate_id__offer_letter_status.id_for_label}}">{{f.form.candidate_id__offer_letter_status.label}}</label>
</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>
{{f.form.candidate_id__offer_letter_status}} {{f.form.candidate_id__offer_letter_status}}
</div> </div>
</div> </div>
<div class="col-sm-12 col-md-12 col-lg-6"> <div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group"> <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}} {{f.form.is_active}}
</div> </div>
</div> </div>
@@ -134,8 +142,9 @@
</form> </form>
<div class="oh-btn-group ml-2"> <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" <a class="oh-btn oh-btn--secondary oh-btn--shadow" data-toggle="oh-modal-toggle"
hx-get="{% url 'skill-zone-create' %}" hx-target="#objectCreateModalTarget"> data-target="#objectCreateModal" hx-get="{% url 'skill-zone-create' %}"
hx-target="#objectCreateModalTarget">
<ion-icon name="add-outline" class="me-1"></ion-icon> <ion-icon name="add-outline" class="me-1"></ion-icon>
{% trans "Create" %} {% trans "Create" %}
</a> </a>

View File

@@ -1,41 +1,44 @@
{% load i18n %}{% load static %} {% load i18n %}{% load static %}
<div class="oh-dropdown__filter-body"> <div class="oh-dropdown__filter-body">
<div class="oh-accordion"> <div class="oh-accordion">
<div class="oh-accordion-header">{% trans "Stage" %}</div> <div class="oh-accordion-header">{% trans "Stage" %}</div>
<div class="oh-accordion-body"> <div class="oh-accordion-body">
<div class="row"> <div class="row">
<div class="col-sm-12 col-md-12 col-lg-6"> <div class="col-sm-12 col-md-12 col-lg-6">
<div class="oh-input-group"> <div class="oh-input-group">
<label class="oh-label">{% trans "Recruitment Managers" %}</label> <label class="oh-label"
{{f.form.recruitment_id__recruitment_managers}} for="{{f.form.recruitment_id__recruitment_managers.id_for_label}}">{{f.form.recruitment_id__recruitment_managers.label}}</label>
</div> {{f.form.recruitment_id__recruitment_managers}}
<div class="oh-input-group"> </div>
<label class="oh-label">{% trans "Recruitment" %}</label> <div class="oh-input-group">
{{f.form.recruitment_id}} <label class="oh-label"
</div> for="{{f.form.recruitment_id.id_for_label}}">{{f.form.recruitment_id.label}}</label>
<div class="oh-input-group"> {{f.form.recruitment_id}}
<label class="oh-label">{% trans "Stage Type" %}</label> </div>
{{f.form.stage_type}} <div class="oh-input-group">
</div> <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>
<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> </div>
<div class="oh-dropdown__filter-footer"> <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> </div>
<script src="{% static '/base/filter.js' %}"></script> <script src="{% static '/base/filter.js' %}"></script>

View File

@@ -87,7 +87,7 @@
></ion-icon> ></ion-icon>
</span> </span>
</button> </button>
<span class="oh-permission-table__user">{{stage}}</span> <span class="oh-permission-table__user">{{stage.stage}}</span>
</div> </div>
</div> </div>
<div data-cell-index="1" class="oh-sticky-table__td"> <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) interview.employee_id.remove(employee_id)
messages.success(request, "Interviewer removed succesfully.") messages.success(request, "Interviewer removed succesfully.")
interview.save() interview.save()
return redirect(interview_filter_view) return HttpResponse("<script>$('.filterButton')[0].click()</script>")
@login_required @login_required
@@ -2620,7 +2620,9 @@ def open_recruitments(request):
""" """
This method is used to render the open recruitment page 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 = { context = {
"recruitments": recruitments, "recruitments": recruitments,
} }