toggle-components-library 1.33.0-beta.1 → 1.33.0-beta.11

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,6 +1,6 @@
1
1
  {
2
2
  "name": "toggle-components-library",
3
- "version": "1.33.0-beta.1",
3
+ "version": "1.33.0-beta.11",
4
4
  "private": false,
5
5
  "scripts": {
6
6
  "serve": "vue-cli-service serve",
@@ -6,8 +6,8 @@
6
6
  <label class="toggle-input-label">{{label}}</label>
7
7
 
8
8
  <div class="toggle-date-input-container">
9
- <div :class="['toggle-date-input-calendar-icon', {'calendar-icon-disabled' :disabled}]">
10
- <input type="text" class="toggle-input" :name="name" :disabled="disabled" ref="date-input" :id="'toggle-date-input'+_uid" :value="date" v-on:keypress="$event.preventDefault()" />
9
+ <div class="toggle-date-input-calendar-icon">
10
+ <input type="text" class="toggle-input" :name="name" ref="date-input" :id="'toggle-date-input'+_uid" :value="date" v-on:keypress="$event.preventDefault()">
11
11
  </div>
12
12
  <button type="button" class="toggle-clear" v-on:click="clearDate" v-if="displayValue"></button>
13
13
  </div>
@@ -101,11 +101,7 @@ export default {
101
101
  maxLength:{
102
102
  type: Number,
103
103
  required:false
104
- },
105
- disabled: {
106
- type: Boolean,
107
- default: false
108
- },
104
+ }
109
105
  },
110
106
 
111
107
  created : function(){
@@ -3,7 +3,7 @@
3
3
 
4
4
 
5
5
 
6
- <div class="toggle-input-container" :class="{'toggle-input-is-invalid':isInvalid, 'toggle-input-is-disabled': disabled }" v-on:click="focusClosestInput">
6
+ <div class="toggle-input-container" :class="{'toggle-input-is-invalid':isInvalid }" v-on:click="focusClosestInput">
7
7
  <label
8
8
  v-if="label"
9
9
  :for="name ? name : 'InputText' "
@@ -16,7 +16,6 @@
16
16
  :placeholder="placeholder ? placeholder : '' "
17
17
  :autocomplete="autocomplete ? 'on' : 'off' "
18
18
  :required="required"
19
- :disabled="disabled"
20
19
  v-model="inputVal"
21
20
  @blur="isInputActive = false"
22
21
  @focus="isInputActive = true"
@@ -92,12 +91,8 @@ export default {
92
91
  currencyDenomination: {
93
92
  type: Number,
94
93
  default: 100
95
- },
96
- disabled: {
97
- type: Boolean,
98
- required: false,
99
- default: false
100
- },
94
+ }
95
+
101
96
  },
102
97
 
103
98
  created : function(){
@@ -1,18 +1,18 @@
1
1
  <template>
2
2
 
3
- <div class="toggle-input-container" :class="{'toggle-input-is-invalid':isInvalid, 'toggle-input-is-disabled':disabled}" v-on:click="focusClosestInput">
4
- <label
3
+ <div v-if="show" class="toggle-input-container" :class="{'toggle-input-is-invalid':isInvalid, 'toggle-input-is-disabled':disabled}" v-on:click="focusClosestInput">
4
+ <label
5
5
  v-if="label"
6
- :for="name ? name : 'ToggleInputSelect' "
6
+ :for="name ? name : 'ToggleInputSelect' "
7
7
  class="toggle-input-label"
8
- > {{ label }}
8
+ > {{ label }}
9
9
  </label>
10
10
 
11
11
  <div class="toggle-input-select-container">
12
- <select
13
- :name="name ? name : 'ToggleInputSelect' "
12
+ <select
13
+ :name="name ? name : 'ToggleInputSelect' "
14
14
  :class="[ 'toggle-input-select', size]"
15
- v-model="inputVal"
15
+ v-model="inputVal"
16
16
  :autocomplete="autocomplete ? 'on' : 'off' "
17
17
  :required="required"
18
18
  :disabled="disabled"
@@ -24,7 +24,7 @@
24
24
  </div>
25
25
 
26
26
  <label
27
- class="toggle-input-label-error"
27
+ class="toggle-input-label-error"
28
28
  v-if="isInvalid"
29
29
  :for="name ? name : 'ToggleInputText' "
30
30
  >
@@ -39,6 +39,11 @@ import { mixins } from '../mixins/mixins'
39
39
 
40
40
  export default {
41
41
  mixins:[mixins],
42
+ data() {
43
+ return {
44
+ show: false
45
+ }
46
+ },
42
47
  props: {
43
48
  value: {},
44
49
  name: {
@@ -83,10 +88,19 @@ export default {
83
88
  type: Boolean,
84
89
  required: false,
85
90
  default: false
91
+ },
92
+ // in toggle-table context, if search bar height expand transition has finished
93
+ applyFocus: {
94
+ type: Boolean,
95
+ required: false,
96
+ default: null
86
97
  }
87
98
  },
88
99
 
89
100
  created : function(){
101
+ if(this.applyFocus === null || this.applyFocus){
102
+ this.show = true;
103
+ }
90
104
  },
91
105
  computed: {
92
106
  inputVal: {
@@ -112,6 +126,11 @@ export default {
112
126
  options(options) {
113
127
  if (options.filter( option => option.value == this.inputVal).length == 0)
114
128
  this.inputVal = "";
129
+ },
130
+ applyFocus(new_value){
131
+ if(new_value){
132
+ this.show = true;
133
+ }
115
134
  }
116
135
  }
117
136
  }
@@ -1,16 +1,16 @@
1
1
  <template>
2
2
 
3
3
  <div class="toggle-input-container" :class="{'toggle-input-is-invalid':isInvalid, 'toggle-input-is-disabled':disabled}" v-on:click="focusClosestInput">
4
- <label
4
+ <label
5
5
  v-if="label"
6
- :for="name ? name : 'InputText' "
6
+ :for="name ? name : 'InputText' "
7
7
  class="toggle-input-label"
8
- > {{ label }}
8
+ > {{ label }}
9
9
  </label>
10
10
  <span class="toggle-input-counter" v-if="maxLength">{{messageLength(inputVal, maxLength)}}</span>
11
11
  <input
12
12
  :type="type"
13
- :name="name ? name : 'ToggleInputText' "
13
+ :name="name ? name : 'ToggleInputText' "
14
14
  :class="[ 'toggle-input', size]"
15
15
  :placeholder="placeholder ? placeholder : '' "
16
16
  :autocomplete="autocomplete ? 'on' : 'off' "
@@ -19,9 +19,11 @@
19
19
  :maxlength="maxLength"
20
20
  :disabled="disabled"
21
21
  :readonly="readonly"
22
+ :ref="'input_ele'"
23
+ @keyup.esc="handleEscPress"
22
24
  />
23
25
  <label
24
- class="toggle-input-label-error"
26
+ class="toggle-input-label-error"
25
27
  v-if="isInvalid"
26
28
  :for="name ? name : 'ToggleInputText' "
27
29
  >
@@ -100,10 +102,26 @@ export default {
100
102
  type: Boolean,
101
103
  required: false,
102
104
  default: false
105
+ },
106
+ // in toggle-table context, if search bar height expand transition has finished
107
+ applyFocus: {
108
+ type: Boolean,
109
+ required: false
103
110
  }
104
111
  },
105
112
 
106
- created : function(){
113
+ created : function()
114
+ {
115
+ if(this.applyFocus){
116
+ this.$nextTick(() => this.$refs['input_ele'].focus());
117
+ }
118
+ },
119
+ watch: {
120
+ applyFocus(new_value){
121
+ if(new_value){
122
+ this.$nextTick(() => this.$refs['input_ele'].focus());
123
+ }
124
+ }
107
125
  },
108
126
  computed: {
109
127
  inputVal: {
@@ -118,6 +136,11 @@ export default {
118
136
  },
119
137
  methods: {
120
138
 
139
+ handleEscPress()
140
+ {
141
+ this.$emit('bail');
142
+ },
143
+
121
144
  /*
122
145
  * Concat message for count characters
123
146
  * @return string
@@ -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
+ :applyFocus="applyFocus"
30
+ />
31
+ <ToggleInputSelect
32
+ style="margin-top:2px;"
33
+ :size="'small'"
34
+ v-if="field.type === 'select' && (searchModels[field.key] || editingInput === field.key)"
35
+ :applyFocus="applyFocus"
36
+ :options="field.select_options"
37
+ v-model="searchModels[field.key]"
38
+ @input="val=>searchChange(val, field)"
39
+ />
40
+ <ToggleDateRangePicker
41
+ v-if="field.type === 'date_range' && (searchModels[field.key].start || searchModels[field.key].end || editingInput === field.key)"
42
+ name="date_range"
43
+ v-model="searchModels[field.key]"
44
+ @input="val=>searchChange(val, field)"
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>
@@ -62,20 +91,34 @@ 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."
109
+ },
110
+ searchDebounce: {
111
+ type: [Number],
112
+ default: 500
73
113
  }
74
- },
114
+ },
75
115
  data : function(){
76
116
  return {
77
117
  editingInput:false,
78
- searchModels:{}
118
+ searchModels:{},
119
+ anySearchActive: false,
120
+ applyFocus: false,
121
+ searchTimeout: null
79
122
  };
80
123
  },
81
124
  computed: {
@@ -97,36 +140,23 @@ export default {
97
140
 
98
141
  headers() {
99
142
  if(!this.fields){
100
- return Object.keys(this.items[0]);
143
+ return Object.keys(this.items[0]);
101
144
  }
102
145
  return this.fields;
103
146
  },
104
147
 
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
148
  },
122
149
  created : function(){
123
150
 
124
151
  if(this.fields){
152
+
125
153
  for (let i = 0; i < this.fields.length; i++) {
126
- let value = this.fields[i].type == 'date' ? this.setInitialDate(i) : this.fields[i].value;
154
+ let value = this.fields[i].type == 'date_range' ? this.setInitialDate(i) : (this.fields[i].value ?? '');
155
+
127
156
  let field_name = this.fields[i].key;
128
157
  this.$set( this.searchModels, field_name, value )
129
158
  if(value){
159
+ this.applyFocus = true;
130
160
  // if date has an initial value set, show it.
131
161
  if(typeof value.start !== 'undefined'){
132
162
  if(value.start.length) this.activateSearch(this.fields[i]);
@@ -137,20 +167,29 @@ export default {
137
167
  this.searchChange();
138
168
  }
139
169
  }
140
-
170
+
141
171
  },
142
172
 
143
173
  beforeDestroy: function () {
144
- },
145
- watch:{
146
-
147
174
  },
148
175
  mounted : function ()
149
176
  {
150
177
 
151
178
  },
152
-
179
+
153
180
  methods:{
181
+
182
+ handleTransitionEnd(event){
183
+ if(event.propertyName === 'height'){
184
+ if(this.anySearchActive && !this.applyFocus){
185
+ this.applyFocus = true;
186
+ }
187
+ if(!this.anySearchActive && this.applyFocus){
188
+ this.applyFocus = false;
189
+ }
190
+ }
191
+ },
192
+
154
193
  // set initial date
155
194
  setInitialDate(index){
156
195
  let value = this.fields[index].value;
@@ -160,36 +199,64 @@ export default {
160
199
 
161
200
  tableSearchActive(field)
162
201
  {
163
- if(field.type == 'date'){
164
- return (this.searchModels[field.key].start || this.searchModels[field.key].end || this.editingInput == field.key);
202
+ if(field.type === 'date_range'){
203
+ return (this.searchModels[field.key].start || this.searchModels[field.key].end || this.editingInput === field.key);
165
204
  }
166
- return (this.searchModels[field.key] || this.editingInput == field.key);
205
+ return (this.searchModels[field.key] || this.editingInput === field.key);
167
206
 
168
207
  },
169
208
 
209
+
210
+ getSearchModelTypeFromKey(key){
211
+ for(let i=0; i<this.fields.length; i++){
212
+ if(this.fields[i].key === key){
213
+ return this.fields[i].type;
214
+ }
215
+ }
216
+ return null;
217
+ },
218
+
170
219
  closeSearch(field){
220
+
171
221
  this.editingInput = false;
172
- this.searchModels[field.key] = field.type == 'date' ? { start: false, end: false} : '' ;
222
+ this.searchModels[field.key] = field.type === 'date_range' ? { start: false, end: false} : '' ;
223
+
224
+ // check if any search is active; if not, close/shrink header
225
+ let is_active = false;
226
+ for(const key in this.searchModels){
227
+
228
+ if(this.getSearchModelTypeFromKey(key) === 'date_range'){
229
+ if (this.searchModels[key].start || this.searchModels[key].end){
230
+ is_active = true;
231
+ break;
232
+ }
233
+ }else if(this.searchModels[key] && this.searchModels[key] !== ''){
234
+ is_active = true;
235
+ break;
236
+ }
237
+ }
238
+ this.anySearchActive = is_active;
173
239
  this.searchChange();
174
240
  },
175
241
 
176
242
  searchChange(){
177
- this.$emit('search', this.fieldsWithSearch);
243
+ clearTimeout(this.searchTimeout);
244
+ this.searchTimeout = setTimeout(()=>{
245
+ this.$emit('search', this.fieldsWithSearch);
246
+ },this.searchDebounce);
247
+
178
248
  },
179
249
 
180
250
  /* activateSearch
181
251
  * When a user clicks a searchable column name, show it as active, and focus the child input field (unless it's already active)
182
252
  */
183
253
  activateSearch(field){
184
- if(!field.filterable) return;
185
- if(field.type === 'date'){
186
- this.datePickerOpen = true;
187
- }
254
+ if(!field.filterable || field.readonly) return;
188
255
  this.editingInput = field.key;
189
- //this.$nextTick(() => this.$refs[this.editingInput + '-input'].focus())
256
+ this.anySearchActive = true;
190
257
  },
191
258
 
192
-
259
+
193
260
 
194
261
  }
195
262
  }
package/src/index.js CHANGED
@@ -83,8 +83,6 @@ import ToggleMetricFunnelChart from "./components/metrics/ToggleMetricFunnelChar
83
83
  import ToggleThreeDots from "./components/threedots/ToggleThreeDots.vue";
84
84
  import ToggleThreeDotsButton from "./components/threedots/ToggleThreeDotsButton.vue";
85
85
 
86
- import ToggleStatusBar from "./components/statusbar/ToggleStatusBar.vue";
87
-
88
86
  import ToggleCarousel from "./components/carousel/ToggleCarousel.vue";
89
87
  import ToggleCarouselSlide from "./components/carousel/ToggleCarouselSlide.vue";
90
88
 
@@ -160,7 +158,6 @@ const Components = {
160
158
  ToggleBoosterBasicButton,
161
159
  ToggleBoosterModal,
162
160
  ToggleContactSearch,
163
- ToggleStatusBar,
164
161
  ToggleCarousel,
165
162
  ToggleCarouselSlide,
166
163
  ToggleEmailCard,