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.
- package/dist/img/contacts-greyblue.ef6f8a9a.svg +1 -0
- package/dist/img/contacts-white.95d07c7a.svg +1 -0
- package/dist/toggle-components-library.common.js +243 -286
- package/dist/toggle-components-library.common.js.map +1 -1
- package/dist/toggle-components-library.css +1 -1
- package/dist/toggle-components-library.umd.js +243 -286
- package/dist/toggle-components-library.umd.js.map +1 -1
- package/dist/toggle-components-library.umd.min.js +1 -1
- package/dist/toggle-components-library.umd.min.js.map +1 -1
- package/package.json +1 -1
- package/src/components/buttons/ToggleMetricsButton.vue +3 -22
- package/src/components/carousel/ToggleCarousel.vue +16 -29
- package/src/components/carousel/ToggleCarouselSlide.vue +1 -1
- package/src/components/forms/ToggleDatePicker.vue +7 -3
- package/src/components/forms/ToggleInputCurrency.vue +10 -3
- package/src/components/forms/ToggleInputPercentage.vue +7 -1
- package/src/components/forms/ToggleInputSelect.vue +13 -7
- package/src/components/forms/ToggleInputText.vue +16 -7
- package/src/components/metrics/ToggleMetricSingleMetric.vue +7 -12
- package/src/components/metrics/ToggleMetricSparkLine.vue +3 -7
- package/src/components/mixins/mixins.js +2 -2
- package/src/components/statusbar/ToggleStatusBar.vue +74 -0
- package/src/components/tables/ToggleTable.vue +114 -49
- package/src/index.js +4 -3
- package/src/sass/includes/_as_buttons.scss +4 -47
- package/src/sass/includes/_as_cards.scss +0 -33
- package/src/sass/includes/_as_carousels.scss +0 -12
- package/src/sass/includes/_as_inputs.scss +854 -836
- package/src/sass/includes/_as_metrics.scss +0 -5
- package/src/sass/includes/_as_navs.scss +2 -18
- package/src/sass/includes/_as_statusbar.scss +179 -0
- package/src/sass/includes/_as_table.scss +163 -163
- package/src/sass/main.scss +1 -0
- package/dist/img/airship-feedback-hover.a207c947.svg +0 -10
- package/dist/img/airship-feedback.1f7c858c.svg +0 -10
- package/package-lock.json +0 -20285
- package/src/assets/icons/airship-feedback-hover.svg +0 -10
- package/src/assets/icons/airship-feedback.svg +0 -10
- 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':
|
|
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
|
-
<
|
|
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 == '
|
|
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
|
|
164
|
-
return (this.searchModels[field.key].start || this.searchModels[field.key].end || this.editingInput
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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-
|
|
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
|
-
|
|
422
|
-
background-
|
|
423
|
-
-
|
|
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){
|