Proyectos de Subversion LeadersLinked - Backend

Rev

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

Rev Autor Línea Nro. Línea
17003 efrain 1
<?php
17251 ariadna 2
// Obtiene el ACL y el usuario actual
17003 efrain 3
$acl            = $this->viewModel()->getRoot()->getVariable('acl');
4
$currentUser    = $this->currentUserHelper();
5
 
17251 ariadna 6
// Obtiene el tipo de usuario actual
17003 efrain 7
$roleName = $currentUser->getUserTypeId();
8
 
17251 ariadna 9
// Define las rutas para agregar, listar y el dashboard
17003 efrain 10
$routeAdd       = $this->url('media/categories/add');
11
$routeDatatable = $this->url('media/categories');
12
$routeDashboard = $this->url('dashboard');
13
 
17251 ariadna 14
// Verifica los permisos para agregar, editar y eliminar
17003 efrain 15
$allowAdd               = $acl->isAllowed($roleName, 'media/categories/add') ? 1 : 0;
16
$allowEdit              = $acl->isAllowed($roleName, 'media/categories/edit') ? 1 : 0;
17
$allowDelete            = $acl->isAllowed($roleName, 'media/categories/delete') ? 1 : 0;
18
 
17251 ariadna 19
// Agrega los estilos y scripts necesarios
17003 efrain 20
$this->headLink()->appendStylesheet($this->basePath('assets/vendors/nprogress/nprogress.css'));
21
$this->inlineScript()->appendFile($this->basePath('assets/vendors/nprogress/nprogress.js'));
22
 
23
$this->inlineScript()->appendFile($this->basePath('assets/vendors/datatables.net/jquery.dataTables.js'));
24
 
25
$this->headLink()->appendStylesheet($this->basePath('assets/vendors/datatables.net-bs5/dataTables.bootstrap5.css'));
26
$this->headLink()->appendStylesheet($this->basePath('assets/vendors/datatables.net-bs5-responsive/responsive.bootstrap5.css'));
27
 
28
$this->inlineScript()->appendFile($this->basePath('assets/vendors/datatables.net/jquery.dataTables.js'));
29
$this->inlineScript()->appendFile($this->basePath('assets/vendors/datatables.net-bs5/dataTables.bootstrap5.js'));
30
$this->inlineScript()->appendFile($this->basePath('assets/vendors/datatables.net-bs5-responsive/dataTables.responsive.min.js'));
31
$this->inlineScript()->appendFile($this->basePath('assets/vendors/datatables.net-bs5-responsive/responsive.bootstrap5.min.js'));
32
 
17251 ariadna 33
// Inicia el script de JavaScript
17003 efrain 34
$this->inlineScript()->captureStart();
35
echo <<<JS
36
    jQuery( document ).ready(function( $ ) {
37
 
17251 ariadna 38
        // Define permisos de edición y eliminación
17003 efrain 39
        var allowEdit   = $allowEdit;
40
        var allowDelete = $allowDelete;
41
 
17251 ariadna 42
        // Configura la tabla de datos
17003 efrain 43
        var gridTable = $('#gridTable').dataTable( {
44
            'processing': true,
45
            'serverSide': true,
46
            'searching': true,
47
            'order': [[ 0, 'asc' ]],
48
            'ordering':  true,
49
            'ordenable' : true,
50
            'responsive': true,
51
            'select' : false,
17251 ariadna 52
            'paging': true,
17003 efrain 53
            'pagingType': 'simple_numbers',
17251 ariadna 54
            'ajax': {
55
                'url' : '$routeDatatable',
56
                'type' : 'get',
17003 efrain 57
                'beforeSend': function (request) {
58
                  NProgress.start();
59
                },
60
                'dataFilter': function(response) {
17251 ariadna 61
                    try {
62
                        console.log(response); // Para depuración
63
                        var jsonResponse = JSON.parse(response);
64
 
65
                        var json = {};
66
                        json.recordsTotal = 0;
67
                        json.recordsFiltered = 0;
68
                        json.data = [];
69
 
70
                        if (jsonResponse.success) {
71
                            json.recordsTotal = jsonResponse.data.total;
72
                            json.recordsFiltered = jsonResponse.data.total;
73
                            json.data = jsonResponse.data.items;
74
                        } else {
75
                            $.fn.showError(jsonResponse.data);
76
                        }
77
 
78
                        return JSON.stringify(json);
79
                    } catch (e) {
80
                        console.error("Error parsing JSON response:", e);
81
                        $.fn.showError("Invalid JSON response from server.");
82
                        return JSON.stringify({ recordsTotal: 0, recordsFiltered: 0, data: [] });
17003 efrain 83
                    }
84
                }
17251 ariadna 85
            },
17003 efrain 86
            'language' : {
87
                'sProcessing':     'LABEL_DATATABLE_SPROCESSING',
88
                'sLengthMenu':     'LABEL_DATATABLE_SLENGTHMENU',
89
                'sZeroRecords':    'LABEL_DATATABLE_SZERORECORDS',
90
                'sEmptyTable':     'LABEL_DATATABLE_SEMPTYTABLE',
91
                'sInfo':           'LABEL_DATATABLE_SINFO',
92
                'sInfoEmpty':      'LABEL_DATATABLE_SINFOEMPTY',
93
                'sInfoFiltered':   'LABEL_DATATABLE_SINFOFILTERED',
94
                'sInfoPostFix':    '',
95
                'sSearch':         'LABEL_DATATABLE_SSEARCH',
96
                'sUrl':            '',
97
                'sInfoThousands':  ',',
98
                'sLoadingRecords': 'LABEL_DATATABLE_SLOADINGRECORDS',
99
                'oPaginate': {
100
                    'sFirst':    'LABEL_DATATABLE_SFIRST',
101
                    'sLast':     'LABEL_DATATABLE_SLAST',
102
                    'sNext':     'LABEL_DATATABLE_SNEXT',
103
                    'sPrevious': 'LABEL_DATATABLE_SPREVIOUS'
104
                },
105
                'oAria': {
106
                    'sSortAscending':  ': LABEL_DATATABLE_SSORTASCENDING',
107
                    'sSortDescending': ':LABEL_DATATABLE_SSORTDESCENDING'
108
                },
109
            },
110
            'drawCallback': function( settings ) {
111
                NProgress.done();
112
 
113
            },
114
            'aoColumns': [
115
                { 'mDataProp': 'name' },
116
                { 'mDataProp': 'actions' },
17251 ariadna 117
            ],
17003 efrain 118
            'columnDefs': [
119
                {
120
                    'targets': 0,
121
                    'className' : 'text-vertical-middle',
122
                },
123
 
124
                {
125
                    'targets': -1,
126
                    'orderable': false,
127
                    'render' : function ( data, type, row ) {
128
                        s = '';
129
 
130
                        if(allowEdit) {
131
                            s = s + '<button class="btn btn-primary btn-edit" data-href="' + data['link_edit']+ '" data-toggle="tooltip" title="LABEL_EDIT"><i class="fa fa-pen"></i> LABEL_EDIT </button>&nbsp;';
132
                        }
133
                        if(allowDelete) {
134
                            s = s + '<button class="btn btn-danger btn-delete" data-href="' + data['link_delete']+ '" data-toggle="tooltip" title="LABEL_DELETE"><i class="fa fa-trash"></i> LABEL_DELETE </button>&nbsp;';
135
                        }
136
                        return s;
137
                    }
138
                }
139
              ],
140
        });
141
 
17251 ariadna 142
        // Configura el validador del formulario
17003 efrain 143
        var validator = $('#form').validate({
144
            debug: true,
145
            onclick: false,
146
            onkeyup: false,
147
            ignore: [],
148
            rules: {
149
                'name': {
150
                    required: true,
151
                    maxlength: 100,
152
                }
153
            },
154
            submitHandler: function(form)
155
            {
156
                $.ajax({
157
                    'dataType'  : 'json',
158
                    'accept'    : 'application/json',
159
                    'method'    : 'post',
160
                    'url'       :  $('#form').attr('action'),
161
                    'data'      :  $('#form').serialize()
162
                }).done(function(response) {
163
                    NProgress.start();
164
                    if(response['success']) {
165
                        $.fn.showSuccess(response['data']);
166
 
167
                        $('#modal').modal('hide');
168
 
169
 
170
                         gridTable.api().ajax.reload(null, false);
171
                    } else {
172
                        validator.resetForm();
173
                        if(jQuery.type(response['data']) == 'string') {
174
                            $.fn.showError(response['data']);
175
                        } else  {
176
                            $.each(response['data'], function( fieldname, errors ) {
177
                                $.fn.showFormErrorValidator('#form #' + fieldname, errors);
178
                            });
179
                        }
180
                    }
181
                }).fail(function( jqXHR, textStatus, errorThrown) {
182
                   $.fn.showError(textStatus);
183
                }).always(function() {
184
                    NProgress.done();
185
                });
186
                return false;
187
            },
188
            invalidHandler: function(form, validator) {
189
 
190
            }
191
        });
192
 
17251 ariadna 193
        // Maneja el evento de clic para agregar una nueva categoría
17003 efrain 194
        $('body').on('click', 'button.btn-add', function(e) {
195
            e.preventDefault();
196
 
197
 
198
            $('#form').attr('action', '$routeAdd');
199
            $('#form #name').val('');
200
 
201
 
202
            validator.resetForm();
203
            $('#modal').modal('show');
204
        });
205
 
17251 ariadna 206
        // Maneja el evento de clic para editar una categoría
17003 efrain 207
        $('body').on('click', 'button.btn-edit', function(e) {
208
            e.preventDefault();
209
            NProgress.start();
210
            var action = $(this).data('href');
211
 
212
            $.ajax({
213
                'dataType'  : 'json',
214
                'accept'    : 'application/json',
215
                'method'    : 'get',
216
                'url'       :  action,
217
            }).done(function(response) {
218
                if(response['success']) {
219
 
17251 ariadna 220
 
17003 efrain 221
                    $('#form').attr('action', action);
222
                    $('#form #name').val(response['data']['name']);
223
 
224
                    validator.resetForm();
225
 
226
                    $('#modal').modal('show');
227
                } else {
228
                    $.fn.showError(response['data']);
229
                }
230
            }).fail(function( jqXHR, textStatus, errorThrown) {
231
                $.fn.showError(textStatus);
232
            }).always(function() {
233
                NProgress.done();
234
            });
235
        });
236
 
17251 ariadna 237
        // Maneja el evento de clic para eliminar una categoría
17003 efrain 238
    $('body').on('click', 'button.btn-delete', function(e) {
239
        e.preventDefault();
240
        var action = $(this).data('href');
241
 
242
 
243
          swal.fire({
244
            title: 'LABEL_ARE_YOU_SURE',
245
            icon: 'question',
246
            cancelButtonText: 'LABEL_NO',
247
            showCancelButton: true,
248
            confirmButtonText: 'LABEL_YES'
249
          }).then((result) => {
250
            if (result.isConfirmed) {
251
 
252
                    NProgress.start();
253
                    $.ajax({
254
                        'dataType'  : 'json',
255
                        'accept'    : 'application/json',
256
                        'method'    : 'post',
257
                        'url'       :  action,
258
                    }).done(function(response) {
259
                        if(response['success']) {
260
                            $.fn.showSuccess(response['data']);
261
                            gridTable.api().ajax.reload(null, false);
262
                        } else {
263
                            $.fn.showError(response['data']);
264
                        }
265
                    }).fail(function( jqXHR, textStatus, errorThrown) {
266
                        $.fn.showError(textStatus);
267
                    }).always(function() {
268
                        NProgress.done();
269
                    });
270
                }
271
           });
272
 
273
        });
274
 
17251 ariadna 275
        // Maneja el evento de clic para refrescar la tabla
17003 efrain 276
        $('body').on('click', 'button.btn-refresh', function(e) {
277
            e.preventDefault();
278
            gridTable.api().ajax.reload(null, false);
279
        });
280
 
17251 ariadna 281
        // Maneja el evento de clic para cancelar y cerrar el modal
17003 efrain 282
        $('body').on('click', 'button.btn-cancel', function(e) {
283
            e.preventDefault();
284
            $('#modal').modal('hide');
285
        });
286
 
287
 
288
    });
289
JS;
290
$this->inlineScript()->captureEnd();
291
?>
292
 
17246 ariadna 293
 
294
 
17003 efrain 295
<div class="container">
17246 ariadna 296
    <div class="row">
297
        <div class="col-12 mt-3">
298
            <div class="card">
299
 
300
                <div class="card-body">
301
                    <h6 class="card-title">LABEL_MEDIA_CATEGORIES</h6>
302
                    <div class="row">
303
                        <div class="col-12  mt-3">
304
                            <table id="gridTable" class="table   table-bordered">
305
                                <thead>
306
                                    <tr>
307
                                        <th>LABEL_NAME</th>
308
                                        <th>LABEL_ACTIONS</th>
309
                                    </tr>
310
                                </thead>
311
                                <tbody>
312
                                </tbody>
313
                            </table>
314
                        </div>
315
                    </div>
316
 
317
                </div>
318
                <div class="card-footer text-right">
319
 
320
                    <button type="button" class="btn btn-info btn-refresh"><i class="fa fa-sync"></i> LABEL_REFRESH </button>
321
                    <?php if ($allowAdd) : ?>
322
                        <button type="button" class="btn btn-primary btn-add"><i class="fa fa-plus"></i> LABEL_ADD </button>
323
                    <?php endif; ?>
324
 
325
                </div>
326
            </div>
327
        </div>
328
    </div>
17003 efrain 329
</div>
330
 
331
<!-- The Modal -->
332
<div class="modal" id="modal">
17246 ariadna 333
    <div class="modal-dialog  modal-lg">
334
        <div class="modal-content">
17003 efrain 335
 
336
            <!-- Modal Header -->
17246 ariadna 337
            <div class="modal-header">
338
                <h6 class="modal-title">LABEL_CATEGORIES</h6>
339
                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="btn-close"></button>
340
            </div>
17003 efrain 341
 
17246 ariadna 342
            <?php
343
            $form = $this->form;
344
            $form->setAttributes([
345
                'method'    => 'post',
346
                'name'      => 'form',
347
                'id'        => 'form'
348
            ]);
349
 
350
            $form->prepare();
351
            echo $this->form()->openTag($form);
352
            ?>
353
 
17003 efrain 354
            <!-- Modal body -->
17246 ariadna 355
            <div class="modal-body">
17003 efrain 356
 
17246 ariadna 357
                <div class="row">
358
                    <div class="col  mt-3">
359
                        <?php
360
                        $element = $form->get('name');
361
                        $element->setOptions(['label' => 'LABEL_NAME']);
362
                        $element->setAttributes(['class' => 'form-control']);
17003 efrain 363
 
17246 ariadna 364
                        echo $this->formLabel($element);
365
                        echo $this->formText($element);
366
                        ?>
367
                    </div>
368
                </div>
17003 efrain 369
 
370
 
17246 ariadna 371
            </div>
17003 efrain 372
 
17246 ariadna 373
            <!-- Modal footer -->
374
            <div class="modal-footer text-right">
375
                <button type="submit" class="btn btn-primary">LABEL_SAVE</button>
376
                <button type="button" class="btn btn-light btn-cancel">LABEL_CANCEL</button>
377
            </div>
378
            <?php echo $this->form()->closeTag($form); ?>
17003 efrain 379
 
17246 ariadna 380
        </div>
381
    </div>
382
</div>