toggle-components-library 1.33.0-beta.5 → 1.33.0-beta.7

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.
@@ -1,16 +1,9 @@
1
1
  <template>
2
2
  <div :class="['toggle-status-bar-container', statusColours, statusSize]">
3
3
  <label class="toggle-status-bar-label">
4
- <span class="toggle-status-bar-dot blinking" v-if="showDot">&#9679;</span>
4
+ <span class="toggle-status-bar-dot" v-if="showDot">&#9679;</span>
5
5
  {{ statusName }}
6
6
  </label>
7
-
8
- <div class="toggle-status-bar-tooltip-container" v-if="showToolTip && toolTipText.length">
9
- <div class="toggle-status-bar-tooltip">
10
- ?
11
- <span class="toggle-status-bar-tooltip-text">{{ toolTipText }}</span>
12
- </div>
13
- </div>
14
7
  </div>
15
8
  </template>
16
9
 
@@ -22,7 +15,7 @@ export default {
22
15
  type: String,
23
16
  required: true,
24
17
  validator: function (value) {
25
- return ['draft', 'processing', 'complete', 'inactive', 'active', 'submitted'].indexOf(value) !== -1;
18
+ return ['draft', 'processing', 'complete', 'inactive', 'active'].indexOf(value) !== -1;
26
19
  }
27
20
  },
28
21
  size: {
@@ -31,10 +24,6 @@ export default {
31
24
  validator: function (value) {
32
25
  return ['small'].indexOf(value) !== -1;
33
26
  }
34
- },
35
- toolTipOptions: {
36
- type: Object,
37
- required: false
38
27
  }
39
28
  },
40
29
  computed: {
@@ -52,21 +41,7 @@ export default {
52
41
  },
53
42
  // Show the dot if the status is active or processing
54
43
  showDot() {
55
- return this.status === 'active' || this.status === 'processing' || this.status === 'submitted';
56
- },
57
- showToolTip() {
58
- return this.size !== 'small';
59
- },
60
- toolTipText() {
61
- if (!this.toolTipOptions) {
62
- return '';
63
- }
64
-
65
- if (this.toolTipOptions[this.status]) {
66
- return this.toolTipOptions[this.status];
67
- } else {
68
- return '';
69
- }
44
+ return this.status === 'active' || this.status === 'processing';
70
45
  }
71
46
  }
72
47
  }
@@ -3,29 +3,58 @@
3
3
  <div>
4
4
 
5
5
  <table class="toggle-table">
6
- <thead :class="{'toggle-table-any-search-active': searchActive}">
6
+ <thead :class="{'toggle-table-any-search-active': anySearchActive}">
7
7
  <tr class="toggle-tablee-tr">
8
- <th
9
- scope="col"
10
- :class="['toggle-table-th', {'toggle-table-search-active': tableSearchActive(field), 'toggle-table-searchable':field.filterable}]"
11
- v-for="(field, index) in headers"
8
+ <th
9
+ scope="col"
10
+ :class="['toggle-table-th', {'toggle-table-search-active': tableSearchActive(field), 'toggle-table-searchable':field.filterable}]"
11
+ v-for="(field, index) in headers"
12
+ :colspan="field.colspan"
12
13
  :key="index"
13
14
  :style="'width:'+field.width"
14
15
  @click="activateSearch(field)"
15
16
  >
16
- <div class="toggle-table-th-inner">
17
+ <div class="toggle-table-th-inner" @transitionend="handleTransitionEnd">
18
+
17
19
  <span class="toggle-table-th-title">{{field.label}}</span>
18
20
  <span class="toggle-table-close-search" v-on:click.stop @click="closeSearch(field)"></span>
19
- <ToggleInputText type="text" :ref="field.key+'-input'" v-model="searchModels[field.key]" @input="searchChange(field)"
20
- v-if="field.type == 'text' && (searchModels[field.key] || editingInput == field.key)" />
21
- <ToggleInputSelect style="margin-top:2px;" size="small" v-if="field.type == 'select' && (searchModels[field.key] || editingInput == field.key)" :options="field.select_options" v-model="searchModels[field.key]" @input="val=>searchChange(val, field)"/>
22
21
 
23
- <ToggleDateRangePicker v-if="field.type == 'date' && (searchModels[field.key].start || searchModels[field.key].end || editingInput == field.key)" name="date" v-model="searchModels[field.key]" @input="val=>searchChange(val, field)" />
22
+ <ToggleInputText
23
+ v-if="field.type === 'text' && (searchModels[field.key] || editingInput === field.key)"
24
+ type="text"
25
+ :ref="field.key+'-input'"
26
+ v-model="searchModels[field.key]"
27
+ @input="searchChange(field)"
28
+ @bail="closeSearch(field)"
29
+ :searchIsOpen="searchIsOpen"
30
+ />
31
+ <ToggleInputSelect
32
+ style="margin-top:2px;"
33
+ :size="'small'"
34
+ v-if="field.type === 'select' && (searchModels[field.key] || editingInput === field.key)"
35
+ :searchIsOpen="searchIsOpen"
36
+ :options="field.select_options"
37
+ v-model="searchModels[field.key]"
38
+ @input="val=>searchChange(val, field)"
39
+ />
40
+ <ToggleDatePicker
41
+ v-if="field.type === 'date_range' && (searchModels[field.key].start || searchModels[field.key].end || editingInput === field.key)"
42
+ name="date_range" size="small"
43
+ :searchIsOpen="searchIsOpen"
44
+ @input="val=>searchChange(val, field)" type="date" :range="true" label="Input label" v-model="searchModels[field.key]"
45
+ />
24
46
  </div>
25
47
  </th>
26
-
48
+
27
49
  </tr>
28
50
  </thead>
51
+ <tr class="empty-table" v-if="(items && items.length === 0) && !loading">
52
+ <td :colspan="headers.length">
53
+ <div class="full">
54
+ <div class="empty-area"><p>{{ emptyTableMessage }}</p></div>
55
+ </div>
56
+ </td>
57
+ </tr>
29
58
  <tbody v-if="!$slots.default || !$slots.default.length">
30
59
  <ToggleTableRow v-for="(item, index) in items" :key="index" >
31
60
  <ToggleTableColumn v-for="(column, column_index) in item" :key="column_index">{{column}}</ToggleTableColumn>
@@ -44,7 +73,7 @@
44
73
 
45
74
  import { mixins } from '../mixins/mixins';
46
75
 
47
- import ToggleDateRangePicker from '../forms/ToggleDateRangePicker.vue';
76
+ import ToggleDatePicker from '../forms/ToggleDatePicker.vue';
48
77
  import ToggleInputText from '../forms/ToggleInputText.vue';
49
78
  import ToggleInputSelect from '../forms/ToggleInputSelect.vue';
50
79
  import ToggleTableRow from '../tables/ToggleTableRow.vue';
@@ -53,7 +82,7 @@ import TogglePagination from '../tables/TogglePagination.vue';
53
82
 
54
83
  export default {
55
84
  mixins:[mixins],
56
- components:{ToggleDateRangePicker, ToggleInputText, ToggleInputSelect, ToggleTableColumn, ToggleTableRow, TogglePagination},
85
+ components:{ToggleDatePicker, ToggleInputText, ToggleInputSelect, ToggleTableColumn, ToggleTableRow, TogglePagination},
57
86
  props: {
58
87
  items: {
59
88
  type: [Array]
@@ -62,20 +91,30 @@ export default {
62
91
  type: [Array]
63
92
  },
64
93
  total:{
65
- type: [Number]
94
+ type: [Number]
66
95
  },
67
96
  per_page:{
68
- type: [Number]
97
+ type: [Number]
69
98
  },
70
99
  page:{
71
100
  type: [Number],
72
101
  default:1
102
+ },
103
+ loading: {
104
+ type: Boolean
105
+ },
106
+ emptyTableMessage: {
107
+ type: String,
108
+ default: "No rows returned."
73
109
  }
74
- },
110
+ },
75
111
  data : function(){
76
112
  return {
77
113
  editingInput:false,
78
- searchModels:{}
114
+ searchModels:{},
115
+ anySearchActive: false,
116
+ searchIsOpen: false,
117
+ searchDebounce: null
79
118
  };
80
119
  },
81
120
  computed: {
@@ -97,36 +136,23 @@ export default {
97
136
 
98
137
  headers() {
99
138
  if(!this.fields){
100
- return Object.keys(this.items[0]);
139
+ return Object.keys(this.items[0]);
101
140
  }
102
141
  return this.fields;
103
142
  },
104
143
 
105
- searchActive() {
106
- if(this.editingInput) {
107
- return true;
108
- }
109
- for(let col in this.searchModels){
110
- if(!this.searchModels[col])
111
- return false;
112
- if (this.searchModels[col].start !== undefined) {
113
- return true;
114
- }
115
- else if(this.searchModels[col]) return true;
116
- }
117
- return false;
118
- },
119
-
120
-
121
144
  },
122
145
  created : function(){
123
146
 
124
147
  if(this.fields){
148
+
125
149
  for (let i = 0; i < this.fields.length; i++) {
126
- let value = this.fields[i].type == 'date' ? this.setInitialDate(i) : this.fields[i].value;
150
+ let value = this.fields[i].type == 'date_range' ? this.setInitialDate(i) : (this.fields[i].value ?? '');
151
+
127
152
  let field_name = this.fields[i].key;
128
153
  this.$set( this.searchModels, field_name, value )
129
154
  if(value){
155
+ this.searchIsOpen = true;
130
156
  // if date has an initial value set, show it.
131
157
  if(typeof value.start !== 'undefined'){
132
158
  if(value.start.length) this.activateSearch(this.fields[i]);
@@ -137,20 +163,29 @@ export default {
137
163
  this.searchChange();
138
164
  }
139
165
  }
140
-
166
+
141
167
  },
142
168
 
143
169
  beforeDestroy: function () {
144
- },
145
- watch:{
146
-
147
170
  },
148
171
  mounted : function ()
149
172
  {
150
173
 
151
174
  },
152
-
175
+
153
176
  methods:{
177
+
178
+ handleTransitionEnd(event){
179
+ if(event.propertyName === 'height'){
180
+ if(this.anySearchActive && !this.searchIsOpen){
181
+ this.searchIsOpen = true;
182
+ }
183
+ if(!this.anySearchActive && this.searchIsOpen){
184
+ this.searchIsOpen = false;
185
+ }
186
+ }
187
+ },
188
+
154
189
  // set initial date
155
190
  setInitialDate(index){
156
191
  let value = this.fields[index].value;
@@ -160,36 +195,68 @@ export default {
160
195
 
161
196
  tableSearchActive(field)
162
197
  {
163
- if(field.type == 'date'){
164
- return (this.searchModels[field.key].start || this.searchModels[field.key].end || this.editingInput == field.key);
198
+ if(field.type === 'date_range'){
199
+ return (this.searchModels[field.key].start || this.searchModels[field.key].end || this.editingInput === field.key);
165
200
  }
166
- return (this.searchModels[field.key] || this.editingInput == field.key);
201
+ return (this.searchModels[field.key] || this.editingInput === field.key);
167
202
 
168
203
  },
169
204
 
205
+
206
+ getSearchModelTypeFromKey(key){
207
+ for(let i=0; i<this.fields.length; i++){
208
+ if(this.fields[i].key === key){
209
+ return this.fields[i].type;
210
+ }
211
+ }
212
+ return null;
213
+ },
214
+
170
215
  closeSearch(field){
216
+
171
217
  this.editingInput = false;
172
- this.searchModels[field.key] = field.type == 'date' ? { start: false, end: false} : '' ;
218
+ this.searchModels[field.key] = field.type === 'date_range' ? { start: null, end: null} : '' ;
219
+
220
+ // check if any search is active; if not, close/shrink header
221
+ let is_active = false;
222
+ for(const key in this.searchModels){
223
+
224
+ if(this.getSearchModelTypeFromKey(key) === 'date_range'){
225
+ if (this.searchModels[key].start || this.searchModels[key].end){
226
+ is_active = true;
227
+ break;
228
+ }
229
+ }else if(this.searchModels[key] && this.searchModels[key] !== ''){
230
+ is_active = true;
231
+ break;
232
+ }
233
+ }
234
+ this.anySearchActive = is_active;
173
235
  this.searchChange();
174
236
  },
175
237
 
176
238
  searchChange(){
177
- this.$emit('search', this.fieldsWithSearch);
239
+ clearTimeout(this.searchDebounce);
240
+ this.searchDebounce = setTimeout(()=>{
241
+ this.$emit('search', this.fieldsWithSearch);
242
+ },500);
243
+
178
244
  },
179
245
 
180
246
  /* activateSearch
181
247
  * When a user clicks a searchable column name, show it as active, and focus the child input field (unless it's already active)
182
248
  */
183
249
  activateSearch(field){
184
- if(!field.filterable) return;
185
- if(field.type === 'date'){
250
+ if(!field.filterable || field.readonly) return;
251
+ if(field.type === 'date_range'){
186
252
  this.datePickerOpen = true;
187
253
  }
188
254
  this.editingInput = field.key;
255
+ this.anySearchActive = true;
189
256
  //this.$nextTick(() => this.$refs[this.editingInput + '-input'].focus())
190
257
  },
191
258
 
192
-
259
+
193
260
 
194
261
  }
195
262
  }
package/src/index.js CHANGED
@@ -4,7 +4,6 @@ import ToggleInputText from "./components/forms/ToggleInputText.vue";
4
4
  import ToggleInputEditableText from "./components/forms/ToggleInputEditableText.vue";
5
5
  import ToggleInputWebsite from "./components/forms/ToggleInputWebsite.vue";
6
6
  import ToggleDatePicker from "./components/forms/ToggleDatePicker.vue";
7
- import ToggleDateRangePicker from "./components/forms/ToggleDateRangePicker.vue";
8
7
  import ToggleInputSelect from "./components/forms/ToggleInputSelect.vue";
9
8
  import ToggleInputPercentage from "./components/forms/ToggleInputPercentage.vue";
10
9
  import ToggleInputCurrency from "./components/forms/ToggleInputCurrency.vue";
@@ -106,14 +105,13 @@ const Components = {
106
105
  ToggleInputEditableText,
107
106
  ToggleInputWebsite,
108
107
  ToggleDatePicker,
109
- ToggleDateRangePicker,
110
108
  ToggleInputSelect,
111
109
  ToggleInputPercentage,
112
110
  ToggleInputCurrency,
113
111
  ToggleInputRadioButtons,
114
112
  ToggleInputTextArea,
115
113
  ToggleInputCheckboxContainer,
116
- ToggleInputCheckbox,
114
+ ToggleInputCheckbox,
117
115
  ToggleInputCheckboxInline,
118
116
  ToggleFillLoader,
119
117
  ToggleProgressLoader,
@@ -1,15 +1,15 @@
1
1
 
2
2
  .toggle-input,
3
3
  .toggle-input-label,
4
- .toggle-input-counter,
4
+ .toggle-input-counter,
5
5
  .toggle-input-label-error,
6
- .toggle-input-radio-label,
6
+ .toggle-input-radio-label,
7
7
  .toggle-input-checkbox-label,
8
8
  .toggle-input-search-options,
9
9
  .toggle-input-select,
10
10
  .toggle-contact-search-container{
11
11
  @include toggle-global-font-config;
12
- }
12
+ }
13
13
 
14
14
  .toggle-input-counter{
15
15
  font-size: $toggle-font-size-small;
@@ -110,7 +110,7 @@
110
110
 
111
111
  padding : 0.8rem 1.2rem 1.4rem 1.2rem;
112
112
  background-color: $toggle-off-white;
113
- border-radius : 9px;
113
+ border-radius : 9px;
114
114
  box-sizing : border-box;
115
115
  border : 1px solid $toggle-off-white;
116
116
  position : relative;
@@ -122,7 +122,7 @@
122
122
  &.margin-bottom-0{
123
123
  padding-bottom:0;
124
124
  }
125
-
125
+
126
126
  }
127
127
 
128
128
  // When inputs are inside input groups or modals, they look a bit different
@@ -227,35 +227,36 @@
227
227
  }
228
228
  }
229
229
 
230
- .calendar-icon-disabled {
230
+ .toggle-date-input-calendar-icon-disabled {
231
231
  cursor: default;
232
232
  opacity: 0.5;
233
233
  }
234
234
 
235
235
  .toggle-input-select-container{
236
236
  position:relative;
237
- background-color: $toggle-dark-grey;
237
+ //background-color: $toggle-dark-grey;
238
238
  border-radius:5px;
239
239
  overflow: auto;
240
240
  float: left;
241
241
  clear: both;
242
242
  width: 100%;
243
- &:after{
244
- content: '';
245
- width: 1.5rem;
246
- height: 1.5rem;
247
- background: transparent url("../assets/icons/arrow_down.svg") no-repeat 100% 50%;
248
- position: absolute;
249
- right: 1rem;
250
- top: 0.7rem;
251
- pointer-events: none;
252
- }
243
+ //&:after{
244
+ // content: '';
245
+ // width: 1.5rem;
246
+ // height: 1.5rem;
247
+ // background: transparent url("../assets/icons/arrow_down.svg") no-repeat 100% 50%;
248
+ // position: absolute;
249
+ // right: 1rem;
250
+ // top: 0.7rem;
251
+ // pointer-events: none;
252
+ //}
253
253
  }
254
254
 
255
-
255
+
256
256
  .toggle-input-select{
257
257
 
258
- padding : 0.5rem 2.5rem 0.5rem 1rem;
258
+ //padding : 0.5rem 2.5rem 0.5rem 1rem;
259
+ padding: 0.5rem;
259
260
  cursor : pointer;
260
261
 
261
262
  -webkit-appearance: none;
@@ -334,7 +335,7 @@
334
335
  .toggle-input-radio{
335
336
  clear:both;
336
337
  float: left;
337
- margin-left:2.2rem;
338
+ margin-left:2.2rem;
338
339
  }
339
340
 
340
341
  }
@@ -368,8 +369,8 @@
368
369
  display : flex;
369
370
  align-items: center;
370
371
  }
371
-
372
-
372
+
373
+
373
374
  input[type="radio"], input[type="checkbox"]{
374
375
  display: none;
375
376
  }
@@ -396,7 +397,7 @@
396
397
  }
397
398
  }
398
399
 
399
-
400
+
400
401
 
401
402
  > input:disabled:checked + div{
402
403
  .toggle-input-radio-check-element {
@@ -435,6 +436,10 @@
435
436
  }
436
437
  }
437
438
 
439
+ .toggle-input-is-readonly:focus {
440
+ outline: none;
441
+ }
442
+
438
443
  .toggle-input-radio-label, .toggle-input-checkbox-label{
439
444
  display : inline-block;
440
445
  font-size: $toggle-font-size-large;
@@ -486,7 +491,7 @@
486
491
  }
487
492
 
488
493
  .toggle-input-checkbox-check-element {
489
- background: url('../assets/icons/checkbox_blank.svg') no-repeat;
494
+ background: url('../assets/icons/checkbox_blank.svg') no-repeat;
490
495
  }
491
496
 
492
497
  // image input
@@ -513,8 +518,8 @@ $iconWidth:20px;
513
518
  .toggle-dark-grey {
514
519
  border:7px solid inherit;
515
520
  }
516
- .toggle-draggable-group-item {
517
- position: relative;
521
+ .toggle-draggable-group-item {
522
+ position: relative;
518
523
  list-style: none;
519
524
  margin:5px 10px 5px 0px;
520
525
  .toggle-item-img {
@@ -539,7 +544,7 @@ $iconWidth:20px;
539
544
  background: url('../assets/icons/draggable.svg') no-repeat center center;
540
545
  cursor: move;
541
546
  }
542
-
547
+
543
548
  }
544
549
  .toggle-button-container{
545
550
  border:0px solid transparent!important;
@@ -548,7 +553,7 @@ $iconWidth:20px;
548
553
  height:$iconWidth;
549
554
  }
550
555
  }
551
-
556
+
552
557
 
553
558
  li:first-child div:first-child{
554
559
  border:4px solid #189ED1;
@@ -557,8 +562,8 @@ $iconWidth:20px;
557
562
  }
558
563
  }
559
564
 
560
-
561
-
565
+
566
+
562
567
  }
563
568
 
564
569
  .toggle-dropzone-container{
@@ -587,7 +592,7 @@ $iconWidth:20px;
587
592
  height:0.5vw;
588
593
  }
589
594
  }
590
-
595
+
591
596
 
592
597
  .vue-dropzone {
593
598
  border: 0;
@@ -611,7 +616,7 @@ $iconWidth:20px;
611
616
  background-color: $toggle-light-blue;
612
617
  }
613
618
  }
614
-
619
+
615
620
  }
616
621
 
617
622
  .dropzone{
@@ -645,7 +650,7 @@ $iconWidth:20px;
645
650
  .dropzone > .dz-preview {
646
651
  width: 40%;
647
652
  }
648
-
653
+
649
654
  }
650
655
 
651
656
  .toggle-dropzone-file-container {
@@ -670,7 +675,7 @@ $iconWidth:20px;
670
675
  cursor: pointer;
671
676
  float:left;
672
677
  height: 2rem;
673
- width: 2rem;
678
+ width: 2rem;
674
679
  border-radius: 0% 50% 50% 0%;
675
680
  margin-left: -5px;
676
681
  }
@@ -686,7 +691,7 @@ $iconWidth:20px;
686
691
 
687
692
 
688
693
  // input crud buttons
689
- //
694
+ //
690
695
  .toggle-input-crud-container{
691
696
  padding:1rem 3.5rem 1rem 1rem;;
692
697
  height:auto;
@@ -705,7 +710,7 @@ $iconWidth:20px;
705
710
  cursor: pointer;
706
711
  }
707
712
 
708
-
713
+
709
714
 
710
715
  .toggle-input-crud-container-description{
711
716
  text-align: center;
@@ -845,24 +850,24 @@ $iconWidth:20px;
845
850
  -webkit-font-smoothing: antialiased;
846
851
  -moz-osx-font-smoothing: grayscale;
847
852
  }
848
-
853
+
849
854
  @mixin toggle-input-border-base {
850
855
  border: 1px solid #ccc;
851
856
  }
852
-
857
+
853
858
  @mixin toggle-input-border {
854
859
  @include toggle-input-border-base;
855
860
  border-radius: 4px;
856
861
  box-sizing: border-box;
857
862
  }
858
-
863
+
859
864
  @mixin toggle-input-border-country-left {
860
865
  @include toggle-input-border-base;
861
866
  border-top-left-radius: 4px;
862
867
  border-bottom-left-radius: 4px;
863
868
  border-right: none;
864
869
  }
865
-
870
+
866
871
  @mixin toggle-input-border-country-right {
867
872
  @include toggle-input-border-base;
868
873
  border-top-right-radius: 4px;
@@ -879,7 +884,7 @@ $iconWidth:20px;
879
884
  width: 130px;
880
885
  margin: 5px 0px;
881
886
  @include toggle-input-border-country-left;
882
-
887
+
883
888
  select{
884
889
  position: relative;
885
890
  opacity: 0;
@@ -888,32 +893,32 @@ $iconWidth:20px;
888
893
  cursor: pointer;
889
894
  height: 100%;
890
895
  }
891
-
896
+
892
897
  .toggle-selected-wraper {
893
898
  top:20%;
894
899
  font-size: 0.9em;
895
900
  position: absolute;
896
901
  padding: 3px;
897
902
  left: 5px;
898
-
903
+
899
904
  &:before{
900
905
  float:left;
901
906
  content: url("data:image/svg+xml;charset=UTF-8, <svg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 317 275'><path id='Arrow_downw' data-name='Arrow_Down' d='M158.5,0,317,275H0Z' transform='translate(317 275) rotate(180)' fill='gray'/></svg>");
902
907
  margin-top:1px;
903
908
  margin-right: 2px;
904
909
  }
905
-
910
+
906
911
  div {
907
912
  float:left;
908
913
  }
909
-
914
+
910
915
  .toggle-selected-country-emoji {
911
916
  margin-left: 5px;
912
917
  margin-top: 2px;
913
918
  }
914
919
  }
915
-
916
-
920
+
921
+
917
922
  }
918
923
 
919
924
  .toggle-input-label-error {
@@ -924,16 +929,16 @@ $iconWidth:20px;
924
929
  .toggle-input-select-country {
925
930
  padding: 3px 10px 22px 10px;
926
931
  margin: 5px 0px 5px 0px;
927
-
932
+
928
933
  &.toggle-number {
929
-
934
+
930
935
  position: relative;
931
936
  font-size:0.9em;
932
937
  padding:10px;
933
938
  @include toggle-input-border-country-right;
934
939
  width: 80%;
935
940
  }
936
-
941
+
937
942
  }
938
943
  .toggle-invalid-number {
939
944
  border:1px solid #ED7B7C !important;