Skip to content

Commit ea80fb9

Browse files
committed
feat: add customLocale
1 parent 7342b12 commit ea80fb9

File tree

14 files changed

+354
-200
lines changed

14 files changed

+354
-200
lines changed

examples/vue-cron.vue

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,18 @@
77
<span>
88
Every:
99
<select @input="p.periodEvents.input(JSON.parse($event.target.value))">
10-
<option v-for="item in p.periodData.items" :key="item.text" :value="JSON.stringify(item.value)">{{item.text}}</option>
10+
<option v-for="item in p.periodData.items" :key="item.text" :value="JSON.stringify(item)">{{item.text}}</option>
1111
</select>
1212
</span>
1313

1414

1515
<template v-for="f in p.fields">
1616
<span :key="f.id">
17-
{{f.id}}:
17+
{{f.prefix}}
1818
<select @input="f.events.input(getSelected($event.target))" multiple>
1919
<option v-for="item in f.items" :key="item.value" :value="item.value">{{item.text}}</option>
2020
</select>
21+
{{f.suffix}}
2122
</span>
2223
</template>
2324

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,8 @@
4141
"vue": "^2.6.12",
4242
"vue-jest": "^3.0.7",
4343
"vue-template-compiler": "^2.6.12"
44+
},
45+
"dependencies": {
46+
"mustache": "^4.2.0"
4447
}
4548
}

src/core.vue

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<script>
22
import multiple from './fields/multiple'
3-
import util from './util'
3+
import types from './types'
44
import locale from './locale'
55
6-
const {getLocale} = locale
7-
const {Field} = util
6+
const {getLocale, defaultItems, getSuffix, getPrefix} = locale
7+
const {Field} = types
88
99
export default {
1010
name: "VueCronCore",
@@ -21,29 +21,37 @@ export default {
2121
type: Array,
2222
default: function() {
2323
24-
let locale = getLocale(this.locale)
24+
let items = defaultItems(this.locale)
2525
2626
return [
27-
{id: 'minute', items: locale.minuteItems},
28-
{id: 'hour', items: locale.hourItems},
29-
{id: 'day', items: locale.dayItems},
30-
{id: 'month', items: locale.monthItems},
31-
{id: 'dayOfWeek', items: locale.dayOfWeekItems},
27+
{id: 'minute', items: items.minuteItems},
28+
{id: 'hour', items: items.hourItems},
29+
{id: 'day', items: items.dayItems},
30+
{id: 'month', items: items.monthItems},
31+
{id: 'dayOfWeek', items: items.dayOfWeekItems},
3232
]
3333
}
3434
},
3535
periods: {
3636
type: Array,
3737
default: () => {
3838
return [
39-
{ text: 'Minute', value: [] },
40-
{ text: 'Hour', value: ['minute'] },
41-
{ text: 'Day', value: ['hour', 'minute'] },
42-
{ text: 'Week', value: ['day', 'hour', 'minute'] },
43-
{ text: 'Month', value: ['dayOfWeek', 'day', 'hour', 'minute'] },
44-
{ text: 'Year', value: ['month', 'dayOfWeek', 'day', 'hour', 'minute'] },
39+
{ id: 'minute', text: 'Minute', value: [] },
40+
{ id: 'hour', text: 'Hour', value: ['minute'] },
41+
{ id: 'day', text: 'Day', value: ['hour', 'minute'] },
42+
{ id: 'week', text: 'Week', value: ['dayOfWeek', 'hour', 'minute'] },
43+
{ id: 'month', text: 'Month', value: ['day', 'dayOfWeek', 'hour', 'minute'] },
44+
{ id: 'year', text: 'Year', value: ['month', 'day', 'dayOfWeek', 'hour', 'minute'] },
4545
]
4646
}
47+
},
48+
customLocale: {
49+
type: Object,
50+
default: function() {
51+
52+
return getLocale(this.locale)
53+
54+
}
4755
}
4856
},
4957
data(){
@@ -56,7 +64,7 @@ export default {
5664
return {
5765
selected: selected,
5866
error: '',
59-
selectedPeriod: this.periods[this.periods.length-1].value
67+
selectedPeriod: this.periods[this.periods.length-1]
6068
}
6169
},
6270
@@ -74,11 +82,11 @@ export default {
7482
return this.fields.map((f) => new Field(f.id, f.items))
7583
},
7684
filteredFields(){
77-
return this.selectedPeriod.map((fieldId) => {
85+
return this.selectedPeriod.value.map((fieldId) => {
7886
let i = this.fieldIndex[fieldId]
7987
return this.computedFields[i]
8088
})
81-
}
89+
},
8290
},
8391
8492
watch: {
@@ -117,17 +125,18 @@ export default {
117125
}
118126
let events = {
119127
input: ((fieldId) => (evt) => {
120-
console.log('input', fieldId, evt)
121128
this.selected[fieldId] = evt
122129
})(field.id)
123130
}
124131
125132
fieldProps.push({
126133
...field,
127134
cron: this.splitValue[i],
128-
selectedStr: multiple.arrayToStr(values, field).text,
135+
selectedStr: multiple.arrayToStr(values, field).getText(this.customLocale, this.selectedPeriod.id),
129136
events,
130-
attrs
137+
attrs,
138+
prefix: getPrefix(this.customLocale, this.selectedPeriod.id, field.id),
139+
suffix: getSuffix(this.customLocale, this.selectedPeriod.id, field.id)
131140
})
132141
}
133142
@@ -136,7 +145,7 @@ export default {
136145
fields: fieldProps,
137146
138147
periodAttrs: {
139-
value: this.selectedPeriod
148+
value: this.selectedPeriod.value
140149
},
141150
periodEvents: {
142151
input: (evt) => {
@@ -166,7 +175,7 @@ export default {
166175
167176
for(var i = 0; i < this.splitValue.length; i++){
168177
let field = this.computedFields[i]
169-
if(!this.selectedPeriod.includes(field.id)){
178+
if(!this.selectedPeriod.value.includes(field.id)){
170179
continue
171180
}
172181
@@ -184,7 +193,7 @@ export default {
184193
185194
let strings = []
186195
for(let field of this.computedFields){
187-
if(!this.selectedPeriod.includes(field.id)){
196+
if(!this.selectedPeriod.value.includes(field.id)){
188197
strings.push('*')
189198
continue
190199
}

src/fields/any.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
// *
3-
import util from '../util'
4-
const { AnyColumn } = util
3+
import types from '../types'
4+
const { AnyColumn } = types
55

66
function strToArray(str){
77
if(str != '*'){

src/fields/every.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// */x
2-
import util from '../util'
3-
const { EveryColumn } = util
2+
import types from '../types'
3+
const { EveryColumn } = types
44

55
let re = /^\*\/\d+$/
66

src/fields/range.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
import types from '../types'
12
import util from '../util'
2-
let { RangeColumn, CombinedColumn, ValueColumn } = util
3+
let { RangeColumn, CombinedColumn, ValueColumn } = types
34
// x-y
45

56
let re = /^\d+-\d+$/

src/fields/value.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// x
2-
import util from '../util'
3-
const { ValueColumn, CombinedColumn } = util
2+
import types from '../types'
3+
const { ValueColumn, CombinedColumn } = types
44

55
function strToArray(str, {min, max}){
66
let number = parseInt(str)

src/locale/en.js

Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,47 @@
1-
import util from '../util'
2-
3-
export default () => {
4-
return {
5-
minuteItems: util.genItems(0, 59, (value) => util.pad(value, 2)),
6-
hourItems: util.genItems(0, 59, (value) => util.pad(value, 2)),
7-
dayItems: util.genItems(1, 31),
8-
monthItems: util.genItems(1, 12, (value) => {
9-
return new Date(2021, value-1, 1).toLocaleDateString('en-US', {month: 'long'})
10-
}),
11-
dayOfWeekItems: util.genItems(0, 6, (value) => {
12-
let date = new Date(2021, 0, 3+value) //first sunday in 2021
13-
return date.toLocaleDateString('en-US', {weekday: 'long'})
14-
})
1+
export default {
2+
eachPeriod: {
3+
eachField: {
4+
empty: 'every {{field.id}}',
5+
value: '{{value.text}}',
6+
range: '{{start.text}}-{{end.text}}',
7+
everyX: 'every {{every.value}}'
8+
},
9+
monthField: {
10+
prefix: 'in',
11+
value: '{{value.alt}}',
12+
range: '{{start.alt}}-{{end.alt}}',
13+
},
14+
dayField: {
15+
prefix: 'on'
16+
},
17+
dayOfWeekField: {
18+
prefix: 'on',
19+
empty: 'every day of the week',
20+
value: '{{value.alt}}',
21+
range: '{{start.alt}}-{{end.alt}}',
22+
},
23+
hourField: {
24+
prefix: 'at'
25+
},
26+
minuteField: {
27+
prefix: ':'
28+
}
29+
},
30+
hourPeriod: {
31+
minuteField: {
32+
prefix: 'at',
33+
suffix: 'minute(s)',
34+
empty: 'every'
35+
}
36+
},
37+
monthPeriod: {
38+
dayOfWeekField: {
39+
prefix: 'and'
40+
}
41+
},
42+
yearPeriod: {
43+
dayOfWeekField: {
44+
prefix: 'and'
45+
}
1546
}
1647
}

src/locale/index.js

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,65 @@
11
import en from './en'
2+
import util from '../util'
3+
const {genItems, pad} = util
24

35
const locales = {
46
en: en
57
}
68

9+
function traverse(obj, ...keys){
10+
if(keys.length == 0)
11+
return obj
12+
13+
for(let key of keys[0]){
14+
if(obj.hasOwnProperty(key)){
15+
let res = traverse(obj[key], ...keys.slice(1))
16+
if(res !== undefined){
17+
return res
18+
}
19+
}
20+
}
21+
return
22+
}
23+
724
export default {
825
getLocale: (locale) => {
926
if(locales.hasOwnProperty(locale)){
10-
return locales[locale]()
27+
return locales[locale]
1128
}
1229
else {
13-
return locales['en']()
30+
return locales['en']
1431
}
15-
}
32+
},
33+
34+
getLocaleStr: (locale, periodId, fieldId, localeKey) => {
35+
return traverse(locale, [periodId+'Period', 'eachPeriod'], [fieldId+'Field', 'eachField'], [localeKey]) || ''
36+
},
37+
38+
getPrefix: (locale, periodId, fieldId) => {
39+
return traverse(locale, [periodId+'Period', 'eachPeriod'], [fieldId+'Field', 'eachField'], ['prefix']) || ''
40+
},
41+
42+
getSuffix: (locale, periodId, fieldId) => {
43+
return traverse(locale, [periodId+'Period', 'eachPeriod'], [fieldId+'Field', 'eachField'], ['suffix']) || ''
44+
},
45+
46+
defaultItems: (locale) => {
47+
return {
48+
minuteItems: genItems(0, 59, (value) => pad(value, 2)),
49+
hourItems: genItems(0, 59, (value) => pad(value, 2)),
50+
dayItems: genItems(1, 31),
51+
monthItems: genItems(1, 12, (value) => {
52+
return new Date(2021, value-1, 1).toLocaleDateString(locale, {month: 'long'})
53+
}, (value) => {
54+
return new Date(2021, value-1, 1).toLocaleDateString(locale, {month: 'short'})
55+
}),
56+
dayOfWeekItems: genItems(0, 6, (value) => {
57+
let date = new Date(2021, 0, 3+value) //first sunday in 2021
58+
return date.toLocaleDateString(locale, {weekday: 'long'})
59+
}, (value) => {
60+
let date = new Date(2021, 0, 3+value) //first sunday in 2021
61+
return date.toLocaleDateString(locale, {weekday: 'short'})
62+
})
63+
}
64+
},
1665
}

0 commit comments

Comments
 (0)