76820bb3989fd974afc095ab77d3db817fb97c75
[ccsdk/features.git] /
1 (function( $, app ) {
2
3         var ui = app.ns("ui");
4
5         ui.JsonPretty = ui.AbstractWidget.extend({
6                 defaults: {
7                         obj: null
8                 },
9                 init: function(parent) {
10                         this._super();
11                         this.el = $(this._main_template());
12                         this.attach(parent);
13                         this.el.click(this._click_handler);
14                 },
15                 
16                 _click_handler: function(jEv) {
17                         var t = $(jEv.target).closest(".uiJsonPretty-name").closest("LI");
18                         if(t.length === 0 || t.parents(".uiJsonPretty-minimised").length > 0) { return; }
19                         t.toggleClass("uiJsonPretty-minimised");
20                         jEv.stopPropagation();
21                 },
22                 
23                 _main_template: function() {
24                         try {
25                                         return { tag: "DIV", cls: "uiJsonPretty", children: this.pretty.parse(this.config.obj) };
26                         }       catch (error) {
27                                         throw "JsonPretty error: " + error.message;
28                         }
29                 },
30                 
31                 pretty: { // from https://github.com/RyanAmos/Pretty-JSON/blob/master/pretty_json.js
32                         "expando" : function(value) {
33                                 return (value && (/array|object/i).test(value.constructor.name)) ? "expando" : "";
34                         },
35                         "parse": function (member) {
36                                 return this[(member == null) ? 'null' : member.constructor.name.toLowerCase()](member);
37                         },
38                         "null": function (value) {
39                                 return this['value']('null', 'null');
40                         },
41                         "array": function (value) {
42                                 var results = [];
43                                 var lastItem = value.length - 1;
44                                 value.forEach(function( v, i ) {
45                                         results.push({ tag: "LI", cls: this.expando(v), children: [ this['parse'](v) ] });
46                                         if( i !== lastItem ) {
47                                                 results.push(",");
48                                         }
49                                 }, this);
50                                 return [ "[ ", ((results.length > 0) ? { tag: "UL", cls: "uiJsonPretty-array", children: results } : null), "]" ];
51                         },
52                         "object": function (value) {
53                                 var results = [];
54                                 var keys = Object.keys( value );
55                                 var lastItem = keys.length - 1;
56                                 keys.forEach( function( key, i ) {
57                                         var children = [ this['value']( 'name', '"' + key + '"' ), ": ", this['parse']( value[ key ]) ];
58                                         if( i !== lastItem ) {
59                                                 children.push(",");
60                                         }
61                                         results.push( { tag: "LI", cls: this.expando( value[ key ] ), children: children } );
62                                 }, this);
63                                 return [ "{ ", ((results.length > 0) ? { tag: "UL", cls: "uiJsonPretty-object", children: results } : null ),  "}" ];
64                         },
65                         "number": function (value) {
66                                 return this['value']('number', value.toString());
67                         },
68                         "string": function (value) {
69                                 if (/^(http|https|file):\/\/[^\s]+$/.test(value)) {
70                                         return this['link']( value );
71                                 } else {
72                                         return this['value']('string', '"' + value.toString() + '"');
73                                 }
74                         },
75                         "boolean": function (value) {
76                                 return this['value']('boolean', value.toString());
77                         },
78                         "link": function( value ) {
79                                         return this['value']("string", { tag: "A", href: value, target: "_blank", text: '"' + value + '"' } );
80                         },
81                         "value": function (type, value) {
82                                 if (/^(http|https|file):\/\/[^\s]+$/.test(value)) {
83                                 }
84                                 return { tag: "SPAN", cls: "uiJsonPretty-" + type, text: value };
85                         }
86                 }
87         });
88
89 })( this.jQuery, this.app );