Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 2525 | Rev 2529 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1709 eleazar 1
<?php
2
$acl            = $this->viewModel()->getRoot()->getVariable('acl');
3
$currentUser    = $this->currentUserHelper();
4
$roleName       = $currentUser->getUserTypeId();
5
 
2029 eleazar 6
$routeIndex = $this->url('recruitment-and-selection/interview/form');
2128 eleazar 7
$routeAdd = $this->url('recruitment-and-selection/interview/form/add', ['candidate_uuid' => 'UUID_PLACEHOLDER']);
1877 eleazar 8
 
1827 eleazar 9
$allowAdd = $acl->isAllowed($roleName, 'recruitment-and-selection/interview/form/add') ? 1 : 0;
1709 eleazar 10
$this->headLink()->appendStylesheet($this->basePath('plugins/nprogress/nprogress.css'));
11
$this->inlineScript()->appendFile($this->basePath('plugins/nprogress/nprogress.js'));
12
 
13
 
14
$this->inlineScript()->appendFile($this->basePath('plugins/bootbox/bootbox.min.js'));
15
 
16
 
1885 eleazar 17
$this->inlineScript()->appendFile($this->basePath('plugins/ckeditor/ckeditor.js'));
1709 eleazar 18
$this->inlineScript()->appendFile($this->basePath('plugins/jquery-validation/jquery.validate.js'));
19
$this->inlineScript()->appendFile($this->basePath('plugins/jquery-validation/additional-methods.js'));
20
$this->inlineScript()->appendFile($this->basePath('plugins/jquery-validation/localization/messages_es.js'));
21
 
22
$this->headLink()->appendStylesheet($this->basePath('plugins/datatables-bs4/css/dataTables.bootstrap4.min.css'));
23
$this->headLink()->appendStylesheet($this->basePath('plugins/datatables-responsive/css/responsive.bootstrap4.min.css'));
24
 
25
$this->inlineScript()->appendFile($this->basePath('plugins/datatables/jquery.dataTables.min.js'));
26
$this->inlineScript()->appendFile($this->basePath('plugins/datatables-bs4/js/dataTables.bootstrap4.min.js'));
27
$this->inlineScript()->appendFile($this->basePath('plugins/datatables-responsive/js/dataTables.responsive.min.js'));
28
$this->inlineScript()->appendFile($this->basePath('plugins/datatables-responsive/js/responsive.bootstrap4.min.js'));
29
 
30
 
31
$this->inlineScript()->appendFile($this->basePath('plugins/jquery-validation/jquery.validate.js'));
32
$this->inlineScript()->appendFile($this->basePath('plugins/jquery-validation/additional-methods.js'));
33
$this->inlineScript()->appendFile($this->basePath('plugins/jquery-validation/localization/messages_es.js'));
34
 
35
 
36
 
37
$this->headLink()->appendStylesheet($this->basePath('plugins/bootstrap4-toggle/css/bootstrap4-toggle.min.css'));
38
$this->inlineScript()->appendFile($this->basePath('plugins/bootstrap4-toggle/js/bootstrap4-toggle.min.js'));
39
 
40
$this->inlineScript()->appendFile($this->basePath('plugins/bootstrap-confirmation/dist/bootstrap-confirmation.js'));
41
$this->headLink()->appendStylesheet($this->basePath('plugins/bootstrap-checkbox/awesome-bootstrap-checkbox.css'));
42
 
43
$this->inlineScript()->appendFile($this->basePath('plugins/moment/moment-with-locales.min.js'));
44
$this->headLink()->appendStylesheet($this->basePath('plugins/bootstrap-datetimepicker/css/bootstrap-datetimepicker.css'));
45
$this->inlineScript()->appendFile($this->basePath('plugins/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js'));
46
 
1887 eleazar 47
 
48
$this->inlineScript()->appendFile($this->basePath('plugins/select2/js/select2.js'));
49
$this->inlineScript()->appendFile($this->basePath('plugins/select2/js/i18n/es.js'));
50
$this->headLink()->appendStylesheet($this->basePath('plugins/select2/css/select2.css'));
51
 
52
$this->headLink()->appendStylesheet($this->basePath('plugins/select2-bootstrap4-theme/select2-bootstrap4.css'));
1709 eleazar 53
 
2052 eleazar 54
// JsRender //
55
$this->inlineScript()->appendFile($this->basePath('plugins/jsrender/jsrender.min.js'));
1709 eleazar 56
 
2510 eleazar 57
$evaluation_0 = \LeadersLinked\Model\RecruitmentSelectionInterview::EVALUATION_0;
58
$evaluation_1 = \LeadersLinked\Model\RecruitmentSelectionInterview::EVALUATION_1;
59
$evaluation_2 = \LeadersLinked\Model\RecruitmentSelectionInterview::EVALUATION_2;
60
$evaluation_3 = \LeadersLinked\Model\RecruitmentSelectionInterview::EVALUATION_3;
61
$evaluation_4 = \LeadersLinked\Model\RecruitmentSelectionInterview::EVALUATION_4;
62
 
63
$points_0 = \LeadersLinked\Model\RecruitmentSelectionInterview::POINTS_0;
64
$points_1 = \LeadersLinked\Model\RecruitmentSelectionInterview::POINTS_1;
65
$points_2 = \LeadersLinked\Model\RecruitmentSelectionInterview::POINTS_2;
66
$points_3 = \LeadersLinked\Model\RecruitmentSelectionInterview::POINTS_3;
67
$points_4 = \LeadersLinked\Model\RecruitmentSelectionInterview::POINTS_4;
68
 
69
 
70
 
1709 eleazar 71
$this->headStyle()->captureStart();
72
echo <<<CSS
73
 
74
CSS;
75
$this->headStyle()->captureEnd();
76
 
77
$this->inlineScript()->captureStart();
78
echo <<<JS
79
 
2503 eleazar 80
const classFormGenerator = function() {
81
    this.id = 0,
82
        this.table = '',
83
        this.text = '',
2506 eleazar 84
        this.behaviors = [],
2503 eleazar 85
        this.clear = function() {
2506 eleazar 86
            this.behaviors = [];
2503 eleazar 87
            this.render();
88
        },
89
 
90
        /**
91
         * Add element to section array
92
         */
2506 eleazar 93
        this.addSection = function( text, value) {
2503 eleazar 94
            var d = new Date();
95
            var slug = 'section' + d.getTime();
96
            var position = 0;
2506 eleazar 97
            $.each(this.behaviors, function(index, section) {
2503 eleazar 98
                if (position < section.position) {
99
                    position = section.position;
100
                }
101
            });
102
            position++;
103
            var section = {
2506 eleazar 104
                'slug_behaviors': slug,
2503 eleazar 105
                'text': text,
106
                'value': value,
107
                'position': position,
108
                'questions': [],
109
                'status': 0
110
            }
2506 eleazar 111
            this.behaviors.push(section);
2503 eleazar 112
        },
113
         /**
114
         * Edit element to section array
115
         */
2506 eleazar 116
        this.editSection = function(slug, text, value) {
2503 eleazar 117
            var renderTable = false;
2506 eleazar 118
            for (i = 0; i < this.behaviors.length; i++) {
119
                if (slug == this.behaviors[i].slug_behaviors) {
120
                    this.behaviors[i].text = text;
121
                    this.behaviors[i].value = value;
2503 eleazar 122
                    renderTable = true;
123
                    break;
124
                }
125
            }
126
            if (renderTable) {
127
                this.renderSection(slug);
128
            }
129
        },
130
         /**
131
         * Remove element to section array
132
         */
133
        this.deleteSection = function(slug) {
134
            var renderTable = false;
2506 eleazar 135
            for (i = 0; i < this.behaviors.length; i++) {
136
                if (slug == this.behaviors[i].slug_behaviors) {
137
                    this.behaviors.splice(i, 1);
2503 eleazar 138
                    renderTable = true;
139
                    break;
140
                }
141
            }
142
            if (renderTable) {
143
                $('#panel' + slug).remove();
144
            }
145
        }
146
}
147
 
1709 eleazar 148
jQuery( document ).ready(function( $ ) {
2504 eleazar 149
    var objFormGenerator = new classFormGenerator();
2506 eleazar 150
    //objFormGenerator.render();
1877 eleazar 151
    $.validator.setDefaults({
2015 eleazar 152
        debug: true,
153
        highlight: function(element) {
154
            $(element).addClass('is-invalid');
155
        },
156
        unhighlight: function(element) {
157
            $(element).removeClass('is-invalid');
158
        },
159
        errorElement: 'span',
160
        errorClass: 'error invalid-feedback',
161
        errorPlacement: function(error, element) {
162
            if(element.parent('.btn-file').length) {
163
                error.insertAfter(element.parent().parent());
164
            } else if(element.parent('.toggle').length) {
165
                error.insertAfter(element.parent().parent());
166
            } else {
167
                error.insertAfter(element.parent());
1709 eleazar 168
            }
2015 eleazar 169
        }
170
    });
1709 eleazar 171
 
2015 eleazar 172
    $.fn.showFormErrorValidator = function(fieldname, errors) {
173
        var field = $(fieldname);
174
        if(field) {
175
            $(field).addClass('is-invalid');
1709 eleazar 176
 
2015 eleazar 177
            var error = $('<span id="' + fieldname +'-error" class="error invalid-feedback">' + errors + '</div>');
178
 
179
            if(element.parent('.btn-file').length) {
180
                error.insertAfter(element.parent().parent());
181
            } else if(element.parent('.toggle').length) {
182
                error.insertAfter(element.parent().parent());
183
            } else {
184
                error.insertAfter(element.parent());
1709 eleazar 185
            }
2015 eleazar 186
        }
187
    };
1827 eleazar 188
 
2523 eleazar 189
    function getContent() {
190
        return $('[data-behavior-textarea]').map(
191
            function (idx, td) {
192
                const uuid = $(td).data('behavior-textarea');
193
                const textarea = $(td).find('textarea');
194
                const select = $(td).find('select');
2521 eleazar 195
 
2523 eleazar 196
                return {
197
                    uuid: uuid,
198
                    comment: textarea.val(),
199
                    evaluation: select.val(),
200
                }
201
            }
202
        ).get()
203
    }
204
 
2015 eleazar 205
    var validator = $('#form-interview').validate({
1877 eleazar 206
        debug: true,
207
        onclick: false,
208
        onkeyup: false,
209
        ignore: [],
210
        rules: {
2522 eleazar 211
            'text': {
1877 eleazar 212
                required: true,
213
                maxlength: 64,
214
            },
215
            'status': {
216
                required: false,
217
            },
2276 eleazar 218
 
2524 eleazar 219
        },
1877 eleazar 220
        submitHandler: function(form) {
221
            $.ajax({
222
                'dataType': 'json',
223
                'accept': 'application/json',
224
                'method': 'post',
2245 eleazar 225
                'url': $('#form').attr('action'),
2523 eleazar 226
                'data': {
227
                    content: getContent(),
228
                    vacancy_uuid: $('#vacancy_uuid').val(),
229
                    candidate_uuid: $('#candidate_uuid').val(),
230
                    points: $('#interviewLevel').val(),
231
                    comment: $('#text-option').val()
232
                }
1877 eleazar 233
            }).done(function(response) {
234
                NProgress.start();
235
                if (response['success']) {
236
                    $.fn.showSuccess(response['data']);
2521 eleazar 237
                    $('#main').show();
1900 eleazar 238
                    $('#row-form').hide();
1877 eleazar 239
                    gridTable.api().ajax.reload(null, false);
240
                } else {
241
                    validator.resetForm();
242
                    if (jQuery.type(response['data']) == 'string') {
243
                        $.fn.showError(response['data']);
244
                    } else {
245
                        $.each(response['data'], function(fieldname, errors) {
2245 eleazar 246
                            $.fn.showFormErrorValidator('#form #' + fieldname, errors);
1877 eleazar 247
                        });
248
                    }
249
                }
250
            }).fail(function(jqXHR, textStatus, errorThrown) {
251
                $.fn.showError(textStatus);
252
            }).always(function() {
253
                NProgress.done();
254
            });
255
            return false;
256
        },
257
        invalidHandler: function(form, validator) {}
258
    });
1709 eleazar 259
 
2015 eleazar 260
    $('body').on('click', 'button.btn-add', function(e) {
261
        e.preventDefault();
262
        NProgress.start();
263
        $.ajax({
264
            'dataType': 'json',
265
            'accept': 'application/json',
266
            'method': 'get',
2194 eleazar 267
            'url': '$routeAdd'.replaceAll('UUID_PLACEHOLDER', $('#candidate_uuid').val()),
2015 eleazar 268
        }).done(function(response) {
269
            if (response['success']) {
2237 eleazar 270
                var data = response.data
2521 eleazar 271
                $('#form').attr('action', '$routeAdd');
272
                $("#interview #text-option").val('');
273
                $("#interview #behavior-level").val('');
2264 eleazar 274
                $("#competencies-job").html($("#competenciesTemplate").render(data))
2313 eleazar 275
                $("#interview").show()
1877 eleazar 276
            } else {
2015 eleazar 277
                $.fn.showError(response['data']);
1877 eleazar 278
            }
2015 eleazar 279
        }).fail(function(jqXHR, textStatus, errorThrown) {
280
            $.fn.showError(textStatus);
281
        }).always(function() {
282
            NProgress.done();
1877 eleazar 283
        });
2015 eleazar 284
    });
1709 eleazar 285
 
2015 eleazar 286
    $('#form-interview #status').bootstrapToggle({
287
        'on': 'LABEL_ACTIVE',
288
        'off': 'LABEL_INACTIVE',
289
        'width': '160px',
290
        'height': '40px'
291
    });
1709 eleazar 292
 
2015 eleazar 293
 
2265 eleazar 294
 
2015 eleazar 295
    $('body').on('click', 'button.btn-cancel', function(e) {
296
        e.preventDefault();
2521 eleazar 297
        $('#main').show();
2015 eleazar 298
        $('#row-form').hide();
299
        $('#div-listing').show();
300
    });
301
 
302
    $('#form-filter #vacancy_uuid').change(function(e) {
303
        e.preventDefault();
304
        $('#form-filter #candidates_uuid').empty();
305
    })
2118 eleazar 306
 
2015 eleazar 307
    $('#form-filter #candidates_uuid').change(function(e) {
308
        e.preventDefault();
309
    })
2525 eleazar 310
     /**
311
     * Clicked cancel new/edit Form
312
     */
313
    $('button.btn-edit-cancel').click(function(e) {
314
        e.preventDefault();
2526 eleazar 315
        $('#interview').hide();
2525 eleazar 316
    });
317
    /**
318
     * Clicked save and continue new Form
319
     */
320
    $('button.btn-form-save-continue').click(function(e) {
321
        e.preventDefault();
322
        $('#interview #form-continue').val('1')
323
        $('#interview').submit();
324
    });
325
    /**
326
     * Clicked save and close new/edit Form
327
     */
328
    $('button.btn-form-save-close').click(function(e) {
329
        e.preventDefault();
330
        $('#interview #form-continue').val('0')
331
        $('#interview').submit();
332
    });
2029 eleazar 333
 
334
    $('#vacancy_uuid').on('change', function () {
2042 eleazar 335
        $('#candidate_uuid').html('');
336
 
2029 eleazar 337
        $.ajax({
338
            'dataType': 'json',
339
            'accept': 'application/json',
340
            'method': 'get',
2031 eleazar 341
            'url': "$routeIndex" + "?vacancy_uuid=" + $('#vacancy_uuid').val(),
2038 eleazar 342
        }).done(function (response) {
343
            var data = response.data
344
 
2036 eleazar 345
            data.candidates.forEach(function (candidate) {
2041 eleazar 346
                var option = $('<option />').val(candidate.uuid).text(candidate.first_name);
347
 
348
                $('#candidate_uuid').append(option);
2036 eleazar 349
            });
2052 eleazar 350
 
2244 eleazar 351
            $('#job-description').html($('#job-description-template').render(response.data));
2029 eleazar 352
        })
353
    });
2032 eleazar 354
 
355
    $('#vacancy_uuid').change();
1709 eleazar 356
});
357
JS;
358
$this->inlineScript()->captureEnd();
359
?>
360
 
361
 
362
<!-- Content Header (Page header) -->
2521 eleazar 363
<section class="main-header">
1709 eleazar 364
	<div class="container-fluid">
365
    	<div class="row mb-2">
366
        	<div class="col-sm-12">
367
            	<h1>LABEL_INTERVIEW</h1>
368
			</div>
369
		</div>
370
	</div><!-- /.container-fluid -->
371
</section>
372
 
2521 eleazar 373
<section class="main">
1709 eleazar 374
	<div class="container-fluid">
375
    	<div class="row">
376
        	<div class="col-12">
377
				<div class="card">
2021 eleazar 378
					<div class="card-header">
1709 eleazar 379
                        <div class="row">
380
                            <div class="col-md-6 col-sm-12">
381
                                <div class="form-group">
2021 eleazar 382
                                    <label for="vacancy_uuid">LABEL_VACANCY</label>
2023 eleazar 383
                                    <select id="vacancy_uuid" name="vacancy_uuid" class="form-control">
2021 eleazar 384
                                        <?php foreach($this->vacancies as $vacancy): ?>
2023 eleazar 385
                                            <option value="<?= $vacancy->uuid ?>"><?= $vacancy->name ?></option>
2021 eleazar 386
                                        <?php endforeach; ?>
387
                                    </select>
1709 eleazar 388
                                </div>
389
                            </div>
390
                            <div class="col-md-6 col-sm-12">
391
                                <div class="form-group">
2040 eleazar 392
                                    <label for="candidate_uuid">LABEL_CANDIDATES</label>
2024 eleazar 393
                                    <select id="candidate_uuid" name="candidate_uuid" class="form-control">
394
                                    </select>
1709 eleazar 395
                                </div>
396
                            </div>
397
                            <div
398
                                class="col-md-12 col-sm-12"
399
                            >
400
                            </div>
401
                        </div>
402
					</div>
403
					<div class="card-body">
2052 eleazar 404
                        <div id="job-description"></div>
1709 eleazar 405
                   	</div>
2015 eleazar 406
 
407
                    <div class="card-footer clearfix">
408
                        <div style="float:right;">
409
                            <?php if($allowAdd) : ?>
410
                                <button type="button" class="btn btn-primary btn-add"><i class="fa fa-plus"></i> LABEL_ADD </button>
411
                            <?php endif; ?>
1876 eleazar 412
                        </div>
2015 eleazar 413
                    </div>
414
                </div>
1876 eleazar 415
            </div>
2015 eleazar 416
        </div>
417
 	</div>
418
</section>
2052 eleazar 419
 
420
<script id="job-description-template" type="text/x-jsrender">
421
    <div class="card">
422
        <div class="card-body">
423
            <h5 class="card-title">{{:job_description.name}}</h5>
424
            <p class="card-text">{{:vacancy.description}}</p>
2214 eleazar 425
            <p class="card-text">{{:job_description.objectives}}</p>
426
            <p class="card-text">{{:job_description.functions}}</p>
2052 eleazar 427
        </div>
428
    </div>
2061 eleazar 429
</script>
430
 
2314 eleazar 431
<section id="interview" style="display: none;">
2215 eleazar 432
	<div class="container-fluid">
433
    	<div class="row">
434
        	<div class="col-12">
2525 eleazar 435
                <input type="hidden" name="form-id" id="form-id" value="0" />
436
                <input type="hidden" name="form-continue" id="form-continue" value="0" />
2215 eleazar 437
				<div class="card">
438
					<div class="card-header">
439
                        <label>interview</label>
440
					</div>
441
					<div class="card-body">
2217 eleazar 442
                        <div id="competencies-job"></div>
2313 eleazar 443
 
444
                        <div class="form-group">
2515 eleazar 445
                              <label for="text-option">LABEL_FINAL_COMMENT</label>
446
                              <!-- ckeditor -->
447
                              <textarea  name="text-option" id="text-option" rows="5" class="form-control"></textarea>
448
                        </div>
449
                        <div>
450
                            <label for="interviewLevel">LABEL_EVALUATION</label>
451
                            <select class="form-control" id="interviewLevel">
452
                            <option>$points_0</option>
453
                            <option>$points_1</option>
454
                            <option>$points_2</option>
455
                            <option>$points_3</option>
456
                            <option>$points_4</option>
457
                        </div>
458
                   </select>
2313 eleazar 459
                   	</div>
2280 eleazar 460
                    <div class="card-footer clearfix">
2508 eleazar 461
                    <button type="submit" form="form-main" class="btn btn-info btn-form-save-continue">LABEL_SAVE & LABEL_CONTINUE</button>
462
                    <button type="button" class="btn btn-primary btn-form-save-close">LABEL_SAVE & LABEL_CLOSE</button>
463
                    <button type="button" class="btn btn-secondary btn-edit-cancel">LABEL_CANCEL</button>
2280 eleazar 464
                    </div>
2278 eleazar 465
                </div>
2215 eleazar 466
            </div>
467
        </div>
468
 	</div>
469
</section>
470
 
2264 eleazar 471
<script id="competenciesTemplate" type="text/x-jsrender">
2508 eleazar 472
<table class="table table-bordered" id="panel-{{:slug_section}}>
2293 eleazar 473
    <thead>
474
        <tr>
2306 eleazar 475
           <th style="width: 50%;">LABEL_ELEMENT</th>
2293 eleazar 476
           <th style="width: 50%;">LABEL_TITLE</th>
477
        </tr>
478
    </thead>
2300 eleazar 479
    <tbody>
480
        {{for job_description.competencies}}
481
            <tr>
482
               <td class="text-left">LABEL_COMPETENCY</td>
2302 eleazar 483
               <td class="text-left">{{:competency_name}}</td>
2300 eleazar 484
            </tr>
2302 eleazar 485
 
486
            {{for behaviors}}
2308 eleazar 487
                <tr>
2302 eleazar 488
                   <td class="text-left">--LABEL_CONDUCT</td>
489
                   <td class="text-left">
2303 eleazar 490
                      {{:description}}
2508 eleazar 491
                   </td>
2507 eleazar 492
                </tr>
493
                <tr>
2520 eleazar 494
                    <td colspan="2" data-behavior-textarea="{{:uuid}}">
2519 eleazar 495
                        <label for="textarea-{{:uuid}}">LABEL_COMMENT</label>
496
 
497
                        <textarea
498
                            id="textarea-{{:uuid}}"
499
                            class="form-control"
500
                        ></textarea>
501
 
502
                        <label for="select-{{:uuid}}">LABEL_EVALUATION</label>
503
 
504
                        <select class="form-control" id="behavior-level-{{:uuid}}">
505
                            <option value="<?= $points_0 ?>"><?= $points_0 ?></option>
506
                            <option value="<?= $points_1 ?>"><?= $points_1 ?></option>
507
                            <option value="<?= $points_2 ?>"><?= $points_2 ?></option>
508
                            <option value="<?= $points_3 ?>"><?= $points_3 ?></option>
509
                            <option value="<?= $points_4 ?>"><?= $points_4 ?></option>
510
                        </select>
511
                    </td>
2506 eleazar 512
                </tr>
513
            {{/for}}
514
 
2300 eleazar 515
        {{/for}}
516
    </tbody>
2293 eleazar 517
</table>
2241 eleazar 518
</script>