@nixweb/nixloc-ui 1.19.0 → 1.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/package.json +1 -1
  2. package/src/component/forms/ButtonFilter.vue +104 -104
  3. package/src/component/forms/ButtonGroup.vue +66 -66
  4. package/src/component/forms/ButtonGroupInline.vue +210 -210
  5. package/src/component/forms/ButtonSub.vue +97 -97
  6. package/src/component/forms/ButtonToggle.vue +76 -76
  7. package/src/component/forms/DateYearMonth.vue +192 -192
  8. package/src/component/forms/ImageUpload.vue +214 -214
  9. package/src/component/forms/IncrementDecrement.vue +151 -151
  10. package/src/component/forms/InputAddressGoogle.vue +171 -171
  11. package/src/component/forms/InputCallToAction.vue +135 -135
  12. package/src/component/forms/InputDecimalDiscount.vue +146 -146
  13. package/src/component/forms/InputTag.vue +124 -124
  14. package/src/component/forms/InputTextEdit.vue +69 -69
  15. package/src/component/forms/InputWhatsApp.vue +47 -47
  16. package/src/component/forms/SideBar.vue +99 -99
  17. package/src/component/forms/Toggle.vue +72 -72
  18. package/src/component/layout/Account.vue +131 -131
  19. package/src/component/layout/AnimatedPhrase.vue +68 -68
  20. package/src/component/layout/BarFloating.vue +67 -67
  21. package/src/component/layout/BottomActionsBar.vue +205 -205
  22. package/src/component/layout/ColorPicker.vue +175 -175
  23. package/src/component/layout/Gantt.vue +128 -128
  24. package/src/component/layout/HideShow.vue +61 -61
  25. package/src/component/layout/IconMolded.vue +58 -58
  26. package/src/component/layout/IconPicker.vue +161 -161
  27. package/src/component/layout/NewAccount.vue +136 -136
  28. package/src/component/layout/NewHeader.vue +59 -59
  29. package/src/component/layout/NewIconMolded.vue +70 -70
  30. package/src/component/layout/NewMenu.vue +472 -472
  31. package/src/component/layout/Tab.vue +259 -259
  32. package/src/component/layout/Tag.vue +97 -97
  33. package/src/component/layout/Tooltip.vue +155 -155
  34. package/src/component/layout/Zoom.vue +111 -111
  35. package/src/component/rental/DisplayCalculatePeriod.vue +48 -48
  36. package/src/component/rental/DisplayPeriodRent.vue +55 -55
  37. package/src/component/rental/DisplayTotalization.vue +86 -86
  38. package/src/component/report/Fields.vue +108 -108
  39. package/src/component/report/Report.vue +377 -377
  40. package/src/component/report/ReportTable.vue +111 -111
  41. package/src/component/report/Totalization.vue +33 -33
  42. package/src/component/shared/CodeEditor.vue +128 -128
  43. package/src/component/shared/Confirmation.vue +74 -74
  44. package/src/component/shared/DocumentEditor.vue +99 -99
  45. package/src/component/shared/DocumentPreview.vue +117 -105
  46. package/src/component/shared/DocumentPublic.vue +33 -33
  47. package/src/component/shared/ExportExcel.vue +56 -56
  48. package/src/component/shared/FullCalendar.vue +175 -175
  49. package/src/component/shared/HeaderReport.vue +47 -47
  50. package/src/component/shared/ListNotifications.vue +70 -70
  51. package/src/component/shared/Loading.vue +1 -4
  52. package/src/component/shared/LoadingCard.vue +64 -64
  53. package/src/component/shared/ParameterLegend.vue +169 -169
  54. package/src/component/shared/Report.vue +250 -250
  55. package/src/component/shared/SaveCancel.vue +99 -117
  56. package/src/component/shared/SelectOption.vue +162 -162
  57. package/src/component/shared/TableDraggable.vue +117 -117
  58. package/src/component/shared/TableImport.vue +93 -93
  59. package/src/component/shared/TableItem.vue +228 -228
  60. package/src/component/shared/TableTotalPerPage.vue +114 -114
  61. package/src/component/shared/TableTotalRecords.vue +44 -44
  62. package/src/component/shared/TimeLine.vue +41 -41
  63. package/src/component/shared/Timer.vue +77 -77
  64. package/src/component/shared/ToggleTheme.vue +127 -127
  65. package/src/component/shared/TotalizationReport.vue +86 -86
  66. package/src/component/shared/actions/ActionButtons.vue +53 -53
  67. package/src/component/shared/actions/ActionErrorContent.vue +103 -103
  68. package/src/component/shared/actions/ActionFooter.vue +93 -99
  69. package/src/component/shared/actions/ActionHeader.vue +110 -110
  70. package/src/component/shared/actions/ActionItemList.vue +143 -143
  71. package/src/component/shared/actions/ActionsOptions.vue +209 -209
  72. package/src/component/shared/actions/ActionsSelected.vue +262 -262
  73. package/src/component/shared/automation/ActivitiesList.vue +43 -43
  74. package/src/component/shared/automation/AddRule.vue +60 -60
  75. package/src/component/shared/automation/AutomationBuilder.vue +26 -26
  76. package/src/component/shared/automation/DynamicComponentList.vue +85 -85
  77. package/src/component/shared/automation/SelectRule.vue +97 -97
  78. package/src/component/shared/automation/components/BillingByRent.vue +97 -97
  79. package/src/component/shared/automation/components/SendEmail.vue +93 -93
  80. package/src/component/shared/file-manager/FileManager.vue +390 -390
  81. package/src/component/shared/filter-builder/FilterBuilder.vue +220 -220
  82. package/src/component/shared/filter-builder/FilterQuery.vue +95 -95
  83. package/src/component/shared/query-builder/ConvertToOdata.js +86 -86
  84. package/src/component/shared/query-builder/DynamicComponent.vue +161 -161
  85. package/src/component/shared/query-builder/Fields.vue +93 -93
  86. package/src/component/shared/query-builder/Rules.vue +68 -68
  87. package/src/component/shared/query-builder/SelectRule.vue +97 -97
  88. package/src/component/shared/query-builder/Tags.vue +59 -59
  89. package/src/component/signature/Payment.vue +160 -160
  90. package/src/component/signature/Warning.vue +75 -75
  91. package/src/component/template/ReportCreateUpdate.vue +110 -110
  92. package/src/component/template/ViewTemplateDocumentView.vue +213 -213
  93. package/src/component/template/ViewTemplateImportFile.vue +347 -347
  94. package/src/component/template/ViewTemplateReportList.vue +240 -240
  95. package/src/component/template/ViewTemplateReportPreview.vue +521 -521
  96. package/src/component/template/ViewTemplateSelectOption.vue +46 -46
  97. package/src/component/template/model/Report.js +5 -5
  98. package/src/component/training/Course.vue +343 -343
  99. package/src/component/training/CourseView.vue +198 -198
  100. package/src/component/value-objects/Address.js +10 -10
  101. package/src/component/value-objects/Address.vue +173 -173
  102. package/src/component/value-objects/Contact.js +6 -6
  103. package/src/component/value-objects/Contact.vue +106 -106
  104. package/src/component/value-objects/Person.js +10 -10
  105. package/src/component/value-objects/Person.vue +130 -130
  106. package/src/store/modules/automation.js +30 -30
  107. package/src/store/modules/generic.js +16 -6
  108. package/src/store/modules/report.js +277 -277
  109. package/src/store/modules/user.js +69 -69
  110. package/src/store/modules/util.js +25 -25
@@ -1,378 +1,378 @@
1
- <template>
2
- <div class="main">
3
- <Panel :module="module" layout="large" :title="name" :showVerticalFilter="false" :showSearch="false"
4
- :showButtons="false">
5
- <div slot="content-main">
6
- <br>
7
- <div class="div-btn">
8
- <Molded>
9
- <div class="div-filter">
10
- <div class="side-by-side">
11
- <div class="div-filter">
12
- <Button _key="btnSearchReport" :disabled="loading || !isValid" type="primary"
13
- :title="loading ? 'Aguarde...' : 'Buscar'" classIcon="fas fa-file-search"
14
- size="medium" :clicked="executeSearch" />
15
- </div>
16
- </div>
17
- <div class="side-by-side">
18
- <Fields :data="header" v-model="ordering" />
19
- </div>
20
- <div class="side-by-side div-filter-query">
21
- <FilterQuery :filters="filters" v-model="stringFilter" />
22
- </div>
23
- </div>
24
- </Molded>
25
- </div>
26
- <div v-if="!cancel">
27
- <div v-if="liveTotalRecords != totalRecords">
28
- <ProgressBar :text="`Carregando ${liveTotalRecords} registros de ${totalRecords}`"
29
- :value="liveTotalRecords" :max="totalRecords" size="medium" />
30
- <div class="text-center cancel" @click="stop">
31
- <i class="fa-solid fa-ban"></i> Cancelar
32
- </div>
33
- </div>
34
- </div>
35
-
36
- <div v-if="!isValid">
37
- <Alert type="info">
38
- <span>
39
- É necessário informar o filtro <div class="badge badge-default">
40
- {{ fieldsRequired }}
41
- </div>, clique no botão <b> <i class="div-icon-btn fa-sharp fa-solid fa-filters"
42
- aria-hidden="true"></i> Filtros
43
- </b>para
44
- adicionar.
45
- </span>
46
- </Alert>
47
- </div>
48
- <div v-if="show" class="preview">
49
- <div class="toolbar">
50
-
51
- <div class="icon-toolbar" v-print="'#printMe'">
52
- <i class="fas fa-print"></i>
53
- </div>
54
- <div v-if="loadingFile" class="icon-toolbar">
55
- <i class="fa-duotone fa-solid fa-spinner-third loading-icon"></i>
56
- </div>
57
- <div v-else @click="generatePDF" class="icon-toolbar">
58
- <i class="fa-solid fa-file-pdf"></i>
59
- </div>
60
- <div class="icon-toolbar icon-excel">
61
- <ExportExcel :nameFile="name" :header="dataConditional" :data="data" />
62
- </div>
63
- <div class="div-pipe icon-toolbar"></div>
64
- <div class="icon-toolbar" @click="addEvent({ name: 'zoomIn' })">
65
- <i class="fa-regular fa-magnifying-glass-plus"></i>
66
- </div>
67
-
68
- <div class="icon-toolbar" @click="addEvent({ name: 'zoomOut' })">
69
- <i class="fa-regular fa-magnifying-glass-minus"></i>
70
- </div>
71
- </div>
72
- <ScrollBar :minHeight="400" :maxHeight="820">
73
- <br />
74
- <div id="printMe" :style="'min-height:' + minHeight + 'px'" class="a4 footer">
75
- <Zoom>
76
- <HeaderReport :title="name" />
77
- <div>
78
- <span>Total de <b> {{ totalRecords }}</b> registro(s) </span>
79
- </div>
80
- <ReportTable :header="dataConditional" :data="data" />
81
- <Totalization :totalization="totalization" />
82
- </Zoom>
83
- </div>
84
- </ScrollBar>
85
- </div>
86
- </div>
87
- </Panel>
88
- <br>
89
- <br>
90
- </div>
91
- </template>
92
-
93
- <script>
94
-
95
- import Molded from "@nixweb/nixloc-ui/src/component/layout/Molded";
96
- import ScrollBar from "@nixweb/nixloc-ui/src/component/layout/ScrollBar.vue";
97
- import Loading from "@nixweb/nixloc-ui/src/component/shared/Loading.vue";
98
- import HeaderReport from "../shared/HeaderReport.vue";
99
- import ExportExcel from "@nixweb/nixloc-ui/src/component/shared/ExportExcel";
100
- import ReportTable from "@nixweb/nixloc-ui/src/component/report/ReportTable.vue";
101
- import Totalization from "@nixweb/nixloc-ui/src/component/report/Totalization.vue";
102
- import FilterQuery from '@nixweb/nixloc-ui/src/component/shared/filter-builder/FilterQuery.vue'
103
- import ProgressBar from "@nixweb/nixloc-ui/src/component/shared/ProgressBar";
104
- import Button from "@nixweb/nixloc-ui/src/component/forms/Button";
105
- import Fields from "@nixweb/nixloc-ui/src/component/report/Fields.vue";
106
- import Panel from "@nixweb/nixloc-ui/src/component/layout/Panel.vue";
107
- import Alert from "@nixweb/nixloc-ui/src/component/layout/Alert";
108
- import Zoom from "@nixweb/nixloc-ui/src/component/layout/Zoom";
109
-
110
- import print from "vue-print-nb";
111
- import html2pdf from 'html2pdf.js'
112
-
113
- import { mapMutations, mapActions, mapGetters } from "vuex";
114
-
115
-
116
- export default {
117
- directives: {
118
- print,
119
- },
120
- props: ["name", "module", "urlGet", "header", "filters", "minHeight"],
121
- components: { ScrollBar, HeaderReport, Alert, Zoom, ExportExcel, ReportTable, Molded, FilterQuery, Button, Fields, Panel, Loading, Totalization, ProgressBar },
122
- data() {
123
- return {
124
- loading: false,
125
- show: false,
126
- data: [],
127
- totalization: [],
128
- ordering: {},
129
- stringFilter: [],
130
- totalRecords: 0,
131
- currentPage: 1,
132
- totalPerPage: 50,
133
- pagination: [],
134
- cancel: false,
135
- loadingFile: false,
136
- }
137
- },
138
- mounted() {
139
- this.removeLoading(["panel"]);
140
- },
141
- computed: {
142
- ...mapGetters("generic", ["event"]),
143
- dataConditional() {
144
- return this.header.filter(item => item.show);
145
- },
146
- liveTotalRecords() {
147
- return this.data.length;
148
- },
149
- isValid() {
150
- var hasRequired = this.filters.some(item => item.required);
151
- if (hasRequired) {
152
- return this.stringFilter.some(item => item.required == true && item.value !== "");
153
- } else {
154
- return true;
155
- }
156
- },
157
- fieldsRequired() {
158
- let title = "";
159
- var filter = this.filters.filter(item => item.required);
160
- filter.forEach(item => {
161
- title += item.title + ' ou '
162
- });
163
- return title.replace(/ ou\s*$/, '');
164
- }
165
- },
166
- methods: {
167
- ...mapMutations("generic", ["addEvent", "removeLoading"]),
168
- ...mapActions("generic", ["getApi"]),
169
- executeSearch() {
170
- this.cancel = false;
171
- this.data = [];
172
- this.pagination = [];
173
- this.totalization = [];
174
- this.getAll();
175
- },
176
- getAll() {
177
- if (this.isValid && !this.cancel) {
178
- this.removeLoading(["btnSearchReport"]);
179
- this.loading = true;
180
- this.cancel = false;
181
-
182
- let params = {
183
- url: this.urlGet,
184
- obj:
185
- {
186
- stringFilter: JSON.stringify(this.stringFilter),
187
- fieldOrder: this.ordering.field,
188
- ordering: this.ordering.ordering,
189
- currentPage: this.currentPage,
190
- totalPerPage: this.totalPerPage,
191
- noPaginated: true
192
- }
193
- };
194
-
195
- this.getApi(params).then((response) => {
196
- let self = this;
197
- this.totalization = response.content.totalization;
198
- this.totalRecords = response.content.totalRecords;
199
-
200
- if (this.pagination.length == 0) {
201
- this.currentPage = 1;
202
- this.data = [];
203
- }
204
-
205
- if (this.pagination.length == 0) {
206
- var pagination = response.content.totalRecords / this.totalPerPage;
207
- var arr = Math.ceil(pagination);
208
- for (var i = 1; i <= arr; i++) {
209
- self.pagination.push(i);
210
- }
211
- } else {
212
- this.pagination.pop();
213
- }
214
-
215
- response.content.data.forEach(item => {
216
- self.data.push(item);
217
- });
218
-
219
- this.show = true;
220
- setTimeout(function () {
221
- self.loading = false;
222
- }, 500);
223
-
224
- this.verifyIfPagination();
225
- });
226
- }
227
- },
228
- async generatePDF() {
229
- try {
230
- this.loadingFile = true;
231
-
232
- const element = document.getElementById('printMe');
233
-
234
- const opt = {
235
- margin: 0,
236
- filename: this.name + '.pdf',
237
- image: { type: 'jpeg', quality: 0.98 },
238
- html2canvas: { scale: 2 },
239
- jsPDF: { unit: 'mm', format: 'a4', orientation: 'landscape' }
240
- };
241
-
242
- await html2pdf()
243
- .set(opt)
244
- .from(element)
245
- .save();
246
-
247
- } catch (error) {
248
- console.error('Erro ao gerar PDF:', error);
249
- } finally {
250
- this.loadingFile = false;
251
- }
252
- },
253
- verifyIfPagination() {
254
- if (this.pagination.length > 0) {
255
- this.currentPage++;
256
-
257
- let self = this;
258
- setTimeout(function () {
259
- self.getAll();
260
- }, 500);
261
- } else {
262
- this.currentPage = 1;
263
- }
264
- },
265
- stop() {
266
- this.cancel = true;
267
- this.loading = false;
268
- }
269
- },
270
- watch: {
271
- event: {
272
- handler(event) {
273
- if (this.show) {
274
- if (event.name == "stringFilter" || event.name == "orderedFilter") {
275
- let self = this;
276
- setTimeout(function () {
277
- // self.getAll();
278
- }, 500);
279
- }
280
- }
281
- },
282
- deep: true,
283
- },
284
- },
285
- };
286
- </script>
287
-
288
- <style scoped>
289
- .main {
290
- margin-bottom: 30px;
291
-
292
- }
293
-
294
- .title {
295
- font-size: 12px;
296
- font-weight: normal;
297
- }
298
-
299
- .div-btn {
300
- margin-bottom: 30px;
301
- }
302
-
303
- .div-pipe {
304
- border-left: 1.5px solid rgb(189, 189, 189);
305
- margin: 0px -15px -6px 0px;
306
- height: 25px;
307
- }
308
-
309
-
310
- .preview {
311
- background-color: #fafafa;
312
- padding-bottom: 20px;
313
- border: 1px solid #e4e6ec;
314
- height: 100%;
315
- }
316
-
317
- .loading-icon {
318
- color: orange;
319
- font-size: 19px;
320
- animation: spin 1s linear infinite;
321
- }
322
-
323
- @keyframes spin {
324
- 100% {
325
- transform: rotate(360deg);
326
- }
327
- }
328
-
329
- .toolbar {
330
- height: 40px;
331
- border-bottom: 1px hsl(0, 0%, 82.7%) solid;
332
- overflow: hidden;
333
- }
334
-
335
- .icon-toolbar {
336
- width: 20px;
337
- font-size: 18px;
338
- margin-left: 10px;
339
- margin-top: 2px;
340
- cursor: pointer;
341
- display: inline-block;
342
- }
343
-
344
- .a4 {
345
- max-width: 1200px;
346
- padding: 20px;
347
- border-radius: var(--ck-border-radius);
348
- background: white;
349
- box-shadow: 0 0 5px hsl(0deg 0% 0% / 10%);
350
- margin: 0 auto;
351
- }
352
-
353
- .div-filter {
354
- margin-bottom: -12px;
355
- }
356
-
357
- .div-filter-query {
358
- margin-top: 10px;
359
- }
360
-
361
- .footer {
362
- margin-bottom: 10px;
363
- }
364
-
365
- .icon-excel {
366
- color: green;
367
- }
368
-
369
- .cancel {
370
- color: red;
371
- cursor: pointer;
372
- }
373
-
374
- .badge-default {
375
- background-color: #eeeeee;
376
- font-size: 13px !important;
377
- }
1
+ <template>
2
+ <div class="main">
3
+ <Panel :module="module" layout="large" :title="name" :showVerticalFilter="false" :showSearch="false"
4
+ :showButtons="false">
5
+ <div slot="content-main">
6
+ <br>
7
+ <div class="div-btn">
8
+ <Molded>
9
+ <div class="div-filter">
10
+ <div class="side-by-side">
11
+ <div class="div-filter">
12
+ <Button _key="btnSearchReport" :disabled="loading || !isValid" type="primary"
13
+ :title="loading ? 'Aguarde...' : 'Buscar'" classIcon="fas fa-file-search"
14
+ size="medium" :clicked="executeSearch" />
15
+ </div>
16
+ </div>
17
+ <div class="side-by-side">
18
+ <Fields :data="header" v-model="ordering" />
19
+ </div>
20
+ <div class="side-by-side div-filter-query">
21
+ <FilterQuery :filters="filters" v-model="stringFilter" />
22
+ </div>
23
+ </div>
24
+ </Molded>
25
+ </div>
26
+ <div v-if="!cancel">
27
+ <div v-if="liveTotalRecords != totalRecords">
28
+ <ProgressBar :text="`Carregando ${liveTotalRecords} registros de ${totalRecords}`"
29
+ :value="liveTotalRecords" :max="totalRecords" size="medium" />
30
+ <div class="text-center cancel" @click="stop">
31
+ <i class="fa-solid fa-ban"></i> Cancelar
32
+ </div>
33
+ </div>
34
+ </div>
35
+
36
+ <div v-if="!isValid">
37
+ <Alert type="info">
38
+ <span>
39
+ É necessário informar o filtro <div class="badge badge-default">
40
+ {{ fieldsRequired }}
41
+ </div>, clique no botão <b> <i class="div-icon-btn fa-sharp fa-solid fa-filters"
42
+ aria-hidden="true"></i> Filtros
43
+ </b>para
44
+ adicionar.
45
+ </span>
46
+ </Alert>
47
+ </div>
48
+ <div v-if="show" class="preview">
49
+ <div class="toolbar">
50
+
51
+ <div class="icon-toolbar" v-print="'#printMe'">
52
+ <i class="fas fa-print"></i>
53
+ </div>
54
+ <div v-if="loadingFile" class="icon-toolbar">
55
+ <i class="fa-duotone fa-solid fa-spinner-third loading-icon"></i>
56
+ </div>
57
+ <div v-else @click="generatePDF" class="icon-toolbar">
58
+ <i class="fa-solid fa-file-pdf"></i>
59
+ </div>
60
+ <div class="icon-toolbar icon-excel">
61
+ <ExportExcel :nameFile="name" :header="dataConditional" :data="data" />
62
+ </div>
63
+ <div class="div-pipe icon-toolbar"></div>
64
+ <div class="icon-toolbar" @click="addEvent({ name: 'zoomIn' })">
65
+ <i class="fa-regular fa-magnifying-glass-plus"></i>
66
+ </div>
67
+
68
+ <div class="icon-toolbar" @click="addEvent({ name: 'zoomOut' })">
69
+ <i class="fa-regular fa-magnifying-glass-minus"></i>
70
+ </div>
71
+ </div>
72
+ <ScrollBar :minHeight="400" :maxHeight="820">
73
+ <br />
74
+ <div id="printMe" :style="'min-height:' + minHeight + 'px'" class="a4 footer">
75
+ <Zoom>
76
+ <HeaderReport :title="name" />
77
+ <div>
78
+ <span>Total de <b> {{ totalRecords }}</b> registro(s) </span>
79
+ </div>
80
+ <ReportTable :header="dataConditional" :data="data" />
81
+ <Totalization :totalization="totalization" />
82
+ </Zoom>
83
+ </div>
84
+ </ScrollBar>
85
+ </div>
86
+ </div>
87
+ </Panel>
88
+ <br>
89
+ <br>
90
+ </div>
91
+ </template>
92
+
93
+ <script>
94
+
95
+ import Molded from "@nixweb/nixloc-ui/src/component/layout/Molded";
96
+ import ScrollBar from "@nixweb/nixloc-ui/src/component/layout/ScrollBar.vue";
97
+ import Loading from "@nixweb/nixloc-ui/src/component/shared/Loading.vue";
98
+ import HeaderReport from "../shared/HeaderReport.vue";
99
+ import ExportExcel from "@nixweb/nixloc-ui/src/component/shared/ExportExcel";
100
+ import ReportTable from "@nixweb/nixloc-ui/src/component/report/ReportTable.vue";
101
+ import Totalization from "@nixweb/nixloc-ui/src/component/report/Totalization.vue";
102
+ import FilterQuery from '@nixweb/nixloc-ui/src/component/shared/filter-builder/FilterQuery.vue'
103
+ import ProgressBar from "@nixweb/nixloc-ui/src/component/shared/ProgressBar";
104
+ import Button from "@nixweb/nixloc-ui/src/component/forms/Button";
105
+ import Fields from "@nixweb/nixloc-ui/src/component/report/Fields.vue";
106
+ import Panel from "@nixweb/nixloc-ui/src/component/layout/Panel.vue";
107
+ import Alert from "@nixweb/nixloc-ui/src/component/layout/Alert";
108
+ import Zoom from "@nixweb/nixloc-ui/src/component/layout/Zoom";
109
+
110
+ import print from "vue-print-nb";
111
+ import html2pdf from 'html2pdf.js'
112
+
113
+ import { mapMutations, mapActions, mapGetters } from "vuex";
114
+
115
+
116
+ export default {
117
+ directives: {
118
+ print,
119
+ },
120
+ props: ["name", "module", "urlGet", "header", "filters", "minHeight"],
121
+ components: { ScrollBar, HeaderReport, Alert, Zoom, ExportExcel, ReportTable, Molded, FilterQuery, Button, Fields, Panel, Loading, Totalization, ProgressBar },
122
+ data() {
123
+ return {
124
+ loading: false,
125
+ show: false,
126
+ data: [],
127
+ totalization: [],
128
+ ordering: {},
129
+ stringFilter: [],
130
+ totalRecords: 0,
131
+ currentPage: 1,
132
+ totalPerPage: 50,
133
+ pagination: [],
134
+ cancel: false,
135
+ loadingFile: false,
136
+ }
137
+ },
138
+ mounted() {
139
+ this.removeLoading(["panel"]);
140
+ },
141
+ computed: {
142
+ ...mapGetters("generic", ["event"]),
143
+ dataConditional() {
144
+ return this.header.filter(item => item.show);
145
+ },
146
+ liveTotalRecords() {
147
+ return this.data.length;
148
+ },
149
+ isValid() {
150
+ var hasRequired = this.filters.some(item => item.required);
151
+ if (hasRequired) {
152
+ return this.stringFilter.some(item => item.required == true && item.value !== "");
153
+ } else {
154
+ return true;
155
+ }
156
+ },
157
+ fieldsRequired() {
158
+ let title = "";
159
+ var filter = this.filters.filter(item => item.required);
160
+ filter.forEach(item => {
161
+ title += item.title + ' ou '
162
+ });
163
+ return title.replace(/ ou\s*$/, '');
164
+ }
165
+ },
166
+ methods: {
167
+ ...mapMutations("generic", ["addEvent", "removeLoading"]),
168
+ ...mapActions("generic", ["getApi"]),
169
+ executeSearch() {
170
+ this.cancel = false;
171
+ this.data = [];
172
+ this.pagination = [];
173
+ this.totalization = [];
174
+ this.getAll();
175
+ },
176
+ getAll() {
177
+ if (this.isValid && !this.cancel) {
178
+ this.removeLoading(["btnSearchReport"]);
179
+ this.loading = true;
180
+ this.cancel = false;
181
+
182
+ let params = {
183
+ url: this.urlGet,
184
+ obj:
185
+ {
186
+ stringFilter: JSON.stringify(this.stringFilter),
187
+ fieldOrder: this.ordering.field,
188
+ ordering: this.ordering.ordering,
189
+ currentPage: this.currentPage,
190
+ totalPerPage: this.totalPerPage,
191
+ noPaginated: true
192
+ }
193
+ };
194
+
195
+ this.getApi(params).then((response) => {
196
+ let self = this;
197
+ this.totalization = response.content.totalization;
198
+ this.totalRecords = response.content.totalRecords;
199
+
200
+ if (this.pagination.length == 0) {
201
+ this.currentPage = 1;
202
+ this.data = [];
203
+ }
204
+
205
+ if (this.pagination.length == 0) {
206
+ var pagination = response.content.totalRecords / this.totalPerPage;
207
+ var arr = Math.ceil(pagination);
208
+ for (var i = 1; i <= arr; i++) {
209
+ self.pagination.push(i);
210
+ }
211
+ } else {
212
+ this.pagination.pop();
213
+ }
214
+
215
+ response.content.data.forEach(item => {
216
+ self.data.push(item);
217
+ });
218
+
219
+ this.show = true;
220
+ setTimeout(function () {
221
+ self.loading = false;
222
+ }, 500);
223
+
224
+ this.verifyIfPagination();
225
+ });
226
+ }
227
+ },
228
+ async generatePDF() {
229
+ try {
230
+ this.loadingFile = true;
231
+
232
+ const element = document.getElementById('printMe');
233
+
234
+ const opt = {
235
+ margin: 0,
236
+ filename: this.name + '.pdf',
237
+ image: { type: 'jpeg', quality: 0.98 },
238
+ html2canvas: { scale: 2 },
239
+ jsPDF: { unit: 'mm', format: 'a4', orientation: 'landscape' }
240
+ };
241
+
242
+ await html2pdf()
243
+ .set(opt)
244
+ .from(element)
245
+ .save();
246
+
247
+ } catch (error) {
248
+ console.error('Erro ao gerar PDF:', error);
249
+ } finally {
250
+ this.loadingFile = false;
251
+ }
252
+ },
253
+ verifyIfPagination() {
254
+ if (this.pagination.length > 0) {
255
+ this.currentPage++;
256
+
257
+ let self = this;
258
+ setTimeout(function () {
259
+ self.getAll();
260
+ }, 500);
261
+ } else {
262
+ this.currentPage = 1;
263
+ }
264
+ },
265
+ stop() {
266
+ this.cancel = true;
267
+ this.loading = false;
268
+ }
269
+ },
270
+ watch: {
271
+ event: {
272
+ handler(event) {
273
+ if (this.show) {
274
+ if (event.name == "stringFilter" || event.name == "orderedFilter") {
275
+ let self = this;
276
+ setTimeout(function () {
277
+ // self.getAll();
278
+ }, 500);
279
+ }
280
+ }
281
+ },
282
+ deep: true,
283
+ },
284
+ },
285
+ };
286
+ </script>
287
+
288
+ <style scoped>
289
+ .main {
290
+ margin-bottom: 30px;
291
+
292
+ }
293
+
294
+ .title {
295
+ font-size: 12px;
296
+ font-weight: normal;
297
+ }
298
+
299
+ .div-btn {
300
+ margin-bottom: 30px;
301
+ }
302
+
303
+ .div-pipe {
304
+ border-left: 1.5px solid rgb(189, 189, 189);
305
+ margin: 0px -15px -6px 0px;
306
+ height: 25px;
307
+ }
308
+
309
+
310
+ .preview {
311
+ background-color: #fafafa;
312
+ padding-bottom: 20px;
313
+ border: 1px solid #e4e6ec;
314
+ height: 100%;
315
+ }
316
+
317
+ .loading-icon {
318
+ color: orange;
319
+ font-size: 19px;
320
+ animation: spin 1s linear infinite;
321
+ }
322
+
323
+ @keyframes spin {
324
+ 100% {
325
+ transform: rotate(360deg);
326
+ }
327
+ }
328
+
329
+ .toolbar {
330
+ height: 40px;
331
+ border-bottom: 1px hsl(0, 0%, 82.7%) solid;
332
+ overflow: hidden;
333
+ }
334
+
335
+ .icon-toolbar {
336
+ width: 20px;
337
+ font-size: 18px;
338
+ margin-left: 10px;
339
+ margin-top: 2px;
340
+ cursor: pointer;
341
+ display: inline-block;
342
+ }
343
+
344
+ .a4 {
345
+ max-width: 1200px;
346
+ padding: 20px;
347
+ border-radius: var(--ck-border-radius);
348
+ background: white;
349
+ box-shadow: 0 0 5px hsl(0deg 0% 0% / 10%);
350
+ margin: 0 auto;
351
+ }
352
+
353
+ .div-filter {
354
+ margin-bottom: -12px;
355
+ }
356
+
357
+ .div-filter-query {
358
+ margin-top: 10px;
359
+ }
360
+
361
+ .footer {
362
+ margin-bottom: 10px;
363
+ }
364
+
365
+ .icon-excel {
366
+ color: green;
367
+ }
368
+
369
+ .cancel {
370
+ color: red;
371
+ cursor: pointer;
372
+ }
373
+
374
+ .badge-default {
375
+ background-color: #eeeeee;
376
+ font-size: 13px !important;
377
+ }
378
378
  </style>