Added events.Service and xmlhelper.service
This commit is contained in:
1
src/Umbraco.Web.UI.Client/.jshintignore
Normal file
1
src/Umbraco.Web.UI.Client/.jshintignore
Normal file
@@ -0,0 +1 @@
|
||||
src/common/services/util.service.js
|
||||
@@ -303,6 +303,7 @@ module.exports = function (grunt) {
|
||||
smarttabs: true,
|
||||
globalstrict:true,
|
||||
globals:{$:false, jQuery:false,define:false,require:false,window:false}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,8 +34,8 @@ angular.module("umbraco.directives")
|
||||
'<ins ng-hide="node.hasChildren" style="background:none;width:18px;"></ins>' +
|
||||
'<ins ng-show="node.hasChildren" ng-class="{\'icon-caret-right\': !node.expanded, \'icon-caret-down\': node.expanded}" ng-click="load(this, node)"></ins>' +
|
||||
'<i class="{{node.cssClass}}" style="{{node.style}}"></i>' +
|
||||
'<a href="" ng-click="select(this, node, $event)" >{{node.name}}</a>' +
|
||||
'<i class="umb-options" ng-hide="!node.menuUrl" ng-click="options(this, node, $event)"><i></i><i></i><i></i></i>' +
|
||||
'<a href="{{node.routePath}}" ng-click="select(this, node, $event)" >{{node.name}}</a>' +
|
||||
'<a href="#" class="umb-options" ng-hide="!node.menuUrl" ng-click="options(this, node, $event)"><i></i><i></i><i></i></a>' +
|
||||
'<div ng-show="node.loading" class="l"><div></div></div>' +
|
||||
'</div>' +
|
||||
'</li>',
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
/* pubsub - based on https://github.com/phiggins42/bloody-jquery-plugins/blob/master/pubsub.js*/
|
||||
function eventsService($q) {
|
||||
var cache = {};
|
||||
|
||||
return {
|
||||
publish: function(){
|
||||
|
||||
var args = [].splice.call(arguments,0);
|
||||
var topic = args[0];
|
||||
var deferred = $q.defer();
|
||||
args.splice(0,1);
|
||||
|
||||
if(cache[topic]){
|
||||
$.each(cache[topic], function() {
|
||||
this.apply(null, args || []);
|
||||
});
|
||||
deferred.resolve.apply(null, args);
|
||||
}else{
|
||||
deferred.resolve.apply(null, args);
|
||||
}
|
||||
|
||||
return deferred.promise;
|
||||
},
|
||||
|
||||
subscribe: function(topic, callback) {
|
||||
if(!cache[topic]) {
|
||||
cache[topic] = [];
|
||||
}
|
||||
cache[topic].push(callback);
|
||||
return [topic, callback];
|
||||
},
|
||||
|
||||
unsubscribe: function(handle) {
|
||||
var t = handle[0];
|
||||
|
||||
if(cache[t]){
|
||||
$.each(cache[t], function(idx){
|
||||
if(this === handle[1]){
|
||||
cache[t].splice(idx, 1);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
angular.module('umbraco.services').factory('eventsService', eventsService);
|
||||
@@ -20,6 +20,7 @@ function legacyJsLoader(assetsService, umbRequestHelper) {
|
||||
}
|
||||
angular.module('umbraco.services').factory('legacyJsLoader', legacyJsLoader);
|
||||
|
||||
|
||||
/**
|
||||
* @ngdoc service
|
||||
* @name umbraco.services.angularHelper
|
||||
@@ -461,4 +462,386 @@ function iconHelper() {
|
||||
}
|
||||
};
|
||||
}
|
||||
angular.module('umbraco.services').factory('iconHelper', iconHelper);
|
||||
angular.module('umbraco.services').factory('iconHelper', iconHelper);
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @ngdoc service
|
||||
* @name umbraco.services.xmlhelper
|
||||
* @function
|
||||
*
|
||||
* @description
|
||||
* Used to convert legacy xml data to json and back again
|
||||
*/
|
||||
function xmlhelper() {
|
||||
/*
|
||||
Copyright 2011 Abdulla Abdurakhmanov
|
||||
Original sources are available at https://code.google.com/p/x2js/
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
function X2JS() {
|
||||
var VERSION = "1.0.11";
|
||||
var escapeMode = false;
|
||||
|
||||
var DOMNodeTypes = {
|
||||
ELEMENT_NODE : 1,
|
||||
TEXT_NODE : 3,
|
||||
CDATA_SECTION_NODE : 4,
|
||||
DOCUMENT_NODE : 9
|
||||
};
|
||||
|
||||
function getNodeLocalName( node ) {
|
||||
var nodeLocalName = node.localName;
|
||||
if(nodeLocalName == null){
|
||||
nodeLocalName = node.baseName;
|
||||
} // Yeah, this is IE!!
|
||||
|
||||
if(nodeLocalName === null || nodeLocalName===""){
|
||||
nodeLocalName = node.nodeName;
|
||||
} // =="" is IE too
|
||||
|
||||
return nodeLocalName;
|
||||
}
|
||||
|
||||
function getNodePrefix(node) {
|
||||
return node.prefix;
|
||||
}
|
||||
|
||||
function escapeXmlChars(str) {
|
||||
if(typeof(str) === "string"){
|
||||
return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, ''').replace(/\//g, '/');
|
||||
}else{
|
||||
return str;
|
||||
}
|
||||
}
|
||||
|
||||
function unescapeXmlChars(str) {
|
||||
return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, "'").replace(///g, '\/');
|
||||
}
|
||||
|
||||
function parseDOMChildren( node ) {
|
||||
var result,child, childName;
|
||||
|
||||
if(node.nodeType === DOMNodeTypes.DOCUMENT_NODE) {
|
||||
result = {};
|
||||
child = node.firstChild;
|
||||
childName = getNodeLocalName(child);
|
||||
result[childName] = parseDOMChildren(child);
|
||||
return result;
|
||||
}
|
||||
else{
|
||||
|
||||
if(node.nodeType === DOMNodeTypes.ELEMENT_NODE) {
|
||||
result = {};
|
||||
result.__cnt=0;
|
||||
var nodeChildren = node.childNodes;
|
||||
|
||||
// Children nodes
|
||||
for(var cidx=0; cidx <nodeChildren.length; cidx++) {
|
||||
child = nodeChildren.item(cidx); // nodeChildren[cidx];
|
||||
childName = getNodeLocalName(child);
|
||||
|
||||
result.__cnt++;
|
||||
if(result[childName] === null) {
|
||||
result[childName] = parseDOMChildren(child);
|
||||
result[childName+"_asArray"] = new Array(1);
|
||||
result[childName+"_asArray"][0] = result[childName];
|
||||
}
|
||||
else {
|
||||
if(result[childName] !== null) {
|
||||
if( !(result[childName] instanceof Array)) {
|
||||
var tmpObj = result[childName];
|
||||
result[childName] = [];
|
||||
result[childName][0] = tmpObj;
|
||||
|
||||
result[childName+"_asArray"] = result[childName];
|
||||
}
|
||||
}
|
||||
var aridx = 0;
|
||||
while(result[childName][aridx]!==null){
|
||||
aridx++;
|
||||
}
|
||||
|
||||
(result[childName])[aridx] = parseDOMChildren(child);
|
||||
}
|
||||
}
|
||||
|
||||
// Attributes
|
||||
for(var aidx=0; aidx <node.attributes.length; aidx++) {
|
||||
var attr = node.attributes.item(aidx); // [aidx];
|
||||
result.__cnt++;
|
||||
result["_"+attr.name]=attr.value;
|
||||
}
|
||||
|
||||
// Node namespace prefix
|
||||
var nodePrefix = getNodePrefix(node);
|
||||
if(nodePrefix!==null && nodePrefix!=="") {
|
||||
result.__cnt++;
|
||||
result.__prefix=nodePrefix;
|
||||
}
|
||||
|
||||
if( result.__cnt === 1 && result["#text"]!==null ) {
|
||||
result = result["#text"];
|
||||
}
|
||||
|
||||
if(result["#text"]!==null) {
|
||||
result.__text = result["#text"];
|
||||
if(escapeMode){
|
||||
result.__text = unescapeXmlChars(result.__text);
|
||||
}
|
||||
|
||||
delete result["#text"];
|
||||
delete result["#text_asArray"];
|
||||
}
|
||||
if(result["#cdata-section"]!=null) {
|
||||
result.__cdata = result["#cdata-section"];
|
||||
delete result["#cdata-section"];
|
||||
delete result["#cdata-section_asArray"];
|
||||
}
|
||||
|
||||
if(result.__text!=null || result.__cdata!=null) {
|
||||
result.toString = function() {
|
||||
return (this.__text!=null? this.__text:'')+( this.__cdata!=null ? this.__cdata:'');
|
||||
};
|
||||
}
|
||||
return result;
|
||||
}
|
||||
else{
|
||||
if(node.nodeType === DOMNodeTypes.TEXT_NODE || node.nodeType === DOMNodeTypes.CDATA_SECTION_NODE) {
|
||||
return node.nodeValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function startTag(jsonObj, element, attrList, closed) {
|
||||
var resultStr = "<"+ ( (jsonObj!=null && jsonObj.__prefix!=null)? (jsonObj.__prefix+":"):"") + element;
|
||||
if(attrList!=null) {
|
||||
for(var aidx = 0; aidx < attrList.length; aidx++) {
|
||||
var attrName = attrList[aidx];
|
||||
var attrVal = jsonObj[attrName];
|
||||
resultStr+=" "+attrName.substr(1)+"='"+attrVal+"'";
|
||||
}
|
||||
}
|
||||
if(!closed){
|
||||
resultStr+=">";
|
||||
}else{
|
||||
resultStr+="/>";
|
||||
}
|
||||
|
||||
return resultStr;
|
||||
}
|
||||
|
||||
function endTag(jsonObj,elementName) {
|
||||
return "</"+ (jsonObj.__prefix!==null? (jsonObj.__prefix+":"):"")+elementName+">";
|
||||
}
|
||||
|
||||
function endsWith(str, suffix) {
|
||||
return str.indexOf(suffix, str.length - suffix.length) !== -1;
|
||||
}
|
||||
|
||||
function jsonXmlSpecialElem ( jsonObj, jsonObjField ) {
|
||||
if(endsWith(jsonObjField.toString(),("_asArray")) || jsonObjField.toString().indexOf("_")===0 || (jsonObj[jsonObjField] instanceof Function) ){
|
||||
return true;
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function jsonXmlElemCount ( jsonObj ) {
|
||||
var elementsCnt = 0;
|
||||
if(jsonObj instanceof Object ) {
|
||||
for( var it in jsonObj ) {
|
||||
if(jsonXmlSpecialElem ( jsonObj, it) ){
|
||||
continue;
|
||||
}
|
||||
elementsCnt++;
|
||||
}
|
||||
}
|
||||
return elementsCnt;
|
||||
}
|
||||
|
||||
function parseJSONAttributes ( jsonObj ) {
|
||||
var attrList = [];
|
||||
if(jsonObj instanceof Object ) {
|
||||
for( var ait in jsonObj ) {
|
||||
if(ait.toString().indexOf("__")=== -1 && ait.toString().indexOf("_")===0) {
|
||||
attrList.push(ait);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return attrList;
|
||||
}
|
||||
|
||||
function parseJSONTextAttrs ( jsonTxtObj ) {
|
||||
var result ="";
|
||||
|
||||
if(jsonTxtObj.__cdata!=null) {
|
||||
result+="<![CDATA["+jsonTxtObj.__cdata+"]]>";
|
||||
}
|
||||
|
||||
if(jsonTxtObj.__text!=null) {
|
||||
if(escapeMode){
|
||||
result+=escapeXmlChars(jsonTxtObj.__text);
|
||||
}else{
|
||||
result+=jsonTxtObj.__text;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
function parseJSONTextObject ( jsonTxtObj ) {
|
||||
var result ="";
|
||||
|
||||
if( jsonTxtObj instanceof Object ) {
|
||||
result+=parseJSONTextAttrs ( jsonTxtObj );
|
||||
}
|
||||
else{
|
||||
if(jsonTxtObj!=null) {
|
||||
if(escapeMode){
|
||||
result+=escapeXmlChars(jsonTxtObj);
|
||||
}else{
|
||||
result+=jsonTxtObj;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
function parseJSONArray ( jsonArrRoot, jsonArrObj, attrList ) {
|
||||
var result = "";
|
||||
if(jsonArrRoot.length === 0) {
|
||||
result+=startTag(jsonArrRoot, jsonArrObj, attrList, true);
|
||||
}
|
||||
else {
|
||||
for(var arIdx = 0; arIdx < jsonArrRoot.length; arIdx++) {
|
||||
result+=startTag(jsonArrRoot[arIdx], jsonArrObj, parseJSONAttributes(jsonArrRoot[arIdx]), false);
|
||||
result+=parseJSONObject(jsonArrRoot[arIdx]);
|
||||
result+=endTag(jsonArrRoot[arIdx],jsonArrObj);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
function parseJSONObject ( jsonObj ) {
|
||||
var result = "";
|
||||
|
||||
var elementsCnt = jsonXmlElemCount ( jsonObj );
|
||||
|
||||
if(elementsCnt > 0) {
|
||||
for( var it in jsonObj ) {
|
||||
if(jsonXmlSpecialElem ( jsonObj, it) ){
|
||||
continue;
|
||||
}
|
||||
|
||||
var subObj = jsonObj[it];
|
||||
var attrList = parseJSONAttributes( subObj );
|
||||
|
||||
if(subObj === null || subObj === undefined) {
|
||||
result+=startTag(subObj, it, attrList, true);
|
||||
}else{
|
||||
if(subObj instanceof Object) {
|
||||
|
||||
if(subObj instanceof Array) {
|
||||
result+=parseJSONArray( subObj, it, attrList );
|
||||
}else {
|
||||
var subObjElementsCnt = jsonXmlElemCount ( subObj );
|
||||
if(subObjElementsCnt > 0 || subObj.__text!==null || subObj.__cdata!==null) {
|
||||
result+=startTag(subObj, it, attrList, false);
|
||||
result+=parseJSONObject(subObj);
|
||||
result+=endTag(subObj,it);
|
||||
}else{
|
||||
result+=startTag(subObj, it, attrList, true);
|
||||
}
|
||||
}
|
||||
|
||||
}else {
|
||||
result+=startTag(subObj, it, attrList, false);
|
||||
result+=parseJSONTextObject(subObj);
|
||||
result+=endTag(subObj,it);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
result+=parseJSONTextObject(jsonObj);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
this.parseXmlString = function(xmlDocStr) {
|
||||
var xmlDoc;
|
||||
if (window.DOMParser) {
|
||||
var parser=new window.DOMParser();
|
||||
xmlDoc = parser.parseFromString( xmlDocStr, "text/xml" );
|
||||
}
|
||||
else {
|
||||
// IE :(
|
||||
if(xmlDocStr.indexOf("<?")===0) {
|
||||
xmlDocStr = xmlDocStr.substr( xmlDocStr.indexOf("?>") + 2 );
|
||||
}
|
||||
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
|
||||
xmlDoc.async="false";
|
||||
xmlDoc.loadXML(xmlDocStr);
|
||||
}
|
||||
return xmlDoc;
|
||||
};
|
||||
|
||||
this.xml2json = function (xmlDoc) {
|
||||
return parseDOMChildren ( xmlDoc );
|
||||
};
|
||||
|
||||
this.xml_str2json = function (xmlDocStr) {
|
||||
var xmlDoc = this.parseXmlString(xmlDocStr);
|
||||
return this.xml2json(xmlDoc);
|
||||
};
|
||||
|
||||
this.json2xml_str = function (jsonObj) {
|
||||
return parseJSONObject ( jsonObj );
|
||||
};
|
||||
|
||||
this.json2xml = function (jsonObj) {
|
||||
var xmlDocStr = this.json2xml_str (jsonObj);
|
||||
return this.parseXmlString(xmlDocStr);
|
||||
};
|
||||
|
||||
this.getVersion = function () {
|
||||
return VERSION;
|
||||
};
|
||||
|
||||
this.escapeMode = function(enabled) {
|
||||
escapeMode = enabled;
|
||||
};
|
||||
}
|
||||
|
||||
var x2js = new X2JS();
|
||||
return {
|
||||
/** Called to load in the legacy tree js which is required on startup if a user is logged in or
|
||||
after login, but cannot be called until they are authenticated which is why it needs to be lazy loaded. */
|
||||
toJson: function(xml) {
|
||||
var json = x2js.xml_str2json( xml );
|
||||
return json;
|
||||
},
|
||||
fromJson: function(json) {
|
||||
var xml = x2js.json2xml_str( json );
|
||||
return xml;
|
||||
}
|
||||
};
|
||||
}
|
||||
angular.module('umbraco.services').factory('xmlhelper', xmlhelper);
|
||||
@@ -11,15 +11,12 @@
|
||||
<body ng-controller="Umbraco.MainController" id="umbracoMainPageBody">
|
||||
|
||||
<div ng-hide="!authenticated" ng-cloak ng-animate="'fade'" id="Div1" class="clearfix" ng-click="closeDialogs($event)">
|
||||
|
||||
<umb-navigation></umb-navigation>
|
||||
|
||||
<section id="contentwrapper">
|
||||
<div id="contentcolumn">
|
||||
<div ng-view></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
{{model | json}}
|
||||
@@ -0,0 +1 @@
|
||||
alert("bong");
|
||||
@@ -1,13 +1,15 @@
|
||||
//used for the media picker dialog
|
||||
angular.module("umbraco").controller("Umbraco.Dialogs.ContentPickerController",
|
||||
function ($scope) {
|
||||
function ($scope, eventsService) {
|
||||
$scope.dialogTreeEventHandler = $({});
|
||||
|
||||
$scope.dialogTreeEventHandler.bind("treeNodeSelect", function(ev, args){
|
||||
args.event.preventDefault();
|
||||
args.event.stopPropagation();
|
||||
|
||||
$(args.event.target.parentElement).find("i.umb-tree-icon").attr("class", "icon umb-tree-icon sprTree icon-check blue");
|
||||
$scope.select(args.node);
|
||||
|
||||
eventsService.publish("Umbraco.Dialogs.ContentPickerController.Select", args, "hello").then(function(args){
|
||||
$(args.event.target.parentElement).find("i.umb-tree-icon").attr("class", "icon umb-tree-icon sprTree icon-check blue");
|
||||
$scope.select(args.node);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -66,5 +66,14 @@ function MainController($scope, $routeParams, $rootScope, $timeout, notification
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
//register it
|
||||
angular.module('umbraco').controller("Umbraco.MainController", MainController);
|
||||
|
||||
/*
|
||||
angular.module("umbraco").run(function(eventsService){
|
||||
eventsService.subscribe("Umbraco.Dialogs.ContentPickerController.Select", function(a, b){
|
||||
a.node.name = "wat";
|
||||
});
|
||||
});
|
||||
*/
|
||||
@@ -49,6 +49,9 @@ function NavigationController($scope,$rootScope, $location, $log, navigationServ
|
||||
//this reacts to tree items themselves being clicked
|
||||
//the tree directive should not contain any handling, simply just bubble events
|
||||
$scope.treeEventHandler.bind("treeNodeSelect", function (ev, args) {
|
||||
ev.stopPropagation();
|
||||
ev.preventDefault();
|
||||
|
||||
var n = args.node;
|
||||
|
||||
//here we need to check for some legacy tree code
|
||||
|
||||
Reference in New Issue
Block a user