slim-select 1.27.1 → 2.0.0
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/.nvmrc +1 -0
- package/.prettierrc +6 -0
- package/.vscode/extensions.json +3 -0
- package/.vscode/settings.json +15 -5
- package/README.md +2 -1
- package/dist/helper.d.ts +1 -4
- package/dist/index.d.ts +38 -58
- package/dist/render.d.ts +109 -0
- package/dist/select.d.ts +31 -20
- package/dist/settings.d.ts +33 -0
- package/dist/slimselect.cjs.js +2 -0
- package/dist/slimselect.cjs.js.map +1 -0
- package/dist/slimselect.css +1 -2
- package/dist/slimselect.css.map +1 -0
- package/dist/slimselect.es.js +2 -0
- package/dist/slimselect.es.js.map +1 -0
- package/dist/slimselect.global.js +2 -0
- package/dist/slimselect.global.js.map +1 -0
- package/dist/slimselect.js +2 -1970
- package/dist/slimselect.js.map +1 -0
- package/dist/slimselect.umd.js +2 -0
- package/dist/slimselect.umd.js.map +1 -0
- package/dist/store.d.ts +71 -0
- package/docs/assets/check-mark.svg +6 -0
- package/docs/assets/data.js +59 -0
- package/docs/assets/home.css +1 -0
- package/docs/assets/home.js +1 -0
- package/docs/assets/index.css +1 -0
- package/docs/assets/index.js +16 -0
- package/docs/assets/index2.js +274 -0
- package/docs/assets/index3.js +126 -0
- package/docs/assets/index4.js +60 -0
- package/docs/assets/install.js +34 -0
- package/docs/assets/selects.js +55 -0
- package/docs/index.html +18 -5
- package/docs.go +3 -1
- package/index.html +16 -0
- package/jest.config.js +7 -0
- package/package.json +39 -35
- package/src/docs/app.vue +185 -76
- package/src/docs/assets/scss/_variables.scss +26 -10
- package/src/docs/assets/scss/alert.scss +12 -0
- package/src/docs/assets/scss/animations.scss +5 -3
- package/src/docs/assets/scss/button.scss +21 -0
- package/src/docs/assets/scss/index.scss +8 -6
- package/src/docs/assets/scss/input.scss +2 -2
- package/src/docs/assets/scss/layout.scss +195 -65
- package/src/docs/assets/scss/misc.scss +144 -34
- package/src/docs/assets/scss/prism.scss +155 -153
- package/src/docs/env.d.ts +12 -0
- package/src/docs/images/check-mark.svg +6 -0
- package/src/docs/images/chrome.svg +22 -0
- package/src/docs/images/firefox.svg +58 -0
- package/src/docs/images/github.png +0 -0
- package/src/docs/images/ie.svg +11 -0
- package/src/docs/images/npm.png +0 -0
- package/src/docs/images/opera.svg +15 -0
- package/src/docs/images/safari.svg +22 -0
- package/src/docs/main.ts +27 -0
- package/src/docs/pages/data.vue +130 -0
- package/src/docs/pages/events/addable.vue +79 -0
- package/src/docs/pages/events/before_after_change.vue +140 -0
- package/src/docs/pages/events/before_after_open_close.vue +122 -0
- package/src/docs/pages/events/error.vue +59 -0
- package/src/docs/pages/events/index.vue +33 -0
- package/src/docs/pages/events/search.vue +154 -0
- package/src/docs/pages/events/search_filter.vue +45 -0
- package/src/docs/pages/home.vue +96 -116
- package/src/docs/pages/install.vue +47 -74
- package/src/docs/pages/methods/destroy.vue +66 -0
- package/src/docs/pages/methods/enable_disable.vue +70 -0
- package/src/docs/pages/methods/get_data.vue +81 -0
- package/src/docs/pages/methods/get_selected.vue +78 -0
- package/src/docs/pages/methods/index.vue +36 -0
- package/src/docs/pages/methods/open_close.vue +63 -0
- package/src/docs/pages/methods/search.vue +62 -0
- package/src/docs/pages/methods/set_data.vue +106 -0
- package/src/docs/pages/methods/set_selected.vue +70 -0
- package/src/docs/pages/selects.vue +108 -114
- package/src/docs/pages/settings/always_open.vue +88 -0
- package/src/docs/pages/settings/close_on_select.vue +69 -0
- package/src/docs/pages/settings/content_location.vue +64 -0
- package/src/docs/pages/settings/content_position.vue +86 -0
- package/src/docs/pages/settings/css.vue +73 -0
- package/src/docs/pages/settings/data_attributes.vue +39 -0
- package/src/docs/pages/settings/deselect.vue +69 -0
- package/src/docs/pages/settings/display.vue +88 -0
- package/src/docs/pages/settings/hide_selected.vue +73 -0
- package/src/docs/pages/settings/html.vue +86 -0
- package/src/docs/pages/settings/index.vue +73 -0
- package/src/docs/pages/settings/mandatory.vue +91 -0
- package/src/docs/pages/settings/min_max.vue +61 -0
- package/src/docs/pages/settings/open_position.vue +60 -0
- package/src/docs/pages/settings/placeholder.vue +72 -0
- package/src/docs/pages/settings/search.vue +140 -0
- package/src/docs/pages/settings/select.vue +32 -0
- package/src/docs/pages/settings/select_by_group.vue +46 -0
- package/src/docs/pages/settings/show_tooltip.vue +44 -0
- package/src/docs/pages/settings/styles.vue +51 -0
- package/src/docs/router.ts +41 -13
- package/src/slim-select/helper.ts +25 -86
- package/src/slim-select/index.ts +317 -420
- package/src/slim-select/render.test.ts +39 -0
- package/src/slim-select/render.ts +1129 -0
- package/src/slim-select/rollup.config.mjs +39 -0
- package/src/slim-select/select.test.ts +155 -0
- package/src/slim-select/select.ts +280 -108
- package/src/slim-select/settings.ts +68 -0
- package/src/slim-select/slimselect.scss +263 -278
- package/src/slim-select/store.test.ts +220 -0
- package/src/slim-select/store.ts +320 -0
- package/src/slim-select/tsconfig.json +11 -5
- package/src/vue/slimselect.vue +61 -0
- package/tsconfig.json +10 -29
- package/vite.config.ts +18 -0
- package/.browserslistrc +0 -4
- package/.postcssrc.js +0 -5
- package/.travis.yml +0 -22
- package/babel.config.js +0 -5
- package/dist/config.d.ts +0 -83
- package/dist/data.d.ts +0 -50
- package/dist/slim.d.ts +0 -50
- package/dist/slimselect.min.css +0 -1
- package/dist/slimselect.min.js +0 -1
- package/dist/slimselect.min.mjs +0 -1
- package/docs/css/app.d5840d21.css +0 -1
- package/docs/css/chunk-vendors.fa8199af.css +0 -1
- package/docs/css/home.57020178.css +0 -1
- package/docs/css/install.baa5d3fb.css +0 -1
- package/docs/css/methods.728c742a.css +0 -1
- package/docs/css/options.b28a32ef.css +0 -1
- package/docs/css/selects.1a7e1e6a.css +0 -1
- package/docs/js/app.238ee382.js +0 -2
- package/docs/js/app.238ee382.js.map +0 -1
- package/docs/js/chunk-vendors.5125e3d8.js +0 -21
- package/docs/js/chunk-vendors.5125e3d8.js.map +0 -1
- package/docs/js/home.e7b28581.js +0 -2
- package/docs/js/home.e7b28581.js.map +0 -1
- package/docs/js/install.d4300783.js +0 -2
- package/docs/js/install.d4300783.js.map +0 -1
- package/docs/js/methods.fa1608f1.js +0 -11
- package/docs/js/methods.fa1608f1.js.map +0 -1
- package/docs/js/options.2c4ceb87.js +0 -2
- package/docs/js/options.2c4ceb87.js.map +0 -1
- package/docs/js/selects.1eeba693.js +0 -2
- package/docs/js/selects.1eeba693.js.map +0 -1
- package/src/docs/pages/methods.vue +0 -427
- package/src/docs/pages/options.vue +0 -1480
- package/src/main.ts +0 -29
- package/src/shims-vue.d.ts +0 -8
- package/src/slim-select/config.ts +0 -118
- package/src/slim-select/data.ts +0 -377
- package/src/slim-select/slim.ts +0 -775
- package/tslint.json +0 -26
- package/vue.config.js +0 -23
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { defineComponent } from 'vue'
|
|
3
|
+
|
|
4
|
+
import SlimSelect from '../../../slim-select'
|
|
5
|
+
|
|
6
|
+
export default defineComponent({
|
|
7
|
+
name: 'Addable',
|
|
8
|
+
mounted() {
|
|
9
|
+
new SlimSelect({
|
|
10
|
+
select: this.$refs.addableSingle as HTMLSelectElement,
|
|
11
|
+
events: {
|
|
12
|
+
addable: (value: string) => {
|
|
13
|
+
return value
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
new SlimSelect({
|
|
19
|
+
select: this.$refs.addableMultiple as HTMLSelectElement,
|
|
20
|
+
events: {
|
|
21
|
+
addable: (value: string) => {
|
|
22
|
+
return {
|
|
23
|
+
text: value,
|
|
24
|
+
value: value.toLowerCase(),
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
})
|
|
29
|
+
},
|
|
30
|
+
})
|
|
31
|
+
</script>
|
|
32
|
+
|
|
33
|
+
<template>
|
|
34
|
+
<div id="addable" class="content">
|
|
35
|
+
<h2 class="header">addable</h2>
|
|
36
|
+
<p>Slim select has the ability to dynamically add options via the search input field</p>
|
|
37
|
+
<p>
|
|
38
|
+
addable is a callback which takes a function parameter. The return value can either be a string or an option
|
|
39
|
+
object.
|
|
40
|
+
</p>
|
|
41
|
+
|
|
42
|
+
<div class="row">
|
|
43
|
+
<select ref="addableSingle">
|
|
44
|
+
<option value="value1">Value 1</option>
|
|
45
|
+
<option value="value2">Value 2</option>
|
|
46
|
+
<option value="value3">Value 3</option>
|
|
47
|
+
</select>
|
|
48
|
+
<select ref="addableMultiple" multiple>
|
|
49
|
+
<option value="value1">Value 1</option>
|
|
50
|
+
<option value="value2">Value 2</option>
|
|
51
|
+
<option value="value3">Value 3</option>
|
|
52
|
+
</select>
|
|
53
|
+
</div>
|
|
54
|
+
|
|
55
|
+
<pre>
|
|
56
|
+
<code class="language-javascript">
|
|
57
|
+
new SlimSelect({
|
|
58
|
+
select: '#selectElement',
|
|
59
|
+
|
|
60
|
+
events: {
|
|
61
|
+
addable: function (value) {
|
|
62
|
+
// return false or null if you do not want to allow value to be submitted
|
|
63
|
+
if (value === 'bad') {return false}
|
|
64
|
+
|
|
65
|
+
// Return the value string
|
|
66
|
+
return value // Optional - value alteration // ex: value.toLowerCase()
|
|
67
|
+
|
|
68
|
+
// Optional - Return a valid data object. See methods/setData for list of valid options
|
|
69
|
+
return {
|
|
70
|
+
text: value,
|
|
71
|
+
value: value.toLowerCase()
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
})
|
|
76
|
+
</code>
|
|
77
|
+
</pre>
|
|
78
|
+
</div>
|
|
79
|
+
</template>
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { defineComponent } from 'vue'
|
|
3
|
+
|
|
4
|
+
import SlimSelect, { DataArray } from '../../../slim-select'
|
|
5
|
+
|
|
6
|
+
export default defineComponent({
|
|
7
|
+
name: 'BeforeAfterChange',
|
|
8
|
+
data() {
|
|
9
|
+
return {
|
|
10
|
+
beforeChangeSingle: [] as DataArray,
|
|
11
|
+
beforeChangeMultiple: [] as DataArray,
|
|
12
|
+
afterChangeSingle: [] as DataArray,
|
|
13
|
+
afterChangeMultiple: [] as DataArray,
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
mounted() {
|
|
17
|
+
new SlimSelect({
|
|
18
|
+
select: this.$refs.beforeChangeSingle as HTMLSelectElement,
|
|
19
|
+
events: {
|
|
20
|
+
beforeChange: (newValue: DataArray, oldValue: DataArray) => {
|
|
21
|
+
this.beforeChangeSingle = oldValue
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
new SlimSelect({
|
|
27
|
+
select: this.$refs.beforeChangeMultiple as HTMLSelectElement,
|
|
28
|
+
events: {
|
|
29
|
+
beforeChange: (newValue: DataArray, oldValue: DataArray) => {
|
|
30
|
+
this.beforeChangeMultiple = oldValue
|
|
31
|
+
return true
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
new SlimSelect({
|
|
37
|
+
select: this.$refs.afterChangeSingle as HTMLSelectElement,
|
|
38
|
+
events: {
|
|
39
|
+
afterChange: (value: DataArray) => {
|
|
40
|
+
this.afterChangeSingle = value
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
new SlimSelect({
|
|
46
|
+
select: this.$refs.afterChangeMultiple as HTMLSelectElement,
|
|
47
|
+
events: {
|
|
48
|
+
afterChange: (value: DataArray) => {
|
|
49
|
+
this.afterChangeMultiple = value
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
})
|
|
53
|
+
},
|
|
54
|
+
})
|
|
55
|
+
</script>
|
|
56
|
+
|
|
57
|
+
<template>
|
|
58
|
+
<div id="beforeChange" class="content">
|
|
59
|
+
<h2 class="header">beforeChange</h2>
|
|
60
|
+
<p>
|
|
61
|
+
beforeOnChange will trigger a callback on an option click and will allow you the ability to halt if the value it
|
|
62
|
+
produces isnt to your liking. In order to stop the change from happening just return false on the callback.
|
|
63
|
+
Returning nothing or true will allow it to continue as normal.
|
|
64
|
+
</p>
|
|
65
|
+
|
|
66
|
+
<div v-if="beforeChangeSingle">
|
|
67
|
+
<strong>Before change: {{ beforeChangeSingle }}</strong>
|
|
68
|
+
</div>
|
|
69
|
+
|
|
70
|
+
<select ref="beforeChangeSingle">
|
|
71
|
+
<option value="value1">Value 1</option>
|
|
72
|
+
<option value="value2">Value 2</option>
|
|
73
|
+
<option value="value3">Value 3</option>
|
|
74
|
+
</select>
|
|
75
|
+
<br />
|
|
76
|
+
|
|
77
|
+
<div v-if="beforeChangeMultiple">
|
|
78
|
+
<strong>Before change: {{ beforeChangeMultiple }}</strong>
|
|
79
|
+
</div>
|
|
80
|
+
|
|
81
|
+
<select ref="beforeChangeMultiple" multiple>
|
|
82
|
+
<option value="value1" selected>Value 1</option>
|
|
83
|
+
<option value="value2">Value 2</option>
|
|
84
|
+
<option value="value3">Value 3</option>
|
|
85
|
+
</select>
|
|
86
|
+
|
|
87
|
+
<pre>
|
|
88
|
+
<code class="language-javascript">
|
|
89
|
+
new SlimSelect({
|
|
90
|
+
select: '#selectElement',
|
|
91
|
+
events: {
|
|
92
|
+
beforeChange: (newVal, oldVal) => {
|
|
93
|
+
console.log(newVal)
|
|
94
|
+
return false // this will stop the change from happening
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
})
|
|
98
|
+
</code>
|
|
99
|
+
</pre>
|
|
100
|
+
</div>
|
|
101
|
+
|
|
102
|
+
<div id="afterChange" class="content">
|
|
103
|
+
<h2 class="header">afterChange</h2>
|
|
104
|
+
<p>afterChange will trigger a callback after the value of the select dropdown has changed.</p>
|
|
105
|
+
|
|
106
|
+
<div v-if="afterChangeSingle">
|
|
107
|
+
<strong>After change: {{ afterChangeSingle }}</strong>
|
|
108
|
+
</div>
|
|
109
|
+
|
|
110
|
+
<select ref="afterChangeSingle">
|
|
111
|
+
<option value="value1">Value 1</option>
|
|
112
|
+
<option value="value2">Value 2</option>
|
|
113
|
+
<option value="value3">Value 3</option>
|
|
114
|
+
</select>
|
|
115
|
+
<br />
|
|
116
|
+
|
|
117
|
+
<div v-if="afterChangeMultiple">
|
|
118
|
+
<strong>After change: {{ afterChangeMultiple }}</strong>
|
|
119
|
+
</div>
|
|
120
|
+
|
|
121
|
+
<select ref="afterChangeMultiple" multiple>
|
|
122
|
+
<option value="value1" selected>Value 1</option>
|
|
123
|
+
<option value="value2">Value 2</option>
|
|
124
|
+
<option value="value3">Value 3</option>
|
|
125
|
+
</select>
|
|
126
|
+
|
|
127
|
+
<pre>
|
|
128
|
+
<code class="language-javascript">
|
|
129
|
+
new SlimSelect({
|
|
130
|
+
select: '#selectElement',
|
|
131
|
+
events: {
|
|
132
|
+
afterChange: (newVal) => {
|
|
133
|
+
console.log(newVal)
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
})
|
|
137
|
+
</code>
|
|
138
|
+
</pre>
|
|
139
|
+
</div>
|
|
140
|
+
</template>
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { defineComponent } from 'vue'
|
|
3
|
+
|
|
4
|
+
import SlimSelect from '../../../slim-select'
|
|
5
|
+
|
|
6
|
+
export default defineComponent({
|
|
7
|
+
name: 'BeForeAfterOpenClose',
|
|
8
|
+
data() {
|
|
9
|
+
return {
|
|
10
|
+
beforeAfterOpenCloseSingle: null as SlimSelect | null,
|
|
11
|
+
singleState: '',
|
|
12
|
+
beforeAfterOpenCloseMultiple: null as SlimSelect | null,
|
|
13
|
+
multipleState: '',
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
mounted() {
|
|
17
|
+
this.beforeAfterOpenCloseSingle = new SlimSelect({
|
|
18
|
+
select: this.$refs.beforeAfterOpenCloseSingle as HTMLSelectElement,
|
|
19
|
+
events: {
|
|
20
|
+
beforeOpen: () => {
|
|
21
|
+
this.setState('single', 'beforeOpen')
|
|
22
|
+
},
|
|
23
|
+
afterOpen: () => {
|
|
24
|
+
this.setState('single', 'afterOpen')
|
|
25
|
+
},
|
|
26
|
+
beforeClose: () => {
|
|
27
|
+
this.setState('single', 'beforeClose')
|
|
28
|
+
},
|
|
29
|
+
afterClose: () => {
|
|
30
|
+
this.setState('single', 'afterClose')
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
this.beforeAfterOpenCloseMultiple = new SlimSelect({
|
|
36
|
+
select: this.$refs.beforeAfterOpenCloseMultiple as HTMLSelectElement,
|
|
37
|
+
events: {
|
|
38
|
+
beforeOpen: () => {
|
|
39
|
+
this.setState('multiple', 'beforeOpen')
|
|
40
|
+
},
|
|
41
|
+
afterOpen: () => {
|
|
42
|
+
this.setState('multiple', 'afterOpen')
|
|
43
|
+
},
|
|
44
|
+
beforeClose: () => {
|
|
45
|
+
this.setState('multiple', 'beforeClose')
|
|
46
|
+
},
|
|
47
|
+
afterClose: () => {
|
|
48
|
+
this.setState('multiple', 'afterClose')
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
})
|
|
52
|
+
},
|
|
53
|
+
methods: {
|
|
54
|
+
setState(el: string, state: string) {
|
|
55
|
+
if (el === 'single') {
|
|
56
|
+
this.singleState = state
|
|
57
|
+
} else {
|
|
58
|
+
this.multipleState = state
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Set timer to clear state
|
|
62
|
+
setTimeout(() => {
|
|
63
|
+
if (el === 'single') {
|
|
64
|
+
this.singleState = ''
|
|
65
|
+
} else {
|
|
66
|
+
this.multipleState = ''
|
|
67
|
+
}
|
|
68
|
+
}, 1000)
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
})
|
|
72
|
+
</script>
|
|
73
|
+
|
|
74
|
+
<template>
|
|
75
|
+
<div id="open" class="content">
|
|
76
|
+
<h2 class="header">beforeOpen / afterOpen / beforeClose / afterClose</h2>
|
|
77
|
+
<p>
|
|
78
|
+
The beforeOpen, afterOpen, beforeClose, and afterClose events will fire before and after the select is opened and
|
|
79
|
+
closed.
|
|
80
|
+
</p>
|
|
81
|
+
|
|
82
|
+
<div class="row">
|
|
83
|
+
<div>
|
|
84
|
+
<div>State: {{ singleState }}</div>
|
|
85
|
+
<select ref="beforeAfterOpenCloseSingle">
|
|
86
|
+
<option value="value1">Value 1</option>
|
|
87
|
+
<option value="value2">Value 2</option>
|
|
88
|
+
<option value="value3">Value 3</option>
|
|
89
|
+
</select>
|
|
90
|
+
</div>
|
|
91
|
+
<div>
|
|
92
|
+
<div>State: {{ multipleState }}</div>
|
|
93
|
+
<select ref="beforeAfterOpenCloseMultiple" multiple>
|
|
94
|
+
<option value="value1">Value 1</option>
|
|
95
|
+
<option value="value2">Value 2</option>
|
|
96
|
+
<option value="value3">Value 3</option>
|
|
97
|
+
</select>
|
|
98
|
+
</div>
|
|
99
|
+
</div>
|
|
100
|
+
<pre>
|
|
101
|
+
<code class="language-javascript">
|
|
102
|
+
var select = new SlimSelect({
|
|
103
|
+
select: '#selectElement',
|
|
104
|
+
events: {
|
|
105
|
+
beforeOpen: () => {
|
|
106
|
+
console.log('before open')
|
|
107
|
+
},
|
|
108
|
+
afterOpen: () => {
|
|
109
|
+
console.log('after open')
|
|
110
|
+
},
|
|
111
|
+
beforeClose: () => {
|
|
112
|
+
console.log('before close')
|
|
113
|
+
},
|
|
114
|
+
afterClose: () => {
|
|
115
|
+
console.log('after close')
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
})
|
|
119
|
+
</code>
|
|
120
|
+
</pre>
|
|
121
|
+
</div>
|
|
122
|
+
</template>
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { defineComponent } from 'vue'
|
|
3
|
+
|
|
4
|
+
import SlimSelect from '../../../slim-select'
|
|
5
|
+
|
|
6
|
+
export default defineComponent({
|
|
7
|
+
name: 'Error',
|
|
8
|
+
data() {
|
|
9
|
+
return {
|
|
10
|
+
errorSingle: null as SlimSelect | null,
|
|
11
|
+
errMsg: '',
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
mounted() {
|
|
15
|
+
this.errorSingle = new SlimSelect({
|
|
16
|
+
select: this.$refs.errorSingle as HTMLSelectElement,
|
|
17
|
+
events: {
|
|
18
|
+
error: (err: Error) => {
|
|
19
|
+
this.errMsg = err.message
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
})
|
|
23
|
+
},
|
|
24
|
+
})
|
|
25
|
+
</script>
|
|
26
|
+
|
|
27
|
+
<template>
|
|
28
|
+
<div id="error" class="content">
|
|
29
|
+
<h2 class="header">error</h2>
|
|
30
|
+
<p>The error event is fired when an error occurs. The error message is passed as the first argument.</p>
|
|
31
|
+
<div class="alert info">
|
|
32
|
+
If you are are having issues with slim select finding the select element. Try delaying new SlimSelect() call as
|
|
33
|
+
the select dom element might not be available yet.
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
<div v-if="errMsg !== ''"><b>Error:</b> {{ errMsg }}</div>
|
|
37
|
+
|
|
38
|
+
<div class="row">
|
|
39
|
+
<select ref="notError">
|
|
40
|
+
<option value="1">Option 1</option>
|
|
41
|
+
<option value="2">Option 2</option>
|
|
42
|
+
<option value="3">Option 3</option>
|
|
43
|
+
</select>
|
|
44
|
+
</div>
|
|
45
|
+
|
|
46
|
+
<pre>
|
|
47
|
+
<code class="language-javascript">
|
|
48
|
+
var select = new SlimSelect({
|
|
49
|
+
select: '#selectElement',
|
|
50
|
+
events: {
|
|
51
|
+
error: function(err) {
|
|
52
|
+
console.error(err)
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
})
|
|
56
|
+
</code>
|
|
57
|
+
</pre>
|
|
58
|
+
</div>
|
|
59
|
+
</template>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { defineComponent } from 'vue'
|
|
3
|
+
|
|
4
|
+
import Error from './error.vue'
|
|
5
|
+
import BeforeAfterChange from './before_after_change.vue'
|
|
6
|
+
import BeforeAfterOpenClose from './before_after_open_close.vue'
|
|
7
|
+
import Search from './search.vue'
|
|
8
|
+
import SearchFilter from './search_filter.vue'
|
|
9
|
+
import Addable from './addable.vue'
|
|
10
|
+
|
|
11
|
+
export default defineComponent({
|
|
12
|
+
name: 'Events',
|
|
13
|
+
components: {
|
|
14
|
+
Error,
|
|
15
|
+
BeforeAfterChange,
|
|
16
|
+
BeforeAfterOpenClose,
|
|
17
|
+
Search,
|
|
18
|
+
SearchFilter,
|
|
19
|
+
Addable,
|
|
20
|
+
},
|
|
21
|
+
})
|
|
22
|
+
</script>
|
|
23
|
+
|
|
24
|
+
<template>
|
|
25
|
+
<div id="events" class="contents">
|
|
26
|
+
<Error />
|
|
27
|
+
<BeforeAfterChange />
|
|
28
|
+
<BeforeAfterOpenClose />
|
|
29
|
+
<Search />
|
|
30
|
+
<SearchFilter />
|
|
31
|
+
<Addable />
|
|
32
|
+
</div>
|
|
33
|
+
</template>
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
<script lang="ts" setup>
|
|
2
|
+
import { onMounted, Ref, ref } from 'vue'
|
|
3
|
+
|
|
4
|
+
import SlimSelect, { DataArray, Option } from '../../../slim-select'
|
|
5
|
+
|
|
6
|
+
interface Person {
|
|
7
|
+
first_name: string
|
|
8
|
+
last_name: string
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
let searchData: Person[] = []
|
|
12
|
+
let searchSingle: Ref<HTMLSelectElement | null> = ref(null)
|
|
13
|
+
let searchMultiple: Ref<HTMLSelectElement | null> = ref(null)
|
|
14
|
+
|
|
15
|
+
// Go fetch some gofakeit data via post to json
|
|
16
|
+
fetch('https://api.gofakeit.com/json', {
|
|
17
|
+
method: 'POST',
|
|
18
|
+
headers: {
|
|
19
|
+
'Content-Type': 'application/json',
|
|
20
|
+
},
|
|
21
|
+
body: JSON.stringify({
|
|
22
|
+
type: 'array',
|
|
23
|
+
rowcount: 1000,
|
|
24
|
+
indent: false,
|
|
25
|
+
fields: [
|
|
26
|
+
{ name: 'first_name', function: 'firstname', params: {} },
|
|
27
|
+
{ name: 'last_name', function: 'lastname', params: {} },
|
|
28
|
+
],
|
|
29
|
+
}),
|
|
30
|
+
})
|
|
31
|
+
.then((response) => response.json())
|
|
32
|
+
.then((data: Person[]) => {
|
|
33
|
+
searchData = data
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
onMounted(() => {
|
|
37
|
+
new SlimSelect({
|
|
38
|
+
select: searchSingle.value!,
|
|
39
|
+
settings: {
|
|
40
|
+
placeholderText: 'Search First or Last Name',
|
|
41
|
+
searchingText: 'Searching Users...',
|
|
42
|
+
searchHighlight: true,
|
|
43
|
+
},
|
|
44
|
+
events: {
|
|
45
|
+
search: searchPromise,
|
|
46
|
+
},
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
new SlimSelect({
|
|
50
|
+
select: searchMultiple.value!,
|
|
51
|
+
settings: {
|
|
52
|
+
placeholderText: 'Search First or Last Name',
|
|
53
|
+
searchingText: 'Searching Users...',
|
|
54
|
+
searchHighlight: true,
|
|
55
|
+
},
|
|
56
|
+
events: {
|
|
57
|
+
search: searchPromise,
|
|
58
|
+
},
|
|
59
|
+
})
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
function searchPromise(search: string, selectedData: DataArray): Promise<Option[]> {
|
|
63
|
+
return new Promise((resolve, reject) => {
|
|
64
|
+
if (search.length < 2) {
|
|
65
|
+
return reject('Search must be at least 2 characters')
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const results = searchData.filter((person) => {
|
|
69
|
+
return (
|
|
70
|
+
person.first_name.toLowerCase().includes(search.toLowerCase()) ||
|
|
71
|
+
person.last_name.toLowerCase().includes(search.toLowerCase())
|
|
72
|
+
)
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
if (results.length === 0) {
|
|
76
|
+
return reject('No results found')
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Convert the results to an array of options
|
|
80
|
+
let options = results.map((person) => {
|
|
81
|
+
return {
|
|
82
|
+
text: `${person.first_name} ${person.last_name}`,
|
|
83
|
+
value: `${person.first_name} ${person.last_name}`,
|
|
84
|
+
}
|
|
85
|
+
}) as Option[]
|
|
86
|
+
|
|
87
|
+
// Simulate a slow search
|
|
88
|
+
setTimeout(() => {
|
|
89
|
+
resolve(options)
|
|
90
|
+
}, 300)
|
|
91
|
+
})
|
|
92
|
+
}
|
|
93
|
+
</script>
|
|
94
|
+
|
|
95
|
+
<template>
|
|
96
|
+
<div id="search" class="content">
|
|
97
|
+
<h2 class="header">search</h2>
|
|
98
|
+
<p>
|
|
99
|
+
Slim select allows you to syncronize result values from your promise response.<br />
|
|
100
|
+
Call callback() method with slimselect data, false or string with specific string.
|
|
101
|
+
</p>
|
|
102
|
+
|
|
103
|
+
<div class="row">
|
|
104
|
+
<select ref="searchSingle"></select>
|
|
105
|
+
<select ref="searchMultiple" multiple></select>
|
|
106
|
+
</div>
|
|
107
|
+
|
|
108
|
+
<pre>
|
|
109
|
+
<code class="language-javascript">
|
|
110
|
+
new SlimSelect({
|
|
111
|
+
select: '#selectElement',
|
|
112
|
+
events: {
|
|
113
|
+
search: (search, currentData) => {
|
|
114
|
+
return new Promise((resolve, reject) => {
|
|
115
|
+
if (search.length < 2) {
|
|
116
|
+
return reject('Search must be at least 2 characters')
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Fetch random first and last name data
|
|
120
|
+
fetch('https://api.gofakeit.com/json', {
|
|
121
|
+
method: 'POST',
|
|
122
|
+
headers: {
|
|
123
|
+
'Content-Type': 'application/json',
|
|
124
|
+
},
|
|
125
|
+
body: JSON.stringify({
|
|
126
|
+
type: 'array',
|
|
127
|
+
rowcount: 10,
|
|
128
|
+
indent: false,
|
|
129
|
+
fields: [
|
|
130
|
+
{ name: 'first_name', function: 'firstname', params: {} },
|
|
131
|
+
{ name: 'last_name', function: 'lastname', params: {} },
|
|
132
|
+
],
|
|
133
|
+
}),
|
|
134
|
+
})
|
|
135
|
+
.then((response) => response.json())
|
|
136
|
+
.then((data) => {
|
|
137
|
+
// Take data and generate array of options
|
|
138
|
+
const options = data.map((person) => {
|
|
139
|
+
return {
|
|
140
|
+
text: `${person.first_name} ${person.last_name}`,
|
|
141
|
+
value: `${person.first_name} ${person.last_name}`,
|
|
142
|
+
}
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
resolve(options)
|
|
146
|
+
})
|
|
147
|
+
})
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
})
|
|
151
|
+
</code>
|
|
152
|
+
</pre>
|
|
153
|
+
</div>
|
|
154
|
+
</template>
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { defineComponent } from 'vue'
|
|
3
|
+
|
|
4
|
+
import SlimSelect from '../../../slim-select'
|
|
5
|
+
|
|
6
|
+
export default defineComponent({
|
|
7
|
+
name: 'SearchFilter',
|
|
8
|
+
mounted() {
|
|
9
|
+
new SlimSelect({
|
|
10
|
+
select: this.$refs.searchFilter as HTMLSelectElement,
|
|
11
|
+
events: {
|
|
12
|
+
searchFilter: (option: any, search: any) => option.text.substr(0, search.length) === search,
|
|
13
|
+
},
|
|
14
|
+
})
|
|
15
|
+
},
|
|
16
|
+
})
|
|
17
|
+
</script>
|
|
18
|
+
|
|
19
|
+
<template>
|
|
20
|
+
<div id="searchFilter" class="content">
|
|
21
|
+
<h2 class="header">searchFilter</h2>
|
|
22
|
+
<p>searchFilter event is used to replace the default matching algorithm.</p>
|
|
23
|
+
<p>See Data for the proper object interface of <em>option</em>.</p>
|
|
24
|
+
|
|
25
|
+
<select ref="searchFilter">
|
|
26
|
+
<option value="apple">Apple</option>
|
|
27
|
+
<option value="orange">Orange</option>
|
|
28
|
+
<option value="pineapple">Pineapple</option>
|
|
29
|
+
</select>
|
|
30
|
+
|
|
31
|
+
<pre>
|
|
32
|
+
<code class="language-javascript">
|
|
33
|
+
new SlimSelect({
|
|
34
|
+
select: '#selectElement',
|
|
35
|
+
events: {
|
|
36
|
+
// Exact case sensitive start of string match
|
|
37
|
+
searchFilter: (option, search) => {
|
|
38
|
+
return option.text.substr(0, search.length) === search
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
})
|
|
42
|
+
</code>
|
|
43
|
+
</pre>
|
|
44
|
+
</div>
|
|
45
|
+
</template>
|