Skip to content

Commit c447490

Browse files
author
sheepzh
committed
Support virtual site for whitelist (sheepzh#274) and clean code
1 parent c1d8715 commit c447490

File tree

134 files changed

+930
-1119
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

134 files changed

+930
-1119
lines changed

src/app/components/Analysis/components/AnalysisFilter.tsx

Lines changed: 17 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,19 @@
55
* https://opensource.org/licenses/MIT
66
*/
77

8-
import type { Ref, PropType } from "vue"
9-
108
import { ElOption, ElSelect, ElTag } from "element-plus"
11-
import { ref, defineComponent } from "vue"
9+
import { type PropType, watch, defineComponent } from "vue"
1210
import statService, { HostSet } from "@service/stat-service"
1311
import siteService from "@service/site-service"
1412
import { t } from "@app/locale"
1513
import TimeFormatFilterItem from "@app/components/common/TimeFormatFilterItem"
1614
import { labelOfHostInfo } from "../util"
15+
import { useRequest, useState } from "@hooks"
1716

1817
const calcUniqueKey = ({ host, virtual, merged }: timer.site.SiteInfo) => `${host}${virtual ? 1 : 0}${merged ? 1 : 0}`
1918

20-
async function handleRemoteSearch(queryStr: string, trendDomainOptions: Ref<timer.site.SiteInfo[]>, searching: Ref<boolean>) {
21-
if (!queryStr) {
22-
trendDomainOptions.value = []
23-
return
24-
}
25-
searching.value = true
19+
async function fetchDomain(queryStr: string): Promise<timer.site.SiteInfo[]> {
20+
if (!queryStr) return []
2621

2722
const options: Record<string, timer.site.SiteInfo> = {}
2823
const sites = await siteService.selectAll({ fuzzyQuery: queryStr })
@@ -39,8 +34,7 @@ async function handleRemoteSearch(queryStr: string, trendDomainOptions: Ref<time
3934
const key = calcUniqueKey(o)
4035
!options[key] && (options[key] = o)
4136
})
42-
trendDomainOptions.value = Object.values(options)
43-
searching.value = false
37+
return Object.values(options)
4438
}
4539

4640
const HOST_PLACEHOLDER = t(msg => msg.analysis.common.hostPlaceholder)
@@ -85,21 +79,15 @@ const _default = defineComponent({
8579
timeFormatChange: (_format: timer.app.TimeFormat) => true,
8680
},
8781
setup(props, ctx) {
88-
const domainKey: Ref<string> = ref('')
89-
const trendSearching: Ref<boolean> = ref(false)
90-
const trendDomainOptions: Ref<timer.site.SiteInfo[]> = ref([])
9182
const defaultSite: timer.site.SiteKey = props.site
92-
const timeFormat: Ref<timer.app.TimeFormat> = ref(props.timeFormat)
93-
94-
if (defaultSite) {
95-
domainKey.value = calcKey(defaultSite)
96-
trendDomainOptions.value.push(defaultSite)
97-
}
98-
99-
const handleSiteChange = () => {
100-
const siteInfo: timer.site.SiteInfo = calcSite(domainKey.value)
101-
ctx.emit('siteChange', siteInfo)
102-
}
83+
const [domainKey, setDomainKey] = useState(defaultSite ? calcKey(defaultSite) : '')
84+
const { data: trendDomainOptions, loading: trendSearching, refresh: searchRemote } = useRequest<string, timer.site.SiteInfo[]>(
85+
fetchDomain,
86+
{ defaultValue: defaultSite ? [defaultSite] : [], manual: true }
87+
)
88+
const [timeFormat, setTimeFormat] = useState(props.timeFormat)
89+
watch(domainKey, () => ctx.emit('siteChange', calcSite(domainKey.value)))
90+
watch(timeFormat, () => ctx.emit('timeFormatChange', timeFormat.value))
10391

10492
return () => <>
10593
<ElSelect
@@ -110,15 +98,9 @@ const _default = defineComponent({
11098
remote
11199
loading={trendSearching.value}
112100
clearable
113-
remoteMethod={(query: string) => handleRemoteSearch(query, trendDomainOptions, trendSearching)}
114-
onChange={(key: string) => {
115-
domainKey.value = key
116-
handleSiteChange()
117-
}}
118-
onClear={() => {
119-
domainKey.value = undefined
120-
handleSiteChange()
121-
}}
101+
remoteMethod={searchRemote}
102+
onChange={setDomainKey}
103+
onClear={() => setDomainKey()}
122104
>
123105
{(trendDomainOptions.value || [])?.map(
124106
site => (
@@ -136,7 +118,7 @@ const _default = defineComponent({
136118
</ElSelect>
137119
<TimeFormatFilterItem
138120
defaultValue={timeFormat.value}
139-
onChange={val => ctx.emit("timeFormatChange", timeFormat.value = val)}
121+
onChange={setTimeFormat}
140122
/>
141123
</>
142124
}

src/app/components/Analysis/components/Summary/CalendarChart.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { EchartsWrapper, useEcharts } from "@hooks/useEcharts"
1+
import { EchartsWrapper, useEcharts } from "@hooks"
22
import { computed, defineComponent } from "vue"
33
import { useAnalysisRows, useAnalysisTimeFormat } from "../../context"
44
import {

src/app/components/Analysis/components/Trend/Dimension/Chart.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import type { DimensionEntry, ValueFormatter } from "@app/components/Analysis/ut
1010

1111
import { defineComponent, watch } from "vue"
1212
import ChartWrapper from "./wrapper"
13-
import { useEcharts } from "@hooks/useEcharts"
13+
import { useEcharts } from "@hooks"
1414

1515
const _default = defineComponent({
1616
props: {

src/app/components/Analysis/components/Trend/Dimension/index.tsx

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,8 @@
44
* This software is released under the MIT License.
55
* https://opensource.org/licenses/MIT
66
*/
7-
8-
import type { DimensionEntry, RingValue, ValueFormatter } from "@app/components/Analysis/util"
9-
import type { PropType } from "vue"
10-
11-
import { computeRingText, formatValue } from "@app/components/Analysis/util"
12-
import { defineComponent } from "vue"
7+
import { computeRingText, formatValue, type DimensionEntry, type RingValue, type ValueFormatter } from "@app/components/Analysis/util"
8+
import { defineComponent, type PropType } from "vue"
139
import { KanbanIndicatorCell } from "@app/components/common/kanban"
1410
import Chart from "./Chart"
1511
import { cvt2LocaleTime } from "@app/util/time"
@@ -30,7 +26,7 @@ const _default = defineComponent({
3026
valueFormatter: Function as PropType<ValueFormatter>,
3127
chartTitle: String,
3228
},
33-
setup(p) {
29+
setup: p => {
3430
return () => (
3531
<div class="analysis-trend-dimension-container" >
3632
<div class="analysis-trend-dimension-indicator-container">

src/app/components/Analysis/components/Trend/Dimension/wrapper.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { TitleComponent, TooltipComponent, GridComponent } from "echarts/compone
2121

2222
import { ValueFormatter } from "@app/components/Analysis/util"
2323
import { getSecondaryTextColor } from "@util/style"
24-
import { EchartsWrapper } from "@hooks/useEcharts"
24+
import { EchartsWrapper } from "@hooks"
2525
import { ZRColor } from "echarts/types/dist/shared"
2626

2727
use([

src/app/components/Analysis/components/Trend/Filter.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,11 @@
66
*/
77

88
import type { ElementDatePickerShortcut } from "@src/element-ui/date"
9-
import type { PropType } from "vue"
109
import type { CalendarMessage } from "@i18n/message/common/calendar"
1110

1211
import { t } from "@app/locale"
1312
import { ElDatePicker } from "element-plus"
14-
import { defineComponent, ref } from "vue"
13+
import { defineComponent, ref, type PropType } from "vue"
1514
import { daysAgo } from "@util/time"
1615

1716
function datePickerShortcut(msgKey: keyof CalendarMessage['range'], agoOfStart?: number, agoOfEnd?: number): ElementDatePickerShortcut {

src/app/components/Analysis/components/Trend/context.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* https://opensource.org/licenses/MIT
66
*/
77

8-
import { useProvide, useProvider } from "@hooks/useProvider"
8+
import { useProvide, useProvider } from "@hooks"
99
import { Ref } from "vue"
1010

1111
type Context = {

src/app/components/Analysis/components/Trend/index.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@
55
* https://opensource.org/licenses/MIT
66
*/
77
import type { DimensionEntry, ValueFormatter } from "@app/components/Analysis/util"
8-
import type { Ref } from "vue"
98

10-
import { defineComponent, ref, watch, computed, onMounted } from "vue"
9+
import { defineComponent, type Ref, ref, watch, computed, onMounted } from "vue"
1110
import { KanbanCard } from "@app/components/common/kanban"
1211
import Filter from "./Filter"
1312
import Total from "./Total"
@@ -19,6 +18,7 @@ import { cvt2LocaleTime, periodFormatter } from "@app/util/time"
1918
import { groupBy } from "@util/array"
2019
import { useAnalysisRows, useAnalysisTimeFormat } from "../../context"
2120
import { initProvider } from "./context"
21+
import { useState } from "@hooks"
2222

2323
type DailyIndicator = {
2424
value: number
@@ -137,7 +137,7 @@ function handleDataChange(source: SourceParam, effect: EffectParam) {
137137
}
138138

139139
const _default = defineComponent(() => {
140-
const dateRange = ref<[Date, Date]>(daysAgo(14, 0))
140+
const [dateRange, setDateRange] = useState<[Date, Date]>(daysAgo(14, 0))
141141
const rangeLength = computed(() => getDayLength(dateRange.value?.[0], dateRange.value?.[1]))
142142
initProvider(dateRange, rangeLength)
143143

@@ -159,7 +159,7 @@ const _default = defineComponent(() => {
159159
<KanbanCard
160160
title={t(msg => msg.analysis.trend.title)}
161161
v-slots={{
162-
filter: () => <Filter dateRange={dateRange.value} onDateRangeChange={val => dateRange.value = val} />
162+
filter: () => <Filter dateRange={dateRange.value} onDateRangeChange={setDateRange} />
163163
}}
164164
>
165165
<div class="analysis-trend-content">

src/app/components/Analysis/context.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* https://opensource.org/licenses/MIT
66
*/
77

8-
import { useProvide, useProvider } from "@hooks/useProvider"
8+
import { useProvide, useProvider } from "@hooks"
99
import { Ref } from "vue"
1010

1111
type Context = {

src/app/components/Analysis/index.tsx

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This software is released under the MIT License.
55
* https://opensource.org/licenses/MIT
66
*/
7-
import { defineComponent, watch, ref } from "vue"
7+
import { defineComponent } from "vue"
88
import { useRoute, useRouter } from "vue-router"
99
import ContentContainer from "../common/ContentContainer"
1010
import Trend from "./components/Trend"
@@ -14,7 +14,7 @@ import statService, { StatQueryParam } from "@service/stat-service"
1414
import './style.sass'
1515
import { judgeVirtualFast } from "@util/pattern"
1616
import { initProvider } from "./context"
17-
import { useRequest } from "@hooks/useRequest"
17+
import { useRequest, useState } from "@hooks"
1818

1919
type _Queries = {
2020
host: string
@@ -32,9 +32,8 @@ function getSiteFromQuery(): timer.site.SiteInfo {
3232
}
3333

3434
async function query(site: timer.site.SiteKey): Promise<timer.stat.Row[]> {
35-
if (!site?.host) {
36-
return []
37-
}
35+
if (!site?.host) return []
36+
3837
const param: StatQueryParam = {
3938
host: site.host,
4039
mergeHost: site?.merged || false,
@@ -46,21 +45,19 @@ async function query(site: timer.site.SiteKey): Promise<timer.stat.Row[]> {
4645
}
4746

4847
const _default = defineComponent(() => {
49-
const siteFromQuery = getSiteFromQuery()
50-
const site = ref<timer.site.SiteKey>(siteFromQuery)
51-
const timeFormat = ref<timer.app.TimeFormat>('default')
48+
const [site, setSite] = useState(getSiteFromQuery())
49+
const [timeFormat, setTimeFormat] = useState<timer.app.TimeFormat>('default')
5250

53-
const { data: rows, refresh, loading } = useRequest<timer.stat.Row[]>(() => site.value ? query(site.value) : [])
54-
watch(site, refresh)
51+
const { data: rows, loading } = useRequest(() => query(site.value), { deps: site })
5552

5653
initProvider(site, timeFormat, rows)
5754
return () => (
5855
<ContentContainer v-slots={{
5956
filter: () => <Filter
6057
site={site.value}
6158
timeFormat={timeFormat.value}
62-
onSiteChange={val => site.value = val}
63-
onTimeFormatChange={val => timeFormat.value = val}
59+
onSiteChange={setSite}
60+
onTimeFormatChange={setTimeFormat}
6461
/>
6562
}}>
6663
<div v-loading={loading.value}>

0 commit comments

Comments
 (0)