Skip to content

Commit 6047f61

Browse files
feat: add intersect util
1 parent 3ef72ef commit 6047f61

File tree

2 files changed

+17
-11
lines changed

2 files changed

+17
-11
lines changed

website/src/catalog/RuleItem.vue

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<script setup lang="ts">
22
import { type PropType, computed } from 'vue'
33
4-
import { type RuleMeta, type Filter, languages } from './data'
4+
import { type RuleMeta, type Filter, languages, intersect } from './data'
55
import Option from './Option.vue'
66
77
const { meta, filter } = defineProps({
@@ -37,13 +37,13 @@ const displayedRules = computed(() => {
3737
const result = sortedOptions(meta.rules, filter.selectedRuleFilters)
3838
return result.slice(0, displayRuleCount.value)
3939
})
40-
const moreRules = computed(() => meta.rules.length - displayRuleCount.value)
40+
const moreRules = computed(() => meta.rules.slice(displayRuleCount.value))
4141
4242
const displayFeatures = computed(() => {
4343
const result = sortedOptions(meta.features, filter.selectedFeatures)
4444
return result.slice(0, 2)
4545
})
46-
const moreFeatures = computed(() => Math.max(displayFeatures.value.length - 2, 0))
46+
const moreFeatures = computed(() => meta.features.slice(2))
4747
</script>
4848

4949
<template>
@@ -76,9 +76,10 @@ const moreFeatures = computed(() => Math.max(displayFeatures.value.length - 2, 0
7676
:highlight="filter.selectedRuleFilters.includes(rule)"
7777
/>
7878
<Option
79-
v-if="moreRules"
80-
:text="`+${moreRules}`"
81-
:data-title="meta.rules.slice(displayRuleCount).join(', ')"
79+
v-if="moreRules.length"
80+
:text="`+${moreRules.length}`"
81+
:data-title="moreRules.join(', ')"
82+
:highlight="intersect(moreRules, filter.selectedRuleFilters)"
8283
/>
8384
</template>
8485
</div>
@@ -91,9 +92,10 @@ const moreFeatures = computed(() => Math.max(displayFeatures.value.length - 2, 0
9192
:highlight="filter.selectedFeatures.includes(feature)"
9293
/>
9394
<Option
94-
v-if="moreFeatures"
95-
:text="`+${moreFeatures}`"
96-
:data-title="meta.features.slice(2).join(', ')"
95+
v-if="moreFeatures.length"
96+
:text="`+${moreFeatures.length}`"
97+
:data-title="moreFeatures.join(', ')"
98+
:highlight="intersect(moreFeatures, filter.selectedFeatures)"
9799
/>
98100
</div>
99101
<a :href="meta.playgroundLink" class="playground link" target="_blank">

website/src/catalog/data.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
import { data as allRules } from '../../_data/catalog.data'
22
export type { RuleMeta } from '../../_data/catalog.data'
33

4+
export function intersect(a: string[], b: string[]) {
5+
return a.some(x => b.includes(x))
6+
}
7+
48
export function getRuleMetaData(filter: Filter) {
59
const {
610
selectedLanguages,
711
} = filter
812
return allRules.filter(meta => {
913
const langFilter = !selectedLanguages.length || selectedLanguages.includes(meta.language)
10-
const ruleFilter = !filter.selectedRuleFilters.length || filter.selectedRuleFilters.some(r => meta.rules.includes(r))
11-
const featureFilter = !filter.selectedFeatures.length || filter.selectedFeatures.some(f => meta.features.includes(f))
14+
const ruleFilter = !filter.selectedRuleFilters.length || intersect(filter.selectedRuleFilters, meta.rules)
15+
const featureFilter = !filter.selectedFeatures.length || intersect(filter.selectedFeatures, meta.features)
1216
const typeFilter = !filter.selectedTypes.length || filter.selectedTypes.includes(meta.type)
1317
return langFilter && ruleFilter && featureFilter && typeFilter
1418
})

0 commit comments

Comments
 (0)