Skip to content

Commit 31276ca

Browse files
refactor: migrate useProvideFilterBox and VFilterBox to TypeScript #156"
1 parent 8ef8d7b commit 31276ca

File tree

3 files changed

+84
-46
lines changed

3 files changed

+84
-46
lines changed

eslint.config.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,25 @@ export default defineConfig([
1414
'**/dist/**'
1515
]
1616
},
17+
{
18+
files: ['**/*.vue'],
19+
languageOptions: {
20+
parser: require.resolve('vue-eslint-parser'),
21+
parserOptions: {
22+
parser: require.resolve('@typescript-eslint/parser'),
23+
ecmaVersion: 2020,
24+
sourceType: 'module',
25+
extraFileExtensions: ['.vue']
26+
}
27+
},
28+
plugins: {
29+
'vue': pluginVue,
30+
'@typescript-eslint': tseslint
31+
},
32+
rules: {
33+
// 필요시 규칙 추가
34+
}
35+
},
1736
{
1837
files: ['**/*.{js,mjs,cjs,vue,ts}', 'eslint.config.js'],
1938
extends: [

src/components/pivottable-ui/VFilterBox.vue

Lines changed: 53 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -62,85 +62,96 @@
6262
</div>
6363
</template>
6464

65-
<script setup>
65+
<script setup lang="ts">
6666
import { ref, computed } from 'vue'
6767
import { useProvideFilterBox } from '../../composables'
68-
const props = defineProps({
69-
unselectedFilterValues: {
70-
type: Object,
71-
default: () => ({})
72-
},
73-
filterBoxKey: {
74-
type: String,
75-
default: ''
76-
},
77-
zIndex: {
78-
type: Number,
79-
default: 0
80-
},
81-
filterBoxValues: {
82-
type: Object,
83-
default: () => ({})
84-
}
68+
69+
interface FilterBoxProps {
70+
unselectedFilterValues?: Record<string, boolean>
71+
filterBoxKey?: string
72+
zIndex?: number
73+
filterBoxValues?: Record<string, number>
74+
}
75+
76+
const props = withDefaults(defineProps<FilterBoxProps>(), {
77+
unselectedFilterValues: () => ({}),
78+
filterBoxKey: '',
79+
zIndex: 0,
80+
filterBoxValues: () => ({})
8581
})
86-
const { localeStrings, sorter, menuLimit } = useProvideFilterBox()
82+
83+
const { localeStrings, sorter, menuLimit } = useProvideFilterBox()!
8784
const filterBoxValuesList = Object.keys(props.filterBoxValues)
8885
const filterText = ref('')
8986
const showMenu = ref(filterBoxValuesList.length < menuLimit.value)
9087
const sortedList = [...filterBoxValuesList].sort(sorter(props.filterBoxKey))
9188
const filteredList = computed(() => sortedList.filter(matchesFilter))
9289
const unselectedValues = computed(() => props.unselectedFilterValues)
93-
const emit = defineEmits([
94-
'update:zIndexOfFilterBox',
95-
'update:unselectedFilterValues'
96-
])
97-
const moveFilterBoxToTop = (e) => {
90+
91+
const emit = defineEmits<{
92+
(event: 'update:zIndexOfFilterBox', attributeName: string): void
93+
(
94+
event: 'update:unselectedFilterValues',
95+
payload: { key: string; value: Record<string, boolean> }
96+
): void
97+
}>()
98+
99+
const moveFilterBoxToTop = (e: MouseEvent) => {
98100
e.stopPropagation()
99101
emit('update:zIndexOfFilterBox', props.filterBoxKey)
100102
}
101103
const handleFilterTextClear = () => {
102104
filterText.value = ''
103105
}
104-
const matchesFilter = (x) =>
105-
x.toLowerCase().trim().includes(filterText.value.toLowerCase().trim())
106-
const addValuesToFilter = (values) => {
107-
const filterValues = values.reduce((r, v) => {
108-
r[v] = true
109-
return r
110-
}, Object.assign({}, unselectedValues.value))
106+
const matchesFilter = (x: string) =>
107+
x
108+
.toLowerCase()
109+
.trim()
110+
.includes((filterText.value ?? '').toLowerCase().trim())
111+
const addValuesToFilter = (values: string[]) => {
112+
const filterValues = values.reduce(
113+
(r, v) => {
114+
r[v] = true
115+
return r
116+
},
117+
Object.assign({}, unselectedValues.value)
118+
)
111119
emit('update:unselectedFilterValues', {
112120
key: props.filterBoxKey,
113121
value: filterValues
114122
})
115123
}
116-
const removeValuesFromFilter = (values) => {
117-
const filterValues = values.reduce((r, v) => {
118-
if (r[v]) {
119-
delete r[v]
120-
}
121-
return r
122-
}, Object.assign({}, unselectedValues.value))
124+
const removeValuesFromFilter = (values: string[]) => {
125+
const filterValues = values.reduce(
126+
(r, v) => {
127+
if (r[v]) {
128+
delete r[v]
129+
}
130+
return r
131+
},
132+
Object.assign({}, unselectedValues.value)
133+
)
123134
emit('update:unselectedFilterValues', {
124135
key: props.filterBoxKey,
125136
value: filterValues
126137
})
127138
}
128-
const toggleValue = (value) => {
139+
const toggleValue = (value: string) => {
129140
if (value in unselectedValues.value) {
130141
removeValuesFromFilter([value])
131142
} else {
132143
addValuesToFilter([value])
133144
}
134145
}
135-
const selectOnly = (e, value) => {
146+
const selectOnly = (e: MouseEvent, value: string) => {
136147
e.stopPropagation()
137148
setValuesInFilter(
138149
props.filterBoxKey,
139150
filterBoxValuesList.filter((y) => y !== value)
140151
)
141152
}
142-
const setValuesInFilter = (filterBoxKey, values) => {
143-
const filterValues = values.reduce((r, v) => {
153+
const setValuesInFilter = (filterBoxKey: string, values: string[]) => {
154+
const filterValues = values.reduce<Record<string, boolean>>((r, v) => {
144155
r[v] = true
145156
return r
146157
}, {})

src/composables/useProvideFilterbox.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import { computed, inject, provide } from 'vue'
1+
import { computed, ComputedRef, inject, provide, InjectionKey } from 'vue'
22
import { getSort } from '../helper/utilities'
3-
const filterBoxKey = Symbol('filterBox')
43

54
interface ProvideFilterBoxProps {
65
languagePack: Record<string, any>
@@ -10,7 +9,16 @@ interface ProvideFilterBoxProps {
109
[key: string]: any
1110
}
1211

13-
export function provideFilterBox (props: ProvideFilterBoxProps) {
12+
// 별도의 파일로 분리?
13+
interface FilterBoxContext {
14+
localeStrings: ComputedRef<any>
15+
sorter: (x: string) => any
16+
menuLimit: ComputedRef<number>
17+
}
18+
19+
const filterBoxKey = Symbol('filterBox') as InjectionKey<FilterBoxContext>
20+
21+
export function provideFilterBox(props: ProvideFilterBoxProps) {
1422
const localeStrings = computed(
1523
() => props.languagePack[props.locale].localeStrings
1624
)
@@ -24,6 +32,6 @@ export function provideFilterBox (props: ProvideFilterBoxProps) {
2432
})
2533
}
2634

27-
export function useProvideFilterBox () {
35+
export function useProvideFilterBox() {
2836
return inject(filterBoxKey)
2937
}

0 commit comments

Comments
 (0)