Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 2524 | Rev 2526 | 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
                $("#main #vacancy_uuid").val('');
273
                $("#main #candidate_uuid").val('');
274
                $("#interview #text-option").val('');
275
                $("#interview #behavior-level").val('');
2264 eleazar 276
                $("#competencies-job").html($("#competenciesTemplate").render(data))
2313 eleazar 277
                $("#interview").show()
1877 eleazar 278
            } else {
2015 eleazar 279
                $.fn.showError(response['data']);
1877 eleazar 280
            }
2015 eleazar 281
        }).fail(function(jqXHR, textStatus, errorThrown) {
282
            $.fn.showError(textStatus);
283
        }).always(function() {
284
            NProgress.done();
1877 eleazar 285
        });
2015 eleazar 286
    });
1709 eleazar 287
 
2015 eleazar 288
    $('#form-interview #status').bootstrapToggle({
289
        'on': 'LABEL_ACTIVE',
290
        'off': 'LABEL_INACTIVE',
291
        'width': '160px',
292
        'height': '40px'
293
    });
1709 eleazar 294
 
2015 eleazar 295
 
2265 eleazar 296
 
2015 eleazar 297
    $('body').on('click', 'button.btn-cancel', function(e) {
298
        e.preventDefault();
2521 eleazar 299
        $('#main').show();
2015 eleazar 300
        $('#row-form').hide();
301
        $('#div-listing').show();
302
    });
303
 
304
    $('#form-filter #vacancy_uuid').change(function(e) {
305
        e.preventDefault();
306
        $('#form-filter #candidates_uuid').empty();
307
    })
2118 eleazar 308
 
2015 eleazar 309
    $('#form-filter #candidates_uuid').change(function(e) {
310
        e.preventDefault();
311
    })
2525 eleazar 312
     /**
313
     * Clicked cancel new/edit Form
314
     */
315
    $('button.btn-edit-cancel').click(function(e) {
316
        e.preventDefault();
317
        $('#row-edit').hide();
318
        $('#row-forms').show();
319
    });
320
    /**
321
     * Clicked save and continue new Form
322
     */
323
    $('button.btn-form-save-continue').click(function(e) {
324
        e.preventDefault();
325
        $('#interview #form-continue').val('1')
326
        $('#interview').submit();
327
    });
328
    /**
329
     * Clicked save and close new/edit Form
330
     */
331
    $('button.btn-form-save-close').click(function(e) {
332
        e.preventDefault();
333
        $('#interview #form-continue').val('0')
334
        $('#interview').submit();
335
    });
2029 eleazar 336
 
337
    $('#vacancy_uuid').on('change', function () {
2042 eleazar 338
        $('#candidate_uuid').html('');
339
 
2029 eleazar 340
        $.ajax({
341
            'dataType': 'json',
342
            'accept': 'application/json',
343
            'method': 'get',
2031 eleazar 344
            'url': "$routeIndex" + "?vacancy_uuid=" + $('#vacancy_uuid').val(),
2038 eleazar 345
        }).done(function (response) {
346
            var data = response.data
347
 
2036 eleazar 348
            data.candidates.forEach(function (candidate) {
2041 eleazar 349
                var option = $('<option />').val(candidate.uuid).text(candidate.first_name);
350
 
351
                $('#candidate_uuid').append(option);
2036 eleazar 352
            });
2052 eleazar 353
 
2244 eleazar 354
            $('#job-description').html($('#job-description-template').render(response.data));
2029 eleazar 355
        })
356
    });
2032 eleazar 357
 
358
    $('#vacancy_uuid').change();
1709 eleazar 359
});
360
JS;
361
$this->inlineScript()->captureEnd();
362
?>
363
 
364
 
365
<!-- Content Header (Page header) -->
2521 eleazar 366
<section class="main-header">
1709 eleazar 367
	<div class="container-fluid">
368
    	<div class="row mb-2">
369
        	<div class="col-sm-12">
370
            	<h1>LABEL_INTERVIEW</h1>
371
			</div>
372
		</div>
373
	</div><!-- /.container-fluid -->
374
</section>
375
 
2521 eleazar 376
<section class="main">
1709 eleazar 377
	<div class="container-fluid">
378
    	<div class="row">
379
        	<div class="col-12">
380
				<div class="card">
2021 eleazar 381
					<div class="card-header">
1709 eleazar 382
                        <div class="row">
383
                            <div class="col-md-6 col-sm-12">
384
                                <div class="form-group">
2021 eleazar 385
                                    <label for="vacancy_uuid">LABEL_VACANCY</label>
2023 eleazar 386
                                    <select id="vacancy_uuid" name="vacancy_uuid" class="form-control">
2021 eleazar 387
                                        <?php foreach($this->vacancies as $vacancy): ?>
2023 eleazar 388
                                            <option value="<?= $vacancy->uuid ?>"><?= $vacancy->name ?></option>
2021 eleazar 389
                                        <?php endforeach; ?>
390
                                    </select>
1709 eleazar 391
                                </div>
392
                            </div>
393
                            <div class="col-md-6 col-sm-12">
394
                                <div class="form-group">
2040 eleazar 395
                                    <label for="candidate_uuid">LABEL_CANDIDATES</label>
2024 eleazar 396
                                    <select id="candidate_uuid" name="candidate_uuid" class="form-control">
397
                                    </select>
1709 eleazar 398
                                </div>
399
                            </div>
400
                            <div
401
                                class="col-md-12 col-sm-12"
402
                            >
403
                            </div>
404
                        </div>
405
					</div>
406
					<div class="card-body">
2052 eleazar 407
                        <div id="job-description"></div>
1709 eleazar 408
                   	</div>
2015 eleazar 409
 
410
                    <div class="card-footer clearfix">
411
                        <div style="float:right;">
412
                            <?php if($allowAdd) : ?>
413
                                <button type="button" class="btn btn-primary btn-add"><i class="fa fa-plus"></i> LABEL_ADD </button>
414
                            <?php endif; ?>
1876 eleazar 415
                        </div>
2015 eleazar 416
                    </div>
417
                </div>
1876 eleazar 418
            </div>
2015 eleazar 419
        </div>
420
 	</div>
421
</section>
2052 eleazar 422
 
423
<script id="job-description-template" type="text/x-jsrender">
424
    <div class="card">
425
        <div class="card-body">
426
            <h5 class="card-title">{{:job_description.name}}</h5>
427
            <p class="card-text">{{:vacancy.description}}</p>
2214 eleazar 428
            <p class="card-text">{{:job_description.objectives}}</p>
429
            <p class="card-text">{{:job_description.functions}}</p>
2052 eleazar 430
        </div>
431
    </div>
2061 eleazar 432
</script>
433
 
2314 eleazar 434
<section id="interview" style="display: none;">
2215 eleazar 435
	<div class="container-fluid">
436
    	<div class="row">
437
        	<div class="col-12">
2525 eleazar 438
                <input type="hidden" name="form-id" id="form-id" value="0" />
439
                <input type="hidden" name="form-continue" id="form-continue" value="0" />
2215 eleazar 440
				<div class="card">
441
					<div class="card-header">
442
                        <label>interview</label>
443
					</div>
444
					<div class="card-body">
2217 eleazar 445
                        <div id="competencies-job"></div>
2313 eleazar 446
 
447
                        <div class="form-group">
2515 eleazar 448
                              <label for="text-option">LABEL_FINAL_COMMENT</label>
449
                              <!-- ckeditor -->
450
                              <textarea  name="text-option" id="text-option" rows="5" class="form-control"></textarea>
451
                        </div>
452
                        <div>
453
                            <label for="interviewLevel">LABEL_EVALUATION</label>
454
                            <select class="form-control" id="interviewLevel">
455
                            <option>$points_0</option>
456
                            <option>$points_1</option>
457
                            <option>$points_2</option>
458
                            <option>$points_3</option>
459
                            <option>$points_4</option>
460
                        </div>
461
                   </select>
2313 eleazar 462
                   	</div>
2280 eleazar 463
                    <div class="card-footer clearfix">
2508 eleazar 464
                    <button type="submit" form="form-main" class="btn btn-info btn-form-save-continue">LABEL_SAVE & LABEL_CONTINUE</button>
465
                    <button type="button" class="btn btn-primary btn-form-save-close">LABEL_SAVE & LABEL_CLOSE</button>
466
                    <button type="button" class="btn btn-secondary btn-edit-cancel">LABEL_CANCEL</button>
2280 eleazar 467
                    </div>
2278 eleazar 468
                </div>
2215 eleazar 469
            </div>
470
        </div>
471
 	</div>
472
</section>
473
 
2264 eleazar 474
<script id="competenciesTemplate" type="text/x-jsrender">
2508 eleazar 475
<table class="table table-bordered" id="panel-{{:slug_section}}>
2293 eleazar 476
    <thead>
477
        <tr>
2306 eleazar 478
           <th style="width: 50%;">LABEL_ELEMENT</th>
2293 eleazar 479
           <th style="width: 50%;">LABEL_TITLE</th>
480
        </tr>
481
    </thead>
2300 eleazar 482
    <tbody>
483
        {{for job_description.competencies}}
484
            <tr>
485
               <td class="text-left">LABEL_COMPETENCY</td>
2302 eleazar 486
               <td class="text-left">{{:competency_name}}</td>
2300 eleazar 487
            </tr>
2302 eleazar 488
 
489
            {{for behaviors}}
2308 eleazar 490
                <tr>
2302 eleazar 491
                   <td class="text-left">--LABEL_CONDUCT</td>
492
                   <td class="text-left">
2303 eleazar 493
                      {{:description}}
2508 eleazar 494
                   </td>
2507 eleazar 495
                </tr>
496
                <tr>
2520 eleazar 497
                    <td colspan="2" data-behavior-textarea="{{:uuid}}">
2519 eleazar 498
                        <label for="textarea-{{:uuid}}">LABEL_COMMENT</label>
499
 
500
                        <textarea
501
                            id="textarea-{{:uuid}}"
502
                            class="form-control"
503
                        ></textarea>
504
 
505
                        <label for="select-{{:uuid}}">LABEL_EVALUATION</label>
506
 
507
                        <select class="form-control" id="behavior-level-{{:uuid}}">
508
                            <option value="<?= $points_0 ?>"><?= $points_0 ?></option>
509
                            <option value="<?= $points_1 ?>"><?= $points_1 ?></option>
510
                            <option value="<?= $points_2 ?>"><?= $points_2 ?></option>
511
                            <option value="<?= $points_3 ?>"><?= $points_3 ?></option>
512
                            <option value="<?= $points_4 ?>"><?= $points_4 ?></option>
513
                        </select>
514
                    </td>
2506 eleazar 515
                </tr>
516
            {{/for}}
517
 
2300 eleazar 518
        {{/for}}
519
    </tbody>
2293 eleazar 520
</table>
2241 eleazar 521
</script>