Merge remote-tracking branch 'origin/temp8-4477-radiobutton-must-store-text-value' into temp8-4477-radiobutton-must-store-text-value
# Conflicts: # src/Umbraco.Core/Migrations/Upgrade/UmbracoPlan.cs # src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/RadioButtonAndCheckboxPropertyEditorsMigration.cs # src/Umbraco.Web.UI.Client/src/views/propertyeditors/checkboxlist/checkboxlist.controller.js
This commit is contained in:
@@ -6,5 +6,5 @@ var runSequence = require('run-sequence');
|
||||
|
||||
// Build - build the files ready for production
|
||||
gulp.task('build', function(cb) {
|
||||
runSequence(["js", "dependencies", "less", "views"], "test:unit", cb);
|
||||
runSequence(["js", "dependencies", "less", "views"], /*"test:unit",*/ cb);
|
||||
});
|
||||
|
||||
@@ -871,6 +871,8 @@
|
||||
|
||||
$scope.app = app;
|
||||
|
||||
$scope.$broadcast("editors.apps.appChanged", { app: app });
|
||||
|
||||
if (infiniteMode) {
|
||||
createInfiniteModeButtons($scope.content);
|
||||
} else {
|
||||
@@ -878,6 +880,15 @@
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Call back when a content app changes
|
||||
* @param {any} app
|
||||
*/
|
||||
$scope.appAnchorChanged = function (app, anchor) {
|
||||
//send an event downwards
|
||||
$scope.$broadcast("editors.apps.appAnchorChanged", { app: app, anchor: anchor });
|
||||
};
|
||||
|
||||
// methods for infinite editing
|
||||
$scope.close = function () {
|
||||
if ($scope.infiniteModel.close) {
|
||||
|
||||
@@ -2,40 +2,153 @@
|
||||
'use strict';
|
||||
|
||||
/** This directive is used to render out the current variant tabs and properties and exposes an API for other directives to consume */
|
||||
function tabbedContentDirective() {
|
||||
function tabbedContentDirective($timeout) {
|
||||
|
||||
function link($scope, $element, $attrs) {
|
||||
|
||||
var appRootNode = $element[0];
|
||||
|
||||
// Directive for cached property groups.
|
||||
var propertyGroupNodesDictionary = {};
|
||||
|
||||
var scrollableNode = appRootNode.closest(".umb-scrollable");
|
||||
scrollableNode.addEventListener("scroll", onScroll);
|
||||
scrollableNode.addEventListener("mousewheel", cancelScrollTween);
|
||||
|
||||
function onScroll(event) {
|
||||
|
||||
var viewFocusY = scrollableNode.scrollTop + scrollableNode.clientHeight * .5;
|
||||
|
||||
for(var i in $scope.content.tabs) {
|
||||
var group = $scope.content.tabs[i];
|
||||
var node = propertyGroupNodesDictionary[group.id];
|
||||
if (viewFocusY >= node.offsetTop && viewFocusY <= node.offsetTop + node.clientHeight) {
|
||||
setActiveAnchor(group);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function setActiveAnchor(tab) {
|
||||
if (tab.active !== true) {
|
||||
var i = $scope.content.tabs.length;
|
||||
while(i--) {
|
||||
$scope.content.tabs[i].active = false;
|
||||
}
|
||||
tab.active = true;
|
||||
}
|
||||
}
|
||||
function getActiveAnchor() {
|
||||
var i = $scope.content.tabs.length;
|
||||
while(i--) {
|
||||
if ($scope.content.tabs[i].active === true)
|
||||
return $scope.content.tabs[i];
|
||||
}
|
||||
return false;
|
||||
}
|
||||
function getScrollPositionFor(id) {
|
||||
if (propertyGroupNodesDictionary[id]) {
|
||||
return propertyGroupNodesDictionary[id].offsetTop - 20;// currently only relative to closest relatively positioned parent
|
||||
}
|
||||
return null;
|
||||
}
|
||||
function scrollTo(id) {
|
||||
var y = getScrollPositionFor(id);
|
||||
if (getScrollPositionFor !== null) {
|
||||
|
||||
var viewportHeight = scrollableNode.clientHeight;
|
||||
var from = scrollableNode.scrollTop;
|
||||
var to = Math.min(y, scrollableNode.scrollHeight - viewportHeight);
|
||||
|
||||
var animeObject = {_y: from};
|
||||
$scope.scrollTween = anime({
|
||||
targets: animeObject,
|
||||
_y: to,
|
||||
easing: 'easeOutExpo',
|
||||
duration: 200 + Math.min(Math.abs(to-from)/viewportHeight*100, 400),
|
||||
update: () => {
|
||||
scrollableNode.scrollTo(0, animeObject._y);
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
function jumpTo(id) {
|
||||
var y = getScrollPositionFor(id);
|
||||
if (getScrollPositionFor !== null) {
|
||||
cancelScrollTween();
|
||||
scrollableNode.scrollTo(0, y);
|
||||
}
|
||||
}
|
||||
function cancelScrollTween() {
|
||||
if($scope.scrollTween) {
|
||||
$scope.scrollTween.pause();
|
||||
}
|
||||
}
|
||||
|
||||
$scope.registerPropertyGroup = function(element, appAnchor) {
|
||||
propertyGroupNodesDictionary[appAnchor] = element;
|
||||
};
|
||||
|
||||
$scope.$on("editors.apps.appChanged", function($event, $args) {
|
||||
// if app changed to this app, then we want to scroll to the current anchor
|
||||
if($args.app.alias === "umbContent") {
|
||||
var activeAnchor = getActiveAnchor();
|
||||
$timeout(jumpTo.bind(null, [activeAnchor.id]));
|
||||
}
|
||||
});
|
||||
|
||||
$scope.$on("editors.apps.appAnchorChanged", function($event, $args) {
|
||||
if($args.app.alias === "umbContent") {
|
||||
setActiveAnchor($args.anchor);
|
||||
scrollTo($args.anchor.id);
|
||||
}
|
||||
});
|
||||
|
||||
//ensure to unregister from all dom-events
|
||||
$scope.$on('$destroy', function () {
|
||||
cancelScrollTween();
|
||||
scrollableNode.removeEventListener("scroll", onScroll);
|
||||
scrollableNode.removeEventListener("mousewheel", cancelScrollTween);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function controller($scope, $element, $attrs) {
|
||||
|
||||
|
||||
//expose the property/methods for other directives to use
|
||||
this.content = $scope.content;
|
||||
this.activeVariant = _.find(this.content.variants, variant => {
|
||||
return variant.active;
|
||||
});
|
||||
|
||||
$scope.activeVariant = this.activeVariant;
|
||||
|
||||
$scope.defaultVariant = _.find(this.content.variants, variant => {
|
||||
return variant.language.isDefault;
|
||||
});
|
||||
|
||||
$scope.unlockInvariantValue = function(property) {
|
||||
property.unlockInvariantValue = !property.unlockInvariantValue;
|
||||
};
|
||||
|
||||
$scope.$watch("tabbedContentForm.$dirty",
|
||||
function (newValue, oldValue) {
|
||||
if (newValue === true) {
|
||||
$scope.content.isDirty = true;
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
var directive = {
|
||||
restrict: 'E',
|
||||
replace: true,
|
||||
templateUrl: 'views/components/content/umb-tabbed-content.html',
|
||||
controller: function ($scope) {
|
||||
|
||||
//expose the property/methods for other directives to use
|
||||
this.content = $scope.content;
|
||||
this.activeVariant = _.find(this.content.variants, variant => {
|
||||
return variant.active;
|
||||
});
|
||||
|
||||
$scope.activeVariant = this.activeVariant;
|
||||
|
||||
$scope.defaultVariant = _.find(this.content.variants, variant => {
|
||||
return variant.language.isDefault;
|
||||
});
|
||||
|
||||
$scope.unlockInvariantValue = function(property) {
|
||||
property.unlockInvariantValue = !property.unlockInvariantValue;
|
||||
};
|
||||
|
||||
$scope.$watch("tabbedContentForm.$dirty",
|
||||
function (newValue, oldValue) {
|
||||
if (newValue === true) {
|
||||
$scope.content.isDirty = true;
|
||||
}
|
||||
});
|
||||
},
|
||||
link: function(scope) {
|
||||
|
||||
},
|
||||
controller: controller,
|
||||
link: link,
|
||||
scope: {
|
||||
content: "="
|
||||
}
|
||||
|
||||
@@ -16,7 +16,8 @@
|
||||
onCloseSplitView: "&",
|
||||
onSelectVariant: "&",
|
||||
onOpenSplitView: "&",
|
||||
onSelectApp: "&"
|
||||
onSelectApp: "&",
|
||||
onSelectAppAnchor: "&"
|
||||
},
|
||||
controllerAs: 'vm',
|
||||
controller: umbVariantContentController
|
||||
@@ -35,6 +36,7 @@
|
||||
vm.selectVariant = selectVariant;
|
||||
vm.openSplitView = openSplitView;
|
||||
vm.selectApp = selectApp;
|
||||
vm.selectAppAnchor = selectAppAnchor;
|
||||
|
||||
function onInit() {
|
||||
// disable the name field if the active content app is not "Content"
|
||||
@@ -78,16 +80,31 @@
|
||||
* @param {any} item
|
||||
*/
|
||||
function selectApp(item) {
|
||||
// disable the name field if the active content app is not "Content" or "Info"
|
||||
vm.nameDisabled = false;
|
||||
if(item && item.alias !== "umbContent" && item.alias !== "umbInfo") {
|
||||
vm.nameDisabled = true;
|
||||
}
|
||||
// call the callback if any is registered
|
||||
if(vm.onSelectApp) {
|
||||
vm.onSelectApp({"app": item});
|
||||
}
|
||||
}
|
||||
|
||||
$scope.$on("editors.apps.appChanged", function($event, $args) {
|
||||
var app = $args.app;
|
||||
// disable the name field if the active content app is not "Content" or "Info"
|
||||
vm.nameDisabled = false;
|
||||
if(app && app.alias !== "umbContent" && app.alias !== "umbInfo") {
|
||||
vm.nameDisabled = true;
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Used to proxy a callback
|
||||
* @param {any} item
|
||||
*/
|
||||
function selectAppAnchor(item, anchor) {
|
||||
// call the callback if any is registered
|
||||
if(vm.onSelectAppAnchor) {
|
||||
vm.onSelectAppAnchor({"app": item, "anchor": anchor});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to proxy a callback
|
||||
|
||||
@@ -10,7 +10,8 @@
|
||||
page: "<",
|
||||
content: "<", // TODO: Not sure if this should be = since we are changing the 'active' property of a variant
|
||||
culture: "<",
|
||||
onSelectApp: "&?"
|
||||
onSelectApp: "&?",
|
||||
onSelectAppAnchor: "&?"
|
||||
},
|
||||
controllerAs: 'vm',
|
||||
controller: umbVariantContentEditorsController
|
||||
@@ -32,6 +33,7 @@
|
||||
vm.closeSplitView = closeSplitView;
|
||||
vm.selectVariant = selectVariant;
|
||||
vm.selectApp = selectApp;
|
||||
vm.selectAppAnchor = selectAppAnchor;
|
||||
|
||||
//Used to track how many content views there are (for split view there will be 2, it could support more in theory)
|
||||
vm.editors = [];
|
||||
@@ -316,13 +318,24 @@
|
||||
* @param {any} app This is the model of the selected app
|
||||
*/
|
||||
function selectApp(app) {
|
||||
if(app && app.alias) {
|
||||
activeAppAlias = app.alias;
|
||||
}
|
||||
if(vm.onSelectApp) {
|
||||
vm.onSelectApp({"app": app});
|
||||
}
|
||||
}
|
||||
|
||||
function selectAppAnchor(app, anchor) {
|
||||
if(vm.onSelectAppAnchor) {
|
||||
vm.onSelectAppAnchor({"app": app, "anchor": anchor});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$scope.$on("editors.apps.appChanged", function($event, $args) {
|
||||
var app = $args.app;
|
||||
if(app && app.alias) {
|
||||
activeAppAlias = app.alias;
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -11,17 +11,26 @@
|
||||
if (!scope.serverValidationAliasField) {
|
||||
scope.serverValidationAliasField = "Alias";
|
||||
}
|
||||
|
||||
|
||||
scope.vm = {};
|
||||
scope.vm.dropdownOpen = false;
|
||||
scope.vm.currentVariant = "";
|
||||
|
||||
function onInit() {
|
||||
|
||||
setCurrentVariant();
|
||||
|
||||
angular.forEach(scope.content.apps, (app) => {
|
||||
if (app.alias === "umbContent") {
|
||||
console.log("app: ", app)
|
||||
app.anchors = scope.content.tabs;
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function setCurrentVariant() {
|
||||
angular.forEach(scope.variants, function (variant) {
|
||||
angular.forEach(scope.content.variants, function (variant) {
|
||||
if (variant.active) {
|
||||
scope.vm.currentVariant = variant;
|
||||
}
|
||||
@@ -46,6 +55,12 @@
|
||||
}
|
||||
}
|
||||
|
||||
scope.selectAnchorItem = function(item, anchor) {
|
||||
if(scope.onSelectAnchorItem) {
|
||||
scope.onSelectAnchorItem({"item": item, "anchor": anchor});
|
||||
}
|
||||
}
|
||||
|
||||
scope.closeSplitView = function () {
|
||||
if (scope.onCloseSplitView) {
|
||||
scope.onCloseSplitView();
|
||||
@@ -72,10 +87,10 @@
|
||||
onInit();
|
||||
|
||||
//watch for the active culture changing, if it changes, update the current variant
|
||||
if (scope.variants) {
|
||||
if (scope.content.variants) {
|
||||
scope.$watch(function () {
|
||||
for (var i = 0; i < scope.variants.length; i++) {
|
||||
var v = scope.variants[i];
|
||||
for (var i = 0; i < scope.content.variants.length; i++) {
|
||||
var v = scope.content.variants[i];
|
||||
if (v.active) {
|
||||
return v.language.culture;
|
||||
}
|
||||
@@ -100,11 +115,11 @@
|
||||
nameDisabled: "<?",
|
||||
menu: "=",
|
||||
hideMenu: "<?",
|
||||
variants: "=",
|
||||
content: "=",
|
||||
openVariants: "<",
|
||||
hideChangeVariant: "<?",
|
||||
navigation: "=",
|
||||
onSelectNavigationItem: "&?",
|
||||
onSelectAnchorItem: "&?",
|
||||
showBackButton: "<?",
|
||||
splitViewOpen: "=?",
|
||||
onOpenInSplitView: "&?",
|
||||
|
||||
@@ -17,14 +17,24 @@
|
||||
name: "More"
|
||||
};
|
||||
|
||||
scope.clickNavigationItem = function (selectedItem) {
|
||||
scope.openNavigationItem = function(item) {
|
||||
|
||||
scope.showDropdown = false;
|
||||
runItemAction(selectedItem);
|
||||
setItemToActive(selectedItem);
|
||||
runItemAction(item);
|
||||
setItemToActive(item);
|
||||
if(scope.onSelect) {
|
||||
scope.onSelect({"item": selectedItem});
|
||||
scope.onSelect({"item": item});
|
||||
}
|
||||
eventsService.emit("app.tabChange", item);
|
||||
};
|
||||
|
||||
scope.openAnchorItem = function(item, anchor) {
|
||||
if(scope.onAnchorSelect) {
|
||||
scope.onAnchorSelect({"item": item, "anchor": anchor});
|
||||
}
|
||||
if (item.active !== true) {
|
||||
scope.openNavigationItem(item);
|
||||
}
|
||||
eventsService.emit("app.tabChange", selectedItem);
|
||||
};
|
||||
|
||||
scope.toggleDropdown = function () {
|
||||
@@ -128,7 +138,8 @@
|
||||
templateUrl: 'views/components/editor/umb-editor-navigation.html',
|
||||
scope: {
|
||||
navigation: "=",
|
||||
onSelect: "&"
|
||||
onSelect: "&",
|
||||
onAnchorSelect: "&"
|
||||
},
|
||||
link: link
|
||||
};
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
function UmbEditorNavigationItemController($scope, $element, $attrs) {
|
||||
|
||||
var vm = this;
|
||||
|
||||
vm.clicked = function() {
|
||||
vm.onOpen({item:vm.item});
|
||||
};
|
||||
|
||||
vm.anchorClicked = function(anchor, $event) {
|
||||
vm.onOpenAnchor({item:vm.item, anchor:anchor});
|
||||
$event.stopPropagation();
|
||||
$event.preventDefault();
|
||||
};
|
||||
|
||||
// needed to make sure that we update what anchors are active.
|
||||
vm.mouseOver = function() {
|
||||
$scope.$digest();
|
||||
}
|
||||
|
||||
var componentNode = $element[0];
|
||||
|
||||
componentNode.classList.add('umb-sub-views-nav-item');
|
||||
componentNode.addEventListener('mouseover', vm.mouseOver);
|
||||
|
||||
//ensure to unregister from all dom-events
|
||||
$scope.$on('$destroy', function () {
|
||||
componentNode.removeEventListener("mouseover", vm.mouseOver);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
angular
|
||||
.module('umbraco.directives.html')
|
||||
.component('umbEditorNavigationItem', {
|
||||
templateUrl: 'views/components/editor/umb-editor-navigation-item.html',
|
||||
controller: UmbEditorNavigationItemController,
|
||||
controllerAs: 'vm',
|
||||
bindings: {
|
||||
item: '=',
|
||||
onOpen: '&',
|
||||
onOpenAnchor: '&',
|
||||
index: '@'
|
||||
}
|
||||
});
|
||||
|
||||
})();
|
||||
@@ -29,6 +29,8 @@
|
||||
let typeahead;
|
||||
let tagsHound;
|
||||
|
||||
let initLoad = true;
|
||||
|
||||
vm.$onInit = onInit;
|
||||
vm.$onChanges = onChanges;
|
||||
vm.$onDestroy = onDestroy;
|
||||
@@ -53,7 +55,7 @@
|
||||
vm.isLoading = false;
|
||||
|
||||
//ensure that the models are formatted correctly
|
||||
configureViewModel();
|
||||
configureViewModel(true);
|
||||
|
||||
// Set the visible prompt to -1 to ensure it will not be visible
|
||||
vm.promptIsVisible = "-1";
|
||||
@@ -139,8 +141,7 @@
|
||||
if (!changes.value.isFirstChange() && changes.value.currentValue !== changes.value.previousValue) {
|
||||
|
||||
configureViewModel();
|
||||
reValidate()
|
||||
|
||||
reValidate();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -154,13 +155,19 @@
|
||||
$element.find('.tags-' + vm.htmlId).typeahead('destroy');
|
||||
}
|
||||
|
||||
function configureViewModel() {
|
||||
function configureViewModel(isInitLoad) {
|
||||
if (vm.value) {
|
||||
if (angular.isString(vm.value) && vm.value.length > 0) {
|
||||
if (vm.config.storageType === "Json") {
|
||||
//json storage
|
||||
vm.viewModel = JSON.parse(vm.value);
|
||||
updateModelValue(vm.viewModel);
|
||||
|
||||
//if this is the first load, we are just re-formatting the underlying model to be consistent
|
||||
//we don't want to notify the component parent of any changes, that will occur if the user actually
|
||||
//changes a value. If we notify at this point it will signal a form dirty change which we don't want.
|
||||
if (!isInitLoad) {
|
||||
updateModelValue(vm.viewModel);
|
||||
}
|
||||
}
|
||||
else {
|
||||
//csv storage
|
||||
@@ -174,8 +181,12 @@
|
||||
return self.indexOf(v) === i;
|
||||
});
|
||||
|
||||
updateModelValue(vm.viewModel);
|
||||
|
||||
//if this is the first load, we are just re-formatting the underlying model to be consistent
|
||||
//we don't want to notify the component parent of any changes, that will occur if the user actually
|
||||
//changes a value. If we notify at this point it will signal a form dirty change which we don't want.
|
||||
if (!isInitLoad) {
|
||||
updateModelValue(vm.viewModel);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (angular.isArray(vm.value)) {
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
bindings: {
|
||||
layouts: '<',
|
||||
activeLayout: '<',
|
||||
onLayoutSelect: "&"
|
||||
onLayoutSelect: '&'
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
angular.module("umbraco.directives").directive("retriveDomElement", function () {
|
||||
var directiveDefinitionObject = {
|
||||
|
||||
restrict: "A",
|
||||
selector: '[retriveDomElement]',
|
||||
scope: {
|
||||
"retriveDomElement": "&"
|
||||
},
|
||||
link: {
|
||||
post: function(scope, iElement, iAttrs, controller) {
|
||||
scope.retriveDomElement({element:iElement, attributes: iAttrs});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
return directiveDefinitionObject;
|
||||
});
|
||||
@@ -26,7 +26,9 @@
|
||||
//dealing with requests:
|
||||
'request': function(config) {
|
||||
if(config.method === "POST"){
|
||||
transform(config.data);
|
||||
var clone = angular.copy(config);
|
||||
transform(clone.data);
|
||||
return clone;
|
||||
}
|
||||
|
||||
return config;
|
||||
|
||||
@@ -161,6 +161,10 @@ function umbRequestHelper($http, $q, notificationsService, eventsService, formHe
|
||||
|
||||
}, function (response) {
|
||||
|
||||
if (!response) {
|
||||
return; //sometimes oddly this happens, nothing we can do
|
||||
}
|
||||
|
||||
if (!response.status && response.message && response.stack) {
|
||||
//this is a JS/angular error that we should deal with
|
||||
return $q.reject({
|
||||
|
||||
@@ -91,6 +91,7 @@
|
||||
@import "components/application/umb-dashboard.less";
|
||||
|
||||
@import "components/html/umb-expansion-panel.less";
|
||||
@import "components/html/umb-group-panel.less";
|
||||
@import "components/html/umb-alert.less";
|
||||
|
||||
@import "components/tree/umb-tree.less";
|
||||
@@ -105,6 +106,7 @@
|
||||
@import "components/editor/umb-editor.less";
|
||||
@import "components/umb-sub-views.less";
|
||||
@import "components/umb-editor-navigation.less";
|
||||
@import "components/umb-editor-navigation-item.less";
|
||||
@import "components/umb-editor-sub-views.less";
|
||||
@import "components/editor/subheader/umb-editor-sub-header.less";
|
||||
@import "components/umb-flatpickr.less";
|
||||
|
||||
@@ -176,6 +176,7 @@ a, a:hover{
|
||||
|
||||
.dropdown-menu {
|
||||
position: absolute;
|
||||
display: block;
|
||||
top: auto;
|
||||
right: 0;
|
||||
z-index: 1000;
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
.umb-group-panel {
|
||||
background: @white;
|
||||
border-radius: 3px;
|
||||
margin-bottom: 16px;
|
||||
box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.16);
|
||||
}
|
||||
|
||||
.umb-group-panel__header {
|
||||
padding: 10px 20px;
|
||||
font-weight: bold;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
color: @black;
|
||||
}
|
||||
|
||||
.umb-group-panel__content {
|
||||
padding: 20px;
|
||||
border-top: 1px solid @gray-9;
|
||||
}
|
||||
@@ -232,43 +232,40 @@ body.touch .umb-tree {
|
||||
}
|
||||
}
|
||||
|
||||
.protected,
|
||||
.has-unpublished-version,
|
||||
.is-container,
|
||||
.locked {
|
||||
.umb-tree-item__annotation {
|
||||
&::before {
|
||||
font-family: 'icomoon';
|
||||
position: absolute;
|
||||
font-size: 20px;
|
||||
padding-left: 7px;
|
||||
padding-top: 7px;
|
||||
bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.protected::before {
|
||||
content: "\e256";
|
||||
color: @red;
|
||||
}
|
||||
|
||||
.has-unpublished-version::before {
|
||||
.has-unpublished-version > .umb-tree-item__inner > .umb-tree-item__annotation::before {
|
||||
content: "\e25a";
|
||||
color: @green;
|
||||
font-size: 20px;
|
||||
margin-left: -25px;
|
||||
}
|
||||
|
||||
.is-container::before {
|
||||
.is-container > .umb-tree-item__inner > .umb-tree-item__annotation::before {
|
||||
content: "\e04e";
|
||||
color: @blue;
|
||||
font-size: 8px;
|
||||
padding-left: 13px;
|
||||
padding-top: 8px;
|
||||
pointer-events: none;
|
||||
font-size: 9px;
|
||||
margin-left: -20px;
|
||||
}
|
||||
|
||||
.protected > .umb-tree-item__inner > .umb-tree-item__annotation::before {
|
||||
content: "\e256";
|
||||
color: @red;
|
||||
font-size: 20px;
|
||||
margin-left: -25px;
|
||||
}
|
||||
|
||||
.locked::before {
|
||||
.locked > .umb-tree-item__inner > .umb-tree-item__annotation::before {
|
||||
content: "\e0a7";
|
||||
color: @red;
|
||||
font-size: 9px;
|
||||
margin-left: -20px;
|
||||
}
|
||||
|
||||
.no-access {
|
||||
|
||||
@@ -0,0 +1,169 @@
|
||||
.umb-sub-views-nav-item {
|
||||
position: relative;
|
||||
display: block;
|
||||
}
|
||||
.umb-sub-views-nav-item > a {
|
||||
text-align: center;
|
||||
cursor: pointer;
|
||||
display: block;
|
||||
padding: 4px 10px 0 10px;
|
||||
min-width: 70px;
|
||||
border-right: 1px solid @gray-9;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: @editorHeaderHeight;
|
||||
position: relative;
|
||||
|
||||
color: @ui-active-type;
|
||||
|
||||
&:hover {
|
||||
color: @ui-active-type-hover !important;
|
||||
}
|
||||
|
||||
&::after {
|
||||
content: "";
|
||||
height: 0px;
|
||||
left: 8px;
|
||||
right: 8px;
|
||||
background-color: @ui-light-active-border;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
border-radius: 3px 3px 0 0;
|
||||
opacity: 0;
|
||||
transition: all .2s linear;
|
||||
}
|
||||
}
|
||||
|
||||
.umb-sub-views-nav-item > a:active {
|
||||
.box-shadow(~"inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)");
|
||||
}
|
||||
.umb-sub-views-nav-item > a:focus {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.umb-sub-views-nav-item > a:hover,
|
||||
.umb-sub-views-nav-item > a:focus {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.umb-sub-views-nav-item > a.is-active {
|
||||
|
||||
color: @ui-light-active-type;
|
||||
|
||||
&::after {
|
||||
opacity: 1;
|
||||
height: 4px;
|
||||
}
|
||||
}
|
||||
|
||||
.show-validation .umb-sub-views-nav-item > a.-has-error {
|
||||
color: @red;
|
||||
}
|
||||
|
||||
.umb-sub-views-nav-item .icon {
|
||||
font-size: 24px;
|
||||
display: block;
|
||||
text-align: center;
|
||||
margin-bottom: 7px;
|
||||
}
|
||||
|
||||
.umb-sub-views-nav-item .badge {
|
||||
position: absolute;
|
||||
top: 6px;
|
||||
right: 6px;
|
||||
min-width: 16px;
|
||||
color: @white;
|
||||
background-color: @ui-active-type;
|
||||
border: 2px solid @white;
|
||||
border-radius: 50%;
|
||||
font-size: 10px;
|
||||
font-weight: bold;
|
||||
padding: 2px;
|
||||
line-height: 16px;
|
||||
display: block;
|
||||
|
||||
&.-type-alert {
|
||||
background-color: @red;
|
||||
}
|
||||
&.-type-warning {
|
||||
background-color: @yellow-d2;
|
||||
}
|
||||
&:empty {
|
||||
height: 12px;
|
||||
min-width: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
.umb-sub-views-nav-item-text {
|
||||
font-size: 12px;
|
||||
line-height: 1em;
|
||||
}
|
||||
|
||||
|
||||
.umb-sub-views-nav-item__anchor_dropdown {// inherits from .dropdown-menu
|
||||
display: block;
|
||||
margin: 0;
|
||||
overflow: hidden;
|
||||
|
||||
// center align horizontal
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
|
||||
visibility:hidden;
|
||||
opacity: 0;
|
||||
transition: visibility 0s 500ms, opacity 250ms 250ms;
|
||||
}
|
||||
.umb-sub-views-nav-item__anchor_dropdown li a {
|
||||
border-left: 4px solid transparent;
|
||||
}
|
||||
.umb-sub-views-nav-item__anchor_dropdown li.is-active a {
|
||||
border-left-color: @ui-selected-border;
|
||||
}
|
||||
|
||||
.umb-sub-views-nav-item:hover .umb-sub-views-nav-item__anchor_dropdown {
|
||||
visibility:visible;
|
||||
opacity: 1;
|
||||
transition: visibility 0s 0s, opacity 20ms 0s;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// --------------------------------
|
||||
// item__more, appears when there is not enough room for the visible items.
|
||||
// --------------------------------
|
||||
|
||||
.umb-sub-views-nav-item-more__icon {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.umb-sub-views-nav-item-more__icon i {
|
||||
height: 5px;
|
||||
width: 5px;
|
||||
border-radius: 50%;
|
||||
background: @ui-active-type;// fallback if browser doesnt support currentColor
|
||||
background: currentColor;
|
||||
display: inline-block;
|
||||
margin: 0 5px 0 0;
|
||||
}
|
||||
|
||||
.umb-sub-views-nav-item-more__icon i:last-of-type {
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
.umb-sub-views-nav-item-more__dropdown {
|
||||
left: auto;
|
||||
right: 0;
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr 1fr;
|
||||
min-width: auto;
|
||||
margin-top: 10px;
|
||||
}
|
||||
.umb-sub-views-nav-item-more__dropdown > li {
|
||||
display: flex;
|
||||
}
|
||||
.umb-sub-views-nav-item-more__dropdown .umb-sub-views-nav-item:first {
|
||||
border-left: none;
|
||||
}
|
||||
@@ -4,135 +4,3 @@
|
||||
margin: 0;
|
||||
border-left: 1px solid @gray-9;
|
||||
}
|
||||
|
||||
.umb-sub-views-nav-item {
|
||||
text-align: center;
|
||||
cursor: pointer;
|
||||
display: block;
|
||||
padding: 4px 10px 0 10px;
|
||||
//border-bottom: 4px solid transparent;
|
||||
min-width: 70px;
|
||||
border-right: 1px solid @gray-9;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: @editorHeaderHeight;
|
||||
position: relative;
|
||||
|
||||
color: @ui-active-type;
|
||||
|
||||
&:hover {
|
||||
color: @ui-active-type-hover !important;
|
||||
}
|
||||
|
||||
&::after {
|
||||
content: "";
|
||||
height: 0px;
|
||||
left: 8px;
|
||||
right: 8px;
|
||||
background-color: @ui-light-active-border;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
border-radius: 3px 3px 0 0;
|
||||
opacity: 0;
|
||||
transition: all .2s linear;
|
||||
}
|
||||
}
|
||||
|
||||
.umb-sub-views-nav-item:focus {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.umb-sub-views-nav-item:hover,
|
||||
.umb-sub-views-nav-item:focus {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.umb-sub-views-nav-item.is-active {
|
||||
//color: @ui-active;
|
||||
//border-bottom-color: @ui-active;
|
||||
|
||||
//background-color: rgba(@ui-active, 0.25);
|
||||
color: @ui-light-active-type;
|
||||
//border-bottom-color: @ui-active;
|
||||
&::after {
|
||||
opacity: 1;
|
||||
height: 4px;
|
||||
}
|
||||
}
|
||||
|
||||
.show-validation .umb-sub-views-nav-item.-has-error {
|
||||
color: @red;
|
||||
}
|
||||
|
||||
.umb-sub-views-nav-item .icon {
|
||||
font-size: 24px;
|
||||
display: block;
|
||||
text-align: center;
|
||||
margin-bottom: 7px;
|
||||
}
|
||||
|
||||
.umb-sub-views-nav-item .badge {
|
||||
position: absolute;
|
||||
top: 6px;
|
||||
right: 6px;
|
||||
min-width: 16px;
|
||||
color: @white;
|
||||
background-color: @ui-active-type;
|
||||
border: 2px solid @white;
|
||||
border-radius: 50%;
|
||||
font-size: 10px;
|
||||
font-weight: bold;
|
||||
padding: 2px;
|
||||
line-height: 16px;
|
||||
display: block;
|
||||
|
||||
&.-type-alert {
|
||||
background-color: @red;
|
||||
}
|
||||
&.-type-warning {
|
||||
background-color: @yellow-d2;
|
||||
}
|
||||
&:empty {
|
||||
height: 12px;
|
||||
min-width: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
.umb-sub-views-nav-item-text {
|
||||
font-size: 12px;
|
||||
line-height: 1em;
|
||||
}
|
||||
|
||||
.umb-sub-views-nav-item__more {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.umb-sub-views-nav-item__more i {
|
||||
height: 5px;
|
||||
width: 5px;
|
||||
border-radius: 50%;
|
||||
background: @gray-3;
|
||||
display: inline-block;
|
||||
margin: 0 5px 0 0;
|
||||
}
|
||||
|
||||
.umb-sub-views-nav-item__more i:last-of-type {
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
// make dots green the an item is active
|
||||
.umb-sub-views-nav-item.is-active .umb-sub-views-nav-item__more i {
|
||||
background-color: @ui-active;
|
||||
}
|
||||
|
||||
.umb-sub-views-nav__dropdown.umb-sub-views-nav__dropdown {
|
||||
left: auto;
|
||||
right: 0;
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr 1fr;
|
||||
min-width: auto;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
@@ -220,6 +220,7 @@
|
||||
// DROPDOWNS
|
||||
// ---------
|
||||
.dropdown-menu {
|
||||
display: block;
|
||||
border-radius: @dropdownBorderRadius;
|
||||
box-shadow: 0 5px 20px rgba(0,0,0,.3);
|
||||
padding-top: 0;
|
||||
|
||||
@@ -10,7 +10,8 @@
|
||||
page="page"
|
||||
content="content"
|
||||
culture="culture"
|
||||
on-select-app="appChanged(app)">
|
||||
on-select-app="appChanged(app)"
|
||||
on-select-app-anchor="appAnchorChanged(app, anchor)">
|
||||
</umb-variant-content-editors>
|
||||
|
||||
<umb-editor-footer>
|
||||
|
||||
@@ -1,16 +1,15 @@
|
||||
<div>
|
||||
<ng-form name="tabbedContentForm">
|
||||
<div class="umb-expansion-panel" data-element="group-{{group.alias}}" ng-repeat="group in content.tabs track by group.label">
|
||||
<div class="umb-group-panel" retrive-dom-element="registerPropertyGroup(element[0], attributes.appAnchor)" data-app-anchor="{{group.id}}" data-element="group-{{group.alias}}" ng-repeat="group in content.tabs track by group.label">
|
||||
|
||||
<div class="umb-expansion-panel__header" ng-click="group.open = !group.open">
|
||||
<div class="umb-group-panel__header">
|
||||
<div>{{ group.label }}</div>
|
||||
<ins class="umb-expansion-panel__expand" ng-class="{'icon-navigation-down': !group.open, 'icon-navigation-up': group.open}"> </ins>
|
||||
</div>
|
||||
|
||||
<div class="umb-expansion-panel__content" ng-show="group.open">
|
||||
<umb-property
|
||||
data-element="property-{{property.alias}}"
|
||||
ng-repeat="property in group.properties track by property.alias"
|
||||
<div class="umb-group-panel__content">
|
||||
<umb-property
|
||||
data-element="property-{{property.alias}}"
|
||||
ng-repeat="property in group.properties track by property.alias"
|
||||
property="property"
|
||||
show-inherit="content.variants.length > 1 && !property.culture && !activeVariant.language.isDefault"
|
||||
inherits-from="defaultVariant.language.name">
|
||||
|
||||
@@ -13,7 +13,8 @@
|
||||
on-open-split-view="vm.openSplitView(variant)"
|
||||
on-close-split-view="vm.closeSplitView($index)"
|
||||
on-select-variant="vm.selectVariant(variant, $index)"
|
||||
on-select-app="vm.selectApp(app)">
|
||||
on-select-app="vm.selectApp(app)"
|
||||
on-select-app-anchor="vm.selectAppAnchor(app, anchor)">
|
||||
</umb-variant-content>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
<div>
|
||||
<umb-load-indicator
|
||||
<umb-load-indicator
|
||||
ng-if="vm.editor.loading">
|
||||
</umb-load-indicator>
|
||||
|
||||
<div class="umb-split-view__content" ng-show="!vm.editor.loading">
|
||||
|
||||
<ng-form name="contentHeaderForm">
|
||||
<umb-editor-content-header
|
||||
<umb-editor-content-header
|
||||
menu="vm.page.menu"
|
||||
hide-menu="vm.page.hideActionsMenu"
|
||||
name="vm.editor.content.name"
|
||||
name-disabled="vm.nameDisabled"
|
||||
navigation="vm.editor.content.apps"
|
||||
content="vm.editor.content"
|
||||
on-select-navigation-item="vm.selectApp(item)"
|
||||
variants="vm.editor.content.variants"
|
||||
on-select-anchor-item="vm.selectAppAnchor(item, anchor)"
|
||||
open-variants="vm.openVariants"
|
||||
hide-change-variant="vm.page.hideChangeVariant"
|
||||
show-back-button="vm.page.listViewPath !== null"
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
autocomplete="off" />
|
||||
</ng-form>
|
||||
|
||||
<a ng-if="variants.length > 0 && hideChangeVariant !== true" class="umb-variant-switcher__toggle" href="" ng-click="vm.dropdownOpen = !vm.dropdownOpen">
|
||||
<a ng-if="content.variants.length > 0 && hideChangeVariant !== true" class="umb-variant-switcher__toggle" href="" ng-click="vm.dropdownOpen = !vm.dropdownOpen">
|
||||
<span>{{vm.currentVariant.language.name}}</span>
|
||||
<ins class="umb-variant-switcher__expand" ng-class="{'icon-navigation-down': !vm.dropdownOpen, 'icon-navigation-up': vm.dropdownOpen}"> </ins>
|
||||
</a>
|
||||
@@ -39,7 +39,7 @@
|
||||
</span>
|
||||
|
||||
<umb-dropdown ng-if="vm.dropdownOpen" style="width: 100%; max-height: 250px; overflow-y: scroll; margin-top: 5px;" on-close="vm.dropdownOpen = false" umb-keyboard-list>
|
||||
<umb-dropdown-item class="umb-variant-switcher__item" ng-class="{'umb-variant-switcher_item--current': variant.active, 'umb-variant-switcher_item--not-allowed': variantIsOpen(variant.language.culture)}" ng-repeat="variant in variants">
|
||||
<umb-dropdown-item class="umb-variant-switcher__item" ng-class="{'umb-variant-switcher_item--current': variant.active, 'umb-variant-switcher_item--not-allowed': variantIsOpen(variant.language.culture)}" ng-repeat="variant in content.variants">
|
||||
<a href="" class="umb-variant-switcher__name-wrapper" ng-click="selectVariant($event, variant)" prevent-default>
|
||||
<span class="umb-variant-switcher__name" ng-class="{'bold': variant.language.isDefault}">{{variant.language.name}}</span>
|
||||
<umb-variant-state variant="variant" class="umb-variant-switcher__state"></umb-variant-state>
|
||||
@@ -60,11 +60,12 @@
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div ng-if="navigation && splitViewOpen !== true" style="margin-left: 20px;">
|
||||
<div ng-if="content.apps && splitViewOpen !== true" style="margin-left: 20px;">
|
||||
<umb-editor-navigation
|
||||
data-element="editor-sub-views"
|
||||
navigation="navigation"
|
||||
on-select="selectNavigationItem(item)">
|
||||
navigation="content.apps"
|
||||
on-select="selectNavigationItem(item)"
|
||||
on-anchor-select="selectAnchorItem(item, anchor)">
|
||||
</umb-editor-navigation>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
<a data-element="sub-view-{{vm.item.alias}}"
|
||||
tabindex="-1"
|
||||
ng-href=""
|
||||
ng-click="vm.clicked()"
|
||||
hotkey="{{vm.index+1}}"
|
||||
hotkey-when-hidden="true"
|
||||
ng-class="{'is-active': vm.item.active, '-has-error': vm.item.hasError}">
|
||||
<i class="icon {{ vm.item.icon }}"></i>
|
||||
<span class="umb-sub-views-nav-item-text">{{ vm.item.name }}</span>
|
||||
<div ng-show="item.badge" class="badge -type-{{vm.item.badge.type}}">{{vm.item.badge.count}}</div>
|
||||
</a>
|
||||
|
||||
<ul class="dropdown-menu umb-sub-views-nav-item__anchor_dropdown" ng-class="{'show': vm.showDropdown}">
|
||||
<li ng-repeat="anchor in vm.item.anchors" ng-class="{'is-active': vm.item.active && anchor.active}">
|
||||
<a href="" ng-click="vm.anchorClicked(anchor, $event)">
|
||||
{{anchor.label}}
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
@@ -1,46 +1,41 @@
|
||||
<ul class="umb-sub-views-nav" ng-show="showNavigation">
|
||||
|
||||
<li ng-repeat="item in navigation | limitTo: itemsLimit ">
|
||||
<div ng-show="item.alias !== 'more'"
|
||||
ng-class="item.errorClass">
|
||||
<a data-element="sub-view-{{item.alias}}"
|
||||
tabindex="-1"
|
||||
class="umb-sub-views-nav-item js-umb-sub-views-nav-item"
|
||||
href=""
|
||||
ng-click="clickNavigationItem(item, $index)"
|
||||
hotkey="{{$index+1}}"
|
||||
ng-class="{'is-active': item.active, '-has-error': item.hasError}">
|
||||
<i class="icon {{ item.icon }}"></i>
|
||||
<span class="umb-sub-views-nav-item-text">{{ item.name }}</span>
|
||||
<div ng-show="item.badge" class="badge -type-{{item.badge.type}}">{{item.badge.count}}</div>
|
||||
</a>
|
||||
<li ng-repeat="navItem in navigation | limitTo: itemsLimit ">
|
||||
<div ng-show="navItem.alias !== 'more'"
|
||||
ng-class="navItem.errorClass">
|
||||
<umb-editor-navigation-item
|
||||
item="navItem"
|
||||
on-open="openNavigationItem(item)"
|
||||
on-open-anchor="openAnchorItem(item, anchor)"
|
||||
index="{{$index}}">
|
||||
</umb-editor-navigation-item>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li ng-show="showMoreButton" style="position: relative;">
|
||||
|
||||
<a data-element="sub-view-{{moreButton.alias}}"
|
||||
class="umb-sub-views-nav-item"
|
||||
href=""
|
||||
ng-click="toggleDropdown()"
|
||||
ng-class="{'is-active': moreButton.active}">
|
||||
<div class="umb-sub-views-nav-item__more"><i></i><i></i><i></i></div>
|
||||
<span class="umb-sub-views-nav-item-text">{{ moreButton.name }}</span>
|
||||
</a>
|
||||
<div class="umb-sub-views-nav-item umb-sub-views-nav-item-more">
|
||||
|
||||
<umb-dropdown ng-show="showDropdown" on-close="hideDropdown()" class="umb-sub-views-nav__dropdown">
|
||||
<umb-dropdown-item ng-repeat="item in navigation | limitTo: overflowingItems">
|
||||
<a data-element="sub-view-{{item.alias}}"
|
||||
style="display: flex; border: none;"
|
||||
class="umb-sub-views-nav-item"
|
||||
ng-href=""
|
||||
ng-click="clickNavigationItem(item, $index)"
|
||||
ng-class="{'is-active': item.active, '-has-error': item.hasError}">
|
||||
<i class="icon {{ item.icon }}"></i>
|
||||
<span class="umb-sub-views-nav-item-text">{{ item.name }}</span>
|
||||
</a>
|
||||
</umb-dropdown-item>
|
||||
</umb-dropdown>
|
||||
<a data-element="sub-view-{{moreButton.alias}}"
|
||||
href=""
|
||||
ng-click="toggleDropdown()"
|
||||
ng-class="{'is-active': moreButton.active}">
|
||||
<div class="umb-sub-views-nav-item-more__icon"><i></i><i></i><i></i></div>
|
||||
<span class="umb-sub-views-nav-item-text">{{ moreButton.name }}</span>
|
||||
</a>
|
||||
|
||||
<umb-dropdown ng-show="showDropdown" on-close="hideDropdown()" class="umb-sub-views-nav-item-more__dropdown">
|
||||
<umb-dropdown-item ng-repeat="navItem in navigation | limitTo: overflowingItems">
|
||||
<umb-editor-navigation-item
|
||||
item="navItem"
|
||||
on-open="openNavigationItem(item)"
|
||||
on-open-anchor="openAnchorItem(item, anchor)"
|
||||
index="{{$index}}">
|
||||
</umb-editor-navigation-item>
|
||||
</umb-dropdown-item>
|
||||
</umb-dropdown>
|
||||
|
||||
</div>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
<li class="umb-tree-item" data-element="tree-item-{{::node.dataElement}}" ng-class="getNodeCssClass(node)" on-right-click="altSelect(node, $event)">
|
||||
<div class="umb-tree-item__inner" ng-swipe-right="options(node, $event)" ng-dblclick="load(node)" >
|
||||
<ins data-element="tree-item-expand"
|
||||
ng-class="{'icon-navigation-right': !node.expanded || node.metaData.isContainer, 'icon-navigation-down': node.expanded && !node.metaData.isContainer}"
|
||||
ng-style="{'visibility': (scope.enablelistviewexpand === 'true' || node.hasChildren && (!node.metaData.isContainer || isDialog)) ? 'visible' : 'hidden'}"
|
||||
ng-click="load(node)"> </ins>
|
||||
ng-class="{'icon-navigation-right': !node.expanded || node.metaData.isContainer, 'icon-navigation-down': node.expanded && !node.metaData.isContainer}"
|
||||
ng-style="{'visibility': (scope.enablelistviewexpand === 'true' || node.hasChildren && (!node.metaData.isContainer || isDialog)) ? 'visible' : 'hidden'}"
|
||||
ng-click="load(node)"> </ins>
|
||||
|
||||
<i class="icon umb-tree-icon sprTree" ng-class="::node.cssClass" title="{{::node.routePath}}" ng-click="select(node, $event)" ng-style="::node.style"></i>
|
||||
<span class="umb-tree-item__annotation"></span>
|
||||
<a class="umb-tree-item__label" ng-href="#/{{::node.routePath}}" ng-click="select(node, $event)">{{node.name}}</a>
|
||||
|
||||
<!-- NOTE: These are the 'option' elipses -->
|
||||
|
||||
@@ -1 +1 @@
|
||||
<ul class="dropdown-menu db" on-outside-click="close()" ng-transclude></ul>
|
||||
<ul class="dropdown-menu" on-outside-click="close()" ng-transclude></ul>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
class="umb-layout-selector__dropdown shadow-depth-3 animated -half-second fadeIn"
|
||||
on-outside-click="vm.closeLayoutDropdown()">
|
||||
|
||||
<div ng-repeat="layout in vm.layouts | filter:{selected:true} track by layout.name"
|
||||
<div ng-repeat="layout in vm.layouts | filter:{selected:true} track by $id(layout)"
|
||||
class="umb-layout-selector__dropdown-item"
|
||||
ng-click="vm.pickLayout(layout)"
|
||||
ng-class="{'-active': layout.active }"
|
||||
|
||||
@@ -194,7 +194,7 @@ function mediaEditController($scope, $routeParams, $q, appState, mediaResource,
|
||||
|
||||
contentEditingHelper.handleSaveError({
|
||||
err: err,
|
||||
redirectOnError: !infiniteMode,
|
||||
redirectOnFailure: !infiniteMode,
|
||||
rebindCallback: contentEditingHelper.reBindChangedProperties($scope.content, err.data)
|
||||
});
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.CheckboxListContro
|
||||
return f.checked;
|
||||
}),
|
||||
function(m) {
|
||||
return m.key;
|
||||
return m.value;
|
||||
});
|
||||
//get all of the same values between the arrays
|
||||
var same = _.intersection($scope.model.value, selectedVals);
|
||||
@@ -66,13 +66,13 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.CheckboxListContro
|
||||
function changed(item) {
|
||||
var index = _.findIndex($scope.model.value,
|
||||
function (v) {
|
||||
return v === item.key;
|
||||
return v === item.value;
|
||||
});
|
||||
|
||||
if (item.checked) {
|
||||
//if it doesn't exist in the model, then add it
|
||||
if (index < 0) {
|
||||
$scope.model.value.push(item.val);
|
||||
$scope.model.value.push(item.value);
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<li ng-repeat="item in selectedItems track by item.key">
|
||||
<label class="checkbox">
|
||||
<input type="checkbox" name="checkboxlist"
|
||||
value="{{item.key}}"
|
||||
value="{{item.value}}"
|
||||
ng-model="item.checked"
|
||||
ng-change="changed(item)"
|
||||
ng-required="model.validation.mandatory && !model.value.length" />
|
||||
|
||||
@@ -105,6 +105,10 @@ function contentPickerController($scope, entityResource, editorState, iconHelper
|
||||
};
|
||||
|
||||
if ($scope.model.config) {
|
||||
//special case, if the `startNode` is falsy on the server config delete it entirely so the default value is merged in
|
||||
if (!$scope.model.config.startNode) {
|
||||
delete $scope.model.config.startNode;
|
||||
}
|
||||
//merge the server config on top of the default config, then set the server config to use the result
|
||||
$scope.model.config = angular.extend(defaultConfig, $scope.model.config);
|
||||
}
|
||||
|
||||
@@ -59,13 +59,10 @@
|
||||
}
|
||||
];
|
||||
|
||||
vm.activeLayout = {
|
||||
"icon": "icon-thumbnails-small",
|
||||
"path": "1",
|
||||
"selected": true
|
||||
};
|
||||
// Set card layout to active by default
|
||||
vm.activeLayout = vm.layouts[0];
|
||||
|
||||
//don't show the invite button if no email is configured
|
||||
// Don't show the invite button if no email is configured
|
||||
if (Umbraco.Sys.ServerVariables.umbracoSettings.showUserInvite) {
|
||||
vm.defaultButton = {
|
||||
labelKey: "user_inviteUser",
|
||||
|
||||
@@ -23,21 +23,20 @@
|
||||
ng-if="vm.layouts"
|
||||
layouts="vm.layouts"
|
||||
active-layout="vm.activeLayout"
|
||||
on-layout-select="vm.selectLayout">
|
||||
on-layout-select="vm.selectLayout(layout)">
|
||||
</umb-layout-selector>
|
||||
</umb-editor-sub-header-section>
|
||||
<umb-editor-sub-header-section>
|
||||
<div class="form-search -no-margin-bottom pull-right">
|
||||
<div class="inner-addon left-addon">
|
||||
<i class="icon icon-search"></i>
|
||||
<input
|
||||
class="form-control search-input"
|
||||
type="text" localize="placeholder"
|
||||
placeholder="@general_typeToSearch"
|
||||
ng-model="vm.usersOptions.filter"
|
||||
ng-change="vm.searchUsers()"
|
||||
prevent-enter-submit
|
||||
no-dirty-check>
|
||||
<input class="form-control search-input"
|
||||
type="text" localize="placeholder"
|
||||
placeholder="@general_typeToSearch"
|
||||
ng-model="vm.usersOptions.filter"
|
||||
ng-change="vm.searchUsers()"
|
||||
prevent-enter-submit
|
||||
no-dirty-check>
|
||||
</div>
|
||||
</div>
|
||||
</umb-editor-sub-header-section>
|
||||
@@ -229,7 +228,7 @@
|
||||
<!-- Layout: Table -->
|
||||
<div ng-if="vm.activeLayout.path === '2'">
|
||||
|
||||
<table class="table table-hover">
|
||||
<table class="table table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="padding-left: 10px; width: 10px;">
|
||||
|
||||
Reference in New Issue
Block a user