diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 626e1e3d51..2497bdc592 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -955,12 +955,12 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" - }, - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" + "is-extendable": "^0.1.0" + } } } }, @@ -1670,9 +1670,9 @@ "dependencies": { "source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true, - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + "dev": true } } }, diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js index 890b5b273c..56dff12985 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js @@ -344,7 +344,7 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter, loca $http.post(umbRequestHelper.getApiUrl("contentTypeApiBaseUrl", "Import", { file: file })), "Failed to import document type " + file ); - }, + } }; } angular.module('umbraco.resources').factory('contentTypeResource', contentTypeResource); 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 112c1df8fd..e70f030557 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 @@ -443,7 +443,7 @@ function contentEditingHelper(fileManager, $q, $location, $routeParams, notifica "removeDateMonth", "removeDateDayNumber", "removeDateDay", - "removeDateTime", + "removeDateTime" ], function (i) { return i === propName; }); @@ -519,25 +519,32 @@ function contentEditingHelper(fileManager, $q, $location, $routeParams, notifica var allNewProps = this.getAllProps(savedVariant); //check for changed properties of the content - for (var p in allOrigProps) { - var alias = allOrigProps[p].alias; + for (var k = 0; k < allOrigProps.length; k++) { + + var origProp = allOrigProps[k]; + var alias = origProp.alias; var newProp = getNewProp(alias, allNewProps); - if (newProp && !_.isEqual(alias, newProp.value)) { + if (newProp && !_.isEqual(origProp.value, newProp.value)) { //they have changed so set the origContent prop to the new one - var origVal = allOrigProps[p].value; - allOrigProps[p].value = newProp.value; + var origVal = origProp.value; + + origProp.value = newProp.value; //instead of having a property editor $watch their expression to check if it has // been updated, instead we'll check for the existence of a special method on their model // and just call it. - if (angular.isFunction(allOrigProps[p].onValueChanged)) { + if (angular.isFunction(origProp.onValueChanged)) { //send the newVal + oldVal - allOrigProps[p].onValueChanged(allOrigProps[p].value, origVal); + origProp.onValueChanged(origProp.value, origVal); } - changed.push(allOrigProps[p]); + changed.push(origProp); } + + } + for (var p in allOrigProps) { + } } 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 745e1c2099..3a5dfe28de 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 @@ -159,10 +159,18 @@ function formHelper(angularHelper, serverValidationManager, $timeout, notificati //Check if this is for content properties - specific to content/media/member editors because those are special // user defined properties with custom controls. - if (parts.length > 2 && parts[0] === "_Properties") { + if (parts.length > 1 && parts[0] === "_Properties") { var propertyAlias = parts[1]; - var culture = parts[2]; + + var culture = null; + if (parts.length > 2) { + culture = parts[2]; + //special check in case the string is formatted this way + if (culture === "null") { + culture = null; + } + } //if it contains 3 '.' then we will wire it up to a property's html field if (parts.length > 3) { diff --git a/src/Umbraco.Web.UI.Client/src/common/services/servervalidationmgr.service.js b/src/Umbraco.Web.UI.Client/src/common/services/servervalidationmgr.service.js index a67f54c69c..26317490a0 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/servervalidationmgr.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/servervalidationmgr.service.js @@ -140,8 +140,9 @@ function serverValidationManager($timeout) { } } else if (propertyAlias !== undefined) { + //normalize culture to null if (!culture) { - culture = null; // if empty or null, always make null + culture = null; } //don't add it if it already exists var exists2 = _.find(callbacks, function (item) { @@ -165,8 +166,9 @@ function serverValidationManager($timeout) { } else if (propertyAlias !== undefined) { + //normalize culture to null if (!culture) { - culture = null; // if empty or null, always make null + culture = null; } //remove all callbacks for the content property @@ -192,8 +194,9 @@ function serverValidationManager($timeout) { */ getPropertyCallbacks: function (propertyAlias, culture, fieldName) { + //normalize culture to null if (!culture) { - culture = null; // if empty or null, always make null + culture = null; } var found = _.filter(callbacks, function (item) { @@ -268,8 +271,9 @@ function serverValidationManager($timeout) { return; } + //normalize culture to null if (!culture) { - culture = null; // if empty or null, always make null + culture = null; } //only add the item if it doesn't exist @@ -306,6 +310,12 @@ function serverValidationManager($timeout) { if (!propertyAlias) { return; } + + //normalize culture to null + if (!culture) { + culture = null; + } + //remove the item this.items = _.reject(this.items, function (item) { return (item.propertyAlias === propertyAlias && item.culture === culture && (item.fieldName === fieldName || (fieldName === undefined || fieldName === ""))); @@ -354,6 +364,12 @@ function serverValidationManager($timeout) { * Gets the error message for the content property */ getPropertyError: function (propertyAlias, culture, fieldName) { + + //normalize culture to null + if (!culture) { + culture = null; + } + var err = _.find(this.items, function (item) { //return true if the property alias matches and if an empty field name is specified or the field name matches return (item.propertyAlias === propertyAlias && item.culture === culture && (item.fieldName === fieldName || (fieldName === undefined || fieldName === ""))); @@ -388,6 +404,12 @@ function serverValidationManager($timeout) { * Checks if the content property + culture + field name combo has an error */ hasPropertyError: function (propertyAlias, culture, fieldName) { + + //normalize culture to null + if (!culture) { + culture = null; + } + var err = _.find(this.items, function (item) { //return true if the property alias matches and if an empty field name is specified or the field name matches return (item.propertyAlias === propertyAlias && item.culture === culture && (item.fieldName === fieldName || (fieldName === undefined || fieldName === ""))); diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js index 1d34482358..4de506ce50 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js @@ -50,7 +50,7 @@ angular.module("umbraco") pageSize: 100, totalItems: 0, totalPages: 0, - filter: '', + filter: '' }; //preload selected item @@ -435,4 +435,4 @@ angular.module("umbraco") onInit(); - }); \ No newline at end of file + }); diff --git a/src/Umbraco.Web.UI.Client/src/views/languages/overview.controller.js b/src/Umbraco.Web.UI.Client/src/views/languages/overview.controller.js index c81f93c7d6..3911d6e893 100644 --- a/src/Umbraco.Web.UI.Client/src/views/languages/overview.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/languages/overview.controller.js @@ -21,7 +21,7 @@ var labelKeys = [ "treeHeaders_languages", "general_mandatory", - "general_default", + "general_default" ]; localizationService.localizeMany(labelKeys).then(function (values) { diff --git a/src/Umbraco.Web.UI.Client/test/unit/common/services/content-editing-helper.spec.js b/src/Umbraco.Web.UI.Client/test/unit/common/services/content-editing-helper.spec.js index 5937b7f2fb..64b272dd3f 100644 --- a/src/Umbraco.Web.UI.Client/test/unit/common/services/content-editing-helper.spec.js +++ b/src/Umbraco.Web.UI.Client/test/unit/common/services/content-editing-helper.spec.js @@ -123,7 +123,8 @@ describe('contentEditingHelper tests', function () { var allProps = contentEditingHelper.getAllProps(content); //act - formHelper.handleServerValidation({ "_Properties.bodyText.value": ["Required"] }); + //note the null, that's because culture is null + formHelper.handleServerValidation({ "_Properties.bodyText.null.value": ["Required"] }); //assert expect(serverValidationManager.items.length).toBe(1); @@ -143,7 +144,8 @@ describe('contentEditingHelper tests', function () { { "Name": ["Required"], "UpdateDate": ["Invalid date"], - "_Properties.bodyText.value": ["Required field"], + //note the null, that's because culture is null + "_Properties.bodyText.null.value": ["Required field"], "_Properties.textarea": ["Invalid format"] }); @@ -226,6 +228,7 @@ describe('contentEditingHelper tests', function () { //act var changed = contentEditingHelper.reBindChangedProperties(origContent, newContent); + //assert expect(changed.length).toBe(2); expect(changed[0].alias).toBe("grid"); diff --git a/src/Umbraco.Web.UI.Client/test/unit/common/services/file-manager.spec.js b/src/Umbraco.Web.UI.Client/test/unit/common/services/file-manager.spec.js index e86119cf5f..e5751341bc 100644 --- a/src/Umbraco.Web.UI.Client/test/unit/common/services/file-manager.spec.js +++ b/src/Umbraco.Web.UI.Client/test/unit/common/services/file-manager.spec.js @@ -10,24 +10,39 @@ describe('file manager tests', function () { describe('file management', function () { it('adding a file adds to the collection', function () { - fileManager.setFiles('testProp', ["testFile"]); + fileManager.setFiles({ + propertyAlias: 'testProp', + files: ["testFile"] + }); expect(fileManager.getFiles().length).toBe(1); }); it('adding a file with the same property id replaces the existing one', function () { - fileManager.setFiles('testProp', ["testFile"]); - fileManager.setFiles('testProp', ["testFile2"]); + fileManager.setFiles({ + propertyAlias: 'testProp', + files: ["testFile"] + }); + fileManager.setFiles({ + propertyAlias: 'testProp', + files: ["testFile2"] + }); expect(fileManager.getFiles().length).toBe(1); expect(fileManager.getFiles()[0].file).toBe("testFile2"); }); it('clears all files', function () { - fileManager.setFiles('testProp1', ["testFile"]); - fileManager.setFiles('testProp2', ["testFile"]); + fileManager.setFiles({ + propertyAlias: 'testProp', + files: ["testFile"] + }); + fileManager.setFiles({ + propertyAlias: 'testProp2', + files: ["testFile"] + }); expect(fileManager.getFiles().length).toBe(2); fileManager.clearFiles(); expect(fileManager.getFiles().length).toBe(0); }); }); -}); \ No newline at end of file +});