@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,473 +1,473 @@
1
- <template>
2
- <div>
3
- <div :class="['sidebar', { collapsed: menuCollapsed }]">
4
- <div class="sidebar-header">
5
- <span class="header-logo" @click="editProfile">
6
- <img class="photo" :src="urlPhoto" />
7
- </span>
8
- <div :style="'margin-left:' + (menuCollapsed ? 55 : 170) + 'px'" class="div-menu-toggle"
9
- @click="toggleSidebar">
10
- <div class="icon-menu-arrow">
11
- <i v-if="menuCollapsed" class="fa-solid fa-angle-right "></i>
12
- <i v-else class="fa-solid fa-angle-left"></i>
13
- </div>
14
- </div>
15
- </div>
16
-
17
- <ScrollBar :minHeight="pageSize" :maxHeight="pageSize">
18
- <div :class="{ 'sub': menuCollapsed }">
19
- <div v-for="(item, index) in menuFilter(true)">
20
- <div @mouseover="handleMouseOver(item.title, item.module)">
21
- <div :ref="item.title" v-if="menuCollapsed" class="molded-icon text-center" :class="{
22
- 'menu-active': moduleActive === item.module,
23
- 'module-selected': module === item.module
24
- }">
25
- <i :style="'font-size:18px'" :class="item.icon"></i>
26
- <div v-if="false" :style="'margin-top:-16px'">
27
- <span class="title-menu-collapsed">{{ item.abbreviatedTitle }}</span>
28
- </div>
29
- </div>
30
- <div class="molded-icon-open" :class="{
31
- 'menu-active': moduleActive === item.module
32
- }" v-else @mouseover="handleMouseOver(item.title, item.module)">
33
- <b-row>
34
- <b-col sm="12">
35
- <b-row>
36
- <b-col sm="2">
37
- <i :class="item.icon"></i>
38
- </b-col>
39
- <b-col sm="10">
40
- <span class="title-menu">{{ item.title }} </span>
41
- </b-col>
42
- </b-row>
43
- </b-col>
44
- </b-row>
45
- </div>
46
- </div>
47
-
48
- <transition name="slide-fade">
49
- <div :ref="item.title + 'sub'" class="sub-menu-collapsed sub-menu"
50
- :style="'margin-left:' + (menuCollapsed ? 85 : 200) + 'px'"
51
- v-if="titleSubMenuCollapsed == item.title">
52
- <div v-for="(item, index) in subMenuFilter(false)" :key="index">
53
- <div :class="{ 'sub-menu-title-collapsed': item.title }"
54
- @click.prevent="navegateTo(item, item.module)">
55
- <b-row>
56
- <b-col sm="2" v-if="item.title">
57
- <i :class="item.icon"></i>
58
- </b-col>
59
- <b-col sm="9">
60
- <div v-if="item.groupName" class="div-group">
61
- {{ item.groupName }}
62
- </div>
63
- <span>
64
-
65
- <span> {{ item.title }}</span>
66
- <span class="div-new" v-if="item.isVisible == 'support'">
67
- Suporte
68
- </span>
69
- <span class="div-new"
70
- v-if="item.showNewUntil && showNewUntil(item.showNewUntil)">
71
- Novo
72
- </span>
73
- </span>
74
- </b-col>
75
- </b-row>
76
- </div>
77
- </div>
78
- </div>
79
- </transition>
80
- </div>
81
- <br>
82
- <br>
83
- <br>
84
- </div>
85
- </ScrollBar>
86
- </div>
87
- </div>
88
- </template>
89
-
90
- <script>
91
-
92
- import ScrollBar from "@nixweb/nixloc-ui/src/component/layout/ScrollBar.vue";
93
-
94
- import { mapState, mapMutations, mapGetters } from "vuex";
95
-
96
- export default {
97
- props: {
98
- urlPhoto: String,
99
- },
100
- components: {
101
- ScrollBar
102
- },
103
- data() {
104
- return {
105
- module: "",
106
- moduleActive: "",
107
- isSidebarCollapsed: true,
108
- openDropdowns: {},
109
- titleSubMenu: "",
110
- titleSubMenuCollapsed: "",
111
- pageSize: 0,
112
- distanceFromBottom: 0,
113
- };
114
- },
115
- mounted() {
116
- this.updatePageSize();
117
- window.addEventListener('resize', this.updatePageSize);
118
-
119
- if (!localStorage.getItem('menuCollapsed')) {
120
- localStorage.setItem('menuCollapsed', this.isSidebarCollapsed ? "closed" : "open");
121
- }
122
-
123
- if (localStorage.getItem('menuCollapsed') === 'open') {
124
- this.toggleMenu(false);
125
- } else {
126
- this.toggleMenu(true);
127
- }
128
-
129
- if (this.$route.matched[0])
130
- this.moduleActive = this.$route.matched[0].props.default.module;
131
-
132
- },
133
- beforeDestroy() {
134
- window.removeEventListener('resize', this.updatePageSize);
135
- },
136
- computed: {
137
- ...mapState("user", ["menu", "userLogged"]),
138
- ...mapState("generic", ["menuCollapsed"]),
139
- ...mapGetters("generic", ["event"]),
140
- },
141
- methods: {
142
- ...mapMutations("generic", ["addEvent", "toggleMenu"]),
143
- showNewUntil(dateStr) {
144
- const [day, month, year] = dateStr.split('/');
145
- const inputDate = new Date(year, month - 1, day);
146
- const today = new Date();
147
-
148
- // Zerar horas para comparar apenas a data
149
- inputDate.setHours(0, 0, 0, 0);
150
- today.setHours(0, 0, 0, 0);
151
-
152
- return today < inputDate;
153
- },
154
- updatePageSize() {
155
- const windowHeight = window.innerHeight;
156
- this.pageSize = windowHeight;
157
- },
158
- toggleSidebar() {
159
- this.isSidebarCollapsed = !this.isSidebarCollapsed;
160
- this.toggleMenu(this.isSidebarCollapsed);
161
- localStorage.setItem('menuCollapsed', this.isSidebarCollapsed ? "closed" : "open");
162
- this.titleSubMenu = "";
163
- this.titleSubMenuCollapsed = "";
164
- },
165
- toggleSubMenu(title, module) {
166
- this.module = module;
167
- if (this.titleSubMenu === title) {
168
- this.titleSubMenu = "";
169
- } else {
170
- this.titleSubMenu = title;
171
- }
172
- },
173
- handleMouseOver(title, module) {
174
- this.module = module;
175
- this.titleSubMenuCollapsed = title;
176
-
177
- var divSub = this.$refs[title + 'sub'];
178
-
179
- if (divSub) {
180
- let self = this;
181
- setTimeout(function () {
182
- const heightSubMenu = divSub[0].getBoundingClientRect();
183
-
184
- if (heightSubMenu.top < 0 || heightSubMenu.left < 0 || heightSubMenu.bottom > window.innerHeight || heightSubMenu.right > window.innerWidth) {
185
- divSub[0].style.bottom = '0px';
186
- }
187
-
188
- }, 100);
189
- }
190
- },
191
- handleMouseLeave() {
192
- this.titleSubMenuCollapsed = "";
193
- if (this.menuCollapsed)
194
- this.module = "";
195
- },
196
- menuFilter(isModule) {
197
- let filter = [];
198
- this.menu.items.forEach(function (obj) {
199
- if (obj.isModule == isModule) filter.push(obj);
200
- });
201
- return filter.sort((a, b) => a.order - b.order);
202
- },
203
- subMenuFilter(isModule) {
204
- let filter = [];
205
- let self = this;
206
- let userLogged = this.userLogged.user.userName;
207
- let companyId = this.userLogged.companyId;
208
- this.menu.items.forEach(function (obj) {
209
- if (obj.isModule == isModule && obj.module === self.module) {
210
- if (obj.isVisible == "all") filter.push(obj);
211
- if (obj.isVisible == companyId) filter.push(obj);
212
-
213
- if (obj.isVisible == "support" && userLogged == "UserTemp")
214
- filter.push(obj);
215
- }
216
- });
217
- return filter;
218
- },
219
- navegateTo(item, module) {
220
- this.$router.push({
221
- name: item.routeName,
222
- });
223
-
224
- this.moduleActive = module;
225
- this.titleSubMenuCollapsed = "";
226
- },
227
- editProfile() {
228
- this.addEvent({ name: "clickedProfile" });
229
- },
230
- },
231
- watch: {
232
- event: {
233
- handler: function (event) {
234
- if (event.name == "handleMouseOver") {
235
- this.handleMouseLeave();
236
- }
237
- },
238
- deep: true,
239
- },
240
- $route: {
241
- handler: function (router) {
242
- this.moduleActive = router.matched[0].props.default.module;
243
- },
244
- deep: true,
245
- },
246
- },
247
- };
248
- </script>
249
-
250
- <style scoped>
251
- .sidebar {
252
- position: fixed;
253
- top: 0;
254
- left: 0;
255
- width: 200px;
256
- height: 100vh;
257
- border-radius: 0px 20px 0px 0px;
258
- background-color: #577696;
259
- transition: all 0.4s ease;
260
- z-index: 1000;
261
- }
262
-
263
- .sidebar.collapsed {
264
- width: 85px;
265
- }
266
-
267
- .sidebar .sidebar-header {
268
- display: flex;
269
- position: relative;
270
- padding: 10px 20px;
271
- align-items: center;
272
- justify-content: space-between;
273
- }
274
-
275
- .sidebar-header .header-logo img {
276
- width: 46px;
277
- height: 46px;
278
- display: block;
279
- object-fit: contain;
280
- cursor: pointer;
281
- border-radius: 50%;
282
- }
283
-
284
- .sidebar-header .sidebar-toggler,
285
- .sidebar-menu-button {
286
- position: absolute;
287
- left: 70px;
288
- height: 30px;
289
- width: 30px;
290
- color: #151A2D;
291
- border: none;
292
- cursor: pointer;
293
- display: flex;
294
- background: #EEF2FF;
295
- align-items: center;
296
- justify-content: center;
297
- border-radius: 50px;
298
- transition: 0.4s ease;
299
- }
300
-
301
- .sidebar.collapsed .sidebar-header .sidebar-toggler {
302
- transform: translate(-4px, 65px);
303
- }
304
-
305
- .div-menu-toggle {
306
- position: fixed;
307
- font-size: 18px;
308
- top: 25px;
309
- width: 20px;
310
- height: 20px;
311
- background-color: #D98621;
312
- border-radius: 50%;
313
- cursor: pointer;
314
- z-index: 2000;
315
- transition: all 0.4s ease;
316
- }
317
-
318
- .molded-icon-open {
319
- padding-left: 10px;
320
- cursor: pointer;
321
- margin-top: 10px;
322
- color: white;
323
- font-size: 17px;
324
- margin: 15px;
325
- border-radius: 10px;
326
- transition: all 0.3s ease;
327
- }
328
-
329
- .molded-icon-open:hover {
330
- color: #2C3453;
331
- background-color: white;
332
- }
333
-
334
- .menu-active {
335
- background-color: #D98621;
336
- }
337
-
338
- .module-selected {
339
- color: #2C3453 !important;
340
- background-color: white !important;
341
- }
342
-
343
- .icon-menu-arrow {
344
- font-size: 14px;
345
- margin-top: -4px;
346
- margin-left: 6px;
347
- color: white;
348
- }
349
-
350
- .molded-icon {
351
- cursor: pointer;
352
- color: white;
353
- font-size: 18px;
354
- margin: 13px;
355
- border-radius: 10px;
356
- transition: all 0.3s ease;
357
- }
358
-
359
- .molded-icon:hover {
360
- background-color: white;
361
- color: #2C3453;
362
- border-radius: 10px;
363
- transition: all 0.8s ease;
364
- }
365
-
366
- .sub {
367
- cursor: pointer;
368
- transition: all 0.3s ease;
369
- }
370
-
371
- .sub-menu {
372
- margin: 15px;
373
- padding: 10px;
374
- border-radius: 15px;
375
- color: white;
376
- font-size: 14px;
377
- background-color: #2C3453;
378
- transition: all 0.5s ease;
379
- }
380
-
381
- .sub-menu-title {
382
- cursor: pointer;
383
- border-radius: 8px;
384
- padding: 5px;
385
- transition: all 1s ease;
386
- }
387
-
388
- .sub-menu-title:hover {
389
- padding: 5px;
390
- color: #2C3453;
391
- background-color: white;
392
- font-weight: bold;
393
- transition: all 0.8s ease;
394
- }
395
-
396
- .sub-menu-collapsed {
397
- width: 260px;
398
- margin-top: -100px;
399
- position: absolute;
400
- border-radius: 0px 15px 15px 0px;
401
- background-color: #2C3453;
402
- cursor: pointer;
403
- }
404
-
405
- .sub-menu-title-collapsed {
406
- padding: 10px;
407
- border-radius: 8px;
408
- font-size: 13px;
409
- }
410
-
411
- .sub-menu-title-collapsed:hover {
412
- background-color: white;
413
- color: #2C3453;
414
- transition: all 0.8s ease;
415
- }
416
-
417
- .rotate {
418
- transform: rotate(180deg);
419
- transition: transform 0.5s ease;
420
- }
421
-
422
- .rotate-down {
423
- transform: rotate(360deg);
424
- transition: transform 0.5s ease;
425
- }
426
-
427
- .title-menu {
428
- font-size: 13px;
429
- }
430
-
431
- .title-menu-collapsed {
432
- font-size: 11.5px;
433
- }
434
-
435
- .div-arrow {
436
- margin-left: 50px;
437
- }
438
-
439
- .div-menu-bottom {
440
- position: absolute;
441
- bottom: 0;
442
- left: 0;
443
- width: 100%;
444
- padding: 10px;
445
- }
446
-
447
- .div-icon-bottom {
448
- cursor: pointer;
449
- font-size: 17px;
450
- color: white;
451
- border-radius: 10px;
452
- background-color: #2C3453;
453
- }
454
-
455
- .title-logout {
456
- font-size: 16px;
457
- margin-left: 10px;
458
- }
459
-
460
- .div-group {
461
- margin-left: 10px;
462
- padding: 5px;
463
- }
464
-
465
- .div-new {
466
- background-color: #0A36DB;
467
- font-size: 11px;
468
- border-radius: 20px;
469
- padding: 1px 3px 2px 2px;
470
- margin-left: 5px;
471
- color: white !important;
472
- }
1
+ <template>
2
+ <div>
3
+ <div :class="['sidebar', { collapsed: menuCollapsed }]">
4
+ <div class="sidebar-header">
5
+ <span class="header-logo" @click="editProfile">
6
+ <img class="photo" :src="urlPhoto" />
7
+ </span>
8
+ <div :style="'margin-left:' + (menuCollapsed ? 55 : 170) + 'px'" class="div-menu-toggle"
9
+ @click="toggleSidebar">
10
+ <div class="icon-menu-arrow">
11
+ <i v-if="menuCollapsed" class="fa-solid fa-angle-right "></i>
12
+ <i v-else class="fa-solid fa-angle-left"></i>
13
+ </div>
14
+ </div>
15
+ </div>
16
+
17
+ <ScrollBar :minHeight="pageSize" :maxHeight="pageSize">
18
+ <div :class="{ 'sub': menuCollapsed }">
19
+ <div v-for="(item, index) in menuFilter(true)">
20
+ <div @mouseover="handleMouseOver(item.title, item.module)">
21
+ <div :ref="item.title" v-if="menuCollapsed" class="molded-icon text-center" :class="{
22
+ 'menu-active': moduleActive === item.module,
23
+ 'module-selected': module === item.module
24
+ }">
25
+ <i :style="'font-size:18px'" :class="item.icon"></i>
26
+ <div v-if="false" :style="'margin-top:-16px'">
27
+ <span class="title-menu-collapsed">{{ item.abbreviatedTitle }}</span>
28
+ </div>
29
+ </div>
30
+ <div class="molded-icon-open" :class="{
31
+ 'menu-active': moduleActive === item.module
32
+ }" v-else @mouseover="handleMouseOver(item.title, item.module)">
33
+ <b-row>
34
+ <b-col sm="12">
35
+ <b-row>
36
+ <b-col sm="2">
37
+ <i :class="item.icon"></i>
38
+ </b-col>
39
+ <b-col sm="10">
40
+ <span class="title-menu">{{ item.title }} </span>
41
+ </b-col>
42
+ </b-row>
43
+ </b-col>
44
+ </b-row>
45
+ </div>
46
+ </div>
47
+
48
+ <transition name="slide-fade">
49
+ <div :ref="item.title + 'sub'" class="sub-menu-collapsed sub-menu"
50
+ :style="'margin-left:' + (menuCollapsed ? 85 : 200) + 'px'"
51
+ v-if="titleSubMenuCollapsed == item.title">
52
+ <div v-for="(item, index) in subMenuFilter(false)" :key="index">
53
+ <div :class="{ 'sub-menu-title-collapsed': item.title }"
54
+ @click.prevent="navegateTo(item, item.module)">
55
+ <b-row>
56
+ <b-col sm="2" v-if="item.title">
57
+ <i :class="item.icon"></i>
58
+ </b-col>
59
+ <b-col sm="9">
60
+ <div v-if="item.groupName" class="div-group">
61
+ {{ item.groupName }}
62
+ </div>
63
+ <span>
64
+
65
+ <span> {{ item.title }}</span>
66
+ <span class="div-new" v-if="item.isVisible == 'support'">
67
+ Suporte
68
+ </span>
69
+ <span class="div-new"
70
+ v-if="item.showNewUntil && showNewUntil(item.showNewUntil)">
71
+ Novo
72
+ </span>
73
+ </span>
74
+ </b-col>
75
+ </b-row>
76
+ </div>
77
+ </div>
78
+ </div>
79
+ </transition>
80
+ </div>
81
+ <br>
82
+ <br>
83
+ <br>
84
+ </div>
85
+ </ScrollBar>
86
+ </div>
87
+ </div>
88
+ </template>
89
+
90
+ <script>
91
+
92
+ import ScrollBar from "@nixweb/nixloc-ui/src/component/layout/ScrollBar.vue";
93
+
94
+ import { mapState, mapMutations, mapGetters } from "vuex";
95
+
96
+ export default {
97
+ props: {
98
+ urlPhoto: String,
99
+ },
100
+ components: {
101
+ ScrollBar
102
+ },
103
+ data() {
104
+ return {
105
+ module: "",
106
+ moduleActive: "",
107
+ isSidebarCollapsed: true,
108
+ openDropdowns: {},
109
+ titleSubMenu: "",
110
+ titleSubMenuCollapsed: "",
111
+ pageSize: 0,
112
+ distanceFromBottom: 0,
113
+ };
114
+ },
115
+ mounted() {
116
+ this.updatePageSize();
117
+ window.addEventListener('resize', this.updatePageSize);
118
+
119
+ if (!localStorage.getItem('menuCollapsed')) {
120
+ localStorage.setItem('menuCollapsed', this.isSidebarCollapsed ? "closed" : "open");
121
+ }
122
+
123
+ if (localStorage.getItem('menuCollapsed') === 'open') {
124
+ this.toggleMenu(false);
125
+ } else {
126
+ this.toggleMenu(true);
127
+ }
128
+
129
+ if (this.$route.matched[0])
130
+ this.moduleActive = this.$route.matched[0].props.default.module;
131
+
132
+ },
133
+ beforeDestroy() {
134
+ window.removeEventListener('resize', this.updatePageSize);
135
+ },
136
+ computed: {
137
+ ...mapState("user", ["menu", "userLogged"]),
138
+ ...mapState("generic", ["menuCollapsed"]),
139
+ ...mapGetters("generic", ["event"]),
140
+ },
141
+ methods: {
142
+ ...mapMutations("generic", ["addEvent", "toggleMenu"]),
143
+ showNewUntil(dateStr) {
144
+ const [day, month, year] = dateStr.split('/');
145
+ const inputDate = new Date(year, month - 1, day);
146
+ const today = new Date();
147
+
148
+ // Zerar horas para comparar apenas a data
149
+ inputDate.setHours(0, 0, 0, 0);
150
+ today.setHours(0, 0, 0, 0);
151
+
152
+ return today < inputDate;
153
+ },
154
+ updatePageSize() {
155
+ const windowHeight = window.innerHeight;
156
+ this.pageSize = windowHeight;
157
+ },
158
+ toggleSidebar() {
159
+ this.isSidebarCollapsed = !this.isSidebarCollapsed;
160
+ this.toggleMenu(this.isSidebarCollapsed);
161
+ localStorage.setItem('menuCollapsed', this.isSidebarCollapsed ? "closed" : "open");
162
+ this.titleSubMenu = "";
163
+ this.titleSubMenuCollapsed = "";
164
+ },
165
+ toggleSubMenu(title, module) {
166
+ this.module = module;
167
+ if (this.titleSubMenu === title) {
168
+ this.titleSubMenu = "";
169
+ } else {
170
+ this.titleSubMenu = title;
171
+ }
172
+ },
173
+ handleMouseOver(title, module) {
174
+ this.module = module;
175
+ this.titleSubMenuCollapsed = title;
176
+
177
+ var divSub = this.$refs[title + 'sub'];
178
+
179
+ if (divSub) {
180
+ let self = this;
181
+ setTimeout(function () {
182
+ const heightSubMenu = divSub[0].getBoundingClientRect();
183
+
184
+ if (heightSubMenu.top < 0 || heightSubMenu.left < 0 || heightSubMenu.bottom > window.innerHeight || heightSubMenu.right > window.innerWidth) {
185
+ divSub[0].style.bottom = '0px';
186
+ }
187
+
188
+ }, 100);
189
+ }
190
+ },
191
+ handleMouseLeave() {
192
+ this.titleSubMenuCollapsed = "";
193
+ if (this.menuCollapsed)
194
+ this.module = "";
195
+ },
196
+ menuFilter(isModule) {
197
+ let filter = [];
198
+ this.menu.items.forEach(function (obj) {
199
+ if (obj.isModule == isModule) filter.push(obj);
200
+ });
201
+ return filter.sort((a, b) => a.order - b.order);
202
+ },
203
+ subMenuFilter(isModule) {
204
+ let filter = [];
205
+ let self = this;
206
+ let userLogged = this.userLogged.user.userName;
207
+ let companyId = this.userLogged.companyId;
208
+ this.menu.items.forEach(function (obj) {
209
+ if (obj.isModule == isModule && obj.module === self.module) {
210
+ if (obj.isVisible == "all") filter.push(obj);
211
+ if (obj.isVisible == companyId) filter.push(obj);
212
+
213
+ if (obj.isVisible == "support" && userLogged == "UserTemp")
214
+ filter.push(obj);
215
+ }
216
+ });
217
+ return filter;
218
+ },
219
+ navegateTo(item, module) {
220
+ this.$router.push({
221
+ name: item.routeName,
222
+ });
223
+
224
+ this.moduleActive = module;
225
+ this.titleSubMenuCollapsed = "";
226
+ },
227
+ editProfile() {
228
+ this.addEvent({ name: "clickedProfile" });
229
+ },
230
+ },
231
+ watch: {
232
+ event: {
233
+ handler: function (event) {
234
+ if (event.name == "handleMouseOver") {
235
+ this.handleMouseLeave();
236
+ }
237
+ },
238
+ deep: true,
239
+ },
240
+ $route: {
241
+ handler: function (router) {
242
+ this.moduleActive = router.matched[0].props.default.module;
243
+ },
244
+ deep: true,
245
+ },
246
+ },
247
+ };
248
+ </script>
249
+
250
+ <style scoped>
251
+ .sidebar {
252
+ position: fixed;
253
+ top: 0;
254
+ left: 0;
255
+ width: 200px;
256
+ height: 100vh;
257
+ border-radius: 0px 20px 0px 0px;
258
+ background-color: #577696;
259
+ transition: all 0.4s ease;
260
+ z-index: 1000;
261
+ }
262
+
263
+ .sidebar.collapsed {
264
+ width: 85px;
265
+ }
266
+
267
+ .sidebar .sidebar-header {
268
+ display: flex;
269
+ position: relative;
270
+ padding: 10px 20px;
271
+ align-items: center;
272
+ justify-content: space-between;
273
+ }
274
+
275
+ .sidebar-header .header-logo img {
276
+ width: 46px;
277
+ height: 46px;
278
+ display: block;
279
+ object-fit: contain;
280
+ cursor: pointer;
281
+ border-radius: 50%;
282
+ }
283
+
284
+ .sidebar-header .sidebar-toggler,
285
+ .sidebar-menu-button {
286
+ position: absolute;
287
+ left: 70px;
288
+ height: 30px;
289
+ width: 30px;
290
+ color: #151A2D;
291
+ border: none;
292
+ cursor: pointer;
293
+ display: flex;
294
+ background: #EEF2FF;
295
+ align-items: center;
296
+ justify-content: center;
297
+ border-radius: 50px;
298
+ transition: 0.4s ease;
299
+ }
300
+
301
+ .sidebar.collapsed .sidebar-header .sidebar-toggler {
302
+ transform: translate(-4px, 65px);
303
+ }
304
+
305
+ .div-menu-toggle {
306
+ position: fixed;
307
+ font-size: 18px;
308
+ top: 25px;
309
+ width: 20px;
310
+ height: 20px;
311
+ background-color: #D98621;
312
+ border-radius: 50%;
313
+ cursor: pointer;
314
+ z-index: 2000;
315
+ transition: all 0.4s ease;
316
+ }
317
+
318
+ .molded-icon-open {
319
+ padding-left: 10px;
320
+ cursor: pointer;
321
+ margin-top: 10px;
322
+ color: white;
323
+ font-size: 17px;
324
+ margin: 15px;
325
+ border-radius: 10px;
326
+ transition: all 0.3s ease;
327
+ }
328
+
329
+ .molded-icon-open:hover {
330
+ color: #2C3453;
331
+ background-color: white;
332
+ }
333
+
334
+ .menu-active {
335
+ background-color: #D98621;
336
+ }
337
+
338
+ .module-selected {
339
+ color: #2C3453 !important;
340
+ background-color: white !important;
341
+ }
342
+
343
+ .icon-menu-arrow {
344
+ font-size: 14px;
345
+ margin-top: -4px;
346
+ margin-left: 6px;
347
+ color: white;
348
+ }
349
+
350
+ .molded-icon {
351
+ cursor: pointer;
352
+ color: white;
353
+ font-size: 18px;
354
+ margin: 13px;
355
+ border-radius: 10px;
356
+ transition: all 0.3s ease;
357
+ }
358
+
359
+ .molded-icon:hover {
360
+ background-color: white;
361
+ color: #2C3453;
362
+ border-radius: 10px;
363
+ transition: all 0.8s ease;
364
+ }
365
+
366
+ .sub {
367
+ cursor: pointer;
368
+ transition: all 0.3s ease;
369
+ }
370
+
371
+ .sub-menu {
372
+ margin: 15px;
373
+ padding: 10px;
374
+ border-radius: 15px;
375
+ color: white;
376
+ font-size: 14px;
377
+ background-color: #2C3453;
378
+ transition: all 0.5s ease;
379
+ }
380
+
381
+ .sub-menu-title {
382
+ cursor: pointer;
383
+ border-radius: 8px;
384
+ padding: 5px;
385
+ transition: all 1s ease;
386
+ }
387
+
388
+ .sub-menu-title:hover {
389
+ padding: 5px;
390
+ color: #2C3453;
391
+ background-color: white;
392
+ font-weight: bold;
393
+ transition: all 0.8s ease;
394
+ }
395
+
396
+ .sub-menu-collapsed {
397
+ width: 260px;
398
+ margin-top: -100px;
399
+ position: absolute;
400
+ border-radius: 0px 15px 15px 0px;
401
+ background-color: #2C3453;
402
+ cursor: pointer;
403
+ }
404
+
405
+ .sub-menu-title-collapsed {
406
+ padding: 10px;
407
+ border-radius: 8px;
408
+ font-size: 13px;
409
+ }
410
+
411
+ .sub-menu-title-collapsed:hover {
412
+ background-color: white;
413
+ color: #2C3453;
414
+ transition: all 0.8s ease;
415
+ }
416
+
417
+ .rotate {
418
+ transform: rotate(180deg);
419
+ transition: transform 0.5s ease;
420
+ }
421
+
422
+ .rotate-down {
423
+ transform: rotate(360deg);
424
+ transition: transform 0.5s ease;
425
+ }
426
+
427
+ .title-menu {
428
+ font-size: 13px;
429
+ }
430
+
431
+ .title-menu-collapsed {
432
+ font-size: 11.5px;
433
+ }
434
+
435
+ .div-arrow {
436
+ margin-left: 50px;
437
+ }
438
+
439
+ .div-menu-bottom {
440
+ position: absolute;
441
+ bottom: 0;
442
+ left: 0;
443
+ width: 100%;
444
+ padding: 10px;
445
+ }
446
+
447
+ .div-icon-bottom {
448
+ cursor: pointer;
449
+ font-size: 17px;
450
+ color: white;
451
+ border-radius: 10px;
452
+ background-color: #2C3453;
453
+ }
454
+
455
+ .title-logout {
456
+ font-size: 16px;
457
+ margin-left: 10px;
458
+ }
459
+
460
+ .div-group {
461
+ margin-left: 10px;
462
+ padding: 5px;
463
+ }
464
+
465
+ .div-new {
466
+ background-color: #0A36DB;
467
+ font-size: 11px;
468
+ border-radius: 20px;
469
+ padding: 1px 3px 2px 2px;
470
+ margin-left: 5px;
471
+ color: white !important;
472
+ }
473
473
  </style>