diff --git a/src/lib/components/filters/parsedTagList.svelte b/src/lib/components/filters/parsedTagList.svelte index edbd5161e0..88ccc66a0a 100644 --- a/src/lib/components/filters/parsedTagList.svelte +++ b/src/lib/components/filters/parsedTagList.svelte @@ -1,35 +1,246 @@ -{#if $parsedTags?.length} - + + {#if $parsedTags?.length} {#each $parsedTags as tag (tag.tag)} - { - const t = $tags.filter((t) => t.tag.includes(tag.tag.split(' ')[0])); - t.forEach((t) => (t ? queries.removeFilter(t) : null)); - queries.apply(); - parsedTags.update((tags) => tags.filter((t) => t.tag !== tag.tag)); - }}> - {#key tag.tag} - {tag.tag} - {/key} - - + + {@const parts = parseTagParts(tag.tag)} + {@const property = (tag as ParsedTag).title} + + {#each parts as part} + + + + {#if part.operator} + {part.text} + {:else} + {part.text + .split(' or ') + .map((t) => capitalize(t)) + .join(' or ')} + {/if} + + + {#if property} + {@const filter = getFilterFor(property)} + {#if filter} + {@const isArray = filter?.array} + {@const selectedArray = Array.isArray(tag.value) + ? tag.value + : []} + {#each filter.options as option (filter.title + option.value + option.label)} + + { + if (isArray) { + const exists = + selectedArray.includes( + option.value + ); + const next = exists + ? selectedArray.filter( + (v) => + v !== option.value + ) + : [ + ...selectedArray, + option.value + ]; + addFilterAndApply( + filter.id, + filter.title, + filter.operator, + null, + next, + $columns, + analyticsSource + ); + } else { + addFilterAndApply( + filter.id, + filter.title, + filter.operator, + option.value, + [], + $columns, + analyticsSource + ); + } + }}> + + {#if isArray} + + {/if} + {capitalize(option.label)} + + + + {/each} + {/if} + {/if} + + + + {/each} + { + const t = $tags.filter((t) => + t.tag.includes((tag as ParsedTag).title) + ); + t.forEach((t) => (t ? queries.removeFilter(t) : null)); + queries.apply(); + parsedTags.update((tags) => tags.filter((t) => t.tag !== tag.tag)); + }}> + + + {tag?.value?.toString()} {/each} + {/if} + + + {#if placeholders?.length} + {#each placeholders as filter (filter.title + filter.id)} + + + + + {capitalize(filter.title)} + + { + e.stopPropagation(); + if (!hiddenPlaceholders.includes(filter.title)) { + hiddenPlaceholders = [...hiddenPlaceholders, filter.title]; + } + }}> + + + + + {#if filter.options} + {#each filter.options as option (filter.title + option.value + option.label)} + + { + addFilterAndApply( + filter.id, + filter.title, + filter.operator, + filter?.array ? null : option.value, + filter?.array ? [option.value] : [], + $columns, + analyticsSource + ); + }}> + {capitalize(option.label)} + + + {/each} + {/if} + + + + {/each} + {/if} + + {#if $parsedTags?.length} - -{/if} + {/if} + + {#if filterCols?.length && !$isSmallViewport} + + {/if} + diff --git a/src/lib/components/filters/quickFilters.svelte b/src/lib/components/filters/quickFilters.svelte index 76bbf90c5f..233fa7358b 100644 --- a/src/lib/components/filters/quickFilters.svelte +++ b/src/lib/components/filters/quickFilters.svelte @@ -22,9 +22,12 @@ - {#each filterCols.filter((f) => f?.options) as filter (filter.title + filter.id)} diff --git a/src/lib/components/filters/setFilters.ts b/src/lib/components/filters/setFilters.ts index e6f07083c6..301a66a0a7 100644 --- a/src/lib/components/filters/setFilters.ts +++ b/src/lib/components/filters/setFilters.ts @@ -3,7 +3,11 @@ import { get, writable } from 'svelte/store'; import { type FilterData } from './quickFilters'; import { tags, type TagValue } from './store'; -export const parsedTags = writable([]); +export type ParsedTag = TagValue & { + title: string; +}; + +export const parsedTags = writable([]); export function setFilters(localTags: TagValue[], filterCols: FilterData[], $columns: Column[]) { if (!localTags?.length) { @@ -47,9 +51,10 @@ export function setFilterData(filter: FilterData) { }); } cleanOldTags(filter?.title); - const newTag = { + const newTag: ParsedTag = { tag: tagData.tag.replace(',', ' or '), - value: tagData.value + value: tagData.value, + title: filter.title }; parsedTags.update((tags) => { @@ -69,9 +74,10 @@ export function setTimeFilter(filter: FilterData, columns: Column[]) { const ranges = col.elements as { value: string; label: string }[]; const timeRange = ranges.find((range) => range.value === timeTag.value); if (timeRange) { - const newTag = { + const newTag: ParsedTag = { tag: `**${filter.title}** is **${timeRange.label}**`, - value: timeRange.value + value: timeRange.value, + title: filter.title }; cleanOldTags(filter?.title); @@ -102,9 +108,10 @@ export function setSizeFilter(filter: FilterData, columns: Column[]) { if (sizeRange) { cleanOldTags(filter?.title); - const newTag = { + const newTag: ParsedTag = { tag: `**${filter.title}** is **${sizeRange.label}**`, - value: sizeTag.value + value: sizeTag.value, + title: filter.title }; parsedTags.update((tags) => { tags.push(newTag); @@ -126,9 +133,10 @@ export function setStatusCodeFilter(filter: FilterData, columns: Column[]) { const codeRange = ranges.find((c) => c?.value && c.value === statusCodeTag.value); if (codeRange) { cleanOldTags(filter?.title); - const newTag = { + const newTag: ParsedTag = { tag: `**${filter.title}** is **${codeRange.label}**`, - value: statusCodeTag.value + value: statusCodeTag.value, + title: filter.title }; parsedTags.update((tags) => { tags.push(newTag); @@ -156,9 +164,10 @@ export function setDateFilter(filter: FilterData, columns: Column[]) { }); if (dateRange) { cleanOldTags(filter?.title); - const newTag = { + const newTag: ParsedTag = { tag: `**${filter.title}** is **${dateRange.label}**`, - value: dateTag.value + value: dateTag.value, + title: filter.title }; parsedTags.update((tags) => { tags.push(newTag); diff --git a/src/lib/layout/responsiveContainerHeader.svelte b/src/lib/layout/responsiveContainerHeader.svelte index 98e10321b8..7812f34f94 100644 --- a/src/lib/layout/responsiveContainerHeader.svelte +++ b/src/lib/layout/responsiveContainerHeader.svelte @@ -1,12 +1,7 @@