Proyectos de Subversion LeadersLinked - Backend

Rev

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