diff options
Diffstat (limited to 'sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ux')
9 files changed, 440 insertions, 0 deletions
diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ux/class.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ux/class.js new file mode 100644 index 000000000..80142637c --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ux/class.js @@ -0,0 +1,50 @@ +/** + * base class for creating inheritable classes + * based on resigs 'Simple Javascript Inheritance Class' (based on base2 and prototypejs) + * modified with static super and auto config + * @name Class + * @constructor + */ +(function( $, app ){ + + var ux = app.ns("ux"); + + var initializing = false, fnTest = /\b_super\b/; + + ux.Class = function(){}; + + ux.Class.extend = function(prop) { + function Class() { + if(!initializing) { + var args = Array.prototype.slice.call(arguments); + this.config = $.extend( function(t) { // automatically construct a config object based on defaults and last item passed into the constructor + return $.extend(t._proto && t._proto() && arguments.callee(t._proto()) || {}, t.defaults); + } (this) , args.pop() ); + this.init && this.init.apply(this, args); // automatically run the init function when class created + } + } + + initializing = true; + var prototype = new this(); + initializing = false; + + var _super = this.prototype; + prototype._proto = function() { + return _super; + }; + + for(var name in prop) { + prototype[name] = typeof prop[name] === "function" && typeof _super[name] === "function" && fnTest.test(prop[name]) ? + (function(name, fn){ + return function() { this._super = _super[name]; return fn.apply(this, arguments); }; + })(name, prop[name]) : prop[name]; + } + + Class.prototype = prototype; + Class.constructor = Class; + + Class.extend = arguments.callee; // make class extendable + + return Class; + }; +})( this.jQuery, this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ux/dragdrop.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ux/dragdrop.js new file mode 100644 index 000000000..17ca9be1f --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ux/dragdrop.js @@ -0,0 +1,124 @@ +(function( $, app ) { + + var ux = app.ns("ux"); + + /** + * Provides drag and drop functionality<br> + * a DragDrop instance is created for each usage pattern and then used over and over again<br> + * first a dragObj is defined - this is the jquery node that will be dragged around<br> + * second, the event callbacks are defined - these allow you control the ui during dragging and run functions when successfully dropping<br> + * thirdly drop targets are defined - this is a list of DOM nodes, the constructor works in one of two modes: + * <li>without targets - objects can be picked up and dragged around, dragStart and dragStop events fire</li> + * <li>with targets - as objects are dragged over targets dragOver, dragOut and DragDrop events fire + * to start dragging call the DragDrop.pickup_handler() function, dragging stops when the mouse is released. + * @constructor + * The following options are supported + * <dt>targetSelector</dt> + * <dd>an argument passed directly to jquery to create a list of targets, as such it can be a CSS style selector, or an array of DOM nodes<br>if target selector is null the DragDrop does Drag only and will not fire dragOver dragOut and dragDrop events</dd> + * <dt>pickupSelector</dt> + * <dd>a jquery selector. The pickup_handler is automatically bound to matched elements (eg clicking on these elements starts the drag). if pickupSelector is null, the pickup_handler must be manually bound <code>$(el).bind("mousedown", dragdrop.pickup_handler)</code></dd> + * <dt>dragObj</dt> + * <dd>the jQuery element to drag around when pickup is called. If not defined, dragObj must be set in onDragStart</dd> + * <dt>draggingClass</dt> + * <dd>the class(es) added to items when they are being dragged</dd> + * The following observables are supported + * <dt>dragStart</dt> + * <dd>a callback when start to drag<br><code>function(jEv)</code></dd> + * <dt>dragOver</dt> + * <dd>a callback when we drag into a target<br><code>function(jEl)</code></dd> + * <dt>dragOut</dt> + * <dd>a callback when we drag out of a target, or when we drop over a target<br><code>function(jEl)</code></dd> + * <dt>dragDrop</dt> + * <dd>a callback when we drop on a target<br><code>function(jEl)</code></dd> + * <dt>dragStop</dt> + * <dd>a callback when we stop dragging<br><code>function(jEv)</code></dd> + */ + ux.DragDrop = ux.Observable.extend({ + defaults : { + targetsSelector : null, + pickupSelector: null, + dragObj : null, + draggingClass : "dragging" + }, + + init: function(options) { + this._super(); // call the class initialiser + + this.drag_handler = this.drag.bind(this); + this.drop_handler = this.drop.bind(this); + this.pickup_handler = this.pickup.bind(this); + this.targets = []; + this.dragObj = null; + this.dragObjOffset = null; + this.currentTarget = null; + if(this.config.pickupSelector) { + $(this.config.pickupSelector).bind("mousedown", this.pickup_handler); + } + }, + + drag : function(jEv) { + jEv.preventDefault(); + var mloc = acx.vector( this.lockX || jEv.pageX, this.lockY || jEv.pageY ); + this.dragObj.css(mloc.add(this.dragObjOffset).asOffset()); + if(this.targets.length === 0) { + return; + } + if(this.currentTarget !== null && mloc.within(this.currentTarget[1], this.currentTarget[2])) { + return; + } + if(this.currentTarget !== null) { + this.fire('dragOut', this.currentTarget[0]); + this.currentTarget = null; + } + for(var i = 0; i < this.targets.length; i++) { + if(mloc.within(this.targets[i][1], this.targets[i][2])) { + this.currentTarget = this.targets[i]; + break; + } + } + if(this.currentTarget !== null) { + this.fire('dragOver', this.currentTarget[0]); + } + }, + + drop : function(jEv) { + $(document).unbind("mousemove", this.drag_handler); + $(document).unbind("mouseup", this.drop_handler); + this.dragObj.removeClass(this.config.draggingClass); + if(this.currentTarget !== null) { + this.fire('dragOut', this.currentTarget[0]); + this.fire('dragDrop', this.currentTarget[0]); + } + this.fire('dragStop', jEv); + this.dragObj = null; + }, + + pickup : function(jEv, opts) { + $.extend(this.config, opts); + this.fire('dragStart', jEv); + this.dragObj = this.dragObj || this.config.dragObj; + this.dragObjOffset = this.config.dragObjOffset || acx.vector(this.dragObj.offset()).sub(jEv.pageX, jEv.pageY); + this.lockX = this.config.lockX ? jEv.pageX : 0; + this.lockY = this.config.lockY ? jEv.pageY : 0; + this.dragObj.addClass(this.config.draggingClass); + if(!this.dragObj.get(0).parentNode || this.dragObj.get(0).parentNode.nodeType === 11) { // 11 = document fragment + $(document.body).append(this.dragObj); + } + if(this.config.targetsSelector) { + this.currentTarget = null; + var targets = ( this.targets = [] ); + // create an array of elements optimised for rapid collision detection calculation + $(this.config.targetsSelector).each(function(i, el) { + var jEl = $(el); + var tl = acx.vector(jEl.offset()); + var br = tl.add(jEl.width(), jEl.height()); + targets.push([jEl, tl, br]); + }); + } + $(document).bind("mousemove", this.drag_handler); + $(document).bind("mouseup", this.drop_handler); + this.drag_handler(jEv); + } + }); + +})( this.jQuery, this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ux/fieldCollection.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ux/fieldCollection.js new file mode 100644 index 000000000..ce4064f45 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ux/fieldCollection.js @@ -0,0 +1,25 @@ +(function( app ) { + + var ux = app.ns("ux"); + + ux.FieldCollection = ux.Observable.extend({ + defaults: { + fields: [] // the collection of fields + }, + init: function() { + this._super(); + this.fields = this.config.fields; + }, + validate: function() { + return this.fields.reduce(function(r, field) { + return r && field.validate(); + }, true); + }, + getData: function(type) { + return this.fields.reduce(function(r, field) { + r[field.name] = field.val(); return r; + }, {}); + } + }); + +})( this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ux/observable.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ux/observable.js new file mode 100644 index 000000000..013039787 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ux/observable.js @@ -0,0 +1,46 @@ +(function( app ) { + + var ux = app.ns("ux"); + + ux.Observable = ux.Class.extend((function() { + return { + init: function() { + this.observers = {}; + for( var opt in this.config ) { // automatically install observers that are defined in the configuration + if( opt.indexOf( 'on' ) === 0 ) { + this.on( opt.substring(2) , this.config[ opt ] ); + } + } + }, + _getObs: function( type ) { + return ( this.observers[ type.toLowerCase() ] || ( this.observers[ type.toLowerCase() ] = [] ) ); + }, + on: function( type, fn, params, thisp ) { + this._getObs( type ).push( { "cb" : fn, "args" : params || [] , "cx" : thisp || this } ); + return this; + }, + fire: function( type ) { + var params = Array.prototype.slice.call( arguments, 1 ); + this._getObs( type ).slice().forEach( function( ob ) { + ob["cb"].apply( ob["cx"], ob["args"].concat( params ) ); + } ); + return this; + }, + removeAllObservers: function() { + this.observers = {}; + }, + removeObserver: function( type, fn ) { + var obs = this._getObs( type ), + index = obs.reduce( function(p, t, i) { return (t.cb === fn) ? i : p; }, -1 ); + if(index !== -1) { + obs.splice( index, 1 ); + } + return this; // make observable functions chainable + }, + hasObserver: function( type ) { + return !! this._getObs( type ).length; + } + }; + })()); + +})( this.app );
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ux/singleton.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ux/singleton.js new file mode 100644 index 000000000..953e4a095 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ux/singleton.js @@ -0,0 +1,21 @@ +(function( app ) { + + var ux = app.ns("ux"); + + var extend = ux.Observable.extend; + var instance = function() { + if( ! ("me" in this) ) { + this.me = new this(); + } + return this.me; + }; + + ux.Singleton = ux.Observable.extend({}); + + ux.Singleton.extend = function() { + var Self = extend.apply( this, arguments ); + Self.instance = instance; + return Self; + }; + +})( this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ux/singletonSpec.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ux/singletonSpec.js new file mode 100644 index 000000000..96ef6a282 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ux/singletonSpec.js @@ -0,0 +1,41 @@ +describe("app.ux.singleton", function(){ + +var Singleton = window.app.ux.Singleton; + + describe("creating a singleton", function() { + var X = Singleton.extend({ + foo: function() { + return "bar"; + } + }); + + var Y = Singleton.extend({ + bar: function() { + return "baz"; + } + }); + + it("should have properties like a normal class", function() { + var a = X.instance(); + + expect( a instanceof X ).toBe( true ); + expect( a.foo() ).toBe( "bar" ); + }); + + it("should return single instance each time instance() is called", function() { + var a = X.instance(); + var b = X.instance(); + + expect( a ).toBe( b ); + }); + + it("should not share instances with different singletons", function() { + var a = X.instance(); + var c = Y.instance(); + + expect( a ).not.toBe( c ); + }); + + }); + +}); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ux/table.css b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ux/table.css new file mode 100644 index 000000000..7d829c4ce --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ux/table.css @@ -0,0 +1,20 @@ +TABLE.table { + border-collapse: collapse; +} + + +TABLE.table TH { + font-weight: normal; + text-align: left; + vertical-align: middle; +} + +TABLE.table TBODY.striped TR:nth-child(odd) { + background: #eee; +} + +TABLE.table H3 { + margin: 0; + font-weight: bold; + font-size: 140%; +} diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ux/templates/templateSpec.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ux/templates/templateSpec.js new file mode 100644 index 000000000..db76b1326 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ux/templates/templateSpec.js @@ -0,0 +1,81 @@ +describe("app.ut.byteSize_template", function() { + + describe("byteSize_template()", function() { + var byteSize_template = window.app.ut.byteSize_template; + + it("should postfix with a B and have not decimal for number less than 1000", function() { + expect( byteSize_template( 0 ) ).toBe( "0B" ); + expect( byteSize_template( 1 ) ).toBe( "1B" ); + expect( byteSize_template( 10 ) ).toBe( "10B" ); + expect( byteSize_template( 100 ) ).toBe( "100B" ); + expect( byteSize_template( 999 ) ).toBe( "999B" ); + }); + + it("should have 0.xxX for values between 1000 and 1023", function() { + expect( byteSize_template( 1000 ) ).toBe( "0.98ki" ); + expect( byteSize_template( 1024 * 1000 ) ).toBe( "0.98Mi" ); + }); + + it("should always have three significant digits", function() { + expect( byteSize_template( 1023 ) ).toBe( "1.00ki" ); + expect( byteSize_template( 1024 ) ).toBe( "1.00ki" ); + expect( byteSize_template( 1025 ) ).toBe( "1.00ki" ); + expect( byteSize_template( 1024 * 5 ) ).toBe( "5.00ki" ); + expect( byteSize_template( 1024 * 55 ) ).toBe( "55.0ki" ); + expect( byteSize_template( 1024 * 555 ) ).toBe( "555ki" ); + }); + + it("should have the correct postfix", function() { + expect( byteSize_template( 3 * Math.pow( 1024, 1) ) ).toBe( "3.00ki" ); + expect( byteSize_template( 3 * Math.pow( 1024, 2) ) ).toBe( "3.00Mi" ); + expect( byteSize_template( 3 * Math.pow( 1024, 3) ) ).toBe( "3.00Gi" ); + expect( byteSize_template( 3 * Math.pow( 1024, 4) ) ).toBe( "3.00Ti" ); + expect( byteSize_template( 3 * Math.pow( 1024, 5) ) ).toBe( "3.00Pi" ); + expect( byteSize_template( 3 * Math.pow( 1024, 6) ) ).toBe( "3.00Ei" ); + expect( byteSize_template( 3 * Math.pow( 1024, 7) ) ).toBe( "3.00Zi" ); + expect( byteSize_template( 3 * Math.pow( 1024, 8) ) ).toBe( "3.00Yi" ); + }); + + it("should show an overflow for stupidly big numbers", function() { + expect( byteSize_template( 3 * Math.pow( 1024, 10) ) ).toBe( "3.00..E" ); + }); + }); + + describe("count_template()", function() { + var count_template = window.app.ut.count_template; + + it("should not postfix and not decimal for number less than 1000", function() { + expect( count_template( 0 ) ).toBe( "0" ); + expect( count_template( 1 ) ).toBe( "1" ); + expect( count_template( 10 ) ).toBe( "10" ); + expect( count_template( 100 ) ).toBe( "100" ); + expect( count_template( 999 ) ).toBe( "999" ); + }); + + it("should always have three significant digits", function() { + expect( count_template( 1000 ) ).toBe( "1.00k" ); + expect( count_template( 1005 ) ).toBe( "1.00k" ); + expect( count_template( 1055 ) ).toBe( "1.05k" ); + expect( count_template( 1000 * 5 ) ).toBe( "5.00k" ); + expect( count_template( 1000 * 55 ) ).toBe( "55.0k" ); + expect( count_template( 1000 * 555 ) ).toBe( "555k" ); + }); + + it("should have the correct postfix", function() { + expect( count_template( 3 * Math.pow( 1000, 1) ) ).toBe( "3.00k" ); + expect( count_template( 3 * Math.pow( 1000, 2) ) ).toBe( "3.00M" ); + expect( count_template( 3 * Math.pow( 1000, 3) ) ).toBe( "3.00G" ); + expect( count_template( 3 * Math.pow( 1000, 4) ) ).toBe( "3.00T" ); + expect( count_template( 3 * Math.pow( 1000, 5) ) ).toBe( "3.00P" ); + expect( count_template( 3 * Math.pow( 1000, 6) ) ).toBe( "3.00E" ); + expect( count_template( 3 * Math.pow( 1000, 7) ) ).toBe( "3.00Z" ); + expect( count_template( 3 * Math.pow( 1000, 8) ) ).toBe( "3.00Y" ); + }); + + it("should show an overflow for stupidly big numbers", function() { + expect( count_template( 3 * Math.pow( 1000, 10) ) ).toBe( "3.00..E" ); + }); + }); + + +}); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ux/templates/templates.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ux/templates/templates.js new file mode 100644 index 000000000..3fdb5087a --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ux/templates/templates.js @@ -0,0 +1,32 @@ +(function( app ) { + + var ut = app.ns("ut"); + + ut.option_template = function(v) { return { tag: "OPTION", value: v, text: v }; }; + + ut.require_template = function(f) { return f.require ? { tag: "SPAN", cls: "require", text: "*" } : null; }; + + + var sib_prefix = ['B','ki','Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi', 'Yi']; + + ut.byteSize_template = function(n) { + var i = 0; + while( n >= 1000 ) { + i++; + n /= 1024; + } + return (i === 0 ? n.toString() : n.toFixed( 3 - parseInt(n,10).toString().length )) + ( sib_prefix[ i ] || "..E" ); + }; + + var sid_prefix = ['','k','M', 'G', 'T', 'P', 'E', 'Z', 'Y']; + + ut.count_template = function(n) { + var i = 0; + while( n >= 1000 ) { + i++; + n /= 1000; + } + return i === 0 ? n.toString() : ( n.toFixed( 3 - parseInt(n,10).toString().length ) + ( sid_prefix[ i ] || "..E" ) ); + }; + +})( this.app ); |