Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 17253 | | Comparar con el anterior | Ultima modificación | Ver Log |

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