Skip to content

Commit 39516d4

Browse files
committed
refactor(light): use composition api
1 parent dd33ece commit 39516d4

File tree

8 files changed

+5590
-4827
lines changed

8 files changed

+5590
-4827
lines changed

core-ts/yarn.lock

Lines changed: 0 additions & 2587 deletions
This file was deleted.

light/dev/example-usage.vue

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
<template>
22
<div>
3-
<VueCronEditor v-model="value">
3+
<VueCronEditor v-model="value" @error="error = $event">
44
</VueCronEditor>
5-
<div><br />cron expression: {{value}}</div>
5+
<div>
6+
<br />
7+
cron expression: <input :value="value" @change="updateValue"/></div>
8+
<br />
9+
Error: {{ error }}
610
</div>
711
</template>
812

@@ -13,10 +17,15 @@ export default {
1317
components: {
1418
VueCronEditor
1519
},
16-
1720
data: () => {
1821
return {
19-
value: '* * * * *'
22+
value: '* * * * *',
23+
error: ''
24+
}
25+
},
26+
methods: {
27+
updateValue (evt) {
28+
this.value = evt.target.value
2029
}
2130
}
2231
}

light/package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,8 @@
2222
"clean": "git clean -xf dist"
2323
},
2424
"dependencies": {
25-
"@vue-js-cron/core": "3.7.1"
25+
"@vue-js-cron/core-ts": "^3.7.1"
2626
},
27-
"devDependencies": {},
2827
"files": [
2928
"package.json",
3029
"dist",

light/src/CronEditor.vue

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,36 @@
11

22
<template>
3-
<CronCore v-bind="$attrs" @update:model-value="$emit('update:model-value', $event)" @error="$emit('error', $event)" v-slot="{fields, period}">
4-
<span class="vcron-editor">
5-
<span>{{period.prefix}}</span>
3+
<span class="vcron-editor">
4+
{{ period.text }}
5+
<span>{{period.prefix.value}}</span>
6+
<div class="vcron-l-spacer">
7+
<custom-select :model-value="period.selected.value.id" item-value="id" :items="period.items" @update:model-value="period.select($event)" :cols="cols['period'] || 1" />
8+
</div>
9+
<span>{{period.suffix.value}}</span>
10+
11+
<template v-for="f in selected" :key="f.id">
12+
<span>{{f.prefix.value}}</span>
613
<div class="vcron-l-spacer">
7-
<custom-select v-bind="period.attrs" v-on="period.events" :items="period.items" item-value="id" :cols="cols['period'] || 1" />
14+
<custom-select :model-value="f.selected.value" @update:model-value="f.select($event)" :items="f.items" :cols="cols[f.id] || 1" :selection="f.text.value" multiple></custom-select>
815
</div>
9-
<span>{{period.suffix}}</span>
10-
11-
<template v-for="f in fields" :key="f.id">
12-
<span>{{f.prefix}}</span>
13-
<div class="vcron-l-spacer">
14-
<custom-select v-bind="f.attrs" v-on="f.events" :items="f.items" :cols="cols[f.id] || 1" :selection="f.selectedStr" multiple></custom-select>
15-
</div>
16-
<span>{{f.suffix}}</span>
17-
</template>
18-
</span>
19-
</CronCore>
16+
<span>{{f.suffix.value}}</span>
17+
</template>
18+
</span>
2019
</template>
2120

2221
<script>
23-
import CronCore from '@vue-js-cron/core'
22+
import { cronProps, useCron } from '@vue-js-cron/core-ts'
23+
import { defineComponent, watch } from 'vue'
2424
import CustomSelect from './components/CustomSelect.vue'
2525
26-
export default {
26+
export default defineComponent({
2727
name: 'VueCronEditor',
2828
components: {
29-
CronCore: CronCore.component,
3029
CustomSelect
3130
},
31+
emits: ['update:model-value', 'error'],
3232
props: {
33+
...cronProps,
3334
cols: {
3435
type: Object,
3536
default: () => {
@@ -41,8 +42,27 @@ export default {
4142
}
4243
}
4344
},
44-
emits: ['update:model-value', 'error']
45-
}
45+
setup (props, { emit }) {
46+
const cron = useCron(props)
47+
48+
watch(() => props.modelValue, (value) => {
49+
cron.cron.value = value
50+
})
51+
52+
watch(cron.cron, (value) => {
53+
emit('update:model-value', value)
54+
})
55+
56+
watch(cron.error, (error) => {
57+
emit('error', error)
58+
})
59+
60+
return {
61+
...cron
62+
}
63+
}
64+
})
65+
4666
</script>
4767

4868
<style>

light/src/components/CustomSelect.vue

Lines changed: 57 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,78 @@
11
<template>
2-
<renderless-select
3-
v-bind="$attrs"
4-
@update:model-value="$emit('update:model-value', $event)"
5-
#default="{ selectedStr, itemRows, select, isSelected, multiple }">
6-
7-
<div class="vcron-select-container">
8-
<span class="vcron-select-input" @click="toggleMenu">
9-
{{selectedStr}}
10-
</span>
11-
12-
<div class="vcron-select-list" v-if="menu">
13-
<div class="vcron-select-row" v-for="(row, i) in itemRows" :key="i">
14-
<div v-for="(item, j) in row"
15-
:key="i+'-'+j"
16-
class="vcron-select-col"
17-
:class="{'vcron-select-selected': isSelected(item)}"
18-
@click="select(item)"
19-
@click.stop="multiple ? () => {} : toggleMenu()">
20-
21-
<div v-if="item">{{item.text}}</div>
22-
</div>
2+
<div class="vcron-select-container">
3+
<span class="vcron-select-input" @click="toggleMenu">
4+
{{ selection ?? selectedStr }}
5+
</span>
6+
7+
<div class="vcron-select-list" v-if="menu">
8+
<div class="vcron-select-row" v-for="(row, i) in itemRows" :key="i">
9+
<div v-for="(item, j) in row"
10+
:key="i+'-'+j"
11+
class="vcron-select-col"
12+
:class="{'vcron-select-selected': has(item)}"
13+
@click="select(item)"
14+
@click.stop="multiple ? () => {} : toggleMenu()">
15+
16+
<div v-if="item">{{item.text}}</div>
2317
</div>
2418
</div>
2519
</div>
26-
</renderless-select>
20+
</div>
2721
</template>
2822

2923
<script>
30-
import { RenderlessSelect } from '@vue-js-cron/core'
24+
import { selectProps, useSelect } from '@vue-js-cron/core-ts'
25+
import { ref, watch } from 'vue'
3126
3227
export default {
33-
inheritAttrs: false,
34-
components: {
35-
RenderlessSelect
36-
},
3728
name: 'CustomSelect',
38-
props: {},
39-
emits: ['update:model-value'],
40-
data () {
41-
return {
42-
menu: false
29+
props: {
30+
...selectProps(),
31+
modelValue: {
32+
type: [String, Number, Array]
33+
},
34+
selection: {
35+
type: String
4336
}
4437
},
45-
methods: {
46-
menuEvtListener (evt) {
47-
this.menu = false
48-
document.removeEventListener('click', this.menuEvtListener)
49-
},
50-
toggleMenu () {
51-
this.menu = !this.menu
38+
emits: ['update:modelValue'],
39+
setup (props, { emit }) {
40+
const s = useSelect(props)
41+
const menu = ref(false)
5242
53-
if (this.menu) {
43+
if (props.modelValue) {
44+
s.selectValues(props.modelValue)
45+
}
46+
47+
const menuEvtListener = (evt) => {
48+
menu.value = false
49+
document.removeEventListener('click', menuEvtListener)
50+
}
51+
const toggleMenu = () => {
52+
menu.value = !menu.value
53+
54+
if (menu.value) {
5455
setTimeout(() => {
55-
document.addEventListener('click', this.menuEvtListener)
56+
document.addEventListener('click', menuEvtListener)
5657
}, 1)
5758
} else {
58-
document.removeEventListener('click', this.menuEvtListener)
59+
document.removeEventListener('click', menuEvtListener)
5960
}
6061
}
62+
63+
watch(s.selected, () => {
64+
emit('update:modelValue', s.selected.value)
65+
})
66+
67+
watch(() => props.modelValue, (value) => {
68+
s.selectValues(value)
69+
})
70+
71+
return {
72+
...s,
73+
menu,
74+
toggleMenu
75+
}
6176
}
6277
}
6378
</script>

light/src/index.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
// Import vue component
2-
import core from '@vue-js-cron/core'
32
import component from './CronEditor.vue'
43

54
// Declare install function executed by Vue.use()
@@ -12,8 +11,7 @@ export function install (Vue) {
1211
// Create module definition for Vue.use()
1312
const plugin = {
1413
install,
15-
component,
16-
util: core.util
14+
component
1715
}
1816

1917
// To allow use as module (npm/webpack/etc.) export component

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"license": "MIT",
66
"workspaces": [
77
"core",
8+
"core-ts",
89
"light",
910
"vuetify",
1011
"element-plus",
@@ -65,6 +66,6 @@
6566
"vue-jest": "^5.0.0-alpha.10"
6667
},
6768
"dependencies": {
68-
"vue": "^3.2.37"
69+
"vue": "^3.3.4"
6970
}
70-
}
71+
}

0 commit comments

Comments
 (0)