Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
E
Element
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
CI / CD Analytics
Repository Analytics
Value Stream Analytics
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
林焕东
Element
Commits
a7d3f69f
Commit
a7d3f69f
authored
May 30, 2019
by
Zhi Cun
Committed by
luckyCao
May 30, 2019
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
DatePicker: support literal (#15525)
parent
fa802b89
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
117 additions
and
30 deletions
+117
-30
examples/docs/en-US/date-picker.md
examples/docs/en-US/date-picker.md
+1
-0
examples/docs/es/date-picker.md
examples/docs/es/date-picker.md
+1
-0
examples/docs/fr-FR/date-picker.md
examples/docs/fr-FR/date-picker.md
+1
-0
examples/docs/zh-CN/date-picker.md
examples/docs/zh-CN/date-picker.md
+1
-0
src/utils/date.js
src/utils/date.js
+54
-30
test/unit/specs/date-picker.spec.js
test/unit/specs/date-picker.spec.js
+59
-0
No files found.
examples/docs/en-US/date-picker.md
View file @
a7d3f69f
...
@@ -346,6 +346,7 @@ Pay attention to capitalization
...
@@ -346,6 +346,7 @@ Pay attention to capitalization
|
`A`
| AM/PM | only for
`format`
, uppercased | AM |
|
`A`
| AM/PM | only for
`format`
, uppercased | AM |
|
`a`
| am/pm | only for
`format`
, lowercased | am |
|
`a`
| am/pm | only for
`format`
, lowercased | am |
|
`timestamp`
| JS timestamp | only for
`value-format`
; binding value will be a
`number`
| 1483326245000 |
|
`timestamp`
| JS timestamp | only for
`value-format`
; binding value will be a
`number`
| 1483326245000 |
|
`[MM]`
| No escape characters | To escape characters, wrap them in square brackets (e.g.
[
A
]
[
MM
]
) | MM |
:::demo
:::demo
```
html
```
html
...
...
examples/docs/es/date-picker.md
View file @
a7d3f69f
...
@@ -346,6 +346,7 @@ Preste atención a la capitalización
...
@@ -346,6 +346,7 @@ Preste atención a la capitalización
|
`A`
| AM/PM | solamente para
`format`
, mayusculas | AM |
|
`A`
| AM/PM | solamente para
`format`
, mayusculas | AM |
|
`a`
| am/pm | solamente para
`format`
, minúsculas | am |
|
`a`
| am/pm | solamente para
`format`
, minúsculas | am |
|
`timestamp`
| JS timestamp | solamente para
`value-format`
; valor vinculado debe ser un
`number`
| 1483326245000 |
|
`timestamp`
| JS timestamp | solamente para
`value-format`
; valor vinculado debe ser un
`number`
| 1483326245000 |
|
`[MM]`
| No escape characters | To escape characters, wrap them in square brackets (e.g.
[
A
]
[
MM
]
) | MM |
:::demo
:::demo
```
html
```
html
...
...
examples/docs/fr-FR/date-picker.md
View file @
a7d3f69f
...
@@ -347,6 +347,7 @@ Attention à la capitalisation !
...
@@ -347,6 +347,7 @@ Attention à la capitalisation !
|
`A`
| AM/PM | uniquement pour
`format`
, majuscules | AM |
|
`A`
| AM/PM | uniquement pour
`format`
, majuscules | AM |
|
`a`
| am/pm | uniquement pour
`format`
, minuscules | am |
|
`a`
| am/pm | uniquement pour
`format`
, minuscules | am |
|
`timestamp`
| timestamp JS | uniquement pour
`value-format`
; la variable stockée sera un
`number`
| 1483326245000 |
|
`timestamp`
| timestamp JS | uniquement pour
`value-format`
; la variable stockée sera un
`number`
| 1483326245000 |
|
`[MM]`
| No escape characters | To escape characters, wrap them in square brackets (e.g.
[
A
]
[
MM
]
) | MM |
:::demo
:::demo
```
html
```
html
...
...
examples/docs/zh-CN/date-picker.md
View file @
a7d3f69f
...
@@ -299,6 +299,7 @@
...
@@ -299,6 +299,7 @@
|
`A`
| AM/PM | 仅
`format`
可用,大写 | AM |
|
`A`
| AM/PM | 仅
`format`
可用,大写 | AM |
|
`a`
| am/pm | 仅
`format`
可用,小写 | am |
|
`a`
| am/pm | 仅
`format`
可用,小写 | am |
|
`timestamp`
| JS时间戳 | 仅
`value-format`
可用;组件绑定值为
`number`
类型 | 1483326245000 |
|
`timestamp`
| JS时间戳 | 仅
`value-format`
可用;组件绑定值为
`number`
类型 | 1483326245000 |
|
`[MM]`
| 不需要格式化字符 | 使用方括号标识不需要格式化的字符 (如
[
A
]
[
MM
]
) | MM |
:::demo
:::demo
```
html
```
html
...
...
src/utils/date.js
View file @
a7d3f69f
...
@@ -34,13 +34,18 @@
...
@@ -34,13 +34,18 @@
*/
*/
var
fecha
=
{};
var
fecha
=
{};
var
token
=
/d
{1,4}
|M
{1,4}
|yy
(?:
yy
)?
|S
{1,3}
|Do|ZZ|
([
HhMsDm
])\1?
|
[
aA
]
|"
[^
"
]
*"|'
[^
'
]
*'/g
;
var
token
=
/d
{1,4}
|M
{1,4}
|yy
(?:
yy
)?
|S
{1,3}
|Do|ZZ|
([
HhMsDm
])\1?
|
[
aA
]
|"
[^
"
]
*"|'
[^
'
]
*'/g
;
var
twoDigits
=
/
\d\d?
/
;
var
twoDigits
=
'
\\
d
\\
d?
'
;
var
threeDigits
=
/
\d{3}
/
;
var
threeDigits
=
'
\\
d{3}
'
;
var
fourDigits
=
/
\d{4}
/
;
var
fourDigits
=
'
\\
d{4}
'
;
var
word
=
/
[
0-9
]
*
[
'a-z
\u
00A0-
\u
05FF
\u
0700-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
]
+|
[\u
0600-
\u
06FF
\/]
+
(\s
*
?[\u
0600-
\u
06FF
]
+
){1,2}
/i
;
var
word
=
'
[^
\\
s]+
'
;
var
literal
=
/
\[([^]
*
?)\]
/gm
;
var
noop
=
function
()
{
var
noop
=
function
()
{
};
};
function
regexEscape
(
str
)
{
return
str
.
replace
(
/
[
|
\\
{()[^$+*?.-
]
/g
,
'
\\
$&
'
);
}
function
shorten
(
arr
,
sLen
)
{
function
shorten
(
arr
,
sLen
)
{
var
newArr
=
[];
var
newArr
=
[];
for
(
var
i
=
0
,
len
=
arr
.
length
;
i
<
len
;
i
++
)
{
for
(
var
i
=
0
,
len
=
arr
.
length
;
i
<
len
;
i
++
)
{
...
@@ -117,10 +122,10 @@
...
@@ -117,10 +122,10 @@
return
i18n
.
monthNames
[
dateObj
.
getMonth
()];
return
i18n
.
monthNames
[
dateObj
.
getMonth
()];
},
},
yy
:
function
(
dateObj
)
{
yy
:
function
(
dateObj
)
{
return
String
(
dateObj
.
getFullYear
()
).
substr
(
2
);
return
pad
(
String
(
dateObj
.
getFullYear
()),
4
).
substr
(
2
);
},
},
yyyy
:
function
(
dateObj
)
{
yyyy
:
function
(
dateObj
)
{
return
dateObj
.
getFullYear
(
);
return
pad
(
dateObj
.
getFullYear
(),
4
);
},
},
h
:
function
(
dateObj
)
{
h
:
function
(
dateObj
)
{
return
dateObj
.
getHours
()
%
12
||
12
;
return
dateObj
.
getHours
()
%
12
||
12
;
...
@@ -171,6 +176,9 @@
...
@@ -171,6 +176,9 @@
d
:
[
twoDigits
,
function
(
d
,
v
)
{
d
:
[
twoDigits
,
function
(
d
,
v
)
{
d
.
day
=
v
;
d
.
day
=
v
;
}],
}],
Do
:
[
twoDigits
+
word
,
function
(
d
,
v
)
{
d
.
day
=
parseInt
(
v
,
10
);
}],
M
:
[
twoDigits
,
function
(
d
,
v
)
{
M
:
[
twoDigits
,
function
(
d
,
v
)
{
d
.
month
=
v
-
1
;
d
.
month
=
v
-
1
;
}],
}],
...
@@ -190,10 +198,10 @@
...
@@ -190,10 +198,10 @@
yyyy
:
[
fourDigits
,
function
(
d
,
v
)
{
yyyy
:
[
fourDigits
,
function
(
d
,
v
)
{
d
.
year
=
v
;
d
.
year
=
v
;
}],
}],
S
:
[
/
\d
/
,
function
(
d
,
v
)
{
S
:
[
'
\\
d
'
,
function
(
d
,
v
)
{
d
.
millisecond
=
v
*
100
;
d
.
millisecond
=
v
*
100
;
}],
}],
SS
:
[
/
\d{2}
/
,
function
(
d
,
v
)
{
SS
:
[
'
\\
d{2}
'
,
function
(
d
,
v
)
{
d
.
millisecond
=
v
*
10
;
d
.
millisecond
=
v
*
10
;
}],
}],
SSS
:
[
threeDigits
,
function
(
d
,
v
)
{
SSS
:
[
threeDigits
,
function
(
d
,
v
)
{
...
@@ -211,8 +219,8 @@
...
@@ -211,8 +219,8 @@
d
.
isPm
=
true
;
d
.
isPm
=
true
;
}
}
}],
}],
ZZ
:
[
/
[\+\-]\d\d
:
?\d\d
/
,
function
(
d
,
v
)
{
ZZ
:
[
'
[^
\\
s]*?[
\\
+
\\
-]
\\
d
\\
d:?
\\
d
\\
d|[^
\\
s]*?Z
'
,
function
(
d
,
v
)
{
var
parts
=
(
v
+
''
).
match
(
/
([
\+\
-]
|
\d\d)
/gi
),
minutes
;
var
parts
=
(
v
+
''
).
match
(
/
([
+
-
]
|
\d\d)
/gi
),
minutes
;
if
(
parts
)
{
if
(
parts
)
{
minutes
=
+
(
parts
[
1
]
*
60
)
+
parseInt
(
parts
[
2
],
10
);
minutes
=
+
(
parts
[
1
]
*
60
)
+
parseInt
(
parts
[
2
],
10
);
...
@@ -220,9 +228,9 @@
...
@@ -220,9 +228,9 @@
}
}
}]
}]
};
};
parseFlags
.
DD
=
parseFlags
.
D
;
parseFlags
.
dd
=
parseFlags
.
d
;
parseFlags
.
dddd
=
parseFlags
.
ddd
;
parseFlags
.
dddd
=
parseFlags
.
ddd
;
parseFlags
.
D
o
=
parseFlags
.
dd
=
parseFlags
.
d
;
parseFlags
.
D
D
=
parseFlags
.
D
;
parseFlags
.
mm
=
parseFlags
.
m
;
parseFlags
.
mm
=
parseFlags
.
m
;
parseFlags
.
hh
=
parseFlags
.
H
=
parseFlags
.
HH
=
parseFlags
.
h
;
parseFlags
.
hh
=
parseFlags
.
H
=
parseFlags
.
HH
=
parseFlags
.
h
;
parseFlags
.
MM
=
parseFlags
.
M
;
parseFlags
.
MM
=
parseFlags
.
M
;
...
@@ -232,7 +240,7 @@
...
@@ -232,7 +240,7 @@
// Some common format strings
// Some common format strings
fecha
.
masks
=
{
fecha
.
masks
=
{
'
default
'
:
'
ddd MMM dd yyyy HH:mm:ss
'
,
default
:
'
ddd MMM dd yyyy HH:mm:ss
'
,
shortDate
:
'
M/D/yy
'
,
shortDate
:
'
M/D/yy
'
,
mediumDate
:
'
MMM d, yyyy
'
,
mediumDate
:
'
MMM d, yyyy
'
,
longDate
:
'
MMMM d, yyyy
'
,
longDate
:
'
MMMM d, yyyy
'
,
...
@@ -261,9 +269,21 @@
...
@@ -261,9 +269,21 @@
mask
=
fecha
.
masks
[
mask
]
||
mask
||
fecha
.
masks
[
'
default
'
];
mask
=
fecha
.
masks
[
mask
]
||
mask
||
fecha
.
masks
[
'
default
'
];
return
mask
.
replace
(
token
,
function
(
$0
)
{
var
literals
=
[];
// Make literals inactive by replacing them with ??
mask
=
mask
.
replace
(
literal
,
function
(
$0
,
$1
)
{
literals
.
push
(
$1
);
return
'
@@@
'
;
});
// Apply formatting rules
mask
=
mask
.
replace
(
token
,
function
(
$0
)
{
return
$0
in
formatFlags
?
formatFlags
[
$0
](
dateObj
,
i18n
)
:
$0
.
slice
(
1
,
$0
.
length
-
1
);
return
$0
in
formatFlags
?
formatFlags
[
$0
](
dateObj
,
i18n
)
:
$0
.
slice
(
1
,
$0
.
length
-
1
);
});
});
// Inline literal values back into the formatted value
return
mask
.
replace
(
/@@@/g
,
function
()
{
return
literals
.
shift
();
});
};
};
/**
/**
...
@@ -285,31 +305,35 @@
...
@@ -285,31 +305,35 @@
// Avoid regular expression denial of service, fail early for really long strings
// Avoid regular expression denial of service, fail early for really long strings
// https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS
// https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS
if
(
dateStr
.
length
>
1000
)
{
if
(
dateStr
.
length
>
1000
)
{
return
false
;
return
null
;
}
}
var
isValid
=
true
;
var
dateInfo
=
{};
var
dateInfo
=
{};
format
.
replace
(
token
,
function
(
$0
)
{
var
parseInfo
=
[];
var
literals
=
[];
format
=
format
.
replace
(
literal
,
function
(
$0
,
$1
)
{
literals
.
push
(
$1
);
return
'
@@@
'
;
});
var
newFormat
=
regexEscape
(
format
).
replace
(
token
,
function
(
$0
)
{
if
(
parseFlags
[
$0
])
{
if
(
parseFlags
[
$0
])
{
var
info
=
parseFlags
[
$0
];
var
info
=
parseFlags
[
$0
];
var
index
=
dateStr
.
search
(
info
[
0
]);
parseInfo
.
push
(
info
[
1
]);
if
(
!~
index
)
{
return
'
(
'
+
info
[
0
]
+
'
)
'
;
isValid
=
false
;
}
else
{
dateStr
.
replace
(
info
[
0
],
function
(
result
)
{
info
[
1
](
dateInfo
,
result
,
i18n
);
dateStr
=
dateStr
.
substr
(
index
+
result
.
length
);
return
result
;
});
}
}
}
return
parseFlags
[
$0
]
?
''
:
$0
.
slice
(
1
,
$0
.
length
-
1
)
;
return
$0
;
});
});
newFormat
=
newFormat
.
replace
(
/@@@/g
,
function
()
{
return
literals
.
shift
();
});
var
matches
=
dateStr
.
match
(
new
RegExp
(
newFormat
,
'
i
'
));
if
(
!
matches
)
{
return
null
;
}
if
(
!
isValid
)
{
for
(
var
i
=
1
;
i
<
matches
.
length
;
i
++
)
{
return
false
;
parseInfo
[
i
-
1
](
dateInfo
,
matches
[
i
],
i18n
)
;
}
}
var
today
=
new
Date
();
var
today
=
new
Date
();
...
...
test/unit/specs/date-picker.spec.js
View file @
a7d3f69f
...
@@ -489,6 +489,37 @@ describe('DatePicker', () => {
...
@@ -489,6 +489,37 @@ describe('DatePicker', () => {
},
DELAY
);
},
DELAY
);
});
});
it
(
'
with literal string
'
,
done
=>
{
vm
=
createVue
({
template
:
`
<el-date-picker
ref="compo"
v-model="value"
type="date"
value-format="dd/MM yyyy [Element]" />`
,
data
()
{
return
{
value
:
''
};
}
},
true
);
vm
.
$refs
.
compo
.
$el
.
querySelector
(
'
input
'
).
focus
();
setTimeout
(
_
=>
{
vm
.
$refs
.
compo
.
picker
.
$el
.
querySelector
(
'
.el-date-table td.available
'
).
click
();
setTimeout
(
_
=>
{
const
today
=
new
Date
();
const
yyyy
=
today
.
getFullYear
();
const
MM
=
(
'
0
'
+
(
today
.
getMonth
()
+
1
)).
slice
(
-
2
);
const
dd
=
'
01
'
;
// first available one should be first day of month
const
expectValue
=
`
${
dd
}
/
${
MM
}
${
yyyy
}
Element`
;
expect
(
vm
.
value
).
to
.
equal
(
expectValue
);
done
();
},
DELAY
);
},
DELAY
);
});
it
(
'
accepts
'
,
done
=>
{
it
(
'
accepts
'
,
done
=>
{
vm
=
createVue
({
vm
=
createVue
({
template
:
`
template
:
`
...
@@ -549,6 +580,34 @@ describe('DatePicker', () => {
...
@@ -549,6 +580,34 @@ describe('DatePicker', () => {
},
DELAY
);
},
DELAY
);
});
});
it
(
'
translates format to value-format with literal string
'
,
done
=>
{
vm
=
createVue
({
template
:
`
<el-date-picker
ref="compo"
v-model="value"
type="date"
format="[Element] yyyy-MM-dd"
value-format="dd/MM yyyy [UI]" />`
,
data
()
{
return
{
value
:
''
};
}
},
true
);
const
input
=
vm
.
$refs
.
compo
.
$el
.
querySelector
(
'
input
'
);
input
.
focus
();
setTimeout
(
_
=>
{
input
.
value
=
'
Element 2000-10-01
'
;
triggerEvent
(
input
,
'
input
'
);
keyDown
(
input
,
ENTER
);
setTimeout
(
_
=>
{
expect
(
vm
.
value
).
to
.
equal
(
'
01/10 2000 UI
'
);
done
();
},
DELAY
);
},
DELAY
);
});
it
(
'
works for daterange
'
,
done
=>
{
it
(
'
works for daterange
'
,
done
=>
{
vm
=
createVue
({
vm
=
createVue
({
template
:
`
template
:
`
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment