Blame view

build/InputNumber/InputNumber.js 6.95 KB
3a3ecabe   Imshann   init
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
  import template from "./InputNumber.html";
  angular.module("esNgAntd").directive("esInputNumber", function () {
      return {
          controllerAs: "esInputNumber",
          restrict: "E",
          transclude: true,
          replace: true,
          scope: {
              defaultValue: "@",
              min: "@",
              max: "@",
              onChange: "&",
              value: "@",
              precision: "@",
              key: "@",
              step: "@",
              formatter: "&",
              parser: "&",
              disabled: "@",
          },
          controller: function ($scope, $element) {
              this.getContext = function () {
                  return $scope;
              };
  
              $scope.state = {
                  value: $scope.value || $scope.defaultValue,
                  min: Number($scope.min),
                  max: Number($scope.max),
                  precision: Number($scope.precision) || 0,
                  key: Number($scope.key),
                  step: $scope.step || 1,
              };
              $scope.watch = {
                  value: function (newVal) {
                      $scope.setValue(newVal);
                  },
                  disabled: function (newVal) {
                      if (
                          newVal === undefined ||
                          newVal === "false" ||
                          newVal === "0"
                      ) {
                          $scope.state.disabled = false;
                      } else if (
                          newVal === "true" ||
                          newVal === "1" ||
                          newVal === "disabled"
                      ) {
                          $scope.state.disabled = true;
                      }
                  },
              };
  
              for (const key in $scope.watch) {
                  $scope.$watch(key, $scope.watch[key], true);
              }
  
              $scope.multiply = function (num1, num2) {
                  let baseNum = 0;
  
                  try {
                      baseNum += num1.toString().split(".")[1].length;
                  } catch (e) {}
  
                  try {
                      baseNum += num2.toString().split(".")[1].length;
                  } catch (e) {}
  
                  return (
                      (Number(num1.toString().replace(".", "")) *
                          Number(num2.toString().replace(".", ""))) /
                      Math.pow(10, baseNum)
                  );
              };
  
              $scope.toFixed = function (value, number = 2) {
                  return parseFloat(
                      Math.floor($scope.multiply(value, Math.pow(10, number))) /
                          Math.pow(10, number)
                  ).toFixed(number);
              };
  
              $scope.setValue = function (value) {
                  if (
                      $scope.parser({
                          value: value,
                      }) !== undefined
                  ) {
                      value = $scope.parser({
                          value: value,
                      });
                  }
  
                  if (
                      $scope.state.max !== null &&
                      $scope.state.max !== undefined &&
                      value !== "" &&
                      value > $scope.state.max
                  ) {
                      value = $scope.state.max;
                  }
  
                  if (
                      $scope.state.min !== null &&
                      $scope.state.min !== undefined &&
                      value !== "" &&
                      value < $scope.state.min
                  ) {
                      value = $scope.state.min;
                  }
  
                  if (!/\d+/.test(value)) {
                      $scope.state.value = "";
                      value = "";
                  }
  
                  if ($scope.state.precision === 0 && value !== "") {
                      value = parseInt(value);
                  }
  
                  if ($scope.state.precision > 0 && value !== "") {
                      value = $scope.toFixed(value, $scope.state.precision);
                  }
  
                  if (
                      $scope.formatter({
                          value: value,
                      }) !== undefined
                  ) {
                      value = $scope.formatter({
                          value: value,
                      });
                  }
  
                  $scope.state.value = value;
  
                  if (
                      $scope.parser({
                          value: value || "",
                      }) !== undefined
                  ) {
                      value = $scope.parser({
                          value: value || "",
                      });
                  }
  
                  $scope.onChange({
                      value: value,
                  });
              };
  
              $scope.sum = function (num1, num2) {
                  return (
                      ($scope.pow(num1) + $scope.pow(num2)) /
                      $scope.pow(1)
                  ).toFixed($scope.precision);
              };
  
              $scope.reduce = function (num1, num2) {
                  return (
                      ($scope.pow(num1) - $scope.pow(num2)) /
                      $scope.pow(1)
                  ).toFixed($scope.precision);
              };
  
              $scope.pow = function (number, baseNum) {
                  let str = String(number);
  
                  if (str.indexOf(".") !== -1) {
                      return parseInt(str.replace(".", ""));
                  } else {
                      return (
                          number * Math.pow(10, baseNum || $scope.precision || 0)
                      );
                  }
              };
  
              $scope.handleClick = function (type) {
                  let value = null;
  
                  if (!$scope.state.value) {
                      value = 0;
                  } else {
                      value = $scope.state.value;
                  }
  
                  if (
                      $scope.parser({
                          value: value || "",
                      })
                  ) {
                      value = $scope.parser({
                          value: value || "",
                      });
                  }
  
                  if (type === "up") {
                      $scope.setValue($scope.sum(value, $scope.state.step));
                  } else {
                      $scope.setValue($scope.reduce(value, $scope.state.step));
                  }
              };
  
              $scope.handleClickInput = function (event) {
                  $scope.state.inputEvent = event;
              };
  
              $scope.handleBlur = function (event) {
                  $scope.setValue(event.target.value);
              };
          },
          link: function ($scope, $element, $attrs, $controllers, $transclude) {
              $scope.inputElement = $element[0].querySelector("input");
              $element[0].removeAttribute("ng-class");
              $element[0].removeAttribute("value");
              $element[0].removeAttribute("formatter");
              $element[0].removeAttribute("parser");
              $element[0].removeAttribute("on-change");
              $element[0].removeAttribute("disabled");
          },
      };
  });