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 @@
Enter server domain or IP
diff --git a/src/Umbraco.Web.UI.Client/src/less/belle.less b/src/Umbraco.Web.UI.Client/src/less/belle.less
index d99573decb..ff834de837 100644
--- a/src/Umbraco.Web.UI.Client/src/less/belle.less
+++ b/src/Umbraco.Web.UI.Client/src/less/belle.less
@@ -77,7 +77,6 @@
@import "main.less";
@import "listview.less";
@import "gridview.less";
-@import "filter-toggle.less";
@import "forms/umb-validation-label.less";
@@ -173,6 +172,7 @@
@import "components/umb-textstring.less";
@import "components/umb-textarea.less";
@import "components/umb-dropdown.less";
+@import "components/umb-filter.less";
@import "components/umb-range-slider.less";
@import "components/umb-number.less";
@import "components/umb-tags-editor.less";
diff --git a/src/Umbraco.Web.UI.Client/src/less/components/application/umb-language-picker.less b/src/Umbraco.Web.UI.Client/src/less/components/application/umb-language-picker.less
index 4e3741905f..34a339b4c9 100644
--- a/src/Umbraco.Web.UI.Client/src/less/components/application/umb-language-picker.less
+++ b/src/Umbraco.Web.UI.Client/src/less/components/application/umb-language-picker.less
@@ -24,6 +24,7 @@
.umb-language-picker__expand {
font-size: 14px;
+ pointer-events: none;
}
.umb-language-picker__toggle:hover {
diff --git a/src/Umbraco.Web.UI.Client/src/less/components/prevalues/multivalues.less b/src/Umbraco.Web.UI.Client/src/less/components/prevalues/multivalues.less
index 7036d60a63..6cdc5b1c99 100644
--- a/src/Umbraco.Web.UI.Client/src/less/components/prevalues/multivalues.less
+++ b/src/Umbraco.Web.UI.Client/src/less/components/prevalues/multivalues.less
@@ -6,7 +6,7 @@
width: 500px;
}
- p{
+ p {
margin: 7px 0;
}
}
@@ -23,21 +23,18 @@
align-items: center;
}
-.umb-prevalues-multivalues__add {
+.umb-prevalues-multivalues__add {
display: flex;
-}
-.umb-prevalues-multivalues__add input {
- width: 320px;
-}
+ input {
+ display: flex;
+ width: 320px;
+ }
-.umb-prevalues-multivalues__add input {
- display: flex;
-}
-
-.umb-prevalues-multivalues__add button {
- margin: 0 6px 0 0;
- margin-left: auto;
+ button {
+ margin: 0 6px 0 0;
+ margin-left: auto;
+ }
}
.umb-prevalues-multivalues__listitem {
@@ -45,20 +42,26 @@
padding: 6px;
margin: 10px 0px !important;
background: @gray-10;
- cursor: move;
-}
-.umb-prevalues-multivalues__listitem i {
- display: flex;
- align-items: center;
- margin-right: 5px
-}
+ &.ui-sortable-handle,
+ .ui-sortable-handle,
+ .handle
+ {
+ cursor: move;
+ }
-.umb-prevalues-multivalues__listitem a {
- cursor: pointer;
- margin-left: auto;
-}
+ i {
+ display: flex;
+ align-items: center;
+ margin-right: 5px
+ }
-.umb-prevalues-multivalues__listitem input {
- width: 295px;
+ a {
+ cursor: pointer;
+ margin-left: auto;
+ }
+
+ input {
+ width: 295px;
+ }
}
diff --git a/src/Umbraco.Web.UI.Client/src/less/components/tree/umb-tree.less b/src/Umbraco.Web.UI.Client/src/less/components/tree/umb-tree.less
index 59d81eb3ea..d4599ea03d 100644
--- a/src/Umbraco.Web.UI.Client/src/less/components/tree/umb-tree.less
+++ b/src/Umbraco.Web.UI.Client/src/less/components/tree/umb-tree.less
@@ -96,7 +96,6 @@ body.touch .umb-tree {
width: auto;
height: auto;
margin: 0 5px 0 auto;
- padding: 7px 5px;
overflow: visible;
clip: auto;
}
@@ -185,12 +184,15 @@ body.touch .umb-tree {
display: flex;
flex: 0 0 auto;
justify-content: flex-end;
- padding: 7px 5px;
text-align: center;
margin: 0 5px 0 auto;
cursor: pointer;
border-radius: @baseBorderRadius;
+ .umb-button-ellipsis {
+ padding: 3px 5px;
+ }
+
i {
height: 5px !important;
width: 5px !important;
diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-checkmark.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-checkmark.less
index f82e47bf88..6ab6169eec 100644
--- a/src/Umbraco.Web.UI.Client/src/less/components/umb-checkmark.less
+++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-checkmark.less
@@ -17,10 +17,21 @@
}
}
+.umb-checkmark__action {
+ &:hover,
+ &:focus {
+ .umb-checkmark {
+ border-color:@ui-action-discreet-border-hover;
+ color: @ui-selected-type-hover;
+ }
+ }
+}
+
.umb-checkmark--checked {
background: @ui-selected-border;
border-color: @ui-selected-border;
color: @white;
+
&:hover {
background: @ui-selected-border-hover;
border-color: @ui-selected-border-hover;
@@ -28,6 +39,17 @@
}
}
+.umb-checkmark__action {
+ &:hover,
+ &:focus {
+ .umb-checkmark--checked {
+ background: @ui-selected-border-hover;
+ border-color: @ui-selected-border-hover;
+ color: @white;
+ }
+ }
+}
+
.umb-checkmark--xs {
width: 20px;
height: 20px;
diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-filter.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-filter.less
new file mode 100644
index 0000000000..7432555472
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-filter.less
@@ -0,0 +1,13 @@
+.umb-filter {
+ position: relative;
+}
+
+.umb-filter .umb-filter__toggle {
+ display: flex;
+}
+
+.umb-filter .umb-filter__label {
+ margin-left: 5px;
+ margin-right: 3px;
+ max-width: 150px;
+}
diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-grid.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-grid.less
index a8c428ba7a..0915f5f64f 100644
--- a/src/Umbraco.Web.UI.Client/src/less/components/umb-grid.less
+++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-grid.less
@@ -596,9 +596,10 @@
}
.umb-grid .iconBox i {
- font-size: 16px !important;
- color: @gray-3 ;
+ color: @gray-3;
display: block;
+ font-size: 16px;
+ line-height: inherit;
}
.umb-grid .help-text {
@@ -609,8 +610,6 @@
clear: both;
}
-
-
// TINYMCE EDITOR
// -------------------------
diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-insert-code-box.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-insert-code-box.less
index f3b53f4def..006dae09dc 100644
--- a/src/Umbraco.Web.UI.Client/src/less/components/umb-insert-code-box.less
+++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-insert-code-box.less
@@ -8,20 +8,20 @@
padding: 15px 20px;
margin-bottom: 10px;
border-radius: 3px;
- cursor: pointer;
+ text-align: left;
}
.umb-insert-code-box:hover,
.umb-insert-code-box.-selected {
background-color: @ui-option-hover;
color: @ui-action-type-hover;
- //border-color: @ui-action-border-hover;
}
.umb-insert-code-box__title {
font-size: 15px;
margin-bottom: 5px;
font-weight: bold;
+ line-height: 1;
}
.umb-insert-code-box__description {
diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-logviewer.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-logviewer.less
index 56fa905310..32dcccb8da 100644
--- a/src/Umbraco.Web.UI.Client/src/less/components/umb-logviewer.less
+++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-logviewer.less
@@ -122,6 +122,11 @@
.table {
table-layout: fixed;
+ table {
+ display: table;
+ width: 100%;
+ }
+
thead th:first-child, thead th:nth-child(3) {
width: 20%;
}
@@ -130,9 +135,16 @@
width: 15%;
}
+
tr td:nth-child(3) {
word-break: break-word;
}
+
+ button {
+ white-space: normal;
+ word-break: break-word;
+ text-align-last: left;
+ }
}
.exception {
diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-media-grid.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-media-grid.less
index abd1bfd047..09fea977c7 100644
--- a/src/Umbraco.Web.UI.Client/src/less/components/umb-media-grid.less
+++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-media-grid.less
@@ -138,6 +138,7 @@
.umb-media-grid__item-overlay {
display: flex;
+ align-items: center;
width: 100%;
opacity: 0;
position: absolute;
diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-nested-content.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-nested-content.less
index 384d9b4ac1..7962981592 100644
--- a/src/Umbraco.Web.UI.Client/src/less/components/umb-nested-content.less
+++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-nested-content.less
@@ -84,10 +84,8 @@
.umb-nested-content__heading {
line-height: 20px;
position: relative;
- margin-top:1px;
padding: 15px 5px;
color:@ui-option-type;
- border-radius: 3px 3px 0 0;
&:hover {
color:@ui-option-type-hover;
diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-property-actions.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-property-actions.less
index f86b27af17..6b7d22d0b7 100644
--- a/src/Umbraco.Web.UI.Client/src/less/components/umb-property-actions.less
+++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-property-actions.less
@@ -1,9 +1,4 @@
-.umb-property-actions {
- display: inline;
-}
-
-.umb-property-actions__toggle,
-.umb-property-actions__menu-open-toggle {
+.umb-property-actions__toggle {
position: relative;
display: flex;
flex: 0 0 auto;
@@ -11,7 +6,6 @@
text-align: center;
cursor: pointer;
border-radius: 3px;
-
background-color: @ui-action-hover;
i {
@@ -32,27 +26,20 @@
}
}
}
-.umb-property-actions__menu-open-toggle {
- position: absolute;
- z-index:1;
- outline: none;// this is not acceccible by keyboard, since we use the .umb-property-actions__toggle for that.
- top: -15px;
- border-radius: 3px 3px 0 0;
-
- border-top-left-radius: 3px;
- border-top-right-radius: 3px;
-
- border: 1px solid @dropdownBorder;
-
- border-bottom: 1px solid @gray-9;
-
- .box-shadow(0 5px 20px rgba(0,0,0,.3));
-
- background-color: @white;
+.umb-property-actions {
+ display: inline;
+ &.-open {
+ .umb-property-actions__toggle {
+ background-color: @white;
+ border-radius: 3px 3px 0 0;
+ border: 1px solid @dropdownBorder;
+ border-bottom: 1px solid @gray-9;
+ .box-shadow(0 5px 20px rgba(0,0,0,.3));
+ }
+ }
}
-
.umb-property .umb-property-actions {
float: left;
}
@@ -66,32 +53,22 @@
.umb-property .umb-property-actions__toggle:focus {
opacity: 1;
}
+
// Revert-style-hack that ensures that we only show property-actions on properties that are directly begin hovered.
.umb-property:hover .umb-property:not(:hover) .umb-property-actions__toggle {
opacity: 0;
}
.umb-property-actions__menu {
-
position: absolute;
z-index: 1000;
-
display: block;
-
float: left;
min-width: 160px;
list-style: none;
.umb-contextmenu {
-
border-top-left-radius: 0;
- margin-top:-2px;
-
- }
-
- .umb-contextmenu-item > button {
-
- z-index:2;// need to stay on top of menu-toggle-open shadow.
-
+ margin-top: 0;
}
}
diff --git a/src/Umbraco.Web.UI.Client/src/less/components/users/umb-user-picker-list.less b/src/Umbraco.Web.UI.Client/src/less/components/users/umb-user-picker-list.less
index 2e0d79e803..4a343f780a 100644
--- a/src/Umbraco.Web.UI.Client/src/less/components/users/umb-user-picker-list.less
+++ b/src/Umbraco.Web.UI.Client/src/less/components/users/umb-user-picker-list.less
@@ -8,6 +8,8 @@
margin-bottom: 5px;
padding: 10px;
align-items: center;
+ width: 100%;
+ text-align: left;
}
.umb-user-picker-list-item:active,
@@ -39,4 +41,4 @@
.umb-user-picker-list-item__name {
font-size: 15px;
font-weight: bold;
-}
\ No newline at end of file
+}
diff --git a/src/Umbraco.Web.UI.Client/src/less/filter-toggle.less b/src/Umbraco.Web.UI.Client/src/less/filter-toggle.less
deleted file mode 100644
index 82f9f3f553..0000000000
--- a/src/Umbraco.Web.UI.Client/src/less/filter-toggle.less
+++ /dev/null
@@ -1,20 +0,0 @@
-.filter-toggle{
- margin: 0;
- padding: 0 8px 0 0;
- position: relative;
-}
-
-.filter-toggle__level{
- display: inline-block;
- font-weight: 700;
- margin: 0 5px;
- max-width: 150px;
-}
-
-.filter-toggle__icon{
- position: absolute;
- top: 0;
- bottom: 0;
- right: 0;
- margin: auto 0;
-}
diff --git a/src/Umbraco.Web.UI.Client/src/less/forms.less b/src/Umbraco.Web.UI.Client/src/less/forms.less
index ed5a2c0622..76c5af8819 100644
--- a/src/Umbraco.Web.UI.Client/src/less/forms.less
+++ b/src/Umbraco.Web.UI.Client/src/less/forms.less
@@ -118,6 +118,10 @@ label.control-label, .control-label {
width: 100%;
}
+.macro-select .form-search {
+ margin: 0 0 10px;
+}
+
// GENERAL STYLES
// --------------
diff --git a/src/Umbraco.Web.UI.Client/src/less/gridview.less b/src/Umbraco.Web.UI.Client/src/less/gridview.less
index 11ba7b2795..80f13fbf1f 100644
--- a/src/Umbraco.Web.UI.Client/src/less/gridview.less
+++ b/src/Umbraco.Web.UI.Client/src/less/gridview.less
@@ -21,7 +21,7 @@
overflow: hidden;
padding: 5px;
border-radius:5px;
- box-shadow: 3px 3px 12px 0px rgba(50, 50, 50, 0.45);
+ box-shadow: 3px 3px 12px 0 rgba(50, 50, 50, 0.45);
}
.usky-grid .ui-sortable-helper *{
@@ -150,7 +150,7 @@
.usky-grid .cell-tools-add {
position: absolute;
text-align: center;
- bottom: 0px;
+ bottom: 0;
left: 0;
right: 0;
margin: 0 45px 1px 0;
@@ -160,14 +160,14 @@
}
}
-.usky-grid .usky-control:hover .cell-tools-add{
+.usky-grid .usky-control:hover .cell-tools-add{
opacity: 1;
}
-.usky-grid .cell-tools-remove {
+.usky-grid .cell-tools-remove {
display:inline-block;
position: absolute;
- top: 0px;
+ top: 0;
right: 5px;
text-align: right;
z-index: 500;
@@ -221,7 +221,7 @@
top: -22px;
left: -1px;
text-decoration: none;
- padding: 0px 7px;
+ padding: 0 7px;
display:none;
font-size:0.8em;
background-color: @white;
@@ -234,7 +234,7 @@
.usky-grid .usky-row-inner > ins.item-label{
top: -20px;
- left: 0px;
+ left: 0;
}
.usky-grid .usky-control-inner.selectedControl , .usky-grid .usky-row-inner.selectedRow{
@@ -408,7 +408,7 @@
.usky-grid ul li {
display: inline-block;
width: 120px;
- margin: 8px 8px 0px 8px;
+ margin: 8px 8px 0 8px;
}
@@ -435,7 +435,7 @@
padding: -1px;
position: absolute;
margin: -1px -1px 0 -1px;
- box-shadow: 2px 2px 10px 0px rgba(50, 50, 50, 0.14);
+ box-shadow: 2px 2px 10px 0 rgba(50, 50, 50, 0.14);
z-index: 9999999;
}
@@ -558,7 +558,8 @@
margin: 20px;
}
- .usky-grid .uSky-templates-template a.tb:hover {
+ .usky-grid .uSky-templates-template button.tb:hover,
+ .usky-grid .uSky-templates-template button.tb:focus {
border:5px solid @blueMid;
}
@@ -587,7 +588,9 @@
border-right: 1px dashed @gray-8 !important;
}
- .usky-grid a.uSky-templates-column:hover, .usky-grid a.uSky-templates-column.selected{
+ .usky-grid button.uSky-templates-column:hover,
+ .usky-grid button.uSky-templates-column:focus,
+ .usky-grid button.uSky-templates-column.selected{
background-color: @blueMid;
}
@@ -628,13 +631,13 @@
transition: border 200ms linear;
&.prevalues-rows {
- margin: 0px 20px 20px 0px;
+ margin: 0 20px 20px 0;
width: 80px;
float:left;
}
&.prevalues-templates {
- margin: 0px 20px 20px 0px;
+ margin: 0 20px 20px 0;
float:left;
}
@@ -803,7 +806,7 @@
.usky-grid-configuration .uSky-templates .uSky-templates-template .tb{
max-height: 50px;
border-width: 2px !important;
- padding: 0px;
+ padding: 0;
border-spacing:2px;
overflow: hidden;
}
@@ -844,13 +847,13 @@
}
.usky-grid-configuration .uSky-templates-rows .uSky-templates-row{
- margin: 0px 50px 20px 0px;
+ margin: 0 50px 20px 0;
width: 60px;
}
.usky-grid-configuration .uSky-templates-rows .uSky-templates-row .tb{
border-width: 2px !important;
- padding: 0px;
+ padding: 0;
border-spacing:2px;
}
@@ -858,4 +861,6 @@
height: 10px !important;
}
-.usky-grid-configuration a.uSky-templates-column{height: 70px !important;}
+.usky-grid-configuration button.uSky-templates-column {
+ height: 70px !important;
+}
diff --git a/src/Umbraco.Web.UI.Client/src/less/listview.less b/src/Umbraco.Web.UI.Client/src/less/listview.less
index 9d0ed002bb..582da12804 100644
--- a/src/Umbraco.Web.UI.Client/src/less/listview.less
+++ b/src/Umbraco.Web.UI.Client/src/less/listview.less
@@ -259,20 +259,21 @@
margin-right: 15px;
}
+.list-view-layout__icon-wrapper {
+ margin-right: 10px;
+}
+
.list-view-layout__icon {
font-size: 18px;
- margin-right: 10px;
vertical-align: middle;
border: 1px solid @gray-8;
background: @white;
- padding: 6px 8px;
- display: block;
-}
-
-.list-view-layout__icon:hover,
-.list-view-layout__icon:focus,
-.list-view-layout__icon:active {
- text-decoration: none;
+ padding: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 30px;
+ height: 30px;
}
.list-view-layout__remove {
@@ -281,20 +282,9 @@
}
.list-view-add-layout {
- width:100%;
- background:0 0;
- margin-top: 10px;
- color: @ui-action-discreet-type;
- border: 1px dashed @ui-action-discreet-border;
- display: flex;
- align-items: center;
- justify-content: center;
- padding: 5px 0;
- box-sizing: border-box;
+ &:extend(.umb-node-preview-add);
}
.list-view-add-layout:hover {
- text-decoration: none;
- color: @ui-action-discreet-type-hover;
- border-color: @ui-action-discreet-border-hover;
+ &:extend(.umb-node-preview-add:hover);
}
diff --git a/src/Umbraco.Web.UI.Client/src/less/panel.less b/src/Umbraco.Web.UI.Client/src/less/panel.less
index 115bdaed70..81326826f6 100644
--- a/src/Umbraco.Web.UI.Client/src/less/panel.less
+++ b/src/Umbraco.Web.UI.Client/src/less/panel.less
@@ -413,6 +413,8 @@ input.umb-panel-header-name-input.name-is-empty {
.umb-panel-header-name {
font-size: 16px;
font-weight: bold;
+ margin: 0;
+ line-height: 1.2;
}
diff --git a/src/Umbraco.Web.UI.Client/src/less/property-editors.less b/src/Umbraco.Web.UI.Client/src/less/property-editors.less
index 664be1dafc..3912d11161 100644
--- a/src/Umbraco.Web.UI.Client/src/less/property-editors.less
+++ b/src/Umbraco.Web.UI.Client/src/less/property-editors.less
@@ -163,6 +163,16 @@
.sp-replacer {
display: inline-flex;
margin-right: 18px;
+ height: auto;
+
+ .sp-preview {
+ margin: 5px;
+ height: auto;
+ }
+
+ .sp-dd {
+ line-height: 2rem;
+ }
}
label {
diff --git a/src/Umbraco.Web.UI.Client/src/less/utilities/_spacing.less b/src/Umbraco.Web.UI.Client/src/less/utilities/_spacing.less
index 787e50f204..d2968696dc 100644
--- a/src/Umbraco.Web.UI.Client/src/less/utilities/_spacing.less
+++ b/src/Umbraco.Web.UI.Client/src/less/utilities/_spacing.less
@@ -35,10 +35,13 @@
7 = 7th step in spacing scale
*/
-.m-center {
- margin-left: auto;
+.m-center,
+.mx-auto {
+ margin-left: auto;
margin-right: auto;
}
+.ml-auto { margin-left: auto; }
+.mr-auto { margin-right: auto; }
.mt0 { margin-top: @spacing-none; }
.mt1 { margin-top: @spacing-extra-small; }
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/blockeditor/blockeditor.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/blockeditor/blockeditor.controller.js
index a08a05b0f7..88cda027a8 100644
--- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/blockeditor/blockeditor.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/blockeditor/blockeditor.controller.js
@@ -7,8 +7,8 @@ angular.module("umbraco")
vm.tabs = [];
localizationService.localizeMany([
- vm.model.liveEditing ? "prompt_discardChanges" : "general_close",
- vm.model.liveEditing ? "buttons_confirmActionConfirm" : "buttons_submitChanges"
+ vm.model.createFlow ? "general_cancel" : (vm.model.liveEditing ? "prompt_discardChanges" : "general_close"),
+ vm.model.createFlow ? "general_create" : (vm.model.liveEditing ? "buttons_confirmActionConfirm" : "buttons_submitChanges")
]).then(function (data) {
vm.closeLabel = data[0];
vm.submitLabel = data[1];
@@ -68,16 +68,16 @@ angular.module("umbraco")
// * It would have a 'commit' method to commit the removed errors - which we would call in the formHelper.submitForm when it's successful
// * It would have a 'rollback' method to reset the removed errors - which we would call here
-
- if (vm.blockForm.$dirty === true) {
- localizationService.localizeMany(["prompt_discardChanges", "blockEditor_blockHasChanges"]).then(function (localizations) {
+ if (vm.model.createFlow === true || vm.blockForm.$dirty === true) {
+ var labels = vm.model.createFlow === true ? ["blockEditor_confirmCancelBlockCreationHeadline", "blockEditor_confirmCancelBlockCreationMessage"] : ["prompt_discardChanges", "blockEditor_blockHasChanges"];
+ localizationService.localizeMany(labels).then(function (localizations) {
const confirm = {
title: localizations[0],
view: "default",
content: localizations[1],
submitButtonLabelKey: "general_discard",
submitButtonStyle: "danger",
- closeButtonLabelKey: "general_cancel",
+ closeButtonLabelKey: "prompt_stay",
submit: function () {
overlayService.close();
vm.model.close(vm.model);
@@ -88,11 +88,10 @@ angular.module("umbraco")
};
overlayService.open(confirm);
});
-
- return;
+ } else {
+ vm.model.close(vm.model);
}
- // TODO: check if content/settings has changed and ask user if they are sure.
- vm.model.close(vm.model);
+
}
}
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/blockeditor/blockeditor.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/blockeditor/blockeditor.html
index 285e554c68..2367771804 100644
--- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/blockeditor/blockeditor.html
+++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/blockeditor/blockeditor.html
@@ -37,6 +37,7 @@
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/blockpicker/blockpicker.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/blockpicker/blockpicker.html
index fb7e946ee7..6dea4debb6 100644
--- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/blockpicker/blockpicker.html
+++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/blockpicker/blockpicker.html
@@ -69,6 +69,7 @@
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/embed/embed.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/embed/embed.controller.js
index 515f54e3d7..c3d1312109 100644
--- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/embed/embed.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/embed/embed.controller.js
@@ -22,7 +22,7 @@
};
if ($scope.model.modify) {
- angular.extend($scope.model.embed, $scope.model.modify);
+ Utilities.extend($scope.model.embed, $scope.model.modify);
showPreview();
}
@@ -34,7 +34,7 @@
vm.close = close;
function onInit() {
- if(!$scope.model.title) {
+ if (!$scope.model.title) {
localizationService.localize("general_embed").then(function(value){
$scope.model.title = value;
});
@@ -122,7 +122,6 @@
if ($scope.model.embed.url !== "") {
showPreview();
}
-
}
function toggleConstrain() {
@@ -130,19 +129,18 @@
}
function submit() {
- if($scope.model && $scope.model.submit) {
+ if ($scope.model && $scope.model.submit) {
$scope.model.submit($scope.model);
}
}
function close() {
- if($scope.model && $scope.model.close) {
+ if ($scope.model && $scope.model.close) {
$scope.model.close();
}
}
onInit();
-
}
angular.module("umbraco").controller("Umbraco.Editors.EmbedController", EmbedController);
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/embed/embed.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/embed/embed.html
index 5862ca7059..19cf9b2278 100644
--- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/embed/embed.html
+++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/embed/embed.html
@@ -16,7 +16,7 @@
-
+
-
+
-
-
-
-
+
+
+
+
@@ -54,5 +54,5 @@
-
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/itempicker/itempicker.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/itempicker/itempicker.html
index 5b121c172f..c563394ab3 100644
--- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/itempicker/itempicker.html
+++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/itempicker/itempicker.html
@@ -25,14 +25,13 @@
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macroparameterpicker/macroparameterpicker.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macroparameterpicker/macroparameterpicker.html
index e92ce65bde..151a8167e8 100644
--- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macroparameterpicker/macroparameterpicker.html
+++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macroparameterpicker/macroparameterpicker.html
@@ -34,15 +34,18 @@
{{key}}
@@ -55,15 +58,18 @@
-
+ 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 @@
-
+
@@ -32,12 +32,12 @@
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 c8e4a00af1..a022657e7c 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
@@ -1,7 +1,7 @@
//used for the media picker dialog
angular.module("umbraco")
.controller("Umbraco.Editors.MediaPickerController",
- function ($scope, $timeout, mediaResource, entityResource, userService, mediaHelper, mediaTypeHelper, eventsService, treeService, localStorageService, localizationService, editorService, umbSessionStorage) {
+ function ($scope, $timeout, mediaResource, entityResource, userService, mediaHelper, mediaTypeHelper, eventsService, treeService, localStorageService, localizationService, editorService, umbSessionStorage, notificationsService) {
var vm = this;
@@ -166,8 +166,14 @@ angular.module("umbraco")
}
}
- function upload() {
- $(".umb-file-dropzone .file-select").trigger("click");
+ function upload(v) {
+ var fileSelect = $(".umb-file-dropzone .file-select");
+ if (fileSelect.length === 0){
+ localizationService.localize('media_uploadNotAllowed').then(function (message) { notificationsService.warning(message); });
+ }
+ else{
+ fileSelect.trigger("click");
+ }
}
function dragLeave() {
@@ -223,15 +229,11 @@ angular.module("umbraco")
return f.path.indexOf($scope.startNodeId) !== -1;
});
});
-
- mediaTypeHelper.getAllowedImagetypes(folder.id)
- .then(function (types) {
- vm.acceptedMediatypes = types;
- });
} else {
$scope.path = [];
}
+ mediaTypeHelper.getAllowedImagetypes(folder.id).then(function (types) { vm.acceptedMediatypes = types; });
$scope.lockedFolder = (folder.id === -1 && $scope.model.startNodeIsVirtual) || hasFolderAccess(folder) === false;
$scope.currentFolder = folder;
@@ -286,7 +288,7 @@ angular.module("umbraco")
gotoFolder(item);
}
else {
- $scope.clickHandler(item, event, index);
+ clickHandler(item, event, index);
}
};
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/querybuilder/querybuilder.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/querybuilder/querybuilder.html
index 05ebc56083..306e9f30ea 100644
--- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/querybuilder/querybuilder.html
+++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/querybuilder/querybuilder.html
@@ -33,9 +33,9 @@
-
+
+
@@ -71,9 +71,9 @@
-
+
+
@@ -90,9 +90,9 @@
-
+
+
@@ -137,9 +137,9 @@
-
+
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/treepicker/treepicker.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/treepicker/treepicker.html
index c816c31b3e..4d43c2df51 100644
--- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/treepicker/treepicker.html
+++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/treepicker/treepicker.html
@@ -21,7 +21,7 @@
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/userpicker/userpicker.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/userpicker/userpicker.html
index 5536ce38c2..eb08b5646d 100644
--- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/userpicker/userpicker.html
+++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/userpicker/userpicker.html
@@ -9,9 +9,9 @@
hide-icon="true"
hide-description="true">
-
+
-
+
@@ -31,10 +31,10 @@
no-dirty-check />
-
+
-
+
{{selectedLanguage.name}}
-
+