@nixweb/nixloc-ui 0.0.127 → 0.0.128

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 (88) hide show
  1. package/package.json +79 -79
  2. package/src/App.vue +13 -13
  3. package/src/component/forms/Button.vue +170 -170
  4. package/src/component/forms/CheckboxGroup.vue +72 -66
  5. package/src/component/forms/CheckboxSimple.vue +46 -42
  6. package/src/component/forms/Color.vue +38 -38
  7. package/src/component/forms/DateTime.vue +167 -163
  8. package/src/component/forms/Dropdown.vue +218 -224
  9. package/src/component/forms/EditorHtml.vue +126 -126
  10. package/src/component/forms/FileUpload.vue +185 -185
  11. package/src/component/forms/ImageUpload.vue +12 -4
  12. package/src/component/forms/IncrementDecrement.vue +101 -0
  13. package/src/component/forms/InputDecimal.vue +142 -138
  14. package/src/component/forms/InputNumber.vue +154 -154
  15. package/src/component/forms/InputPassword.vue +135 -135
  16. package/src/component/forms/InputText.vue +162 -157
  17. package/src/component/forms/Modal.vue +65 -65
  18. package/src/component/forms/RadioGroup.vue +50 -50
  19. package/src/component/forms/Select.vue +349 -340
  20. package/src/component/forms/SelectStatic.vue +127 -127
  21. package/src/component/forms/Slider.vue +18 -18
  22. package/src/component/forms/TextArea.vue +126 -126
  23. package/src/component/layout/Alert.vue +92 -92
  24. package/src/component/layout/Badge.vue +103 -103
  25. package/src/component/layout/FixedBar.vue +100 -68
  26. package/src/component/layout/Header.vue +38 -35
  27. package/src/component/layout/LoadingFullPage.vue +27 -27
  28. package/src/component/layout/Menu.vue +210 -215
  29. package/src/component/layout/Molded.vue +28 -27
  30. package/src/component/layout/Panel.vue +140 -140
  31. package/src/component/layout/Popover.vue +126 -126
  32. package/src/component/layout/ScrollBar.vue +42 -42
  33. package/src/component/layout/Tab.vue +135 -0
  34. package/src/component/layout/Wizard.vue +211 -211
  35. package/src/component/rental/DisplayPeriodRent.vue +81 -0
  36. package/src/component/rental/DisplayTotalization.vue +47 -0
  37. package/src/component/shared/Collapse.vue +131 -131
  38. package/src/component/shared/DocumentPreview.vue +1 -1
  39. package/src/component/shared/DocumentPublic.vue +34 -0
  40. package/src/component/shared/ExportPDF.vue +116 -116
  41. package/src/component/shared/HeaderReport.vue +1 -1
  42. package/src/component/shared/HorizontalFilter.vue +59 -59
  43. package/src/component/shared/Loading.vue +107 -107
  44. package/src/component/shared/LoadingMoreButton.vue +23 -23
  45. package/src/component/shared/Messages.vue +81 -81
  46. package/src/component/shared/PDFViewer.vue +22 -22
  47. package/src/component/shared/Pagination.vue +52 -52
  48. package/src/component/shared/ProgressBar.vue +22 -22
  49. package/src/component/shared/QueryButton.vue +66 -66
  50. package/src/component/shared/{BodyReport.vue → Report.vue} +8 -7
  51. package/src/component/shared/SaveCancel.vue +6 -1
  52. package/src/component/shared/Search.vue +154 -154
  53. package/src/component/shared/SelectOption.vue +18 -9
  54. package/src/component/shared/Table.vue +163 -254
  55. package/src/component/shared/TableButton.vue +36 -36
  56. package/src/component/shared/TableDraggable.vue +127 -0
  57. package/src/component/shared/TableItem.vue +177 -0
  58. package/src/component/shared/TableTotalization.vue +47 -47
  59. package/src/component/shared/Tip.vue +42 -42
  60. package/src/component/shared/Toast.vue +54 -54
  61. package/src/component/shared/TotalizationReport.vue +59 -0
  62. package/src/component/shared/VerticalFilter.vue +97 -97
  63. package/src/component/shared/query-builder/AddRule.vue +181 -181
  64. package/src/component/shared/query-builder/ConvertToOdata.js +3 -9
  65. package/src/component/shared/query-builder/DynamicComponent.vue +5 -1
  66. package/src/component/shared/query-builder/DynamicComponentList.vue +73 -62
  67. package/src/component/shared/query-builder/QueryBuilder.vue +69 -69
  68. package/src/component/shared/query-builder/utilities.js +21 -21
  69. package/src/component/template/ListViewWithDataHandler.vue +260 -238
  70. package/src/component/template/ReportCreateUpdate.vue +9 -2
  71. package/src/component/template/ViewTemplateConfiguration.vue +64 -63
  72. package/src/component/template/ViewTemplateDocumentView.vue +1 -0
  73. package/src/component/template/ViewTemplateReportPreview.vue +56 -12
  74. package/src/component/template/ViewTemplateWithSalveCancel.vue +32 -32
  75. package/src/component/template/ViewTemplateWithTable.vue +56 -56
  76. package/src/component/value-objects/Contact.vue +7 -0
  77. package/src/component/value-objects/Person.vue +15 -0
  78. package/src/config/axios.js +9 -9
  79. package/src/config/dicas.js +14 -14
  80. package/src/config/router.js +13 -13
  81. package/src/config/token.js +14 -14
  82. package/src/main.js +23 -23
  83. package/src/store/modules/generic.js +512 -494
  84. package/src/store/modules/report.js +37 -19
  85. package/src/store/modules/user.js +3 -0
  86. package/src/store/modules/validation.js +38 -38
  87. package/src/store/store.js +13 -13
  88. package/src/component/shared/query-builder/Totalization.vue +0 -38
@@ -1,97 +1,97 @@
1
- <template>
2
- <div>
3
- <div
4
- class="molded-button"
5
- :class="{ fechado: !showFilter, aberto: showFilter }"
6
- v-show="!showFilter"
7
- >
8
- <i class="fas fa-arrow-circle-left"></i>
9
- </div>
10
-
11
- <transition name="slide-fade">
12
- <div
13
- class="molded-button button-recolher"
14
- v-show="showFilter"
15
- @click="showFilter = false"
16
- >
17
- <i class="fas fa-arrow-circle-right"></i>
18
- </div>
19
- </transition>
20
-
21
- <transition name="slide-fade"> </transition>
22
- </div>
23
- </template>
24
-
25
- <script>
26
- import { mapMutations } from "vuex";
27
-
28
- export default {
29
- components: {},
30
- data() {
31
- return {
32
- showFilter: false,
33
- };
34
- },
35
- };
36
- </script>
37
-
38
- <style scoped>
39
- .molded {
40
- background: white;
41
- border-left: solid 1px #dbdee0;
42
- font-size: 13px;
43
- height: 100%;
44
- width: 350px;
45
- right: 0px;
46
- padding: 10px;
47
- position: fixed;
48
- -webkit-box-shadow: 20px 20px 20px 20px rgba(124, 125, 129, 0.53);
49
- box-shadow: 20px 20px 20px 20px rgba(124, 125, 129, 0.53);
50
- z-index: 999;
51
- }
52
-
53
- .molded-button {
54
- font-size: 18px;
55
- background: #ffffff;
56
- border: solid 1px #dbdfe9;
57
- border-radius: 5px;
58
- color: #577696;
59
- height: 40px;
60
- width: 80px;
61
- line-height: 32px;
62
- padding-top: 3px;
63
- padding-right: 35px;
64
- text-align: center;
65
- position: fixed;
66
- top: 160px;
67
- cursor: pointer;
68
- z-index: 999;
69
- }
70
-
71
- .button-recolher {
72
- padding-left: 12px;
73
- padding-right: 418px;
74
- right: -38px;
75
- }
76
-
77
- .aberto {
78
- right: 365px;
79
- }
80
-
81
- .fechado {
82
- right: -38px;
83
- color: #577696;
84
- }
85
-
86
- .slide-fade-enter-active {
87
- transition: all 0.2s ease;
88
- }
89
- .slide-fade-leave-active {
90
- transition: all 0.2s cubic-bezier(1, 0.5, 0.8, 1);
91
- }
92
- .slide-fade-enter,
93
- .slide-fade-leave-to {
94
- transform: translateX(200px);
95
- opacity: 0;
96
- }
97
- </style>
1
+ <template>
2
+ <div>
3
+ <div
4
+ class="molded-button"
5
+ :class="{ fechado: !showFilter, aberto: showFilter }"
6
+ v-show="!showFilter"
7
+ >
8
+ <i class="fas fa-arrow-circle-left"></i>
9
+ </div>
10
+
11
+ <transition name="slide-fade">
12
+ <div
13
+ class="molded-button button-recolher"
14
+ v-show="showFilter"
15
+ @click="showFilter = false"
16
+ >
17
+ <i class="fas fa-arrow-circle-right"></i>
18
+ </div>
19
+ </transition>
20
+
21
+ <transition name="slide-fade"> </transition>
22
+ </div>
23
+ </template>
24
+
25
+ <script>
26
+ import { mapMutations } from "vuex";
27
+
28
+ export default {
29
+ components: {},
30
+ data() {
31
+ return {
32
+ showFilter: false,
33
+ };
34
+ },
35
+ };
36
+ </script>
37
+
38
+ <style scoped>
39
+ .molded {
40
+ background: white;
41
+ border-left: solid 1px #dbdee0;
42
+ font-size: 13px;
43
+ height: 100%;
44
+ width: 350px;
45
+ right: 0px;
46
+ padding: 10px;
47
+ position: fixed;
48
+ -webkit-box-shadow: 20px 20px 20px 20px rgba(124, 125, 129, 0.53);
49
+ box-shadow: 20px 20px 20px 20px rgba(124, 125, 129, 0.53);
50
+ z-index: 999;
51
+ }
52
+
53
+ .molded-button {
54
+ font-size: 18px;
55
+ background: #ffffff;
56
+ border: solid 1px #dbdfe9;
57
+ border-radius: 5px;
58
+ color: #577696;
59
+ height: 40px;
60
+ width: 80px;
61
+ line-height: 32px;
62
+ padding-top: 3px;
63
+ padding-right: 35px;
64
+ text-align: center;
65
+ position: fixed;
66
+ top: 160px;
67
+ cursor: pointer;
68
+ z-index: 999;
69
+ }
70
+
71
+ .button-recolher {
72
+ padding-left: 12px;
73
+ padding-right: 418px;
74
+ right: -38px;
75
+ }
76
+
77
+ .aberto {
78
+ right: 365px;
79
+ }
80
+
81
+ .fechado {
82
+ right: -38px;
83
+ color: #577696;
84
+ }
85
+
86
+ .slide-fade-enter-active {
87
+ transition: all 0.2s ease;
88
+ }
89
+ .slide-fade-leave-active {
90
+ transition: all 0.2s cubic-bezier(1, 0.5, 0.8, 1);
91
+ }
92
+ .slide-fade-enter,
93
+ .slide-fade-leave-to {
94
+ transform: translateX(200px);
95
+ opacity: 0;
96
+ }
97
+ </style>
@@ -1,181 +1,181 @@
1
- <template>
2
- <div>
3
- <div class="vqb-group card">
4
- <div class="vqb-group-body card-body">
5
- <div class="rule-actions form-inline">
6
- <div class="div-custom">
7
- <b-row>
8
- <b-col sm="6">
9
- <SelectRule :options="rules" class="select" v-model="selectedRule" />
10
- </b-col>
11
- <b-col sm="3">
12
- <RadioGroup
13
- :options="[
14
- { text: 'e', value: 'and' },
15
- { text: 'ou', value: 'or' },
16
- ]"
17
- v-model="andOr"
18
- />
19
- </b-col>
20
- <b-col sm="3">
21
- <button type="button" class="btn btn-secondary" @click="add">
22
- + Adicionar
23
- </button>
24
- </b-col>
25
- </b-row>
26
- </div>
27
- </div>
28
- </div>
29
- </div>
30
- <DynamicComponentList />
31
- </div>
32
- </template>
33
-
34
- <script>
35
- import SelectRule from "./SelectRule.vue";
36
- import DynamicComponent from "./DynamicComponent.vue";
37
- import RadioGroup from "@nixweb/nixloc-ui/src/component/forms/RadioGroup.vue";
38
- import DynamicComponentList from "@nixweb/nixloc-ui/src/component/shared/query-builder/DynamicComponentList.vue";
39
-
40
- import { mapGetters, mapMutations } from "vuex";
41
-
42
- export default {
43
- name: "AddRule",
44
- components: {
45
- SelectRule,
46
- DynamicComponent,
47
- RadioGroup,
48
- DynamicComponentList,
49
- },
50
- props: {
51
- rules: Array,
52
- },
53
- data() {
54
- return {
55
- selectedRule: this.rules[0],
56
- andOr: "or",
57
- duplicate: [],
58
- };
59
- },
60
- computed: {
61
- ...mapGetters("generic", ["event"]),
62
- },
63
- methods: {
64
- ...mapMutations("generic", ["addNotifications"]),
65
- ...mapMutations("report", ["addSelectedRules"]),
66
- add() {
67
- this.selectedRule.andOr = this.andOr;
68
- this.addRule();
69
- },
70
- addRule() {
71
- let obj = this.mountObject();
72
-
73
- if (!this.verifyIfExist(obj.name)) {
74
- this.addSelectedRules(obj);
75
- if (obj.notDuplicate) this.duplicate.push(obj);
76
- } else {
77
- var error = {
78
- property: "ERRO QUERY BUILDER",
79
- message: `Não é possível adicionar o filter ${obj.title} 2 vezes!`,
80
- };
81
- this.addNotifications([error]);
82
- }
83
- },
84
- mountObject() {
85
- let obj = {
86
- id: this.generateId(),
87
- name: this.selectedRule.name,
88
- title: this.selectedRule.title,
89
- typeField: this.selectedRule.typeField,
90
- type: this.selectedRule.type,
91
- options: this.selectedRule.options,
92
- props: this.selectedRule.props,
93
- classCss: this.selectedRule.classCss,
94
- icon: this.selectedRule.icon,
95
- operators: this.selectedRule.operators,
96
- operator: null,
97
- andOr: this.selectedRule.andOr,
98
- isRequired: this.selectedRule.isRequired,
99
- notDuplicate: this.selectedRule.notDuplicate,
100
- value: null,
101
- };
102
- return obj;
103
- },
104
- generateId() {
105
- return Math.random()
106
- .toString(36)
107
- .replace(/[^a-z]+/g, "")
108
- .substr(0, 5);
109
- },
110
- verifyIfExist(name) {
111
- var hasRule = this.duplicate.find((rule) => {
112
- return rule.name === name;
113
- });
114
- if (hasRule) return true;
115
- return false;
116
- },
117
- },
118
- watch: {
119
- event: {
120
- handler(event) {
121
- // se a tag ou a rule que está selecionada foi removida, é necessário remove tambem do array "duplicate" para liberar e adicionar novamente.
122
- if (event.name == "tagRemoved" || event.name == "selectedRuleRemoved") {
123
- var duplicate = this.duplicate.filter((item) => {
124
- return item.id != event.data.id;
125
- });
126
- this.duplicate = duplicate;
127
- }
128
- },
129
- deep: true,
130
- },
131
- },
132
- };
133
- </script>
134
-
135
- <style>
136
- .title-option {
137
- padding: 10px;
138
- }
139
-
140
- .div-custom {
141
- width: 100%;
142
- }
143
-
144
- .vue-query-builder .vqb-group .rule-actions {
145
- margin-bottom: 20px;
146
- }
147
-
148
- .vue-query-builder .vqb-rule {
149
- margin-top: 15px;
150
- margin-bottom: 15px;
151
- background-color: #f5f5f5;
152
- border-color: #ddd;
153
- padding: 15px;
154
- }
155
-
156
- .vue-query-builder .vqb-group.depth-1 .vqb-rule,
157
- .vue-query-builder .vqb-group.depth-2 {
158
- border-left: 2px solid #8bc34a;
159
- }
160
-
161
- .vue-query-builder .vqb-group.depth-2 .vqb-rule,
162
- .vue-query-builder .vqb-group.depth-3 {
163
- border-left: 2px solid #00bcd4;
164
- }
165
-
166
- .vue-query-builder .vqb-group.depth-3 .vqb-rule,
167
- .vue-query-builder .vqb-group.depth-4 {
168
- border-left: 2px solid #ff5722;
169
- }
170
-
171
- .vue-query-builder .close {
172
- opacity: 1;
173
- color: rgb(150, 150, 150);
174
- }
175
-
176
- @media (min-width: 768px) {
177
- .vue-query-builder .vqb-rule.form-inline .form-group {
178
- display: block;
179
- }
180
- }
181
- </style>
1
+ <template>
2
+ <div>
3
+ <div class="vqb-group card">
4
+ <div class="vqb-group-body card-body">
5
+ <div class="rule-actions form-inline">
6
+ <div class="div-custom">
7
+ <b-row>
8
+ <b-col sm="6">
9
+ <SelectRule :options="rules" class="select" v-model="selectedRule" />
10
+ </b-col>
11
+ <b-col sm="3">
12
+ <RadioGroup
13
+ :options="[
14
+ { text: 'e', value: 'and' },
15
+ { text: 'ou', value: 'or' },
16
+ ]"
17
+ v-model="andOr"
18
+ />
19
+ </b-col>
20
+ <b-col sm="3">
21
+ <button type="button" class="btn btn-secondary" @click="add">
22
+ + Adicionar
23
+ </button>
24
+ </b-col>
25
+ </b-row>
26
+ </div>
27
+ </div>
28
+ </div>
29
+ </div>
30
+ <DynamicComponentList />
31
+ </div>
32
+ </template>
33
+
34
+ <script>
35
+ import SelectRule from "./SelectRule.vue";
36
+ import DynamicComponent from "./DynamicComponent.vue";
37
+ import RadioGroup from "@nixweb/nixloc-ui/src/component/forms/RadioGroup.vue";
38
+ import DynamicComponentList from "@nixweb/nixloc-ui/src/component/shared/query-builder/DynamicComponentList.vue";
39
+
40
+ import { mapGetters, mapMutations } from "vuex";
41
+
42
+ export default {
43
+ name: "AddRule",
44
+ components: {
45
+ SelectRule,
46
+ DynamicComponent,
47
+ RadioGroup,
48
+ DynamicComponentList,
49
+ },
50
+ props: {
51
+ rules: Array,
52
+ },
53
+ data() {
54
+ return {
55
+ selectedRule: this.rules[0],
56
+ andOr: "or",
57
+ duplicate: [],
58
+ };
59
+ },
60
+ computed: {
61
+ ...mapGetters("generic", ["event"]),
62
+ },
63
+ methods: {
64
+ ...mapMutations("generic", ["addNotifications"]),
65
+ ...mapMutations("report", ["addSelectedRules"]),
66
+ add() {
67
+ this.selectedRule.andOr = this.andOr;
68
+ this.addRule();
69
+ },
70
+ addRule() {
71
+ let obj = this.mountObject();
72
+
73
+ if (!this.verifyIfExist(obj.name)) {
74
+ this.addSelectedRules(obj);
75
+ if (obj.notDuplicate) this.duplicate.push(obj);
76
+ } else {
77
+ var error = {
78
+ property: "ERRO QUERY BUILDER",
79
+ message: `Não é possível adicionar o filter ${obj.title} 2 vezes!`,
80
+ };
81
+ this.addNotifications([error]);
82
+ }
83
+ },
84
+ mountObject() {
85
+ let obj = {
86
+ id: this.generateId(),
87
+ name: this.selectedRule.name,
88
+ title: this.selectedRule.title,
89
+ typeField: this.selectedRule.typeField,
90
+ type: this.selectedRule.type,
91
+ options: this.selectedRule.options,
92
+ props: this.selectedRule.props,
93
+ classCss: this.selectedRule.classCss,
94
+ icon: this.selectedRule.icon,
95
+ operators: this.selectedRule.operators,
96
+ operator: null,
97
+ andOr: this.selectedRule.andOr,
98
+ isRequired: this.selectedRule.isRequired,
99
+ notDuplicate: this.selectedRule.notDuplicate,
100
+ value: null,
101
+ };
102
+ return obj;
103
+ },
104
+ generateId() {
105
+ return Math.random()
106
+ .toString(36)
107
+ .replace(/[^a-z]+/g, "")
108
+ .substr(0, 5);
109
+ },
110
+ verifyIfExist(name) {
111
+ var hasRule = this.duplicate.find((rule) => {
112
+ return rule.name === name;
113
+ });
114
+ if (hasRule) return true;
115
+ return false;
116
+ },
117
+ },
118
+ watch: {
119
+ event: {
120
+ handler(event) {
121
+ // se a tag ou a rule que está selecionada foi removida, é necessário remove tambem do array "duplicate" para liberar e adicionar novamente.
122
+ if (event.name == "tagRemoved" || event.name == "selectedRuleRemoved") {
123
+ var duplicate = this.duplicate.filter((item) => {
124
+ return item.id != event.data.id;
125
+ });
126
+ this.duplicate = duplicate;
127
+ }
128
+ },
129
+ deep: true,
130
+ },
131
+ },
132
+ };
133
+ </script>
134
+
135
+ <style>
136
+ .title-option {
137
+ padding: 10px;
138
+ }
139
+
140
+ .div-custom {
141
+ width: 100%;
142
+ }
143
+
144
+ .vue-query-builder .vqb-group .rule-actions {
145
+ margin-bottom: 20px;
146
+ }
147
+
148
+ .vue-query-builder .vqb-rule {
149
+ margin-top: 15px;
150
+ margin-bottom: 15px;
151
+ background-color: #f5f5f5;
152
+ border-color: #ddd;
153
+ padding: 15px;
154
+ }
155
+
156
+ .vue-query-builder .vqb-group.depth-1 .vqb-rule,
157
+ .vue-query-builder .vqb-group.depth-2 {
158
+ border-left: 2px solid #8bc34a;
159
+ }
160
+
161
+ .vue-query-builder .vqb-group.depth-2 .vqb-rule,
162
+ .vue-query-builder .vqb-group.depth-3 {
163
+ border-left: 2px solid #00bcd4;
164
+ }
165
+
166
+ .vue-query-builder .vqb-group.depth-3 .vqb-rule,
167
+ .vue-query-builder .vqb-group.depth-4 {
168
+ border-left: 2px solid #ff5722;
169
+ }
170
+
171
+ .vue-query-builder .close {
172
+ opacity: 1;
173
+ color: rgb(150, 150, 150);
174
+ }
175
+
176
+ @media (min-width: 768px) {
177
+ .vue-query-builder .vqb-rule.form-inline .form-group {
178
+ display: block;
179
+ }
180
+ }
181
+ </style>
@@ -5,7 +5,7 @@ export default class ConvertToOdata {
5
5
  if (operator === "igual" && rule.typeField === "text") return `${rule.name} eq '${rule.value}'`;
6
6
  if (operator === "diferente" && rule.typeField === "text") return `${rule.name} ne '${rule.value}'`;
7
7
  if (operator === "contem") return `contains(${rule.name},'${rule.value}')`;
8
-
8
+
9
9
  if (operator === "igual" && rule.typeField === "numeric") return `${rule.name} eq ${rule.value}`;
10
10
  if (operator === "diferente" && rule.typeField === "numeric") return `${rule.name} ne ${rule.value}`;
11
11
  if (operator === "menor") return `${rule.name} lt ${rule.value}`;
@@ -32,13 +32,13 @@ export default class ConvertToOdata {
32
32
  var size = options.length;
33
33
  let self = this;
34
34
  options.forEach(function (value) {
35
+
35
36
  if (type == "field") {
36
37
  query += `${name} eq ${value}`;
37
38
  if (seq + 1 != size) query += ` or `;
38
39
  }
39
40
  if (type == "totalization") {
40
- let convertName = self.convertName(value);
41
- query += `${name} with ${value} as ${convertName}${title}`;
41
+ query += `${name} with ${value} as ${value}${name.charAt(0).toUpperCase() + name.slice(1)}`;
42
42
  if (seq + 1 != size) query += `,`;
43
43
  }
44
44
  seq++;
@@ -68,10 +68,4 @@ export default class ConvertToOdata {
68
68
 
69
69
  return iso;
70
70
  }
71
- convertName(value) {
72
- if (value === "sum") return "soma";
73
- if (value === "average") return "media";
74
- if (value === "max") return "maximo";
75
- if (value === "minimo") return "minimo";
76
- }
77
71
  }
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="vqb-rule card">
2
+ <div class="vqb-rule card move">
3
3
  <div class="form-inline">
4
4
  <label :class="rule.classCss" class="mr-5">
5
5
  <i :class="rule.icon"></i>
@@ -96,6 +96,10 @@ export default {
96
96
  };
97
97
  </script>
98
98
  <style scoped>
99
+ .move {
100
+ cursor: move;
101
+ }
102
+
99
103
  .btn-remove {
100
104
  font-size: 16px;
101
105
  color: darkgray;