Skip to content

Commit 97751a9

Browse files
sheepzhMarenzdependabot[bot]
authored
v3.4.1
* Fix second firefox addon link in README.md (#441) * ci: upgrade the version (#443) * v3.3.5 * Bump @types/chrome from 0.0.312 to 0.0.313 (#442) Bumps [@types/chrome](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/chrome) from 0.0.312 to 0.0.313. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/chrome) --- updated-dependencies: - dependency-name: "@types/chrome" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * v3.4.0 * feat: lock limit rule (#338, #407) * i18n(zh_TW): optimize the texts by deepseek * test: fix e2e cases * test: fix e2e cases * feat: support caching filter value for the report page (#449) (#451) * refactor: refactor with provider (#453) * test: use localhost for example pages * ci: fix end-to-end tests * feat: simplify URL configuration for time limit rules (#424) (#455) * ci: removed old translations when sync * v3.4.0 * ci: auto publish for edge store * feat: transmit env info when redirecting to support.qq.com * fix: fix time input of idle time * fix: fix compatibility with mdwiki (#460) * v3.4.1 --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Mathias L. Baumann <Marenz@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
1 parent e4dd128 commit 97751a9

File tree

18 files changed

+175
-218
lines changed

18 files changed

+175
-218
lines changed

.github/workflows/publish-edge.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,4 @@ jobs:
2525
product-id: 2a99ae83-5ec8-4ad2-aa63-9a276fc708ce
2626
client-id: ${{ secrets.EDGE_CLIENT_ID }}
2727
api-key: ${{ secrets.EDGE_API_KEY}}
28-
upload-only: true # not publish
28+
upload-only: false

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ All notable changes to Time Tracker will be documented in this file.
44

55
It is worth mentioning that the release time of each change refers to the time when the installation package is submitted to the webstore. It is about one week for Edge to moderate packages, while only 1-2 days for Chrome and Firefox.
66

7+
## [3.4.1] - 2025-04-28
8+
9+
- Fixed the bug with mdwiki
10+
711
## [3.4.0] - 2025-04-20
812

913
- Supported to lock the limit rule

package.json

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "timer",
3-
"version": "3.4.0",
3+
"version": "3.4.1",
44
"description": "Time tracker",
55
"homepage": "https://www.wfhg.cc",
66
"scripts": {
@@ -32,13 +32,13 @@
3232
"@babel/preset-env": "^7.26.9",
3333
"@crowdin/crowdin-api-client": "^1.42.0",
3434
"@rsdoctor/webpack-plugin": "^1.0.2",
35-
"@swc/core": "^1.11.21",
36-
"@swc/jest": "^0.2.37",
37-
"@types/chrome": "0.0.315",
35+
"@swc/core": "^1.11.22",
36+
"@swc/jest": "^0.2.38",
37+
"@types/chrome": "0.0.317",
3838
"@types/decompress": "^4.2.7",
3939
"@types/generate-json-webpack-plugin": "^0.3.7",
4040
"@types/jest": "^29.5.14",
41-
"@types/node": "^22.14.1",
41+
"@types/node": "^22.15.2",
4242
"@types/punycode": "^2.1.4",
4343
"@types/webpack": "^5.28.5",
4444
"@vue/babel-plugin-jsx": "^1.4.0",
@@ -47,7 +47,6 @@
4747
"copy-webpack-plugin": "^13.0.0",
4848
"css-loader": "^7.1.2",
4949
"decompress": "^4.2.1",
50-
"eslint": "^9.25.0",
5150
"filemanager-webpack-plugin": "^8.0.0",
5251
"generate-json-webpack-plugin": "^2.0.0",
5352
"html-webpack-plugin": "^5.6.3",
@@ -59,32 +58,32 @@
5958
"postcss": "^8.5.3",
6059
"postcss-loader": "^8.1.1",
6160
"postcss-rtlcss": "^5.7.0",
62-
"puppeteer": "^24.6.1",
63-
"sass": "^1.86.3",
61+
"puppeteer": "^24.7.2",
62+
"sass": "^1.87.0",
6463
"sass-loader": "^16.0.5",
6564
"style-loader": "^4.0.0",
6665
"ts-loader": "^9.5.2",
6766
"ts-node": "^10.9.2",
6867
"tsconfig-paths": "^4.2.0",
6968
"typescript": "5.8.3",
7069
"url-loader": "^4.1.1",
71-
"web-ext": "^8.5.0",
72-
"webpack": "^5.99.6",
70+
"web-ext": "^8.6.0",
71+
"webpack": "^5.99.7",
7372
"webpack-cli": "^6.0.1"
7473
},
7574
"dependencies": {
7675
"@element-plus/icons-vue": "^2.3.1",
7776
"@vueuse/core": "^13.1.0",
78-
"countup.js": "^2.8.0",
77+
"countup.js": "^2.8.2",
7978
"echarts": "^5.6.0",
80-
"element-plus": "2.9.8",
79+
"element-plus": "2.9.9",
8180
"js-base64": "^3.7.7",
8281
"punycode": "^2.3.1",
8382
"stream-browserify": "^3.0.0",
8483
"vue": "^3.5.13",
85-
"vue-router": "^4.5.0"
84+
"vue-router": "^4.5.1"
8685
},
8786
"engines": {
8887
"node": ">=20"
8988
}
90-
}
89+
}

src/api/version.ts

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

8-
import { IS_CHROME, IS_EDGE, IS_FIREFOX } from "@util/constant/environment"
8+
import { BROWSER_NAME } from "@util/constant/environment"
99
import { fetchGet } from "./http"
1010

1111
/**
@@ -52,11 +52,11 @@ async function getChromeVersion(): Promise<string | undefined> {
5252
}
5353

5454
export function getLatestVersion(): Promise<string | undefined> {
55-
if (IS_FIREFOX) {
55+
if (BROWSER_NAME === 'firefox') {
5656
return getFirefoxVersion()
57-
} else if (IS_CHROME) {
57+
} else if (BROWSER_NAME === 'chrome') {
5858
return getChromeVersion()
59-
} else if (IS_EDGE) {
59+
} else if (BROWSER_NAME === 'edge') {
6060
return getEdgeVersion()
6161
}
6262
return Promise.resolve(undefined)

src/content-script/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ const FLAG_ID = '__TIMER_INJECTION_FLAG__' + chrome.runtime.id
2020
function getOrSetFlag(): boolean {
2121
const pre = document?.getElementById(FLAG_ID)
2222
if (!pre) {
23-
const flag = document?.createElement('a')
23+
const flag = document.createElement('a')
24+
flag.href = '#'
2425
flag.style && (flag.style.visibility = 'hidden')
2526
flag && (flag.id = FLAG_ID)
2627

src/pages/app/components/About/Description.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,9 @@ const _default = defineComponent(() => {
116116
<div>
117117
<ElText size="large">
118118
🙋&ensp;
119-
<a href={feedbackUrl}>{t(msg => msg.about.text.feedback)}</a>
119+
<a href={feedbackUrl} target="_blank">
120+
{t(msg => msg.about.text.feedback)}
121+
</a>
120122
</ElText>
121123
</div>
122124
</div>

src/pages/app/components/Option/components/AppearanceOption/DarkModeInput.tsx

Lines changed: 38 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*/
77
import { t } from "@app/locale"
88
import { ElOption, ElSelect, ElTimePicker } from "element-plus"
9-
import { computed, defineComponent, toRef, watch, type PropType } from "vue"
9+
import { computed, defineComponent } from "vue"
1010

1111
const ALL_MODES: timer.option.DarkMode[] = ["default", "on", "off", "timed"]
1212

@@ -29,65 +29,45 @@ function computeDateToSecond(date: Date) {
2929
return hour * 3600 + minute * 60 + second
3030
}
3131

32-
const _default = defineComponent({
33-
props: {
34-
modelValue: {
35-
type: String as PropType<timer.option.DarkMode>,
36-
required: true,
37-
},
38-
startSecond: Number,
39-
endSecond: Number
40-
},
41-
emits: {
42-
change: (_darkMode: timer.option.DarkMode, [_startSecond, _endSecond]: [number?, number?]) => true
43-
},
44-
setup(props, ctx) {
45-
const darkMode = toRef(props, 'modelValue')
46-
const startSecond = toRef(props, 'startSecond')
47-
const endSecond = toRef(props, 'endSecond')
48-
const start = computed({
49-
get: () => startSecond.value && computeSecondToDate(startSecond.value),
50-
set: val => startSecond.value = val && computeDateToSecond(val),
51-
})
52-
const end = computed({
53-
get: () => endSecond.value && computeSecondToDate(endSecond.value),
54-
set: val => endSecond.value = val && computeDateToSecond(val),
55-
})
32+
type Props = {
33+
modelValue: timer.option.DarkMode
34+
startSecond?: number
35+
endSecond?: number
36+
onChange?: (darkMode: timer.option.DarkMode, [startSecond, endSecond]: [number?, number?]) => void
37+
}
5638

57-
watch(
58-
[startSecond, endSecond, darkMode],
59-
() => ctx.emit("change", darkMode.value, [startSecond.value, endSecond.value])
60-
)
39+
const _default = defineComponent<Props>(props => {
40+
const start = computed(() => props.startSecond && computeSecondToDate(props.startSecond))
41+
const end = computed(() => props.endSecond && computeSecondToDate(props.endSecond))
6142

62-
return () => <>
63-
<ElSelect
64-
modelValue={darkMode.value}
43+
return () => <>
44+
<ElSelect
45+
modelValue={props.modelValue}
46+
size="small"
47+
style={{ width: "120px" }}
48+
onChange={val => props.onChange?.(val as timer.option.DarkMode, [props.startSecond, props.endSecond])}
49+
>
50+
{
51+
ALL_MODES.map(value => <ElOption value={value} label={t(msg => msg.option.appearance.darkMode.options[value])} />)
52+
}
53+
</ElSelect>
54+
{props.modelValue === "timed" && <>
55+
<ElTimePicker
56+
modelValue={start.value}
57+
size="small"
58+
style={{ marginLeft: "10px" }}
59+
onUpdate:modelValue={val => props.onChange?.(props.modelValue, [computeDateToSecond(val), props.endSecond])}
60+
clearable={false}
61+
/>
62+
<a>-</a>
63+
<ElTimePicker
64+
modelValue={end.value}
6565
size="small"
66-
style={{ width: "120px" }}
67-
onChange={val => darkMode.value = val as timer.option.DarkMode}
68-
>
69-
{
70-
ALL_MODES.map(value => <ElOption value={value} label={t(msg => msg.option.appearance.darkMode.options[value])} />)
71-
}
72-
</ElSelect>
73-
{darkMode.value === "timed" && <>
74-
<ElTimePicker
75-
modelValue={start.value}
76-
size="small"
77-
style={{ marginLeft: "10px" }}
78-
onUpdate:modelValue={val => start.value = val}
79-
clearable={false}
80-
/>
81-
<a>-</a>
82-
<ElTimePicker
83-
modelValue={end.value}
84-
size="small"
85-
onUpdate:modelValue={val => end.value = val}
86-
clearable={false}
87-
/>
88-
</>}
89-
</>
90-
}
91-
})
66+
onUpdate:modelValue={val => props.onChange?.(props.modelValue, [props.startSecond, computeDateToSecond(val)])}
67+
clearable={false}
68+
/>
69+
</>}
70+
</>
71+
}, { props: ['modelValue', 'startSecond', 'endSecond', 'onChange'] })
9272

9373
export default _default
Lines changed: 33 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,41 @@
11
import I18nNode from "@app/components/common/I18nNode"
22
import { type I18nKey } from "@app/locale"
3+
import Flex from "@pages/components/Flex"
34
import { ElDivider, ElTag } from "element-plus"
4-
import { defineComponent, h, type PropType, type VNode } from "vue"
5+
import { defineComponent, h, useSlots, type VNode } from "vue"
56

6-
const _default = defineComponent({
7-
props: {
8-
label: {
9-
type: Function as PropType<I18nKey>,
10-
required: true,
11-
},
12-
defaultValue: [String, Number],
13-
hideDivider: {
14-
type: Boolean,
15-
default: false,
16-
},
17-
required: Boolean
18-
},
19-
setup: (props, ctx) => {
20-
return () => {
21-
const param: Record<string, VNode> = {}
22-
Object.entries(ctx.slots).forEach(([k, slot]) => slot && (param[k === "default" ? "input" : k] = h(slot)))
23-
return (
24-
<div>
25-
<ElDivider v-show={!props.hideDivider} />
26-
<div class="option-line">
27-
<a class="option-label">
28-
{!!props.required && <span class="option-item-required">*</span>}
29-
<I18nNode path={props.label} param={param} />
7+
type Props = {
8+
label: I18nKey
9+
defaultValue?: string | number
10+
hideDivider?: boolean
11+
required?: boolean
12+
}
13+
14+
const _default = defineComponent<Props>(props => {
15+
const slots = useSlots()
16+
return () => {
17+
const param: Record<string, VNode> = {}
18+
Object.entries(slots).forEach(([k, slot]) => slot && (param[k === "default" ? "input" : k] = h(slot)))
19+
return (
20+
<div>
21+
<ElDivider v-show={!props.hideDivider} />
22+
<Flex class="option-line" align="center" justify="space-between" gap={10}>
23+
<a class="option-label">
24+
{!!props.required && <span class="option-item-required">*</span>}
25+
<I18nNode path={props.label} param={param} />
26+
</a>
27+
{props.defaultValue && (
28+
<a class="option-default">
29+
<I18nNode
30+
path={msg => msg.option.defaultValue}
31+
param={{ default: <ElTag size="small">{props.defaultValue}</ElTag> }}
32+
/>
3033
</a>
31-
{props.defaultValue && (
32-
<a class="option-default">
33-
<I18nNode
34-
path={msg => msg.option.defaultValue}
35-
param={{ default: <ElTag size="small">{props.defaultValue}</ElTag> }}
36-
/>
37-
</a>
38-
)}
39-
</div>
40-
</div>
41-
)
42-
}
34+
)}
35+
</Flex>
36+
</div>
37+
)
4338
}
44-
})
39+
}, { props: ['label', 'required', 'hideDivider', 'defaultValue'] })
4540

4641
export default _default
Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,16 @@
11
import { InfoFilled } from "@element-plus/icons-vue"
22
import { ElIcon, ElTooltip } from "element-plus"
3-
import { defineComponent } from "vue"
3+
import { defineComponent, useSlots } from "vue"
44

5-
const _default = defineComponent((_, ctx) => {
6-
return () => {
7-
const content = ctx.slots.default
8-
if (!content) {
9-
return null
10-
}
11-
return (
12-
<ElTooltip v-slots={{ content }}>
13-
<ElIcon size={15}>
14-
<InfoFilled />
15-
</ElIcon>
16-
</ElTooltip>
17-
)
18-
}
5+
const _default = defineComponent(() => {
6+
const { default: content } = useSlots()
7+
return () => content ? (
8+
<ElTooltip v-slots={{ content }}>
9+
<ElIcon size={15}>
10+
<InfoFilled />
11+
</ElIcon>
12+
</ElTooltip>
13+
) : null
1914
})
2015

2116
export default _default

src/pages/app/components/Option/components/StatisticsOption.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ const _default = defineComponent((_props, ctx) => {
6666

6767
const intervalFormat = computed(() => {
6868
const intervalNum = option.autoPauseInterval
69-
if (intervalNum > 3600) return 'HH [hr] mm [min] ss [sec]'
70-
if (intervalNum > 60) return 'mm [min] ss [sec]'
69+
if (intervalNum >= 3600) return 'HH [hr] mm [min] ss [sec]'
70+
if (intervalNum >= 60) return 'mm [min] ss [sec]'
7171
return 'ss [sec]'
7272
})
7373

0 commit comments

Comments
 (0)