Skip to content

Commit ebe119b

Browse files
feat: add language filter
1 parent a74e6cc commit ebe119b

File tree

4 files changed

+55
-25
lines changed

4 files changed

+55
-25
lines changed

website/src/catalog/RuleFilter.vue

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,30 @@
11
<script setup lang="ts">
2-
import { reactive } from 'vue'
2+
import { watchEffect, ref } from 'vue'
33
import {
44
languages,
55
ruleFilters,
66
features,
77
ruleTypes,
8+
type Filter,
89
} from './data'
910
10-
const filter = reactive({
11+
const model = defineModel<Filter>()
12+
13+
const filter = ref({
1114
selectedLanguages: [] as string[],
1215
selectedRuleFilters: [] as string[],
1316
selectedFeatures: [] as string[],
1417
selectedTypes: [] as string[],
15-
sortBy: 'name',
18+
})
19+
20+
watchEffect(() => {
21+
model.value = filter.value
1622
})
1723
1824
</script>
1925
<template>
2026
<form class="filters">
21-
<details>
27+
<details open>
2228
<summary>Language Filters</summary>
2329
<div class="checkbox-group">
2430
<label v-for="lang in languages" :key="lang">
@@ -28,7 +34,7 @@ const filter = reactive({
2834
</div>
2935
</details>
3036

31-
<details class="filter-group">
37+
<details class="filter-group" style="display: none;">
3238
<summary>Rule Filters</summary>
3339
<div class="rule-group">
3440
<div v-for="rules, type in ruleFilters">
@@ -43,7 +49,7 @@ const filter = reactive({
4349
</div>
4450
</details>
4551

46-
<details class="filter-group">
52+
<details class="filter-group" style="display: none;">
4753
<summary>More Filters</summary>
4854
<div class="rule-group">
4955
<div>
@@ -64,19 +70,6 @@ const filter = reactive({
6470
</label>
6571
</div>
6672
</div>
67-
<div>
68-
<em>Sort By</em>
69-
<div>
70-
<label>
71-
<input value="name" type="radio" v-model="filter.sortBy"/>
72-
Name
73-
</label>
74-
<label>
75-
<input value="complexity" type="radio" v-model="filter.sortBy"/>
76-
Complexity
77-
</label>
78-
</div>
79-
</div>
8073
</div>
8174
</details>
8275
</form>

website/src/catalog/RuleList.vue

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,21 @@
11
<script setup lang="ts">
2+
import { type Filter, getRules } from './data'
3+
import { computed, type PropType } from 'vue'
24
3-
import { data as rules } from '../../_data/catalog.data'
5+
const props = defineProps({
6+
filter: {
7+
type: Object as PropType<Filter>,
8+
required: true,
9+
}
10+
})
411
12+
const rules = computed(() => getRules(props.filter))
513
</script>
614

715
<template>
8-
<h2> Rule List </h2>
16+
<h2>
17+
Rule List
18+
</h2>
919
<ul class="rule-list">
1020
<li v-for="rule in rules" :key="rule.language + rule.id" class="rule-item">
1121
<div class="rule-header">

website/src/catalog/data.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,26 @@
1+
import { data as allRules } from '../../_data/catalog.data'
2+
3+
export function getRules(filter: Filter): Rule[] {
4+
const {
5+
selectedLanguages,
6+
selectedRuleFilters,
7+
selectedFeatures,
8+
} = filter
9+
return allRules.filter(rule => {
10+
return !selectedLanguages.length || selectedLanguages.map(s => s.toLowerCase()).includes(rule.language)
11+
})
12+
}
13+
14+
export type Filter = {
15+
selectedLanguages: string[],
16+
selectedRuleFilters: string[],
17+
selectedFeatures: string[],
18+
selectedTypes: string[],
19+
}
20+
121
export const languages = [
222
'C',
3-
'C++',
23+
'Cpp',
424
'Go',
525
'HTML',
626
'Java',

website/src/catalog/index.vue

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
<script setup lang="ts">
2-
// TODO: add rule filter
3-
// import RuleFilter from './RuleFilter.vue'
2+
import { ref } from 'vue'
3+
const filter = ref({
4+
selectedLanguages: [] as string[],
5+
selectedRuleFilters: [] as string[],
6+
selectedFeatures: [] as string[],
7+
selectedTypes: [] as string[],
8+
})
9+
import RuleFilter from './RuleFilter.vue'
410
import RuleList from './RuleList.vue'
511
</script>
612

713
<template>
814
<div class="catalog-filter">
9-
<RuleList/>
15+
<RuleFilter v-model="filter" />
16+
<RuleList :filter="filter"/>
1017
</div>
1118
</template>
1219

0 commit comments

Comments
 (0)