Fixes: U4-5127 AssetService does not support virtual paths (~/) - and fixes up some formatting

This commit is contained in:
Shannon
2015-03-19 11:44:37 +11:00
parent e004ad31b5
commit 1a082464e9
2 changed files with 153 additions and 136 deletions

View File

@@ -44,27 +44,36 @@ angular.module('umbraco.services')
.factory('assetsService', function ($q, $log, angularHelper, umbRequestHelper, $rootScope, $http) {
var initAssetsLoaded = false;
var appendRnd = function(url){
var appendRnd = function (url) {
//if we don't have a global umbraco obj yet, the app is bootstrapping
if(!Umbraco.Sys.ServerVariables.application){
if (!Umbraco.Sys.ServerVariables.application) {
return url;
}
var rnd = Umbraco.Sys.ServerVariables.application.version +"."+Umbraco.Sys.ServerVariables.application.cdf;
var _op = (url.indexOf("?")>0) ? "&" : "?";
var rnd = Umbraco.Sys.ServerVariables.application.version + "." + Umbraco.Sys.ServerVariables.application.cdf;
var _op = (url.indexOf("?") > 0) ? "&" : "?";
url = url + _op + "umb__rnd=" + rnd;
return url;
};
function convertVirtualPath(path) {
//make this work for virtual paths
if (path.startsWith("~/")) {
path = umbRequestHelper.convertVirtualToAbsolutePath(path);
}
return path;
}
var service = {
loadedAssets:{},
_getAssetPromise : function(path){
if(this.loadedAssets[path]){
loadedAssets: {},
_getAssetPromise: function (path) {
if (this.loadedAssets[path]) {
return this.loadedAssets[path];
}else{
} else {
var deferred = $q.defer();
this.loadedAssets[path] = {deferred: deferred, state: "new", path: path};
this.loadedAssets[path] = { deferred: deferred, state: "new", path: path };
return this.loadedAssets[path];
}
},
@@ -77,7 +86,7 @@ angular.module('umbraco.services')
//here we need to ensure the required application assets are loaded
if (initAssetsLoaded === false) {
var self = this;
self.loadJs(umbRequestHelper.getApiUrl("serverVarsJs", "", ""), $rootScope).then(function() {
self.loadJs(umbRequestHelper.getApiUrl("serverVarsJs", "", ""), $rootScope).then(function () {
initAssetsLoaded = true;
//now we need to go get the legacyTreeJs - but this can be done async without waiting.
@@ -106,30 +115,33 @@ angular.module('umbraco.services')
* @param {Number} timeout in milliseconds
* @returns {Promise} Promise object which resolves when the file has loaded
*/
loadCss : function(path, scope, attributes, timeout){
var asset = this._getAssetPromise(path); // $q.defer();
var t = timeout || 5000;
var a = attributes || undefined;
if(asset.state === "new"){
asset.state = "loading";
LazyLoad.css(appendRnd(path), function () {
if (!scope) {
asset.state = "loaded";
asset.deferred.resolve(true);
}else{
asset.state = "loaded";
angularHelper.safeApply(scope, function () {
asset.deferred.resolve(true);
});
}
});
}else if(asset.state === "loaded"){
asset.deferred.resolve(true);
}
return asset.deferred.promise;
},
loadCss: function (path, scope, attributes, timeout) {
path = convertVirtualPath(path);
var asset = this._getAssetPromise(path); // $q.defer();
var t = timeout || 5000;
var a = attributes || undefined;
if (asset.state === "new") {
asset.state = "loading";
LazyLoad.css(appendRnd(path), function () {
if (!scope) {
asset.state = "loaded";
asset.deferred.resolve(true);
} else {
asset.state = "loaded";
angularHelper.safeApply(scope, function () {
asset.deferred.resolve(true);
});
}
});
} else if (asset.state === "loaded") {
asset.deferred.resolve(true);
}
return asset.deferred.promise;
},
/**
* @ngdoc method
* @name umbraco.services.assetsService#loadJs
@@ -144,28 +156,30 @@ angular.module('umbraco.services')
* @param {Number} timeout in milliseconds
* @returns {Promise} Promise object which resolves when the file has loaded
*/
loadJs : function(path, scope, attributes, timeout){
loadJs: function (path, scope, attributes, timeout) {
path = convertVirtualPath(path);
var asset = this._getAssetPromise(path); // $q.defer();
var t = timeout || 5000;
var a = attributes || undefined;
if(asset.state === "new"){
if (asset.state === "new") {
asset.state = "loading";
LazyLoad.js(appendRnd(path), function () {
if (!scope) {
asset.state = "loaded";
asset.deferred.resolve(true);
}else{
asset.state = "loaded";
angularHelper.safeApply(scope, function () {
asset.deferred.resolve(true);
});
}
if (!scope) {
asset.state = "loaded";
asset.deferred.resolve(true);
} else {
asset.state = "loaded";
angularHelper.safeApply(scope, function () {
asset.deferred.resolve(true);
});
}
});
}else if(asset.state === "loaded"){
} else if (asset.state === "loaded") {
asset.deferred.resolve(true);
}
@@ -192,7 +206,7 @@ angular.module('umbraco.services')
throw "pathArray must be an array";
}
var nonEmpty = _.reject(pathArray, function(item) {
var nonEmpty = _.reject(pathArray, function (item) {
return item === undefined || item === "";
});
@@ -204,12 +218,14 @@ angular.module('umbraco.services')
//compile a list of promises
//blocking
_.each(nonEmpty, function(path){
_.each(nonEmpty, function (path) {
path = convertVirtualPath(path);
var asset = service._getAssetPromise(path);
//if not previously loaded, add to list of promises
if(asset.state !== "loaded")
{
if(asset.state === "new"){
if (asset.state !== "loaded") {
if (asset.state === "new") {
asset.state = "loading";
assets.push(asset);
}
@@ -223,21 +239,21 @@ angular.module('umbraco.services')
//gives a central monitoring of all assets to load
promise = $q.all(promises);
_.each(assets, function(asset){
_.each(assets, function (asset) {
LazyLoad.js(appendRnd(asset.path), function () {
if (!scope) {
asset.state = "loaded";
asset.deferred.resolve(true);
}else{
asset.state = "loaded";
angularHelper.safeApply(scope, function () {
asset.deferred.resolve(true);
});
}
});
if (!scope) {
asset.state = "loaded";
asset.deferred.resolve(true);
} else {
asset.state = "loaded";
angularHelper.safeApply(scope, function () {
asset.deferred.resolve(true);
});
}
});
});
}else{
} else {
//return and resolve
var deferred = $q.defer();
promise = deferred.promise;

View File

@@ -63,7 +63,7 @@ angular.module("umbraco")
handle: '.cell-tools-move',
connectWith: ".usky-cell",
forcePlaceholderSize: true,
tolerance:"pointer",
tolerance: "pointer",
zIndex: 999999999999999999,
scrollSensitivity: 100,
cursorAt: {
@@ -152,7 +152,7 @@ angular.module("umbraco")
key: undefined
};
$scope.addItemOverlay = function(event, area, index, key){
$scope.addItemOverlay = function (event, area, index, key) {
$scope.overlayMenu.area = area;
$scope.overlayMenu.index = index;
$scope.overlayMenu.style = {};
@@ -163,10 +163,10 @@ angular.module("umbraco")
var height = $(window).height();
var width = $(window).width();
if((height-offset.top) < 250){
if ((height - offset.top) < 250) {
$scope.overlayMenu.style.bottom = 0;
$scope.overlayMenu.style.top = "initial";
}else if(offset.top < 300){
} else if (offset.top < 300) {
$scope.overlayMenu.style.top = 190;
}
@@ -187,7 +187,7 @@ angular.module("umbraco")
$scope.model.value = angular.copy(template);
//default row data
_.forEach($scope.model.value.sections, function(section){
_.forEach($scope.model.value.sections, function (section) {
$scope.initSection(section);
});
};
@@ -221,14 +221,14 @@ angular.module("umbraco")
$scope.currentInfohighlightRow = null;
};
$scope.getAllowedLayouts = function(column){
$scope.getAllowedLayouts = function (column) {
var layouts = $scope.model.config.items.layouts;
if(column.allowed && column.allowed.length > 0){
return _.filter(layouts, function(layout){
if (column.allowed && column.allowed.length > 0) {
return _.filter(layouts, function (layout) {
return _.indexOf(column.allowed, layout.name) >= 0;
});
}else{
} else {
return layouts;
}
};
@@ -242,8 +242,8 @@ angular.module("umbraco")
row = $scope.initRow(row);
// Push the new row
if(row){
section.rows.push(row);
if (row) {
section.rows.push(row);
}
};
@@ -264,7 +264,7 @@ angular.module("umbraco")
gridItem: gridItem,
config: $scope.model.config,
itemType: itemType,
callback: function(data){
callback: function (data) {
gridItem.styles = data.styles;
gridItem.config = data.config;
@@ -286,11 +286,11 @@ angular.module("umbraco")
$scope.currentCell = null;
};
$scope.cellPreview = function(cell){
if(cell && cell.$allowedEditors){
$scope.cellPreview = function (cell) {
if (cell && cell.$allowedEditors) {
var editor = cell.$allowedEditors[0];
return editor.icon;
}else{
} else {
return "icon-layout";
}
};
@@ -355,7 +355,7 @@ angular.module("umbraco")
};
})();
$scope.addControl = function (editor, cell, index){
$scope.addControl = function (editor, cell, index) {
$scope.closeItemOverlay();
var newControl = {
@@ -369,18 +369,18 @@ angular.module("umbraco")
}
//populate control
$scope.initControl(newControl, index+1);
$scope.initControl(newControl, index + 1);
cell.controls.splice(index + 1, 0, newControl);
};
$scope.addTinyMce = function(cell){
$scope.addTinyMce = function (cell) {
var rte = $scope.getEditor("rte");
$scope.addControl(rte, cell);
};
$scope.getEditor = function(alias){
return _.find($scope.availableEditors, function(editor){return editor.alias === alias;});
$scope.getEditor = function (alias) {
return _.find($scope.availableEditors, function (editor) { return editor.alias === alias; });
};
$scope.removeControl = function (cell, $index) {
@@ -388,12 +388,12 @@ angular.module("umbraco")
cell.controls.splice($index, 1);
};
$scope.percentage = function(spans){
return (( spans/ $scope.model.config.items.columns ) *100).toFixed(1);
$scope.percentage = function (spans) {
return ((spans / $scope.model.config.items.columns) * 100).toFixed(1);
};
$scope.clearPrompt = function(scopedObject, e) {
$scope.clearPrompt = function (scopedObject, e) {
scopedObject.deletePrompt = false;
e.preventDefault();
e.stopPropagation();
@@ -416,68 +416,68 @@ angular.module("umbraco")
// *********************************************
// Init template + sections
// *********************************************
$scope.initContent = function() {
$scope.initContent = function () {
var clear = true;
//settings indicator shortcut
if($scope.model.config.items.config || $scope.model.config.items.styles){
if ($scope.model.config.items.config || $scope.model.config.items.styles) {
$scope.hasSettings = true;
}
//ensure the grid has a column value set, if nothing is found, set it to 12
if($scope.model.config.items.columns && angular.isString($scope.model.config.items.columns)){
if ($scope.model.config.items.columns && angular.isString($scope.model.config.items.columns)) {
$scope.model.config.items.columns = parseInt($scope.model.config.items.columns);
}else{
} else {
$scope.model.config.items.columns = 12;
}
if ($scope.model.value && $scope.model.value.sections && $scope.model.value.sections.length > 0) {
_.forEach($scope.model.value.sections, function(section, index){
_.forEach($scope.model.value.sections, function (section, index) {
if(section.grid > 0){
if (section.grid > 0) {
$scope.initSection(section);
//we do this to ensure that the grid can be reset by deleting the last row
if(section.rows.length > 0){
if (section.rows.length > 0) {
clear = false;
}
}else{
} else {
$scope.model.value.sections.splice(index, 1);
}
});
}else if($scope.model.config.items.templates && $scope.model.config.items.templates.length === 1){
} else if ($scope.model.config.items.templates && $scope.model.config.items.templates.length === 1) {
$scope.addTemplate($scope.model.config.items.templates[0]);
}
if(clear){
if (clear) {
$scope.model.value = undefined;
}
};
$scope.initSection = function(section){
$scope.initSection = function (section) {
section.$percentage = $scope.percentage(section.grid);
var layouts = $scope.model.config.items.layouts;
if(section.allowed && section.allowed.length > 0){
section.$allowedLayouts = _.filter(layouts, function(layout){
if (section.allowed && section.allowed.length > 0) {
section.$allowedLayouts = _.filter(layouts, function (layout) {
return _.indexOf(section.allowed, layout.name) >= 0;
});
}else{
} else {
section.$allowedLayouts = layouts;
}
if(!section.rows){
if (!section.rows) {
section.rows = [];
}else{
_.forEach(section.rows, function(row, index){
if(!row.$initialized){
} else {
_.forEach(section.rows, function (row, index) {
if (!row.$initialized) {
var initd = $scope.initRow(row);
//if init fails, remove
if(!initd){
if (!initd) {
section.rows.splice(index, 1);
}else{
} else {
section.rows[index] = initd;
}
}
@@ -489,25 +489,25 @@ angular.module("umbraco")
// *********************************************
// Init layout / row
// *********************************************
$scope.initRow = function(row){
$scope.initRow = function (row) {
//merge the layout data with the original config data
//if there are no config info on this, splice it out
var original = _.find($scope.model.config.items.layouts, function (o) { return o.name === row.name; });
if(!original){
if (!original) {
return null;
}else{
} else {
//make a copy to not touch the original config
original = angular.copy(original);
original.styles = row.styles;
original.config = row.config;
//sync area configuration
_.each(original.areas, function(area, areaIndex){
_.each(original.areas, function (area, areaIndex) {
if(area.grid > 0){
if (area.grid > 0) {
var currentArea = row.areas[areaIndex];
if (currentArea) {
@@ -516,14 +516,14 @@ angular.module("umbraco")
}
//copy over existing controls into the new areas
if(row.areas.length > areaIndex && row.areas[areaIndex].controls){
if (row.areas.length > areaIndex && row.areas[areaIndex].controls) {
area.controls = currentArea.controls;
_.forEach(area.controls, function(control, controlIndex){
_.forEach(area.controls, function (control, controlIndex) {
$scope.initControl(control, controlIndex);
});
}else{
} else {
area.controls = [];
}
@@ -532,19 +532,19 @@ angular.module("umbraco")
area.$uniqueId = $scope.setUniqueId();
//set editor permissions
if(!area.allowed || area.allowAll === true){
if (!area.allowed || area.allowAll === true) {
area.$allowedEditors = $scope.availableEditors;
area.$allowsRTE = true;
}else{
area.$allowedEditors = _.filter($scope.availableEditors, function(editor){
} else {
area.$allowedEditors = _.filter($scope.availableEditors, function (editor) {
return _.indexOf(area.allowed, editor.alias) >= 0;
});
if(_.indexOf(area.allowed,"rte")>=0){
if (_.indexOf(area.allowed, "rte") >= 0) {
area.$allowsRTE = true;
}
}
}else{
} else {
original.areas.splice(areaIndex, 1);
}
});
@@ -568,40 +568,41 @@ angular.module("umbraco")
// Init control
// *********************************************
$scope.initControl = function(control, index){
$scope.initControl = function (control, index) {
control.$index = index;
control.$uniqueId = $scope.setUniqueId();
//error handling in case of missing editor..
//should only happen if stripped earlier
if(!control.editor){
if (!control.editor) {
control.$editorPath = "views/propertyeditors/grid/editors/error.html";
}
if(!control.$editorPath){
if (!control.$editorPath) {
var editorConfig = $scope.getEditor(control.editor.alias);
if(editorConfig){
if (editorConfig) {
control.editor = editorConfig;
//if its an absolute path
if (control.editor.view.startsWith("/") || control.editor.view.startsWith("~/")) {
control.$editorPath = umbRequestHelper.convertVirtualToAbsolutePath(control.editor.view);
}
else {
//if its an absolute path
if (control.editor.view.startsWith("/") || control.editor.view.startsWith("~/")) {
control.$editorPath = umbRequestHelper.convertVirtualToAbsolutePath(control.editor.view);
}
else {
//use convention
control.$editorPath = "views/propertyeditors/grid/editors/" + control.editor.view + ".html";
}
}else{
}
else {
control.$editorPath = "views/propertyeditors/grid/editors/error.html";
}
}
};
gridService.getGridEditors().then(function(response){
gridService.getGridEditors().then(function (response) {
$scope.availableEditors = response.data;
$scope.contentReady = true;