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.
Files changed (155) hide show
  1. package/.nvmrc +1 -0
  2. package/.prettierrc +6 -0
  3. package/.vscode/extensions.json +3 -0
  4. package/.vscode/settings.json +15 -5
  5. package/README.md +2 -1
  6. package/dist/helper.d.ts +1 -4
  7. package/dist/index.d.ts +38 -58
  8. package/dist/render.d.ts +109 -0
  9. package/dist/select.d.ts +31 -20
  10. package/dist/settings.d.ts +33 -0
  11. package/dist/slimselect.cjs.js +2 -0
  12. package/dist/slimselect.cjs.js.map +1 -0
  13. package/dist/slimselect.css +1 -2
  14. package/dist/slimselect.css.map +1 -0
  15. package/dist/slimselect.es.js +2 -0
  16. package/dist/slimselect.es.js.map +1 -0
  17. package/dist/slimselect.global.js +2 -0
  18. package/dist/slimselect.global.js.map +1 -0
  19. package/dist/slimselect.js +2 -1970
  20. package/dist/slimselect.js.map +1 -0
  21. package/dist/slimselect.umd.js +2 -0
  22. package/dist/slimselect.umd.js.map +1 -0
  23. package/dist/store.d.ts +71 -0
  24. package/docs/assets/check-mark.svg +6 -0
  25. package/docs/assets/data.js +59 -0
  26. package/docs/assets/home.css +1 -0
  27. package/docs/assets/home.js +1 -0
  28. package/docs/assets/index.css +1 -0
  29. package/docs/assets/index.js +16 -0
  30. package/docs/assets/index2.js +274 -0
  31. package/docs/assets/index3.js +126 -0
  32. package/docs/assets/index4.js +60 -0
  33. package/docs/assets/install.js +34 -0
  34. package/docs/assets/selects.js +55 -0
  35. package/docs/index.html +18 -5
  36. package/docs.go +3 -1
  37. package/index.html +16 -0
  38. package/jest.config.js +7 -0
  39. package/package.json +39 -35
  40. package/src/docs/app.vue +185 -76
  41. package/src/docs/assets/scss/_variables.scss +26 -10
  42. package/src/docs/assets/scss/alert.scss +12 -0
  43. package/src/docs/assets/scss/animations.scss +5 -3
  44. package/src/docs/assets/scss/button.scss +21 -0
  45. package/src/docs/assets/scss/index.scss +8 -6
  46. package/src/docs/assets/scss/input.scss +2 -2
  47. package/src/docs/assets/scss/layout.scss +195 -65
  48. package/src/docs/assets/scss/misc.scss +144 -34
  49. package/src/docs/assets/scss/prism.scss +155 -153
  50. package/src/docs/env.d.ts +12 -0
  51. package/src/docs/images/check-mark.svg +6 -0
  52. package/src/docs/images/chrome.svg +22 -0
  53. package/src/docs/images/firefox.svg +58 -0
  54. package/src/docs/images/github.png +0 -0
  55. package/src/docs/images/ie.svg +11 -0
  56. package/src/docs/images/npm.png +0 -0
  57. package/src/docs/images/opera.svg +15 -0
  58. package/src/docs/images/safari.svg +22 -0
  59. package/src/docs/main.ts +27 -0
  60. package/src/docs/pages/data.vue +130 -0
  61. package/src/docs/pages/events/addable.vue +79 -0
  62. package/src/docs/pages/events/before_after_change.vue +140 -0
  63. package/src/docs/pages/events/before_after_open_close.vue +122 -0
  64. package/src/docs/pages/events/error.vue +59 -0
  65. package/src/docs/pages/events/index.vue +33 -0
  66. package/src/docs/pages/events/search.vue +154 -0
  67. package/src/docs/pages/events/search_filter.vue +45 -0
  68. package/src/docs/pages/home.vue +96 -116
  69. package/src/docs/pages/install.vue +47 -74
  70. package/src/docs/pages/methods/destroy.vue +66 -0
  71. package/src/docs/pages/methods/enable_disable.vue +70 -0
  72. package/src/docs/pages/methods/get_data.vue +81 -0
  73. package/src/docs/pages/methods/get_selected.vue +78 -0
  74. package/src/docs/pages/methods/index.vue +36 -0
  75. package/src/docs/pages/methods/open_close.vue +63 -0
  76. package/src/docs/pages/methods/search.vue +62 -0
  77. package/src/docs/pages/methods/set_data.vue +106 -0
  78. package/src/docs/pages/methods/set_selected.vue +70 -0
  79. package/src/docs/pages/selects.vue +108 -114
  80. package/src/docs/pages/settings/always_open.vue +88 -0
  81. package/src/docs/pages/settings/close_on_select.vue +69 -0
  82. package/src/docs/pages/settings/content_location.vue +64 -0
  83. package/src/docs/pages/settings/content_position.vue +86 -0
  84. package/src/docs/pages/settings/css.vue +73 -0
  85. package/src/docs/pages/settings/data_attributes.vue +39 -0
  86. package/src/docs/pages/settings/deselect.vue +69 -0
  87. package/src/docs/pages/settings/display.vue +88 -0
  88. package/src/docs/pages/settings/hide_selected.vue +73 -0
  89. package/src/docs/pages/settings/html.vue +86 -0
  90. package/src/docs/pages/settings/index.vue +73 -0
  91. package/src/docs/pages/settings/mandatory.vue +91 -0
  92. package/src/docs/pages/settings/min_max.vue +61 -0
  93. package/src/docs/pages/settings/open_position.vue +60 -0
  94. package/src/docs/pages/settings/placeholder.vue +72 -0
  95. package/src/docs/pages/settings/search.vue +140 -0
  96. package/src/docs/pages/settings/select.vue +32 -0
  97. package/src/docs/pages/settings/select_by_group.vue +46 -0
  98. package/src/docs/pages/settings/show_tooltip.vue +44 -0
  99. package/src/docs/pages/settings/styles.vue +51 -0
  100. package/src/docs/router.ts +41 -13
  101. package/src/slim-select/helper.ts +25 -86
  102. package/src/slim-select/index.ts +317 -420
  103. package/src/slim-select/render.test.ts +39 -0
  104. package/src/slim-select/render.ts +1129 -0
  105. package/src/slim-select/rollup.config.mjs +39 -0
  106. package/src/slim-select/select.test.ts +155 -0
  107. package/src/slim-select/select.ts +280 -108
  108. package/src/slim-select/settings.ts +68 -0
  109. package/src/slim-select/slimselect.scss +263 -278
  110. package/src/slim-select/store.test.ts +220 -0
  111. package/src/slim-select/store.ts +320 -0
  112. package/src/slim-select/tsconfig.json +11 -5
  113. package/src/vue/slimselect.vue +61 -0
  114. package/tsconfig.json +10 -29
  115. package/vite.config.ts +18 -0
  116. package/.browserslistrc +0 -4
  117. package/.postcssrc.js +0 -5
  118. package/.travis.yml +0 -22
  119. package/babel.config.js +0 -5
  120. package/dist/config.d.ts +0 -83
  121. package/dist/data.d.ts +0 -50
  122. package/dist/slim.d.ts +0 -50
  123. package/dist/slimselect.min.css +0 -1
  124. package/dist/slimselect.min.js +0 -1
  125. package/dist/slimselect.min.mjs +0 -1
  126. package/docs/css/app.d5840d21.css +0 -1
  127. package/docs/css/chunk-vendors.fa8199af.css +0 -1
  128. package/docs/css/home.57020178.css +0 -1
  129. package/docs/css/install.baa5d3fb.css +0 -1
  130. package/docs/css/methods.728c742a.css +0 -1
  131. package/docs/css/options.b28a32ef.css +0 -1
  132. package/docs/css/selects.1a7e1e6a.css +0 -1
  133. package/docs/js/app.238ee382.js +0 -2
  134. package/docs/js/app.238ee382.js.map +0 -1
  135. package/docs/js/chunk-vendors.5125e3d8.js +0 -21
  136. package/docs/js/chunk-vendors.5125e3d8.js.map +0 -1
  137. package/docs/js/home.e7b28581.js +0 -2
  138. package/docs/js/home.e7b28581.js.map +0 -1
  139. package/docs/js/install.d4300783.js +0 -2
  140. package/docs/js/install.d4300783.js.map +0 -1
  141. package/docs/js/methods.fa1608f1.js +0 -11
  142. package/docs/js/methods.fa1608f1.js.map +0 -1
  143. package/docs/js/options.2c4ceb87.js +0 -2
  144. package/docs/js/options.2c4ceb87.js.map +0 -1
  145. package/docs/js/selects.1eeba693.js +0 -2
  146. package/docs/js/selects.1eeba693.js.map +0 -1
  147. package/src/docs/pages/methods.vue +0 -427
  148. package/src/docs/pages/options.vue +0 -1480
  149. package/src/main.ts +0 -29
  150. package/src/shims-vue.d.ts +0 -8
  151. package/src/slim-select/config.ts +0 -118
  152. package/src/slim-select/data.ts +0 -377
  153. package/src/slim-select/slim.ts +0 -775
  154. package/tslint.json +0 -26
  155. 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 &lt; 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>