toggle-components-library 1.36.1-beta.7 → 1.36.1-beta.8
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/ToggleInputSelect.vue +13 -7
- package/src/components/forms/ToggleInputText.vue +15 -6
- 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/tables/ToggleTable.vue +114 -49
- package/src/index.js +1 -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 +851 -838
- package/src/sass/includes/_as_metrics.scss +0 -5
- package/src/sass/includes/_as_navs.scss +2 -18
- package/src/sass/includes/_as_table.scss +163 -163
- 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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<button :class="['toggle-metrics-button', buttonStyle
|
|
3
|
-
<div :class="icon"
|
|
2
|
+
<button :class="['toggle-metrics-button', buttonStyle]" @click="click">
|
|
3
|
+
<div :class="icon"></div>
|
|
4
4
|
<slot>{{buttonText}}</slot>
|
|
5
5
|
</button>
|
|
6
6
|
</template>
|
|
@@ -19,27 +19,8 @@
|
|
|
19
19
|
},
|
|
20
20
|
icon: {
|
|
21
21
|
type: String,
|
|
22
|
-
required:
|
|
23
|
-
validator: function(value) {
|
|
24
|
-
return ["heatmap-icon", "email-icon", "contacts-icon"].indexOf(value) !== -1;
|
|
25
|
-
}
|
|
22
|
+
required: true,
|
|
26
23
|
},
|
|
27
|
-
size: {
|
|
28
|
-
type: String,
|
|
29
|
-
default: "medium",
|
|
30
|
-
required: false,
|
|
31
|
-
validator: function(value) {
|
|
32
|
-
return ["small", "medium", "large"].indexOf(value) !== -1;
|
|
33
|
-
}
|
|
34
|
-
},
|
|
35
|
-
styles: {
|
|
36
|
-
type: Object,
|
|
37
|
-
required: false,
|
|
38
|
-
},
|
|
39
|
-
disabled: {
|
|
40
|
-
type: Boolean,
|
|
41
|
-
default: false
|
|
42
|
-
}
|
|
43
24
|
},
|
|
44
25
|
methods: {
|
|
45
26
|
click() {
|
|
@@ -1,34 +1,28 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
:
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
>
|
|
13
|
-
|
|
14
|
-
</swiper>
|
|
15
|
-
<div v-if="carouselPrev && shouldShowArrows"
|
|
2
|
+
<swiper
|
|
3
|
+
ref="swiper"
|
|
4
|
+
class="swiper toggle-carousel"
|
|
5
|
+
:class="[
|
|
6
|
+
carouselStyle == 'voucher' && slidesLength > 1 ? 'toggle-carousel--voucher' : '',
|
|
7
|
+
carouselStyle == 'voucher' && isEnd && slidesLength > 1 ? 'toggle-carousel--voucher-end' : ''
|
|
8
|
+
]"
|
|
9
|
+
:options="carouselOptions"
|
|
10
|
+
@slideChangeTransitionStart="onSlideTransition"
|
|
11
|
+
>
|
|
12
|
+
<slot></slot>
|
|
13
|
+
<div v-if="carouselPrev && slidesLength > 1"
|
|
16
14
|
class="toggle-carousel-button toggle-carousel-button--prev"
|
|
17
|
-
:class="['toggle-carousel-button--' + carouselNavPosition,
|
|
18
|
-
{'toggle-carousel-button--disabled': prevDisabled},
|
|
19
|
-
{'toggle-carousel-button--comments-left-arrow': carouselStyle == 'comments'}]"
|
|
15
|
+
:class="['toggle-carousel-button--' + carouselNavPosition, {'toggle-carousel-button--disabled': prevDisabled}]"
|
|
20
16
|
@click="slidePrev"
|
|
21
17
|
slot="button-prev"
|
|
22
18
|
></div>
|
|
23
|
-
<div v-if="carouselNext &&
|
|
19
|
+
<div v-if="carouselNext && slidesLength > 1"
|
|
24
20
|
class="toggle-carousel-button toggle-carousel-button--next"
|
|
25
|
-
:class="['toggle-carousel-button--' + carouselNavPosition,
|
|
26
|
-
{'toggle-carousel-button--disabled': nextDisabled},
|
|
27
|
-
{'toggle-carousel-button--comments-right-arrow': carouselStyle == 'comments'}]"
|
|
21
|
+
:class="['toggle-carousel-button--' + carouselNavPosition, {'toggle-carousel-button--disabled': nextDisabled}]"
|
|
28
22
|
@click="$refs.swiper.swiperInstance.slideNext()"
|
|
29
23
|
slot="button-next"
|
|
30
24
|
></div>
|
|
31
|
-
</
|
|
25
|
+
</swiper>
|
|
32
26
|
</template>
|
|
33
27
|
|
|
34
28
|
<script>
|
|
@@ -44,7 +38,6 @@ export default {
|
|
|
44
38
|
prevDisabled: false,
|
|
45
39
|
nextDisabled: false,
|
|
46
40
|
slidesLength: 0,
|
|
47
|
-
slidesShownPerView: 0,
|
|
48
41
|
isEnd: false
|
|
49
42
|
};
|
|
50
43
|
},
|
|
@@ -105,7 +98,6 @@ export default {
|
|
|
105
98
|
},
|
|
106
99
|
refreshCarousel(){
|
|
107
100
|
this.slidesLength = this.$refs.swiper.swiperInstance.slides.length;
|
|
108
|
-
this.slidesShownPerView = this.$refs.swiper.swiperInstance.slidesPerViewDynamic()
|
|
109
101
|
this.onSlideTransition();
|
|
110
102
|
},
|
|
111
103
|
onSlideTransition(){
|
|
@@ -129,11 +121,6 @@ export default {
|
|
|
129
121
|
this.nextDisabled = false;
|
|
130
122
|
}
|
|
131
123
|
}
|
|
132
|
-
},
|
|
133
|
-
computed: {
|
|
134
|
-
shouldShowArrows() {
|
|
135
|
-
return this.slidesLength > this.slidesShownPerView
|
|
136
|
-
}
|
|
137
124
|
}
|
|
138
125
|
}
|
|
139
126
|
</script>
|
|
@@ -1,18 +1,18 @@
|
|
|
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 : '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: {
|
|
@@ -87,6 +92,7 @@ export default {
|
|
|
87
92
|
},
|
|
88
93
|
|
|
89
94
|
created : function(){
|
|
95
|
+
|
|
90
96
|
},
|
|
91
97
|
computed: {
|
|
92
98
|
inputVal: {
|
|
@@ -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
|
>
|
|
@@ -103,7 +105,9 @@ export default {
|
|
|
103
105
|
}
|
|
104
106
|
},
|
|
105
107
|
|
|
106
|
-
created : function()
|
|
108
|
+
created : function()
|
|
109
|
+
{
|
|
110
|
+
this.$nextTick(() => this.$refs['input_ele'].focus());
|
|
107
111
|
},
|
|
108
112
|
computed: {
|
|
109
113
|
inputVal: {
|
|
@@ -118,6 +122,11 @@ export default {
|
|
|
118
122
|
},
|
|
119
123
|
methods: {
|
|
120
124
|
|
|
125
|
+
handleEscPress()
|
|
126
|
+
{
|
|
127
|
+
this.$emit('bail');
|
|
128
|
+
},
|
|
129
|
+
|
|
121
130
|
/*
|
|
122
131
|
* Concat message for count characters
|
|
123
132
|
* @return string
|
|
@@ -2,9 +2,7 @@
|
|
|
2
2
|
<div>
|
|
3
3
|
<h3 class="toggle-metric metric-label">{{label}}</h3>
|
|
4
4
|
<div class="single-metric-icon" v-if="metricPending && label.length == 0"></div>
|
|
5
|
-
<h1 class="toggle-metric metric-value" v-else>{{metricValue}}
|
|
6
|
-
<span v-if="score && value.maxScore" class="toggle-metric-score-rating">/{{value.maxScore}}</span>
|
|
7
|
-
</h1>
|
|
5
|
+
<h1 class="toggle-metric metric-value" v-else>{{metricValue}}</h1>
|
|
8
6
|
</div>
|
|
9
7
|
</template>
|
|
10
8
|
|
|
@@ -23,20 +21,20 @@ export default {
|
|
|
23
21
|
type: String,
|
|
24
22
|
default: "ToggleMetricSingleMetric"
|
|
25
23
|
},
|
|
26
|
-
|
|
24
|
+
/**
|
|
27
25
|
* Type of the value, this will affect on the format shown
|
|
28
26
|
*/
|
|
29
27
|
type : {
|
|
30
28
|
type: String,
|
|
31
29
|
validator: function (value) {
|
|
32
|
-
return ['text', 'number', 'percentage', 'currency'
|
|
30
|
+
return ['text', 'number', 'percentage', 'currency'].indexOf(value) !== -1
|
|
33
31
|
}
|
|
34
32
|
},
|
|
35
33
|
/**
|
|
36
34
|
* Component's value
|
|
37
35
|
*/
|
|
38
36
|
value: {
|
|
39
|
-
type: [String, Number
|
|
37
|
+
type: [String, Number],
|
|
40
38
|
required: true
|
|
41
39
|
},
|
|
42
40
|
/**
|
|
@@ -89,17 +87,14 @@ export default {
|
|
|
89
87
|
case 'currency':
|
|
90
88
|
return (this.value/this.currencyDenomination).toLocaleString(this.currencyLocale, {style: 'currency', currency: this.currencyCode});
|
|
91
89
|
case'percentage':
|
|
92
|
-
return `${this.value}
|
|
93
|
-
case 'score':
|
|
94
|
-
return this.value.score;
|
|
90
|
+
return `${this.value} %`
|
|
95
91
|
default:
|
|
96
92
|
return this.value.toLocaleString();
|
|
97
93
|
|
|
98
94
|
}
|
|
99
|
-
},
|
|
100
|
-
score() {
|
|
101
|
-
return this.type === 'score';
|
|
102
95
|
}
|
|
96
|
+
|
|
97
|
+
|
|
103
98
|
}
|
|
104
99
|
}
|
|
105
100
|
|
|
@@ -54,14 +54,14 @@ export default {
|
|
|
54
54
|
type : {
|
|
55
55
|
type: String,
|
|
56
56
|
validator: function (value) {
|
|
57
|
-
return ['text', 'number', 'percentage', 'currency'
|
|
57
|
+
return ['text', 'number', 'percentage', 'currency'].indexOf(value) !== -1
|
|
58
58
|
}
|
|
59
59
|
},
|
|
60
60
|
/**
|
|
61
61
|
* single metric component value
|
|
62
62
|
*/
|
|
63
63
|
singleMetricVal: {
|
|
64
|
-
type: [String, Number
|
|
64
|
+
type: [String, Number],
|
|
65
65
|
required: true
|
|
66
66
|
},
|
|
67
67
|
/**
|
|
@@ -112,10 +112,6 @@ export default {
|
|
|
112
112
|
inverse_trend_impact: {
|
|
113
113
|
type: Boolean,
|
|
114
114
|
default: false
|
|
115
|
-
},
|
|
116
|
-
showTrendForAllZeros: {
|
|
117
|
-
type: Boolean,
|
|
118
|
-
default: false
|
|
119
115
|
}
|
|
120
116
|
},
|
|
121
117
|
|
|
@@ -199,7 +195,7 @@ export default {
|
|
|
199
195
|
|
|
200
196
|
const trendImpactVals = this.sparkLineVal[0].data[0].y || this.sparkLineVal[0].data[0].y === 0 ? this.sparkLineVal[0].data.map(data => data.y) : this.sparkLineVal[0].data;
|
|
201
197
|
|
|
202
|
-
let result = this.calcTrendImpact(trendImpactVals, this.trend_impact_base
|
|
198
|
+
let result = this.calcTrendImpact(trendImpactVals, this.trend_impact_base);
|
|
203
199
|
|
|
204
200
|
if (this.inverse_trend_impact === true && result != false)
|
|
205
201
|
return result *-1;
|
|
@@ -139,10 +139,10 @@ export const charts = {
|
|
|
139
139
|
*
|
|
140
140
|
* @return { {Integer} 1, 0,-1 }
|
|
141
141
|
*/
|
|
142
|
-
calcTrendImpact(values, trend_impact_base
|
|
142
|
+
calcTrendImpact(values, trend_impact_base){
|
|
143
143
|
|
|
144
144
|
// If all values in the values array are 0 return 0;
|
|
145
|
-
if (
|
|
145
|
+
if (values.every((val) => val === 0)){
|
|
146
146
|
return false;
|
|
147
147
|
}
|
|
148
148
|
|
|
@@ -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' && (searchModels[field.key].start || searchModels[field.key].end || editingInput === field.key)"
|
|
40
|
+
name="date"
|
|
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' ? 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'){
|
|
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' ? { 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'){
|
|
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
|
@@ -88,7 +88,6 @@ import ToggleCarouselSlide from "./components/carousel/ToggleCarouselSlide.vue";
|
|
|
88
88
|
|
|
89
89
|
import ToggleEmailCard from "./components/cards/ToggleEmailCard.vue";
|
|
90
90
|
import ToggleRewardsCard from "./components/cards/ToggleRewardsCard.vue";
|
|
91
|
-
import ToggleCommentCard from "./components/cards/ToggleCommentCard.vue";
|
|
92
91
|
|
|
93
92
|
|
|
94
93
|
import './sass/main.scss';
|
|
@@ -162,8 +161,7 @@ const Components = {
|
|
|
162
161
|
ToggleCarousel,
|
|
163
162
|
ToggleCarouselSlide,
|
|
164
163
|
ToggleEmailCard,
|
|
165
|
-
ToggleRewardsCard
|
|
166
|
-
ToggleCommentCard
|
|
164
|
+
ToggleRewardsCard
|
|
167
165
|
}
|
|
168
166
|
|
|
169
167
|
Object.keys(Components).forEach(name => {
|