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");
},
};
});