You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1130 lines
58 KiB
1130 lines
58 KiB
{% extends 'partials/base.html' %}
|
|
|
|
{% load specializtions_tags %}
|
|
{% load thumbnail %}
|
|
|
|
{% block content %}
|
|
{% include 'partials/modals/project_selection.html' %}
|
|
{% include 'partials/header.html' %}
|
|
|
|
<div class="container mainScore mainBlock2">
|
|
<div class="row">
|
|
<div class="col-lg-12">
|
|
<div class="col-lg-3 divCol3">
|
|
<div class="avatar">
|
|
<div class="avatarInset">
|
|
{% if contractor.avatar %}
|
|
{% thumbnail contractor.avatar "235x224" crop="center" as im %}
|
|
<img src="{{ im.url }}" alt="profile-image">
|
|
{% endthumbnail %}
|
|
{% else %}
|
|
{% if contractor.gender == "female" %}
|
|
<img src="{% static 'img/avatars/avatar-female.jpg' %}"
|
|
alt="profile-image">
|
|
{% else %}
|
|
<img src="{% static 'img/avatars/avatar-male.jpg' %}"
|
|
alt="profile-image">
|
|
{% endif %}
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
<div class="menuUser disTab">
|
|
<ul>
|
|
{% if contractor.pk == request.user.pk %}
|
|
<li class="icon_um1">
|
|
<a href="{% url 'users:user-profile-edit' pk=contractor.pk %}">
|
|
редактировать профиль
|
|
</a>
|
|
<span></span>
|
|
</li>
|
|
{% endif %}
|
|
|
|
{% if display_team_invitation_button %}
|
|
<li class="icon_um2 -team-invitation-parent">
|
|
<a href="#" onclick="return false" class='-team-invitation'>
|
|
пригласить в группу
|
|
</a>
|
|
<span></span>
|
|
</li>
|
|
{% endif %}
|
|
|
|
{% if contractor.pk != request.user.pk %}
|
|
<li class="icon_um3">
|
|
<a href="{% url 'chat:chat-user' %}?user_id={{ contractor.pk }}#user{{ contractor.pk }}">
|
|
написать сообщение
|
|
</a>
|
|
<span></span>
|
|
</li>
|
|
{% endif %}
|
|
|
|
{% if request.user.is_customer %}
|
|
<li class="icon_um4">
|
|
<a
|
|
href="#"
|
|
onclick="return false"
|
|
data-contractor-id="{{ contractor.pk }}"
|
|
data-toggle="modal"
|
|
data-target="#projectSelectionModal">
|
|
предложить заказ
|
|
</a>
|
|
<span></span>
|
|
</li>
|
|
{% endif %}
|
|
</ul>
|
|
|
|
{% if contractor.teams.exists %}
|
|
<div>Является членом групп:</div>
|
|
|
|
<ul>
|
|
{% for team in contractor.teams.all %}
|
|
<li>
|
|
<a href="{% url 'users:team-profile' pk=team.pk %}">{{ team.name }}</a><span></span>
|
|
</li>
|
|
{% endfor %}
|
|
</ul>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
<div class="col-lg-9 divCol9">
|
|
<div class="col-lg-4">
|
|
<p class="nameUser">
|
|
{{ contractor.get_full_name }} [{{ contractor.username }}]
|
|
</p>
|
|
|
|
<p class="cityUser">{{ contractor.get_location }}</p>
|
|
<p class="navv">На сайте c {{ contractor.created|date:"d M Y" }}</p>
|
|
|
|
{% if contractor.contractor_status == 'free' %}
|
|
<div class="statusUser">Свободен</div>
|
|
{% else %}
|
|
<div class="statusUser busy">Занят</div>
|
|
{% endif %}
|
|
|
|
{% if request.user.is_authenticated %}
|
|
<a href="#" data-toggle="modal" data-target="#contact-contactor-modal" class="showCon">показать
|
|
контакты</a>
|
|
{% endif %}
|
|
</div>
|
|
<div class="col-lg-4">
|
|
{% specialization_widget contractor.pk %}
|
|
</div>
|
|
<div class="col-lg-4">
|
|
{% ratings_widget contractor.pk %}
|
|
|
|
{% if contractor.cro %}
|
|
<div class="sroUser">
|
|
<div class="iconSRO"></div>
|
|
<p>Есть допуск СРО</p>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
|
|
<div id="contact-contactor-modal" class="modal fade">
|
|
<div class="modal-dialog">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<button type="button" class="close" data-dismiss="modal"
|
|
aria-hidden="true">×</button>
|
|
<h4 class="modal-title">Контакты владельца </h4>
|
|
</div>
|
|
<div class="modal-body">
|
|
<div class="row" style="height: 180px;">
|
|
<div class="col-lg-8 col-lg-offset-1">
|
|
<ul class="list-summ">
|
|
{% if contractor.website %}
|
|
<li>{{ contractor.website }}</li>
|
|
{% endif %}
|
|
|
|
<li>{{ contractor.email }}</li>
|
|
|
|
{% if contractor.skype %}
|
|
<li>{{ contractor.skype }}</li>
|
|
{% endif %}
|
|
|
|
{% if contractor.phone %}
|
|
<li>{{ contractor.phone }}</li>
|
|
{% endif %}
|
|
|
|
{% if contractor.phone2 %}
|
|
<li>{{ contractor.phone2 }}</li>
|
|
{% endif %}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-lg-9">
|
|
<div class="profileTabs2">
|
|
<ul class="nav nav-tabs nav-justified">
|
|
<li role="presentation" class="active">
|
|
<a href="#tab11" data-toggle="tab">Портфолио</a>
|
|
</li>
|
|
<li role="presentation">
|
|
<a href="#tab12" data-toggle="tab">Готовые проекты</a>
|
|
</li>
|
|
<li role="presentation">
|
|
<a href="#tab13" data-toggle="tab">Резюме / Квалификация</a>
|
|
</li>
|
|
<li role="presentation">
|
|
<a href="#tab14" data-toggle="tab">Отзывы</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div class="tab-content">
|
|
<div id="tab11" class="tab-pane fade in active">
|
|
{% if contractor.pk == request.user.pk %}
|
|
<div class="col-lg-9">
|
|
<p class="addWork">
|
|
{# <a href="#" data-toggle="modal" data-target="#portfolio-modal">Добавить работу</a>#}
|
|
<a href="{% url 'projects:contractor-portfolio-create' %}" >Добавить работу</a>
|
|
</p>
|
|
</div>
|
|
|
|
<div id="portfolio-modal" class="modal fade">
|
|
<div class="modal-dialog" style="width:900px;">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<button type="button" class="close" data-dismiss="modal"
|
|
aria-hidden="true">×</button>
|
|
<h4 class="modal-title">Добавить портфолио</h4>
|
|
</div>
|
|
|
|
{% include 'portfolio_create_form.html' %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<div class="galleryWork2 disTab -portfolios-container">
|
|
<script type="text/x-template" class="-portfolio-item-templ">
|
|
<div class="col-lg-4">
|
|
<div class="insetCol box-sizing disTab">
|
|
<div class="imgGal"
|
|
style="background:rgba(0, 0, 0, 0) url('<%- portfolio.photos[0] && portfolio.photos[0].img %>') no-repeat scroll center center / cover">
|
|
<a class="open-modal-image"
|
|
href="<%- portfolio.photos[0] && portfolio.photos[0].img %>">
|
|
<div class="imgFigure"></div>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="insetCol2 box-sizing disTab">
|
|
<a href="<%- portfAbsUrl %>"><%- trunc({length: 50}, portfolio.name) %></a>
|
|
|
|
<% if (authedContractorId === contractorId) { %>
|
|
<div class="buttonsImg" disTab>
|
|
<a href="<%- portfEditUrl %>">
|
|
<div class="insetBI insetBI1">
|
|
<i class="fa fa-pencil"></i>
|
|
</div>
|
|
</a>
|
|
<div class="insetBI insetBI2">
|
|
<form action="<%- portfTrashUrl %>" method="POST" novalidate>
|
|
{% csrf_token %}
|
|
<input type="hidden" name="next" value="{{ request.path }}">
|
|
<a href="#"
|
|
onclick="$(this).closest('form').submit(); return false"><i
|
|
class="fa fa-times"></i></a>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
<% } %>
|
|
</div>
|
|
</div>
|
|
</script>
|
|
</div>
|
|
|
|
<div class="col-lg-9 col-lg-offset-3 -more-portfolios-btn">
|
|
<div class="linkElse">
|
|
<a href="#" onclick="loadMorePortfolios(); return false" class="showElse">показать
|
|
еще</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="tab12" class="tab-pane fade">
|
|
{% if contractor.pk == request.user.pk %}
|
|
<div class="col-lg-9">
|
|
<p class="addWork">
|
|
<a href="{% url 'work_sell:create' %}">Добавить проект</a>
|
|
</p>
|
|
</div>
|
|
{# <div id="worksell-modal" class="modal fade">#}
|
|
{# <div class="modal-dialog" style="width: 900px;">#}
|
|
{# <div class="modal-content">#}
|
|
{# <div class="modal-header">#}
|
|
{# <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>#}
|
|
{# <h4 class="modal-title">Добавить готовую работу</h4>#}
|
|
{# </div>#}
|
|
{##}
|
|
{# {% include 'worksell_create_form.html' %}#}
|
|
{# </div>#}
|
|
{# </div>#}
|
|
{# </div>#}
|
|
{% endif %}
|
|
|
|
<div class="galleryWork2 disTab -work-sells-container">
|
|
<script type="text/x-template" class="-work-sell-item-templ">
|
|
<div class="col-lg-4">
|
|
<div class="insetCol box-sizing disTab">
|
|
<a href="#">
|
|
<div class="imgGal"
|
|
style="background:rgba(0, 0, 0, 0) url('<%- workSell.photos[0] && workSell.photos[0].img %>') no-repeat scroll center center / cover">
|
|
<a class="open-modal-image"
|
|
href="<%- workSell.photos[0] && workSell.photos[0].img %>">
|
|
<div class="imgFigure"></div>
|
|
</a>
|
|
</div>
|
|
</a>
|
|
|
|
<div class="cenaImg box-sizing">
|
|
<div class="cenaImgInset">
|
|
<%- workSell.budget %> <i class="fa fa-rub"></i>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="insetCol2 box-sizing disTab">
|
|
<a href="<%- workSellAbsUrl %>"><%- trunc({length: 50}, workSell.name) %></a>
|
|
|
|
<% if (authedContractorId === contractorId) { %>
|
|
<div class="buttonsImg" disTab>
|
|
<div class="insetBI insetBI1">
|
|
<a href="<%- workSellEditUrl %>">
|
|
<i class="fa fa-pencil"></i>
|
|
</a>
|
|
</div>
|
|
<div class="insetBI insetBI2">
|
|
<form action="<%- workSellTrashUrl %>" method="POST" novalidate>
|
|
{% csrf_token %}
|
|
<input type="hidden" name="next" value="{{ request.path }}">
|
|
<a href="#"
|
|
onclick="$(this).closest('form').submit(); return false"><i
|
|
class="fa fa-times"></i></a>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
<% } %>
|
|
</div>
|
|
</div>
|
|
</script>
|
|
</div>
|
|
|
|
<div class="col-lg-9 col-lg-offset-3 -more-work-sells-btn">
|
|
<div class="linkElse">
|
|
<a href="#" onclick="loadMoreWorkSells(); return false" class="showElse">показать
|
|
еще</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div id="tab13" class="tab-pane fade">
|
|
<div class="col-lg-9">
|
|
{% if contractor == request.user %}
|
|
<div class="col-lg-12 resume">
|
|
<form enctype="multipart/form-data">
|
|
<input type="hidden" name="text" value="Hello">
|
|
|
|
<div class="upload2 up-l1">
|
|
<input type="file" name="upload" id="upload-resume">
|
|
<p>Загрузить резюме</p>
|
|
</div>
|
|
|
|
<div class="upload2 up-l2" id="remove-resume-file"
|
|
style="display:{% if contractor.contractor_resume.resume_file %}block;{% else %}none;{% endif %}">
|
|
<p style="margin:0;">Удалить резюме</p>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<div class="col-lg-12 resume-block">
|
|
<div class="block-is box-sizing">
|
|
<div class="block-i">
|
|
{% thumbnail contractor.avatar "176x160" crop="center" as im %}
|
|
<img src="{{ im.url }}" alt="profile-image">
|
|
{% endthumbnail %}
|
|
</div>
|
|
</div>
|
|
<div class="col-lg-9">
|
|
<div class="top-summary">
|
|
<p class="name-summ">{{ contractor.get_full_name }}</p>
|
|
<div id="resume-success"></div>
|
|
|
|
{% if contractor.contractor_resume.resume_file %}
|
|
<a style="display:block;"
|
|
href="{{ contractor.contractor_resume.resume_file.url }}"
|
|
class="download-summ">
|
|
скачать резюме
|
|
</a>
|
|
{% endif %}
|
|
|
|
<p class="who-summ">
|
|
{{ contractor.summary }}
|
|
</p>
|
|
|
|
<div class="list-summ-block">
|
|
<div class="col-lg-5">
|
|
<ul class="list-summ">
|
|
{% if contractor.website %}
|
|
<li>{{ contractor.website }}</li>
|
|
{% endif %}
|
|
|
|
<li>{{ contractor.email }}</li>
|
|
|
|
{% if contractor.phone %}
|
|
<li>{{ contractor.phone }}</li>
|
|
{% endif %}
|
|
|
|
{% if contractor.phone2 %}
|
|
<li>{{ contractor.phone2 }}</li>
|
|
{% endif %}
|
|
|
|
<li>{{ contractor.get_location }}</li>
|
|
</ul>
|
|
</div>
|
|
<div class="col-lg-5 col-lg-offset-2">
|
|
{% specialization_widget contractor.pk %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-lg-12 wr-inset-pluss">
|
|
{% if contractor.pk == request.user.pk %}
|
|
<a href="#" data-toggle="modal" data-target="#resume-text-edit"
|
|
style="float: left; margin-right: 10px;">
|
|
<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
|
|
</a>
|
|
{% endif %}
|
|
|
|
<div class="pluss-block" id="resume-text-out">
|
|
{{ contractor.contractor_resume.text|safe }}
|
|
</div>
|
|
|
|
|
|
<!-- Редактирование текста резюме (модальное окно)-->
|
|
<div id="resume-text-edit" class="modal fade">
|
|
<div class="modal-dialog" style="width:900px;">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<button type="button" class="close" data-dismiss="modal"
|
|
aria-hidden="true">×</button>
|
|
<h4 class="modal-title">Редактировать текст резюме</h4>
|
|
</div>
|
|
<div class="modal-body">
|
|
<div style="height: 180px;">
|
|
<form id="resume-edit-form">
|
|
<div class="textAreaBlock2 text-nn box-sizing disTab">
|
|
<textarea name="text" id="text-new"
|
|
class="-ckeditor">{{ contractor.contractor_resume.text }}</textarea>
|
|
</div>
|
|
|
|
<div class="searchF1 polsF1 polsFF links-filter">
|
|
<input class="btn-submit-link" type="submit"
|
|
value="Сохранить">
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
<div class="modal-footer"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!-- Конец блока (resume-modal)-->
|
|
|
|
<div class="gal-pluss" id="diplom-cro-gallery">
|
|
<div class="inset-gp">
|
|
<p class="title-gp">Дипломы / Сертификаты</p>
|
|
|
|
{% if contractor == request.user %}
|
|
<div class="upload2 up-l3">
|
|
<input type="file" name="file" id="diplom-upload" multiple>
|
|
<p>Загрузить файл</p>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<div class="galleryWork2 gal-iss disTab" id="diplom-gallery">
|
|
{% for diplom in resume_diploms %}
|
|
<div class="col-lg-4">
|
|
<div class="insetCol box-sizing disTab">
|
|
{% thumbnail diplom.img "210x334" crop="center" as im %}
|
|
<div class="imgGal"
|
|
style="background: url('{{ im.url }}') no-repeat center;">
|
|
<a href="{{ diplom.img.url }}"
|
|
class='open-modal-image'>
|
|
<div class="imgFigure"></div>
|
|
</a>
|
|
</div>
|
|
{% endthumbnail %}
|
|
</div>
|
|
<div class="insetCol2 box-sizing disTab">
|
|
<p>
|
|
{{ diplom.title }}
|
|
</p>
|
|
|
|
{% if contractor.pk == request.user.pk %}
|
|
<div class="buttonsImg" distab="">
|
|
<div class="insetBI insetBI2 delete-resume-file"
|
|
data-id="{{ diplom.pk }}">
|
|
<i class="fa fa-times"></i>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
<div class="inset-gp">
|
|
<p class="title-gp">Допуск СРО</p>
|
|
|
|
{% if contractor == request.user %}
|
|
<div class="upload2 up-l3">
|
|
<input type="file" name="file" id="cro-upload">
|
|
<p>Загрузить файл</p>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<div class="galleryWork2 gal-iss disTab" id="cro-gallery">
|
|
{% for cro in resume_cro %}
|
|
<div class="col-lg-4">
|
|
<div class="insetCol box-sizing disTab">
|
|
{% thumbnail cro.img "210x334" crop="center" as im %}
|
|
<div class="imgGal"
|
|
style="background: url('{{ im.url }}') no-repeat center;">
|
|
<a href="{{ cro.img.url }}"
|
|
class='open-modal-image'>
|
|
<div class="imgFigure"></div>
|
|
</a>
|
|
</div>
|
|
{% endthumbnail %}
|
|
</div>
|
|
<div class="insetCol2 box-sizing disTab">
|
|
<p>
|
|
{{ cro.title }}
|
|
</p>
|
|
|
|
{% if contractor.pk == request.user.pk %}
|
|
<div class="buttonsImg" distab="">
|
|
<div class="insetBI insetBI2 delete-resume-file"
|
|
data-id="{{ cro.pk }}">
|
|
<i class="fa fa-times"></i>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="tab14" class="tab-pane fade">
|
|
{% for review in contractor.reviews_by_contractor.all %}
|
|
<div class="new-comm-44">
|
|
<div class="col-lg-12">
|
|
<p class="nameComm">
|
|
<a href="">{{ review.get_sender }}</a>
|
|
</p>
|
|
{% if review.project.deal_type == 'secure_deal' %}
|
|
<span class="dateComm44">
|
|
Безопасная сделка
|
|
</span>
|
|
{% endif %}
|
|
<div class="stars box-sizing">
|
|
<a href="#">положительный отзыв</a>
|
|
</div>
|
|
<p class="textComm44">
|
|
{{ review.text|safe }}
|
|
</p>
|
|
</div>
|
|
</div>
|
|
{% empty %}
|
|
<div class="new-comm-44">
|
|
<p style="text-align: center;">Отзывов пока нет</p>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
|
|
<div>
|
|
{% include 'partials/footer.html' %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|
|
|
|
|
|
{% block js_block %}
|
|
<script src='{% static "lib/ckeditor/ckeditor.js" %}'></script>
|
|
<script src='{% static "lib/ckeditor/adapters/jquery.js" %}'></script>
|
|
|
|
<script>
|
|
;
|
|
(function () {
|
|
// Pagination ---------------------------------------------------
|
|
|
|
|
|
var $portfoliosContainer = $('.-portfolios-container').first()
|
|
var portfolioItemTempl = _.template($portfoliosContainer.find('.-portfolio-item-templ').first().html())
|
|
var $morePortfBtn = $('.-more-portfolios-btn').first()
|
|
var portfAbsUrl = '/projects/portfolio/%id%/' // "%id%" will be replaced
|
|
var portfEditUrl = '/projects/portfolio/%id%/edit/'
|
|
var portfTrashUrl = '/projects/portfolio/%id%/trash/'
|
|
|
|
var $workSellsContainer = $('.-work-sells-container').first()
|
|
var workSellItemTempl = _.template($workSellsContainer.find('.-work-sell-item-templ').first().html())
|
|
var $moreWorkSellsfBtn = $('.-more-work-sells-btn').first()
|
|
var workSellAbsUrl = '/work_sell/%id%/'
|
|
var workSellEditUrl = '/work_sell/%id%/edit/'
|
|
var workSellTrashUrl = '/work_sell/%id%/trash/'
|
|
|
|
var contractorId =
|
|
{{ contractor.pk }}
|
|
var authedContractorId{% if request.user.is_authenticated %} =
|
|
{{ request.user.pk }}{% endif %}
|
|
|
|
var portfUrl = new URI('/api/portfolios/')
|
|
var workSellUrl = new URI('/api/work-sells/')
|
|
var pageSize = {% if TESTING %}99{% else %}9{% endif %}
|
|
|
|
function loadMorePortfolios() {
|
|
var query = portfUrl.query(true)
|
|
|
|
portfUrl.setQuery('user__id', contractorId)
|
|
portfUrl.setQuery('page_size', pageSize)
|
|
portfUrl.setQuery('page', query.page ? Number(query.page) + 1 : 1)
|
|
|
|
$.get(portfUrl.href())
|
|
.then(function (res) {
|
|
_.each(function (portfolio) {
|
|
$portfoliosContainer.append(portfolioItemTempl({
|
|
portfolio: portfolio,
|
|
portfAbsUrl: _.replace('%id%', portfolio.id, portfAbsUrl),
|
|
portfEditUrl: _.replace('%id%', portfolio.id, portfEditUrl),
|
|
portfTrashUrl: _.replace('%id%', portfolio.id, portfTrashUrl),
|
|
contractorId: contractorId,
|
|
authedContractorId: authedContractorId,
|
|
trunc: _.truncate,
|
|
}))
|
|
}, res.results)
|
|
|
|
if (!res.next)
|
|
$morePortfBtn.css('display', 'none')
|
|
})
|
|
|
|
.then(function () {
|
|
$('.open-modal-image').magnificPopup({type: 'image'})
|
|
})
|
|
}
|
|
|
|
function loadMoreWorkSells() {
|
|
var query = workSellUrl.query(true)
|
|
|
|
workSellUrl.setQuery('contractor__id', contractorId)
|
|
workSellUrl.setQuery('page_size', pageSize)
|
|
workSellUrl.setQuery('page', query.page ? Number(query.page) + 1 : 1)
|
|
|
|
$.get(workSellUrl.href())
|
|
.then(function (res) {
|
|
_.each(function (ws) {
|
|
$workSellsContainer.append(workSellItemTempl({
|
|
workSell: ws,
|
|
workSellAbsUrl: _.replace('%id%', ws.id, workSellAbsUrl),
|
|
workSellEditUrl: _.replace('%id%', ws.id, workSellEditUrl),
|
|
workSellTrashUrl: _.replace('%id%', ws.id, workSellTrashUrl),
|
|
contractorId: contractorId,
|
|
authedContractorId: authedContractorId,
|
|
trunc: _.truncate,
|
|
}))
|
|
}, res.results)
|
|
|
|
if (!res.next)
|
|
$moreWorkSellsfBtn.css('display', 'none')
|
|
})
|
|
|
|
.then(function () {
|
|
$('.open-modal-image').magnificPopup({type: 'image'})
|
|
})
|
|
}
|
|
|
|
window.loadMorePortfolios = loadMorePortfolios
|
|
window.loadMoreWorkSells = loadMoreWorkSells
|
|
|
|
loadMorePortfolios()
|
|
loadMoreWorkSells()
|
|
|
|
|
|
// Persistent Bootstrap tabs --------------------------------------
|
|
|
|
|
|
$('a[data-toggle="tab"][href="' + window.location.hash + '"]').tab('show')
|
|
|
|
$('a[data-toggle="tab"]').on('click', function ($evt) { // Better handle "shown.bs.tab" event?
|
|
window.location.hash = $(this).attr('href')
|
|
})
|
|
|
|
|
|
// A wysiwyg editor ----------------------------------------------
|
|
|
|
|
|
$('textarea.-ckeditor').first().ckeditor()
|
|
|
|
|
|
// Team invitation -----------------------------------------------
|
|
|
|
|
|
{% if contractor.pk != request.user.pk and request.user.is_contractor and request.user.has_team %}
|
|
var createTeamInvitationUrl = format('/users/create-team-invitation/%s/', {{ contractor.pk }})
|
|
|
|
$('.-team-invitation').first().on('click', function ($evt) {
|
|
var $inviteBtn = $(this)
|
|
|
|
$.post(createTeamInvitationUrl).then(function (res) {
|
|
if (res.status === 'success') {
|
|
socketMain.add_message({
|
|
format_type: 'add_message_contact',
|
|
message_type: 'invite_team',
|
|
data: {
|
|
sender_id: '{{ request.user.pk }}',
|
|
recipent_id: '{{ contractor.pk }}',
|
|
chat_message: 'Приглашаю в группу "{{ request.user.team.name }}" <a href="http://{{ request.get_host }}{% url 'users:accept-team-invitation' owner_id=request.user.pk %}" class="message_connect">Присоединиться</a>',
|
|
},
|
|
})
|
|
|
|
$.jGrowl('Приглашение успешно отправлено')
|
|
$inviteBtn.closest('.-team-invitation-parent').fadeOut()
|
|
} else {
|
|
$.jGrowl('Произошла ошибка при отправке приглашения')
|
|
$inviteBtn.closest('.-team-invitation-parent').fadeOut()
|
|
}
|
|
})
|
|
})
|
|
{% endif %}
|
|
|
|
|
|
|
|
// Contractor order offer --------------------------------------
|
|
|
|
|
|
{% if request.user.is_customer %}
|
|
var customerId = {{ request.user.pk }}
|
|
var contractorId = {{ contractor.pk }}
|
|
var $projectSelectionModal = $('#projectSelectionModal')
|
|
var projectUrl_ = '/projects/%id%/'
|
|
var projectOrderChatUrl_ = '/chat/#order%orderId%'
|
|
|
|
|
|
$projectSelectionModal.on('shown.bs.modal', function ($evt) {
|
|
var $that = $(this)
|
|
|
|
var $modalOpenButton = $($evt.relatedTarget)
|
|
var $projectSelect = $that.find('.-project-select').first()
|
|
|
|
$that.data('modalOpenButton', $modalOpenButton)
|
|
|
|
initProjectSelect($projectSelect, customerId, contractorId)
|
|
})
|
|
|
|
|
|
$projectSelectionModal.find('.-action-button').first().on('click', function ($evt) {
|
|
var $projectSelect = $projectSelectionModal.find('.-project-select').first()
|
|
var $modalOpenButton = $projectSelectionModal.data('modalOpenButton')
|
|
var contractorId = $modalOpenButton.data('contractorId')
|
|
var project = $projectSelect.select2('data').origItem
|
|
var projectUrl = _.replace('%id%', project.id, projectUrl_)
|
|
var projectOrderChatUrl = _.replace('%orderId%', project.order.id, projectOrderChatUrl_)
|
|
|
|
$projectSelectionModal.modal('hide')
|
|
|
|
if (project.order.contractor && project.order.contractor.id === contractorId) {
|
|
window.location.href = projectOrderChatUrl
|
|
} else {
|
|
var msg = 'Вам предлагается проект <a class="message_connect" href="http://{{ request.get_host }}' + projectUrl + '">Перейти к проекту</a>'
|
|
|
|
socketMain.add_message({
|
|
format_type: 'add_message_contact',
|
|
message_type: 'invite_order',
|
|
data: {
|
|
sender_id: String(customerId),
|
|
recipent_id: String(contractorId),
|
|
chat_message: msg,
|
|
},
|
|
})
|
|
}
|
|
|
|
$.jGrowl('Предложение успешно отправлено')
|
|
$modalOpenButton.closest('.icon_um4').fadeOut()
|
|
})
|
|
|
|
|
|
$projectSelectionModal.on('hidden.bs.modal', function ($evt) {
|
|
$(this).find('.-project-select').first().select2('destroy')
|
|
})
|
|
{% endif %}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
|
|
var userId = '{{ contractor.pk }}';
|
|
|
|
var hash = window.location.hash;
|
|
|
|
if (hash == '#open-contact') {
|
|
$("#contact-contactor-modal").modal();
|
|
}
|
|
|
|
$('#resume-edit-form').on('submit', function (e) {
|
|
e.preventDefault();
|
|
var resumeEditUrl = "{% url 'users:contractor-resume-update' contractor.contractor_resume.pk %}";
|
|
var dataSerializer = $(this).serialize();
|
|
|
|
$.ajax({
|
|
url: resumeEditUrl,
|
|
method: 'POST',
|
|
beforeSend: function (xhr) {
|
|
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
|
|
},
|
|
data: dataSerializer,
|
|
dataType: 'json',
|
|
success: function (data) {
|
|
consoCoole.log(data);
|
|
if (data.status == 'ok') {
|
|
$("#resume-text-out").html(data.text);
|
|
$("#resume-text-edit").modal('hide');
|
|
|
|
}
|
|
},
|
|
error: function (jqXHR, exception) {
|
|
console.log(jqXHR);
|
|
console.log(exception);
|
|
console.log(jqXHR.statusCode);
|
|
}
|
|
|
|
});
|
|
});
|
|
|
|
|
|
$("#diplom-cro-gallery").on('click', '.delete-resume-file', function (e) {
|
|
e.preventDefault();
|
|
|
|
var _this = $(this);
|
|
var deleteResumeUrl = '/api/contractorresumefiles/' + $(this).attr('data-id') + '/';
|
|
$.ajax({
|
|
url: deleteResumeUrl,
|
|
type: 'DELETE',
|
|
beforeSend: function (xhr) {
|
|
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
|
|
},
|
|
success: function (json) {
|
|
_this.parent().parent().parent().remove();
|
|
console.log(json);
|
|
},
|
|
error: function (jqXHR, e) {
|
|
console.log(jqXHR.statusCode);
|
|
}
|
|
});
|
|
});
|
|
|
|
|
|
$('#worksell-add-form').on('submit', function (e) {
|
|
e.preventDefault();
|
|
var dataSerializer = $(this).serialize();
|
|
$.ajax({
|
|
url: '/work_sell/create/',
|
|
method: 'POST',
|
|
data: dataSerializer,
|
|
dataType: 'json',
|
|
success: function (data) {
|
|
if (data.status == 'ok') {
|
|
location.reload();
|
|
} else if (data.status == 'no') {
|
|
$.each(data.form_errors, function (k, v) {
|
|
$('.error-' + k).html(v).show();
|
|
});
|
|
}
|
|
|
|
},
|
|
error: function (jqXHR, exception) {
|
|
console.log(jqXHR.statusCode);
|
|
console.log(jqXHR);
|
|
}
|
|
|
|
})
|
|
});
|
|
|
|
|
|
$('#portfolio-add-form').on('submit', function (e) {
|
|
e.preventDefault();
|
|
var dataSerializer = $(this).serialize();
|
|
|
|
$.ajax({
|
|
url: '/projects/portfolio/create/',
|
|
method: 'POST',
|
|
data: dataSerializer,
|
|
dataType: 'json',
|
|
success: function (data) {
|
|
if (data.status == 'ok') {
|
|
$('#portfolio-add-form').each(function () {
|
|
this.reset();
|
|
});
|
|
location.reload();
|
|
} else if (data.status == 'no') {
|
|
|
|
$.each(data.form_errors, function (k, v) {
|
|
$('.error-' + k).html(v).show();
|
|
});
|
|
}
|
|
},
|
|
error: function (jqXHR, exception) {
|
|
console.log(jqXHR.statusCode);
|
|
}
|
|
});
|
|
});
|
|
var url = '/work_sell/basic/';
|
|
var csrftoken = $.cookie('csrftoken');
|
|
|
|
$("body").on("click", "#remove-resume-file", function (e) {
|
|
e.preventDefault();
|
|
var _this = $(this);
|
|
$.ajax({
|
|
url: '/api/contractorresume/{{ contractor.contractor_resume.pk }}/',
|
|
method: 'PUT',
|
|
beforeSend: function (xhr) {
|
|
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
|
|
},
|
|
data: {resume_file: null},
|
|
cache: false,
|
|
dataType: 'json',
|
|
success: function (data) {
|
|
$("#resume-success").html("Файл для резюме удален!");
|
|
$(_this).css('display', 'none');
|
|
$('.download-summ').css('display', 'none');
|
|
|
|
console.log(data);
|
|
},
|
|
error: function (jqXHR) {
|
|
console.log(jqXHR);
|
|
}
|
|
});
|
|
});
|
|
|
|
$("#upload-resume").on('change', function (e) {
|
|
$("#resume-success").html("");
|
|
var formData = new FormData();
|
|
formData.append('resume_file', e.target.files[0]);
|
|
|
|
var file = e.target.files[0]
|
|
var allowedExts = ['.pdf', '.doc', '.docx', '.xml', '.odt', '.uot', '.dot', '.rtf', '.txt', '.uop', '.pptx', '.odp', '.html', '.jpg', '.jpeg', '.tiff', '.png']
|
|
|
|
if (!_.includes(path.extname(file.name), allowedExts)) {
|
|
alert('Файл не подходит. Выберите документ')
|
|
return
|
|
}
|
|
|
|
$.ajax({
|
|
url: '/api/contractorresume/{{ contractor.contractor_resume.pk }}/',
|
|
method: 'PUT',
|
|
beforeSend: function (xhr) {
|
|
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
|
|
},
|
|
data: formData,
|
|
cache: false,
|
|
dataType: 'json',
|
|
processData: false,
|
|
contentType: false,
|
|
success: function (data) {
|
|
$("#resume-success").html("Файл для резюме успешно загружен!");
|
|
var downloadSumm = $(".download-summ");
|
|
if (downloadSumm.length > 0) {
|
|
downloadSumm.css('display', 'block').attr('href', data.resume_file);
|
|
} else {
|
|
$('<a href="' + data.resume_file + '" class="download-summ">скачать резюме</a>').insertAfter('#resume-success');
|
|
}
|
|
$("#remove-resume-file").show();
|
|
console.log(data);
|
|
},
|
|
error: function (jqXHR) {
|
|
console.log(jqXHR);
|
|
}
|
|
});
|
|
});
|
|
|
|
$('#fileupload').fileupload({
|
|
url: url,
|
|
crossDomain: false,
|
|
beforeSend: function (xhr, settings) {
|
|
$('#progress-portfolio .progress-bar').css(
|
|
'width',
|
|
'0%'
|
|
);
|
|
if (!csrfSafeMethod(settings.type)) {
|
|
xhr.setRequestHeader("X-CSRFToken", csrftoken);
|
|
}
|
|
},
|
|
dataType: 'json',
|
|
done: function (e, data) {
|
|
console.log(data);
|
|
$.each(data.result.files, function (index, file) {
|
|
var img = $('<img style="width:200px;height:200px;margin:10px;">').attr('src', file.url).appendTo("#files");
|
|
console.log(file);
|
|
var currentValue = $("#upload-files-pk").val();
|
|
currentValue += file.id + ';';
|
|
$("#upload-files-pk").val(currentValue);
|
|
|
|
});
|
|
},
|
|
progressall: function (e, data) {
|
|
var progress = parseInt(data.loaded / data.total * 100, 10);
|
|
console.log(progress);
|
|
$('#progress-portfolio .progress-bar').css(
|
|
'width',
|
|
progress + '%'
|
|
);
|
|
}
|
|
}).prop('disabled', !$.support.fileInput)
|
|
.parent().addClass($.support.fileInput ? undefined : 'disabled');
|
|
|
|
$('#fileupload-worksell').fileupload({
|
|
url: url,
|
|
crossDomain: false,
|
|
beforeSend: function (xhr, settings) {
|
|
$('#progress-worksell .progress-bar').css(
|
|
'width',
|
|
'0%'
|
|
);
|
|
if (!csrfSafeMethod(settings.type)) {
|
|
xhr.setRequestHeader("X-CSRFToken", csrftoken);
|
|
}
|
|
},
|
|
dataType: 'json',
|
|
done: function (e, data) {
|
|
console.log(data);
|
|
$.each(data.result.files, function (index, file) {
|
|
var img = $('<img style="width:200px;height:200px;margin:10px;">').attr('src', file.url).appendTo("#files-worksell");
|
|
console.log(file);
|
|
var currentValue = $("#upload-files-worksell-pk").val();
|
|
currentValue += file.id + ';';
|
|
$("#upload-files-worksell-pk").val(currentValue);
|
|
|
|
});
|
|
},
|
|
progressall: function (e, data) {
|
|
var progress = parseInt(data.loaded / data.total * 100, 10);
|
|
console.log(progress);
|
|
$('#progress-worksell .progress-bar').css(
|
|
'width',
|
|
progress + '%'
|
|
);
|
|
}
|
|
}).prop('disabled', !$.support.fileInput)
|
|
.parent().addClass($.support.fileInput ? undefined : 'disabled');
|
|
|
|
|
|
function add_resume_file(resumeType, imgUrl, imgPk, galleryId) {
|
|
$.ajax({
|
|
url: '/users/contractorsresumefiles/create/',
|
|
method: 'POST',
|
|
beforeSend: function (xhr) {
|
|
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
|
|
},
|
|
data: 'type=' + resumeType + '&img_id=' + imgPk + '&resume={{ contractor.contractor_resume.pk }}',
|
|
dataType: 'json',
|
|
success: function (data) {
|
|
if (data.status == 'ok') {
|
|
var htmlImg = '<div class="col-lg-4"><div class="insetCol box-sizing disTab"><div class="imgGal" style="background: url(' + imgUrl + ') no-repeat center;"><div class="imgFigure"></div></div></div> ' +
|
|
'<div class="insetCol2 box-sizing disTab"><div class="buttonsImg" distab="">' +
|
|
'<div class="insetBI insetBI2 delete-resume-file" data-id="' + data.pk + '"><i class="fa fa-times"></i></div></div></div></div>';
|
|
|
|
var img = $(htmlImg).appendTo(galleryId);
|
|
} else if (data.status == 'no') {
|
|
$.each(data.form_errors, function (k, v) {
|
|
$('.error-' + k).html(v).show();
|
|
});
|
|
}
|
|
},
|
|
error: function (jqXHR, exception) {
|
|
console.log(jqXHR);
|
|
console.log(jqXHR.statusCode);
|
|
}
|
|
});
|
|
}
|
|
|
|
$('#diplom-upload').fileupload({
|
|
url: url,
|
|
crossDomain: false,
|
|
beforeSend: function (xhr, settings) {
|
|
$('#progress .progress-bar').css(
|
|
'width',
|
|
'0%'
|
|
);
|
|
if (!csrfSafeMethod(settings.type)) {
|
|
xhr.setRequestHeader("X-CSRFToken", csrftoken);
|
|
}
|
|
},
|
|
dataType: 'json',
|
|
done: function (e, data) {
|
|
$.each(data.result.files, function (index, file) {
|
|
add_resume_file('diplom', file.url, file.id, '#diplom-gallery');
|
|
});
|
|
},
|
|
progressall: function (e, data) {
|
|
var progress = parseInt(data.loaded / data.total * 100, 10);
|
|
$('#progress .progress-bar').css(
|
|
'width',
|
|
progress + '%'
|
|
);
|
|
}
|
|
}).prop('disabled', !$.support.fileInput)
|
|
.parent().addClass($.support.fileInput ? undefined : 'disabled');
|
|
|
|
$('#cro-upload').fileupload({
|
|
url: url,
|
|
crossDomain: false,
|
|
beforeSend: function (xhr, settings) {
|
|
$('#progress .progress-bar').css(
|
|
'width',
|
|
'0%'
|
|
);
|
|
if (!csrfSafeMethod(settings.type)) {
|
|
xhr.setRequestHeader("X-CSRFToken", csrftoken);
|
|
}
|
|
},
|
|
dataType: 'json',
|
|
done: function (e, data) {
|
|
$.each(data.result.files, function (index, file) {
|
|
add_resume_file('cro', file.url, file.id, '#cro-gallery');
|
|
});
|
|
},
|
|
progressall: function (e, data) {
|
|
var progress = parseInt(data.loaded / data.total * 100, 10);
|
|
$('#progress .progress-bar').css(
|
|
'width',
|
|
progress + '%'
|
|
);
|
|
}
|
|
}).prop('disabled', !$.support.fileInput)
|
|
.parent().addClass($.support.fileInput ? undefined : 'disabled');
|
|
|
|
function csrfSafeMethod(method) {
|
|
// these HTTP methods do not require CSRF protection
|
|
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
|
|
}
|
|
}())
|
|
</script>
|
|
{% endblock %}
|
|
|