-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathangular-auto-value.js
More file actions
118 lines (106 loc) · 2.81 KB
/
angular-auto-value.js
File metadata and controls
118 lines (106 loc) · 2.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
(function (ng) {
var MILLISECONDS_PER_DAY = 86400000,
OFFSET_TO_START_WEEK_ON_MONDAY = 1,
JAN = 0,
DAYS_PER_WEEK = 7,
$PARSE = '$parse';
function getFirstDateOfTheYear(date) {
return new Date(date.getFullYear(), JAN, 1);
}
function getFirstMondayOfTheYear(date) {
var firstJan = getFirstDateOfTheYear(date);
return firstJan.getDay() + OFFSET_TO_START_WEEK_ON_MONDAY;
}
function setWeek(date, week) {
var dayOfTheYear = Math.floor(week * DAYS_PER_WEEK),
daysSinceFirstJan = dayOfTheYear - getFirstMondayOfTheYear(date),
msSinceFirstJan = daysSinceFirstJan * MILLISECONDS_PER_DAY,
firstJan = getFirstDateOfTheYear(date),
ms = firstJan.getTime() + msSinceFirstJan;
date.setTime(ms);
}
function setter(parse, scope, attr) {
var getter = parse(attr);
return function (value) {
getter.assign(scope, value);
};
}
function time(value, set) {
var date = new Date(),
time = value.split(/[:\.]/);
date.setHours.apply(date, time);
set(date);
}
function week(value, set) {
var val = value.split('-W'),
year = +val[0],
week = +val[1],
date = new Date(year, JAN, 1);
setWeek(date, week);
set(date);
}
function autoInputValueDirective($parse) {
function link($scope, $element, $attrs) {
if (!$attrs.ngModel) return;
var set = setter($parse, $scope, $attrs.ngModel),
value = $element.val(),
checked = $attrs.checked,
method;
switch ($attrs.type) {
case "button":
case "file":
case "hidden":
case "image":
case "reset":
case "submit":
return;
case "checkbox":
set(checked);
break;
case "number":
case "range":
set(+value);
break;
case "radio":
if (checked) set(value);
break;
case "date":
case "datetime":
case "datetime-local":
case "month":
set(new Date(value));
break;
case "time":
time(value, set);
break;
case "week":
week(value, set);
break;
default:
set(value);
}
}
return {
restrict: "E",
link: link
};
}
function autoValueDirective($parse) {
function link($scope, $element, $attrs) {
if (!$attrs.ngModel) return;
var val = $element.val(),
set = setter($parse, $scope, $attrs.ngModel);
set(val);
}
return {
restrict: "E",
link: link
};
}
autoValueDirective.$inject = [$PARSE];
ng
.module('auto-value', [])
.directive('input', [$PARSE, autoInputValueDirective])
.directive('select', autoValueDirective)
.directive('textarea', autoValueDirective);
}(angular));