|
13 | 13 | export let filters;
|
14 | 14 | export let updateTable;
|
15 | 15 | export let pageIndex;
|
| 16 | + export let toStringFn: undefined | ((value: any) => string) = undefined; |
16 | 17 |
|
17 | 18 | // If the filter is applied and the displayed values are filtered
|
18 | 19 | let active = false;
|
| 20 | + let type: string = 'string'; |
| 21 | + let isDate = false; |
| 22 | + let dropdowns: { |
| 23 | + option: FilterOptionsEnum; |
| 24 | + value: string | number | Date | undefined; |
| 25 | + }[] = []; |
| 26 | +
|
| 27 | + // Check the type of the column |
| 28 | + $values.forEach((item) => { |
| 29 | + if (item) { |
| 30 | + type = typeof (toFilterableValueFn ? toFilterableValueFn(item) : item); |
| 31 | +
|
| 32 | + if (type === 'object') { |
| 33 | + if ((toFilterableValueFn ? toFilterableValueFn(item) : item) instanceof Date) { |
| 34 | + isDate = true; |
| 35 | + } |
| 36 | + } |
| 37 | + } |
| 38 | + }); |
19 | 39 |
|
20 | 40 | // Options for different types of values
|
21 | 41 | const options = {
|
|
99 | 119 | ]
|
100 | 120 | };
|
101 | 121 |
|
102 |
| - let dropdowns: { |
103 |
| - option: FilterOptionsEnum; |
104 |
| - value: string | number | Date | undefined; |
105 |
| - }[] = []; |
106 |
| -
|
107 | 122 | // Unique ID for the column filter popup
|
108 | 123 | const popupId = `${tableId}-${id}`;
|
109 | 124 | // Popup config
|
|
113 | 128 | placement: 'bottom-start'
|
114 | 129 | };
|
115 | 130 |
|
116 |
| - let type: string = 'string'; |
117 |
| - let isDate = false; |
118 |
| - // Check the type of the column |
119 |
| - $values.forEach((item) => { |
120 |
| - if (item) { |
121 |
| - type = typeof (toFilterableValueFn ? toFilterableValueFn(item) : item); |
| 131 | + const stringValues = $values.map((item) => (toStringFn ? toStringFn(item) : item)); |
122 | 132 |
|
123 |
| - if (type === 'object') { |
124 |
| - if (item instanceof Date) { |
125 |
| - isDate = true; |
126 |
| - } |
127 |
| - } |
128 |
| - } |
129 |
| - }); |
| 133 | + const missingValues = stringValues.reduce((acc, item, index) => { |
| 134 | + acc[typeof item === 'string' ? item.toLowerCase() : item] = $values[index]; |
| 135 | + return acc; |
| 136 | + }, {}); |
| 137 | +
|
| 138 | + const getMissingValue = (value: string) => { |
| 139 | + return Object.keys(missingValues).includes(value.toLowerCase()) |
| 140 | + ? missingValues[value.toLowerCase()] |
| 141 | + : value; |
| 142 | + }; |
130 | 143 |
|
131 | 144 | const optionChangeHandler = (e, index) => {
|
132 | 145 | delete $filters[id][dropdowns[index].option];
|
133 |
| - $filters[id] = { ...$filters[id], [e.target.value]: dropdowns[index].value }; |
| 146 | + $filters[id] = { |
| 147 | + ...$filters[id], |
| 148 | + [e.target.value]: getMissingValue(dropdowns[index].value as string) |
| 149 | + }; |
134 | 150 | $filters = $filters;
|
135 | 151 |
|
136 | 152 | dropdowns[index] = {
|
|
142 | 158 | const valueChangeHandler = (e, index) => {
|
143 | 159 | dropdowns[index] = {
|
144 | 160 | ...dropdowns[index],
|
145 |
| - value: |
146 |
| - type === 'number' |
147 |
| - ? +e.target.value |
148 |
| - : type === 'date' |
149 |
| - ? new Date(e.target.value) |
150 |
| - : e.target.value |
| 161 | + value: type === 'date' ? new Date(e.target.value) : e.target.value |
151 | 162 | };
|
152 | 163 |
|
153 | 164 | $filters = {
|
154 | 165 | ...$filters,
|
155 |
| - [id]: { ...$filters[id], [dropdowns[index].option]: dropdowns[index].value } |
| 166 | + [id]: { |
| 167 | + ...$filters[id], |
| 168 | + [dropdowns[index].option]: |
| 169 | + type === 'number' |
| 170 | + ? parseFloat(getMissingValue(e.target.value)) || undefined |
| 171 | + : getMissingValue(e.target.value) |
| 172 | + } |
156 | 173 | };
|
157 | 174 | };
|
158 | 175 |
|
|
201 | 218 |
|
202 | 219 | // Start by adding the default filter
|
203 | 220 | $: addFilter(options[type][0].value, undefined);
|
| 221 | +
|
| 222 | + $: console.log($filters); |
204 | 223 | </script>
|
205 | 224 |
|
206 | 225 | <form class="">
|
|
258 | 277 | {/if}
|
259 | 278 | </div>
|
260 | 279 |
|
261 |
| - {#if type === 'number'} |
| 280 | + <!-- {#if type === 'number'} |
262 | 281 | <input
|
263 | 282 | type="number"
|
264 | 283 | class="input p-1 border border-primary-500"
|
265 | 284 | on:input={(e) => valueChangeHandler(e, index)}
|
266 | 285 | bind:value={dropdown.value}
|
267 |
| - /> |
268 |
| - {:else if type === 'string'} |
| 286 | + /> --> |
| 287 | + {#if type === 'number' || type === 'string'} |
269 | 288 | <input
|
270 | 289 | type="text"
|
271 | 290 | class="input p-1 border border-primary-500"
|
|
0 commit comments