Proyectos de Subversion LeadersLinked - Backend

Rev

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

Rev Autor Línea Nro. Línea
1 www 1
<?php
2
use LeadersLinked\Model\CompanyUser;
3
 
4
$acl            = $this->viewModel()->getRoot()->getVariable('acl');
5
$currentUser    = $this->currentUserHelper();
6
 
7
$roleName = $currentUser->getUserTypeId();
8
 
9
 
10
//$routeAdd       = $this->url('users/add');
11
$routeDatatable = $this->url('users');
12
$routeInvite    = $this->url('users/invite');
13
$routeUpload    = $this->url('users/upload');
14
 
15
 
16
 
17
$allowInvite            = $acl->isAllowed($roleName, 'users/invite') ? 1 : 0;
18
$allowAccept            = $acl->isAllowed($roleName, 'users/accept') ? 1 : 0;
19
$allowCancel            = $acl->isAllowed($roleName, 'users/cancel') ? 1 : 0;
20
$allowReject            = $acl->isAllowed($roleName, 'users/reject') ? 1 : 0;
21
$allowEdit              = $acl->isAllowed($roleName, 'users/edit') ? 1 : 0;
22
$allowUpload            = $acl->isAllowed($roleName, 'users/upload') ? 1 : 0;
23
$allowChangePassword    = $acl->isAllowed($roleName, 'users/change-password') ? 1 : 0;
24
$allowUnblock           = $acl->isAllowed($roleName, 'users/unblock') ? 1 : 0;
25
 
26
 
27
$this->headLink()->appendStylesheet($this->basePath('plugins/nprogress/nprogress.css'));
28
$this->inlineScript()->appendFile($this->basePath('plugins/nprogress/nprogress.js'));
29
 
30
$this->inlineScript()->appendFile($this->basePath('plugins/ckeditor/ckeditor.js'));
31
 
32
 
33
$this->inlineScript()->appendFile($this->basePath('plugins/jquery-validation/jquery.validate.js'));
34
$this->inlineScript()->appendFile($this->basePath('plugins/jquery-validation/additional-methods.js'));
35
$this->inlineScript()->appendFile($this->basePath('plugins/jquery-validation/localization/messages_es.js'));
36
 
37
$this->headLink()->appendStylesheet($this->basePath('plugins/datatables-bs4/css/dataTables.bootstrap4.min.css'));
38
$this->headLink()->appendStylesheet($this->basePath('plugins/datatables-responsive/css/responsive.bootstrap4.min.css'));
39
 
40
$this->inlineScript()->appendFile($this->basePath('plugins/datatables/jquery.dataTables.min.js'));
41
$this->inlineScript()->appendFile($this->basePath('plugins/datatables-bs4/js/dataTables.bootstrap4.min.js'));
42
$this->inlineScript()->appendFile($this->basePath('plugins/datatables-responsive/js/dataTables.responsive.min.js'));
43
$this->inlineScript()->appendFile($this->basePath('plugins/datatables-responsive/js/responsive.bootstrap4.min.js'));
44
 
45
 
46
$this->headLink()->appendStylesheet($this->basePath('plugins/bootstrap4-toggle/css/bootstrap4-toggle.min.css'));
47
$this->inlineScript()->appendFile($this->basePath('plugins/bootstrap4-toggle/js/bootstrap4-toggle.min.js'));
48
 
49
$this->inlineScript()->appendFile($this->basePath('plugins/bootstrap-confirmation/dist/bootstrap-confirmation.js'));
50
$this->headLink()->appendStylesheet($this->basePath('plugins/bootstrap-checkbox/awesome-bootstrap-checkbox.css'));
51
 
52
 
53
$this->inlineScript()->appendFile($this->basePath('plugins/bootstrap-autocomplete/bootstrap-autocomplete.js'));
54
 
55
 
56
$this->headLink()->appendStylesheet($this->basePath('plugins/bootstrap-fileinput/css/fileinput.min.css'));
57
$this->headLink()->appendStylesheet($this->basePath('plugins/bootstrap-fileinput/themes/explorer-fas/theme.css'));
58
 
59
$this->inlineScript()->appendFile($this->basePath('plugins/bootstrap-fileinput/js/plugins/piexif.js'));
60
$this->inlineScript()->appendFile($this->basePath('plugins/bootstrap-fileinput/js/plugins/sortable.js'));
61
$this->inlineScript()->appendFile($this->basePath('plugins/bootstrap-fileinput/js/fileinput.js'));
62
$this->inlineScript()->appendFile($this->basePath('plugins/bootstrap-fileinput/js/locales/es.js'));
63
$this->inlineScript()->appendFile($this->basePath('plugins/bootstrap-fileinput/themes/fas/theme.js'));
64
$this->inlineScript()->appendFile($this->basePath('plugins/bootstrap-fileinput/themes/explorer-fas/theme.js'));
65
 
66
$this->headStyle()->captureStart();
67
 
68
$this->inlineScript()->captureStart();
69
echo <<<JS
70
    jQuery( document ).ready(function( $ ) {
71
        $.validator.addMethod('passwordStrengthCheck', function(value) {
72
            return /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$^x%x*-]).{6,16}$/.test(value)
73
        }, 'ERROR_PASSWORD_STRENGTH');
74
 
75
        $.validator.setDefaults({
76
            debug: true,
77
            highlight: function(element) {
78
                $(element).closest('.sn-field').addClass('sn-field-has-error');
79
            },
80
            unhighlight: function(element) {
81
                $(element).closest('.sn-field').removeClass('sn-field-has-error');
82
            },
83
            errorElement: 'div',
84
            errorClass: 'sn-field-invalid-feedback',
85
            errorPlacement: function(error, element) {
86
 
87
                if(element.parent('.sn-field').length) {
88
                    error.insertAfter(element.parent());
89
                } else if (element.parent('.fgt-sec').length) {
90
                    error.insertAfter(element.parent());
91
                } else {
92
                    error.insertAfter(element);
93
                }
94
            }
95
        });
96
 
97
        $.validator.setDefaults({
98
            debug: true,
99
            highlight: function(element) {
100
                $(element).addClass('form-group-has-error');
101
            },
102
            unhighlight: function(element) {
103
                $(element).removeClass('form-group-has-error');
104
            },
105
            errorElement: 'div',
106
            errorClass: 'form-group-invalid-feedback',
107
            errorPlacement: function(error, element) {
108
                if(element.parent('.form-group').length) {
109
                    error.insertAfter(element.parent());
110
                } else if(element.parent('.toggle').length) {
111
                    error.insertAfter(element.parent().parent());
112
                } else {
113
                    error.insertAfter(element);
114
                }
115
            }
116
        });
117
 
118
        $.fn.showFormErrorValidator = function(fieldname, errors) {
119
            var field = $(fieldname);
120
            if(field) {
121
                $(field).addClass('form-group-has-error');
122
 
123
 
124
                var error = $('<div id="' + fieldname +'-error" class="form-group-invalid-feedback">' + errors + '</div>');
125
                if(field.parent('.form-group').length) {
126
                    error.insertAfter(field.parent());
127
                } else  if(field.parent('.toggle').length) {
128
                    error.insertAfter(field.parent().parent());
129
                } else {
130
                    error.insertAfter(field);
131
                }
132
            }
133
        };
134
 
135
 
136
 
137
        var allowInvite = $allowInvite;
138
        var allowAccept = $allowAccept;
139
        var allowCancel = $allowCancel;
140
        var allowReject = $allowReject;
141
        var allowEdit  = $allowEdit;
142
        var allowUpload = $allowUpload;
143
        var allowChangePassword = $allowChangePassword;
144
        var allowUnblock = $allowUnblock;
145
 
146
        var gridTable = $('#gridTable').dataTable( {
147
            'processing': true,
148
            'serverSide': true,
149
            'searching': true,
150
            'order': [[ 0, 'asc' ]],
151
            'ordering':  true,
152
            'ordenable' : true,
153
            'responsive': true,
154
            'select' : false,
155
        	'paging': true,
156
            'pagingType': 'simple_numbers',
157
    		'ajax': {
158
    			'url' : '$routeDatatable',
159
    			'type' : 'get',
160
                'data' : function(data) {
161
                    data.status = $('#form-filter #status').val();
162
                } ,
163
                'beforeSend': function (request) {
164
                  NProgress.start();
165
                },
166
                'dataFilter': function(response) {
167
                    var response = jQuery.parseJSON( response );
168
 
169
                    var json                = {};
170
                    json.recordsTotal       = 0;
171
                    json.recordsFiltered    = 0;
172
                    json.data               = [];
173
 
174
 
175
                    if(response.success) {
176
                        json.recordsTotal       = response.data.total;
177
                        json.recordsFiltered    = response.data.total;
178
                        json.data               = response.data.items;
179
                    } else {
180
                        $.fn.showError(response.data)
181
                    }
182
 
183
                    return JSON.stringify( json );
184
                }
185
    		},
186
            'language' : {
187
                'sProcessing':     'LABEL_DATATABLE_SPROCESSING',
188
                'sLengthMenu':     'LABEL_DATATABLE_SLENGTHMENU',
189
                'sZeroRecords':    'LABEL_DATATABLE_SZERORECORDS',
190
                'sEmptyTable':     'LABEL_DATATABLE_SEMPTYTABLE',
191
                'sInfo':           'LABEL_DATATABLE_SINFO',
192
                'sInfoEmpty':      'LABEL_DATATABLE_SINFOEMPTY',
193
                'sInfoFiltered':   'LABEL_DATATABLE_SINFOFILTERED',
194
                'sInfoPostFix':    '',
195
                'sSearch':         'LABEL_DATATABLE_SSEARCH',
196
                'sUrl':            '',
197
                'sInfoThousands':  ',',
198
                'sLoadingRecords': 'LABEL_DATATABLE_SLOADINGRECORDS',
199
                'oPaginate': {
200
                    'sFirst':    'LABEL_DATATABLE_SFIRST',
201
                    'sLast':     'LABEL_DATATABLE_SLAST',
202
                    'sNext':     'LABEL_DATATABLE_SNEXT',
203
                    'sPrevious': 'LABEL_DATATABLE_SPREVIOUS'
204
                },
205
                'oAria': {
206
                    'sSortAscending':  ': LABEL_DATATABLE_SSORTASCENDING',
207
                    'sSortDescending': ':LABEL_DATATABLE_SSORTDESCENDING'
208
                },
209
            },
210
            'drawCallback': function( settings ) {
211
                NProgress.done();
212
                $('button.btn-unblock').confirmation({
213
                    rootSelector: 'button.btn-unblock',
214
                    title : 'LABEL_ARE_YOU_SURE',
215
                    singleton : true,
216
                    btnOkLabel: 'LABEL_YES',
217
                    btnCancelLabel: 'LABEL_NO',
218
                    onConfirm: function(value) {
219
                        action = $(this).data('href');
220
                        NProgress.start();
221
                        $.ajax({
222
                            'dataType'  : 'json',
223
                            'accept'    : 'application/json',
224
                            'method'    : 'post',
225
                            'url'       :  action,
226
                        }).done(function(response) {
227
                            if(response['success']) {
228
                                $.fn.showSuccess(response['data']);
229
                                gridTable.api().ajax.reload(null, false);
230
                            } else {
231
                                $.fn.showError(response['data']);
232
                            }
233
                        }).fail(function( jqXHR, textStatus, errorThrown) {
234
                            $.fn.showError(textStatus);
235
                        }).always(function() {
236
                            NProgress.done();
237
                        });
238
                    },
239
                });
240
 
241
                $('button.btn-reject').confirmation({
242
                    rootSelector: 'button.btn-reject',
243
                    title : 'LABEL_ARE_YOU_SURE',
244
                    singleton : true,
245
                    btnOkLabel: 'LABEL_YES',
246
                    btnCancelLabel: 'LABEL_NO',
247
                    onConfirm: function(value) {
248
                        action = $(this).data('href');
249
                        NProgress.start();
250
                        $.ajax({
251
                            'dataType'  : 'json',
252
                            'accept'    : 'application/json',
253
                            'method'    : 'post',
254
                            'url'       :  action,
255
                        }).done(function(response) {
256
                            if(response['success']) {
257
                                $.fn.showSuccess(response['data']);
258
                                gridTable.api().ajax.reload(null, false);
259
                            } else {
260
                                $.fn.showError(response['data']);
261
                            }
262
                        }).fail(function( jqXHR, textStatus, errorThrown) {
263
                            $.fn.showError(textStatus);
264
                        }).always(function() {
265
                            NProgress.done();
266
                        });
267
                    },
268
                });
269
 
270
                $('button.btn-cancel').confirmation({
271
                    rootSelector: 'button.btn-cancel',
272
                    title : 'LABEL_ARE_YOU_SURE',
273
                    singleton : true,
274
                    btnOkLabel: 'LABEL_YES',
275
                    btnCancelLabel: 'LABEL_NO',
276
                    onConfirm: function(value) {
277
                        action = $(this).data('href');
278
                        NProgress.start();
279
                        $.ajax({
280
                            'dataType'  : 'json',
281
                            'accept'    : 'application/json',
282
                            'method'    : 'post',
283
                            'url'       :  action,
284
                        }).done(function(response) {
285
                            if(response['success']) {
286
                                $.fn.showSuccess(response['data']);
287
                                gridTable.api().ajax.reload(null, false);
288
                            } else {
289
                                $.fn.showError(response['data']);
290
                            }
291
                        }).fail(function( jqXHR, textStatus, errorThrown) {
292
                            $.fn.showError(textStatus);
293
                        }).always(function() {
294
                            NProgress.done();
295
                        });
296
                    },
297
                });
298
            },
299
            'aoColumns': [
300
                { 'mDataProp': 'first_name' },
301
                { 'mDataProp': 'last_name' },
302
                { 'mDataProp': 'email' },
303
                { 'mDataProp': 'details' },
304
                { 'mDataProp': 'actions' },
305
    	    ],
306
            'columnDefs': [
307
                {
308
                    'targets': 0,
309
                    'className' : 'text-vertical-middle',
310
                },
311
                {
312
                    'targets': 1,
313
                    'className' : 'text-vertical-middle',
314
                },
315
                {
316
                    'targets': 2,
317
                    'className' : 'text-vertical-middle',
318
                },
319
                {
320
                    'targets': -2,
321
                    'orderable': false,
322
                    'render' : function ( data, type, row ) {
323
                        var s =  '';
324
                        s = s + 'LABEL_STATUS : <br>' + data['status'] + '<br>';
325
                        s = s + 'LABEL_ACCESS_BACKEND : ' + data['backend'] + '<br>';
326
                        s = s + 'LABEL_CREATOR : ' + data['creator'] + '<br>';
327
 
328
                        s = s + 'LABEL_EDIT : <br>';
329
 
330
                        $.each(data['roles'], function(i, role) {
331
                            s = s + role + '<br>';
332
                        });
333
 
334
                        s = s + 'LABEL_BLOCKED : ' + data['blocked'] + '<br>';
335
                        s = s + 'LABEL_EMAIL_VERIFIED : ' + data['email_verified'] + '<br>';
336
                        s = s + 'LABEL_LOGIN_ATTEMP : ' + data['login_attempt'] + '<br>';
337
                        return s;
338
                    }
339
                },
340
                {
341
                    'targets': -1,
342
                    'orderable': false,
343
                    'render' : function ( data, type, row ) {
344
                        s = '';
345
 
346
                        if(allowAccept && data['link_accept']) {
347
                            s = s + '<button class="btn btn-sm btn-accept btn-primary" style="margin-top: 5px" data-href="' + data['link_accept']+ '" data-toggle="tooltip" title="LABEL_ACCEPT"><i class="fa fa-check"></i> LABEL_ACCEPT </button><br>';
348
                        }
349
                        if(allowCancel && data['link_cancel']) {
350
                            s = s + '<button class="btn btn-sm btn-cancel btn-danger" style="margin-top: 5px" data-href="' + data['link_cancel']+ '" data-toggle="tooltip" title="LABEL_CANCEL"><i class="fa fa-times"></i> LABEL_CANCEL </button><br>';
351
                        }
352
                        if(allowReject && data['link_reject']) {
353
                            s = s + '<button class="btn btn-sm btn-reject btn-danger" style="margin-top: 5px" data-href="' + data['link_reject']+ '" data-toggle="tooltip" title="LABEL_REJECT"><i class="fa fa-times"></i> LABEL_REJECT </button><br>';
354
                        }
355
                        if(allowEdit && data['link_edit']) {
356
                            s = s + '<button class="btn btn-sm btn-edit btn-primary" style="margin-top: 5px" data-href="' + data['link_edit']+ '" data-toggle="tooltip" title="LABEL_EDIT"><i class="fa fa-pencil"></i> LABEL_EDIT </button><br>';
357
                        }
358
 
359
                        if(allowChangePassword && data['link_change_password']) {
360
                            s = s + '<button class="btn btn-sm btn-primary btn-change-password" style="margin-top: 5px" data-href="' + data['link_change_password']+ '" data-toggle="tooltip" title="LABEL_CHANGE_PASSWORD"><i class="fa fa-key"></i> LABEL_PASSWORD </button><br>';
361
                        }
362
                        if(allowUnblock && data['link_unblock']) {
363
                            s = s + '<button class="btn btn-sm btn-info btn-unblock" style="margin-top: 5px" data-href="' + data['link_unblock']+ '" data-toggle="tooltip" title="LABEL_UNBLOCK"><i class="fa fa-unlock"></i> LABEL_UNBLOCK </button><br>';
364
                        }
365
 
366
 
367
                        return s;
368
                    }
369
                }
370
 
371
            ],
372
        });
373
 
374
 
375
        $('#form-filter #status').change(function(e) {
376
            e.preventDefault();
377
            gridTable.api().ajax.reload(null, false);
378
        });
379
 
380
 
381
        $('body').on('click', 'button.btn-refresh', function(e) {
382
            e.preventDefault();
383
            gridTable.api().ajax.reload(null, false);
384
        });
385
 
386
 
387
 
388
 
389
 
390
        $('body').on('click', 'button.btn-invite', function(e) {
391
            e.preventDefault();
392
            $('#form-invite #user_uuid').autoComplete('clear');
393
            $('#form-invite #user_uuid_selected').val('');
394
            $('#modalInvite').modal('show');
395
        });
396
 
397
        $('body').on('click', 'button.btn-accept', function(e) {
398
            e.preventDefault();
399
            action = $(this).data('href');
400
            NProgress.start();
401
            $.ajax({
402
                'dataType'  : 'json',
403
                'accept'    : 'application/json',
404
                'method'    : 'post',
405
                'url'       :  action
406
            }).done(function(response) {
407
                if(response['success']) {
408
                    $.fn.showSuccess(response['data']);
409
                    gridTable.api().ajax.reload(null, false);
410
                } else {
411
                    $.fn.showError(response['data']);
412
                }
413
            }).fail(function( jqXHR, textStatus, errorThrown) {
414
                $.fn.showError(textStatus);
415
            }).always(function() {
416
                NProgress.done();
417
            });
418
        });
419
 
420
 
421
        $('#form-invite #user_uuid').autoComplete({
422
            resolver: 'custom',
423
            events: {
424
 
425
                search: function (qry, callback) {
426
                    NProgress.start();
427
                    $.ajax({
428
                        'url' : '$routeInvite',
429
                        'method': 'get',
430
				        'data': { 'search': qry }
431
				    }).done(function (response) {
432
                        if(response['success']) {
433
                            callback(response['data'])
434
                        } else {
435
                            $.fn.showError(response['data']);
436
                        }
437
					}).fail(function( jqXHR, textStatus, errorThrown) {
438
                        $.fn.showError(textStatus);
439
                    }).always(function() {
440
                        NProgress.done();
441
                    });
442
                }
443
            }
444
        });
445
 
446
	    $('#form-invite #user_uuid').on('autocomplete.select', function (evt, item) {
447
            $('#form-invite #user_uuid_selected').val(item['value']);
448
        });
449
 
450
        var validatorFormInvite = $('#form-invite').validate({
451
            debug: true,
452
            onclick: false,
453
            onkeyup: false,
454
            ignore: [':hidden'],
455
            rules: {
456
 
457
                'user_uuid': {
458
                    required: true,
459
                },
460
            },
461
            submitHandler: function(form)
462
            {
463
                NProgress.start();
464
                $.ajax({
465
                    'dataType'  : 'json',
466
                    'accept'    : 'application/json',
467
                    'method'    : 'post',
468
                    'url'       : '$routeInvite',
469
                    'data'      : {
470
                        'id' : $('#form-invite #user_uuid_selected').val(),
471
                    }
472
                 }).done(function(response) {
473
                    if(response.success) {
474
                        $.fn.showSuccess(response.data);
475
 
476
                        $('#modalInvite').modal('hide');
477
                         gridTable.api().ajax.reload(null, false);
478
                    } else {
479
                        if(jQuery.type(response.data) == 'string') {
480
                            $.fn.showError(response.data)
481
                        } else  {
482
                            $.each(response.data, function( fieldname, errors ) {
483
                                $.fn.showFormErrorValidator('#form-invite #' + fieldname, errors);
484
                            });
485
                        }
486
                    }
487
                }).fail(function( jqXHR, textStatus, errorThrown) {
488
                    $.fn.showError(textStatus)
489
 
490
                }).always(function() {
491
                    NProgress.done();
492
                })
493
            },
494
            invalidHandler: function(form, validator) {
495
            }
496
        });
497
 
498
    var validatorCapsuleCustomer = $('#form-upload-users').validate({
499
        debug: true,
500
        onclick: false,
501
        onkeyup: false,
502
        onfocusout: false,
503
        ignore: [],
504
        rules: {
505
            'file' : {
506
                required: true,
507
                extension: 'xls|xlsx',
508
                accept: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel'
509
            },
510
        },
511
 
512
        submitHandler: function(form)
513
        {
514
            NProgress.start();
515
            var formdata = false;
516
            if (window.FormData){
517
                formdata = new FormData(form);
518
            }
519
            formdata.append('step','validation');
520
 
521
 
522
            $.ajax({
523
                'dataType'  : 'json',
524
                'accept'    : 'application/json',
525
                'method'    : 'post',
526
                'url'       : '$routeUpload',
527
                'data'      :  formdata,
528
                'processData': false,
529
                'contentType': false,
530
            }).done(function(response) {
531
                if(response['success']) {
532
 
533
                    $('#table-upload-users-key').val(response['data']['key']);
534
 
535
                    $('#gridTableUploadUsers tbody').empty();
536
 
537
                    $.each(response['data']['items'], function(index, item) {
538
 
539
 
540
                        var s = '<tr>';
541
                        s = s + '<td>' + item['first_name'] + '</td>';
542
                        s = s + '<td>' + item['last_name'] + '</td>';
543
                        s = s + '<td>' + item['email'] + '</td>';
544
                        s = s + '<td>' + item['password'] + '</td>';
545
                        s = s + '</tr>';
546
 
547
                        $('#gridTableUploadUsers tbody').append(s);
548
 
549
 
550
                    });
551
 
552
                    $('#modalFormUploadUsers').modal('hide');
553
                    $('#modalUploadUsers').modal('show');
554
 
555
 
556
 
557
                } else {
558
                    validatorCapsuleCustomer.resetForm();
559
                    if(jQuery.type(response['data']) == 'string') {
560
                        $.fn.showError(response['data']);
561
                    } else  {
562
                        $.each(response['data'], function( fieldname, errors ) {
563
                            $.fn.showFormErrorValidator('#form-upload-users #' + fieldname, errors);
564
                        });
565
                    }
566
                }
567
            }).fail(function( jqXHR, textStatus, errorThrown) {
568
                $.fn.showError(textStatus);
569
            }).always(function() {
570
 
571
                NProgress.done();
572
            });
573
            return false;
574
        },
575
        invalidHandler: function(form, validator) {
576
 
577
        }
578
    });
579
 
580
 
581
    $('#form-upload-users #file').fileinput({
582
        theme: 'fas',
583
        language: 'es',
584
        showUpload: false,
585
        dropZoneEnabled: false,
586
        maxFileCount: 1,
587
        allowedFileExtensions: ['xls', 'xlsx'],
588
    });
589
 
590
    $('body').on('click', 'button.btn-upload', function(e) {
591
        e.preventDefault();
592
 
593
        $('#form-upload-users #file').fileinput('reset');
594
        $('#form-upload-users #file').val('');
595
 
596
        $('#modalFormUploadUsers').modal('show');
597
    });
598
 
599
    $('body').on('click', 'button.btn-upload-users-step2', function(e) {
600
        e.preventDefault();
601
        NProgress.start();
602
 
603
        $.ajax({
604
            'dataType'  : 'json',
605
            'accept'    : 'application/json',
606
            'method'    : 'post',
607
            'url'       : '$routeUpload',
608
            'data'      :  {
609
                'step' : 'process',
610
                'key' : $('#table-upload-users-key').val(),
611
            }
612
        }).done(function(response) {
613
            if(response['success']) {
614
                if(response['data']['users_assigned'] == 1) {
615
                    $.fn.showSuccess(response['data']['users_assigned'] + ' LABEL_USER_CREATED');
616
                } else {
617
                    $.fn.showSuccess(response['data']['users_assigned'] + ' LABEL_USERS_CREATED');
618
                }
619
                 gridTable.api().ajax.reload(null, false);
620
                $('#modalUploadUsers').modal('hide');
621
            } else {
622
                $.fn.showError(response['data']);
623
            }
624
        }).fail(function( jqXHR, textStatus, errorThrown) {
625
            $.fn.showError(textStatus);
626
        }).always(function() {
627
            NProgress.done();
628
        });
629
        return false;
630
    });
631
 
632
    $('body').on('click', 'button.btn-edit', function(e) {
633
        e.preventDefault();
634
 
635
        var href = $(this).data('href');
636
        $('#form-edit').attr('action', href);
637
 
638
        NProgress.start();
639
        $.ajax({
640
            'dataType'  : 'json',
641
            'accept'    : 'application/json',
642
            'method'    : 'get',
643
            'url'       :  href,
644
        }).done(function(response) {
645
            if(response['success']) {
646
                $('#form-edit #backend').prop('checked', response['data']['backend'] );
647
                $('#table-roles tbody').empty();
648
 
649
                $.each(response['data']['roles'], function(index, role) {
650
 
651
                    var checked = role['checked'] ? ' checked="checked" ' : '';
652
                    var s = '<tr>';
653
                    s = s + '<td>' + role['name'] + '</td>';
654
 
655
                    s = s + '<td><input id="checked' + role['id'] + '" name="checked' + role['id'] + '" class="form-control" type="checkbox" ' + checked + ' style="width: 20px; height: 20px" value="1"></td>';
656
                    s = s + '</tr>';
657
 
658
                    $('#table-roles tbody').append(s);
659
 
660
                });
661
 
662
                $('#modalEdit').modal('show');
663
 
664
            } else {
665
                $.fn.showError(response['data']);
666
            }
667
        }).fail(function( jqXHR, textStatus, errorThrown) {
668
            $.fn.showError(textStatus);
669
        }).always(function() {
670
            NProgress.done();
671
        });
672
 
673
    });
674
 
675
    $('#form-edit').submit(function (e) {
676
        e.preventDefault();
677
        NProgress.start();
678
        $.ajax({
679
            'dataType'  : 'json',
680
            'accept'    : 'application/json',
681
            'method'    : 'post',
682
            'url'       : $('#form-edit').attr('action'),
683
            'data'      : $('#form-edit').serialize(),
684
        }).done(function(response) {
685
            if(response['success']) {
686
 
687
                $.fn.showSuccess(response['data']);
688
                $('#modalEdit').modal('hide');
689
                gridTable.api().ajax.reload(null, false);
690
 
691
            } else {
692
                $.fn.showError(response['data']);
693
            }
694
        }).fail(function( jqXHR, textStatus, errorThrown) {
695
            $.fn.showError(textStatus);
696
        }).always(function() {
697
            NProgress.done();
698
        });
699
        return false;
700
 
701
    });
702
 
703
    $('body').on('click', 'button.btn-cancel-modal', function(e) {
704
        e.preventDefault();
705
        $('#modalInvite').modal('hide');
706
        $('#modalFormUploadUsers').modal('hide');
707
        $('#modalEdit').modal('hide');
708
        $('#modalChangePassword').modal('hide');
709
    });
710
 
711
    var validatorChangePassword = $('#form-change-password').validate({
712
        debug: true,
713
        onclick: false,
714
        onkeyup: false,
715
        ignore: [':hidden'],
716
            rules: {
717
 
718
                'password': {
719
                    required: true,
720
                    minlength: 6,
721
                    maxlength: 16,
722
                    passwordStrengthCheck: true,
723
                },
724
                'confirmation' : {
725
                    required: true,
726
                    minlength: 6,
727
                    maxlength: 16,
728
                    equalTo: '#form-change-password #password'
729
                },
730
            },
731
            submitHandler: function(form)
732
            {
733
                NProgress.start();
734
                $.ajax({
735
                    'dataType'  : 'json',
736
                    'accept'    : 'application/json',
737
                    'method'    : 'post',
738
                    'url'       : $('#form-change-password').attr('action'),
739
                    'data'      : $('#form-change-password').serialize()
740
                 }).done(function(response) {
741
                    if(response.success) {
742
                        $.fn.showSuccess(response.data);
743
 
744
                        $('#modalChangePassword').modal('hide');
745
                         gridTable.api().ajax.reload(null, false);
746
                    } else {
747
                        if(jQuery.type(response.data) == 'string') {
748
                            $.fn.showError(response.data)
749
                        } else  {
750
                            $.each(response.data, function( fieldname, errors ) {
751
                                $.fn.showFormErrorValidator('#form-change-password #' + fieldname, errors);
752
                            });
753
                        }
754
                    }
755
                }).fail(function( jqXHR, textStatus, errorThrown) {
756
                    $.fn.showError(textStatus)
757
 
758
                }).always(function() {
759
                    NProgress.done();
760
                })
761
            },
762
            invalidHandler: function(form, validator) {
763
            }
764
        });
765
 
766
        $('body').on('click', 'button.btn-change-password', function(e) {
767
            e.preventDefault();
768
 
769
            NProgress.start();
770
            var action = $(this).data('href');
771
 
772
            $.ajax({
773
                'dataType'  : 'json',
774
                'accept'    : 'application/json',
775
                'method'    : 'get',
776
                'url'       :  action,
777
            }).done(function(response) {
778
                if(response['success']) {
779
 
780
                    $('#form-change-password').attr('action', action);
781
                    $('#form-change-password #first_name').val(response['data']['first_name']);
782
                    $('#form-change-password #last_name').val(response['data']['last_name']);
783
                    $('#form-change-password #email').val(response['data']['email']);
784
                    $('#form-change-password #password').val('');
785
                    $('#form-change-password #confirmation').val('');
786
                    validatorChangePassword.resetForm();
787
 
788
                    $('#modalChangePassword').modal('show');
789
                } else {
790
                    $.fn.showError(response['data']);
791
                }
792
            }).fail(function( jqXHR, textStatus, errorThrown) {
793
                $.fn.showError(textStatus);
794
            }).always(function() {
795
                NProgress.done();
796
            });
797
 
798
        });
799
 
800
 
801
 
802
    });
803
JS;
804
$this->inlineScript()->captureEnd();
805
?>
806
 
807
 
808
 
809
 
810
 
811
 
812
 
813
<!-- Content Header (Page header) -->
814
<section class="content-header">
815
	<div class="container-fluid">
816
    	<div class="row mb-2">
817
        	<div class="col-sm-12">
818
            	<h1>LABEL_USERS</h1>
819
			</div>
820
		</div>
821
	</div><!-- /.container-fluid -->
822
</section>
823
 
824
<section class="content">
825
	<div class="container-fluid">
826
    	<div class="row">
827
        	<div class="col-12">
828
				<div class="card">
829
					<div class="card-body">
830
						<div class="row">
831
							 <div class="col-md-12 col-sm-12">
832
                                <form name="form-filter" id="form-filter">
833
                                    <div class="form-group">
834
                                        <label for="status">LABEL_STATUS</label>
835
                                        <select id="status" name="status" class="form-control">
836
                                            <option value="">LABEL_ALL</option>
837
                                            <option value="<?php echo CompanyUser::STATUS_PENDING ?>">LABEL_PENDING</option>
838
                                            <option value="<?php echo CompanyUser::STATUS_ACCEPTED ?>">LABEL_ACCEPTED</option>
839
                                            <option value="<?php echo CompanyUser::STATUS_ADMIN_WILL_ADD ?>">LABEL_ADMIN_WILL_ADD</option>
840
                                            <option value="<?php echo CompanyUser::STATUS_SENT ?>">LABEL_INVITED</option>
841
                                            <option value="<?php echo CompanyUser::STATUS_CANCELLED ?>">LABEL_CANCELLED</option>
842
                                            <option value="<?php echo CompanyUser::STATUS_REJECTED ?>">LABEL_REJECTED</option>
843
                                        </select>
844
                                    </div>
845
                                </form>
846
							 </div>
847
                             <div
848
                                class="col-12 text-right p-2"
849
                            >
850
                                <div style="float:right;">
851
                                    <button type="button" class="btn btn-sm btn-info btn-refresh"><i class="fa fa-refresh"></i></button>
852
                                    <?php if($allowUpload) : ?>
853
                                    <button type="button" class="btn btn-sm btn-primary btn-upload"><i class="fa fa-upload"></i> LABEL_UPLOAD  </button>
854
                                    <?php endif; ?>
855
                                    <?php if($allowInvite) : ?>
856
                                    <button type="button" class="btn btn-sm btn-primary btn-invite"><i class="fa fa-plus"></i> LABEL_INVITE </button>
857
                                    <?php endif; ?>
858
                                </div>
859
                             </div>
860
						</div>
861
						<div class="row">
862
							 <div class="col-md-12 col-sm-12">
863
								<table id="gridTable" class="table table-bordered table-hover">
864
                              		<thead>
865
                						<tr>
866
                                        	<th>LABEL_FIRST_NAME</th>
867
                                        	<th>LABEL_LAST_NAME</th>
868
                                        	<th>LABEL_EMAIL</th>
869
                                          	<th>LABEL_DETAILS</th>
870
                                          	<th>LABEL_ACTIONS</th>
871
                                        </tr>
872
                               		</thead>
873
                                 	<tbody>
874
                                 	</tbody>
875
                            	</table>
876
							 </div>
877
						</div>
878
 
879
 
880
                   	</div>
881
                   	<div class="card-footer clearfix">
882
 
883
 
884
                 	</div>
885
          		</div>
886
           	</div>
887
        </div>
888
 	</div>
889
</section>
890
 
891
 
892
<!-- The Modal -->
893
<div class="modal" id="modalInvite">
894
	<div class="modal-dialog  modal-xl">
895
    	<div class="modal-content">
896
 
897
            <!-- Modal Header -->
898
      		<div class="modal-header">
899
        		<h4 class="modal-title">LABEL_INVITE</h4>
900
            		</div>
901
 
902
            <!-- Modal body -->
903
      		<div class="modal-body">
904
				<form name="form-invite" id="form-invite">
905
					<input type="hidden"  name="user_uuid_selected" id="user_uuid_selected" />
906
					<div class="form-group">
907
                    	<label for="user_uuid">LABEL_USER (LABEL_MIN_LENGTH_3)</label>
908
                    	<input autocomplete="off" type="text" name="user_uuid" id="user_uuid" class="form-control" data-noresults-text="LABEL_AUTOCOMPLETE_USERS_NOT_FOUND">
909
					</div>
910
 
911
 
912
            		<div class="form-group">
913
               			<button type="submit" class="btn btn-sm btn-primary">LABEL_INVITE</button>
914
                		<button type="button" class="btn btn-sm btn-light btn-cancel-modal">LABEL_CANCEL</button>
915
           			</div>
916
     			</form>
917
      		</div>
918
    	</div>
919
	</div>
920
</div>
921
 
922
 
923
 
924
<!-- The Modal -->
925
<div class="modal" id="modalFormUploadUsers">
926
	<div class="modal-dialog  modal-xl">
927
    	<div class="modal-content">
928
 
929
            <!-- Modal Header -->
930
      		<div class="modal-header">
931
        		<h4 class="modal-title">LABEL_UPLOAD</h4>
932
      		</div>
933
 
934
            <!-- Modal body -->
935
      		<div class="modal-body">
936
       			 <?php
937
                    $form = $this->formUploadUsers;
938
            		$form->setAttributes([
939
                        'method'    => 'post',
940
                        'name'      => 'form-upload-users',
941
                        'id'        => 'form-upload-users'
942
                    ]);
943
 
944
                    $form->prepare();
945
                    echo $this->form()->openTag($form);
946
                ?>
947
 
948
				<div class="form-group">
949
 
950
 
951
                 		<?php
952
                        $element = $form->get('file');
953
                        $element->setOptions(['label' => 'LABEL_EXCEL']);
954
                        echo $this->formLabel($element);
955
                        ?>
956
                        <div class="file-loading">
957
                        <?php
958
                        $element->setAttributes(['class' => 'form-control', 'accept' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.ms-excel']);
959
                        echo $this->formFile($element);
960
                        ?>
961
                	</div>
962
          		</div>
963
 
964
 
965
 
966
        		<div class="form-group">
967
                	<button type="submit" class="btn btn-sm btn-primary">LABEL_UPLOAD</button>
968
             		<button type="button" class="btn btn-sm btn-light btn-cancel-modal">LABEL_CANCEL</button>
969
           		</div>
970
    			<?php echo $this->form()->closeTag($form); ?>
971
      		</div>
972
 
973
    	</div>
974
	</div>
975
</div>
976
 
977
 
978
 
979
<!-- The Modal -->
980
<div class="modal" id="modalUploadUsers">
981
	<div class="modal-dialog modal-xl">
982
    	<div class="modal-content">
983
 
984
            <!-- Modal Header -->
985
      		<div class="modal-header">
986
        		<h4 class="modal-title">LABEL_USERS</h4>
987
        		<button type="button" class="close" data-dismiss="modal">&times;</button>
988
      		</div>
989
 
990
            <!-- Modal body -->
991
      		<div class="modal-body">
992
      			<form>
993
      				<input type="hidden" name="table-upload-users-key" id="table-upload-users-key">
994
      			</form>
995
      			<div style="height: 300px;overflow: scroll;">
996
				<table id="gridTableUploadUsers" style="width: 100%" class="table table-bordered table-hover">
997
            		<thead>
998
            			<tr>
999
                      		<th>LABEL_FIRST_NAME</th>
1000
                     		<th>LABEL_LAST_NAME</th>
1001
                         	<th>LABEL_EMAIL</th>
1002
                       		<th>LABEL_PASSWORD</th>
1003
             			</tr>
1004
                  	</thead>
1005
               		<tbody>
1006
               		</tbody>
1007
         		</table>
1008
         		</div>
1009
 
1010
      		</div>
1011
 
1012
            <!-- Modal footer -->
1013
      		<div class="modal-footer">
1014
      			<button type="submit" class="btn btn-sm btn-primary btn-upload-users-step2">LABEL_SAVE</button>
1015
        		<button type="button" class="btn btn-sm btn-danger" data-dismiss="modal">LABEL_CLOSE</button>
1016
      		</div>
1017
 
1018
    	</div>
1019
	</div>
1020
</div>
1021
 
1022
 
1023
<!-- The Modal -->
1024
<div class="modal" id="modalEdit">
1025
	<div class="modal-dialog  modal-xl">
1026
    	<div class="modal-content">
1027
 
1028
            <!-- Modal Header -->
1029
      		<div class="modal-header">
1030
        		<h4 class="modal-title">LABEL_EDIT</h4>
1031
        	</div>
1032
 
1033
            <!-- Modal body -->
1034
      		<div class="modal-body">
1035
				<form name="form-edit" id="form-edit">
1036
					<div class="row">
1037
						<div class="col-md-12 col-sm-12">
1038
							<div class="form-group">
1039
								<label for="backend">LABEL_ACCESS_BACKEND</label>
1040
								<input type="checkbox" name="backend" id="backend" value="y" class="form-control" style="width: 20px; height: 20px" >
1041
							</div>
1042
						</div>
1043
					</div>
1044
					<div class="row">
1045
						<div class="col-md-12 col-sm-12">
1046
    						<table id="table-roles" class="table table-bordered table-hover">
1047
                 				<thead>
1048
                					<tr>
1049
                                		<th>LABEL_NAME</th>
1050
                                    	<th>LABEL_ACTIVE</th>
1051
                                   	</tr>
1052
                             	</thead>
1053
                             	<tbody>
1054
                             	</tbody>
1055
                     		</table>
1056
 
1057
						</div>
1058
					</div>
1059
 
1060
            		<div class="form-group">
1061
               			<button type="submit" class="btn btn-sm btn-primary">LABEL_SAVE</button>
1062
                		<button type="button" class="btn btn-sm btn-light btn-cancel-modal">LABEL_CANCEL</button>
1063
           			</div>
1064
     			</form>
1065
      		</div>
1066
 
1067
    	</div>
1068
	</div>
1069
</div>
1070
 
1071
 
1072
 
1073
<!-- The Modal -->
1074
<div class="modal" id="modalChangePassword">
1075
	<div class="modal-dialog">
1076
    	<div class="modal-content">
1077
 
1078
            <!-- Modal Header -->
1079
      		<div class="modal-header">
1080
        		<h4 class="modal-title">LABEL_USERS</h4>
1081
      		</div>
1082
 
1083
            <!-- Modal body -->
1084
      		<div class="modal-body">
1085
       			 <?php
1086
                    $form = $this->formChangePassword;
1087
            		$form->setAttributes([
1088
                        'method'    => 'post',
1089
                        'name'      => 'form-change-password',
1090
                        'id'        => 'form-change-password'
1091
                    ]);
1092
 
1093
                    $form->prepare();
1094
                    echo $this->form()->openTag($form);
1095
                    ?>
1096
                        <div class="form-group">
1097
        					<?php
1098
                            $element = $form->get('first_name');
1099
                            $element->setOptions(['label' => 'LABEL_FIRST_NAME']);
1100
                            $element->setAttributes(['class' => 'form-control', 'readonly' => 'readonly']);
1101
 
1102
                            echo $this->formLabel($element);
1103
                            echo $this->formText($element);
1104
                            ?>
1105
						</div>
1106
						<div class="form-group">
1107
        					<?php
1108
                            $element = $form->get('last_name');
1109
                            $element->setOptions(['label' => 'LABEL_LAST_NAME']);
1110
                            $element->setAttributes(['class' => 'form-control', 'readonly' => 'readonly']);
1111
 
1112
                            echo $this->formLabel($element);
1113
                            echo $this->formText($element);
1114
                            ?>
1115
						</div>
1116
						<div class="form-group">
1117
        					<?php
1118
                            $element = $form->get('email');
1119
                            $element->setOptions(['label' => 'LABEL_EMAIL']);
1120
                            $element->setAttributes(['class' => 'form-control', 'readonly' => 'readonly']);
1121
 
1122
                            echo $this->formLabel($element);
1123
                            echo $this->formText($element);
1124
                            ?>
1125
						</div>
1126
    					<div class="form-group">
1127
        					<?php
1128
                            $element = $form->get('password');
1129
                            $element->setOptions(['label' => 'LABEL_PASSWORD']);
1130
                            $element->setAttributes(['class' => 'form-control']);
1131
 
1132
                            echo $this->formLabel($element);
1133
                            echo $this->formPassword($element);
1134
                            ?>
1135
						</div>
1136
						<div class="form-group">
1137
                    	<?php
1138
                            $element = $form->get('confirmation');
1139
                            $element->setOptions(['label' => 'LABEL_CONFIRMATION']);
1140
                            $element->setAttributes(['class' => 'form-control']);
1141
 
1142
                            echo $this->formLabel($element);
1143
                            echo $this->formPassword($element);
1144
                        ?>
1145
						</div>
1146
 
1147
 
1148
        				<div class="form-group">
1149
                    		<button type="submit" class="btn btn-sm btn-primary">LABEL_SAVE</button>
1150
                    		<button type="button" class="btn btn-sm btn-light btn-cancel-modal">LABEL_CANCEL</button>
1151
                   		</div>
1152
     	      		<?php echo $this->form()->closeTag($form); ?>
1153
      		</div>
1154
 
1155
    	</div>
1156
	</div>
1157
</div>
1158
 
1159
 
1160
 
1161