vendor/uvdesk/support-center-bundle/Resources/views/Knowledgebase/customerAccount.html.twig line 1

Open in your IDE?
  1. {% extends "@UVDeskSupportCenter/Templates/layout.html.twig" %}
  2. {% block title %}{% trans %}Edit Profile{% endtrans %}{% endblock %}
  3. {% block ogtitle %}{% trans %}Edit Profile{% endtrans %}{% endblock %}
  4. {% block twtitle %}{% trans %}Edit Profile{% endtrans %}{% endblock %}
  5. {% block tabHeader %}
  6.     <div class="uv-nav-bar uv-nav-tab">
  7.         <div class="uv-container">
  8.             <div class="uv-nav-bar-lt">
  9.                 <ul class="uv-nav-tab-label">
  10.                     <li><a href="#" for="profile" class="uv-nav-tab-active">{{ 'Profile'|trans }}</a></li>
  11.                 </ul>
  12.                
  13.             </div>
  14.             <div class="uv-nav-bar-rt">
  15.                 <form method="get" action="{{path('helpdesk_customer_front_article_search')}}">
  16.                     <input name="s" class="uv-nav-search" type="text" placeholder="{{ 'Search'|trans }}">
  17.                 </form>
  18.             </div>
  19.         </div>
  20.     </div>
  21. {% endblock %}
  22. {% block body %}
  23.     <style>
  24.         .uv-nav-tab-view {
  25.             display: none;
  26.         }
  27.         .uv-nav-tab-view.uv-nav-tab-view-active {
  28.             display: block;
  29.         }
  30.         .uv-image-upload-wrapper {
  31.             padding: 5px 0px 10px 0px;
  32.         }
  33.         .uv-image-upload-wrapper .uv-image-upload-brick {
  34.             display: inline-block;
  35.             vertical-align: middle;
  36.             position: relative;
  37.             width: 100px;
  38.             height: 100px;
  39.             border-radius: 5px;
  40.             border: dashed 1px #B1B1AE;
  41.             overflow: hidden;
  42.             margin-right: 15px;
  43.             transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
  44.         }
  45.         .uv-image-upload-wrapper .uv-image-upload-brick input[type="file"] {
  46.             width: 100px;
  47.             height: 100px;
  48.             position: absolute;
  49.             opacity: 0;
  50.             z-index: 3;
  51.         }
  52.         .uv-image-upload-wrapper img {
  53.             width: 100px;
  54.             height: 100px;
  55.             position: absolute;
  56.             z-index: 2;
  57.             border-radius: 5px;
  58.             display: block;
  59.             border: solid 2px #FFFFFF;
  60.         }
  61.         .uv-image-upload-wrapper img:not([src]) {
  62.             display: none;
  63.         }
  64.         .uv-image-upload-wrapper .uv-image-upload-placeholder {
  65.             position: absolute;
  66.             width: 48px;
  67.             height: 32px;
  68.             left: 50%;
  69.             top: 50%;
  70.             margin-left: -24px;
  71.             margin-top: -16px;
  72.             z-index: 1;
  73.         }
  74.         .uv-image-upload-wrapper .uv-image-upload-brick-48 {
  75.             width: 48px;
  76.             height: 48px;
  77.         }
  78.         .uv-image-upload-wrapper .uv-image-upload-brick-48 input[type="file"] {
  79.             width: 48px;
  80.             height: 48px;
  81.         }
  82.         .uv-image-upload-wrapper .uv-image-upload-brick-48 img {
  83.             width: 48px;
  84.             height: auto;
  85.             }
  86.         .uv-image-upload-wrapper .uv-image-upload-brick-200 {
  87.             width: 200px;
  88.             height: 48px;
  89.         }
  90.         .uv-image-upload-wrapper .uv-image-upload-brick-200 input[type="file"] {
  91.             width: 200px;
  92.             height: 48px;
  93.         }
  94.         .uv-image-upload-wrapper .uv-image-upload-brick-200 img {
  95.             width: 200px;
  96.             height: auto;
  97.         }
  98.         .uv-image-upload-wrapper .uv-image-upload-placeholder svg path {
  99.             fill: #7C70F4;
  100.         }
  101.         .uv-image-upload-wrapper .uv-image-upload-brick:hover .uv-image-upload-placeholder svg path {
  102.             fill: #BA81F1;
  103.         }
  104.         .uv-image-upload-wrapper .uv-image-upload-brick .uv-image-upload-placeholder svg {
  105.             transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
  106.         }
  107.         .uv-image-upload-wrapper .uv-image-upload-brick:hover .uv-image-upload-placeholder svg {
  108.             transform: translateY(-2px);
  109.         }
  110.         .uv-image-upload-wrapper .uv-image-info-brick {
  111.             display: inline-block;
  112.             vertical-align: middle;
  113.             margin: 10px 0px;
  114.         }
  115.         .uv-image-upload-wrapper .uv-on-drag {
  116.             transform: scale(1.08);
  117.             border: dashed 1px #333333;
  118.         }
  119.         .uv-image-upload-wrapper .uv-on-drop-shadow {
  120.             box-shadow: 0px 0px 4.75px 0.25px rgba(0, 0, 0, 0.05), 0px 8px 24px 0px rgba(0, 0, 0, 0.15);
  121.         }
  122.         .accounts-panel {
  123.             border: solid 1px #D3D3D3;
  124.             padding: 15px 15px 5px 15px;
  125.             border-radius: 3px;
  126.             margin: 25px 0px;
  127.         }
  128.         .social-accounts-table {
  129.             margin: 20px 0px 10px;
  130.         }
  131.         .social-accounts-table table {
  132.             border: solid 1px #D3D3D3;
  133.         }
  134.         .social-accounts-table table > tbody > tr > td {
  135.             border-bottom: dashed 1px #D3D3D3;
  136.         }
  137.         .social-accounts-table table > tbody > tr:last-child > td {
  138.             border-bottom: unset;
  139.         }
  140.         .social-accounts-table .social-accounts-pta {
  141.             text-align: right;
  142.         }
  143.         .social-accounts-table .social-accounts-pta > * {
  144.             text-align: left;
  145.         }
  146.         .social-account-banner {
  147.             min-width: 220px;
  148.             display: inline-block;
  149.             padding: 3px;
  150.             border-radius: 3px;
  151.         }
  152.         .social-account-banner > * {
  153.             display: inline-block;
  154.             vertical-align: middle;
  155.         }
  156.         .social-account-name {}
  157.         .social-account-img {
  158.             width: 40px;
  159.             height: 40px;
  160.             background-size: cover;
  161.             background-position: center;
  162.             margin-right: 10px;
  163.         }
  164.          span.viewer-firstletter.img-thumbnail {
  165.             width: 40px;
  166.             height: 40px;
  167.             display: block;
  168.             text-align: center;
  169.             font-size: 20px;
  170.             font-style: italic;
  171.             border: 1px dotted;
  172.             border-radius: 4px;
  173.             line-height: 35px;
  174.         }
  175.         .uv-ticket-viewer-close {
  176.             display:none;
  177.         }
  178.         .uv-ticket-viewer-single:hover .uv-ticket-viewer-close {
  179.             display: block;
  180.         }
  181.         .uv-hide{
  182.             display: none;
  183.         }
  184.         .uv-info{
  185.             background: #7C70F4;
  186.         }
  187.         .uv-ticket-viewer-list .uv-icon-eye-light{
  188.             animation: jelly 0.8s infinite alternate ease-in-out;
  189.         }
  190.         .uv-aside-brick .uv-loader {
  191.             position: absolute;
  192.             transform: scale(0.5);
  193.             top: 22px;
  194.             right: 45px;
  195.         }
  196.         .uv-app-glyph-customfields {
  197.             width: 20px;
  198.             height: 20px;
  199.             background-position: center center;
  200.             background-repeat: no-repeat;
  201.             cursor: pointer;
  202.             display: inline-block;
  203.             vertical-align: middle;
  204.             margin: 5px 0px 5px 10px;
  205.             background-image: url("{{ asset('bundles/uvdeskcoreframework/images/app-glyph-custom.svg') }}");
  206.         }
  207.         .uv-no-threads {
  208.             padding: 80px 20px;
  209.             text-align: center;
  210.         }
  211.         .uv-ticket-strip-label {
  212.             position: relative;
  213.         }
  214.     </style>
  215.     <div class="uv-nav-tab-view uv-nav-tab-view-active" id="profile">
  216.         <h1>{{ 'Profile'|trans }}</h1>
  217.         {% set customerDetails = user_service.getCustomerDetailsById(user.id) %}
  218.         <!--Form-->
  219.         <form method="post" action="" id="user-form" enctype="multipart/form-data">
  220.             <!--Tab View-->
  221.             <div class="uv-tab-view uv-tab-view-active" id="profile">
  222.                 <!-- Profile image -->
  223.                 <div class="uv-image-upload-wrapper">
  224.                     {% set isHaveImage =  customerDetails and customerDetails.profileImagePath ? 1 : 0 %}
  225.                     <div class="uv-image-upload-brick {% if isHaveImage %}uv-on-drop-shadow{% endif %}" {% if isHaveImage %}style="border-color: transparent;"{% endif %}>
  226.                         <input type="file" name="user_form[profileImage]" id="uv-upload-profile">
  227.                         <div class="uv-image-upload-placeholder">
  228.                             <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="48px" height="32px">
  229.                             <path fill-rule="evenodd" d="M28.026,26.003 L19.964,26.003 L19.964,17.962 L13.964,17.962 L23.995,8.050 L34.025,17.962 L28.026,17.962 L28.026,26.003 ZM33.557,3.421 C30.806,1.146 27.619,0.008 23.995,0.008 C21.182,0.008 18.588,0.756 16.214,2.252 C13.838,3.749 11.996,5.712 10.683,8.143 C7.683,8.456 5.152,9.749 3.090,12.024 C1.027,14.300 -0.004,16.965 -0.004,20.019 C-0.004,23.324 1.168,26.144 3.512,28.481 C5.855,30.819 8.682,31.988 11.996,31.988 L37.963,31.988 C40.712,31.988 43.072,31.006 45.040,29.042 C47.009,27.079 47.993,24.726 47.993,21.983 C47.993,19.364 47.087,17.106 45.275,15.203 C43.461,13.302 41.275,12.258 38.713,12.071 C38.024,8.580 36.306,5.698 33.557,3.421 Z"></path>
  230.                             </svg>
  231.                         </div>
  232.                         <img id="dynamic-image-upload" {% if isHaveImage %}src="{{ app.request.scheme ~'://' ~ app.request.httpHost ~ asset('') }}{{ customerDetails.profileImagePath }}"{% endif %}>
  233.                     </div>
  234.                     <div class="uv-image-info-brick">
  235.                         <span class="uv-field-info">{{ 'Upload a Profile Image (100px x 100px)<br> in PNG or JPG Format'|trans|raw }}</span>
  236.                     </div>
  237.                 </div>
  238.                 <!-- //Profile image -->
  239.                 <!-- Field -->
  240.                 <div class="uv-element-block">
  241.                     <label class="uv-field-label">{{ 'First Name'|trans }}</label>
  242.                     <div class="uv-field-block">
  243.                         <input type="text" readonly name="user_form[firstName]" class="uv-field" value="{{ user.firstName ?: customerDetails.firstName }}" style="background-color: darkgray;" />
  244.                     </div>
  245.                 </div>
  246.                 <!-- //Field -->
  247.                 <!-- Field -->
  248.                
  249.                 <!-- //Field -->
  250.                 <!-- Field -->
  251.                 <div class="uv-element-block">
  252.                     <label class="uv-field-label">{{ 'Email'|trans }}</label>
  253.                     <div class="uv-field-block">
  254.                         <input type="text" readonly name="user_form[email]" class="uv-field" value="{{ user.email}}"  style="background-color: darkgray;" />
  255.                     </div>
  256.                 </div>
  257.                 <!-- //Field -->
  258.                 <!-- Field -->
  259.                 <div class="uv-element-block">
  260.                     <label class="uv-field-label">{{ 'Contact Number'|trans }}</label>
  261.                     <div class="uv-field-block">
  262.                         <input type="text" name="user_form[contactNumber]" class="uv-field" value="{{ customerDetails.contactNumber ?: customerDetails.contactNumber }}" />
  263.                     </div>
  264.                 </div>
  265.                 <!-- //Field -->
  266.                 <!-- Field -->
  267.                 <div class="uv-element-block">
  268.                     <label class="uv-field-label">{{ 'Timezone'|trans }}</label>
  269.                     <div class="uv-field-block">
  270.                         <select name="user_form[timezone]" class="uv-select">
  271.                             {% for timezone in user_service.getTimezones() %}
  272.                                 <option value="{{ timezone }}" {% if user.timezone == timezone %}selected{% endif %}>{{ timezone }}</option>
  273.                             {% endfor %}
  274.                         </select>
  275.                     </div>
  276.                     <span class="uv-field-info">{{ "Choose your default timezone"|trans }}</span>
  277.                 </div>
  278.                 <!-- //Field -->
  279.                 <!-- Field -->
  280.                 <div class="uv-element-block">
  281.                     <label class="uv-field-label">{{ 'Password'|trans }}</label>
  282.                     <div class="uv-field-block">
  283.                         <input type="password" name="user_form[password][first]" id='pass' class="uv-field" value="" style="width: 90%;" /> <img src='../../../external/ojo.png' width="50px" onclick="changepass()">
  284.                     </div>
  285.                 </div>
  286.                 <!-- //Field -->
  287.                 <!-- Field -->
  288.                 <div class="uv-element-block">
  289.                     <label class="uv-field-label">{{ 'Confirm Password'|trans }}</label>
  290.                     <div class="uv-field-block">
  291.                         <input type="password" name="user_form[password][second]" class="uv-field" id='pass2' value="" />
  292.                     </div>
  293.                 </div>
  294.                 <!-- //Field -->
  295.                 <!-- CSRF token Field -->
  296.               
  297.                 <!-- //CSRF token Field -->
  298.                 <!--CTA-->
  299.                 <input class="uv-btn" href="#" value="{{ 'Save Changes'|trans }}" type="submit">
  300.                 <!--//CTA-->
  301.             </div>
  302.             <!--//Tab View-->
  303.         </form>
  304.         <!--//Form-->
  305.         <br> <br> <br>
  306.        
  307.         <fieldset id="buildyourform" class="uv-element-block">
  308.         <input type="button" value="{{ 'Add Contact'|trans }}" class="uv-btn" id="add" /> 
  309.         <input type="button" value="{{ 'Save'|trans }}" class="uv-btn" id="save" /> 
  310.             <legend>{{ 'Contact List'|trans }}</legend>
  311.         </fieldset>
  312.         
  313.     </div>
  314. {% endblock %}
  315. {% block footer %}
  316.     {{ parent() }}
  317.     <script type="text/javascript">
  318.         
  319.         function readContactList(){
  320.             app.appView.showLoader();
  321.             
  322.             var email='{{user.email}}';
  323.             $.ajax({
  324.                 url: "../../../external/Controllers/ApiCreateAlias.php?email='"+email+"'",
  325.                   dataType: 'text',  
  326.                     cache: false,
  327.                     contentType: false,
  328.                     processData: false,
  329.                     data: '',                         
  330.                     type: 'get',   
  331.                     success: function(data){
  332.                         if(data){
  333.                             app.appView.hideLoader();
  334.                             var json =JSON.parse(data)
  335.                           
  336.                             for(var i=0; i<json.total;i++){
  337.                                 var lastField = $("#buildyourform div:last");
  338.                                 var intId = (lastField && lastField.length && lastField.data("idx") + 1) || 1;
  339.                                 var fieldWrapper = $("<div class=\"uv-element-block\" id=\"field" + intId + "\"/>");
  340.                                 fieldWrapper.data("idx", intId);
  341.                                  var fName = $("<input type='text' placeholder='Nombre' value='"+json.rows[i].nombre+"' class='uv-field ' /> <input placeholder='Apellido'  value='"+json.rows[i].apellido+"'  type='text' class='uv-field ' />  <input placeholder='Email' type='text'  value='"+json.rows[i].email+"'  class='uv-field ' /> <input placeholder='Cargo' type='text' class='uv-field ' value='"+json.rows[i].cargo+"' />");
  342.                                     var removeButton = $("<input type='button' class='uv-btn' value='{{ 'Delete'|trans }}' /><br>");
  343.                                     fieldWrapper.append(fName);
  344.                                     //fieldWrapper.append(fType);
  345.                                     fieldWrapper.append(removeButton);
  346.                                     removeButton.click(function() {
  347.                                         $(this).parent().remove();
  348.                                     });
  349.                                     $("#buildyourform").append(fieldWrapper);
  350.                             }
  351.                         }
  352.                     }
  353.                 }); 
  354.         }
  355.         $("#add").click(function() {
  356.             var lastField = $("#buildyourform div:last");
  357.             var intId = (lastField && lastField.length && lastField.data("idx") + 1) || 1;
  358.             var fieldWrapper = $("<div class=\"uv-element-block\" id=\"field" + intId + "\"/>");
  359.             fieldWrapper.data("idx", intId);
  360.             var fName = $("<input type='text' placeholder='Nombre' class='uv-field ' /> <input placeholder='Apellido' type='text' class='uv-field ' />  <input placeholder='Email' type='text' class='uv-field ' /> <input placeholder='Cargo' type='text' class='uv-field ' />");
  361.             var removeButton = $("<input type='button' class='uv-btn' value='{{ 'Delete'|trans }}' />");
  362.             removeButton.click(function() {
  363.                 $(this).parent().remove();
  364.             });
  365.             fieldWrapper.append(fName);
  366.             //fieldWrapper.append(fType);
  367.             fieldWrapper.append(removeButton);
  368.             $("#buildyourform").append(fieldWrapper);
  369.         });
  370.         
  371.         $("#save").click(function() { 
  372.             app.appView.showLoader();
  373.             
  374.             let data=[];
  375.             var lastField = $("#buildyourform div:last");
  376.             var intId = (lastField && lastField.length && lastField.data("idx") ) || 1;
  377.             var nombre,apellido,email,cargo,nro_serie;
  378.             nombre=apellido=email=cargo=nro_serie='';
  379.             var error=false;
  380.             var enter=true;
  381.             for(var i=1; i<= intId; i++){
  382.                 j=0;
  383.                 $('div#field'+i).find('input').each(function() {
  384.                     enter=true;
  385.                     j++;
  386.                     switch(j){
  387.                         case 1:
  388.                             nombre=$(this).val();
  389.                             if($(this).val()==''){
  390.                                 $(this).addClass('uv-field uv-field-error')
  391.                                 error=true;
  392.                             }
  393.                         break;
  394.                         case 2:
  395.                             apellido=$(this).val();
  396.                             if($(this).val()==''){
  397.                                 $(this).addClass('uv-field uv-field-error')
  398.                                 error=true;
  399.                             }
  400.                         break;
  401.                         
  402.                         case 3:
  403.                             email=$(this).val();
  404.                             if($(this).val()==''){
  405.                                 $(this).addClass('uv-field uv-field-error')
  406.                                 error=true;
  407.                             }else{
  408.                                 emailRegex = /^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;
  409.                                 if (!emailRegex.test(email)) {
  410.                                    $(this).addClass('uv-field uv-field-error')
  411.                                     error=true;
  412.                                 }
  413.                             }
  414.                         break;
  415.                         
  416.                         case 4:
  417.                             cargo=$(this).val();
  418.                         break;
  419.                         
  420.                     }
  421.                     //console.log($(this).val());
  422.                 })
  423.                 if(!error){
  424.                     data.push({nombre:nombre,apellido:apellido,email:email,cargo:cargo})
  425.                 }
  426.                 else{ 
  427.                     app.appView.hideLoader();
  428.                     return;
  429.                 }
  430.                 
  431.             }
  432.             if(enter){
  433.                 var form_data = new FormData();   
  434.                 form_data.append('array_post',JSON.stringify(data));
  435.                 form_data.append('email','{{ user.email}}');
  436.                 
  437.               
  438.                 $.ajax({
  439.                     url: "../../../external/Controllers/ApiCreateAlias.php",
  440.                       dataType: 'text',  
  441.                         cache: false,
  442.                         contentType: false,
  443.                         processData: false,
  444.                         data: form_data,                         
  445.                         type: 'post',   
  446.                         success: function(data){
  447.                             app.appView.hideLoader();
  448.                             location.reload()
  449.                             
  450.                         }
  451.                     }); 
  452.             }
  453.         })
  454.         function changepass(){
  455.             if($('#pass').get(0).type!='text'){
  456.                 $('#pass').get(0).type='text';
  457.                 $('#pass2').get(0).type='text';
  458.             }
  459.             else{
  460.                 $('#pass').get(0).type='password';
  461.                 $('#pass2').get(0).type='password';
  462.             }
  463.         }
  464.         $(function () {
  465.             readContactList()
  466.             var AccountLinkModel = Backbone.Model.extend({
  467.                 validation: {
  468.                     'merge_token': function(value) {
  469.                         if (value != undefined && value !== '') {
  470.                             if (value == this.attributes.presentToken) {
  471.                                 return "{% trans %}You can't merge an account with itself.{% endtrans %}";
  472.                             }
  473.                         } else {
  474.                             return '{{ "This field is mandatory"|trans }}';
  475.                         }
  476.                     },
  477.                 }
  478.             });
  479.             var UserModel = Backbone.Model.extend({
  480.                 validation: {
  481.                     'user_form[firstName]': {
  482.                         required: true,
  483.                         msg: '{{ "This field is mandatory"|trans }}'
  484.                     },
  485.                     'user_form[lastName]': function(value) {
  486.                         if(value != undefined && value !== '') {
  487.                             [{
  488.                                 pattern: /^[A-Za-z][A-Za-z]*[\sA-Za-z]*$/,
  489.                                 msg: 'This field must have characters only'
  490.                             },{
  491.                                 maxLength:40,
  492.                                 msg:'Maximum character length is 40'
  493.                             }]
  494.                         }
  495.                     },
  496.                     'user_form[email]': [{
  497.                         required: true,
  498.                         msg: '{{ "This field is mandatory"|trans }}'
  499.                     },{
  500.                         pattern: 'email',
  501.                         msg: '{{ "Email address is invalid"|trans }}'
  502.                     }],
  503.                     'user_form[contactNumber]': function(value) {
  504.                         if(value != undefined && value !== '') {
  505.                             if(!value.match('^\\s*(?:\\+?(\\d{1,3}))?[-. (]*(\\d{3})[-. )]*(\\d{3})[-. ]*(\\d{4})(?: *x(\\d+))?\\s*$'))
  506.                                 return '{{ "Contact number is invalid"|trans }}';
  507.                         }
  508.                     },
  509.                     'user_form[password][first]' : function(value) {
  510.                         if(value != undefined && value !== '') {
  511.                             if(value.length < 8)
  512.                                 return '{{ "Password must contains 8 Characters"|trans }}';
  513.                         }
  514.                     },
  515.                     'user_form[password][second]': {
  516.                         equalTo: 'user_form[password][first]',
  517.                         msg: '{{ "The passwords does not match"|trans }}'
  518.                     }
  519.                 }
  520.             });
  521.             var UserForm = Backbone.View.extend({
  522.                 events : {
  523.                     'click .uv-btn' : "saveUser",
  524.                     'blur input, textarea': 'formChanegd',
  525.                     'click a.select': 'selectAll',
  526.                     'click a.deselect': 'deselectAll',
  527.                 },
  528.                 initialize : function() {
  529.                     Backbone.Validation.bind(this);
  530.                     for (var field in jsonContext) {
  531.                         if(field == 'first') {
  532.                             Backbone.Validation.callbacks.invalid(this, "user_form[password][" + field + "]", jsonContext[field], 'input');
  533.                         } else {
  534.                             Backbone.Validation.callbacks.invalid(this, "user_form[" + field + "]", jsonContext[field], 'input');
  535.                         }
  536.                     }
  537.                     $('#notifications .uv-scroll-plank .uv-scroll-block').each(function() {
  538.                         if(!$(this).find('.uv-element-block').length) {
  539.                             $(this).parents('.uv-scroll-plank').remove()
  540.                         }
  541.                     })
  542.                 },
  543.                 formChanegd: function(e) {
  544.                     var fieldName = Backbone.$(e.currentTarget).attr('name');
  545.                     if(fieldName == 'user_form[password][second]') {
  546.                         if($("input[name='user_form[password][first]']").val().length) {
  547.                             this.model.set(fieldName, Backbone.$(e.currentTarget).val())
  548.                             this.model.isValid([fieldName])
  549.                         } else {
  550.                             if($("input[name='user_form[password][second]']").val().length) {
  551.                                 this.model.set(fieldName, Backbone.$(e.currentTarget).val())
  552.                                 this.model.isValid([fieldName])
  553.                             } else {
  554.                                 Backbone.Validation.callbacks.valid(this, fieldName, 'input');
  555.                             }
  556.                         }
  557.                     } else {
  558.                         this.model.set(fieldName, Backbone.$(e.currentTarget).val())
  559.                         this.model.isValid([fieldName])
  560.                         if(fieldName == 'user_form[password][first]' && !$("input[name='user_form[password][second]']").val().length) {
  561.                             Backbone.Validation.callbacks.valid(this, 'user_form[password][second]', 'input');
  562.                         }
  563.                     }
  564.                 },
  565.                 saveUser : function (e) {
  566.                     e.preventDefault();
  567.                     this.model.set(this.$el.serializeObject());
  568.                     if(this.model.isValid(true)) {
  569.                         this.$el.find('.uv-btn').attr('disabled', 'disabled');
  570.                         this.$el.submit();
  571.                     }
  572.                 },
  573.                 selectAll: function (e) {
  574.                     e.preventDefault();
  575.                     this.$(e.currentTarget).parents('.uv-scroll-plank')
  576.                             .find('input')
  577.                             .prop('checked', true)
  578.                 },
  579.                 deselectAll: function (e) {
  580.                     e.preventDefault();
  581.                     this.$(e.currentTarget).parents('.uv-scroll-plank')
  582.                             .find('input')
  583.                             .prop('checked', false);
  584.                 },
  585.             });
  586.             var userForm = new UserForm({
  587.                 el : $("#user-form"),
  588.                 model : new UserModel()
  589.             });
  590.             var HelpdeskResourcesView = Backbone.View.extend({
  591.                 el: '.uv-view',
  592.                 events: {
  593.                     'click .initiate-backup': 'initiateBackup',
  594.                 },
  595.                 initiateBackup: function(e) {
  596.                     e.preventDefault();
  597.                     $(e.target).attr('disabled', 'disabled');
  598.                     $(e.target).closest('form').submit();
  599.                 },
  600.             });
  601.             var helpdeskResources = new HelpdeskResourcesView();
  602.             
  603.             $('.uv-nav-tab-label li a').on('click', function(e) {
  604.                 e.preventDefault();
  605.                 $('.uv-nav-tab-label li a').removeClass('uv-nav-tab-active');
  606.                 $(this).addClass('uv-nav-tab-active');
  607.                 $('.uv-nav-tab-view').removeClass('uv-nav-tab-view-active')
  608.                 $('#' + $(this).attr('for')).addClass('uv-nav-tab-view-active')
  609.             });
  610.         });
  611.         
  612.         
  613.     </script>
  614. {% endblock %}