@nixweb/nixloc-ui 0.0.290 → 0.0.292

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.
package/package.json CHANGED
@@ -1,89 +1,89 @@
1
- {
2
- "name": "@nixweb/nixloc-ui",
3
- "version": "0.0.290",
4
- "description": "Componentes UI",
5
- "author": "Fábio Ávila <fabio@nixweb.com.br>",
6
- "private": false,
7
- "scripts": {
8
- "serve": "vue-cli-service serve",
9
- "build": "vue-cli-service build",
10
- "lint": "vue-cli-service lint"
11
- },
12
- "dependencies": {
13
- "@babel/polyfill": "^7.12.1",
14
- "@ckeditor/ckeditor5-vue2": "^2.0.0",
15
- "@fullcalendar/core": "^5.11.3",
16
- "@fullcalendar/daygrid": "^5.11.3",
17
- "@fullcalendar/interaction": "^5.11.3",
18
- "@fullcalendar/list": "^5.11.3",
19
- "@fullcalendar/timegrid": "^5.11.3",
20
- "@fullcalendar/vue": "^5.11.2",
21
- "axios": "^0.24.0",
22
- "bootstrap-vue": "^2.0.0-rc.11",
23
- "core-js": "^3.6.5",
24
- "frappe-gantt": "^0.6.1",
25
- "sass-loader": "^10.1.1",
26
- "timeline-vuejs": "^1.1.7",
27
- "v-runtime-template": "^1.10.0",
28
- "vodal": "^2.4.0",
29
- "vue": "^2.6.11",
30
- "vue-color": "^2.7.0",
31
- "vue-currency-filter": "^3.3.0",
32
- "vue-html2pdf": "^1.8.0",
33
- "vue-image-crop-upload": "^3.0.3",
34
- "vue-js-toggle-button": "^1.3.0",
35
- "vue-json-excel": "^0.3.0",
36
- "vue-loading-template": "^1.3.0",
37
- "vue-moment": "^4.0.0",
38
- "vue-multiselect": "^2.1.0",
39
- "vue-numeric": "^2.4.1",
40
- "vue-pdf-app": "^2.1.0",
41
- "vue-print-nb": "^1.7.5",
42
- "vue-router": "^3.0.1",
43
- "vue-simple-progress": "^1.1.1",
44
- "vue-the-mask": "^0.11.1",
45
- "vue-toasted": "^1.1.28",
46
- "vue-toggles": "^1.1.4",
47
- "vue-upload-file": "^1.1.0",
48
- "vue2-datepicker": "^2.13.0",
49
- "vue2-editor": "^2.6.6",
50
- "vue2-google-maps": "^0.10.7",
51
- "vuedraggable": "^2.24.3",
52
- "vuejs-ace-editor": "^1.0.1",
53
- "vuex": "^3.6.2",
54
- "vuex-persistedstate": "^4.0.0"
55
- },
56
- "devDependencies": {
57
- "@vue/cli-plugin-babel": "~4.5.0",
58
- "@vue/cli-service": "~4.5.0",
59
- "babel-eslint": "^10.1.0",
60
- "eslint": "^6.7.2",
61
- "eslint-plugin-vue": "^6.2.2",
62
- "script-loader": "^0.7.2",
63
- "vue-template-compiler": "^2.6.11"
64
- },
65
- "eslintConfig": {
66
- "root": true,
67
- "env": {
68
- "node": true
69
- },
70
- "extends": [
71
- "plugin:vue/essential",
72
- "eslint:recommended"
73
- ],
74
- "parserOptions": {
75
- "parser": "babel-eslint"
76
- },
77
- "rules": {}
78
- },
79
- "engines": {
80
- "node": "16.14.2",
81
- "npm": ">= 3.0.0"
82
- },
83
- "browserslist": [
84
- "> 1%",
85
- "last 2 versions",
86
- "not dead"
87
- ],
88
- "main": "babel.config.js"
1
+ {
2
+ "name": "@nixweb/nixloc-ui",
3
+ "version": "0.0.292",
4
+ "description": "Componentes UI",
5
+ "author": "Fábio Ávila <fabio@nixweb.com.br>",
6
+ "private": false,
7
+ "scripts": {
8
+ "serve": "vue-cli-service serve",
9
+ "build": "vue-cli-service build",
10
+ "lint": "vue-cli-service lint"
11
+ },
12
+ "dependencies": {
13
+ "@babel/polyfill": "^7.12.1",
14
+ "@ckeditor/ckeditor5-vue2": "^2.0.0",
15
+ "@fullcalendar/core": "^5.11.3",
16
+ "@fullcalendar/daygrid": "^5.11.3",
17
+ "@fullcalendar/interaction": "^5.11.3",
18
+ "@fullcalendar/list": "^5.11.3",
19
+ "@fullcalendar/timegrid": "^5.11.3",
20
+ "@fullcalendar/vue": "^5.11.2",
21
+ "axios": "^0.24.0",
22
+ "bootstrap-vue": "^2.0.0-rc.11",
23
+ "core-js": "^3.6.5",
24
+ "frappe-gantt": "^0.6.1",
25
+ "sass-loader": "^10.1.1",
26
+ "timeline-vuejs": "^1.1.7",
27
+ "v-runtime-template": "^1.10.0",
28
+ "vodal": "^2.4.0",
29
+ "vue": "^2.6.11",
30
+ "vue-color": "^2.7.0",
31
+ "vue-currency-filter": "^3.3.0",
32
+ "vue-html2pdf": "^1.8.0",
33
+ "vue-image-crop-upload": "^3.0.3",
34
+ "vue-js-toggle-button": "^1.3.0",
35
+ "vue-json-excel": "^0.3.0",
36
+ "vue-loading-template": "^1.3.0",
37
+ "vue-moment": "^4.0.0",
38
+ "vue-multiselect": "^2.1.0",
39
+ "vue-numeric": "^2.4.1",
40
+ "vue-pdf-app": "^2.1.0",
41
+ "vue-print-nb": "^1.7.5",
42
+ "vue-router": "^3.0.1",
43
+ "vue-simple-progress": "^1.1.1",
44
+ "vue-the-mask": "^0.11.1",
45
+ "vue-toasted": "^1.1.28",
46
+ "vue-toggles": "^1.1.4",
47
+ "vue-upload-file": "^1.1.0",
48
+ "vue2-datepicker": "^2.13.0",
49
+ "vue2-editor": "^2.6.6",
50
+ "vue2-google-maps": "^0.10.7",
51
+ "vuedraggable": "^2.24.3",
52
+ "vuejs-ace-editor": "^1.0.1",
53
+ "vuex": "^3.6.2",
54
+ "vuex-persistedstate": "^4.0.0"
55
+ },
56
+ "devDependencies": {
57
+ "@vue/cli-plugin-babel": "~4.5.0",
58
+ "@vue/cli-service": "~4.5.0",
59
+ "babel-eslint": "^10.1.0",
60
+ "eslint": "^6.7.2",
61
+ "eslint-plugin-vue": "^6.2.2",
62
+ "script-loader": "^0.7.2",
63
+ "vue-template-compiler": "^2.6.11"
64
+ },
65
+ "eslintConfig": {
66
+ "root": true,
67
+ "env": {
68
+ "node": true
69
+ },
70
+ "extends": [
71
+ "plugin:vue/essential",
72
+ "eslint:recommended"
73
+ ],
74
+ "parserOptions": {
75
+ "parser": "babel-eslint"
76
+ },
77
+ "rules": {}
78
+ },
79
+ "engines": {
80
+ "node": "16.14.2",
81
+ "npm": ">= 3.0.0"
82
+ },
83
+ "browserslist": [
84
+ "> 1%",
85
+ "last 2 versions",
86
+ "not dead"
87
+ ],
88
+ "main": "babel.config.js"
89
89
  }
@@ -5,27 +5,69 @@
5
5
  <span class="required" v-if="required">*</span>
6
6
  <Tip :field="field" :formName="formName" />
7
7
  </label>
8
- <div class="select" :class="{
8
+ <div
9
+ class="select"
10
+ :class="{
9
11
  'select-invalid': notifications.length > 0 && formDirty,
10
12
  border: showBorder,
11
- }">
12
- <multiselect @open="onOpen" @select="onSelected" @search-change="onSearch" :options="data"
13
- v-model.trim="currentValue" :custom-label="label" placeholder :disabled="disabled" :showLabels="true"
14
- :noResult="false" :maxHeight="250" ref="multiselect" selectLabel deselectLabel selectedLabel>
13
+ }"
14
+ >
15
+ <multiselect
16
+ @open="onOpen"
17
+ @select="onSelected"
18
+ @search-change="onSearch"
19
+ :options="data"
20
+ v-model.trim="currentValue"
21
+ :custom-label="label"
22
+ placeholder
23
+ :disabled="disabled"
24
+ :showLabels="true"
25
+ :noResult="false"
26
+ :maxHeight="250"
27
+ ref="multiselect"
28
+ selectLabel
29
+ deselectLabel
30
+ selectedLabel
31
+ >
15
32
  <div slot="beforeList">
16
- <vue-loading v-if="loading" type="bubbles" color="#577696"
17
- :size="{ width: '40px', height: '40px' }"></vue-loading>
33
+ <vue-loading
34
+ v-if="loading"
35
+ type="bubbles"
36
+ color="#577696"
37
+ :size="{ width: '40px', height: '40px' }"
38
+ ></vue-loading>
18
39
  <div class="before-list" v-if="!loading">
19
- <Button v-if="showNewRegister" key="addNewRegister" type="primary" title="Novo" size="small"
20
- :clicked="addNewRegister" />
21
- <Button key="cleanSelect" title="Limpar" type="warning" classIcon="fas fa-broom" size="small"
22
- :clicked="cleanSelect" />
40
+ <Button
41
+ v-if="showNewRegister"
42
+ key="addNewRegister"
43
+ type="primary"
44
+ title="Novo"
45
+ size="small"
46
+ :clicked="addNewRegister"
47
+ />
48
+ <Button
49
+ key="cleanSelect"
50
+ title="Limpar"
51
+ type="warning"
52
+ classIcon="fas fa-broom"
53
+ size="small"
54
+ :clicked="cleanSelect"
55
+ />
23
56
  </div>
24
57
  </div>
25
- <div slot="afterList" v-if="totalRecords > 20 && data.length < totalRecords">
58
+ <div
59
+ slot="afterList"
60
+ v-if="totalRecords > 20 && data.length < totalRecords"
61
+ >
26
62
  <div class="after-list text-center">
27
- <Button key="loadingMore" type="info" title="Carregar mais..." classIcon="fas fa-redo-alt" size="small"
28
- :clicked="loadingMore" />
63
+ <Button
64
+ key="loadingMore"
65
+ type="info"
66
+ title="Carregar mais..."
67
+ classIcon="fas fa-redo-alt"
68
+ size="small"
69
+ :clicked="loadingMore"
70
+ />
29
71
  </div>
30
72
  </div>
31
73
  <div slot="noOptions">Lista está vazia</div>
@@ -38,8 +80,16 @@
38
80
  </div>
39
81
  </div>
40
82
 
41
- <vodal v-if="nameNewRegister" :duration="50" :show="showVodal(nameNewRegister)" @hide="hide()"
42
- :width="widthNewRegister" :height="heightNewRegister" :closeOnEsc="true" :closeButton="true">
83
+ <vodal
84
+ v-if="nameNewRegister"
85
+ :duration="50"
86
+ :show="showVodal(nameNewRegister)"
87
+ @hide="hide()"
88
+ :width="widthNewRegister"
89
+ :height="heightNewRegister"
90
+ :closeOnEsc="true"
91
+ :closeButton="true"
92
+ >
43
93
  <Messages v-if="vodal.open" />
44
94
  <div class="title-new-form">{{ titleNewRegister }}</div>
45
95
  <hr class="hr" />
@@ -152,7 +202,11 @@ export default {
152
202
  this.$emit("input", value);
153
203
  if (this.changed) this.changed();
154
204
  if (this.fieldTarget) {
155
- let obj = { tag: `${this.title}: ${value.content}`, fieldTarget: this.fieldTarget, value: value.id };
205
+ let obj = {
206
+ tag: `${this.title}: ${value.content}`,
207
+ fieldTarget: this.fieldTarget,
208
+ value: value.id,
209
+ };
156
210
  this.addFilter(obj);
157
211
  }
158
212
  },
@@ -221,11 +275,9 @@ export default {
221
275
  watch: {
222
276
  event: {
223
277
  handler(event) {
224
-
225
278
  if (event.name == "tagRemoved") {
226
279
  if (this.fieldTarget == event.data) this.cleanSelect();
227
280
  }
228
-
229
281
  },
230
282
  deep: true,
231
283
  },
@@ -10,12 +10,22 @@
10
10
  <div class="text-center div-photo" @click="editProfile">
11
11
  <img class="photo" :src="urlPhoto" />
12
12
  </div>
13
- <div class="box-main" v-for="(item, index) in menuFilter(true)" :key="index">
14
- <a href="#" @click.prevent="openSubMenu(item.module)" :class="highlightSession(item.module)">
15
- <div :class="{
16
- 'icon-active': menuActive == item.module,
17
- 'icon-normal': menuActive != item.module,
18
- }">
13
+ <div
14
+ class="box-main"
15
+ v-for="(item, index) in menuFilter(true)"
16
+ :key="index"
17
+ >
18
+ <a
19
+ href="#"
20
+ @click.prevent="openSubMenu(item.module)"
21
+ :class="highlightSession(item.module)"
22
+ >
23
+ <div
24
+ :class="{
25
+ 'icon-active': menuActive == item.module,
26
+ 'icon-normal': menuActive != item.module,
27
+ }"
28
+ >
19
29
  <b-row>
20
30
  <b-col sm="12">
21
31
  <div class="box-icon text-center">
@@ -51,16 +61,29 @@
51
61
  <li v-for="(item, index) in subMenuFilter(false)" :key="index">
52
62
  <h5 v-if="item.type === 'group'" class="context-menu__title">
53
63
  <span class="sub-title"> {{ item.groupName }}</span>
54
- <span v-if="index === 0" @click.prevent="hideSubMenu" class="context-menu__btn-close icon-close"
55
- href="#">
64
+ <span
65
+ v-if="index === 0"
66
+ @click.prevent="hideSubMenu"
67
+ class="context-menu__btn-close icon-close"
68
+ href="#"
69
+ >
56
70
  <i class="fas fa-times-circle"></i>
57
71
  </span>
58
72
  </h5>
59
73
 
60
- <a v-else href="#" @click.prevent="navegateTo(item)" :class="classSubMenu(item.title)">
74
+ <a
75
+ v-else
76
+ href="#"
77
+ @click.prevent="navegateTo(item)"
78
+ :class="classSubMenu(item.title)"
79
+ >
61
80
  <b-row>
62
81
  <b-col sm="1">
63
- <i class="menu-icon" :style="'color:' + item.iconColor" :class="item.icon"></i>
82
+ <i
83
+ class="menu-icon"
84
+ :style="'color:' + item.iconColor"
85
+ :class="item.icon"
86
+ ></i>
64
87
  </b-col>
65
88
  <b-col sm="10">
66
89
  <span class="title-sub"> {{ item.title }} </span>
@@ -141,11 +164,8 @@ export default {
141
164
  let self = this;
142
165
  let userLogged = this.userLogged.user.userName;
143
166
  this.menu.items.forEach(function (obj) {
144
-
145
-
146
167
  if (obj.isModule == isModule && obj.module === self.module) {
147
- if (obj.isVisible == "all")
148
- filter.push(obj);
168
+ if (obj.isVisible == "all") filter.push(obj);
149
169
 
150
170
  if (obj.isVisible == "support" && userLogged == "UserTemp")
151
171
  filter.push(obj);
@@ -0,0 +1,136 @@
1
+ <template>
2
+ <div>
3
+ <div class="icon-logout" @click="execute">
4
+ <i class="fa-solid fa-right-from-bracket"></i>
5
+ </div>
6
+ <div class="profile-container" v-if="hideShow">
7
+ <div class="item-header text-center">
8
+ <span>Conta</span>
9
+ </div>
10
+ <div class="profile-content" v-for="item in items" :key="item.title">
11
+ <div class="item-content" @click="navegateTo(item.routeName)">
12
+ <div class="title-container">
13
+ <span>
14
+ <i :class="item.classIcon"></i>
15
+ <span class="title-profile title-input">{{ item.title }}</span>
16
+ </span>
17
+ </div>
18
+ </div>
19
+ </div>
20
+ <div class="profile-content" @click="execute">
21
+ <div class="item-content">
22
+ <div class="title-container">
23
+ <span>
24
+ <i class="fas fa-sign-in"></i>
25
+ <span class="title-profile title-input">Sair</span>
26
+ </span>
27
+ </div>
28
+ </div>
29
+ </div>
30
+ </div>
31
+ </div>
32
+ </template>
33
+ <script>
34
+ export default {
35
+ name: "Account",
36
+ props: {
37
+ items: [],
38
+ exited: Function,
39
+ },
40
+ data() {
41
+ return {
42
+ hideShow: false,
43
+ };
44
+ },
45
+ methods: {
46
+ navegateTo(routeName) {
47
+ this.$router.push({ name: routeName });
48
+ this.hideShow = false;
49
+ },
50
+ execute() {
51
+ if (this.exited) this.exited();
52
+ },
53
+ },
54
+ };
55
+ </script>
56
+ <style scoped>
57
+ .icon-logout {
58
+ padding-left: 12px;
59
+ padding-top: 2px;
60
+ margin-top: -43px;
61
+ margin-right: 28px;
62
+ cursor: pointer;
63
+ position: fixed;
64
+ float: right;
65
+ left: auto;
66
+ right: 0;
67
+ width: 40px;
68
+ height: 40px;
69
+ border-radius: 12px;
70
+ color: #3D4EAE;
71
+ font-size: 22px;
72
+ }
73
+
74
+ img {
75
+ border-radius: 50%;
76
+ height: 40px;
77
+ width: 40px;
78
+ }
79
+
80
+ .profile-container {
81
+ position: fixed;
82
+ float: right;
83
+ left: auto;
84
+ right: 0;
85
+ margin-right: 20px;
86
+ height: 100%;
87
+ z-index: 1000;
88
+ width: 190px;
89
+ margin-top: 26px;
90
+ background-color: white;
91
+ height: auto;
92
+ border-bottom: 1px solid #e9ebec;
93
+ }
94
+
95
+ .profile-content {
96
+ right: 0;
97
+ height: 100%;
98
+ z-index: 101;
99
+ width: 190px;
100
+ height: auto;
101
+ }
102
+
103
+ .item-header {
104
+ padding: 8px 20px;
105
+ background: #f8f8f8;
106
+ border-left: 1px solid #e9ebec;
107
+ border-right: 1px solid #e9ebec;
108
+ border-top: 1px solid #e9ebec;
109
+ }
110
+
111
+ .item-content {
112
+ padding-left: 15px;
113
+ height: 45px;
114
+ background: white;
115
+ border: 1px solid #e9ebec;
116
+ border-bottom: 0px solid #e9ebec;
117
+ cursor: pointer;
118
+ }
119
+
120
+ .item-content:hover {
121
+ background: #f8f8f8;
122
+ }
123
+
124
+ .title-container {
125
+ padding-top: 10px;
126
+ }
127
+
128
+ .title-container:hover {
129
+ padding-top: 10px;
130
+ color: #37597c;
131
+ }
132
+
133
+ .title-profile {
134
+ padding-left: 10px;
135
+ }
136
+ </style>
@@ -0,0 +1,63 @@
1
+ <template>
2
+ <div>
3
+ <div :class="['top', { collapsed: isSidebarCollapsed }]" :style="'background-color:' + backgroundColor">
4
+ <div class="side-by-side top-space">
5
+ <slot></slot>
6
+ </div>
7
+ </div>
8
+ <br />
9
+ </div>
10
+ </template>
11
+
12
+ <script>
13
+
14
+ import { mapGetters } from "vuex";
15
+
16
+ export default {
17
+ name: "Top",
18
+ props: {
19
+ backgroundColor: {
20
+ type: String,
21
+ default: "#4680A5",
22
+ },
23
+ },
24
+ data() {
25
+ return {
26
+ isSidebarCollapsed: false
27
+ }
28
+ },
29
+ computed: {
30
+ ...mapGetters("generic", ["event"]),
31
+ },
32
+ watch: {
33
+ event: {
34
+ handler(event) {
35
+ if (event.name == "isSidebarCollapsed") {
36
+ this.isSidebarCollapsed = event.data;
37
+ }
38
+ },
39
+ deep: true,
40
+ },
41
+ },
42
+ };
43
+ </script>
44
+
45
+ <style scoped>
46
+ .top {
47
+ padding-top: 4px;
48
+ left: 298px;
49
+ right: 10px;
50
+ height: 55px;
51
+ top: 5px;
52
+ border-radius: 18px;
53
+ border-bottom: 0px solid #eff0f1;
54
+ box-shadow: 0px 10px 30px -6px rgb(0 0 0 / 10%);
55
+ position: fixed;
56
+ transition: all 0.3s ease;
57
+ z-index: 100;
58
+ }
59
+
60
+ .top.collapsed {
61
+ left: 110px;
62
+ }
63
+ </style>
@@ -0,0 +1,60 @@
1
+ <template>
2
+ <div>
3
+ <div v-for="icon in icons" class="molded-icon side-by-side" @click="executeEvent(icon.eventName)" v-b-tooltip.hover
4
+ :title="icon.tooltip">
5
+ <div class="icon-molded-icon" :class="{
6
+ 'icon-active-top': menuActive == icon.module,
7
+ 'icon-normal-top': menuActive != icon.module,
8
+ }">
9
+ <i :class="icon.icon"></i>
10
+ </div>
11
+ </div>
12
+ </div>
13
+ </template>
14
+
15
+ <script>
16
+ import { mapMutations } from "vuex";
17
+
18
+ export default {
19
+ name: "IconMolded",
20
+ props: {
21
+ icons: Array,
22
+ },
23
+ data() {
24
+ return { menuActive: "" };
25
+ },
26
+ methods: {
27
+ ...mapMutations("generic", ["addEvent"]),
28
+ executeEvent(eventName) {
29
+ this.addEvent({
30
+ name: eventName,
31
+ });
32
+ },
33
+ },
34
+ watch: {
35
+ $route: {
36
+ handler: function (router) {
37
+ this.menuActive = router.matched[0].props.default.module;
38
+ },
39
+ deep: true,
40
+ },
41
+ },
42
+ };
43
+ </script>
44
+
45
+ <style scoped>
46
+ .molded-icon {
47
+ height: 38px;
48
+ width: 38px;
49
+ margin-left: 10px;
50
+ margin-top: 4px;
51
+ cursor: pointer;
52
+
53
+ }
54
+
55
+ .icon-molded-icon {
56
+ font-size: 20px;
57
+ margin-left: 10px;
58
+ color: #2c3453 !important;
59
+ }
60
+ </style>
@@ -0,0 +1,419 @@
1
+ <template>
2
+ <div>
3
+ <div :class="['sidebar', { collapsed: isSidebarCollapsed }]">
4
+ <div class="sidebar-header">
5
+ <span class="header-logo">
6
+ <img src="https://espaco.blob.core.windows.net/nixloc-photo-user/E29W4HNYQG_10.png"
7
+ alt="CodingNepal" />
8
+ </span>
9
+ <button class="sidebar-toggler" @click="toggleSidebar">
10
+ <span class="material-symbols-rounded icon-menu-arrow">
11
+ <i class="fa-solid fa-angle-left"></i>
12
+ </span>
13
+ </button>
14
+ </div>
15
+
16
+ <div :class="{ sub: isSidebarCollapsed }">
17
+ <div v-for="(item, index) in menuFilter(true)">
18
+ <div>
19
+ <div v-if="isSidebarCollapsed" class="molded-icon text-center"
20
+ @mouseover="handleMouseOver(item.title, item.module)">
21
+ <i :class="item.icon"></i>
22
+ </div>
23
+ <div class="molded-icon-open" v-else @click="toggleSubMenu(item.title, item.module)">
24
+ <b-row>
25
+ <b-col sm="1">
26
+ <i :class="item.icon"></i>
27
+ </b-col>
28
+ <b-col sm="8">
29
+ <span class="title-menu">{{ item.title }} </span>
30
+ </b-col>
31
+ <b-col sm="1">
32
+ <div>
33
+ <i v-if="titleSubMenu == item.title" class="fa-sharp fa-solid fa-angle-down"
34
+ :class="{ 'rotate': titleSubMenu == item.title }"></i>
35
+
36
+ <i v-else class="fa-sharp fa-solid fa-angle-down"
37
+ :class="{ 'rotate-down': titleSubMenu != item.title }"></i>
38
+ </div>
39
+ </b-col>
40
+ </b-row>
41
+ </div>
42
+ </div>
43
+
44
+
45
+ <transition name="slide-fade">
46
+ <div class="sub-menu" v-if="!isSidebarCollapsed && titleSubMenu == item.title">
47
+ <div v-for="(item, index) in subMenuFilter(false)" :key="index">
48
+ <div v-if="item.title" class="sub-menu-title" @click.prevent="navegateTo(item)">
49
+ <b-row>
50
+ <b-col sm="3"> <i :class="item.icon"></i></b-col>
51
+ <span> {{ item.title }}</span>
52
+ </b-row>
53
+ </div>
54
+ </div>
55
+ </div>
56
+ </transition>
57
+
58
+ <transition name="slide-fade">
59
+ <div class="sub-menu-collapsed sub-menu" @mouseleave="handleMouseLeave"
60
+ v-if="isSidebarCollapsed && titleSubMenuCollapsed == item.title">
61
+ <div v-for="(item, index) in subMenuFilter(false)" :key="index">
62
+ <div v-if="item.title" class="sub-menu-title-collapsed"
63
+ @click.prevent="navegateTo(item)">
64
+ <b-row>
65
+ <b-col sm="3"> <i :class="item.icon"></i></b-col>
66
+ <span> {{ item.title }}</span>
67
+ </b-row>
68
+ </div>
69
+ </div>
70
+ </div>
71
+ </transition>
72
+ </div>
73
+ </div>
74
+ </div>
75
+ </div>
76
+ </template>
77
+
78
+ <script>
79
+
80
+ import { mapState, mapMutations, mapGetters } from "vuex";
81
+
82
+ export default {
83
+ data() {
84
+ return {
85
+ module: "",
86
+ isSidebarCollapsed: false,
87
+ openDropdowns: {},
88
+ titleSubMenu: "",
89
+ titleSubMenuCollapsed: "",
90
+ };
91
+ },
92
+ computed: {
93
+ ...mapState("user", ["menu", "userLogged"]),
94
+ ...mapGetters("generic", ["event"]),
95
+ },
96
+ methods: {
97
+ ...mapMutations("generic", ["addEvent"]),
98
+ toggleSidebar() {
99
+ this.isSidebarCollapsed = !this.isSidebarCollapsed;
100
+ this.addEvent({ name: "isSidebarCollapsed", data: this.isSidebarCollapsed });
101
+ this.titleSubMenu = "";
102
+ this.titleSubMenuCollapsed = "";
103
+ },
104
+ toggleSubMenu(title, module) {
105
+ this.module = module;
106
+ if (this.titleSubMenu === title) {
107
+ this.titleSubMenu = "";
108
+ } else {
109
+ this.titleSubMenu = title;
110
+ }
111
+ },
112
+ handleMouseOver(title, module) {
113
+ this.module = module;
114
+ this.titleSubMenuCollapsed = title;
115
+ },
116
+ handleMouseLeave() {
117
+ this.titleSubMenuCollapsed = "";
118
+ },
119
+ menuFilter(isModule) {
120
+ let filter = [];
121
+ this.menu.items.forEach(function (obj) {
122
+ if (obj.isModule == isModule) filter.push(obj);
123
+ });
124
+ return filter.sort((a, b) => a.order - b.order);
125
+ },
126
+ subMenuFilter(isModule) {
127
+ let filter = [];
128
+ let self = this;
129
+ let userLogged = this.userLogged.user.userName;
130
+ this.menu.items.forEach(function (obj) {
131
+ if (obj.isModule == isModule && obj.module === self.module) {
132
+ if (obj.isVisible == "all") filter.push(obj);
133
+
134
+ if (obj.isVisible == "support" && userLogged == "UserTemp")
135
+ filter.push(obj);
136
+ }
137
+ });
138
+ return filter;
139
+ },
140
+ navegateTo(item) {
141
+ this.$router.push({
142
+ name: item.routeName,
143
+ });
144
+ this.titleSubMenu = "";
145
+ this.titleSubMenuCollapsed = "";
146
+ },
147
+ },
148
+ };
149
+ </script>
150
+
151
+ <style scoped>
152
+ .sidebar {
153
+ position: fixed;
154
+ top: 0;
155
+ left: 0;
156
+ z-index: 10;
157
+ width: 270px;
158
+ height: 100vh;
159
+ background: #577696;
160
+ transition: all 0.4s ease;
161
+ }
162
+
163
+ .sidebar.collapsed {
164
+ width: 85px;
165
+ }
166
+
167
+ .sidebar .sidebar-header {
168
+ display: flex;
169
+ position: relative;
170
+ padding: 10px 20px;
171
+ align-items: center;
172
+ justify-content: space-between;
173
+ }
174
+
175
+ .sidebar-header .header-logo img {
176
+ width: 46px;
177
+ height: 46px;
178
+ display: block;
179
+ object-fit: contain;
180
+ border-radius: 50%;
181
+ }
182
+
183
+ .sidebar-header .sidebar-toggler,
184
+ .sidebar-menu-button {
185
+ position: absolute;
186
+ right: 20px;
187
+ height: 35px;
188
+ width: 35px;
189
+ color: #151A2D;
190
+ border: none;
191
+ cursor: pointer;
192
+ display: flex;
193
+ background: #EEF2FF;
194
+ align-items: center;
195
+ justify-content: center;
196
+ border-radius: 8px;
197
+ transition: 0.4s ease;
198
+ }
199
+
200
+ .sidebar.collapsed .sidebar-header .sidebar-toggler {
201
+ transform: translate(-4px, 65px);
202
+ }
203
+
204
+ .sidebar-header .sidebar-toggler span,
205
+ .sidebar-menu-button span {
206
+ font-size: 1.75rem;
207
+ transition: 0.4s ease;
208
+ }
209
+
210
+ .sidebar.collapsed .sidebar-header .sidebar-toggler span {
211
+ transform: rotate(180deg);
212
+ }
213
+
214
+ .sidebar-header .sidebar-toggler:hover {
215
+ background: #d9e1fd;
216
+ }
217
+
218
+ .sidebar-nav .nav-list {
219
+ list-style: none;
220
+ display: flex;
221
+ gap: 4px;
222
+ padding: 0 15px;
223
+ flex-direction: column;
224
+ transform: translateY(15px);
225
+ transition: 0.4s ease;
226
+ }
227
+
228
+ .sidebar .sidebar-nav .primary-nav {
229
+ overflow-y: auto;
230
+ scrollbar-width: thin;
231
+ padding-bottom: 20px;
232
+ height: calc(100vh - 227px);
233
+ scrollbar-color: transparent transparent;
234
+ }
235
+
236
+ .sidebar .sidebar-nav .primary-nav:hover {
237
+ scrollbar-color: #EEF2FF transparent;
238
+ }
239
+
240
+ .sidebar.collapsed .sidebar-nav .primary-nav {
241
+ overflow: unset;
242
+ transform: translateY(65px);
243
+ }
244
+
245
+ .sidebar-nav .nav-item .nav-link {
246
+ color: #fff;
247
+ display: flex;
248
+ gap: 12px;
249
+ white-space: nowrap;
250
+ border-radius: 8px;
251
+ padding: 11px 15px;
252
+ align-items: center;
253
+ text-decoration: none;
254
+ border: 1px solid #151A2D;
255
+ transition: 0.4s ease;
256
+ }
257
+
258
+ .sidebar-nav .nav-item:is(:hover, .open)>.nav-link:not(.dropdown-title) {
259
+ color: #151A2D;
260
+ background: #EEF2FF;
261
+ }
262
+
263
+ .sidebar .nav-link .nav-label {
264
+ transition: opacity 0.3s ease;
265
+ color: white;
266
+ }
267
+
268
+ .sidebar.collapsed .nav-link :where(.nav-label, .dropdown-icon) {
269
+ opacity: 0;
270
+ pointer-events: none;
271
+ }
272
+
273
+ .sidebar.collapsed .nav-link .dropdown-icon {
274
+ transition: opacity 0.3s 0s ease;
275
+ }
276
+
277
+ .sidebar-nav .secondary-nav {
278
+ position: absolute;
279
+ bottom: 35px;
280
+ width: 100%;
281
+ background: #151A2D;
282
+ }
283
+
284
+ .sidebar-nav .nav-item {
285
+ position: relative;
286
+ }
287
+
288
+
289
+ .icon-menu-arrow {
290
+ font-size: 18px !important;
291
+ margin-top: 1px !important;
292
+ }
293
+
294
+ .molded-icon-open {
295
+ padding-left: 10px;
296
+ cursor: pointer;
297
+ margin-top: 10px;
298
+ color: white;
299
+ font-size: 17px;
300
+ margin: 15px;
301
+ border-radius: 10px;
302
+ transition: all 0.3s ease;
303
+ }
304
+
305
+ .molded-icon-open:hover {
306
+ color: #2C3453;
307
+ background-color: white;
308
+ }
309
+
310
+ .molded-icon {
311
+ cursor: pointer;
312
+ margin-top: 10px;
313
+ color: white;
314
+ font-size: 18px;
315
+ margin: 15px;
316
+ border-radius: 10px;
317
+ transition: all 0.3s ease;
318
+ }
319
+
320
+ .molded-icon:hover {
321
+ background-color: white;
322
+ color: #2C3453;
323
+ margin: 15px;
324
+ border-radius: 8px;
325
+ transition: all 0.8s ease;
326
+ }
327
+
328
+ .sub {
329
+ margin-top: 70px;
330
+ cursor: pointer;
331
+ transition: all 0.3s ease;
332
+ }
333
+
334
+ .sub-menu {
335
+ margin: 15px;
336
+ padding: 10px;
337
+ border-radius: 15px;
338
+ color: white;
339
+ font-size: 14px;
340
+ background-color: #2C3453;
341
+ transition: all 0.5s ease;
342
+ }
343
+
344
+ .sub-menu-title {
345
+ cursor: pointer;
346
+ border-radius: 8px;
347
+ padding: 5px;
348
+ transition: all 1s ease;
349
+ }
350
+
351
+ .sub-menu-title:hover {
352
+ padding: 5px;
353
+ color: #2C3453;
354
+ background-color: white;
355
+ font-weight: bold;
356
+ transition: all 0.8s ease;
357
+ }
358
+
359
+ .sub-menu-collapsed {
360
+ width: 260px;
361
+ margin-top: -50px;
362
+ margin-left: 85px;
363
+ position: fixed;
364
+ border-radius: 0px 15px 15px 0px;
365
+ background-color: #2C3453;
366
+ }
367
+
368
+ .sub-menu-title-collapsed {
369
+ padding: 10px;
370
+ border-radius: 8px;
371
+ }
372
+
373
+ .sub-menu-title-collapsed:hover {
374
+ background-color: white;
375
+ color: #2C3453;
376
+ transition: all 0.8s ease;
377
+ }
378
+
379
+ .rotate {
380
+ transform: rotate(180deg);
381
+ transition: transform 0.5s ease;
382
+ }
383
+
384
+ .rotate-down {
385
+ transform: rotate(360deg);
386
+ transition: transform 0.5s ease;
387
+ }
388
+
389
+ .title-menu {
390
+ font-size: 14px;
391
+ padding: 20px;
392
+ }
393
+
394
+ .div-arrow {
395
+ margin-left: 50px;
396
+ }
397
+
398
+ .div-menu-bottom {
399
+ position: absolute;
400
+ bottom: 0;
401
+ left: 0;
402
+ width: 100%;
403
+ padding: 10px;
404
+ }
405
+
406
+ .div-icon-bottom {
407
+ cursor: pointer;
408
+ font-size: 17px;
409
+ color: white;
410
+ border-radius: 10px;
411
+ background-color: #2C3453;
412
+ }
413
+
414
+ .title-logout {
415
+ font-size: 16px;
416
+ margin-left: 10px;
417
+ }
418
+
419
+ </style>
@@ -10,8 +10,8 @@
10
10
  <div class="side-by-side">
11
11
  <div class="div-filter">
12
12
  <Button _key="btnSearchReport" :disabled="loading || !isValid" type="primary"
13
- title="Buscar" classIcon="fas fa-file-search" size="medium"
14
- :clicked="executeSearch" />
13
+ :title="loading ? 'Aguarde...' : 'Buscar'" classIcon="fas fa-file-search"
14
+ size="medium" :clicked="executeSearch" />
15
15
  </div>
16
16
  </div>
17
17
  <div class="side-by-side">
@@ -23,13 +23,16 @@
23
23
  </div>
24
24
  </Molded>
25
25
  </div>
26
- <div v-if="liveTotalRecords != totalRecords">
27
- <ProgressBar :text="`Carregando ${liveTotalRecords} registros de ${totalRecords}`"
28
- :value="liveTotalRecords" :max="totalRecords" size="medium" />
29
- <div class="text-center cancel" @click="stop">
30
- <i class="fa-solid fa-ban"></i> Cancelar
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>
31
33
  </div>
32
34
  </div>
35
+
33
36
  <div v-if="!isValid">
34
37
  <Alert type="info">
35
38
  <span>
@@ -50,10 +53,6 @@
50
53
  <div class="icon-toolbar icon-excel">
51
54
  <ExportExcel :nameFile="name" :header="dataConditional" :data="data" />
52
55
  </div>
53
- <div v-if="loading" class="icon-toolbar">
54
- <vue-loading type="bubbles" color="orange" :size="{ width: '26px', height: '26px' }">
55
- </vue-loading>
56
- </div>
57
56
  </div>
58
57
  <ScrollBar :minHeight="400" :maxHeight="820">
59
58
  <br />
@@ -150,6 +149,7 @@ export default {
150
149
  executeSearch() {
151
150
  this.cancel = false;
152
151
  this.data = [];
152
+ this.pagination = [];
153
153
  this.totalization = [];
154
154
  this.getAll();
155
155
  },
@@ -229,7 +229,7 @@ export default {
229
229
  if (event.name == "stringFilter" || event.name == "orderedFilter") {
230
230
  let self = this;
231
231
  setTimeout(function () {
232
- self.getAll();
232
+ // self.getAll();
233
233
  }, 500);
234
234
  }
235
235
  }
@@ -243,6 +243,12 @@ export default {
243
243
  <style scoped>
244
244
  .main {
245
245
  margin-bottom: 30px;
246
+
247
+ }
248
+
249
+ .title {
250
+ font-size: 12px;
251
+ font-weight: normal;
246
252
  }
247
253
 
248
254
  .div-btn {