diff --git a/app/Umbraco/Umbraco.Archetype/Models/ArchetypePreValueProperty.cs b/app/Umbraco/Umbraco.Archetype/Models/ArchetypePreValueProperty.cs index e287187..9031e8b 100644 --- a/app/Umbraco/Umbraco.Archetype/Models/ArchetypePreValueProperty.cs +++ b/app/Umbraco/Umbraco.Archetype/Models/ArchetypePreValueProperty.cs @@ -30,6 +30,9 @@ namespace Archetype.Models public string Value { get; set; } [JsonProperty("required")] - public bool Required { get; set; } + public bool Required { get; set; } + + [JsonProperty("regEx")] + public bool RegEx { get; set; } } } \ No newline at end of file diff --git a/app/controllers/controller.js b/app/controllers/controller.js index 8cf246a..2c59987 100644 --- a/app/controllers/controller.js +++ b/app/controllers/controller.js @@ -43,7 +43,7 @@ cursor: "move", handle: ".handle", update: function (ev, ui) { - + $scope.setDirty(); }, stop: function (ev, ui) { @@ -67,6 +67,7 @@ $scope.model.value.fieldsets.push(newFieldset); } } + $scope.setDirty(); newFieldset.collapse = $scope.model.config.enableCollapsing ? true : false; $scope.focusFieldset(newFieldset); @@ -76,6 +77,7 @@ $scope.removeRow = function ($index) { if ($scope.canRemove()) { if (confirm('Are you sure you want to remove this?')) { + $scope.setDirty(); $scope.model.value.fieldsets.splice($index, 1); } } @@ -261,6 +263,11 @@ return (typeof property == 'undefined') ? true : property.isValid; } + // helper to force the current form into the dirty state + $scope.setDirty = function () { + form.$setDirty(); + } + //custom js if ($scope.model.config.customJsPath) { assetsService.loadJs($scope.model.config.customJsPath); diff --git a/app/directives/archetypeproperty.js b/app/directives/archetypeproperty.js index 0ca0a9e..813a5a6 100644 --- a/app/directives/archetypeproperty.js +++ b/app/directives/archetypeproperty.js @@ -97,10 +97,22 @@ angular.module("umbraco.directives").directive('archetypeProperty', function ($c property.isValid = true; var propertyConfig = getPropertyByAlias(configFieldsetModel, property.alias); - if(propertyConfig && propertyConfig.required && (property.value == null || property.value === "")){ - fieldset.isValid = false; - property.isValid = false; - valid = false; + if (propertyConfig) { + if(propertyConfig.required && (property.value == null || property.value === "")) { + fieldset.isValid = false; + property.isValid = false; + valid = false; + } + // issue 116: RegEx validate property value + // Only validate the property value if anything has been entered - RegEx is considered a supplement to "required". + if (valid == true && propertyConfig.regEx && property.value) { + var regEx = new RegExp(propertyConfig.regEx); + if (regEx.test(property.value) == false) { + fieldset.isValid = false; + property.isValid = false; + valid = false; + } + } } }); }); @@ -143,6 +155,11 @@ angular.module("umbraco.directives").directive('archetypeProperty', function ($c //watch for changes since there is no two-way binding with the local model.value scope.$watch('model.value', function (newValue, oldValue) { + if (newValue == oldValue) { + //issue #121: + //don't update if there's nothing to update - if we do, the form will be considered dirty (even if the values are the same) and the user will be prompted to save/discard changes + return; + } scope.archetypeRenderModel.fieldsets[scope.fieldsetIndex].properties[renderModelPropertyIndex].value = newValue; //trigger the validation pipeline diff --git a/app/langs/da-dk.js b/app/langs/da-dk.js index 923133f..2203673 100644 --- a/app/langs/da-dk.js +++ b/app/langs/da-dk.js @@ -27,6 +27,7 @@ "defaultValue": "Standard værdi", "dataType": "Datatype", "required": "Påkrævet", + "regEx": "RegEx validering", "properties": "Egenskaber", "labelTemplate": "Label skabelon", "select": "Vælg", diff --git a/app/langs/de-de.js b/app/langs/de-de.js index 7446d25..00aaaf6 100644 --- a/app/langs/de-de.js +++ b/app/langs/de-de.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/en-gb.js b/app/langs/en-gb.js index 7f0fe80..404398f 100644 --- a/app/langs/en-gb.js +++ b/app/langs/en-gb.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/en-us.js b/app/langs/en-us.js index 7446d25..00aaaf6 100644 --- a/app/langs/en-us.js +++ b/app/langs/en-us.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/es-es.js b/app/langs/es-es.js index 7446d25..00aaaf6 100644 --- a/app/langs/es-es.js +++ b/app/langs/es-es.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/fr-fr.js b/app/langs/fr-fr.js index 7446d25..00aaaf6 100644 --- a/app/langs/fr-fr.js +++ b/app/langs/fr-fr.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/he-il.js b/app/langs/he-il.js index 7446d25..00aaaf6 100644 --- a/app/langs/he-il.js +++ b/app/langs/he-il.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/it-it.js b/app/langs/it-it.js index 7446d25..00aaaf6 100644 --- a/app/langs/it-it.js +++ b/app/langs/it-it.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/ja-jp.js b/app/langs/ja-jp.js index 7446d25..00aaaf6 100644 --- a/app/langs/ja-jp.js +++ b/app/langs/ja-jp.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/ko-kr.js b/app/langs/ko-kr.js index 7446d25..00aaaf6 100644 --- a/app/langs/ko-kr.js +++ b/app/langs/ko-kr.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/nb-no.js b/app/langs/nb-no.js index 7446d25..00aaaf6 100644 --- a/app/langs/nb-no.js +++ b/app/langs/nb-no.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/nl-nl.js b/app/langs/nl-nl.js index 7446d25..00aaaf6 100644 --- a/app/langs/nl-nl.js +++ b/app/langs/nl-nl.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/pl-pl.js b/app/langs/pl-pl.js index 7446d25..00aaaf6 100644 --- a/app/langs/pl-pl.js +++ b/app/langs/pl-pl.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/pt-br.js b/app/langs/pt-br.js index 7446d25..00aaaf6 100644 --- a/app/langs/pt-br.js +++ b/app/langs/pt-br.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/ru-ru.js b/app/langs/ru-ru.js index 7446d25..00aaaf6 100644 --- a/app/langs/ru-ru.js +++ b/app/langs/ru-ru.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/sv-se.js b/app/langs/sv-se.js index 7446d25..00aaaf6 100644 --- a/app/langs/sv-se.js +++ b/app/langs/sv-se.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/zh-cn.js b/app/langs/zh-cn.js index 7446d25..00aaaf6 100644 --- a/app/langs/zh-cn.js +++ b/app/langs/zh-cn.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/views/archetype.config.html b/app/views/archetype.config.html index 5f769b1..cebb76c 100644 --- a/app/views/archetype.config.html +++ b/app/views/archetype.config.html @@ -64,6 +64,10 @@ +
+ + +