Skip to content

Commit e8f3135

Browse files
authored
Merge pull request #48 from abichinger/feat/period-event
feat: add event `update:period` #47
2 parents c23750e + 1015ed9 commit e8f3135

File tree

11 files changed

+302
-54
lines changed

11 files changed

+302
-54
lines changed

ant/src/components/cron-ant.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,9 @@ export default defineComponent({
8787
CustomSelect,
8888
},
8989
props: cronAntProps(),
90-
emits: ['update:model-value', 'error'],
90+
emits: ['update:model-value', 'update:period', 'error'],
9191
setup(props, ctx) {
92-
return setupCron(props, () => props.modelValue, ctx)
92+
return setupCron(props, ctx)
9393
},
9494
})
9595
</script>

core/src/components/__tests__/cron-core.spec.ts

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import { describe, expect, it } from 'vitest'
22

33
import type { CronFormat } from '@/types'
4-
import { nextTick } from 'vue'
5-
import { useCron } from '../cron-core'
4+
import { mount } from '@vue/test-utils'
5+
import { defineComponent, nextTick } from 'vue'
6+
import { cronCoreProps, setupCron, useCron } from '../cron-core'
67

78
type UseCronReturn = ReturnType<typeof useCron>
89

@@ -97,3 +98,38 @@ describe('useCron', () => {
9798
}
9899
})
99100
})
101+
102+
it('setupCron events', async () => {
103+
let cron!: UseCronReturn
104+
105+
const component = defineComponent({
106+
props: cronCoreProps(),
107+
emits: ['update:model-value', 'update:period', 'error'],
108+
setup(props, ctx) {
109+
cron = setupCron(props, ctx)
110+
111+
return () => {}
112+
},
113+
})
114+
115+
const wrapper = mount(component, {
116+
props: {
117+
modelValue: '5 * * * *',
118+
period: 'day',
119+
},
120+
})
121+
122+
expect(cron.cron.value).toEqual('5 * * * *')
123+
expect(cron.period.selected.value.id).toEqual('day')
124+
125+
cron.segments[1].select([12]) // select hour: 12
126+
cron.period.select('month')
127+
128+
await nextTick()
129+
130+
expect(cron.cron.value).toEqual('5 12 * * *')
131+
expect(cron.period.selected.value.id).toEqual('month')
132+
133+
expect(wrapper.emitted('update:model-value')![0]).toEqual(['5 12 * * *'])
134+
expect(wrapper.emitted('update:period')![0]).toEqual(['month'])
135+
})

core/src/components/cron-core.ts

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import {
88
type ExtractPropTypes,
99
type PropType,
1010
type SetupContext,
11-
type WatchSource,
1211
} from 'vue'
1312
import { getLocale } from '../locale'
1413
import { FieldWrapper, TextPosition, type CronFormat, type Field, type Period } from '../types'
@@ -235,26 +234,43 @@ export function useCron(options: CronOptions) {
235234
export type UseCronReturn = ReturnType<typeof useCron>
236235

237236
export function setupCron(
238-
options: CronOptions,
239-
modelValue: WatchSource<string | undefined>,
240-
{ emit }: SetupContext<['update:model-value', 'error']>,
237+
props: CronCoreProps,
238+
{ emit }: SetupContext<['update:model-value', 'update:period', 'error']>,
241239
): UseCronReturn {
240+
const options: CronOptions = {
241+
...props,
242+
initialValue: props.modelValue,
243+
initialPeriod: props.period,
244+
}
245+
242246
const cron = useCron(options)
243247

244248
watch(
245-
modelValue,
249+
() => props.modelValue,
246250
(value) => {
247251
if (value) {
248252
cron.cron.value = value
249253
}
250254
},
251-
{ immediate: true },
255+
)
256+
257+
watch(
258+
() => props.period,
259+
(value) => {
260+
if (value) {
261+
cron.period.select(value)
262+
}
263+
},
252264
)
253265

254266
watch(cron.cron, (value) => {
255267
emit('update:model-value', value)
256268
})
257269

270+
watch(cron.period.selected, (value) => {
271+
emit('update:period', value.id)
272+
})
273+
258274
watch(cron.error, (error) => {
259275
emit('error', error)
260276
})
@@ -276,7 +292,7 @@ export const cronCoreProps = () => ({
276292
*
277293
* @defaultValue last entry of `CronCoreProps.periods`
278294
*/
279-
initialPeriod: {
295+
period: {
280296
type: String,
281297
},
282298
/**
@@ -349,26 +365,9 @@ export type CronCoreProps = Partial<ExtractPropTypes<ReturnType<typeof cronCoreP
349365
export const CronCore = defineComponent({
350366
name: 'VueCronCore',
351367
props: cronCoreProps(),
352-
emits: ['update:model-value', 'error'],
368+
emits: ['update:model-value', 'update:period', 'error'],
353369
setup(props, ctx) {
354-
const { cron, error, selected, period } = useCron(props)
355-
356-
watch(cron, (value) => {
357-
ctx.emit('update:model-value', value)
358-
})
359-
360-
watch(error, (value) => {
361-
ctx.emit('error', value)
362-
})
363-
364-
watch(
365-
() => props.modelValue,
366-
(value) => {
367-
if (value) {
368-
cron.value = value
369-
}
370-
},
371-
)
370+
const { error, selected, period } = setupCron(props, ctx)
372371

373372
return () => {
374373
const slotProps = {

docs/src/.vuepress/components/cron-demo.vue

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,6 @@ export default {
117117
const disabled = ref(false)
118118
119119
const selectFlavor = (name) => {
120-
console.log(name)
121120
let i = flavors.map(f => f.name).indexOf(name)
122121
i = i >= 0 ? i : 0
123122
flavor.value = flavors[i]

element-plus/src/components/cron-element-plus.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,9 @@ export default defineComponent({
7474
CustomSelect,
7575
},
7676
props: cronElementPlusProps(),
77-
emits: ['update:model-value', 'error'],
77+
emits: ['update:model-value', 'update:period', 'error'],
7878
setup(props, ctx) {
79-
return setupCron(props, () => props.modelValue, ctx)
79+
return setupCron(props, ctx)
8080
},
8181
})
8282
</script>

light/src/App.vue

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<div>
33
<cron-light
44
v-model="value"
5-
initial-period="month"
5+
v-model:period="period"
66
format="quartz"
77
locale="en"
88
@error="error = $event"
@@ -27,9 +27,18 @@ export default {
2727
data: () => {
2828
return {
2929
value: '* * * * * *',
30+
period: 'month',
3031
error: '',
3132
}
3233
},
34+
watch: {
35+
value: function (value) {
36+
console.log('value changed: ' + value)
37+
},
38+
period: function (value) {
39+
console.log('period changed: ' + value)
40+
},
41+
},
3342
methods: {
3443
updateValue(evt: any) {
3544
this.value = evt.target.value

light/src/components/cron-light.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,10 @@ export default defineComponent({
5555
components: {
5656
CustomSelect,
5757
},
58-
emits: ['update:model-value', 'error'],
58+
emits: ['update:model-value', 'update:period', 'error'],
5959
props: cronLightProps(),
6060
setup(props, ctx) {
61-
return setupCron(props, () => props.modelValue, ctx)
61+
return setupCron(props, ctx)
6262
},
6363
})
6464
</script>

naive-ui/src/components/cron-naive-ui.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,9 @@ export default defineComponent({
8585
CustomSelect,
8686
},
8787
props: cronNaiveProps(),
88-
emits: ['update:model-value', 'error'],
88+
emits: ['update:model-value', 'update:period', 'error'],
8989
setup(props, ctx) {
90-
return setupCron(props, () => props.modelValue, ctx)
90+
return setupCron(props, ctx)
9191
},
9292
})
9393
</script>

0 commit comments

Comments
 (0)