Merge remote-tracking branch 'origin/7.0.0' into 7.0.0

This commit is contained in:
Shannon
2013-09-24 13:34:36 +10:00
63 changed files with 369 additions and 238 deletions

File diff suppressed because one or more lines are too long

View File

@@ -33,13 +33,14 @@ angular.module("umbraco.directives")
scope.opts.nested= cfg.nested || true,
scope.opts.drop= cfg.drop || true,
scope.opts.drag= cfg.drag || true,
/*
scope.opts.isValidTarget = function(item, container) {
if(container.el.is(".umb-" + scope.opts.group + "-container")){
return true;
}
return false;
};
*/
element.addClass("umb-sort");
element.addClass("umb-" + cfg.group + "-container");
@@ -53,47 +54,66 @@ angular.module("umbraco.directives")
scope.opts.onDrop = function (item, targetContainer, _super) {
var children = $("li", targetContainer.el);
var targetScope = $(targetContainer.el[0]).scope();
var targetIndex = children.index(item);
if(targetScope.opts.onDropHandler){
var args = {
sourceScope: umbSortContextInternal.sourceScope,
sourceIndex: umbSortContextInternal.sourceIndex,
sourceContainer: umbSortContextInternal.sourceContainer,
targetScope: targetScope,
targetIndex: targetIndex,
targetContainer: targetContainer
};
targetScope.opts.onDropHandler.call(this, item, args);
}
if(umbSortContextInternal.sourceScope.opts.onReleaseHandler){
var _args = {
sourceScope: umbSortContextInternal.sourceScope,
sourceIndex: umbSortContextInternal.sourceIndex,
sourceContainer: umbSortContextInternal.sourceContainer,
targetScope: targetScope,
targetIndex: targetIndex,
targetContainer: targetContainer
};
umbSortContextInternal.sourceScope.opts.onReleaseHandler.call(this, item, _args);
}
var clonedItem = $('<li/>').css({height: 0});
item.before(clonedItem);
item.after(clonedItem);
clonedItem.animate({'height': item.height()});
item.animate(clonedItem.position(), function () {
clonedItem.detach();
_super(item);
});
var children = $("li", targetContainer.el);
var targetIndex = children.index(item);
var targetScope = $(targetContainer.el[0]).scope();
if(targetScope === umbSortContextInternal.sourceScope){
if(umbSortContextInternal.sourceScope.opts.onSortHandler){
var _largs = {
oldIndex: umbSortContextInternal.sourceIndex,
newIndex: targetIndex,
scope: umbSortContextInternal.sourceScope
};
umbSortContextInternal.sourceScope.opts.onSortHandler.call(this, item, _largs);
}
}else{
if(targetScope.opts.onDropHandler){
var args = {
sourceScope: umbSortContextInternal.sourceScope,
sourceIndex: umbSortContextInternal.sourceIndex,
sourceContainer: umbSortContextInternal.sourceContainer,
targetScope: targetScope,
targetIndex: targetIndex,
targetContainer: targetContainer
};
targetScope.opts.onDropHandler.call(this, item, args);
}
if(umbSortContextInternal.sourceScope.opts.onReleaseHandler){
var _args = {
sourceScope: umbSortContextInternal.sourceScope,
sourceIndex: umbSortContextInternal.sourceIndex,
sourceContainer: umbSortContextInternal.sourceContainer,
targetScope: targetScope,
targetIndex: targetIndex,
targetContainer: targetContainer
};
umbSortContextInternal.sourceScope.opts.onReleaseHandler.call(this, item, _args);
}
}
item.animate(clonedItem.position(), function () {
clonedItem.detach();
_super(item);
});
};
scope.changeIndex = function(from, to){

View File

@@ -18,6 +18,8 @@ function sectionMocks($httpBackend, mocksUtils) {
{ name: "Media", cssclass: "icon-umb-media", alias: "media" },
{ name: "Settings", cssclass: "icon-umb-settings", alias: "settings" },
{ name: "Developer", cssclass: "icon-umb-developer", alias: "developer" },
{ name: "Users", cssclass: "icon-umb-users", alias: "users" },
{ name: "Developer", cssclass: "icon-umb-developer", alias: "developer" },
{ name: "Users", cssclass: "icon-umb-users", alias: "users" }
];

View File

@@ -122,7 +122,7 @@ function mediaResource($q, $http, umbDataFormatter, umbRequestHelper) {
"mediaApiBaseUrl",
"GetByIds",
idQuery)),
'Failed to retreive data for media id ' + id);
'Failed to retreive data for media ids ' + ids);
},
/**

View File

@@ -64,8 +64,7 @@ angular.module('umbraco.services')
var dialog = angular.extend(defaults, options);
var scope = options.scope || $rootScope.$new();
delete dialog.scope;
//Modal dom obj and unique id
dialog.element = $('<div ng-swipe-left="hide()" ng-swipe-right="hide()" data-backdrop="false"></div>');
var id = dialog.template.replace('.html', '').replace('.aspx', '').replace(/[\/|\.|:\&\?\=]/g, "-") + '-' + scope.$id;
@@ -78,6 +77,7 @@ angular.module('umbraco.services')
dialog.element.addClass("modal");
dialog.element.addClass("hide");
}
//set the id and add classes
dialog.element
.attr('id', id)
@@ -332,8 +332,9 @@ angular.module('umbraco.services')
* @returns {Object} modal object
*/
macroPicker: function (options) {
options.template = 'views/common/dialogs/macroPicker.html';
options.template = 'views/common/dialogs/insertmacro.html';
options.show = true;
options.modalClass = "span7 umb-modal";
return openDialog(options);
},

View File

@@ -310,9 +310,7 @@ function tinyMceService(dialogService, $log, imageHelper, assetsService, $timeou
/** The insert macro button click event handler */
onclick: function () {
dialogService.open({
show: true,
template: "views/common/dialogs/insertmacro.html",
dialogService.macroPicker({
scope: $scope,
callback: function(data) {

View File

@@ -8,6 +8,7 @@
*/
// Core variables and mixins
@import "fonts.less"; // Loading fonts
@import "variables.less"; // Modify this for custom colors, font-sizes, etc
@import "mixins.less";
@@ -23,7 +24,7 @@
@import "../../lib/bootstrap/less/type.less";
@import "../../lib/bootstrap/less/code.less";
@import "tables.less";
@import "colors.less";
// Components: common
//@import "../../lib/bootstrap/less/sprites.less";
@@ -82,4 +83,4 @@
//used for property editors
@import "property-editors.less";
@import "hacks.less"; // Remove and rewrite before release
@import "hacks.less";

View File

@@ -1 +0,0 @@
i.red{color: #b94a48;}

View File

@@ -0,0 +1,9 @@
/*
Open Sans
Normal: font-weight: 400;
Semi-bold: font-weight: 600;
*/
@import url(http://fonts.googleapis.com/css?family=Open+Sans:400italic,600italic,400,600);

View File

@@ -24,6 +24,12 @@ label.control-label {
.controls-row label{padding: 0px 10px 0px 10px; vertical-align: center}
//standard editor width
.umb-editor{width: 460px;}
//utill styll to hide child untill hover
.hover-show{visibility: hidden;}
*:hover > .hover-show{visibility: visible;}

View File

@@ -76,6 +76,7 @@ iframe, .content-column-body {
background-size: contain;
display: none;
}
.fileupload-processing .fileupload-loading {
display: block;
}

View File

@@ -163,13 +163,13 @@ i.small{
.icon-umb-deploy:before {
content: "\e027";
}
.icon-umb-contour:before, .traycontent:before, {
.icon-umb-contour:before, .traycontour:before, {
content: "\e028";
}
.icon-umb-settings:before, .traysettings:before, {
content: "\e029";
}
.icon-umb-users:before, .trayusers:before, {
.icon-umb-users:before, .trayuser:before, .trayusers:before{
content: "\e02a";
}
.icon-umb-media:before, .traymedia:before, {

View File

@@ -1,6 +1,7 @@
// Listview
// -------------------------
.umb-listview{width: auto !important;}
.umb-listview .dropdown-menu {
border: 1px solid #ccc;
border: 1px solid rgba(0, 0, 0, 0.2);

View File

@@ -147,13 +147,17 @@ div.umb-codeeditor .umb-btn-toolbar {
}
/* FORM GRID */
.umb-pane {
margin: 30px 20px;
}
.umb-control-group {
border-bottom: 1px solid @grayLighter;
padding-bottom: 30px;
margin-bottom: 25px !important;
}
.umb-control-group .umb-el-wrap {
padding: 0
}

View File

@@ -57,7 +57,6 @@
.umb-dialog {
outline: none;
}
.umb-dialog .umb-btn-toolbar {
text-align: right;
padding: 15px 20px 10px 20px;
@@ -65,13 +64,11 @@
clear: both;
border-top: #efefef 1px solid
}
.umb-dialog-body{
overflow:auto;
}
/* modal and umb-modal are used for right.hand dialogs */
.modal.fade.in{border: none !important; border-radius: none !important;}
.umb-modal.fade {
outline: none;
@@ -84,6 +81,7 @@
transition: opacity 0.3s linear, top 0.3s ease-out;
height: 100% !important;
}
.umb-modal.fade.in {
top: 0 !important;
left: 100% !important;

View File

@@ -30,9 +30,6 @@
cursor: text;
}
.umb-panel-header h1.umb-headline-editor {
cursor: text;
}
.umb-headline-editor-wrapper,
h1.headline{height: 40px; padding: 30px 0 0 20px;}
@@ -55,15 +52,17 @@ h1.headline{height: 40px; padding: 30px 0 0 20px;}
}
.umb-panel-header h1, {
margin: 0;
font-size: @fontSizeLarge;
font-size: @fontSizeMedium;
font-weight: 400;
color: @gray;
line-height: 22px;
line-height: 1em;
width: 100%;
margin: -2px 0 0 0;
}
.umb-headline-editor-wrapper input{
display: none;
font-size: @fontSizeMedium
}
.umb-headline-editor-wrapper h1.umb-headline-editor:hover, .umb-headline-editor-wrapper input {
@@ -71,9 +70,14 @@ h1.headline{height: 40px; padding: 30px 0 0 20px;}
}
.umb-headline-editor-wrapper input:focus {
border: 1px solid @grayLight;
background: @white;
width: 100%;
background: none;
border: none;
width: auto;
margin: -9px 0 0 0;
padding: 0 0 2px 0;
border-radius: 0;
line-height: 1em;
color: @black
}
@@ -95,6 +99,11 @@ h1.headline{height: 40px; padding: 30px 0 0 20px;}
.umb-panel-footer {
margin: 0;
padding: 20px;
z-index: 999;
position: absolute;
bottom: 0px;
left: 0px;
right: 0px;
}

View File

@@ -1,7 +1,6 @@
//
// Color picker
// --------------------------------------------------
ul.color-picker li {
padding: 2px;
margin: 3px;
@@ -21,3 +20,15 @@ ul.color-picker li a {
width:30px;
border:none;
}
//
// Media picker
// --------------------------------------------------
.umb-mediapicker .add-link{
display: inline-block;
height: 100px;
width: 100px;
text-align: center;
border: 1px @grayLight dashed;
line-height: 100px
}

View File

@@ -9,37 +9,52 @@ ul.sections {
}
ul.sections li {
border-bottom: 1px solid @grayDark;
display: block;
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, ul.sections li [class*=" icon-"]:before{
font-size: 24px;
ul.sections li [class^="icon-"]:before,
ul.sections li [class*=" icon-"]:before{
font-size: 30px;
margin: 1px 0 0 0;
opacity: 0.4;
-webkit-transition: all .3s linear;
-moz-transition: all .3s linear;
transition: all .3s linear;
}
ul.sections:hover li [class^="icon-"]:before,
ul.sections:hover li [class*=" icon-"]:before {
opacity: 1
}
ul.sections li a {
display: inline-block;
display: block;
text-decoration: none;
font-size: 10px;
text-align: center;
color: @gray;
-webkit-transition: color .5s linear;
-moz-transition: color .5s linear;
transition: color .5s linear;
padding-top: 15px;
padding-bottom: 15px;
color: @grayLight;
padding: 20px 4px 4px 0;
border-bottom: 1px solid @grayDark;
width: 100%;
height: 100%;
margin: 0 0 0 -4px;
}
ul.sections a span {
display: block;
font-size: 10px;
line-height: 1em;
line-height: 1.4em;
opacity: 0;
-webkit-transition: all .3s linear;
-moz-transition: all .3s linear;
transition: all .3s linear;
display: block;
}
ul.sections:hover li a {
color: @grayLight;
ul.sections:hover a span {
opacity: 1
}
@@ -50,6 +65,8 @@ ul.sections li.avatar {
height: 69px;
padding: 30px 0 0 0;
text-align: center;
margin: 0 0 0 -4px;
border-bottom: 1px solid @grayDark;
}
ul.sections li.avatar a {
@@ -57,6 +74,7 @@ ul.sections li.avatar a {
padding: 0;
width: 40px;
height: 40px;
border: none
}
ul.sections li.avatar a img {
@@ -67,27 +85,20 @@ ul.sections li.avatar a img {
opacity: 0.4
}
ul.sections li i {
display: inline-block;
}
ul.sections li a {
display: inline-block;
padding-left: 4px;
padding-right: 4px;
}
ul.sections li.current {
ul.sections li.current, ul.sections li:hover {
border-left: 4px @orange solid;
}
ul.sections li.avatar.current, ul.sections li.avatar:hover {
border-left: 4px @blackLight solid;
}
ul.sections li.current a{
padding-left: 0px;
}
ul.sections li.help {
border-top: 1px solid @grayDark;
border-bottom: none;
margin: 0;
position: absolute;
bottom: 0;
@@ -95,3 +106,7 @@ ul.sections li.help {
display: block;
width: 100%;
}
ul.sections li.help a {
border-bottom: none;
}

View File

@@ -44,7 +44,7 @@
// Typography
// -------------------------
@sansFontFamily: "Helvetica Neue", "Open Sans", Helvetica, Arial, sans-serif;
@sansFontFamily: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
@serifFontFamily: Georgia, "Times New Roman", Times, serif;
@monoFontFamily: Monaco, Menlo, Consolas, "Courier New", monospace;
@@ -63,6 +63,7 @@
// Based on 14px font-size and 20px line-height
@fontSizeLarge: @baseFontSize * 1.25; // ~18px
@fontSizeMedium: @baseFontSize * 1.15; // ~14px
@fontSizeSmall: @baseFontSize * 0.85; // ~12px
@fontSizeMini: @baseFontSize * 0.75; // ~11px

View File

@@ -30,7 +30,7 @@ angular.module("umbraco")
if(folderId > 0){
entityResource.getAncestors(folderId, "media")
.then(function(anc){
anc.splice(0,1);
// anc.splice(0,1);
$scope.path = anc;
});
}else{
@@ -55,19 +55,17 @@ angular.module("umbraco")
$scope.gotoFolder($scope.options.formData.currentFolder);
});
$scope.selectMediaItem = function(image) {
if (image.contentTypeAlias.toLowerCase() == 'folder') {
$scope.options.formData.currentFolder = image.id;
$scope.gotoFolder(image.id);
}
else if (image.contentTypeAlias.toLowerCase() == 'image') {
}else if (image.contentTypeAlias.toLowerCase() == 'image') {
eventsService.publish("Umbraco.Dialogs.MediaPickerController.Select", image).then(function(image){
if(dialogOptions && dialogOptions.multipicker){
$scope.select(image);
}else{
$scope.submit(image);
$scope.submit(image);
}
});
}

View File

@@ -63,28 +63,26 @@ data-file-upload="options" data-file-upload-progress="" data-ng-class="{'fileupl
ng-click="selectMediaItem(image)"
prevent-default>
<img
ng-show="image.thumbnail"
ng-src="{{image.thumbnail}}"
class="image"
alt="{{image.name}}"/>
<img ng-src="{{image.thumbnail}}" ng-switch-when="Image" alt="{{image.name}}"/>
<div ng-switch on="!!image.thumbnail" >
<img ng-src="{{image.thumbnail}}" class="image" ng-switch-when="true" alt="{{image.name}}"/>
<div ng-switch-default>
<i class="icon-folder large"></i>
{{image.name}}
</div>
</div>
</a>
<div ng-hide="image.thumbnail">
<i class="icon-folder large"></i>
{{image.name}}
</div>
</a>
</li>
</ul>
</div>
<div class="umb-panel-footer">
<div class="umb-el-wrap umb-panel-buttons">
<div class="pull-right umb-btn-toolbar">
<button ng-show="dialogData.selection.length > 0" type="button" ng-click="submit(dialogData)" class="btn btn-primary">Select ({{dialogData.selection.length}})</button>
<button ng-show="dialogData.selection.length > 0" type="button"
ng-click="submit(dialogData)" class="btn btn-primary">Select ({{dialogData.selection.length}})</button>
</div>
</div>
</div>

View File

@@ -7,31 +7,26 @@
* The controller for deleting content
*/
function ContentSortController($scope, contentResource, treeService) {
$scope.sortableModel = {
itemsToSort: [],
name: $scope.nav.ui.currentNode.name
};
contentResource.getChildren($scope.currentNode.id).then(function (data) {
$scope.sortableModel.itemsToSort = [];
$scope.pagesToSort = [];
for (var i = 0; i < data.items.length; i++) {
$scope.sortableModel.itemsToSort.push({
$scope.pagesToSort.push({
id: data.items[i].id,
column1: data.items[i].name,
column2: data.items[i].updateDate,
column3: data.items[i].sortOrder
name: data.items[i].name,
updateDate: data.items[i].updateDate,
sortOrder: data.items[i].sortOrder
});
}
});
$scope.$on("umbItemSorter.ok", function(event) {
$scope.nav.hideDialog();
});
$scope.$on("umbItemSorter.cancel", function (event) {
$scope.nav.hideDialog();
});
$scope.sortOptions ={
group: "pages",
onSortHandler: function(item, args){
args.scope.changeIndex(args.oldIndex, args.newIndex);
}
};
/*
$scope.$on("umbItemSorter.sorting", function (event, args) {
var sortedIds = [];
@@ -43,8 +38,7 @@ function ContentSortController($scope, contentResource, treeService) {
$scope.sortableModel.complete = true;
treeService.loadNodeChildren({ node: $scope.nav.ui.currentNode, section: $scope.nav.ui.currentSection });
});
});
});*/
}

View File

@@ -1,3 +1,13 @@
<div ng-controller="Umbraco.Editors.Content.SortController">
<umb-item-sorter model="sortableModel"></umb-item-sorter>
<div class="umb-pane" ng-controller="Umbraco.Editors.Content.SortController">
<ul umb-sort="sortOptions"
ng-model="pagesToSort">
<li ng-repeat="page in pagesToSort">
<i class="icon-navigation handle"></i> {{page.name}}
</li>
</ul>
{{ pagesToSort | json}}
</div>

View File

@@ -1,3 +1,3 @@
<div ng-controller="Umbraco.Editors.BooleanController">
<div class="umb-editor umb-boolean" ng-controller="Umbraco.Editors.BooleanController">
<input type="checkbox" ng-model="renderModel.value" id="{{model.alias}" />
</div>

View File

@@ -1,4 +1,4 @@
<div ng-controller="Umbraco.Editors.CheckboxListController">
<div class="umb-editor umb-checkboxlist" ng-controller="Umbraco.Editors.CheckboxListController">
<ul class="unstyled">
<li ng-repeat="item in selectedItems">

View File

@@ -1,4 +1,4 @@
<div ng-controller="Umbraco.Editors.ContentPickerController" class="">
<div ng-controller="Umbraco.Editors.ContentPickerController" class="umb-editor umb-contentpicker">
<ul class="nav nav-stacked">
<li ng-repeat="node in renderModel">
<a href="#" prevent-default ng-click="remove($index)">
@@ -13,5 +13,6 @@
<i class="icon icon-plus"></i> Add
</a>
</li>
</ul>
</div>

View File

@@ -1,4 +1,4 @@
<div ng-controller="Umbraco.Editors.DatepickerController">
<div class="umb-editor umb-datepicker" ng-controller="Umbraco.Editors.DatepickerController">
<div class="input-append date datepicker" id="{{model.alias}}">
<input name="datepicker" data-format="{{model.config.format}}" type="text"
ng-model="model.value"

View File

@@ -1,6 +1,7 @@
<div ng-controller="Umbraco.Editors.DropdownController" ng-switch="model.config.multiple">
<select name="dropDownList"
class="umb-editor umb-dropdown"
ng-switch-default
ng-model="model.value"
ng-options="key as val for (key, val) in model.config.items">
@@ -8,6 +9,7 @@
<!--NOTE: This ng-switch is required because ng-multiple doesn't actually support dynamic bindings with multi-select lists -->
<select name="dropDownList"
class="umb-editor umb-dropdown"
ng-switch-when="1"
multiple
ng-model="model.value"

View File

@@ -1,4 +1,4 @@
<div ng-controller="Umbraco.Editors.FileUploadController">
<div class="umb-editor umb-fileupload" ng-controller="Umbraco.Editors.FileUploadController">
<div ng-hide="clearFiles">
<div class="file-uploader">

View File

@@ -1,10 +1,29 @@
angular.module("umbraco")
.directive("umbUploadPreview",function($parse){
return {
link: function(scope, element, attr, ctrl) {
var fn = $parse(attr.umbUploadPreview),
file = fn(scope);
if (file.preview) {
element.append(file.preview);
}
}
};
})
.controller("Umbraco.Editors.FolderBrowserController",
function ($rootScope, $scope, assetsService, $routeParams, umbRequestHelper, mediaResource, imageHelper) {
function ($rootScope, $scope, assetsService, $routeParams, $timeout, umbRequestHelper, mediaResource, imageHelper) {
var dialogOptions = $scope.$parent.dialogOptions;
$scope.filesUploading = [];
$scope.options = {
url: umbRequestHelper.getApiUrl("mediaApiBaseUrl", "PostAddFile"),
autoUpload: true,
disableImageResize: /Android(?!.*Chrome)|Opera/
.test(window.navigator.userAgent),
previewMaxWidth: 100,
previewMaxHeight: 100,
previewCrop: true,
formData:{
currentFolder: $routeParams.id
}
@@ -23,7 +42,33 @@ angular.module("umbraco")
$scope.$on('fileuploadstop', function(event, files){
$scope.loadChildren($scope.options.formData.currentFolder);
$scope.queue = [];
});
$scope.$on('fileuploadprocessalways', function(e,data) {
var i;
console.log('processing');
$scope.$apply(function() {
$scope.filesUploading.push(data.files[data.index]);
});
})
// All these sit-ups are to add dropzone area and make sure it gets removed if dragging is aborted!
$scope.$on('fileuploaddragover', function(event, files) {
if (!$scope.dragClearTimeout) {
$scope.$apply(function() {
$scope.dropping = true;
});
} else {
$timeout.cancel($scope.dragClearTimeout);
}
$scope.dragClearTimeout = $timeout(function () {
$scope.dropping = null;
$scope.dragClearTimeout = null;
}, 100);
})
//init load
$scope.loadChildren($routeParams.id);

View File

@@ -1,14 +1,30 @@
<form ng-controller="Umbraco.Editors.FolderBrowserController" id="fileupload"
method="POST" enctype="multipart/form-data"
data-file-upload="options" data-file-upload-progress="" data-ng-class="{'fileupload-processing': processing() || loadingFiles}">
method="POST" enctype="multipart/form-data"
class="umb-editor umb-folderbrowser"
data-file-upload="options"
data-file-upload-progress=""
data-ng-class="{'fileupload-processing': processing() || loadingFiles}">
<div style="height: 10px; margin: 10px 0px 10px 0px" class="umb-loader"
ng-hide="active() == 0"></div>
<div class="umb-upload-drop-zone" ng-show="dropping">DROP HERE</div>
<div class="umb-upload-upload-progress" ng-show="filesUploading.length">
NOW UPLOADING...
<ul>
<li ng-repeat="file in filesUploading">
<div umb-upload-preview="file"></div>
</li>
</ul>
</div>
<ul class="umb-thumbnails thumbnails">
<li class="span2 folder" ng-repeat="image in images | orderBy:'contentTypeAlias' | filter:searchTerm">
<a href="#/media/media/edit/{{image.id}}" class="thumbnail">
<img ng-src="{{image.thumbnail}}" ng-switch-when="Image" alt="{{image.name}}"/>
<div ng-switch on="!!image.thumbnail" >
<img ng-src="{{image.thumbnail}}" class="image" ng-switch-when="true" alt="{{image.name}}"/>

View File

@@ -1,3 +1,3 @@
<div ng-controller="Umbraco.Editors.GoogleMapsController" class="">
<div ng-controller="Umbraco.Editors.GoogleMapsController" class="umb-editor umb-googlemaps">
<div class="" style="height: 400px;" id="{{model.alias}}_map"></div>
</div>

View File

@@ -1,3 +1,3 @@
<div ng-controller="Umbraco.Editors.GridController" auto-scale="10">
<div class="umb-editor umb-grid" ng-controller="Umbraco.Editors.GridController" auto-scale="10">
<iframe style="width: 100%; height: 100%;" src="views/propertyeditors/grid/iframe.html"></iframe>
</div>

View File

@@ -1,4 +1,4 @@
<div>
<div class="umb-editor umb-integer">
<input name="integerField" type="text" class="umb-textstring span7 textstring"
ng-model="model.value"
val-regex="^\d*$"

View File

@@ -1,5 +1,5 @@
<div class="umb-listview" ng-controller="Umbraco.Editors.ListViewController">
<div class="umb-editor umb-listview" ng-controller="Umbraco.Editors.ListViewController">
<div class="row-fluid">
<div class="umb-sub-header">
<div class="btn-group">
@@ -9,8 +9,11 @@
</a>
<ul class="dropdown-menu">
<li ng-repeat="contentType in listViewAllowedTypes">
<a href="#/content/content/edit/{{content.id}}?doctype={{contentType.alias}}&create=true">
<i class="icon-{{contentType.cssClass}}"></i> {{contentType.name}}</a>
<a
href="#/content/content/edit/{{content.id}}?doctype={{contentType.alias}}&create=true">
<i class="icon-{{contentType.cssClass}}"></i>
{{contentType.name}}
</a>
</li>
</ul>
</div>

View File

@@ -2,48 +2,53 @@
//with a specified callback, this callback will receive an object with a selection on it
angular.module('umbraco').controller("Umbraco.Editors.MediaPickerController",
function($rootScope, $scope, dialogService, mediaResource, imageHelper, $log){
//
//$( "#draggable" ).draggable();
$scope.images = [];
$scope.ids = [];
if($scope.model.value){
$scope.ids = $scope.model.value.split(',');
//saved value contains a list of images with their coordinates a Dot coordinates
//this will be $scope.model.value...
var sampleData = [
{id: 1143, coordinates: {x:123,y:345}, center: {x:123,y:12}},
{id: 1144, coordinates: {x:123,y:345}, center: {x:123,y:12}},
{id: 1145, coordinates: {x:123,y:345}, center: {x:123,y:12}},
];
$scope.images = sampleData;
$($scope.images).each(function(i,img){
mediaResource.getById(img.id).then(function(media){
mediaResource.getByIds($scope.ids).then(function(medias){
//img.media = media;
//shortcuts
//TODO, do something better then this for searching
img.src = imageHelper.getImagePropertyValue({imageModel: media});
img.thumbnail = imageHelper.getThumbnailFromPath(img.src);
$(medias).each(function(i, media){
//shortcuts
//TODO, do something better then this for searching
var img = {};
img.src = imageHelper.getImagePropertyValue({imageModel: media});
img.thumbnail = imageHelper.getThumbnailFromPath(img.src);
$scope.images.push(img);
});
});
});
}
//List of crops with name and size
$scope.config = {
crops: [
{name: "default", x:300,y:400},
{name: "header", x:23,y:40},
{name: "tiny", x:10,y:10}
]};
$scope.remove = function(index){
$scope.images.splice(index, 1);
$scope.ids.splice(index, 1);
$scope.sync();
};
$scope.add = function(){
dialogService.mediaPicker({multipicker:true, callback: function(data){
$(data.selection).each(function(i, media){
//shortcuts
//TODO, do something better then this for searching
$scope.openMediaPicker =function(value){
var d = dialogService.mediaPicker({scope: $scope, callback: populate});
};
var img = {};
img.id = media.id;
img.src = imageHelper.getImagePropertyValue({imageModel: media});
img.thumbnail = imageHelper.getThumbnailFromPath(img.src);
$scope.images.push(img);
$scope.ids.push(img.id);
});
$scope.crop = function(image){
$scope.currentImage = image;
};
$scope.sync();
}});
};
function populate(data){
$scope.model.value = data.selection;
}
});
$scope.sync = function(){
$scope.model.value = $scope.ids.join();
};
});

View File

@@ -1,41 +1,17 @@
<div ng-controller="Umbraco.Editors.MediaPickerController">
<div class="umb-editor umb-mediapicker" ng-controller="Umbraco.Editors.MediaPickerController">
<div ng-show="currentImage" class="umb-image-crop">
<div class="umb-image-mask">
<i class="icon-screenshot"></i>
<i class="icon-circle"></i>
<img ng-src="{{currentImage.src}}" style="max-width: 600px; max-height: 400px" alt="">
</div>
<div class="umb-image-controls clearfix">
<i class="icon icon-minus"></i>
<input class="range" type="range" min="1" max="200" step="1" value="100">
<i class="icon icon-plus"></i>
</div>
</div>
<ul ng-show="currentImage" class="thumbnails umb-crop-preview">
<li class="umb-thumbnail" ng-repeat="crop in config.crops">
<a href="#">
<img src="/media/dummy/crop-preview-horizontal.png" alt="">
</a>
</li>
</ul>
<ul class="thumbnails umb-crop-preview">
<li class="umb-thumbnail" ng-repeat="image in images">
<a href ng-click="crop(image)">
<img ng-src="{{image.thumbnail}}" alt="">
<ul class="thumbnails umb-thumbnails">
<li class="umb-thumbnail thumbnail span2" ng-repeat="image in images">
<a href ng-click="remove($index)">
<img ng-src="{{image.src}}" alt="">
</a>
</li>
<li class="umb-thumbnail span4">
<a href="#" ng-click="openMediaPicker(value)" prevent-default>
<i class="icon icon-plus"></i>
<li>
<a href="#" class="add-link" ng-click="add()" prevent-default>
<i class="icon icon-add large"></i>
</a>
</li>
</ul>
{{images | json}}
</ul>
</div>

View File

@@ -1,4 +1,4 @@
<div ng-controller="Umbraco.Editors.MultipleTextBoxController">
<div class="umb-editor umb-multiple-textbox" ng-controller="Umbraco.Editors.MultipleTextBoxController">
<div class="control-group" ng-repeat="item in model.value">
<input type="text" name="item_{{$index}}" ng-model="item.value" />

View File

@@ -1,4 +1,4 @@
<div>
<div class="umb-editor umb-radiobuttons">
<ul class="unstyled">
<li ng-repeat="(key, val) in model.config.items">
<label class="radio">

View File

@@ -1,3 +1,3 @@
<div class="umb-label" ng-controller="Umbraco.Editors.ReadOnlyValueController">
<div class="umb-editor umb-readonlyvalue" ng-controller="Umbraco.Editors.ReadOnlyValueController">
{{displayvalue}}
</div>

View File

@@ -1,3 +1,3 @@
<div ng-controller="Umbraco.Editors.RTEController" class="">
<div ng-controller="Umbraco.Editors.RTEController" class="umb-editor umb-rte">
<textarea ng-model="model.value" rows="10" id="{{model.alias}}_rte"></textarea>
</div>

View File

@@ -1,4 +1,4 @@
<div ng-controller="Umbraco.Editors.TagsController" class="">
<div ng-controller="Umbraco.Editors.TagsController" class="umb-editor umb-tags">
<div ng-model="model.value" id="{{model.alias}}_tags" class="tag-list">
<div class="tags">

View File

@@ -1,4 +1,4 @@
<div class="span7">
<div class="umb-editor umb-templatepicker">
<h5>TODO: Implement this picker</h5>
<div ng-model="model.value">{{model.value | json}}</div>
</div>

View File

@@ -1 +1 @@
<textarea ng-model="model.value" id="{{model.alias}}" rows="10" class="umb-textarea textstring"></textarea>
<textarea ng-model="model.value" id="{{model.alias}}" rows="10" class="umb-editor umb-textarea textstring"></textarea>

View File

@@ -1 +1 @@
<input type="text" ng-model="model.value" id="{{model.alias}}" class="umb-textstring textstring" />
<input type="text" ng-model="model.value" id="{{model.alias}}" class="umb-editor umb-textstring textstring" />

View File

@@ -113,7 +113,7 @@
UmbClientMgr.openAngularModalWindow({
template: 'views/common/dialogs/iconpicker.html',
callback: function(data){
jQuery(that).next().val("." + data);
jQuery(that).next().val(data);
jQuery(that).find("i").attr("class", data);
}});

View File

@@ -2,18 +2,18 @@
<%@ Register TagPrefix="cc1" Namespace="umbraco.uicontrols" Assembly="controls" %>
<cc1:Pane runat="server">
<cc1:PropertyPane runat="server" text="Filename (without .xslt)">
<asp:TextBox id="rename" Runat="server" CssClass="input-larger-type input-block-input"></asp:TextBox>
<cc1:PropertyPanel runat="server" text="Filename (without .xslt)">
<asp:TextBox id="rename" Runat="server" CssClass="bigInput input-large-type input-block-level"></asp:TextBox>
<asp:RequiredFieldValidator id="RequiredFieldValidator1" ErrorMessage="*" ControlToValidate="rename" runat="server">*</asp:RequiredFieldValidator>
</cc1:PropertyPane>
</cc1:PropertyPanel>
<cc1:PropertyPanel runat="server" Text="Template">
<asp:ListBox id="xsltTemplate" Runat="server" Width="350" CssClass="bigInput input-large-type input-block-level" Rows="1" SelectionMode="Single">
<asp:ListBox id="xsltTemplate" Runat="server" CssClass="bigInput input-large-type input-block-level" Rows="1" SelectionMode="Single">
<asp:ListItem Value="clean.xslt">Clean</asp:ListItem>
</asp:ListBox>
</cc1:PropertyPanel>
<cc1:PropertyPanel runat="server" Text="Create macro">
<cc1:PropertyPanel runat="server" Text="">
<asp:CheckBox ID="createMacro" Runat="server" Checked="true" Text="Create Macro"></asp:CheckBox>
</cc1:PropertyPanel>
</cc1:Pane>

View File

@@ -34,8 +34,10 @@ namespace Umbraco.Web.PropertyEditors
/// <returns></returns>
public override object FormatDataForEditor(object dbValue)
{
var parsed = MacroTagParser.FormatRichTextPersistedDataForEditor(dbValue.ToString(), new Dictionary<string, string>());
if (dbValue == null)
return dbValue;
var parsed = MacroTagParser.FormatRichTextPersistedDataForEditor(dbValue.ToString(), new Dictionary<string, string>());
return parsed;
}
@@ -47,8 +49,10 @@ namespace Umbraco.Web.PropertyEditors
/// <returns></returns>
public override object FormatDataForPersistence(Core.Models.Editors.ContentPropertyData editorValue, object currentValue)
{
var parsed = MacroTagParser.FormatRichTextContentForPersistence(editorValue.Value.ToString());
if (editorValue.Value == null)
return null;
var parsed = MacroTagParser.FormatRichTextContentForPersistence(editorValue.Value.ToString());
return parsed;
}
}

View File

@@ -32,7 +32,9 @@
/* App-wide file-upload helper */
'lib/jquery/jquery.upload/js/jquery.fileupload.js',
'lib/jquery/jquery.upload/js/load-image.min.js',
'lib/jquery/jquery.upload/js/jquery.fileupload-process.js',
'lib/jquery/jquery.upload/js/jquery.fileupload-image.js',
'lib/jquery/jquery.upload/js/jquery.fileupload-angular.js',
'lib/bootstrap/js/bootstrap.js',

View File

@@ -77,12 +77,13 @@ namespace Umbraco.Web.WebApi.Filters
var toRemove = new List<dynamic>();
foreach (dynamic item in items)
{
var hasPathAccess = UserExtensions.HasPathAccess(item.Path, user.StartContentId, Constants.System.RecycleBinContent);
var hasPathAccess = (item != null && UserExtensions.HasPathAccess(item.Path, user.StartContentId, Constants.System.RecycleBinContent));
if (!hasPathAccess)
{
toRemove.Add(item);
}
}
foreach (var item in toRemove)
{
items.Remove(item);

View File

@@ -429,7 +429,6 @@ namespace umbraco.controls
txtName.Text = _contentType.GetRawText();
txtAlias.Text = _contentType.Alias;
description.Text = _contentType.GetRawDescription();
tb_icon.Value = _contentType.IconUrl;
if(string.IsNullOrEmpty(_contentType.IconUrl))

View File

@@ -46,7 +46,7 @@ namespace umbraco.BasePages
public static string RefreshAdmin { get { return "setTimeout('" + GetMainWindow + ".location.reload()', {0});"; } }
public static string ShowSpeechBubble { get { return GetMainWindow + ".UmbSpeechBubble.ShowMessage('{0}','{1}', '{2}');"; } }
public static string ChangeContentFrameUrl(string url) {
return string.Format("alert('sdsd'); " + ClientMgrScript + ".contentFrame('{0}');", url);
return string.Format(ClientMgrScript + ".contentFrame('{0}');", url);
}
public static string ReloadContentFrameUrlIfPathLoaded(string url) {
return string.Format(ClientMgrScript + ".reloadContentFrameUrlIfPathLoaded('{0}');", url);