@@ -33,11 +33,11 @@ angular.module('umbraco.directives')
return {
restrict: 'A',
link: function (scope, element, attr) {
-
+
var listItems = [];
var currentIndex = 0;
var focusSet = false;
-
+
$timeout(function(){
// get list of all links in the list
listItems = element.find("li :tabbable");
@@ -82,7 +82,7 @@ angular.module('umbraco.directives')
function arrowDown() {
if (currentIndex < listItems.length - 1) {
- // only bump the current index if the focus is already
+ // only bump the current index if the focus is already
// set else we just want to focus the first element
if (focusSet) {
currentIndex++;
@@ -112,4 +112,4 @@ angular.module('umbraco.directives')
}
};
- }]);
\ No newline at end of file
+ }]);
diff --git a/src/Umbraco.Web.UI.Client/src/common/filters/compareArrays.filter.js b/src/Umbraco.Web.UI.Client/src/common/filters/compareArrays.filter.js
index 13f603260d..0cbf3077e6 100644
--- a/src/Umbraco.Web.UI.Client/src/common/filters/compareArrays.filter.js
+++ b/src/Umbraco.Web.UI.Client/src/common/filters/compareArrays.filter.js
@@ -2,13 +2,17 @@ angular.module("umbraco.filters")
.filter('compareArrays', function() {
return function inArray(array, compareArray, compareProperty) {
+ if (!compareArray || !compareArray.length) {
+ return [...array];
+ }
+
var result = [];
- angular.forEach(array, function(arrayItem){
+ array.forEach(function(arrayItem){
var exists = false;
- angular.forEach(compareArray, function(compareItem){
+ compareArray.forEach(function(compareItem){
if( arrayItem[compareProperty] === compareItem[compareProperty]) {
exists = true;
}
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/angularhelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/angularhelper.service.js
index fd620bac18..7e7f804656 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/angularhelper.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/angularhelper.service.js
@@ -95,7 +95,7 @@ function angularHelper($q) {
*/
revalidateNgModel: function (scope, ngModel) {
this.safeApply(scope, function() {
- angular.forEach(ngModel.$parsers, function (parser) {
+ ngModel.$parsers.forEach(function (parser) {
parser(ngModel.$viewValue);
});
});
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/blockeditor.service.js b/src/Umbraco.Web.UI.Client/src/common/services/blockeditor.service.js
index ffb1971169..dfa0eae297 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/blockeditor.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/blockeditor.service.js
@@ -4,39 +4,113 @@
*
* @description
* Added in Umbraco 8.7. Service for dealing with Block Editors.
- *
+ *
* Block Editor Service provides the basic features for a block editor.
* The main feature is the ability to create a Model Object which takes care of your data for your Block Editor.
- *
- *
+ *
+ *
* ##Samples
*
* ####Instantiate a Model Object for your property editor:
- *
+ *
*
*
- *
+ *
* See {@link umbraco.services.blockEditorModelObject BlockEditorModelObject} for more samples.
- *
+ *
*/
(function () {
'use strict';
+
+ /**
+ * When performing a runtime copy of Block Editors entries, we copy the ElementType Data Model and inner IDs are kept identical, to ensure new IDs are changed on paste we need to provide a resolver for the ClipboardService.
+ */
+ angular.module('umbraco').run(['clipboardService', 'udiService', function (clipboardService, udiService) {
+
+ function replaceUdi(obj, key, dataObject) {
+ var udi = obj[key];
+ var newUdi = udiService.create("element");
+ obj[key] = newUdi;
+ dataObject.forEach((data) => {
+ if (data.udi === udi) {
+ data.udi = newUdi;
+ }
+ });
+ }
+ function replaceUdisOfObject(obj, propValue) {
+ for (var k in obj) {
+ if(k === "contentUdi") {
+ replaceUdi(obj, k, propValue.contentData);
+ } else if(k === "settingsUdi") {
+ replaceUdi(obj, k, propValue.settingsData);
+ } else {
+ // lets crawl through all properties of layout to make sure get captured all `contentUdi` and `settingsUdi` properties.
+ var propType = typeof obj[k];
+ if(propType === "object" || propType === "array") {
+ replaceUdisOfObject(obj[k], propValue)
+ }
+ }
+ }
+ }
+ function replaceElementTypeBlockListUDIsResolver(obj, propClearingMethod) {
+ replaceRawBlockListUDIsResolver(obj.value, propClearingMethod);
+ }
+
+ clipboardService.registerPastePropertyResolver(replaceElementTypeBlockListUDIsResolver, clipboardService.TYPES.ELEMENT_TYPE);
+
+
+ function replaceRawBlockListUDIsResolver(value, propClearingMethod) {
+ if (typeof value === "object") {
+
+ // we got an object, and it has these three props then we are most likely dealing with a Block Editor.
+ if ((value.layout !== undefined && value.contentData !== undefined && value.settingsData !== undefined)) {
+
+ replaceUdisOfObject(value.layout, value);
+
+ // replace UDIs for inner properties of this Block Editors content data.
+ if(value.contentData.length > 0) {
+ value.contentData.forEach((item) => {
+ for (var k in item) {
+ propClearingMethod(item[k], clipboardService.TYPES.RAW);
+ }
+ });
+ }
+ // replace UDIs for inner properties of this Block Editors settings data.
+ if(value.settingsData.length > 0) {
+ value.settingsData.forEach((item) => {
+ for (var k in item) {
+ propClearingMethod(item[k], clipboardService.TYPES.RAW);
+ }
+ });
+ }
+
+ }
+ }
+ }
+
+ clipboardService.registerPastePropertyResolver(replaceRawBlockListUDIsResolver, clipboardService.TYPES.RAW);
+
+ }]);
+
+
+
+
function blockEditorService(blockEditorModelObject) {
/**
* @ngdocs function
* @name createModelObject
* @methodOf umbraco.services.blockEditorService
- *
+ *
* @description
* Create a new Block Editor Model Object.
* See {@link umbraco.services.blockEditorModelObject blockEditorModelObject}
- *
+ *
* @see umbraco.services.blockEditorModelObject
* @param {object} propertyModelValue data object of the property editor, usually model.value.
* @param {string} propertyEditorAlias alias of the property.
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/blockeditormodelobject.service.js b/src/Umbraco.Web.UI.Client/src/common/services/blockeditormodelobject.service.js
index 86b5bdd0d0..868b8baba7 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/blockeditormodelobject.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/blockeditormodelobject.service.js
@@ -13,8 +13,7 @@
(function () {
'use strict';
-
- function blockEditorModelObjectFactory($interpolate, $q, udiService, contentResource, localizationService, umbRequestHelper) {
+ function blockEditorModelObjectFactory($interpolate, $q, udiService, contentResource, localizationService, umbRequestHelper, clipboardService) {
/**
* Simple mapping from property model content entry to editing model,
@@ -231,7 +230,8 @@
var notSupportedProperties = [
"Umbraco.Tags",
"Umbraco.UploadField",
- "Umbraco.ImageCropper"
+ "Umbraco.ImageCropper",
+ "Umbraco.NestedContent"
];
@@ -524,12 +524,11 @@
}
var blockConfiguration = this.getBlockConfiguration(dataModel.contentTypeKey);
- var contentScaffold;
+ var contentScaffold = null;
if (blockConfiguration === null) {
- console.error("The block of " + contentUdi + " is not being initialized because its contentTypeKey('" + dataModel.contentTypeKey + "') is not allowed for this PropertyEditor");
- }
- else {
+ console.warn("The block of " + contentUdi + " is not being initialized because its contentTypeKey('" + dataModel.contentTypeKey + "') is not allowed for this PropertyEditor");
+ } else {
contentScaffold = this.getScaffoldFromKey(blockConfiguration.contentElementTypeKey);
if (contentScaffold === null) {
console.error("The block of " + contentUdi + " is not begin initialized cause its Element Type was not loaded.");
@@ -539,11 +538,9 @@
if (blockConfiguration === null || contentScaffold === null) {
blockConfiguration = {
- label: "Unsupported Block",
+ label: "Unsupported",
unsupported: true
};
- contentScaffold = {};
-
}
var blockObject = {};
@@ -568,10 +565,14 @@
, 10);
// make basics from scaffold
- blockObject.content = Utilities.copy(contentScaffold);
- ensureUdiAndKey(blockObject.content, contentUdi);
+ if(contentScaffold !== null) {// We might not have contentScaffold
+ blockObject.content = Utilities.copy(contentScaffold);
+ ensureUdiAndKey(blockObject.content, contentUdi);
- mapToElementModel(blockObject.content, dataModel);
+ mapToElementModel(blockObject.content, dataModel);
+ } else {
+ blockObject.content = null;
+ }
blockObject.data = dataModel;
blockObject.layout = layoutEntry;
@@ -614,8 +615,7 @@
if (this.config.settingsElementTypeKey !== null) {
mapElementValues(settings, this.settings);
}
- }
-
+ };
blockObject.sync = function () {
if (this.content !== null) {
@@ -624,7 +624,7 @@
if (this.config.settingsElementTypeKey !== null) {
mapToPropertyModel(this.settings, this.settingsData);
}
- }
+ };
// first time instant update of label.
blockObject.label = getBlockLabel(blockObject);
@@ -663,7 +663,6 @@
}
return blockObject;
-
},
/**
@@ -675,11 +674,8 @@
* @param {Object} blockObject The BlockObject to be removed and destroyed.
*/
removeDataAndDestroyModel: function (blockObject) {
- var udi = blockObject.content.udi;
- var settingsUdi = null;
- if (blockObject.settings) {
- settingsUdi = blockObject.settings.udi;
- }
+ var udi = blockObject.layout.contentUdi;
+ var settingsUdi = blockObject.layout.settingsUdi || null;
this.destroyBlockObject(blockObject);
this.removeDataByUdi(udi);
if (settingsUdi) {
@@ -748,7 +744,7 @@
*/
createFromElementType: function (elementTypeDataModel) {
- elementTypeDataModel = Utilities.copy(elementTypeDataModel);
+ elementTypeDataModel = clipboardService.parseContentForPaste(elementTypeDataModel, clipboardService.TYPES.ELEMENT_TYPE);
var contentElementTypeKey = elementTypeDataModel.contentTypeKey;
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/clipboard.service.js b/src/Umbraco.Web.UI.Client/src/common/services/clipboard.service.js
index 0d2ca6623b..58ed07367e 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/clipboard.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/clipboard.service.js
@@ -13,7 +13,28 @@
function clipboardService(notificationsService, eventsService, localStorageService, iconHelper) {
- var clearPropertyResolvers = [];
+ const TYPES = {};
+ TYPES.ELEMENT_TYPE = "elementType";
+ TYPES.RAW = "raw";
+
+ var clearPropertyResolvers = {};
+ var pastePropertyResolvers = {};
+ var clipboardTypeResolvers = {};
+
+ clipboardTypeResolvers[TYPES.ELEMENT_TYPE] = function(data, propMethod) {
+ for (var t = 0; t < data.variants[0].tabs.length; t++) {
+ var tab = data.variants[0].tabs[t];
+ for (var p = 0; p < tab.properties.length; p++) {
+ var prop = tab.properties[p];
+ propMethod(prop, TYPES.ELEMENT_TYPE);
+ }
+ }
+ }
+ clipboardTypeResolvers[TYPES.RAW] = function(data, propMethod) {
+ for (var p = 0; p < data.length; p++) {
+ propMethod(data[p], TYPES.RAW);
+ }
+ }
var STORAGE_KEY = "umbClipboardService";
@@ -57,28 +78,29 @@ function clipboardService(notificationsService, eventsService, localStorageServi
}
- function clearPropertyForStorage(prop) {
+ function resolvePropertyForStorage(prop, type) {
- for (var i=0; i prepareEntryForStorage(data, firstLevelClearupMethod));
+ var copiedDatas = datas.map(data => prepareEntryForStorage(type, data, firstLevelClearupMethod));
// remove previous copies of this entry:
storage.entries = storage.entries.filter(
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js
index c27283d5ad..6d41ea087d 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js
@@ -151,7 +151,7 @@ function contentEditingHelper(fileManager, $q, $location, $routeParams, editorSt
// first check if tab is already added
var foundInfoTab = false;
- angular.forEach(tabs, function (tab) {
+ tabs.forEach(function (tab) {
if (tab.id === infoTab.id && tab.alias === infoTab.alias) {
foundInfoTab = true;
}
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/contenttypehelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/contenttypehelper.service.js
index 1be66cc68f..9cec15d519 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/contenttypehelper.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/contenttypehelper.service.js
@@ -11,7 +11,7 @@ function contentTypeHelper(contentTypeResource, dataTypeResource, $filter, $inje
var newArray = [];
- angular.forEach(array, function (arrayItem) {
+ array.forEach(function (arrayItem) {
if (Utilities.isObject(arrayItem)) {
newArray.push(arrayItem.id);
@@ -116,13 +116,12 @@ function contentTypeHelper(contentTypeResource, dataTypeResource, $filter, $inje
throw new Error("Cannot add this composition, these properties already exist on the content type: " + overlappingAliases.join());
}
- angular.forEach(compositeContentType.groups, function (compositionGroup) {
-
+ compositeContentType.groups.forEach(function (compositionGroup) {
// order composition groups based on sort order
compositionGroup.properties = $filter('orderBy')(compositionGroup.properties, 'sortOrder');
// get data type details
- angular.forEach(compositionGroup.properties, function (property) {
+ compositionGroup.properties.forEach(function (property) {
dataTypeResource.getById(property.dataTypeId)
.then(function (dataType) {
property.dataTypeIcon = dataType.icon;
@@ -134,7 +133,7 @@ function contentTypeHelper(contentTypeResource, dataTypeResource, $filter, $inje
compositionGroup.inherited = true;
// set inherited state on properties
- angular.forEach(compositionGroup.properties, function (compositionProperty) {
+ compositionGroup.properties.forEach(function (compositionProperty) {
compositionProperty.inherited = true;
});
@@ -142,7 +141,7 @@ function contentTypeHelper(contentTypeResource, dataTypeResource, $filter, $inje
compositionGroup.tabState = "inActive";
// if groups are named the same - merge the groups
- angular.forEach(contentType.groups, function (contentTypeGroup) {
+ contentType.groups.forEach(function (contentTypeGroup) {
if (contentTypeGroup.name === compositionGroup.name) {
@@ -224,7 +223,7 @@ function contentTypeHelper(contentTypeResource, dataTypeResource, $filter, $inje
var groups = [];
- angular.forEach(contentType.groups, function (contentTypeGroup) {
+ contentType.groups.forEach(function (contentTypeGroup) {
if (contentTypeGroup.tabState !== "init") {
@@ -238,7 +237,7 @@ function contentTypeHelper(contentTypeResource, dataTypeResource, $filter, $inje
var properties = [];
// remove all properties from composite content type
- angular.forEach(contentTypeGroup.properties, function (property) {
+ contentTypeGroup.properties.forEach(function (property) {
if (property.contentTypeId !== compositeContentType.id) {
properties.push(property);
}
@@ -283,7 +282,7 @@ function contentTypeHelper(contentTypeResource, dataTypeResource, $filter, $inje
var sortOrder = 0;
- angular.forEach(properties, function (property) {
+ properties.forEach(function (property) {
if (!property.inherited && property.propertyState !== "init") {
property.sortOrder = sortOrder;
}
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js b/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js
index 0f4f04c6bf..381d09f62d 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js
@@ -761,6 +761,23 @@ When building a custom infinite editor view you can use the same components as a
open(editor);
}
+ /**
+ * @ngdoc method
+ * @name umbraco.services.editorService#userGroupEditor
+ * @methodOf umbraco.services.editorService
+ *
+ * @description
+ * Opens the user group picker in infinite editing, the submit callback returns the saved user group
+ * @param {Object} editor rendering options
+ * @param {Callback} editor.submit Submits the editor
+ * @param {Callback} editor.close Closes the editor
+ * @returns {Object} editor object
+ */
+ function userGroupEditor(editor) {
+ editor.view = "views/users/group.html";
+ open(editor);
+ }
+
/**
* @ngdoc method
* @name umbraco.services.editorService#templateEditor
@@ -1028,6 +1045,7 @@ When building a custom infinite editor view you can use the same components as a
nodePermissions: nodePermissions,
insertCodeSnippet: insertCodeSnippet,
userGroupPicker: userGroupPicker,
+ userGroupEditor: userGroupEditor,
templateEditor: templateEditor,
sectionPicker: sectionPicker,
insertField: insertField,
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/formhelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/formhelper.service.js
index d9c11770cc..bd6bbcc5b3 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/formhelper.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/formhelper.service.js
@@ -17,10 +17,10 @@ function formHelper(angularHelper, serverValidationManager, notificationsService
* @function
*
* @description
- * Called by controllers when submitting a form - this ensures that all client validation is checked,
+ * Called by controllers when submitting a form - this ensures that all client validation is checked,
* server validation is cleared, that the correct events execute and status messages are displayed.
* This returns true if the form is valid, otherwise false if form submission cannot continue.
- *
+ *
* @param {object} args An object containing arguments for form submission
*/
submitForm: function (args) {
@@ -46,7 +46,12 @@ function formHelper(angularHelper, serverValidationManager, notificationsService
args.scope.$broadcast("formSubmitting", { scope: args.scope, action: args.action });
this.focusOnFirstError(currentForm);
- args.scope.$broadcast("postFormSubmitting", { scope: args.scope, action: args.action });
+
+ // Some property editors need to perform an action after all property editors have reacted to the formSubmitting.
+ args.scope.$broadcast("formSubmittingFinalPhase", { scope: args.scope, action: args.action });
+
+ // Set the form state to submitted
+ currentForm.$setSubmitted();
//then check if the form is valid
if (!args.skipValidation) {
@@ -101,18 +106,32 @@ function formHelper(angularHelper, serverValidationManager, notificationsService
*
* @description
* Called by controllers when a form has been successfully submitted, this ensures the correct events are raised.
- *
+ *
* @param {object} args An object containing arguments for form submission
*/
resetForm: function (args) {
+
+ var currentForm;
+
if (!args) {
throw "args cannot be null";
}
if (!args.scope) {
throw "args.scope cannot be null";
}
+ if (!args.formCtrl) {
+ //try to get the closest form controller
+ currentForm = angularHelper.getRequiredCurrentForm(args.scope);
+ }
+ else {
+ currentForm = args.formCtrl;
+ }
- args.scope.$broadcast("formSubmitted", { scope: args.scope });
+ // Set the form state to pristine
+ currentForm.$setPristine();
+ currentForm.$setUntouched();
+
+ args.scope.$broadcast(args.hasErrors ? "formSubmittedValidationFailed" : "formSubmitted", { scope: args.scope });
},
showNotifications: function (args) {
@@ -137,7 +156,7 @@ function formHelper(angularHelper, serverValidationManager, notificationsService
* @description
* Needs to be called when a form submission fails, this will wire up all server validation errors in ModelState and
* add the correct messages to the notifications. If a server error has occurred this will show a ysod.
- *
+ *
* @param {object} err The error object returned from the http promise
*/
handleError: function (err) {
@@ -176,7 +195,7 @@ function formHelper(angularHelper, serverValidationManager, notificationsService
*
* @description
* This wires up all of the server validation model state so that valServer and valServerField directives work
- *
+ *
* @param {object} err The error object returned from the http promise
*/
handleServerValidation: function (modelState) {
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/listviewhelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/listviewhelper.service.js
index 28156e70c3..ee1e2a2311 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/listviewhelper.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/listviewhelper.service.js
@@ -419,7 +419,7 @@
if (isSelectedAll(items, selection)) {
// unselect all items
- angular.forEach(items, function (item) {
+ items.forEach(function (item) {
item.selected = false;
});
@@ -432,7 +432,7 @@
selection.length = 0;
// select all items
- angular.forEach(items, function (item) {
+ items.forEach(function (item) {
var obj = {
id: item.id
};
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js b/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js
index 0907538b24..c1d84aa16b 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js
@@ -127,6 +127,13 @@ function navigationService($routeParams, $location, $q, $injector, eventsService
}
}
+ function showBackdrop() {
+ var backDropOptions = {
+ 'element': $('#leftcolumn')[0]
+ };
+ backdropService.open(backDropOptions);
+ }
+
var service = {
/**
@@ -427,13 +434,9 @@ function navigationService($routeParams, $location, $q, $injector, eventsService
showMenu: function (args) {
var self = this;
- var backDropOptions = {
- 'element': $('#leftcolumn')[0]
- };
-
return treeService.getMenu({ treeNode: args.node })
.then(function (data) {
- backdropService.open(backDropOptions);
+ showBackdrop();
//check for a default
//NOTE: event will be undefined when a call to hideDialog is made so it won't re-load the default again.
// but perhaps there's a better way to deal with with an additional parameter in the args ? it works though.
@@ -544,6 +547,7 @@ function navigationService($routeParams, $location, $q, $injector, eventsService
}
}
else {
+ showBackdrop();
service.showDialog({
node: node,
action: action,
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/search.service.js b/src/Umbraco.Web.UI.Client/src/common/services/search.service.js
index 803cd857b7..8e9525af84 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/search.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/search.service.js
@@ -12,7 +12,7 @@
*
*
* searchService.searchMembers({term: 'bob'}).then(function(results){
- * angular.forEach(results, function(result){
+ * results.forEach(function(result){
* //returns:
* {name: "name", id: 1234, menuUrl: "url", editorPath: "url", metaData: {}, subtitle: "/path/etc" }
* })
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js b/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js
index 5d6b4646a3..6c0165ebfe 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js
@@ -107,7 +107,7 @@ function tinyMceService($rootScope, $q, imageHelper, $locale, $http, $timeout, s
//queue rules loading
if (configuredStylesheets) {
- angular.forEach(configuredStylesheets, function (val, key) {
+ configuredStylesheets.forEach(function (val, key) {
if (val.indexOf(Umbraco.Sys.ServerVariables.umbracoSettings.cssPath + "/") === 0) {
// current format (full path to stylesheet)
@@ -119,7 +119,7 @@ function tinyMceService($rootScope, $q, imageHelper, $locale, $http, $timeout, s
}
promises.push(stylesheetResource.getRulesByName(val).then(function (rules) {
- angular.forEach(rules, function (rule) {
+ rules.forEach(function (rule) {
var r = {};
r.title = rule.name;
if (rule.selector[0] == ".") {
diff --git a/src/Umbraco.Web.UI.Client/src/installer/steps/database.html b/src/Umbraco.Web.UI.Client/src/installer/steps/database.html
index cfe0940aa2..ebffc4cf97 100644
--- a/src/Umbraco.Web.UI.Client/src/installer/steps/database.html
+++ b/src/Umbraco.Web.UI.Client/src/installer/steps/database.html
@@ -40,7 +40,7 @@
-
+ Sorry, we can not find what you are looking for.
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.html
index fc1bec4ec1..c23aaa7cb9 100644
--- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.html
+++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.html
@@ -15,7 +15,7 @@