Compare commits

...

128 Commits

Author SHA1 Message Date
Mads Rasmussen 244ee646b9 Revert "update content when changing variation"
This reverts commit b487436d93.
2016-04-07 12:45:33 +02:00
Mads Rasmussen b487436d93 update content when changing variation 2016-04-07 12:38:05 +02:00
Mads Rasmussen 321b1a3964 disable autocomplete on editor name input 2016-04-07 11:17:05 +02:00
Mads Rasmussen f6b1971243 disable name input for a marketing variation 2016-04-07 11:05:21 +02:00
Simon Busborg ab1e412b4b Active in quickswitcher 2016-04-07 10:51:39 +02:00
Mads Rasmussen 2c866e8326 add spanish 2016-04-07 10:24:52 +02:00
Mads Rasmussen 433563c10b select first variation 2016-04-06 20:03:49 +02:00
Mads Rasmussen 95b91cb55f a bit fine tuning of selected variation and language 2016-04-06 19:29:29 +02:00
Mads Rasmussen d070b869a3 fix error in css 2016-04-06 16:09:26 +02:00
Mads Rasmussen 82bcb8bb8a Merge branch 'temp-maurice' of https://github.com/umbraco/Umbraco-CMS into temp-maurice 2016-04-06 16:07:49 +02:00
Mads Rasmussen 8cbd0281aa set limit on apps 2016-04-06 16:07:12 +02:00
Simon Busborg 148067f119 apps 2016-04-06 16:01:16 +02:00
Mads Rasmussen 9d79577833 add activity app 2016-04-06 15:05:16 +02:00
Simon Busborg c24918aeb7 standard width on apps 2016-04-06 14:15:10 +02:00
Simon Busborg f7a814714c even spacing between apps 2016-04-06 11:36:34 +02:00
Simon Busborg 3200a7fd1a Splitview close 2016-04-06 11:23:38 +02:00
Mads Rasmussen 7983aedf53 make tabs to apps 2016-04-06 11:22:18 +02:00
Mads Rasmussen c31efa3f54 only show variations for active language + add sortable on variations 2016-04-05 15:16:55 +02:00
Simon Busborg c98a98dd71 Tabs 2016-04-05 15:07:35 +02:00
Mads Rasmussen ee3965521d bring back old tabs markup to enable active state 2016-04-05 14:34:57 +02:00
Mads Rasmussen 3d90c0d3d7 add segments to create variation + fix edit variation 2016-04-05 12:31:00 +02:00
Mads Rasmussen bc60aa1688 remove analytics from content plugins 2016-04-05 11:46:08 +02:00
Mads Rasmussen 5c90043298 hide the split view divider when there is no split view open 2016-04-05 11:44:16 +02:00
Mads Rasmussen 0f784151cb close split view on route change 2016-04-05 09:47:58 +02:00
Mads Rasmussen 681512da8c Merge branch 'temp-maurice' of https://github.com/umbraco/Umbraco-CMS into temp-maurice 2016-04-04 19:04:53 +02:00
Mads Rasmussen b17770d6c7 fake split views 2016-04-04 19:04:36 +02:00
Simon Busborg 745b536f63 Fixed divider 2016-04-04 12:55:08 +02:00
Mads Rasmussen 738289cd78 comment out sync switcher and property overlay 2016-04-01 11:19:13 +02:00
Simon Busborg 77d30e8484 fixed colors 2016-03-30 15:02:53 +02:00
Simon Busborg 347fb3a90d demoed version of splitview (not pretty) 2016-03-30 12:24:01 +02:00
Mads Rasmussen 39bdc1bc78 handle 1sites with 1 language 2016-03-30 09:04:26 +02:00
Simon Busborg a3dcdb159b Removed tags, added tags checkboxes, styling in general for variations 2016-03-29 15:38:50 +02:00
Simon Busborg 9656659ecd overview 2016-03-29 13:46:11 +02:00
Mads Rasmussen d679a4e697 make it possible to fake variation content 2016-03-29 12:18:47 +02:00
Mads Rasmussen c81a034c69 only show variations toggle if there are any variations 2016-03-23 14:23:02 +01:00
Mads Rasmussen a519d38b54 Merge branch 'temp-maurice' of https://github.com/umbraco/Umbraco-CMS into temp-maurice 2016-03-23 14:13:10 +01:00
Mads Rasmussen cf4c09f41f When click on item in variation quick switcher - change context in header 2016-03-23 14:12:57 +01:00
Simon Busborg bd3096c3ec changed quick toggler 2016-03-23 13:49:07 +01:00
Simon Busborg 1bbf104b9f variations overview 2016-03-23 13:41:26 +01:00
Mads Rasmussen 4f1e44d42e get variations from helper service so they are in sync 2016-03-23 13:39:26 +01:00
Simon Busborg fa68a9472b quickswitcher update 2016-03-23 11:54:54 +01:00
Mads Rasmussen efb2b744fc Merge branch 'temp-maurice' of https://github.com/umbraco/Umbraco-CMS into temp-maurice 2016-03-23 11:52:26 +01:00
Mads Rasmussen 9018c4ef79 add functionality to create, edit and delete variations - missing styling + segments 2016-03-23 11:52:04 +01:00
Simon Busborg dfce0aa0cb changed width of container 2016-03-23 08:59:52 +01:00
Mads Rasmussen 131c9a6fe1 move description inline 2016-03-22 16:24:18 +01:00
Mads Rasmussen 555589ef3b change colour on tags + bring back create variation link 2016-03-22 15:10:46 +01:00
Mads Rasmussen b099d35981 Merge branch 'temp-maurice' of https://github.com/umbraco/Umbraco-CMS into temp-maurice
# Conflicts:
#	src/Umbraco.Web.UI.Client/src/less/components/umb-variations.less
#	src/Umbraco.Web.UI.Client/src/views/components/umb-variations.html
2016-03-22 14:24:03 +01:00
Mads Rasmussen e3bc3091f7 add dynamic data to variations overview + clean up UI + add segments to variations overview 2016-03-22 14:17:20 +01:00
Simon Busborg 320ed93b14 active quick switcher 2016-03-22 13:50:39 +01:00
Simon Busborg c71ce7ef2a changed lang options 2016-03-22 10:59:12 +01:00
Mads Rasmussen c0ea46c9f1 split languages and variations in dropdown. Show selected in header 2016-03-22 10:55:33 +01:00
Mads Rasmussen 533443fd25 remove sidebar on variations 2016-03-22 10:47:00 +01:00
Simon Busborg e76658373f Added lang groups for variations 2016-03-22 10:13:05 +01:00
Mads Rasmussen a77330a592 add a bit a variations toggle styling 2016-03-21 10:39:48 +01:00
Mads Rasmussen 2f5e9ee8c4 change sync off label + smaller font size 2016-03-21 10:01:36 +01:00
Mads Rasmussen f252590a1c Merge branch 'temp-maurice' of https://github.com/umbraco/Umbraco-CMS into temp-maurice 2016-03-18 14:40:23 +01:00
Mads Rasmussen fa4bdac78a style editor overlay label 2016-03-18 14:39:18 +01:00
Simon Busborg e268945077 fixed animate bug 2016-03-18 14:38:04 +01:00
Simon Busborg b428fb2211 fixed search / scrollable area 2016-03-18 14:26:24 +01:00
Mads Rasmussen bfc098e5e0 make change variation work work editor view 2016-03-18 14:09:07 +01:00
Simon Busborg d9b58e80fe added search to variations 2016-03-18 12:40:16 +01:00
Simon Busborg a7a860bbcd fixed dropdown 2016-03-18 12:03:05 +01:00
Mads Rasmussen fa277a4a5d fix styling on dropdown 2016-03-18 11:58:57 +01:00
Mads Rasmussen 7e1df76db3 move dropdown logic 2016-03-18 11:26:46 +01:00
Simon Busborg 9c33e292ae moved component to label 2016-03-18 11:13:49 +01:00
Mads Rasmussen 75edd645c6 add basic functionality to edit content and change which variation to sync content from 2016-03-17 21:31:09 +01:00
Mads Rasmussen 6adfdbf7dd clear variations when a new master i set 2016-03-17 20:30:29 +01:00
Mads Rasmussen 5453d86a46 make sidebar title a little smaller 2016-03-17 20:09:58 +01:00
Mads Rasmussen 6d4146b9c6 add wrappers and title to sidebar 2016-03-17 20:07:57 +01:00
Simon Busborg a93d98933f fixed z-index on buttons 2016-03-17 15:20:34 +01:00
Mads Rasmussen cf28c0ca5e change text and icon on sync toggle 2016-03-17 15:12:56 +01:00
Mads Rasmussen 435434b859 position toggle top 0 and right 0 2016-03-17 15:10:07 +01:00
Mads Rasmussen e93b057a5f make sync button a bit smaller 2016-03-17 15:02:38 +01:00
Simon Busborg e8d167faf0 added get content 2016-03-17 14:42:26 +01:00
Mads Rasmussen ab1322f789 started on dropdown 2016-03-17 12:39:40 +01:00
Simon Busborg 36abb83ff2 moved psuedo element to the property editor markup 2016-03-17 11:54:01 +01:00
Simon Busborg 0d62e62fda changed inactive state 2016-03-17 11:41:38 +01:00
Simon Busborg d25a01d9c9 added overlay to variation picker 2016-03-17 11:22:52 +01:00
Simon Busborg 1da55e4dde Fixed subview editor header 2016-03-17 10:46:08 +01:00
Simon Busborg c346ec1282 search width 2016-03-14 11:06:03 +01:00
Simon Busborg 556d4b4c11 search 2016-03-11 14:07:05 +01:00
Mads Rasmussen 7d0d58f7c2 fix notifications width 2016-03-11 13:53:50 +01:00
Mads Rasmussen a0618f401f Merge remote-tracking branch 'origin/temp-maurice' into temp-maurice 2016-03-11 13:19:48 +01:00
Mads Rasmussen 34645460fb Set position relative to contain absolute elements 2016-03-11 13:19:15 +01:00
Simon Busborg 43b534c3b1 tabs activity 2016-03-11 10:57:44 +01:00
Mads Rasmussen bc29b2e235 copy search functionality to top bar 2016-03-11 10:52:45 +01:00
Simon Busborg d6c226d41a Added navigation to sidebars 2016-03-10 15:29:41 +01:00
Simon Busborg 14d8b634b5 Acitvity feed 2016-03-10 12:45:08 +01:00
Mads Rasmussen c4e41c1df6 add a content wrapper to add padding 2016-03-10 12:20:46 +01:00
Mads Rasmussen 788efeb098 remove horizontal scrollbar in media folders 2016-03-10 11:57:00 +01:00
Mads Rasmussen 71916af49c hide generic properties tab content 2016-03-10 11:56:31 +01:00
Mads Rasmussen 55e62c01e4 hide tab instead of removing it.. now we can save again 2016-03-10 11:43:53 +01:00
Mads Rasmussen fa8dc5ace4 remove console.logs 2016-03-10 11:22:08 +01:00
Simon Busborg 671d99f455 changed menu state 2016-03-10 11:09:51 +01:00
Mads Rasmussen d681a84800 Merge branch 'temp-maurice' of https://github.com/umbraco/Umbraco-CMS into temp-maurice 2016-03-10 10:59:07 +01:00
Mads Rasmussen 440e2a7d56 bring back dashboards 2016-03-10 10:58:45 +01:00
Simon Busborg 2f8ec7bd29 Added more and added sidebar navigation status 2016-03-10 10:58:07 +01:00
Simon Busborg 5105cf890d displaying apps center 2016-03-10 10:04:32 +01:00
Mads Rasmussen 88a0f21328 align sub view header content left and right 2016-03-10 09:58:52 +01:00
Mads Rasmussen cd1ea78825 contain absolute positioned elements inside content 2016-03-10 09:33:57 +01:00
Simon Busborg ca4ff98c5f navigation fluf 2016-03-10 09:18:26 +01:00
Mads Rasmussen 339e1dc94e WIP bring in variation ideas + a couple of placeholder subviews 2016-03-10 09:16:37 +01:00
Mads Rasmussen a84c6e9dff remove generic properties tab 2016-03-10 09:15:29 +01:00
Simon Busborg ba927d1962 fixed tree navigation 2016-03-09 20:40:34 +01:00
Simon Busborg ee30f10357 Dropdown 2016-03-09 20:21:14 +01:00
Simon Busborg 478fe51651 Added tree toggler 2016-03-09 15:21:43 +01:00
Mads Rasmussen 5694beafef add subviews to content 2016-03-08 14:49:04 +01:00
Mads Rasmussen 2a1e9e30ae add generic properties icon 2016-03-07 10:01:33 +01:00
Mads Rasmussen ef5bf29b07 remove background color on footer - wireframe style 2016-03-07 09:58:42 +01:00
Mads Rasmussen 7b521e6857 um tree nav - set overflow to auto 2016-03-07 09:51:35 +01:00
Mads Rasmussen 4135e30834 add tabs to media 2016-03-05 14:03:16 +01:00
Mads Rasmussen 2b1bf0b966 add scroll to tree 2016-03-04 18:42:06 +01:00
Mads Rasmussen 6bc2ce19f5 hide search in tree 2016-03-04 18:13:21 +01:00
Mads Rasmussen 67efc1906a add editor toolbar directive - move tabs outside header for content section 2016-03-04 18:12:53 +01:00
Mads Rasmussen 8b62d09e64 remove background from editor header - wireframe look 2016-03-04 18:09:34 +01:00
Mads Rasmussen 5c6bbfb423 remove background + add border to navigation bar - wireframe look 2016-03-04 18:09:04 +01:00
Mads Rasmussen 97ff32245d fix navigation height 2016-03-04 14:43:56 +01:00
Simon Busborg b7549ad644 Fixed second header 🌮 2016-03-04 11:31:56 +01:00
Mads Rasmussen 802fe45614 Merge branch 'temp-maurice' of https://github.com/umbraco/Umbraco-CMS into temp-maurice 2016-03-04 11:05:06 +01:00
Mads Rasmussen 253a4520b0 tighten up tree a bit 2016-03-04 11:04:41 +01:00
Simon Busborg b6877dc4ce fixed header size 2016-03-04 11:03:50 +01:00
Simon Busborg 27a031ea12 Updated recess – fixed content scroll 2016-03-04 10:59:19 +01:00
Mads Rasmussen 0e2212bd40 less padding and smaller font size on top navigation 2016-03-04 10:34:18 +01:00
Simon Busborg 8ee414793f flex - content 2016-03-04 10:26:33 +01:00
Simon Busborg 1dddc06ae7 added tree 🌳 2016-03-03 16:12:07 +01:00
Simon Busborg 3d253b79e4 Added very slick navigation 🔥 2016-03-03 14:26:37 +01:00
Mads Rasmussen e7542bc455 add functionality to top bar navigation - needs styling 2016-03-03 12:56:38 +01:00
Simon Busborg 43ab5a8e2e Nuked interface 2016-03-03 10:38:01 +01:00
78 changed files with 3410 additions and 498 deletions
+7 -7
View File
@@ -1,5 +1,5 @@
{
"env": {
"env": {
"browser": true
},
@@ -8,7 +8,7 @@
],
"rules": {
"eqeqeq": 2,
"eqeqeq": 2,
"curly": 2,
"no-unused-vars": 1,
@@ -18,8 +18,8 @@
"dot-notation": 1,
"no-use-before-define": 0,
"angular/ng_controller_as": 1,
"angular/ng_controller_as_vm": 1,
"angular/ng_controller_as": 1,
"angular/ng_controller_as_vm": 1,
"strict": 0,
@@ -32,8 +32,8 @@
"comma-spacing": 0,
"no-trailing-spaces": 0,
"eol-last": 0,
"no-underscore-dangle": 0,
"camelcase": 0
"no-underscore-dangle": 0,
"camelcase": 0
},
"globals": {
@@ -50,4 +50,4 @@
"Bloodhound", false
}
}
}
+1 -1
View File
@@ -37,7 +37,7 @@
"grunt-ngdocs": "~0.1.2",
"grunt-open": "~0.2.0",
"grunt-postcss": "~0.6.0",
"grunt-recess": "~0.3",
"grunt-recess": "~1.0.1",
"karma": "~0.9",
"karma-chrome-launcher": "0.0.2",
"karma-coffee-preprocessor": "0.0.1",
@@ -3,11 +3,93 @@
* @name umbraco.directives.directive:umbNavigation
* @restrict E
**/
function umbNavigationDirective() {
function umbNavigationDirective(appState, $location) {
return {
restrict: "E", // restrict to an element
replace: true, // replace the html element with the template
templateUrl: 'views/components/application/umb-navigation.html'
templateUrl: 'views/components/application/umb-navigation.html',
link: function (scope, element, attr, ctrl) {
scope.showTreeNavigation = appState.getGlobalState("showNavigation");
scope.searchClick = function() {
scope.searchOverlay = {
view: "search",
show: true,
submit: function(model) {
$location.path(model.selectedItem.editorPath);
scope.searchOverlay.show = false;
scope.searchOverlay = null;
},
close: function(oldModel) {
scope.searchOverlay.show = false;
scope.searchOverlay = null;
}
};
};
scope.avatarClick = function(){
if(scope.helpDialog) {
closeHelpDialog();
}
if(!scope.userDialog) {
scope.userDialog = {
view: "user",
show: true,
close: function(oldModel) {
closeUserDialog();
}
};
} else {
closeUserDialog();
}
};
function closeUserDialog() {
scope.userDialog.show = false;
scope.userDialog = null;
}
scope.helpClick = function(){
if(scope.userDialog) {
closeUserDialog();
}
if(!scope.helpDialog) {
scope.helpDialog = {
view: "help",
show: true,
close: function(oldModel) {
closeHelpDialog();
}
};
} else {
closeHelpDialog();
}
};
function closeHelpDialog() {
scope.helpDialog.show = false;
scope.helpDialog = null;
}
scope.showTree = function () {
scope.showTreeNavigation = appState.getGlobalState("showNavigation");
if(scope.showTreeNavigation === true) {
appState.setGlobalState("showNavigation", false);
} else {
appState.setGlobalState("showNavigation", true);
}
};
}
};
}
@@ -11,7 +11,7 @@ function sectionsDirective($timeout, $window, navigationService, treeService, se
link: function (scope, element, attr, ctrl) {
//setup scope vars
scope.maxSections = 7;
scope.maxSections = 5;
scope.overflowingSections = 0;
scope.sections = [];
scope.currentSection = appState.getSectionState("currentSection");
@@ -34,16 +34,25 @@ function sectionsDirective($timeout, $window, navigationService, treeService, se
sectionResource.getSections()
.then(function (result) {
scope.sections = result;
calculateHeight();
// hide overflowing sections
scope.totalSections = scope.sections.length;
if(scope.totalSections > scope.maxSections){
scope.needTray = true;
scope.overflowingSections = scope.maxSections - scope.totalSections;
}
// calculateHeight();
});
}
function calculateHeight(){
$timeout(function(){
//total height minus room for avatar and help icon
var height = $(window).height()-200;
var height = $(window).width();
scope.totalSections = scope.sections.length;
scope.maxSections = Math.floor(height / 70);
scope.maxSections = Math.floor(width / 70);
scope.needTray = false;
if(scope.totalSections > scope.maxSections){
@@ -84,57 +93,7 @@ function sectionsDirective($timeout, $window, navigationService, treeService, se
});
//on page resize
window.onresize = calculateHeight;
scope.avatarClick = function(){
if(scope.helpDialog) {
closeHelpDialog();
}
if(!scope.userDialog) {
scope.userDialog = {
view: "user",
show: true,
close: function(oldModel) {
closeUserDialog();
}
};
} else {
closeUserDialog();
}
};
function closeUserDialog() {
scope.userDialog.show = false;
scope.userDialog = null;
}
scope.helpClick = function(){
if(scope.userDialog) {
closeUserDialog();
}
if(!scope.helpDialog) {
scope.helpDialog = {
view: "help",
show: true,
close: function(oldModel) {
closeHelpDialog();
}
};
} else {
closeHelpDialog();
}
};
function closeHelpDialog() {
scope.helpDialog.show = false;
scope.helpDialog = null;
}
// window.onresize = calculateHeight;
scope.sectionClick = function (event, section) {
@@ -0,0 +1,30 @@
(function() {
'use strict';
function TreeNavigation(appState) {
function link(scope, el, attr, ctrl) {
scope.showTreeNavigation = false;
scope.currentSection = appState.getSectionState("currentSection");
scope.$watch(function(){
return appState.getGlobalState("showNavigation");
}, function (newValue) {
scope.showTreeNavigation = newValue;
});
}
var directive = {
restrict: 'E',
replace: true,
templateUrl: 'views/components/application/umb-tree-navigation.html',
link: link
};
return directive;
}
angular.module('umbraco.directives').directive('umbTreeNavigation', TreeNavigation);
})();
@@ -0,0 +1,18 @@
(function() {
'use strict';
function EditorSubView() {
var directive = {
transclude: true,
restrict: 'E',
replace: true,
templateUrl: 'views/components/editor/subview/umb-editor-sub-view.html'
};
return directive;
}
angular.module('umbraco.directives').directive('umbEditorSubView', EditorSubView);
})();
@@ -0,0 +1,18 @@
(function() {
'use strict';
function EditorSubViewContainer() {
var directive = {
transclude: true,
restrict: 'E',
replace: true,
templateUrl: 'views/components/editor/subview/umb-editor-sub-view-container.html'
};
return directive;
}
angular.module('umbraco.directives').directive('umbEditorSubViewContainer', EditorSubViewContainer);
})();
@@ -0,0 +1,18 @@
(function() {
'use strict';
function EditorSubViewContent() {
var directive = {
transclude: true,
restrict: 'E',
replace: true,
templateUrl: 'views/components/editor/subview/umb-editor-sub-view-content.html'
};
return directive;
}
angular.module('umbraco.directives').directive('umbEditorSubViewContent', EditorSubViewContent);
})();
@@ -0,0 +1,18 @@
(function() {
'use strict';
function EditorSubViewHeader() {
var directive = {
transclude: true,
restrict: 'E',
replace: true,
templateUrl: 'views/components/editor/subview/umb-editor-sub-view-header.html'
};
return directive;
}
angular.module('umbraco.directives').directive('umbEditorSubViewHeader', EditorSubViewHeader);
})();
@@ -0,0 +1,18 @@
(function() {
'use strict';
function EditorSubViewSidebar() {
var directive = {
transclude: true,
restrict: 'E',
replace: true,
templateUrl: 'views/components/editor/subview/umb-editor-sub-view-sidebar.html'
};
return directive;
}
angular.module('umbraco.directives').directive('umbEditorSubViewSidebar', EditorSubViewSidebar);
})();
@@ -1,10 +1,25 @@
(function() {
'use strict';
function EditorHeaderDirective(iconHelper) {
function EditorHeaderDirective(iconHelper, variationsHelper) {
function link(scope, el, attr, ctrl) {
scope.showVariationsQuickSwitchToggle = false;
scope.showVariationsQuickSwitch = false;
function activate() {
showVariationsQuickSwitch(scope.variations);
}
function showVariationsQuickSwitch(variations) {
if(variations && variations.length > 1 || variations && variations.length === 1 && variations[0].variations && variations[0].variations.length > 0) {
scope.showVariationsQuickSwitchToggle = true;
} else {
scope.showVariationsQuickSwitchToggle = false;
}
}
scope.openIconPicker = function() {
scope.dialogModel = {
view: "iconpicker",
@@ -24,6 +39,62 @@
}
};
};
scope.toggleVariationsQuickSwitch = function() {
scope.showVariationsQuickSwitch = !scope.showVariationsQuickSwitch;
};
scope.hideVariationsQuickSwitch = function() {
scope.showVariationsQuickSwitch = false;
};
scope.toggleSubItems = function(item, $event) {
item.showSubItems = !item.showSubItems;
$event.preventDefault();
$event.stopPropagation();
};
scope.selectItem = function(item) {
if(scope.onSelectItem) {
for(var i = 0; i < scope.variations.length; i++) {
var language = scope.variations[i];
language.active = false;
if(language.variations && language.variations.length > 0) {
for(var variationIndex = 0; variationIndex < language.variations.length; variationIndex++) {
var variation = language.variations[variationIndex];
variation.active = false;
}
}
}
// set selected item to active
item.active = true;
scope.onSelectItem(item);
scope.showVariationsQuickSwitch = false;
}
};
scope.openInSplitView = function(item, $event) {
if(scope.onOpenInSplitView) {
scope.onOpenInSplitView(item);
scope.showVariationsQuickSwitch = false;
$event.preventDefault();
$event.stopPropagation();
}
};
scope.$watch('variations', function(newValue, oldValue){
showVariationsQuickSwitch(newValue);
}, true);
activate();
}
var directive = {
@@ -37,6 +108,11 @@
actions: "=",
name: "=",
nameLocked: "=",
variation: "=",
language: "=",
variations: "=",
onSelectItem: "=",
onOpenInSplitView: "=",
menu: "=",
icon: "=",
hideIcon: "@",
@@ -6,10 +6,21 @@
function link(scope, el, attr, ctrl) {
scope.showNavigation = true;
scope.showDropdown = false;
scope.maxNavigationItems = 5;
scope.overflowingNavigationsItems = 0;
scope.needDropdown = false;
scope.clickNavigationItem = function(selectedItem) {
setItemToActive(selectedItem);
runItemAction(selectedItem);
if(scope.showDropdown) {
scope.closeDropdown();
}
};
function runItemAction(selectedItem) {
@@ -40,8 +51,29 @@
scope.showNavigation = false;
}
hideOverflowingNavigationItems();
}
function hideOverflowingNavigationItems() {
scope.totalNavigationItems = scope.navigation.length;
if(scope.totalNavigationItems > scope.maxNavigationItems){
scope.needDropdown = true;
scope.overflowingNavigationsItems = scope.maxNavigationItems - scope.totalNavigationItems;
}
}
scope.toggleDropdown = function() {
scope.showDropdown = !scope.showDropdown;
};
scope.closeDropdown = function() {
scope.showDropdown = false;
};
activate();
}
@@ -3,32 +3,6 @@
function EditorSubViewsDirective() {
function link(scope, el, attr, ctrl) {
scope.activeView = {};
// set toolbar from selected navigation item
function setActiveView(items) {
for (var index = 0; index < items.length; index++) {
var item = items[index];
if (item.active && item.view) {
scope.activeView = item;
}
}
}
// watch for navigation changes
scope.$watch('subViews', function(newValue, oldValue) {
if (newValue) {
setActiveView(newValue);
}
}, true);
}
var directive = {
restrict: 'E',
replace: true,
@@ -36,8 +10,7 @@
scope: {
subViews: "=",
model: "="
},
link: link
}
};
return directive;
@@ -0,0 +1,19 @@
(function() {
'use strict';
function EditorToolbar() {
var directive = {
restrict: 'E',
replace: true,
transclude: true,
templateUrl: 'views/components/editor/umb-editor-toolbar.html'
};
return directive;
}
angular.module('umbraco.directives').directive('umbEditorToolbar', EditorToolbar);
})();
@@ -11,22 +11,88 @@ angular.module("umbraco.directives")
},
transclude: true,
restrict: 'E',
replace: true,
replace: true,
templateUrl: 'views/components/property/umb-property.html',
link: function(scope) {
scope.propertyAlias = Umbraco.Sys.ServerVariables.isDebuggingEnabled === true ? scope.property.alias : null;
scope.showDropdown = false;
scope.selectedVariation = {};
scope.variations = [
{
name: "Danish",
master: true,
selected: true
},
{
name: "German"
},
{
name: "Spanish"
},
{
name: "Finnish"
},
{
name: "Albanian"
},
{
name: "Russian"
},
{
name: "Norwegian"
},
{
name: "Swedish"
}
];
function activate() {
for(var i = 0; i < scope.variations.length; i++ ) {
var variation = scope.variations[i];
if(variation.selected) {
scope.property.variation = variation;
}
}
}
scope.toggleDropdown = function() {
scope.showDropdown = !scope.showDropdown;
};
scope.closeDropdown = function() {
scope.showDropdown = false;
};
scope.editContent = function() {
scope.property.variation = null;
scope.showDropdown = false;
};
scope.syncContent = function(selectedVariation) {
for(var i = 0; i < scope.variations.length; i++ ) {
var variation = scope.variations[i];
variation.selected = false;
}
selectedVariation.selected = true;
scope.property.variation = selectedVariation;
scope.showDropdown = false;
};
activate();
},
//Define a controller for this directive to expose APIs to other directives
controller: function ($scope, $timeout) {
var self = this;
//set the API properties/methods
self.property = $scope.property;
self.setPropertyError = function(errorMsg) {
$scope.property.propertyErrorMessage = errorMsg;
};
}
};
});
});
@@ -1,7 +1,7 @@
/**
* @ngdoc directive
* @function
* @name umbraco.directives.directive:umbPropertyEditor
* @name umbraco.directives.directive:umbPropertyEditor
* @requires formController
* @restrict E
**/
@@ -14,10 +14,10 @@ var _umbPropertyEditor = function (umbPropEditorHelper) {
isPreValue: "@",
preview: "@"
},
require: "^form",
restrict: 'E',
replace: true,
replace: true,
templateUrl: 'views/components/property/umb-property-editor.html',
link: function (scope, element, attrs, ctrl) {
@@ -33,6 +33,7 @@ var _umbPropertyEditor = function (umbPropEditorHelper) {
scope.$watch("model.view", function(val){
scope.propertyEditorView = umbPropEditorHelper.getViewPath(scope.model.view, scope.isPreValue);
});
}
};
};
@@ -13,7 +13,7 @@
el.find("a:first").tab('show');
//enable the tab drop
el.tabdrop();
//el.tabdrop();
});
@@ -29,7 +29,7 @@
scope.$on('$destroy', function () {
//ensure to destroy tabdrop (unbinds window resize listeners)
el.tabdrop("destroy");
//el.tabdrop("destroy");
unbindModelWatch();
@@ -0,0 +1,112 @@
(function() {
'use strict';
function Variations(iconHelper) {
function link(scope, el, attr, ctrl) {
scope.newVariation = {};
scope.segments = [
{
name: "Mobile",
id: 1
},
{
name: "Tablet",
id: 2
},
{
name: "Email Subscriber",
id: 3
},
{
name: "Email Campagin March 2016",
id: 4
},
{
name: "Codegarden Attendees",
id: 5
},
{
name: "Codegarden Attendees from abroad",
id: 6
}
];
scope.variationsSortableOptions = {
distance: 10,
tolerance: "pointer",
opacity: 0.7,
scroll: true,
cursor: "move",
zIndex: 6000
};
scope.showNewVariation = function(language) {
language.showNewVariation = true;
};
scope.hideNewVariation = function(language) {
language.showNewVariation = false;
};
scope.toggleEditVariation = function(selectedVariation) {
selectedVariation.editVariation = !selectedVariation.editVariation;
};
scope.createNewVariation = function(newVariation, language) {
var variation = angular.copy(language);
variation.variationName = newVariation.name;
variation.variationDescription = newVariation.description;
variation.segments = newVariation.segments;
variation.active = false;
language.variations.unshift(variation);
language.showNewVariation = false;
scope.newVariation = {
name: "",
description: "",
segments: []
};
};
scope.saveVariation = function(variation, language) {
variation.editVariation = false;
};
scope.deleteVariation = function(variation, language) {
var index = language.variations.indexOf(variation);
language.variations.splice(index, 1);
};
scope.hideEditVariation = function(variation) {
variation.editVariation = false;
};
}
var directive = {
restrict: 'E',
replace: true,
templateUrl: 'views/components/umb-variations.html',
scope: {
variations: "=",
onClickVariation: "=",
onSaveVariation: "=",
onCloneVariation: "=",
onDeleteVariation: "="
},
link: link
};
return directive;
}
angular.module('umbraco.directives').directive('umbVariations', Variations);
})();
@@ -0,0 +1,154 @@
(function() {
'use strict';
function variationsHelper() {
var variations = [];
/*
var variations = [
{
language: "Danish",
master: true,
published: true,
variations: [
{
name: "Mobile",
description: "Danish content for mobile",
published: true,
segments: [
{
name: "Mobile"
}
]
}
]
},
{
language: "Dutch",
published: true,
variations: [
{
name: "Mobile",
description: "Dutch content for mobile",
segments: [
{
name: "Mobile"
}
]
}
]
},
{
language: "English (United States)",
published: true,
variations: [
{
name: "Mobile",
description: "English content for mobile",
published: true,
segments: [
{
name: "Mobile"
}
]
},
{
name: "Job campaign: Front-end developer",
description: "Landing page for job thing 1",
published: true,
segments: [
{
name: "Front-end developer"
}
]
},
{
name: "Job campaign: Back-end developer",
description: "Landing page for job thing 2",
published: true,
segments: [
{
name: "Back-end developer"
}
]
}
]
},
{
language: "German",
published: true
},
{
language: "Italian",
published: true
},
{
language: "Spanish",
published: false
},
{
language: "Swedish",
published: false
}
];
*/
function setMaster(master) {
variations = [];
master.master = true;
variations.push(master);
}
function getVariations() {
return variations;
}
function createVariation(variation) {
var newVariation = angular.copy(variation);
newVariation.master = false;
variations.push(newVariation);
}
function saveVariation(updatedVariation) {
for(var i = 0; i < variations.length; i++) {
var variation = variations[i];
if(variation.id === updatedVariation) {
variation.name = updatedVariation.name;
variation.description = updatedVariation.description;
}
}
}
function cloneVariation(variation) {
var variationClone = angular.copy(variation);
variationClone.master = false;
variationClone.published = false;
variations.push(variationClone);
}
function deleteVariation(variation, event, index) {
variations.splice(index, 1);
}
var service = {
setMaster: setMaster,
getVariations: getVariations,
createVariation: createVariation,
saveVariation: saveVariation,
cloneVariation: cloneVariation,
deleteVariation: deleteVariation
};
return service;
}
angular.module('umbraco.services').factory('variationsHelper', variationsHelper);
})();
@@ -8,7 +8,7 @@
* The main application controller
*
*/
function MainController($scope, $rootScope, $location, $routeParams, $timeout, $http, $log, appState, treeService, notificationsService, userService, navigationService, historyService, updateChecker, assetsService, eventsService, umbRequestHelper, tmhDynamicLocale) {
function MainController($scope, $rootScope, $location, $routeParams, $timeout, $http, $log, appState, treeService, notificationsService, userService, navigationService, historyService, updateChecker, assetsService, eventsService, umbRequestHelper, tmhDynamicLocale, $templateCache) {
//the null is important because we do an explicit bool check on this in the view
//the avatar is by default the umbraco logo
@@ -19,7 +19,7 @@ function MainController($scope, $rootScope, $location, $routeParams, $timeout, $
{ value: "assets/img/application/logo@3x.png" }
];
$scope.touchDevice = appState.getGlobalState("touchDevice");
$scope.splitView = {};
$scope.removeNotification = function (index) {
notificationsService.remove(index);
@@ -126,6 +126,28 @@ function MainController($scope, $rootScope, $location, $routeParams, $timeout, $
};
}));
evts.push(eventsService.on("splitView.open", function(name, view) {
var updateTime = Date.now();
$scope.splitView = {
id: view.id,
view: view.view + "?updated=" + updateTime,
show: true
};
}));
$rootScope.$on('$routeChangeSuccess', function(event, current, previous) {
$scope.closeSplitView();
});
$scope.closeSplitView = function() {
$scope.splitView.show = false;
$scope.splitView.id = null;
$scope.splitView.view = null;
};
//ensure to unregister from all events!
$scope.$on('$destroy', function () {
for (var e in evts) {
@@ -141,4 +163,4 @@ angular.module('umbraco').controller("Umbraco.MainController", MainController).
config(function (tmhDynamicLocaleProvider) {
//Set url for locale files
tmhDynamicLocaleProvider.localeLocationPattern('lib/angular/1.1.5/i18n/angular-locale_{{locale}}.js');
});
});
@@ -41,14 +41,10 @@ body {
}
#contentwrapper, #contentcolumn {
position: absolute;
top: 0px; bottom: 0px; right: 0px; left: 80px;
z-index: 10;
margin: 0
}
#umb-notifications-wrapper {
left: 80px;
// position: absolute;
// top: 0px; bottom: 0px; right: 0px; left: 80px;
// z-index: 10;
// margin: 0
}
#contentcolumn {
@@ -63,24 +59,6 @@ body {
border: none;
}
#leftcolumn {
height: 100%;
z-index: 20;
width: 80px;
float: left;
position: absolute;
}
#applications {
z-index: 1000;
height: 100%;
left: 0px;
top: 0;
bottom: 0;
position: absolute;
text-align: center
}
#applications-tray {
z-index: 900;
left: 80px;
@@ -91,6 +69,7 @@ body {
text-align: center;
}
/*
#search-form {
display: block;
margin: 0;
@@ -102,21 +81,37 @@ body {
overflow: hidden;
.form-search {
display: -ms-flexbox;
display: -webkit-box;
display: -webkit-flex;
display: flex;
margin-top: 17px;
.umb-search-field {
width: auto;
min-width: 160px;
-webkit-flex: 1;
-ms-flex: 1;
flex: 1;
border-left: none;
border-right: none;
border-top: none;
}
}
}
*/
.form-search {
display: flex;
//margin-top: 17px;
.umb-search-field {
width: auto;
min-width: 160px;
flex: 1;
border-left: none;
border-right: none;
border-top: none;
height: 60px;
box-sizing: border-box;
padding-left: 40px !important;
}
}
#navigation {
left: 80px;
@@ -199,10 +194,10 @@ body {
z-index:9999 !important;
}
@media (min-width: 1101px) {
#contentwrapper, #umb-notifications-wrapper {left: 440px;}
#speechbubble {left: 360px;}
}
// @media (min-width: 1101px) {
// #contentwrapper, #umb-notifications-wrapper {left: 440px;}
// #speechbubble {left: 360px;}
// }
//empty section modification
.emptySection #contentwrapper, .emptySection #umb-notifications-wrapper {left: 80px;}
@@ -0,0 +1,228 @@
.umb-navigation {
display: flex;
flex: 0 0 @navigationBarHeight;
align-items: center;
border-bottom: 1px solid @grayLight;
box-sizing: border-box;
}
.umb-navigation-link {
display: flex;
align-items: center;
padding: 0 20px;
height: 49px;
font-size: 13px;
cursor: pointer;
&:hover {
text-decoration: none;
background: @grayLighter;
}
&:focus {
text-decoration: none;
}
}
.umb-navigation-link.-current {
color: @blue;
}
.umb-navigation-link.open {
background: @grayLighter;
}
.umb-navigation__right {
display: flex;
align-items: center;
margin-left: auto;
}
#avatar-img {
border-radius: 50%;
margin: 0 0 0 10px;
}
.umb-sections__tray {
display: flex;
flex-direction: column;
align-items: flex-start;
position: absolute;
z-index: 1;
width: 220px;
top: @navigationBarHeight;
background: white;
transform: translate(-42px, 0px);
}
.umb-sections__tray .umb-navigation-link {
width: 100%;
box-sizing: border-box;
}
.umb-sections__tray .umb-navigation-link:hover {
background: #ececec;
}
.umb-navigation-more {
width: 22px;
height: auto;
}
.umb-navigation-more__path {
fill: @black;
}
// Tree Doors Downu
#mainwrapper {
display: flex;
flex-direction: column;
}
#contentwrapper {
display: flex;
flex-direction: row;
flex: 1 1 auto;
}
#contentcolumn {
flex: 1 1 100%;
position: relative;
}
// Editor blocks
.umb-editor-wrapper {
display: flex;
flex-direction: column;
height: ~"(calc(~'100vh' - ~'@{navigationBarHeight}'))";
}
.umb-editor-header {
flex: 0 0 @editorHeaderHeight;
display: flex;
align-items: center;
box-sizing: border-box;
}
.umb-editor-container {
flex: 1 1 auto;
box-sizing: border-box;
overflow-y: auto;
//display: flex;
//flex-direction: row;
}
.umb-editor-content {
padding: 30px 20px;
}
.umb-editor-container-test {
flex: 1 1 auto;
padding: 30px 20px;
overflow-y: auto;
}
.umb-editor-container-sidebar {
flex: 0 0 400px;
padding: 30px 20px;
border-left: 1px solid @grayLight;
overflow-y: auto;
}
.umb-editor-drawer {
flex: 0 0 31px;
}
.umb-tree-navigation {
display: flex;
flex-direction: column;
flex: 0 0 300px;
border-right: 1px solid @grayLight;
overflow-y: auto;
padding-bottom: 20px;
}
.umb-panel-header-content-wrapper {
width: 100%;
}
.umb-toggle-tree {
display: flex;
align-items: center;
justify-content: center;
height: 49px;
width: 20px;
padding: 0 20px;
cursor: pointer;
transition: background-color 80ms ease;
}
.umb-toggle-icon {
margin: 0 auto 0 0;
width: 20px;
height: 2px;
background-color: @grayLight;
transition: all 80ms ease;
display: block;
}
.umb-toggle-icon:before,
.umb-toggle-icon:after {
content: '';
width: 20px;
height: 2px;
display: block;
background-color: @grayLight;
transition: all 80ms ease;
}
.umb-toggle-icon:before {
transform: translate(0, -5px);
width: 15px;
}
.umb-toggle-icon:after {
transform: translate(0, 3px);
width: 9px;
}
.umb-toggle-tree:hover,
.umb-toggle-tree.-open {
background: @grayLighter;
}
.umb-toggle-tree:hover .umb-toggle-icon,
.umb-toggle-tree:hover .umb-toggle-icon:before,
.umb-toggle-tree:hover .umb-toggle-icon:after {
background-color: @grayMed;
}
.umb-toggle-tree.-open .umb-toggle-icon,
.umb-toggle-tree.-open .umb-toggle-icon:before,
.umb-toggle-tree.-open .umb-toggle-icon:after {
width: 20px;
background-color: @grayMed;
}
@@ -59,6 +59,7 @@
@import "application/grid.less";
@import "application/shadows.less";
@import "application/animations.less";
@import "application/umb-navigation.less";
// Belle styles
@import "buttons.less";
@@ -84,6 +85,8 @@
@import "components/umb-sub-views.less";
@import "components/umb-editor-navigation.less";
@import "components/umb-editor-sub-views.less";
@import "components/editor/subviews/umb-editor-sub-view.less";
@import "components/editor/umb-editor-toolbar.less";
@import "components/editor/subheader/umb-editor-sub-header.less";
@import "components/umb-grid-selector.less";
@import "components/umb-child-selector.less";
@@ -108,6 +111,8 @@
@import "components/umb-empty-state.less";
@import "components/umb-property-editor.less";
@import "components/umb-iconpicker.less";
@import "components/umb-variations.less";
@import "components/umb-splitview.less";
@import "components/buttons/umb-button.less";
@import "components/buttons/umb-button-group.less";
@@ -4,30 +4,29 @@
.umb-editor-wrapper{
background: white;
position: absolute;
top: 0px; bottom: 0px; left: 0px; right: 0px;
// position: absolute;
// top: 0px; bottom: 0px; left: 0px; right: 0px;
}
.umb-editor-header{
background: @grayLighter;
.umb-editor-header {
//background: @grayLighter;
border-bottom: 1px solid @grayLight;
position: absolute;
height: 99px;
top: 0px;
right: 0px;
left: 0px;
//position: absolute;
// height: 99px;
//top: 0px;
//right: 0px;
//left: 0px;
}
.umb-editor-container {
top: 101px;
left: 0px;
right: 0px;
bottom: 52px;
position: absolute;
clear: both;
overflow: auto;
// top: 101px;
// left: 0px;
// right: 0px;
// bottom: 52px;
// position: absolute;
// clear: both;
// overflow: auto;
}
.umb-editor-wrapper.-no-footer .umb-editor-container {
@@ -39,17 +38,18 @@
}
.umb-editor-drawer{
margin: 0;
//margin: 0;
padding: 10px 20px;
z-index: 999;
position: absolute;
bottom: 0px;
left: 0px;
right: 0px;
height: 31px;
//z-index: 999;
//position: absolute;
//bottom: 0px;
//left: 0px;
//right: 0px;
background: @grayLighter;
//background: @grayLighter;
border-top: 1px solid @grayLight;
flex: 0 0 @editorFooterHeight;
box-sizing: border-box;
}
@@ -61,3 +61,187 @@
.umb-editor-actions li{
display: inline-block;
}
.umb-editor-header__published-state {
width: 10px;
height: 10px;
}
/* ----- LANGUAGE AND VARIATION */
.umb-editor-header__selected-variations {
display: flex;
flex-direction: row;
margin-top: 6px;
margin-bottom: -4px;
}
.umb-editor-header__selected-variation {
display: flex;
flex-direction: row;
font-size: 12px;
color: #9e9ea6;
}
.umb-editor-header__selected-variation:first-child {
margin-right: 10px;
}
.umb-editor-header__selected-variation-icon {
margin-right: 5px;
}
/* --- VARIATIONS --- */
.umb-variations-quick-switcher__toggle {
position: absolute;
top: 0;
right: 0;
display: flex;
align-items: center;
border: 1px solid #ECECEC;
padding-left: 20px;
padding-right: 20px;
height: 30px;
box-sizing: border-box;
}
.umb-variations-quick-switcher__toggle.-active,
.umb-variations-quick-switcher__toggle.-active:hover {
background: @blue;
border-color: @blue;
color: @white;
}
.umb-variations-quick-switcher__toggle:hover {
background-color: @grayLighter;
border-color: @grayLight;
}
.umb-variations-quick-switcher__toggle:hover,
.umb-variations-quick-switcher__toggle:focus {
text-decoration: none;
}
.umb-variations-quick-switcher__toggle-icon {
margin-right: 5px;
}
.umb-variations-quick-switcher__toggle-arrow {
}
.umb-variations-quick-switcher_variations {
position: absolute;
top: 30px;
left: 0;
right: 0;
z-index: 6200;
background-color: #ffffff;
max-height: 300px;
overflow-y: auto;
list-style: none;
margin-left: 0;
margin-bottom: 0;
}
.umb-variations-quick-switcher_variation > li {
border-left: 4px solid transparent;
box-sizing: border-box;
}
.umb-variations-quick-switcher_variation > li:hover {
border-color: @grayLighter;
}
.umb-variations-quick-switcher_variation > li.-active,
.umb-variations-quick-switcher_variation > li.-active:hover {
border-left-color: @blue;
}
.umb-variations-quick-switcher_variation li.-active,
.umb-variations-quick-switcher_variation li.-active:hover {
background-color: fade(@blueDark, 4%);
}
.umb-variations-quick-switcher__variation {
display: flex;
flex-direction: row;
align-items: center;
height: 60px;
padding: 0 15px;
}
.umb-variations-quick-switcher__variation-stroke {
border-left: 1px solid @grayLight;
padding-left: 10px;
}
.umb-variations-quick-switcher__subnav {
list-style: none;
margin-left: 0;
margin-bottom: 0;
}
.umb-variations-quick-switcher__variation:last-child {
border-bottom: none;
}
.umb-variations-quick-switcher__variation:hover,
.umb-variations-quick-switcher__variation:focus {
text-decoration: none;
outline: none;
}
.umb-variations-quick-switcher__variation:hover,
.umb-variations-quick-switcher__variation.-active {
background-color: @grayLighter;
}
.umb-variations-quick-switcher__variation.-active {
background-color: rgb(238, 246, 254);
}
.umb-variations-quick-switcher__variation-published-state {
display: block;
width: 6px;
height: 6px;
border-radius: 50%;
background-color: @grayLight;
margin-right: 10px;
}
.umb-variations-quick-switcher__variation-toggle {
font-size: 13px;
margin-left: auto;
opacity: .5;
padding: 5px 10px;
}
.umb-variations-quick-switcher__variation-toggle:hover {
opacity: 1;
}
.umb-variations-quick-switcher__variation-published-state.-published {
background-color: @green;
}
.umb-variations-quick-switcher__variation-name {
font-size: 13px;
font-weight: bold;
}
.umb-variations-quick-switcher__variation-icon {
color: @grayLight;
margin-right: 5px;
}
.umb-variations-quick-switcher__variation-description {
font-size: 11px;
color: @gray;
margin-left: 5px;
}
@@ -0,0 +1,107 @@
.umb-editor-sub-view {
display: flex;
flex-direction: column;
height: ~"(calc(~'100vh' - ~'@{navigationBarHeight}' - ~'@{editorHeaderHeight}' - ~'@{editorFooterHeight}'))";
}
.umb-editor-sub-view-header {
display: flex;
flex-direction: row;
border-bottom: 1px solid rgba(217,217,217, .6);
flex: 0 0 @editorSubViewHeaderHeight;
padding: 0 20px;
align-items: center;
box-sizing: border-box;
background: @grayLighter;
}
.umb-editor-sub-view-header__content-left {
margin-right: auto;
}
.umb-editor-sub-view-header__content-right {
margin-left: auto;
}
.umb-editor-sub-view-container {
flex: 1 1 auto;
display: flex;
flex-direction: row;
background: #F9F9F9;
}
.umb-editor-sub-view-content {
flex: 1 1 auto;
padding: 30px 20px;
overflow-y: auto;
position: relative;
}
.umb-editor-sub-view-sidebar {
flex: 0 0 400px;
border-left: 1px solid @grayLight;
display: flex;
flex-direction: column;
background: @white;
}
.umb-editor-sub-view-sidebar-header {
flex: 0 0 auto;
display: flex;
flex-direction: column;
justify-content: center;
align-items: flex-start;
padding: 20px 0;
}
.umb-editor-sub-view-sidebar-header i {
margin-left: auto;
cursor: pointer;
color: @grayMed;
}
.umb-editor-sub-view-sidebar-header i:hover {
color: @black;
}
.umb-editor-sub-view-sidebar-title {
font-size: 16px;
font-weight: bold;
color: @black;
display: flex;
width: 100%;
}
.umb-editor-sub-view-sidebar-container {
overflow-y: auto;
flex: 1 1 auto;
box-sizing: border-box;
padding-top: 20px;
padding-bottom: 20px;
}
.umb-editor-sub-view-sidebar-footer {
flex: 0 0 @editorFooterHeight;
background: @grayLighter;
display: flex;
align-items: center;
}
.umb-editor-sub-view-sidebar-header,
.umb-editor-sub-view-sidebar-container,
.umb-editor-sub-view-sidebar-footer {
padding-right: 20px;
padding-left: 20px;
}
@@ -0,0 +1,19 @@
.umb-editor-toolbar {
padding: 0 20px;
flex: 0 0 50px;
display: flex;
align-items: center;
border-bottom: 1px solid @grayLight;
justify-content: space-between;
}
.editor-toolbar-properties {
font-size: 20px;
color: @grayMed;
}
.editor-toolbar-properties:hover,
.editor-toolbar-properties:focus {
color: @grayDark !important;
text-decoration: none;
}
@@ -1,7 +1,7 @@
.umb-notifications {
z-index: 1000;
position: absolute;
bottom: 52px;
bottom: @editorFooterHeight;
left: 0;
right: 0;
border-bottom: none;
@@ -152,6 +152,19 @@
}
}
/* ---------- OVERLAY FULL ---------- */
.umb-overlay.umb-overlay-full {
left: 0;
right: 0;
top: @navigationBarHeight;
bottom: 0;
}
.umb-overlay.umb-overlay-full .umb-overlay-header {
display: none;
}
/* ---------- OVERLAY ITEM DETAILS ---------- */
.umb-overlay__item-details {
position: absolute;
@@ -1,14 +1,41 @@
.umb-sub-views-nav {
list-style: none;
display: flex;
margin: 0;
display: flex;
flex-wrap: wrap;
align-items: flex-end;
justify-content: flex-end;
}
.umb-sub-views-nav-items {
display: flex;
justify-content: center;
height: 61px;
}
.umb-sub-views-nav-items .umb-navigation-more {
height: 20px;
margin: 0;
}
.umb-sub-views-nav-item {
text-align: center;
margin-left: 20px;
padding: 10px;
cursor: pointer;
display: block;
display: flex;
flex-direction: column;
flex-wrap: wrap;
align-items: center;
max-width: 100%;
text-overflow: ellipsis;
box-sizing: border-box;
}
.umb-sub-views-nav-item:focus {
@@ -35,5 +62,23 @@
}
.umb-sub-views-nav-item-text {
font-size: 11px;
font-size: 11px;
vertical-align: baseline;
margin: 10px 0 0 0;
line-height: 1;
white-space: nowrap;
}
// drop down
.umb-sub-views-nav__dropdown {
position: absolute;
right: 20px;
background: #fff;
margin-top: 10px;
z-index: 1;
padding: 10px 20px;
display: flex;
justify-content: flex-end;
width: auto;
}
@@ -4,9 +4,8 @@
// drop zone
// tall and small version - animate height
.dropzone {
height: 400px;
height: 500px;
width: 100%;
padding: 50px 0;
border: 1px dashed @grayLight;
text-align: center;
color: @gray;
@@ -15,11 +14,12 @@
-webkit-transition: height 0.8s;
-moz-transition: height 0.8s;
transition: height 0.8s;
box-sizing: border-box;
.illustration {
width: 300px;
}
&.is-small {
height: 100px;
height: 200px;
.illustration {
width: 200px;
}
@@ -1,3 +1,146 @@
.umb-property-editor.-not-clickable {
pointer-events: none;
}
.umb-property-editor {
position: relative;
}
.umb-property-editor__overlay {
background-color: rgba(255,255,255, .65);
display: block;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 1;
display: flex;
justify-content: center;
align-items: center;
}
.umb-property-editor__overlay-label {
font-size: 16px;
font-weight: bold;
color: #;
background: #ffffff;
padding: 10px 20px;
color: @grayLight;
}
.umb-property .control-label {
font-size: 14px;
}
.umb-property .control-label small {
font-size: 11px;
line-height: 17px;
margin-top: 5px;
margin-bottom: 10px;
}
.umb-property-editor__dropdown-toggling {
z-index: 1;
position: relative;
}
.umb-property-editor__dropdown-toggling.-active {
z-index: 10;
}
.umb-property-editor__dropdown-toggling.-active .umb-property-editor__dropdown-toggle {
color: @blue;
}
.umb-property-editor__dropdown-toggle {
display: inline-flex;
align-items: center;
width: auto;
box-sizing: border-box;
font-weight: bold;
font-size: 12px;
cursor: pointer;
margin-top: 5px;
}
.umb-property-editor__dropdown-toggle:hover {
color: @blue;
}
.umb-property-editor__dropdown-toggle i,
.umb-property-editor__dropdown-link i {
margin-right: 5px;
font-size: 12px;
}
.umb-property-editor__dropdown {
position: absolute;
z-index: 10;
min-width: 250px;
background: #ffffff;
margin-top: 5px;
}
.umb-property-editor__dropdown-items {
list-style: none;
margin-bottom: 0;
margin-left: 0;
font-size: 12px;
font-weight: normal;
max-height: 165px;
overflow-y: auto;
}
.umb-property-editor__dropdown-filter {
padding: 5px;
}
.umb-property-editor__dropdown-filter input[type="search"] {
font-size: 12px;
}
.umb-property-editor__dropdown-link.-sync-off {
border-bottom: 1px solid @grayLight;
padding: 10px;
font-size: 12px;
}
.umb-property-editor__dropdown-link.-sync-off:hover {
background: rgba(217,217,217, .35);
}
.umb-property-editor__dropdown-link {
padding: 5px 10px;
display: flex;
align-items: center;
box-sizing: border-box;
}
.umb-property-editor__dropdown-link:hover {
background-color: @grayLighter;
text-decoration: none;
}
@@ -0,0 +1,41 @@
/* split view */
.splitview--views {
display: flex;
}
.splitview--view {
position: relative;
flex: 1 1 100%;
}
.splitview--divider {
flex: 0 0 8px;
background: @white;
border-right: 1px solid @grayLight;
border-left: 1px solid @grayLight;
box-shadow: 0 0 4px rgba(0,0,0,0.1);
position: relative;
z-index: 1;
}
.splitview--close {
position: absolute;
bottom: 50px;
left: 50%;
transform: translate3d(-50%, -50%, 0);
z-index: 100;
font-size: 14px;
font-weight: bold;
padding: 8px 18px;
background: rgba(0,0,0,0.05);
border-radius: 6px;
cursor: pointer;
&:hover {
background: rgba(0,0,0,0.1);
}
}
@@ -1,15 +1,119 @@
.umb-nav-tabs {
position: absolute;
z-index: 10;
.umb-tabs-nav {
list-style: none;
margin: 0;
}
.umb-nav-tabs.-padding-left {
padding-left: 20px;
// Sub view header tabs
.umb-editor-sub-view-header .umb-tabs-nav {
display: flex;
flex-wrap: wrap;
}
.umb-tab-content {
padding-top: 20px;
position: relative;
top: 22px;
border-top: 1px solid @grayLight;
.umb-editor-sub-view-header .umb-tabs-nav__tab a {
padding: 4px 10px;
font-size: 12px;
font-weight: bold;
border-radius: 6px;
margin-right: 15px;
}
.umb-editor-sub-view-header .umb-tabs-nav__tab a:hover,
.umb-editor-sub-view-header .umb-tabs-nav__tab a:active,
.umb-editor-sub-view-header .umb-tabs-nav__tab a:focus {
text-decoration: none !important;
background: rgba(0,0,0,0.05);
}
.umb-editor-sub-view-header .umb-tabs-nav__tab.active a {
background: @blue;
color: white;
text-decoration: none;
}
// Sidebar tabs
.umb-editor-sub-view-sidebar .umb-tabs-nav {
display: flex;
width: 100%;
border-bottom: 1px solid @grayLight;
padding-top: 25px;
}
.umb-editor-sub-view-sidebar .umb-tabs-nav__tab {
border-bottom: 3px solid transparent;
padding-bottom: 8px;
margin-right: 0;
flex: 1 1 100%;
font-size: 14px;
color: @grayMed;
}
.umb-editor-sub-view-sidebar .umb-tabs-nav__tab:hover,
.umb-editor-sub-view-sidebar .umb-tabs-nav__tab.-active {
text-decoration: none !important;
border-color: @blue;
color: @black;
}
.umb-editor-sub-view-sidebar .umb-tabs-nav__tab:focus,
.umb-editor-sub-view-sidebar .umb-tabs-nav__tab:active {
text-decoration: none !important;
}
// Umb activity demo css
.umb-activity {
padding: 0;
margin: 0;
}
.umb-activity-item {
border: 1px solid transparent;
padding: 10px;
list-style: none;
font-weight: bold;
cursor: pointer;
}
.umb-activity-item:hover {
border-color: @grayLight;
}
.umb-activity-item:hover .umb-activity-item-rollback {
color: @blue;
text-decoration: none;
}
.umb-activity-item-name {
display: block;
width: 100%;
font-size: 15px;
margin-bottom: 5px;
}
.umb-activity-item-rollback {
font-size: 13px;
color: @grayMed;
font-weight: normal;
}
.umb-activity-item .umb-activity-item-rollback:hover {
color: @blueDark;
}
.umb-activity-item + .umb-activity-item {
margin-top: 5px;
}
@@ -0,0 +1,356 @@
.umb-variations {
max-width: 100%;
padding: 0 20px;
margin-right: auto;
margin-left: auto;
}
.umb-variations__title-wrapper {
display: flex;
flex-direction: row;
justify-content: space-between;
margin-bottom: 20px;
}
.umb-variations__title {
font-size: 16px;
font-weight: bold;
color: @black;
}
.umb-variations__help-text {
line-height: 1.6em;
display: block;
color: @grayMed;
margin-bottom: 20px;
}
.umb-variations__filter {
margin-bottom: 10px;
}
.umb-varations__published-state {
width: 6px;
height: 6px;
border-radius: 50%;
background-color: @grayLight;
margin-right: 10px;
}
.umb-varations__published-state.-published {
background-color: @green;
}
/* ---------- VARIATIONS LANG GROUP ---------- */
.umb-varations__lang-group {
background: @white;
border: 1px solid @grayLight;
margin-bottom: 30px;
}
.umb-varations__lang-group-info {
padding: 20px 15px;
display: flex;
}
.umb-varations__lang-group-info__name {
font-size: 15px;
font-weight: bold;
display: flex;
align-items: center;
flex-direction: row;
flex: 1 1 auto;
}
.umb-varations__lang-group-info__link:hover {
text-decoration: underline;
cursor: pointer;
}
.umb-varations__lang-group-info__name i {
margin-right: 5px;
}
.umb-varations__lang-group-info__name small {
margin-left: 5px;
color: @grayMed;
font-weight: normal;
font-size: 13px;
}
.umb-varations__lang-group .umb-variations__action span {
font-size: 13px;
margin-left: 5px;
font-weight: bold;
}
.umb-varations__lang-group-info .umb-variations__action {
color: @blue;
display: flex;
}
.umb-varations__lang-group-info .umb-variations__action:hover {
color: @blueDark;
}
.umb-variations__no-variations {
display: flex;
flex-direction: column;
align-items: center;
padding: 0 20px 40px;
}
.umb-variations__no-variations-message {
display: block;
margin-bottom: 20px;
font-size: 14px;
line-height: 22px;
color: #999;
}
/* ---------- VARIATIONS LIST ---------- */
.umb-variations__list {
list-style: none;
margin: 0;
}
.umb-variations__list-item-wrapper {
display: flex;
flex-direction: column;
}
.umb-variations__list-item {
padding: 15px;
flex: 3 1 auto;
border-top: 1px solid @grayLight;
background: #ffffff;
}
.umb-variations__list-item.-edit-mode {
background: @grayLighter;
border-top-color: #e7e7e7;
}
.umb-variations__list-item.-edit-mode + .umb-variations__edit-list-item {
border-top-color: @grayLighter;
}
.umb-variations__list-item__edit {
padding: 4px 10px;
border-radius: 6px;
font-size: 12px;
font-weight: bold;
background: rgba(0, 0, 0, 0.05);
}
.umb-variations__list-item__edit:hover {
background: rgba(0, 0, 0, 0.09);
cursor: pointer;
}
.umb-variations__variation-top-bar {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
justify-content: space-between;
align-items: center;
}
.umb-variations__published-state {
width: 10px;
height: 10px;
border-radius: 20px;
background-color: @grayLight;
margin-right: 10px;
}
.umb-variations__published-state.-published {
background-color: @green;
}
.umb-variations__name-wrapper {
display: flex;
align-items: center;
flex-direction: row;
flex: 1 1 auto;
}
.umb-variations__name {
font-size: 13px;
font-weight: bold;
color: @black;
}
.umb-variations__name:hover {
text-decoration: underline;
cursor: pointer;
}
.umb-variations__name-icon {
margin-right: 5px;
}
.umb-variations__edit-form {
width: 100%;
}
.umb-variations__name-input:focus,
.umb-variations__name-input:active {
outline: none;
}
.umb-variations__description {
margin-bottom: 0;
margin-left: 5px;
resize: none;
font-size: 12px;
color: @grayMed;
}
.umb-variations__description-input {
resize: none;
}
.umb-variations__actions {
display: flex;
flex-direction: row;
justify-content: flex-end;
}
.umb-variations__action {
font-size: 18px;
cursor: pointer;
display: flex;
align-items: center;
flex-direction: row;
}
.umb-variations__action + .umb-variations__action {
margin-left: 20px;
}
.umb-variations__action:hover {
color: @blue;
}
/* --- CREATE VARIATION --- */
.umb-variation__create-title {
color: @black;
font-weight: bold;
font-size: 24px;
margin-bottom: 10px;
}
.umb-variation__create-form-description {
resize: none;
min-height: 100px;
}
.umb-variation__create-form {
display: flex;
flex-direction: column;
}
.umb-variation__create-form label,
.umb-variations__edit-form label {
font-weight: bold;
}
.umb-variation__create-form-actions {
display: flex;
justify-content: flex-end;
}
.umb-variations__edit-form + .umb-variations__actions {
margin-top: 30px;
}
/* */
.form-group-actions {
margin-top: 10px;
margin-bottom: 0;
}
.umb-variations__edit-list-item {
display: flex;
flex-direction: column;
width: 100%;
padding: 20px 30px;
box-sizing: border-box;
background-color: @white;
border-top: 1px solid @grayLight;
}
/* MATCHES */
.umb-variations__matches {
list-style: none;
margin-bottom: 0;
margin-left: 0;
}
.umb-variations__match {
background: @grayLighter;
padding: 10px 15px;
cursor: grab;
border-left: 2px solid @blue;
margin-bottom: 5px;
}
/* TAGS */
.umb-variations__tags {
display: flex;
flex-wrap: wrap;
}
.umb-variations__tag {
display: flex;
flex: 0 0 100%;
overflow: hidden;
box-sizing: border-box;
text-overflow: ellipsis;
font-size: 13px;
}
.umb-variations__tag + .umb-variations__tag {
margin-top: 5px;
}
.umb-variations__tag .checkbox {
margin-right: 5px;
}
.umb-variations__tag .checkbox:checked + span {
font-weight: bold;
}
/* FORM */
.umb-variations__form-group {
margin-bottom: 10px;
}
.umb-variations__label {
font-weight: bold;
color: @black;
}
.umb-variations__label + .umb-variations__tags {
margin-top: 10px;
}
@@ -49,6 +49,7 @@ label.control-label {
.form-search {
position: relative;
padding: 0;
margin-bottom: 0;
}
.form-search a{
text-decoration:none;
@@ -65,8 +66,8 @@ label.control-label {
}
.form-search .icon, .form-search .icon-search {
position: absolute;
top: 6px;
left: 4px;
top: 23px;
left: 20px;
color: @grayLight;
}
@@ -207,6 +208,11 @@ input.-full-width-input {
height: 30px;
}
textarea.-full-width-textarea {
width: 100%;
box-sizing: border-box;
}
// Reset appearance properties for textual inputs and textarea
// Declare width for legacy (can't be on input[type=*] selectors or it's too specific)
input,
+89 -18
View File
@@ -2,11 +2,11 @@
// -------------------------
.umb-panel {
background: white;
position: absolute;
top: 0px;
bottom: 0px;
left: 0px;
right: 0px;
// position: absolute;
// top: 0px;
// bottom: 0px;
// left: 0px;
// right: 0px;
}
.umb-panel-nobody {
@@ -17,21 +17,21 @@
.umb-panel-header {
background: @grayLighter;
border-bottom: 1px solid @grayLight;
position: absolute;
height: 99px;
top: 0px;
right: 0px;
left: 0px;
// position: absolute;
// height: 99px;
// top: 0px;
// right: 0px;
// left: 0px;
}
.umb-panel-body {
top: 101px;
left: 0px;
right: 0px;
bottom: 0px;
position: absolute;
clear: both;
overflow: auto;
// top: 101px;
// left: 0px;
// right: 0px;
// bottom: 0px;
// position: absolute;
// clear: both;
// overflow: auto;
}
.umb-panel-body.no-header {
@@ -356,7 +356,7 @@
.umb-panel-header-content-wrapper {
display: flex;
flex-direction: column;
height: 100px;
// height: 100px;
padding: 0 20px;
}
@@ -366,15 +366,18 @@
flex: 1;
}
/*
.umb-panel-header-content.-top-position {
position: relative;
top: -12px;
}
*/
.umb-panel-header-left-side {
display: flex;
flex: 1;
flex-direction: row;
align-items: center;
}
.umb-panel-header-icon {
@@ -493,3 +496,71 @@ input.umb-panel-header-description {
.umb-editor-drawer-content__left-side {
margin-right: auto;
}
// Large Search
.large-search {
font-size: 18px;
padding-top: 20px;
padding-bottom: 10px;
border-bottom: 1px solid @grayLight;
display: flex;
flex-direction: row;
align-items: center;
}
.large-search,
.umb-tree.large-search-results {
width: 100%;
max-width: 960px;
min-width: auto;
margin: 0 auto;
}
.large-search .umb-search-field {
border-bottom: none;
font-size: 22px;
text-indent: 10px;
padding-left: 0 !important;
line-height: 60px;
}
.large-search .icon-search {
color: @black;
position: static;
font-size: 22px;
}
.umb-tree.large-search-results .umb-search-group-item-link {
padding: 10px 0;
display: flex;
flex-direction: row;
align-items: center;
min-height: 60px;
}
.umb-tree.large-search-results .umb-search-group-item-info {
display: flex;
flex-direction: column;
align-items: flex-start;
position: relative;
overflow: visible;
}
.umb-tree.large-search-results .umb-search-group-item-link .icon {
font-size: 24px;
}
.umb-tree.large-search-results .umb-search-group-item-name {
font-size: 16px;
font-weight: bold;
}
.umb-tree.large-search-results .search-subtitle {
padding-left: 0;
}
@@ -196,7 +196,6 @@ ul.color-picker li a {
flex-wrap: wrap;
padding: 2px;
margin: 5px;
background: white;
border: 1px solid #f8f8f8;
}
@@ -1,24 +1,38 @@
// Sections
// -------------------------
ul.sections {
margin: 0;
display: block;
background: @blackLight;
height: 100%;
width: 80px;
border-right: 1px solid @grayDark;
.umb-sections {
//margin: 0;
//display: block;
//background: @blackLight;
display: flex;
flex-direction: row;
flex-wrap: wrap;
//height: 100%;
//width: 80px;
//border-right: 1px solid @grayDark;
}
ul.sections li {
display: block;
border-left: 4px @blackLight solid;
-webkit-transition: all .3s linear;
-moz-transition: all .3s linear;
transition: all .3s linear;
.umb-sections__section {
//border-left: 4px @blackLight solid;
//-webkit-transition: all .3s linear;
//-moz-transition: all .3s linear;
//transition: all .3s linear;
}
ul.sections li [class^="icon-"]:before,
.umb-sections__section:hover {
background: #E2E2E2;
text-decoration: none;
}
.umb-sections__section.-current,
.umb-sections__section:focus {
outline: none;
text-decoration: none;
color: @blue;
}
/*
ul.sections li [class^="icon-"]:before,
ul.sections li [class*=" icon-"]:before{
font-size: 30px;
margin: 1px 0 0 0;
@@ -27,12 +41,15 @@ ul.sections li [class*=" icon-"]:before{
-moz-transition: all .3s linear;
transition: all .3s linear;
}
*/
ul.sections:hover li [class^="icon-"]:before,
/*
ul.sections:hover li [class^="icon-"]:before,
ul.sections:hover li [class*=" icon-"]:before {
opacity: 1
}
*/
/*
ul.sections li a {
display: block;
text-decoration: none;
@@ -43,7 +60,7 @@ ul.sections li a {
width: 100%;
height: 100%;
margin: 0 0 0 -4px;
cursor: pointer; // make sure IE10 displays pointer cursor for expand and help sections.
cursor: pointer; // make sure IE10 displays pointer cursor for expand and help sections.
}
ul.sections a span {
@@ -59,11 +76,12 @@ ul.sections a span {
ul.sections:hover a span {
opacity: 1
}
*/
// Avatar, Section & Help icons
// -------------------------
/*
ul.sections li.avatar {
height: 75px;
padding: 22px 0 2px 0;
@@ -84,7 +102,8 @@ ul.sections li.avatar a img {
border-radius: 50%;
width: 30px;
}
*/
/*
.faded ul.sections li {
opacity: 0.4
}
@@ -101,7 +120,7 @@ ul.sections li.current a{
padding-left: 0px;
}
ul.sections li.help {
ul.sections li.help {
margin: 0;
position: absolute;
bottom: 0;
@@ -113,9 +132,11 @@ ul.sections li.help {
ul.sections li.help a {
border-bottom: none;
}
*/
// Section slide-out tray for additional apps
// -------------------------
li.expand a, li.expand{border: none !Important;}
li.expand {
@@ -125,7 +146,7 @@ li.expand {
-o-transition: all 1s !important;
-moz-transition: all 1s !important;
transition: all 1s !important;
&:before {
-ms-transform: rotate(180deg) !important; /* IE 9 */
-webkit-transform: rotate(180deg) !important; /* Chrome, Safari, Opera */
@@ -147,7 +168,7 @@ ul.sections-tray {
& > li {
// 5px (instead of 4px) because of vertical border
border-left-width: 5px;
&.current, &:hover {
border-left-width: 5px;
}
@@ -7,6 +7,15 @@
// --------------------------------------------------
//
// -------------------------
@navigationBarHeight: 50px;
@editorHeaderHeight: 80px;
@editorFooterHeight: 50px;
@editorSubViewHeaderHeight: 50px;
// Grays
// -------------------------
@black: #000;
@@ -20,28 +20,36 @@
hide-alias="true">
</umb-editor-header>
<umb-editor-toolbar umb-tabs>
<umb-tabs-nav ng-if="dashboard.tabs" model="dashboard.tabs"></umb-tabs-nav>
</umb-editor-toolbar>
<umb-editor-container>
<umb-tabs-content view="true">
<umb-tab id="tab{{tab.id}}" ng-repeat="tab in dashboard.tabs" rel="{{tab.id}}">
<div class="umb-editor-content">
<div ng-repeat="property in tab.properties" ng-switch on="property.serverSide">
<umb-tabs-content view="true">
<umb-tab id="tab{{tab.id}}" ng-repeat="tab in dashboard.tabs" rel="{{tab.id}}">
<div class="span12 clearfix" ng-switch-when="false">
<h3 ng-show="property.caption">{{property.caption}}</h3>
<div ng-include="property.path"></div>
</div>
<div ng-repeat="property in tab.properties" ng-switch on="property.serverSide">
<div class="span12 umb-dashboard-control clearfix" ng-switch-when="true">
<h3 ng-show="property.caption">{{property.caption}}</h3>
<div ng-switch-when="false">
<h3 ng-show="property.caption">{{property.caption}}</h3>
<div ng-include="property.path"></div>
</div>
<iframe ng-src="dashboard/usercontrolproxy.aspx?ctrl={{ property.path}}"></iframe>
</div>
<div class="span12 umb-dashboard-control clearfix" ng-switch-when="true">
<h3 ng-show="property.caption">{{property.caption}}</h3>
</div>
<iframe ng-src="dashboard/usercontrolproxy.aspx?ctrl={{ property.path}}"></iframe>
</div>
</umb-tab>
</umb-tabs-content>
</div>
</umb-tab>
</umb-tabs-content>
</div>
</umb-editor-container>
@@ -0,0 +1,132 @@
(function() {
"use strict";
function SearchOverlay($scope, searchService, $log, $location, navigationService, $q) {
$scope.searchTerm = null;
$scope.searchResults = [];
$scope.isSearching = false;
$scope.selectedResult = -1;
$scope.navigateResults = function(ev) {
//38: up 40: down, 13: enter
switch (ev.keyCode) {
case 38:
iterateResults(true);
break;
case 40:
iterateResults(false);
break;
case 13:
if ($scope.model.selectedItem) {
$scope.selectItem($scope.model.selectedItem);
}
break;
}
};
$scope.selectItem = function(selectedItem) {
$scope.model.selectedItem = selectedItem;
$scope.model.submit($scope.model);
};
var group = undefined;
var groupIndex = -1;
var itemIndex = -1;
$scope.model.selectedItem = undefined;
function iterateResults(up) {
//default group
if (!group) {
group = $scope.groups[0];
groupIndex = 0;
}
if (up) {
if (itemIndex === 0) {
if (groupIndex === 0) {
gotoGroup($scope.groups.length - 1, true);
} else {
gotoGroup(groupIndex - 1, true);
}
} else {
gotoItem(itemIndex - 1);
}
} else {
if (itemIndex < group.results.length - 1) {
gotoItem(itemIndex + 1);
} else {
if (groupIndex === $scope.groups.length - 1) {
gotoGroup(0);
} else {
gotoGroup(groupIndex + 1);
}
}
}
}
function gotoGroup(index, up) {
groupIndex = index;
group = $scope.groups[groupIndex];
if (up) {
gotoItem(group.results.length - 1);
} else {
gotoItem(0);
}
}
function gotoItem(index) {
itemIndex = index;
$scope.model.selectedItem = group.results[itemIndex];
}
//used to cancel any request in progress if another one needs to take it's place
var canceler = null;
$scope.$watch("searchTerm", _.debounce(function(newVal, oldVal) {
$scope.$apply(function() {
if ($scope.searchTerm) {
if (newVal !== null && newVal !== undefined && newVal !== oldVal) {
$scope.isSearching = true;
//navigationService.showSearch();
$scope.model.selectedItem = undefined;
//a canceler exists, so perform the cancelation operation and reset
if (canceler) {
console.log("CANCELED!");
canceler.resolve();
canceler = $q.defer();
} else {
canceler = $q.defer();
}
searchService.searchAll({
term: $scope.searchTerm,
canceler: canceler
}).then(function(result) {
$scope.groups = _.filter(result, function(group) {
return group.results.length > 0;
});
//set back to null so it can be re-created
canceler = null;
});
}
} else {
$scope.isSearching = false;
//navigationService.hideSearch();
$scope.model.selectedItem = undefined;
}
});
}, 200));
}
angular.module("umbraco").controller("Umbraco.Overlays.SearchOverlay", SearchOverlay);
})();
@@ -0,0 +1,50 @@
<div ng-controller="Umbraco.Overlays.SearchOverlay">
<!-- Search form -->
<form class="form-search large-search" novalidate>
<i class="icon-search"></i>
<input type="text"
id="search-field"
ng-model="searchTerm"
class="umb-search-field search-query search-input"
localize="placeholder"
placeholder="@placeholders_search"
ng-keydown="navigateResults($event)"
umb-auto-focus
autocomplete="off" />
</form>
<!-- Search results --->
<ul class="umb-tree large-search-results">
<li class="root">
<div>
<h5 class="umb-tree-header"><localize key="general_searchResults">Search results</localize></h5>
</div>
<ul class="umb-search-group" ng-repeat="group in groups">
<li ng-repeat="result in group.results" ng-class="{'current':model.selectedItem == result}">
<div class="umb-search-group-item">
<a class="umb-search-group-item-link" ng-class="{'first':$first}" ng-click="selectItem(result)">
<i class="icon umb-tree-icon sprTree {{result.icon}}"></i>
<div class="umb-search-group-item-info">
<div class="umb-search-group-item-name">
{{result.name}}
</div>
<small class="search-subtitle" ng-show="result.subTitle">
{{result.subTitle}}
</small>
</div>
</a>
</div>
</li>
</ul>
</li>
</ul>
</div>
@@ -1,104 +1,66 @@
<div id="leftcolumn" ng-controller="Umbraco.NavigationController"
ng-mouseleave="leaveTree($event)" ng-mouseenter="enterTree($event)">
<div
class="umb-navigation"
ng-controller="Umbraco.NavigationController"
ng-mouseleave="leaveTree($event)"
ng-mouseenter="enterTree($event)">
<umb-sections sections="sections" ng-if="authenticated">
</umb-sections>
<div class="umb-toggle-tree"
ng-click="showTree()"
ng-class="{'-open':showTreeNavigation}">
<!-- navigation container -->
<div id="navigation" ng-show="showNavigation" class="fill umb-modalcolumn" ng-animate="'slide'" nav-resize>
<div ng-swipe-left="nav.hideNavigation()" class="navigation-inner-container span6">
<!-- the search -->
<div ng-controller="Umbraco.SearchController" ng-if="authenticated">
<!-- Search form -->
<div id="search-form">
<div class="umb-modalcolumn-header">
<form class="form-search" novalidate>
<i class="icon-search"></i>
<input type="text"
hotkey="ctrl+space"
id="search-field"
ng-model="searchTerm"
class="umb-search-field search-query search-input"
localize="placeholder"
placeholder="@placeholders_search"
ng-keydown="navigateResults($event)"/>
</form>
</div>
</div>
<!-- Search results -->
<div id="search-results" class="umb-modalcolumn-body" ng-show="showSearchResults">
<ul class="umb-tree">
<li class="root">
<div>
<h5 class="umb-tree-header"><localize key="general_searchResults">Search results</localize></h5>
</div>
<ul class="umb-search-group" ng-repeat="group in groups">
<li ng-repeat="result in group.results" ng-class="{'current':selectedItem == result}">
<div class="umb-search-group-item">
<a class="umb-search-group-item-link" ng-class="{'first':$first}" ng-click="searchHide()" ng-href="#/{{result.editorPath}}">
<div class="umb-search-group-item-name">
<i class="icon umb-tree-icon sprTree {{result.icon}}"></i>
{{result.name}}
</div>
<small class="search-subtitle" ng-show="result.subTitle">
{{result.subTitle}}
</small>
</a>
<a href ng-click="searchShowMenu($event, {node: result})" class="umb-options"><i></i><i></i><i></i></a>
</div>
</li>
</ul>
</li>
</ul>
</div>
</div>
<!-- the tree -->
<div id="tree" class="umb-modalcolumn-body" ng-if="authenticated">
<umb-tree
cachekey="_"
eventhandler="treeEventHandler"
section="{{currentSection}}" >
</umb-tree>
</div>
</div>
<div class="offset6" id="navOffset" style="z-index: 10">
<!-- The context menu -->
<div id='contextMenu' class="umb-modalcolumn fill shadow" ng-swipe-left="nav.hideMenu()" ng-show="showContextMenu" ng-animate="'slide'">
<umb-context-menu
menu-dialog-title="{{menuDialogTitle}}"
current-section="{{currentSection}}"
current-node="menuNode"
menu-actions="menuActions">
</umb-context-menu>
</div>
<!-- Tree dialogs -->
<div id="dialog" class='umb-modalcolumn fill shadow'
ng-swipe-left="nav.hideDialog()"
ng-show="showContextMenuDialog" ng-animate="'slide'">
<div class='umb-modalcolumn-header'>
<h1>{{menuDialogTitle}}</h1>
</div>
<div class='umb-modalcolumn-body'>
</div>
</div>
</div>
<div class="umb-toggle-icon"></div>
</div>
<umb-sections
ng-if="authenticated"
sections="sections">
</umb-sections>
<div class="umb-navigation__right">
<div class="search">
<a class="umb-navigation-link" href class="help" hotkey="ctrl+shift+s" ng-click="searchClick()" prevent-default>
<span>Search</span>
</a>
</div>
<div class="help">
<a class="umb-navigation-link" href class="help" hotkey="ctrl+shift+h" ng-click="helpClick()" prevent-default>
<span><localize key="sections_help">Help</localize></span>
</a>
</div>
<div>
<a class="umb-navigation-link" href="#" ng-click="avatarClick()" hotkey="ctrl+shift+u" title="{{user.name}}" prevent-default>
<span>{{user.name}}</span>
<img id="avatar-img" ng-src="{{avatar[0].value}}" ng-srcset="{{avatar[1].value}} 2x, {{avatar[2].value}} 3x" />
</a>
</div>
</div>
<!-- navigation container -->
<umb-overlay
ng-if="searchOverlay.show"
model="searchOverlay"
view="searchOverlay.view"
position="full">
</umb-overlay>
<umb-overlay
ng-if="helpDialog.show"
model="helpDialog"
view="helpDialog.view"
position="right">
</umb-overlay>
<umb-overlay
ng-if="userDialog.show"
model="userDialog"
view="userDialog.view"
position="right">
</umb-overlay>
</div>
@@ -1,62 +1,45 @@
<div>
<div id="applications" ng-class="{faded:stickyNavigation}">
<ul class="sections">
<li class="avatar">
<a href="#" ng-click="avatarClick()" hotkey="ctrl+shift+u" title="{{user.name}}" prevent-default>
<img id="avatar-img" ng-src="{{avatar[0].value}}" ng-srcset="{{avatar[1].value}} 2x, {{avatar[2].value}} 3x" />
</a>
</li>
<li ng-repeat="section in sections | limitTo: maxSections" ng-class="{current: section.alias == currentSection}">
<a href="#/{{section.alias}}"
<nav class="umb-sections">
<a
class="umb-navigation-link"
href="#/{{section.alias}}"
ng-repeat="section in sections | limitTo: maxSections"
ng-class="{'-current': section.alias == currentSection}"
ng-dblclick="sectionDblClick(section)"
ng-click="sectionClick($event, section)"
prevent-default>
<span class="umb-sections__section-name">{{section.name}}</span>
</a>
<span class="umb-navigation-link expand"
ng-class="{ 'open': showTray === true }"
ng-show="needTray"
href ng-click="trayClick()">
<svg class="umb-navigation-more" viewBox="0 0 24 6" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<path class="umb-navigation-more__path" d="M2.76923077,5.53846154 C4.29863469,5.53846154 5.53846154,4.29863469 5.53846154,2.76923077 C5.53846154,1.23982685 4.29863469,0 2.76923077,0 C1.23982685,0 0,1.23982685 0,2.76923077 C0,4.29863469 1.23982685,5.53846154 2.76923077,5.53846154 Z M12,5.53846154 C13.5294039,5.53846154 14.7692308,4.29863469 14.7692308,2.76923077 C14.7692308,1.23982685 13.5294039,0 12,0 C10.4705961,0 9.23076923,1.23982685 9.23076923,2.76923077 C9.23076923,4.29863469 10.4705961,5.53846154 12,5.53846154 Z M21.2307692,5.53846154 C22.7601732,5.53846154 24,4.29863469 24,2.76923077 C24,1.23982685 22.7601732,0 21.2307692,0 C19.7013653,0 18.4615385,1.23982685 18.4615385,2.76923077 C18.4615385,4.29863469 19.7013653,5.53846154 21.2307692,5.53846154 Z"></path>
</g>
</svg>
<div class="umb-sections__tray shadow-depth-2"
ng-show="showTray">
<a class="umb-navigation-link"
ng-repeat="section in sections | limitTo: overflowingSections"
ng-class="{'-current': section.alias == currentSection}"
href="#/{{section.alias}}"
ng-dblclick="sectionDblClick(section)"
ng-click="sectionClick($event, section)"
prevent-default>
<section-icon icon="{{section.cssclass}}"></section-icon>
<span>{{section.name}}</span>
</a>
</li>
<li class="expand" ng-class="{ 'open': showTray === true }" ng-show="needTray">
<a href ng-click="trayClick()">
<i class="icon icon-arrow-right"></i>
</a>
</li>
<li class="help">
<a href class="help" hotkey="ctrl+shift+h" ng-click="helpClick()" prevent-default>
<i class="icon-help-alt"></i>
<span><localize key="sections_help">Help</localize></span>
</a>
</li>
</ul>
</div>
</div>
</span>
<div id="applications-tray" ng-show="showTray" ng-animate="trayAnimation()" style="display: none;">
<ul class="sections sections-tray">
<li ng-repeat="section in sections | limitTo: overflowingSections" ng-class="{current: section.alias == currentSection}">
<a href="#/{{section.alias}}"
ng-dblclick="sectionDblClick(section)"
ng-click="sectionClick($event, section)"
prevent-default>
<section-icon icon="{{section.cssclass}}"></section-icon>
<span>{{section.name}}</span>
</a>
</li>
</ul>
</div>
<umb-overlay
ng-if="helpDialog.show"
model="helpDialog"
view="helpDialog.view"
position="left">
</umb-overlay>
<umb-overlay
ng-if="userDialog.show"
model="userDialog"
view="userDialog.view"
position="left">
</umb-overlay>
</nav>
</div>
@@ -0,0 +1,74 @@
<div class="umb-tree-navigation" ng-show="showTreeNavigation">
<!-- the search
<div ng-controller="Umbraco.SearchController" ng-if="authenticated">
-->
<!-- Search form
<form class="form-search" novalidate>
<i class="icon-search"></i>
<input type="text"
hotkey="ctrl+space"
id="search-field"
ng-model="searchTerm"
class="umb-search-field search-query search-input"
localize="placeholder"
placeholder="@placeholders_search"
ng-keydown="navigateResults($event)"/>
</form>
-->
<!-- Search results
<div ng-show="showSearchResults">
<ul class="umb-tree">
<li class="root">
<div>
<h5 class="umb-tree-header"><localize key="general_searchResults">Search results</localize></h5>
</div>
<ul class="umb-search-group" ng-repeat="group in groups">
<li ng-repeat="result in group.results" ng-class="{'current':selectedItem == result}">
<div class="umb-search-group-item">
<a class="umb-search-group-item-link" ng-class="{'first':$first}" ng-click="searchHide()" ng-href="#/{{result.editorPath}}">
<div class="umb-search-group-item-name">
<i class="icon umb-tree-icon sprTree {{result.icon}}"></i>
{{result.name}}
</div>
<small class="search-subtitle" ng-show="result.subTitle">
{{result.subTitle}}
</small>
</a>
<a href ng-click="searchShowMenu($event, {node: result})" class="umb-options"><i></i><i></i><i></i></a>
</div>
</li>
</ul>
</li>
</ul>
</div>
-->
<!--
</div>
--->
<!--
<div ng-show="!showSearchResults">
<umb-tree
cachekey="_"
eventhandler="treeEventHandler"
section="{{currentSection}}" >
</umb-tree>
</div>
--->
<umb-tree
cachekey="_"
eventhandler="treeEventHandler"
section="{{currentSection}}" >
</umb-tree>
</div>
@@ -0,0 +1 @@
<div class="umb-editor-sub-view-container" ng-transclude></div>
@@ -0,0 +1 @@
<div class="umb-editor-sub-view-content" ng-transclude></div>
@@ -0,0 +1 @@
<div class="umb-editor-sub-view-header" ng-transclude></div>
@@ -0,0 +1 @@
<div class="umb-editor-sub-view-sidebar" ng-transclude></div>
@@ -0,0 +1 @@
<div class="umb-editor-sub-view" ng-transclude></div>
@@ -1,6 +1,8 @@
<div class="umb-editor-container umb-panel-body umb-scrollable row-fluid" ng-class="{'-stop-scrolling': numberOfOverlays > 0}">
<umb-overlay-backdrop></umb-overlay-backdrop>
<div class="umb-pane">
<div ng-transclude></div>
</div>
</div>
<div
class="umb-editor-container"
ng-class="{'-stop-scrolling': numberOfOverlays > 0}"
ng-transclude>
<!--
<umb-overlay-backdrop></umb-overlay-backdrop>
-->
</div>
@@ -1,4 +1,4 @@
<div class="umb-panel-header">
<div class="umb-editor-header">
<div class="umb-panel-header-content-wrapper">
@@ -15,6 +15,10 @@
<div class="umb-panel-header-title-wrapper">
<!--
<div class="umb-editor-header__published-state"></div>
--->
<ng-form name="headerNameForm">
<input
type="text"
@@ -25,16 +29,74 @@
ng-show="!nameLocked"
ng-model="name"
ng-class="{'name-is-empty': $parent.name===null || $parent.name===''}"
ng-disabled="variation"
umb-auto-focus
autocomplete="off"
required />
<div class="umb-editor-header__selected-variations" ng-if="language || variation">
<div class="umb-editor-header__selected-variation" ng-if="language && variations.length > 1">
<i class="umb-editor-header__selected-variation-icon icon-umb-translation"></i>
<div>{{ language }}</div>
</div>
<div class="umb-editor-header__selected-variation" ng-if="variation">
<i class="umb-editor-header__selected-variation-icon icon-documents"></i>
<div>{{ variation }}</div>
</div>
</div>
</ng-form>
<a class="umb-variations-quick-switcher__toggle" href="" ng-if="showVariationsQuickSwitchToggle" ng-click="toggleVariationsQuickSwitch()" ng-class="{'-active' : showVariationsQuickSwitch}">
<span class="umb-variations-quick-switcher__toggle-arrow">&dtrif;</span>
</a>
<ul class="umb-variations-quick-switcher_variations shadow-depth-2" ng-if="showVariationsQuickSwitch" on-outside-click="hideVariationsQuickSwitch()">
<!-- Multiple languages -->
<li ng-repeat="variation in variations" ng-class="{'-active' : variation.showSubItems}">
<a class="umb-variations-quick-switcher__variation" href ng-if="variations.length === 1" ng-click="selectItem(variation)" ng-class="{'-active': variation.active}">
<span class="umb-variations-quick-switcher__variation-published-state" ng-class="{'-published': variation.published}"></span>
<span class="umb-variations-quick-switcher__variation-name">{{variation.name}}</span>
<span class="umb-variations-quick-switcher__variation-description">(Original)</span>
</a>
<a class="umb-variations-quick-switcher__variation" href ng-if="variations.length > 1" ng-click="selectItem(variation)" ng-class="{'-active': variation.active}">
<span class="umb-variations-quick-switcher__variation-published-state" ng-class="{'-published': variation.published}"></span>
<i class="umb-variations-quick-switcher__variation-icon icon-umb-translation"></i>
<span class="umb-variations-quick-switcher__variation-name">{{variation.language}}</span>
<!--
<span class="umb-variations-quick-switcher__variation-toggle" ng-if="variation.variations" ng-click="toggleSubItems(variation, $event)">variations &dtrif;</span>
--->
<span class="umb-variations-quick-switcher__variation-toggle" ng-if="onOpenInSplitView && !variation.active" ng-click="openInSplitView(variation, $event)">Open in splitview</span>
</a>
<ul class="umb-variations-quick-switcher__subnav">
<li ng-repeat="test in variation.variations">
<a class="umb-variations-quick-switcher__variation" href ng-click="selectItem(test)" ng-class="{'-active': test.active}">
<span class="umb-variations-quick-switcher__variation-published-state" ng-class="{'-published': test.published}"></span>
<i class="umb-variations-quick-switcher__variation-icon icon-documents"></i>
<span class="umb-variations-quick-switcher__variation-name">{{ test.variationName }}</span>
<span class="umb-variations-quick-switcher__variation-description" ng-if="test.variationDescription">({{ test.variationDescription }})</span>
<span class="umb-variations-quick-switcher__variation-toggle" ng-if="onOpenInSplitView && !test.active" ng-click="openInSplitView(test, $event)">Open in splitview</span>
</a>
</li>
</ul>
</li>
</ul>
<div class="umb-panel-header-name" ng-if="nameLocked">{{ name }}</div>
<umb-generate-alias class="umb-panel-header-alias"
ng-if="!hideAlias"
alias="$parent.alias"
alias-from="$parent.name"
<umb-generate-alias class="umb-panel-header-alias"
ng-if="!hideAlias"
alias="$parent.alias"
alias-from="$parent.name"
enable-lock="true"
server-validation-field="Alias"></umb-generate-alias>
@@ -55,7 +117,7 @@
</div>
<umb-tabs-nav ng-if="tabs" model="tabs"></umb-tabs-nav>
<!-- <umb-tabs-nav ng-if="tabs" model="tabs"></umb-tabs-nav> -->
</div>
@@ -1,15 +1,37 @@
<div>
<ul class="umb-sub-views-nav" ng-if="showNavigation">
<li ng-repeat="item in navigation">
<a tabindex="-1"
class="umb-sub-views-nav-item"
href=""
ng-click="clickNavigationItem(item)"
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>
</a>
</li>
</ul>
<ul class="umb-sub-views-nav" ng-if="showNavigation">
<li ng-repeat="item in navigation | limitTo: maxNavigationItems" class="umb-sub-views-nav-items">
<a tabindex="-1" class="umb-sub-views-nav-item" href="" ng-click="clickNavigationItem(item)" 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>
</a>
</li>
<li class="umb-sub-views-nav-items" ng-if="needDropdown" ng-click="toggleDropdown()">
<a href="" class="umb-sub-views-nav-item">
<svg class="umb-navigation-more" viewBox="0 0 24 6" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<path class="umb-navigation-more__path" d="M2.76923077,5.53846154 C4.29863469,5.53846154 5.53846154,4.29863469 5.53846154,2.76923077 C5.53846154,1.23982685 4.29863469,0 2.76923077,0 C1.23982685,0 0,1.23982685 0,2.76923077 C0,4.29863469 1.23982685,5.53846154 2.76923077,5.53846154 Z M12,5.53846154 C13.5294039,5.53846154 14.7692308,4.29863469 14.7692308,2.76923077 C14.7692308,1.23982685 13.5294039,0 12,0 C10.4705961,0 9.23076923,1.23982685 9.23076923,2.76923077 C9.23076923,4.29863469 10.4705961,5.53846154 12,5.53846154 Z M21.2307692,5.53846154 C22.7601732,5.53846154 24,4.29863469 24,2.76923077 C24,1.23982685 22.7601732,0 21.2307692,0 C19.7013653,0 18.4615385,1.23982685 18.4615385,2.76923077 C18.4615385,4.29863469 19.7013653,5.53846154 21.2307692,5.53846154 Z"></path>
</g>
</svg>
<span class="umb-sub-views-nav-item-text">More</span>
</a>
</li>
</ul>
<div class="umb-sub-views-nav__dropdown shadow-depth-2" ng-if="showDropdown" on-outside-click="closeDropdown()">
<ul class="umb-sub-views-nav">
<li ng-repeat="item in navigation | limitTo: overflowingNavigationsItems" class="umb-sub-views-nav-items">
<a tabindex="-1" class="umb-sub-views-nav-item" href="" ng-click="clickNavigationItem(item)" 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>
</a>
</li>
</ul>
</div>
</div>
@@ -3,7 +3,7 @@
id="sub-view-{{$index}}"
ng-repeat="subView in subViews"
ng-include="subView.view"
ng-show="activeView.name == subView.name"
ng-show="subView.active"
ng-class="'sub-view-' + subView.name"
val-sub-view>
</div>
@@ -0,0 +1 @@
<div class="umb-editor-toolbar" ng-transclude></div>
@@ -1,4 +1,4 @@
<div class="umb-panel umb-editor-wrapper animated -half-second fadeIn"
<div class="umb-panel umb-editor-wrapper"
ng-class="{
'-no-footer': footer === 'false'
}"
@@ -1,3 +1,8 @@
<div class="umb-property-editor" ng-class="{'-not-clickable': preview}">
<!--
<div class="umb-property-editor__overlay" ng-if="model.variation">
<div class="umb-property-editor__overlay-label">Gets content from {{model.variation.name}}</div>
</div>
--->
<div ng-include="propertyEditorView"></div>
</div>
@@ -1,14 +1,46 @@
<div class="umb-property">
<ng-form name="propertyForm">
<div class="control-group umb-control-group" ng-class="{hidelabel:property.hideLabel}" >
<val-property-msg property="property"></val-property-msg>
<div class="umb-el-wrap">
<label class="control-label" ng-hide="property.hideLabel" for="{{property.alias}}" ng-attr-title="{{propertyAlias}}">
{{property.label}}
<small ng-bind-html="property.description"></small>
<small ng-if="property.description" ng-bind-html="property.description"></small>
<!--
<div class="umb-property-editor__dropdown-toggling" ng-class="{'-active' : showDropdown}">
<div class="umb-property-editor__dropdown-toggle" ng-click="toggleDropdown()">
<div ng-if="property.variation"><i class="icon-sync"></i>from {{ property.variation.name }} &dtrif;</div>
<div ng-if="!property.variation"><i class="icon-sync"></i>from &dtrif;</div>
</div>
<div class="umb-property-editor__dropdown shadow-depth-2" ng-if="showDropdown" on-outside-click="closeDropdown()">
<div class="umb-property-editor__dropdown-item">
<a class="umb-property-editor__dropdown-link -sync-off" ng-click="editContent()" href="">
<i class="icon-sync"></i>Off
</a>
</div>
<div class="umb-property-editor__dropdown-filter" ng-if="variations.length > 9">
<input type="search"class="-full-width-input" placeholder="Search for variants" ng-model="searchTerm" umb-auto-focus>
</div>
<ul class="umb-property-editor__dropdown-items">
<li class="umb-property-editor__dropdown-item" ng-repeat="variation in variations | filter:searchTerm">
<a class="umb-property-editor__dropdown-link" ng-click="syncContent(variation)" href="">{{ variation.name }}</a>
</li>
</ul>
</div>
</div>
--->
</label>
<div class="controls" ng-transclude>
@@ -16,4 +48,4 @@
</div>
</div>
</ng-form>
</div>
</div>
@@ -1,5 +1,5 @@
<ul class="nav nav-tabs umb-nav-tabs">
<li ng-class="{'tab-error': tabHasError}" ng-repeat="tab in model" val-tab>
<a data-toggle="tab" href="#tab{{tab.id}}">{{ tab.label }}</a>
</li>
<ul class="umb-tabs-nav">
<li class="umb-tabs-nav__tab" ng-class="{'tab-error': tabHasError}" ng-repeat="tab in model" val-tab>
<a data-toggle="tab" href="#tab{{tab.id}}">{{ tab.label }}</a>
</li>
</ul>
@@ -0,0 +1,174 @@
<div class="umb-variations">
<umb-empty-state
ng-if="(variations | filter:{active:true}).length === 0"
position="center">
It is not possible to make variations of a variation
</umb-empty-state>
<div ng-if="(variations | filter:{active:true}).length > 0">
<div class="umb-variations__title-wrapper">
<div class="umb-variations__title">Variations</div>
</div>
<p class="umb-variations__help-text">Manage multiple variations of your content here. Create, duplicate or delete variations.</p>
<!-- VARIATIONS LANG GROUP -->
<div class="umb-varations__lang-group" ng-repeat="language in variations | filter:{active:true}">
<div class="umb-varations__lang-group-info">
<div class="umb-varations__lang-group-info__name" ng-click="clickVariation(variation, $event, $index)">
<div class="umb-varations__published-state" ng-class="{'-published': language.published}"></div>
<div ng-if="variations.length === 1">
<a href="" class="umb-varations__lang-group-info__link">{{ language.name }}</a>
<small>(Original)</small>
</div>
<div ng-if="variations.length > 1">
<i class="icon-globe-alt" ng-if="variations.length > 1"></i>
{{ language.language }}
</div>
</div>
<div class="umb-variations__actions" ng-if="language.published">
<div class="umb-variations__action" ng-click="showNewVariation(language)">
<span>Create variation</span>
</div>
</div>
</div>
<!-- CREATE -->
<div class="umb-variations__edit-list-item" ng-if="language.showNewVariation">
<div class="umb-variations__form-group">
<label class="umb-variations__label">Name</label>
<input class="-full-width-input" type="text" ng-model="newVariation.name" umb-auto-focus />
</div>
<div class="umb-variations__form-group">
<label class="umb-variations__label">Description</label>
<input class="-full-width-input" type="text" ng-model="newVariation.description" />
</div>
<div class="umb-variations__form-group">
<label class="umb-variations__label">Segments</label>
<div class="umb-variations__tags">
<label class="umb-variations__tag" ng-repeat="segment in segments">
<input
type="checkbox"
class="checkbox"
checklist-model="newVariation.segments"
checklist-value="segment.id">
<span>{{segment.name}}</span>
</label>
</div>
</div>
<div class="umb-variations__form-group form-group-actions">
<umb-button
action="createNewVariation(newVariation, language)"
button-style="success"
label="Create variation"
type="button">
</umb-button>
<umb-button
action="hideNewVariation(language)"
button-style="link"
label="Cancel"
type="button">
</umb-button>
</div>
</div>
<!-- VARIATIONS LIST -->
<ul class="umb-variations__list" ui-sortable="variationsSortableOptions" ng-model="language.variations">
<li class="umb-variations__list-item-wrapper" ng-repeat="variation in language.variations">
<!-- VIEW -->
<div class="umb-variations__list-item" ng-class="{'-edit-mode': variation.editVariation}">
<div class="umb-variations__variation-top-bar">
<div class="umb-varations__published-state" ng-class="{'-published': variation.published}"></div>
<div class="umb-variations__name-wrapper">
<i class="umb-variations__name-icon icon-documents"></i>
<div class="umb-variations__name">{{ variation.variationName }}</div>
<div class="umb-variations__description" ng-if="variation.variationDescription">({{ variation.variationDescription }})</div>
</div>
<div class="umb-variations__list-item__edit" ng-click="toggleEditVariation(variation)">
Edit
</div>
</div>
</div>
<!-- EDIT -->
<div class="umb-variations__edit-list-item" ng-if="variation.editVariation">
<div class="umb-variations__form-group">
<label class="umb-variations__label">Name</label>
<input class="-full-width-input" type="text" ng-model="variation.variationName" umb-auto-focus/>
</div>
<div class="umb-variations__form-group">
<label class="umb-variations__label">Description</label>
<input class="-full-width-input" type="text" ng-model="variation.variationDescription" />
</div>
<div class="umb-variations__form-group">
<label class="umb-variations__label">Segments</label>
<div class="umb-variations__tags">
<label class="umb-variations__tag" ng-repeat="segment in segments">
<input
type="checkbox"
class="checkbox"
checklist-model="variation.segments"
checklist-value="segment.id">
<span>{{segment.name}}</span>
</label>
</div>
</div>
<div class="umb-variations__form-group form-group-actions">
<umb-button
action="saveVariation(variation, language)"
button-style="success"
label="Save variation"
type="button">
</umb-button>
<umb-button
action="deleteVariation(variation, language)"
label="Delete variation"
type="button">
</umb-button>
<umb-button
action="hideEditVariation(variation)"
button-style="link"
label="Cancel"
type="button">
</umb-button>
</div>
</div>
</li>
</ul>
</div>
</div>
</div>
@@ -2,11 +2,11 @@
* @ngdoc controller
* @name Umbraco.Editors.Content.EditController
* @function
*
*
* @description
* The controller for the content editor
*/
function ContentEditController($scope, $rootScope, $routeParams, $q, $timeout, $window, appState, contentResource, entityResource, navigationService, notificationsService, angularHelper, serverValidationManager, contentEditingHelper, treeService, fileManager, formHelper, umbRequestHelper, keyboardService, umbModelMapper, editorState, $http) {
function ContentEditController($scope, $rootScope, $routeParams, $q, $timeout, $window, $filter, appState, contentResource, entityResource, navigationService, notificationsService, angularHelper, serverValidationManager, contentEditingHelper, treeService, fileManager, formHelper, umbRequestHelper, keyboardService, umbModelMapper, editorState, $http, variationsHelper, eventsService) {
//setup scope vars
$scope.defaultButton = null;
@@ -47,8 +47,88 @@ function ContentEditController($scope, $rootScope, $routeParams, $q, $timeout, $
});
}
}
// fake variations
// set up English locale as master
var english = angular.copy(content);
english.language = "English (United States)";
english.active = true;
english.variations = [];
variationsHelper.setMaster(english);
var danish = angular.copy(content);
danish.language = "Danish";
danish.variations = [];
variationsHelper.createVariation(danish);
var spanish = angular.copy(content);
spanish.language = "Spanish";
spanish.variations = [];
variationsHelper.createVariation(spanish);
$scope.variations = variationsHelper.getVariations();
// fake apps
$scope.page.navigation = [
{
"name": "Variations",
"icon": "icon-documents",
"view": "views/content/views/variations/variations.html"
},
{
"name": "Activity",
"icon": "icon-activity",
"view": "views/content/views/activity/activity.html"
},
{
"name": "Permissions",
"icon": "icon-keychain",
"view": "views/content/views/permissions/permissions.html"
},
{
"name": "Notifications",
"icon": "icon-megaphone",
"view": "views/content/views/notifications/notifications.html"
}
];
for(var i = 0; i < content.tabs.length; i++) {
var tab = content.tabs[i];
var app = {
"name": tab.label,
"icon": "icon-document",
"view": "views/content/views/default/default.html",
"properties": tab.properties,
"sortOrder": i + 1
};
$scope.page.navigation.push(app);
}
$scope.page.navigation = $filter('orderBy')($scope.page.navigation, 'sortOrder');
$scope.page.navigation[0].active = true;
if($scope.variations && $scope.variations.length > 0) {
$scope.content = null;
$scope.content = $scope.variations[0];
}
}
$scope.changeVariation = function(variation) {
$scope.content = null;
$scope.content = variation;
};
$scope.openInSplitView = function(variation) {
var view = {
id: variation.id,
view: "views/content/edit.html"
};
eventsService.emit("splitView.open", view);
};
/** Syncs the content item to it's tree node - this occurs on first load and after saving */
function syncTreeNode(content, path, initialLoad) {
@@ -7,29 +7,28 @@
novalidate
val-form-manager>
<umb-editor-view ng-if="!page.loading" umb-tabs>
<umb-editor-view ng-if="!page.loading">
<umb-editor-header
menu="page.menu"
name="content.name"
tabs="content.tabs"
variation="content.variationName"
language="content.language"
variations="variations"
on-open-in-split-view="openInSplitView"
on-select-item="changeVariation"
navigation="page.navigation"
hide-icon="true"
hide-description="true"
hide-alias="true">
</umb-editor-header>
<umb-editor-container>
<umb-tabs-content class="form-horizontal" view="true">
<umb-tab id="tab{{tab.id}}" ng-repeat="tab in content.tabs" rel="{{tab.id}}">
<umb-property ng-repeat="property in tab.properties" property="property">
<umb-editor model="property"></umb-editor>
</umb-property>
</umb-tab>
</umb-tabs-content>
<umb-editor-sub-views
ng-if="!page.loading"
sub-views="page.navigation"
model="content">
</umb-editor-sub-views>
</umb-editor-container>
@@ -0,0 +1 @@
Activity view
@@ -0,0 +1,73 @@
(function() {
'use strict';
function ContentController($scope) {
var vm = this;
vm.showGenericProperties = false;
vm.genericProperties = {};
vm.sidebarTabs = [{
active: true,
id: 1,
label: "Details",
alias: "details"
}, {
active: false,
id: 2,
label: "Activity",
alias: "activity"
}
];
vm.toggleGenericProperties = toggleGenericProperties;
function activate() {
setGenericProperties($scope.model.tabs);
hideGenericPropertiesTab($scope.model.tabs);
setUniqueTabId($scope.model.tabs);
}
function hideGenericPropertiesTab(tabs) {
for(var i = 0; i < tabs.length; i++) {
var tab = tabs[i];
if(tab.alias === "Generic properties") {
tab.hidden = true;
}
}
}
function toggleGenericProperties() {
if(vm.showGenericProperties === true) {
vm.showGenericProperties = false;
} else {
vm.showGenericProperties = true;
}
}
function setGenericProperties(tabs) {
for(var i = 0; i < tabs.length; i++) {
var tab = tabs[i];
if(tab.alias === "Generic properties") {
vm.genericProperties = tab;
}
}
}
function setUniqueTabId(tabs) {
for(var i = 0; i < tabs.length; i++) {
var tab = tabs[i];
if(tab.alias !== "Generic properties") {
tab.id = Math.floor(Math.random() * 10000000000) + 1;
}
}
}
activate();
}
angular.module("umbraco").controller("Umbraco.Editors.Content.ContentController", ContentController);
})();
@@ -0,0 +1,137 @@
<umb-editor-sub-view ng-controller="Umbraco.Editors.Content.ContentController as vm">
<umb-editor-sub-view-header umb-tabs>
<div class="umb-editor-sub-view-header__content-left">
<umb-tabs-nav ng-if="model.tabs" model="model.tabs"></umb-tabs-nav>
</div>
<div class="umb-editor-sub-view-header__content-right">
<a href="" ng-repeat="tool in editorToolbar" ng-click="tool.action()">
<i ng-class="tool.icon"></i>
</a>
<a class="editor-toolbar-properties" href="" ng-click="vm.toggleGenericProperties()">
<i class="icon-info"></i>
</a>
</div>
</umb-editor-sub-view-header>
<umb-editor-sub-view-container>
<umb-editor-sub-view-content>
<umb-tabs-content class="form-horizontal" view="true">
<umb-tab id="tab{{tab.id}}" ng-repeat="tab in model.tabs" rel="{{tab.id}}" ng-hide="tab.hidden">
<umb-property ng-repeat="property in tab.properties" property="property">
<umb-editor model="property"></umb-editor>
</umb-property>
</umb-tab>
</umb-tabs-content>
<umb-empty-state position="center" ng-if="model.tabs.length - 1 === 0">
Some text here about no content can be added
</umb-empty-state>
</umb-editor-sub-view-content>
<umb-editor-sub-view-sidebar ng-if="vm.showGenericProperties">
<div class="umb-editor-sub-view-sidebar-header">
<div class="umb-editor-sub-view-sidebar-title">
Document Information
<i class="icon-wrong" ng-click="vm.toggleGenericProperties()"></i>
</div>
<umb-tabs-nav ng-if="vm.sidebarTabs" model="vm.sidebarTabs"></umb-tabs-nav>
</div>
<div class="umb-editor-sub-view-sidebar-container">
<umb-tabs-content>
<umb-tab id="tab{{tab.id}}" ng-repeat="tab in vm.sidebarTabs" rel="{{tab.id}}">
<div ng-if="tab.alias==='details'">
<umb-property ng-repeat="property in vm.genericProperties.properties" property="property">
<umb-editor model="property"></umb-editor>
</umb-property>
</div>
<div ng-if="tab.alias==='activity'">
<ul class="umb-activity">
<li class="umb-activity-item">
<span class="umb-activity-item-name">
Activity item 1
</span>
<a class="umb-activity-item-rollback" href="">
Rollback
<i class="icon-refresh"></i>
</a>
</li>
<li class="umb-activity-item">
<span class="umb-activity-item-name">
Activity item 2
</span>
<a class="umb-activity-item-rollback" href="">
Rollback
<i class="icon-refresh"></i>
</a>
</li>
<li class="umb-activity-item">
<span class="umb-activity-item-name">
Activity item 3
</span>
<a class="umb-activity-item-rollback" href="">
Rollback
<i class="icon-refresh"></i>
</a>
</li>
<li class="umb-activity-item">
<span class="umb-activity-item-name">
Activity item 4
</span>
<a class="umb-activity-item-rollback" href="">
Rollback
<i class="icon-refresh"></i>
</a>
</li>
<li class="umb-activity-item">
<span class="umb-activity-item-name">
Activity item 5
</span>
<a class="umb-activity-item-rollback" href="">
Rollback
<i class="icon-refresh"></i>
</a>
</li>
<li class="umb-activity-item">
<span class="umb-activity-item-name">
Activity item 6
</span>
<a class="umb-activity-item-rollback" href="">
Rollback
<i class="icon-refresh"></i>
</a>
</li>
</ul>
</div>
</umb-tab>
</umb-tabs-content>
</div>
<!-- <div class="umb-editor-sub-view-sidebar-footer">
flax
</div> -->
</umb-editor-sub-view-sidebar>
</umb-editor-sub-view-container>
</umb-editor-sub-view>
@@ -0,0 +1,15 @@
<umb-editor-sub-view>
<umb-editor-sub-view-container>
<umb-editor-sub-view-content class="form-horizontal">
<umb-property ng-repeat="property in subView.properties" property="property">
<umb-editor model="property"></umb-editor>
</umb-property>
</umb-editor-sub-view-content>
</umb-editor-sub-view-container>
</umb-editor-sub-view>
@@ -0,0 +1,13 @@
<umb-editor-sub-view>
<umb-editor-sub-view-container>
<umb-editor-sub-view-content>
Notifications
</umb-editor-sub-view-content>
</umb-editor-sub-view-container>
</umb-editor-sub-view>
@@ -0,0 +1,13 @@
<umb-editor-sub-view>
<umb-editor-sub-view-container>
<umb-editor-sub-view-content>
Permissions
</umb-editor-sub-view-content>
</umb-editor-sub-view-container>
</umb-editor-sub-view>
@@ -0,0 +1,49 @@
(function() {
'use strict';
function VariationsController($scope, variationsHelper) {
var vm = this;
vm.variations = [];
vm.clickVariation = clickVariation;
vm.saveVariation = saveVariation;
vm.cloneVariation = cloneVariation;
vm.deleteVariation = deleteVariation;
function activate() {
vm.variations = variationsHelper.getVariations();
}
function clickVariation(variation, event, index) {
$scope.model = null;
$scope.model = variation;
for(var i = 0; i < $scope.subViews; i++) {
var subView = scope.subViews[i];
subView.active = false;
}
$scope.subViews[0].active = true;
}
function saveVariation(variation, event, index) {
variationsHelper.saveVariation(variation);
}
function cloneVariation(variation, event, index) {
variationsHelper.cloneVariation(variation, event, index);
}
function deleteVariation(variation, event, index) {
variationsHelper.deleteVariation(variation, event, index);
}
activate();
}
angular.module("umbraco").controller("Umbraco.Editors.Content.VariationsController", VariationsController);
})();
@@ -0,0 +1,19 @@
<umb-editor-sub-view ng-controller="Umbraco.Editors.Content.VariationsController as vm">
<umb-editor-sub-view-container>
<umb-editor-sub-view-content>
<umb-variations
variations="vm.variations"
on-save-variation="vm.saveVariation"
on-click-variation="vm.clickVariation"
on-clone-variation="vm.cloneVariation"
on-delete-variation="vm.deleteVariation">
</umb-variations>
</umb-editor-sub-view-content>
</umb-editor-sub-view-container>
</umb-editor-sub-view>
@@ -21,28 +21,32 @@
<umb-editor-container class="form-horizontal">
<umb-property property="properties.selectedEditor">
<div>
<select name="selectedEditor"
ng-model="content.selectedEditor"
required
ng-options="e.alias as e.name for e in content.availableEditors"></select>
<span class="help-inline" val-msg-for="selectedEditor" val-toggle-msg="required">Required</span>
</div>
<div class="umb-editor-content">
</umb-property>
<umb-property property="properties.selectedEditor">
<div>
<select name="selectedEditor"
ng-model="content.selectedEditor"
required
ng-options="e.alias as e.name for e in content.availableEditors"></select>
<span class="help-inline" val-msg-for="selectedEditor" val-toggle-msg="required">Required</span>
</div>
<umb-property property="properties.selectedEditorId">
<div>{{content.selectedEditor}}</div>
</umb-property>
</umb-property>
<umb-property property="properties.selectedEditorId">
<div>{{content.selectedEditor}}</div>
</umb-property>
<umb-property
property="preValue"
ng-repeat="preValue in preValues">
<umb-property
property="preValue"
ng-repeat="preValue in preValues">
<umb-editor model="preValue" is-pre-value="true"></umb-editor>
</umb-property>
<umb-editor model="preValue" is-pre-value="true"></umb-editor>
</umb-property>
</div>
</umb-editor-container>
@@ -16,12 +16,14 @@
<umb-editor-container class="editors-document-type-container">
<div class="editors-document-type-canvas">
<umb-editor-sub-views
ng-if="!vm.page.loading"
sub-views="vm.page.navigation"
model="vm.contentType">
</umb-editor-sub-views>
<div class="umb-editor-content">
<div class="editors-document-type-canvas">
<umb-editor-sub-views
ng-if="!vm.page.loading"
sub-views="vm.page.navigation"
model="vm.contentType">
</umb-editor-sub-views>
</div>
</div>
</umb-editor-container>
@@ -40,7 +42,7 @@
<umb-button
ng-if="!vm.page.modelsBuilder"
type="button"
type="button"
action="vm.save()"
state="vm.page.saveButtonState"
button-style="success"
@@ -17,17 +17,25 @@
hide-alias="true">
</umb-editor-header>
<umb-editor-container>
<umb-editor-toolbar umb-tabs>
<umb-tabs-nav ng-if="content.tabs" model="content.tabs"></umb-tabs-nav>
</umb-editor-toolbar>
<umb-tabs-content view="true" class="form-horizontal">
<umb-tab id="tab{{tab.id}}" rel="{{tab.id}}" ng-repeat="tab in content.tabs">
<umb-editor-container umb-tabs>
<umb-property property="property" ng-repeat="property in tab.properties">
<umb-editor model="property"></umb-editor>
</umb-property>
<div class="umb-editor-content">
</umb-tab>
</umb-tabs-content>
<umb-tabs-content view="true" class="form-horizontal">
<umb-tab id="tab{{tab.id}}" rel="{{tab.id}}" ng-repeat="tab in content.tabs">
<umb-property property="property" ng-repeat="property in tab.properties">
<umb-editor model="property"></umb-editor>
</umb-property>
</umb-tab>
</umb-tabs-content>
</div>
</umb-editor-container>
@@ -16,12 +16,16 @@
<umb-editor-container class="editors-document-type-container">
<div class="editors-document-type-canvas">
<umb-editor-sub-views
ng-if="!vm.page.loading"
sub-views="vm.page.navigation"
model="vm.contentType">
</umb-editor-sub-views>
<div class="umb-editor-content">
<div class="editors-document-type-canvas">
<umb-editor-sub-views
ng-if="!vm.page.loading"
sub-views="vm.page.navigation"
model="vm.contentType">
</umb-editor-sub-views>
</div>
</div>
</umb-editor-container>
@@ -19,15 +19,19 @@
<umb-editor-container>
<umb-tabs-content view="true" class="form-horizontal">
<umb-tab id="tab{{tab.id}}" rel="{{tab.id}}" ng-repeat="tab in content.tabs">
<div class="umb-editor-content">
<umb-property property="property" ng-repeat="property in tab.properties">
<umb-editor model="property"></umb-editor>
</umb-property>
<umb-tabs-content view="true" class="form-horizontal">
<umb-tab id="tab{{tab.id}}" rel="{{tab.id}}" ng-repeat="tab in content.tabs">
</umb-tab>
</umb-tabs-content>
<umb-property property="property" ng-repeat="property in tab.properties">
<umb-editor model="property"></umb-editor>
</umb-property>
</umb-tab>
</umb-tabs-content>
</div>
</umb-editor-container>
@@ -16,12 +16,16 @@
<umb-editor-container class="editors-document-type-container">
<div class="editors-document-type-canvas">
<umb-editor-sub-views
ng-if="!vm.page.loading"
sub-views="vm.page.navigation"
model="vm.contentType">
</umb-editor-sub-views>
<div class="umb-editor-content">
<div class="editors-document-type-canvas">
<umb-editor-sub-views
ng-if="!vm.page.loading"
sub-views="vm.page.navigation"
model="vm.contentType">
</umb-editor-sub-views>
</div>
</div>
</umb-editor-container>
@@ -5,7 +5,7 @@
<user>0</user>
<startNode>1080</startNode>
<fullTree>False</fullTree>
<documentTypeAlias>Articulate</documentTypeAlias>
<documentTypeAlias>grid</documentTypeAlias>
<fields>
<categories>
</categories>
@@ -59,11 +59,24 @@
<umb-navigation></umb-navigation>
<section id="contentwrapper">
<div id="contentcolumn" ng-view>
<umb-tree-navigation></umb-tree-navigation>
<div id="contentcolumn" class="splitview--views" ng-cloak>
<div class="splitview--view">
<ng-view></ng-view>
</div>
<div class="splitview--divider" ng-if="splitView.show"></div>
<div class="splitview--view" ng-if="splitView.show">
<div class="splitview--close" ng-click="closeSplitView()">Close</div>
<div ng-include="splitView.view"></div>
</div>
<umb-notifications></umb-notifications>
</div>
</section>
<umb-notifications></umb-notifications>
</div>