Skip to content

Commit

Permalink
feat: add sort filter
Browse files Browse the repository at this point in the history
  • Loading branch information
HerringtonDarkholme committed Feb 12, 2025
1 parent a99a269 commit 346ccbb
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 8 deletions.
13 changes: 7 additions & 6 deletions website/src/catalog/RuleList.vue
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
<script setup lang="ts">
import NumberFlow, { continuous } from '@number-flow/vue'
import { type Filter, getRuleMetaData } from './data'
import { computed, type PropType } from 'vue'
import { type Filter, getRuleMetaData } from './data.js'
import { computed, ref, type PropType } from 'vue'
import RuleItem from './RuleItem.vue'
import IconDown from '../components/utils/IconDown.vue'
const sortBy = ref('name')
const props = defineProps({
filter: {
type: Object as PropType<Filter>,
Expand All @@ -15,7 +16,7 @@ const emit = defineEmits<{
reset: []
}>()
const ruleMetaData = computed(() => getRuleMetaData(props.filter))
const ruleMetaData = computed(() => getRuleMetaData(props.filter, sortBy.value))
</script>

<template>
Expand All @@ -30,9 +31,9 @@ const ruleMetaData = computed(() => getRuleMetaData(props.filter))
/>
<label class="sort-by">
Sort by:
<select>
<option>Name</option>
<option>Lang</option>
<select v-model="sortBy">
<option value="name">Name</option>
<option value="lang">Lang</option>
</select>
<IconDown/>
</label>
Expand Down
11 changes: 9 additions & 2 deletions website/src/catalog/data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,23 @@ export function intersect(a: string[], b: string[]) {
return a.some(x => b.includes(x))
}

export function getRuleMetaData(filter: Filter) {
export function getRuleMetaData(filter: Filter, sortBy = 'name') {
const {
selectedLanguages,
selectedRules,
} = filter
return allRules.filter(meta => {
const langFilter = !selectedLanguages.length || selectedLanguages.includes(meta.language)
const ruleFilter = !filter.selectedRules.length || intersect(filter.selectedRules, meta.rules)
const ruleFilter = !selectedRules.length || intersect(selectedRules, meta.rules)
const featureFilter = !filter.selectedFeatures.length || intersect(filter.selectedFeatures, meta.features)
const typeFilter = !filter.selectedTypes.length || filter.selectedTypes.includes(meta.type)
return langFilter && ruleFilter && featureFilter && typeFilter
}).toSorted((a, b) => {
if (sortBy === 'name') {
return a.name.localeCompare(b.name)
} else {
return a.language.localeCompare(b.language)
}
})
}

Expand Down

0 comments on commit 346ccbb

Please sign in to comment.