From d2083673bed532e4241145988fa323d9bf6d35b9 Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 10 Mar 2015 13:02:34 +1100 Subject: [PATCH] Fixes: U4-3420 Firefox v25.0 - Right click context menu doesn't work - this felt like being a web dev 10 years ago when you had to code totally differently for each browser. Firefox unfortunatley treats 'a' tags differently than anything else and combined with angular saying you can have empty 'href' tags doesn't work. In the end, the fix was easy, just remove the empty (supposed to be supported) href attributes from the 'a' tags in the tree, then the contextmenu starts working in firefox and the events can be canceled as per normal. This commit also moves the angular localization library to use bower. --- src/Umbraco.Web.UI.Client/bower.json | 6 +- .../lib/angular/tmhDynamicLocale.js | 186 ------------------ .../common/directives/umbtree.directive.js | 2 +- .../directives/umbtreeitem.directive.js | 5 +- src/Umbraco.Web.UI.Client/src/loader.js | 2 +- src/Umbraco.Web/UI/JavaScript/JsInitialize.js | 2 +- 6 files changed, 11 insertions(+), 192 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/lib/angular/tmhDynamicLocale.js diff --git a/src/Umbraco.Web.UI.Client/bower.json b/src/Umbraco.Web.UI.Client/bower.json index 4f7a01e20e..e8ad94653f 100644 --- a/src/Umbraco.Web.UI.Client/bower.json +++ b/src/Umbraco.Web.UI.Client/bower.json @@ -21,7 +21,8 @@ "rgrove-lazyload": "*", "jquery": "2.0.3", "jquery-file-upload": "~9.4.0", - "jquery-ui": "1.10.3" + "jquery-ui": "1.10.3", + "angular-dynamic-locale": "~0.1.27" }, "exportsOverride": { "rgrove-lazyload": { @@ -33,6 +34,9 @@ "underscore": { "": "underscore-min.{js,map}" }, + "angular-dynamic-locale": { + "": "tmhDynamicLocale.min.{js,js.map}" + }, "jquery": { "": "jquery.min.{js,map}" }, diff --git a/src/Umbraco.Web.UI.Client/lib/angular/tmhDynamicLocale.js b/src/Umbraco.Web.UI.Client/lib/angular/tmhDynamicLocale.js deleted file mode 100644 index 325475f951..0000000000 --- a/src/Umbraco.Web.UI.Client/lib/angular/tmhDynamicLocale.js +++ /dev/null @@ -1,186 +0,0 @@ -( function(window) { -'use strict'; -angular.module('tmh.dynamicLocale', []).provider('tmhDynamicLocale', function() { - - var defaultLocale, - localeLocationPattern = 'angular/i18n/angular-locale_{{locale}}.js', - storageFactory = 'tmhDynamicLocaleStorageCache', - storage, - storeKey = 'tmhDynamicLocale.locale', - promiseCache = {}, - activeLocale; - - /** - * Loads a script asynchronously - * - * @param {string} url The url for the script - @ @param {function) callback A function to be called once the script is loaded - */ - function loadScript(url, callback, errorCallback, $timeout) { - var script = document.createElement('script'), - body = document.getElementsByTagName('body')[0], - removed = false; - - script.type = 'text/javascript'; - if (script.readyState) { // IE - script.onreadystatechange = function () { - if (script.readyState === 'complete' || - script.readyState === 'loaded') { - script.onreadystatechange = null; - $timeout( - function () { - if (removed) return; - removed = true; - body.removeChild(script); - callback(); - }, 30, false); - } - }; - } else { // Others - script.onload = function () { - if (removed) return; - removed = true; - body.removeChild(script); - callback(); - }; - script.onerror = function () { - if (removed) return; - removed = true; - body.removeChild(script); - errorCallback(); - }; - } - script.src = url; - script.async = false; - body.appendChild(script); - } - - /** - * Loads a locale and replaces the properties from the current locale with the new locale information - * - * @param localeUrl The path to the new locale - * @param $locale The locale at the curent scope - */ - function loadLocale(localeUrl, $locale, localeId, $rootScope, $q, localeCache, $timeout) { - - function overrideValues(oldObject, newObject) { - if (activeLocale !== localeId) { - return; - } - angular.forEach(oldObject, function(value, key) { - if (!newObject[key]) { - delete oldObject[key]; - } else if (angular.isArray(newObject[key])) { - oldObject[key].length = newObject[key].length; - } - }); - angular.forEach(newObject, function(value, key) { - if (angular.isArray(newObject[key]) || angular.isObject(newObject[key])) { - if (!oldObject[key]) { - oldObject[key] = angular.isArray(newObject[key]) ? [] : {}; - } - overrideValues(oldObject[key], newObject[key]); - } else { - oldObject[key] = newObject[key]; - } - }); - } - - - if (promiseCache[localeId]) return promiseCache[localeId]; - - var cachedLocale, - deferred = $q.defer(); - if (localeId === activeLocale) { - deferred.resolve($locale); - } else if ((cachedLocale = localeCache.get(localeId))) { - activeLocale = localeId; - $rootScope.$evalAsync(function() { - overrideValues($locale, cachedLocale); - $rootScope.$broadcast('$localeChangeSuccess', localeId, $locale); - storage.put(storeKey, localeId); - deferred.resolve($locale); - }); - } else { - activeLocale = localeId; - promiseCache[localeId] = deferred.promise; - loadScript(localeUrl, function () { - // Create a new injector with the new locale - var localInjector = angular.injector(['ngLocale']), - externalLocale = localInjector.get('$locale'); - - overrideValues($locale, externalLocale); - localeCache.put(localeId, externalLocale); - delete promiseCache[localeId]; - - $rootScope.$apply(function () { - $rootScope.$broadcast('$localeChangeSuccess', localeId, $locale); - storage.put(storeKey, localeId); - deferred.resolve($locale); - }); - }, function () { - delete promiseCache[localeId]; - - $rootScope.$apply(function () { - $rootScope.$broadcast('$localeChangeError', localeId); - deferred.reject(localeId); - }); - }, $timeout); - } - return deferred.promise; - } - - this.localeLocationPattern = function(value) { - if (value) { - localeLocationPattern = value; - return this; - } else { - return localeLocationPattern; - } - }; - - this.useStorage = function(storageName) { - storageFactory = storageName; - }; - - this.useCookieStorage = function() { - this.useStorage('$cookieStore'); - }; - - this.defaultLocale = function (value) { - defaultLocale = value; - }; - - this.$get = ['$rootScope', '$injector', '$interpolate', '$locale', '$q', 'tmhDynamicLocaleCache', '$timeout', function($rootScope, $injector, interpolate, locale, $q, tmhDynamicLocaleCache, $timeout) { - var localeLocation = interpolate(localeLocationPattern); - - storage = $injector.get(storageFactory); - $rootScope.$evalAsync(function () { - var initialLocale; - if ((initialLocale = (storage.get(storeKey) || defaultLocale))) { - loadLocale(localeLocation({locale: initialLocale}), locale, initialLocale, $rootScope, $q, tmhDynamicLocaleCache, $timeout); - } - }); - return { - /** - * @ngdoc method - * @description - * @param {string=} value Sets the locale to the new locale. Changing the locale will trigger - * a background task that will retrieve the new locale and configure the current $locale - * instance with the information from the new locale - */ - set: function(value) { - return loadLocale(localeLocation({locale: value}), locale, value, $rootScope, $q, tmhDynamicLocaleCache, $timeout); - } - }; - }]; -}).provider('tmhDynamicLocaleCache', function() { - this.$get = ['$cacheFactory', function($cacheFactory) { - return $cacheFactory('tmh.dynamicLocales'); - }]; -}).provider('tmhDynamicLocaleStorageCache', function() { - this.$get = ['$cacheFactory', function($cacheFactory) { - return $cacheFactory('tmh.dynamicLocales.store'); - }]; -}).run(['tmhDynamicLocale', angular.noop]); -}(window) ); diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/umbtree.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/umbtree.directive.js index aabf19268c..2aaf66c81a 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/umbtree.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/umbtree.directive.js @@ -33,7 +33,7 @@ function umbTreeDirective($compile, $log, $q, $rootScope, treeService, notificat '
' + '' + '{{tree.name}}
' + - '' + + '' + ''; template += '