diff --git a/src/Umbraco.Web.UI.Client/lib/umbraco/Extensions.js b/src/Umbraco.Web.UI.Client/lib/umbraco/Extensions.js index 78124ac625..823d3d526d 100644 --- a/src/Umbraco.Web.UI.Client/lib/umbraco/Extensions.js +++ b/src/Umbraco.Web.UI.Client/lib/umbraco/Extensions.js @@ -329,10 +329,15 @@ /** Converts a string/integer/bool to true/false */ Object.toBoolean = function (obj) { + if (obj === undefined || obj === null) { + return false; + } + if ((typeof obj) === "boolean") { return obj; } - if (obj === "1" || obj === 1 || obj === "true") { + + if (obj === "1" || obj === 1 || obj.toString().toLowerCase() === "true") { return true; } return false; diff --git a/src/Umbraco.Web.UI.Client/src/common/services/umbdataformatter.service.js b/src/Umbraco.Web.UI.Client/src/common/services/umbdataformatter.service.js index 77ca2b6157..b18cb73eae 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/umbdataformatter.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/umbdataformatter.service.js @@ -316,10 +316,10 @@ // by looking at the key switch (foundAlias[0]) { case "umbracoMemberLockedOut": - saveModel.isLockedOut = prop.value ? (prop.value.toString() === "1" ? true : false) : false; + saveModel.isLockedOut = Object.toBoolean(prop.value); break; case "umbracoMemberApproved": - saveModel.isApproved = prop.value ? (prop.value.toString() === "1" ? true : false) : true; + saveModel.isApproved = Object.toBoolean(prop.value); break; case "umbracoMemberComments": saveModel.comments = prop.value; diff --git a/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/boolean.controller.js b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/boolean.controller.js index 895ac453a1..9ce7e18f06 100644 --- a/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/boolean.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/boolean.controller.js @@ -4,8 +4,7 @@ function updateToggleValue() { $scope.toggleValue = false; - if ($scope.model && $scope.model.value && - ($scope.model.value === true || $scope.model.value.toString() === "1" || $scope.model.value.toString().toLowerCase() === "true")) { + if ($scope.model && Object.toBoolean($scope.model.value)) { $scope.toggleValue = true; } } @@ -17,7 +16,7 @@ updateToggleValue(); $scope.toggle = function(){ - if($scope.model.value === 1 || $scope.model.value === "1"){ + if (Object.toBoolean($scope.model.value)) { $scope.model.value = "0"; updateToggleValue(); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/boolean/boolean.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/boolean/boolean.controller.js index 729d899439..4c8c5f845a 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/boolean/boolean.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/boolean/boolean.controller.js @@ -5,11 +5,11 @@ function booleanEditorController($scope, $rootScope, assetsService) { value: false }; - if ($scope.model.config && $scope.model.config.default && $scope.model.config.default.toString() === "1" && $scope.model && !$scope.model.value) { + if ($scope.model.config && $scope.model.config.default && Object.toBoolean($scope.model.config.default) && $scope.model && !$scope.model.value) { $scope.renderModel.value = true; } - if ($scope.model && $scope.model.value && ($scope.model.value.toString() === "1" || $scope.model.value.toString().toLowerCase() === "true")) { + if ($scope.model && $scope.model.value && Object.toBoolean($scope.model.value)) { $scope.renderModel.value = true; } } diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/datepicker/datepicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/datepicker/datepicker.controller.js index 36cac7b18b..0fb0e75d09 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/datepicker/datepicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/datepicker/datepicker.controller.js @@ -22,8 +22,6 @@ function dateTimePickerController($scope, notificationsService, assetsService, a $scope.model.config.format = $scope.model.config.pickTime ? "YYYY-MM-DD HH:mm:ss" : "YYYY-MM-DD"; } - - $scope.hasDatetimePickerValue = $scope.model.value ? true : false; $scope.datetimePickerValue = null; @@ -36,9 +34,8 @@ function dateTimePickerController($scope, notificationsService, assetsService, a dtp.datetimepicker("hide"); } }; - $(document).bind("click", $scope.hidePicker); - - //handles the date changing via the api + + //handles the date changing via the date picker function applyDate(e) { angularHelper.safeApply($scope, function() { // when a date is changed, update the model @@ -68,7 +65,7 @@ function dateTimePickerController($scope, notificationsService, assetsService, a var elementData = $element.find("div:first").data().DateTimePicker; if ($scope.model.config.pickTime) { //check if we are supposed to offset the time - if ($scope.model.value && $scope.model.config.offsetTime === "1" && Umbraco.Sys.ServerVariables.application.serverTimeOffset !== undefined) { + if ($scope.model.value && Object.toBoolean($scope.model.config.offsetTime) && Umbraco.Sys.ServerVariables.application.serverTimeOffset !== undefined) { $scope.model.value = dateHelper.convertToServerStringTime(elementData.getDate(), Umbraco.Sys.ServerVariables.application.serverTimeOffset); $scope.serverTime = dateHelper.convertToServerStringTime(elementData.getDate(), Umbraco.Sys.ServerVariables.application.serverTimeOffset, "YYYY-MM-DD HH:mm:ss Z"); } @@ -85,7 +82,28 @@ function dateTimePickerController($scope, notificationsService, assetsService, a } } - var picker = null; + /** Sets the value of the date picker control adn associated viewModel objects based on the model value */ + function setDatePickerVal(element) { + if ($scope.model.value) { + var dateVal; + //check if we are supposed to offset the time + if ($scope.model.value && Object.toBoolean($scope.model.config.offsetTime) && $scope.serverTimeNeedsOffsetting) { + //get the local time offset from the server + dateVal = dateHelper.convertToLocalMomentTime($scope.model.value, Umbraco.Sys.ServerVariables.application.serverTimeOffset); + $scope.serverTime = dateHelper.convertToServerStringTime(dateVal, Umbraco.Sys.ServerVariables.application.serverTimeOffset, "YYYY-MM-DD HH:mm:ss Z"); + } + else { + //create a normal moment , no offset required + var dateVal = $scope.model.value ? moment($scope.model.value, "YYYY-MM-DD HH:mm:ss") : moment(); + } + + element.datetimepicker("setValue", dateVal); + $scope.datetimePickerValue = dateVal.format($scope.model.config.format); + } + else { + $scope.clearDate(); + } + } $scope.clearDate = function() { $scope.hasDatetimePickerValue = false; @@ -129,7 +147,7 @@ function dateTimePickerController($scope, notificationsService, assetsService, a var element = $element.find("div:first"); - // Open the datepicker and add a changeDate eventlistener + // Create the datepicker and add a changeDate eventlistener element .datetimepicker(angular.extend({ useCurrent: true }, $scope.model.config)) .on("dp.change", applyDate) @@ -138,58 +156,39 @@ function dateTimePickerController($scope, notificationsService, assetsService, a $scope.datePickerForm.datepicker.$setValidity("pickerError", false); }); - if ($scope.hasDatetimePickerValue) { - var dateVal; - //check if we are supposed to offset the time - if ($scope.model.value && $scope.model.config.offsetTime === "1" && $scope.serverTimeNeedsOffsetting) { - //get the local time offset from the server - dateVal = dateHelper.convertToLocalMomentTime($scope.model.value, Umbraco.Sys.ServerVariables.application.serverTimeOffset); - $scope.serverTime = dateHelper.convertToServerStringTime(dateVal, Umbraco.Sys.ServerVariables.application.serverTimeOffset, "YYYY-MM-DD HH:mm:ss Z"); - } - else { - //create a normal moment , no offset required - var dateVal = $scope.model.value ? moment($scope.model.value, "YYYY-MM-DD HH:mm:ss") : moment(); - } - - element.datetimepicker("setValue", dateVal); - $scope.datetimePickerValue = dateVal.format($scope.model.config.format); - } + $(document).bind("click", $scope.hidePicker); + setDatePickerVal(element); + element.find("input").bind("blur", function() { //we need to force an apply here $scope.$apply(); - }); + }); + + $scope.$watch("model.value", function(newVal, oldVal) { + if (newVal !== oldVal) { + $scope.hasDatetimePickerValue = newVal ? true : false; + setDatePickerVal(element); + } + }); + + var unsubscribe = $scope.$on("formSubmitting", function (ev, args) { + setModelValue(); + }); //Ensure to remove the event handler when this instance is destroyted $scope.$on('$destroy', function () { element.find("input").unbind("blur"); - element.datetimepicker("destroy"); + element.datetimepicker("destroy"); + unsubscribe(); + $(document).unbind("click", $scope.hidePicker); }); - - var unsubscribe = $scope.$on("formSubmitting", function (ev, args) { - setModelValue(); - }); - //unbind doc click event! - $scope.$on('$destroy', function () { - unsubscribe(); - }); - - }); }); }); - - var unsubscribe = $scope.$on("formSubmitting", function (ev, args) { - setModelValue(); - }); - - //unbind doc click event! - $scope.$on('$destroy', function () { - $(document).unbind("click", $scope.hidePicker); - unsubscribe(); - }); + } angular.module("umbraco").controller("Umbraco.PropertyEditors.DatepickerController", dateTimePickerController); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/datepicker/datepicker.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/datepicker/datepicker.html index 06a7f9c0e7..258d2040d5 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/datepicker/datepicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/datepicker/datepicker.html @@ -1,4 +1,5 @@
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/entitypicker/entitypicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/entitypicker/entitypicker.controller.js index 9e2b796a93..dead3da6ec 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/entitypicker/entitypicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/entitypicker/entitypicker.controller.js @@ -32,11 +32,11 @@ function entityPicker($scope, entityResource) { } else { //if it's multiple, change the value to an array - if ($scope.model.config.multiple === "1") { + if (Object.toBoolean($scope.model.config.multiple)) { if (_.isString($scope.model.value)) { $scope.model.value = $scope.model.value.split(','); } } } } -angular.module('umbraco').controller("Umbraco.PropertyEditors.EntityPickerController", entityPicker); \ No newline at end of file +angular.module('umbraco').controller("Umbraco.PropertyEditors.EntityPickerController", entityPicker); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/slider/slider.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/slider/slider.controller.js index 93a9a03fad..c5c4c60470 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/slider/slider.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/slider/slider.controller.js @@ -12,7 +12,7 @@ $scope.model.config.enableRange = false; } else { - $scope.model.config.enableRange = $scope.model.config.enableRange === true || ($scope.model.config.enableRange === "1" ? true : false); + $scope.model.config.enableRange = Object.toBoolean($scope.model.config.enableRange); } if (!$scope.model.config.initVal1) { @@ -54,7 +54,7 @@ $scope.model.config.reversed = false; } else { - $scope.model.config.reversed = $scope.model.config.reversed === true || ($scope.model.config.reversed === "1" ? true : false); + $scope.model.config.reversed = Object.toBoolean($scope.model.config.reversed); } if (!$scope.model.config.tooltip) { @@ -65,7 +65,7 @@ $scope.model.config.tooltipSplit = false; } else { - $scope.model.config.tooltipSplit = $scope.model.config.tooltipSplit === true || ($scope.model.config.tooltipSplit === "1" ? true : false); + $scope.model.config.tooltipSplit = Object.toBoolean($scope.model.config.tooltipSplit); } if ($scope.model.config.tooltipFormat) {