toggle-components-library 1.36.1-beta.7 → 1.36.1-beta.9

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 (39) hide show
  1. package/dist/img/contacts-greyblue.ef6f8a9a.svg +1 -0
  2. package/dist/img/contacts-white.95d07c7a.svg +1 -0
  3. package/dist/toggle-components-library.common.js +243 -286
  4. package/dist/toggle-components-library.common.js.map +1 -1
  5. package/dist/toggle-components-library.css +1 -1
  6. package/dist/toggle-components-library.umd.js +243 -286
  7. package/dist/toggle-components-library.umd.js.map +1 -1
  8. package/dist/toggle-components-library.umd.min.js +1 -1
  9. package/dist/toggle-components-library.umd.min.js.map +1 -1
  10. package/package.json +1 -1
  11. package/src/components/buttons/ToggleMetricsButton.vue +3 -22
  12. package/src/components/carousel/ToggleCarousel.vue +16 -29
  13. package/src/components/carousel/ToggleCarouselSlide.vue +1 -1
  14. package/src/components/forms/ToggleDatePicker.vue +7 -3
  15. package/src/components/forms/ToggleInputCurrency.vue +10 -3
  16. package/src/components/forms/ToggleInputPercentage.vue +7 -1
  17. package/src/components/forms/ToggleInputSelect.vue +13 -7
  18. package/src/components/forms/ToggleInputText.vue +16 -7
  19. package/src/components/metrics/ToggleMetricSingleMetric.vue +7 -12
  20. package/src/components/metrics/ToggleMetricSparkLine.vue +3 -7
  21. package/src/components/mixins/mixins.js +2 -2
  22. package/src/components/statusbar/ToggleStatusBar.vue +74 -0
  23. package/src/components/tables/ToggleTable.vue +114 -49
  24. package/src/index.js +4 -3
  25. package/src/sass/includes/_as_buttons.scss +4 -47
  26. package/src/sass/includes/_as_cards.scss +0 -33
  27. package/src/sass/includes/_as_carousels.scss +0 -12
  28. package/src/sass/includes/_as_inputs.scss +854 -836
  29. package/src/sass/includes/_as_metrics.scss +0 -5
  30. package/src/sass/includes/_as_navs.scss +2 -18
  31. package/src/sass/includes/_as_statusbar.scss +179 -0
  32. package/src/sass/includes/_as_table.scss +163 -163
  33. package/src/sass/main.scss +1 -0
  34. package/dist/img/airship-feedback-hover.a207c947.svg +0 -10
  35. package/dist/img/airship-feedback.1f7c858c.svg +0 -10
  36. package/package-lock.json +0 -20285
  37. package/src/assets/icons/airship-feedback-hover.svg +0 -10
  38. package/src/assets/icons/airship-feedback.svg +0 -10
  39. package/src/components/cards/ToggleCommentCard.vue +0 -55
@@ -3,29 +3,56 @@
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) && applyFocus"
24
+ type="text"
25
+ :ref="field.key+'-input'"
26
+ v-model="searchModels[field.key]"
27
+ @input="searchChange()"
28
+ @bail="closeSearch(field)"
29
+ />
30
+ <ToggleInputSelect
31
+ style="margin-top:2px;"
32
+ :size="'small'"
33
+ v-if="field.type === 'select' && (searchModels[field.key] || editingInput === field.key) && applyFocus"
34
+ :options="field.select_options"
35
+ v-model="searchModels[field.key]"
36
+ @input="searchChange()"
37
+ />
38
+ <ToggleDateRangePicker
39
+ v-if="field.type === 'date_range' && (searchModels[field.key].start || searchModels[field.key].end || editingInput === field.key)"
40
+ name="date_range"
41
+ v-model="searchModels[field.key]"
42
+ @input="searchChange()"
43
+ />
24
44
  </div>
25
45
  </th>
26
-
46
+
27
47
  </tr>
28
48
  </thead>
49
+ <tr class="empty-table" v-if="(items && items.length === 0) && !loading">
50
+ <td :colspan="headers.length">
51
+ <div class="full">
52
+ <div class="empty-area"><p>{{ emptyTableMessage }}</p></div>
53
+ </div>
54
+ </td>
55
+ </tr>
29
56
  <tbody v-if="!$slots.default || !$slots.default.length">
30
57
  <ToggleTableRow v-for="(item, index) in items" :key="index" >
31
58
  <ToggleTableColumn v-for="(column, column_index) in item" :key="column_index">{{column}}</ToggleTableColumn>
@@ -62,20 +89,34 @@ export default {
62
89
  type: [Array]
63
90
  },
64
91
  total:{
65
- type: [Number]
92
+ type: [Number]
66
93
  },
67
94
  per_page:{
68
- type: [Number]
95
+ type: [Number]
69
96
  },
70
97
  page:{
71
98
  type: [Number],
72
99
  default:1
100
+ },
101
+ loading: {
102
+ type: Boolean
103
+ },
104
+ emptyTableMessage: {
105
+ type: String,
106
+ default: "No rows returned."
107
+ },
108
+ searchDebounce: {
109
+ type: [Number],
110
+ default: 500
73
111
  }
74
- },
112
+ },
75
113
  data : function(){
76
114
  return {
77
115
  editingInput:false,
78
- searchModels:{}
116
+ searchModels:{},
117
+ anySearchActive: false,
118
+ applyFocus: false,
119
+ searchTimeout: null
79
120
  };
80
121
  },
81
122
  computed: {
@@ -97,36 +138,23 @@ export default {
97
138
 
98
139
  headers() {
99
140
  if(!this.fields){
100
- return Object.keys(this.items[0]);
141
+ return Object.keys(this.items[0]);
101
142
  }
102
143
  return this.fields;
103
144
  },
104
145
 
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
146
  },
122
147
  created : function(){
123
148
 
124
149
  if(this.fields){
150
+
125
151
  for (let i = 0; i < this.fields.length; i++) {
126
- let value = this.fields[i].type == 'date' ? this.setInitialDate(i) : this.fields[i].value;
152
+ let value = this.fields[i].type == 'date_range' ? this.setInitialDate(i) : (this.fields[i].value ?? '');
153
+
127
154
  let field_name = this.fields[i].key;
128
155
  this.$set( this.searchModels, field_name, value )
129
156
  if(value){
157
+ this.applyFocus = true;
130
158
  // if date has an initial value set, show it.
131
159
  if(typeof value.start !== 'undefined'){
132
160
  if(value.start.length) this.activateSearch(this.fields[i]);
@@ -137,20 +165,29 @@ export default {
137
165
  this.searchChange();
138
166
  }
139
167
  }
140
-
168
+
141
169
  },
142
170
 
143
171
  beforeDestroy: function () {
144
- },
145
- watch:{
146
-
147
172
  },
148
173
  mounted : function ()
149
174
  {
150
175
 
151
176
  },
152
-
177
+
153
178
  methods:{
179
+
180
+ handleTransitionEnd(event){
181
+ if(event.propertyName === 'height'){
182
+ if(this.anySearchActive && !this.applyFocus){
183
+ this.applyFocus = true;
184
+ }
185
+ if(!this.anySearchActive && this.applyFocus){
186
+ this.applyFocus = false;
187
+ }
188
+ }
189
+ },
190
+
154
191
  // set initial date
155
192
  setInitialDate(index){
156
193
  let value = this.fields[index].value;
@@ -160,36 +197,64 @@ export default {
160
197
 
161
198
  tableSearchActive(field)
162
199
  {
163
- if(field.type == 'date'){
164
- return (this.searchModels[field.key].start || this.searchModels[field.key].end || this.editingInput == field.key);
200
+ if(field.type === 'date_range'){
201
+ return (this.searchModels[field.key].start || this.searchModels[field.key].end || this.editingInput === field.key);
165
202
  }
166
- return (this.searchModels[field.key] || this.editingInput == field.key);
203
+ return (this.searchModels[field.key] || this.editingInput === field.key);
167
204
 
168
205
  },
169
206
 
207
+
208
+ getSearchModelTypeFromKey(key){
209
+ for(let i=0; i<this.fields.length; i++){
210
+ if(this.fields[i].key === key){
211
+ return this.fields[i].type;
212
+ }
213
+ }
214
+ return null;
215
+ },
216
+
170
217
  closeSearch(field){
218
+
171
219
  this.editingInput = false;
172
- this.searchModels[field.key] = field.type == 'date' ? { start: false, end: false} : '' ;
220
+ this.searchModels[field.key] = field.type === 'date_range' ? { start: false, end: false} : '' ;
221
+
222
+ // check if any search is active; if not, close/shrink header
223
+ let is_active = false;
224
+ for(const key in this.searchModels){
225
+
226
+ if(this.getSearchModelTypeFromKey(key) === 'date_range'){
227
+ if (this.searchModels[key].start || this.searchModels[key].end){
228
+ is_active = true;
229
+ break;
230
+ }
231
+ }else if(this.searchModels[key] && this.searchModels[key] !== ''){
232
+ is_active = true;
233
+ break;
234
+ }
235
+ }
236
+ this.anySearchActive = is_active;
173
237
  this.searchChange();
174
238
  },
175
239
 
176
240
  searchChange(){
177
- this.$emit('search', this.fieldsWithSearch);
241
+ clearTimeout(this.searchTimeout);
242
+ this.searchTimeout = setTimeout(()=>{
243
+ this.$emit('search', this.fieldsWithSearch);
244
+ },this.searchDebounce);
245
+
178
246
  },
179
247
 
180
248
  /* activateSearch
181
249
  * When a user clicks a searchable column name, show it as active, and focus the child input field (unless it's already active)
182
250
  */
183
251
  activateSearch(field){
184
- if(!field.filterable) return;
185
- if(field.type === 'date'){
186
- this.datePickerOpen = true;
187
- }
252
+ if(!field.filterable || field.readonly) return;
188
253
  this.editingInput = field.key;
189
- //this.$nextTick(() => this.$refs[this.editingInput + '-input'].focus())
254
+ this.anySearchActive = true;
190
255
  },
191
256
 
192
-
257
+
193
258
 
194
259
  }
195
260
  }
package/src/index.js CHANGED
@@ -83,12 +83,13 @@ 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
+
86
88
  import ToggleCarousel from "./components/carousel/ToggleCarousel.vue";
87
89
  import ToggleCarouselSlide from "./components/carousel/ToggleCarouselSlide.vue";
88
90
 
89
91
  import ToggleEmailCard from "./components/cards/ToggleEmailCard.vue";
90
92
  import ToggleRewardsCard from "./components/cards/ToggleRewardsCard.vue";
91
- import ToggleCommentCard from "./components/cards/ToggleCommentCard.vue";
92
93
 
93
94
 
94
95
  import './sass/main.scss';
@@ -159,11 +160,11 @@ const Components = {
159
160
  ToggleBoosterBasicButton,
160
161
  ToggleBoosterModal,
161
162
  ToggleContactSearch,
163
+ ToggleStatusBar,
162
164
  ToggleCarousel,
163
165
  ToggleCarouselSlide,
164
166
  ToggleEmailCard,
165
- ToggleRewardsCard,
166
- ToggleCommentCard
167
+ ToggleRewardsCard
167
168
  }
168
169
 
169
170
  Object.keys(Components).forEach(name => {
@@ -395,7 +395,7 @@
395
395
  }
396
396
 
397
397
  &:hover .contacts-icon {
398
- background-color: white;
398
+ background-image: url("../assets/icons/contacts-white.svg");
399
399
  }
400
400
  }
401
401
  //icons
@@ -418,11 +418,9 @@
418
418
  }
419
419
 
420
420
  .contacts-icon {
421
- --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' height='.9em' viewBox='0 0 448 512'%3E%3C!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --%3E%3Cstyle%3Esvg%7Bfill:%23fff%7D%3C/style%3E%3Cpath d='M304 128a80 80 0 1 0 -160 0 80 80 0 1 0 160 0zM96 128a128 128 0 1 1 256 0A128 128 0 1 1 96 128zM49.3 464H398.7c-8.9-63.3-63.3-112-129-112H178.3c-65.7 0-120.1 48.7-129 112zM0 482.3C0 383.8 79.8 304 178.3 304h91.4C368.2 304 448 383.8 448 482.3c0 16.4-13.3 29.7-29.7 29.7H29.7C13.3 512 0 498.7 0 482.3z'/%3E%3C/svg%3E");
422
- background-color: #6d90b4;
423
- -webkit-mask: var(--svg);
424
- mask: var(--svg);
425
- mask-repeat: no-repeat;
421
+ background-image: url("../assets/icons/contacts-greyblue.svg");
422
+ background-repeat:no-repeat;
423
+ background-size:contain;
426
424
  margin-right: 6px;
427
425
  width: 14px;
428
426
  height: 14px;
@@ -430,47 +428,6 @@
430
428
  }
431
429
  }
432
430
 
433
- .toggle-metrics-button-small {
434
- padding: 0px 13px;
435
- font-size: 12px;
436
- &.mini-contacts {
437
- font-size: 0.65rem;
438
- padding: 5px 12px;
439
- }
440
- .heatmap-icon {
441
- width: 21px;
442
- height: 21px;
443
- }
444
- .email-icon {
445
- width: 25px;
446
- height: 25px;
447
- }
448
- .contacts-icon {
449
- --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' height='.8em' viewBox='0 0 448 512'%3E%3C!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --%3E%3Cstyle%3Esvg%7Bfill:%23fff%7D%3C/style%3E%3Cpath d='M304 128a80 80 0 1 0 -160 0 80 80 0 1 0 160 0zM96 128a128 128 0 1 1 256 0A128 128 0 1 1 96 128zM49.3 464H398.7c-8.9-63.3-63.3-112-129-112H178.3c-65.7 0-120.1 48.7-129 112zM0 482.3C0 383.8 79.8 304 178.3 304h91.4C368.2 304 448 383.8 448 482.3c0 16.4-13.3 29.7-29.7 29.7H29.7C13.3 512 0 498.7 0 482.3z'/%3E%3C/svg%3E");
450
- -webkit-mask: var(--svg);
451
- mask: var(--svg);
452
- mask-repeat: no-repeat;
453
- }
454
- }
455
-
456
- .toggle-metrics-button-large {
457
- padding: 23px 27px;
458
- font-size: 17px;
459
- &.mini-contacts {
460
- font-size: .92rem;
461
- padding: 10px 25px;
462
- }
463
- }
464
-
465
- .toggle-metrics-button-disabled {
466
- opacity: 0.3;
467
- cursor: default;
468
-
469
- .heatmap-icon, .email-icon, .contacts-icon {
470
- transform: none !important;
471
- }
472
- }
473
-
474
431
  .toggle-button-booster-badge {
475
432
  display: flex;
476
433
  align-items: center;
@@ -164,36 +164,3 @@
164
164
 
165
165
  }
166
166
 
167
- .toggle-comment-card {
168
- display: flex;
169
- flex-direction: row;
170
- width: 100%;
171
- height: 250px;
172
- border-radius: 18px;
173
- font-size: $toggle-font-size-regular;
174
- font-family: $toggle-font-family;
175
- }
176
-
177
- .toggle-comment-card-info {
178
- display: flex;
179
- flex-direction: column;
180
- justify-content: space-between;
181
- padding: 30px 30px 20px 30px;
182
- color: white;
183
- border-radius: 30px;
184
- width: 100%;
185
-
186
- .toggle-comment-card-text {
187
- text-align: justify;
188
- line-height: 1.5rem;
189
- text-overflow: ellipsis;
190
- -webkit-line-clamp: 6;
191
- -webkit-box-orient: vertical;
192
- overflow: hidden;
193
- display: -webkit-box;
194
-
195
- p {
196
- margin: 0
197
- }
198
- }
199
- }
@@ -28,10 +28,6 @@
28
28
  max-width: 100%;
29
29
  }
30
30
  }
31
- }
32
- .toggle-carousel-wrapper {
33
- position: relative;
34
-
35
31
  .toggle-carousel-button{
36
32
  width: 50px;
37
33
  height: 50px;
@@ -106,14 +102,6 @@
106
102
  }
107
103
  }
108
104
  }
109
- &--comments-left-arrow{
110
- left: -24px;
111
- opacity: 0.8;
112
- }
113
- &--comments-right-arrow{
114
- right: -24px !important;
115
- opacity: 0.8;
116
- }
117
105
  &--next{
118
106
  right: 20px;
119
107
  @media only screen and (max-width:768px){