").append( jQuery.parseHTML( responseText ) ).find( selector ) :
-
- // Otherwise use the full result
- responseText );
-
- }).complete( callback && function( jqXHR, status ) {
- self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
- });
- }
-
- return this;
-};
-
-// Attach a bunch of functions for handling common AJAX events
-jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ){
- jQuery.fn[ type ] = function( fn ){
- return this.on( type, fn );
- };
-});
-
-jQuery.each( [ "get", "post" ], function( i, method ) {
- jQuery[ method ] = function( url, data, callback, type ) {
- // shift arguments if data argument was omitted
- if ( jQuery.isFunction( data ) ) {
- type = type || callback;
- callback = data;
- data = undefined;
- }
-
- return jQuery.ajax({
- url: url,
- type: method,
- dataType: type,
- data: data,
- success: callback
- });
- };
-});
-
-jQuery.extend({
-
- // Counter for holding the number of active queries
- active: 0,
-
- // Last-Modified header cache for next request
- lastModified: {},
- etag: {},
-
- ajaxSettings: {
- url: ajaxLocation,
- type: "GET",
- isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
- global: true,
- processData: true,
- async: true,
- contentType: "application/x-www-form-urlencoded; charset=UTF-8",
- /*
- timeout: 0,
- data: null,
- dataType: null,
- username: null,
- password: null,
- cache: null,
- throws: false,
- traditional: false,
- headers: {},
- */
-
- accepts: {
- "*": allTypes,
- text: "text/plain",
- html: "text/html",
- xml: "application/xml, text/xml",
- json: "application/json, text/javascript"
- },
-
- contents: {
- xml: /xml/,
- html: /html/,
- json: /json/
- },
-
- responseFields: {
- xml: "responseXML",
- text: "responseText"
- },
-
- // Data converters
- // Keys separate source (or catchall "*") and destination types with a single space
- converters: {
-
- // Convert anything to text
- "* text": window.String,
-
- // Text to html (true = no transformation)
- "text html": true,
-
- // Evaluate text as a json expression
- "text json": jQuery.parseJSON,
-
- // Parse text as xml
- "text xml": jQuery.parseXML
- },
-
- // For options that shouldn't be deep extended:
- // you can add your own custom options here if
- // and when you create one that shouldn't be
- // deep extended (see ajaxExtend)
- flatOptions: {
- url: true,
- context: true
- }
- },
-
- // Creates a full fledged settings object into target
- // with both ajaxSettings and settings fields.
- // If target is omitted, writes into ajaxSettings.
- ajaxSetup: function( target, settings ) {
- return settings ?
-
- // Building a settings object
- ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
-
- // Extending ajaxSettings
- ajaxExtend( jQuery.ajaxSettings, target );
- },
-
- ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
- ajaxTransport: addToPrefiltersOrTransports( transports ),
-
- // Main method
- ajax: function( url, options ) {
-
- // If url is an object, simulate pre-1.5 signature
- if ( typeof url === "object" ) {
- options = url;
- url = undefined;
- }
-
- // Force options to be an object
- options = options || {};
-
- var // Cross-domain detection vars
- parts,
- // Loop variable
- i,
- // URL without anti-cache param
- cacheURL,
- // Response headers as string
- responseHeadersString,
- // timeout handle
- timeoutTimer,
-
- // To know if global events are to be dispatched
- fireGlobals,
-
- transport,
- // Response headers
- responseHeaders,
- // Create the final options object
- s = jQuery.ajaxSetup( {}, options ),
- // Callbacks context
- callbackContext = s.context || s,
- // Context for global events is callbackContext if it is a DOM node or jQuery collection
- globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
- jQuery( callbackContext ) :
- jQuery.event,
- // Deferreds
- deferred = jQuery.Deferred(),
- completeDeferred = jQuery.Callbacks("once memory"),
- // Status-dependent callbacks
- statusCode = s.statusCode || {},
- // Headers (they are sent all at once)
- requestHeaders = {},
- requestHeadersNames = {},
- // The jqXHR state
- state = 0,
- // Default abort message
- strAbort = "canceled",
- // Fake xhr
- jqXHR = {
- readyState: 0,
-
- // Builds headers hashtable if needed
- getResponseHeader: function( key ) {
- var match;
- if ( state === 2 ) {
- if ( !responseHeaders ) {
- responseHeaders = {};
- while ( (match = rheaders.exec( responseHeadersString )) ) {
- responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
- }
- }
- match = responseHeaders[ key.toLowerCase() ];
- }
- return match == null ? null : match;
- },
-
- // Raw string
- getAllResponseHeaders: function() {
- return state === 2 ? responseHeadersString : null;
- },
-
- // Caches the header
- setRequestHeader: function( name, value ) {
- var lname = name.toLowerCase();
- if ( !state ) {
- name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
- requestHeaders[ name ] = value;
- }
- return this;
- },
-
- // Overrides response content-type header
- overrideMimeType: function( type ) {
- if ( !state ) {
- s.mimeType = type;
- }
- return this;
- },
-
- // Status-dependent callbacks
- statusCode: function( map ) {
- var code;
- if ( map ) {
- if ( state < 2 ) {
- for ( code in map ) {
- // Lazy-add the new callback in a way that preserves old ones
- statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
- }
- } else {
- // Execute the appropriate callbacks
- jqXHR.always( map[ jqXHR.status ] );
- }
- }
- return this;
- },
-
- // Cancel the request
- abort: function( statusText ) {
- var finalText = statusText || strAbort;
- if ( transport ) {
- transport.abort( finalText );
- }
- done( 0, finalText );
- return this;
- }
- };
-
- // Attach deferreds
- deferred.promise( jqXHR ).complete = completeDeferred.add;
- jqXHR.success = jqXHR.done;
- jqXHR.error = jqXHR.fail;
-
- // Remove hash character (#7531: and string promotion)
- // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
- // Handle falsy url in the settings object (#10093: consistency with old signature)
- // We also use the url parameter if available
- s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
-
- // Alias method option to type as per ticket #12004
- s.type = options.method || options.type || s.method || s.type;
-
- // Extract dataTypes list
- s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( core_rnotwhite ) || [""];
-
- // A cross-domain request is in order when we have a protocol:host:port mismatch
- if ( s.crossDomain == null ) {
- parts = rurl.exec( s.url.toLowerCase() );
- s.crossDomain = !!( parts &&
- ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
- ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
- ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
- );
- }
-
- // Convert data if not already a string
- if ( s.data && s.processData && typeof s.data !== "string" ) {
- s.data = jQuery.param( s.data, s.traditional );
- }
-
- // Apply prefilters
- inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
-
- // If request was aborted inside a prefilter, stop there
- if ( state === 2 ) {
- return jqXHR;
- }
-
- // We can fire global events as of now if asked to
- fireGlobals = s.global;
-
- // Watch for a new set of requests
- if ( fireGlobals && jQuery.active++ === 0 ) {
- jQuery.event.trigger("ajaxStart");
- }
-
- // Uppercase the type
- s.type = s.type.toUpperCase();
-
- // Determine if request has content
- s.hasContent = !rnoContent.test( s.type );
-
- // Save the URL in case we're toying with the If-Modified-Since
- // and/or If-None-Match header later on
- cacheURL = s.url;
-
- // More options handling for requests with no content
- if ( !s.hasContent ) {
-
- // If data is available, append data to url
- if ( s.data ) {
- cacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
- // #9682: remove data so that it's not used in an eventual retry
- delete s.data;
- }
-
- // Add anti-cache in url if needed
- if ( s.cache === false ) {
- s.url = rts.test( cacheURL ) ?
-
- // If there is already a '_' parameter, set its value
- cacheURL.replace( rts, "$1_=" + ajax_nonce++ ) :
-
- // Otherwise add one to the end
- cacheURL + ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ajax_nonce++;
- }
- }
-
- // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
- if ( s.ifModified ) {
- if ( jQuery.lastModified[ cacheURL ] ) {
- jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
- }
- if ( jQuery.etag[ cacheURL ] ) {
- jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
- }
- }
-
- // Set the correct header, if data is being sent
- if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
- jqXHR.setRequestHeader( "Content-Type", s.contentType );
- }
-
- // Set the Accepts header for the server, depending on the dataType
- jqXHR.setRequestHeader(
- "Accept",
- s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
- s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
- s.accepts[ "*" ]
- );
-
- // Check for headers option
- for ( i in s.headers ) {
- jqXHR.setRequestHeader( i, s.headers[ i ] );
- }
-
- // Allow custom headers/mimetypes and early abort
- if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
- // Abort if not done already and return
- return jqXHR.abort();
- }
-
- // aborting is no longer a cancellation
- strAbort = "abort";
-
- // Install callbacks on deferreds
- for ( i in { success: 1, error: 1, complete: 1 } ) {
- jqXHR[ i ]( s[ i ] );
- }
-
- // Get transport
- transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
-
- // If no transport, we auto-abort
- if ( !transport ) {
- done( -1, "No Transport" );
- } else {
- jqXHR.readyState = 1;
-
- // Send global event
- if ( fireGlobals ) {
- globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
- }
- // Timeout
- if ( s.async && s.timeout > 0 ) {
- timeoutTimer = setTimeout(function() {
- jqXHR.abort("timeout");
- }, s.timeout );
- }
-
- try {
- state = 1;
- transport.send( requestHeaders, done );
- } catch ( e ) {
- // Propagate exception as error if not done
- if ( state < 2 ) {
- done( -1, e );
- // Simply rethrow otherwise
- } else {
- throw e;
- }
- }
- }
-
- // Callback for when everything is done
- function done( status, nativeStatusText, responses, headers ) {
- var isSuccess, success, error, response, modified,
- statusText = nativeStatusText;
-
- // Called once
- if ( state === 2 ) {
- return;
- }
-
- // State is "done" now
- state = 2;
-
- // Clear timeout if it exists
- if ( timeoutTimer ) {
- clearTimeout( timeoutTimer );
- }
-
- // Dereference transport for early garbage collection
- // (no matter how long the jqXHR object will be used)
- transport = undefined;
-
- // Cache response headers
- responseHeadersString = headers || "";
-
- // Set readyState
- jqXHR.readyState = status > 0 ? 4 : 0;
-
- // Get response data
- if ( responses ) {
- response = ajaxHandleResponses( s, jqXHR, responses );
- }
-
- // If successful, handle type chaining
- if ( status >= 200 && status < 300 || status === 304 ) {
-
- // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
- if ( s.ifModified ) {
- modified = jqXHR.getResponseHeader("Last-Modified");
- if ( modified ) {
- jQuery.lastModified[ cacheURL ] = modified;
- }
- modified = jqXHR.getResponseHeader("etag");
- if ( modified ) {
- jQuery.etag[ cacheURL ] = modified;
- }
- }
-
- // if no content
- if ( status === 204 ) {
- isSuccess = true;
- statusText = "nocontent";
-
- // if not modified
- } else if ( status === 304 ) {
- isSuccess = true;
- statusText = "notmodified";
-
- // If we have data, let's convert it
- } else {
- isSuccess = ajaxConvert( s, response );
- statusText = isSuccess.state;
- success = isSuccess.data;
- error = isSuccess.error;
- isSuccess = !error;
- }
- } else {
- // We extract error from statusText
- // then normalize statusText and status for non-aborts
- error = statusText;
- if ( status || !statusText ) {
- statusText = "error";
- if ( status < 0 ) {
- status = 0;
- }
- }
- }
-
- // Set data for the fake xhr object
- jqXHR.status = status;
- jqXHR.statusText = ( nativeStatusText || statusText ) + "";
-
- // Success/Error
- if ( isSuccess ) {
- deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
- } else {
- deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
- }
-
- // Status-dependent callbacks
- jqXHR.statusCode( statusCode );
- statusCode = undefined;
-
- if ( fireGlobals ) {
- globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
- [ jqXHR, s, isSuccess ? success : error ] );
- }
-
- // Complete
- completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
-
- if ( fireGlobals ) {
- globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
- // Handle the global AJAX counter
- if ( !( --jQuery.active ) ) {
- jQuery.event.trigger("ajaxStop");
- }
- }
- }
-
- return jqXHR;
- },
-
- getScript: function( url, callback ) {
- return jQuery.get( url, undefined, callback, "script" );
- },
-
- getJSON: function( url, data, callback ) {
- return jQuery.get( url, data, callback, "json" );
- }
-});
-
-/* Handles responses to an ajax request:
- * - sets all responseXXX fields accordingly
- * - finds the right dataType (mediates between content-type and expected dataType)
- * - returns the corresponding response
- */
-function ajaxHandleResponses( s, jqXHR, responses ) {
- var firstDataType, ct, finalDataType, type,
- contents = s.contents,
- dataTypes = s.dataTypes,
- responseFields = s.responseFields;
-
- // Fill responseXXX fields
- for ( type in responseFields ) {
- if ( type in responses ) {
- jqXHR[ responseFields[type] ] = responses[ type ];
- }
- }
-
- // Remove auto dataType and get content-type in the process
- while( dataTypes[ 0 ] === "*" ) {
- dataTypes.shift();
- if ( ct === undefined ) {
- ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
- }
- }
-
- // Check if we're dealing with a known content-type
- if ( ct ) {
- for ( type in contents ) {
- if ( contents[ type ] && contents[ type ].test( ct ) ) {
- dataTypes.unshift( type );
- break;
- }
- }
- }
-
- // Check to see if we have a response for the expected dataType
- if ( dataTypes[ 0 ] in responses ) {
- finalDataType = dataTypes[ 0 ];
- } else {
- // Try convertible dataTypes
- for ( type in responses ) {
- if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
- finalDataType = type;
- break;
- }
- if ( !firstDataType ) {
- firstDataType = type;
- }
- }
- // Or just use first one
- finalDataType = finalDataType || firstDataType;
- }
-
- // If we found a dataType
- // We add the dataType to the list if needed
- // and return the corresponding response
- if ( finalDataType ) {
- if ( finalDataType !== dataTypes[ 0 ] ) {
- dataTypes.unshift( finalDataType );
- }
- return responses[ finalDataType ];
- }
-}
-
-// Chain conversions given the request and the original response
-function ajaxConvert( s, response ) {
- var conv2, current, conv, tmp,
- converters = {},
- i = 0,
- // Work with a copy of dataTypes in case we need to modify it for conversion
- dataTypes = s.dataTypes.slice(),
- prev = dataTypes[ 0 ];
-
- // Apply the dataFilter if provided
- if ( s.dataFilter ) {
- response = s.dataFilter( response, s.dataType );
- }
-
- // Create converters map with lowercased keys
- if ( dataTypes[ 1 ] ) {
- for ( conv in s.converters ) {
- converters[ conv.toLowerCase() ] = s.converters[ conv ];
- }
- }
-
- // Convert to each sequential dataType, tolerating list modification
- for ( ; (current = dataTypes[++i]); ) {
-
- // There's only work to do if current dataType is non-auto
- if ( current !== "*" ) {
-
- // Convert response if prev dataType is non-auto and differs from current
- if ( prev !== "*" && prev !== current ) {
-
- // Seek a direct converter
- conv = converters[ prev + " " + current ] || converters[ "* " + current ];
-
- // If none found, seek a pair
- if ( !conv ) {
- for ( conv2 in converters ) {
-
- // If conv2 outputs current
- tmp = conv2.split(" ");
- if ( tmp[ 1 ] === current ) {
-
- // If prev can be converted to accepted input
- conv = converters[ prev + " " + tmp[ 0 ] ] ||
- converters[ "* " + tmp[ 0 ] ];
- if ( conv ) {
- // Condense equivalence converters
- if ( conv === true ) {
- conv = converters[ conv2 ];
-
- // Otherwise, insert the intermediate dataType
- } else if ( converters[ conv2 ] !== true ) {
- current = tmp[ 0 ];
- dataTypes.splice( i--, 0, current );
- }
-
- break;
- }
- }
- }
- }
-
- // Apply converter (if not an equivalence)
- if ( conv !== true ) {
-
- // Unless errors are allowed to bubble, catch and return them
- if ( conv && s["throws"] ) {
- response = conv( response );
- } else {
- try {
- response = conv( response );
- } catch ( e ) {
- return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
- }
- }
- }
- }
-
- // Update prev for next iteration
- prev = current;
- }
- }
-
- return { state: "success", data: response };
-}
-// Install script dataType
-jQuery.ajaxSetup({
- accepts: {
- script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
- },
- contents: {
- script: /(?:java|ecma)script/
- },
- converters: {
- "text script": function( text ) {
- jQuery.globalEval( text );
- return text;
- }
- }
-});
-
-// Handle cache's special case and global
-jQuery.ajaxPrefilter( "script", function( s ) {
- if ( s.cache === undefined ) {
- s.cache = false;
- }
- if ( s.crossDomain ) {
- s.type = "GET";
- s.global = false;
- }
-});
-
-// Bind script tag hack transport
-jQuery.ajaxTransport( "script", function(s) {
-
- // This transport only deals with cross domain requests
- if ( s.crossDomain ) {
-
- var script,
- head = document.head || jQuery("head")[0] || document.documentElement;
-
- return {
-
- send: function( _, callback ) {
-
- script = document.createElement("script");
-
- script.async = true;
-
- if ( s.scriptCharset ) {
- script.charset = s.scriptCharset;
- }
-
- script.src = s.url;
-
- // Attach handlers for all browsers
- script.onload = script.onreadystatechange = function( _, isAbort ) {
-
- if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
-
- // Handle memory leak in IE
- script.onload = script.onreadystatechange = null;
-
- // Remove the script
- if ( script.parentNode ) {
- script.parentNode.removeChild( script );
- }
-
- // Dereference the script
- script = null;
-
- // Callback if not abort
- if ( !isAbort ) {
- callback( 200, "success" );
- }
- }
- };
-
- // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
- // Use native DOM manipulation to avoid our domManip AJAX trickery
- head.insertBefore( script, head.firstChild );
- },
-
- abort: function() {
- if ( script ) {
- script.onload( undefined, true );
- }
- }
- };
- }
-});
-var oldCallbacks = [],
- rjsonp = /(=)\?(?=&|$)|\?\?/;
-
-// Default jsonp settings
-jQuery.ajaxSetup({
- jsonp: "callback",
- jsonpCallback: function() {
- var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( ajax_nonce++ ) );
- this[ callback ] = true;
- return callback;
- }
-});
-
-// Detect, normalize options and install callbacks for jsonp requests
-jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
-
- var callbackName, overwritten, responseContainer,
- jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
- "url" :
- typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
- );
-
- // Handle iff the expected data type is "jsonp" or we have a parameter to set
- if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
-
- // Get callback name, remembering preexisting value associated with it
- callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
- s.jsonpCallback() :
- s.jsonpCallback;
-
- // Insert callback into url or form data
- if ( jsonProp ) {
- s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
- } else if ( s.jsonp !== false ) {
- s.url += ( ajax_rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
- }
-
- // Use data converter to retrieve json after script execution
- s.converters["script json"] = function() {
- if ( !responseContainer ) {
- jQuery.error( callbackName + " was not called" );
- }
- return responseContainer[ 0 ];
- };
-
- // force json dataType
- s.dataTypes[ 0 ] = "json";
-
- // Install callback
- overwritten = window[ callbackName ];
- window[ callbackName ] = function() {
- responseContainer = arguments;
- };
-
- // Clean-up function (fires after converters)
- jqXHR.always(function() {
- // Restore preexisting value
- window[ callbackName ] = overwritten;
-
- // Save back as free
- if ( s[ callbackName ] ) {
- // make sure that re-using the options doesn't screw things around
- s.jsonpCallback = originalSettings.jsonpCallback;
-
- // save the callback name for future use
- oldCallbacks.push( callbackName );
- }
-
- // Call if it was a function and we have a response
- if ( responseContainer && jQuery.isFunction( overwritten ) ) {
- overwritten( responseContainer[ 0 ] );
- }
-
- responseContainer = overwritten = undefined;
- });
-
- // Delegate to script
- return "script";
- }
-});
-var xhrCallbacks, xhrSupported,
- xhrId = 0,
- // #5280: Internet Explorer will keep connections alive if we don't abort on unload
- xhrOnUnloadAbort = window.ActiveXObject && function() {
- // Abort all pending requests
- var key;
- for ( key in xhrCallbacks ) {
- xhrCallbacks[ key ]( undefined, true );
- }
- };
-
-// Functions to create xhrs
-function createStandardXHR() {
- try {
- return new window.XMLHttpRequest();
- } catch( e ) {}
-}
-
-function createActiveXHR() {
- try {
- return new window.ActiveXObject("Microsoft.XMLHTTP");
- } catch( e ) {}
-}
-
-// Create the request object
-// (This is still attached to ajaxSettings for backward compatibility)
-jQuery.ajaxSettings.xhr = window.ActiveXObject ?
- /* Microsoft failed to properly
- * implement the XMLHttpRequest in IE7 (can't request local files),
- * so we use the ActiveXObject when it is available
- * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
- * we need a fallback.
- */
- function() {
- return !this.isLocal && createStandardXHR() || createActiveXHR();
- } :
- // For all other browsers, use the standard XMLHttpRequest object
- createStandardXHR;
-
-// Determine support properties
-xhrSupported = jQuery.ajaxSettings.xhr();
-jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
-xhrSupported = jQuery.support.ajax = !!xhrSupported;
-
-// Create transport if the browser can provide an xhr
-if ( xhrSupported ) {
-
- jQuery.ajaxTransport(function( s ) {
- // Cross domain only allowed if supported through XMLHttpRequest
- if ( !s.crossDomain || jQuery.support.cors ) {
-
- var callback;
-
- return {
- send: function( headers, complete ) {
-
- // Get a new xhr
- var handle, i,
- xhr = s.xhr();
-
- // Open the socket
- // Passing null username, generates a login popup on Opera (#2865)
- if ( s.username ) {
- xhr.open( s.type, s.url, s.async, s.username, s.password );
- } else {
- xhr.open( s.type, s.url, s.async );
- }
-
- // Apply custom fields if provided
- if ( s.xhrFields ) {
- for ( i in s.xhrFields ) {
- xhr[ i ] = s.xhrFields[ i ];
- }
- }
-
- // Override mime type if needed
- if ( s.mimeType && xhr.overrideMimeType ) {
- xhr.overrideMimeType( s.mimeType );
- }
-
- // X-Requested-With header
- // For cross-domain requests, seeing as conditions for a preflight are
- // akin to a jigsaw puzzle, we simply never set it to be sure.
- // (it can always be set on a per-request basis or even using ajaxSetup)
- // For same-domain requests, won't change header if already provided.
- if ( !s.crossDomain && !headers["X-Requested-With"] ) {
- headers["X-Requested-With"] = "XMLHttpRequest";
- }
-
- // Need an extra try/catch for cross domain requests in Firefox 3
- try {
- for ( i in headers ) {
- xhr.setRequestHeader( i, headers[ i ] );
- }
- } catch( err ) {}
-
- // Do send the request
- // This may raise an exception which is actually
- // handled in jQuery.ajax (so no try/catch here)
- xhr.send( ( s.hasContent && s.data ) || null );
-
- // Listener
- callback = function( _, isAbort ) {
- var status, responseHeaders, statusText, responses;
-
- // Firefox throws exceptions when accessing properties
- // of an xhr when a network error occurred
- // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
- try {
-
- // Was never called and is aborted or complete
- if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
-
- // Only called once
- callback = undefined;
-
- // Do not keep as active anymore
- if ( handle ) {
- xhr.onreadystatechange = jQuery.noop;
- if ( xhrOnUnloadAbort ) {
- delete xhrCallbacks[ handle ];
- }
- }
-
- // If it's an abort
- if ( isAbort ) {
- // Abort it manually if needed
- if ( xhr.readyState !== 4 ) {
- xhr.abort();
- }
- } else {
- responses = {};
- status = xhr.status;
- responseHeaders = xhr.getAllResponseHeaders();
-
- // When requesting binary data, IE6-9 will throw an exception
- // on any attempt to access responseText (#11426)
- if ( typeof xhr.responseText === "string" ) {
- responses.text = xhr.responseText;
- }
-
- // Firefox throws an exception when accessing
- // statusText for faulty cross-domain requests
- try {
- statusText = xhr.statusText;
- } catch( e ) {
- // We normalize with Webkit giving an empty statusText
- statusText = "";
- }
-
- // Filter status for non standard behaviors
-
- // If the request is local and we have data: assume a success
- // (success with no data won't get notified, that's the best we
- // can do given current implementations)
- if ( !status && s.isLocal && !s.crossDomain ) {
- status = responses.text ? 200 : 404;
- // IE - #1450: sometimes returns 1223 when it should be 204
- } else if ( status === 1223 ) {
- status = 204;
- }
- }
- }
- } catch( firefoxAccessException ) {
- if ( !isAbort ) {
- complete( -1, firefoxAccessException );
- }
- }
-
- // Call complete if needed
- if ( responses ) {
- complete( status, statusText, responses, responseHeaders );
- }
- };
-
- if ( !s.async ) {
- // if we're in sync mode we fire the callback
- callback();
- } else if ( xhr.readyState === 4 ) {
- // (IE6 & IE7) if it's in cache and has been
- // retrieved directly we need to fire the callback
- setTimeout( callback );
- } else {
- handle = ++xhrId;
- if ( xhrOnUnloadAbort ) {
- // Create the active xhrs callbacks list if needed
- // and attach the unload handler
- if ( !xhrCallbacks ) {
- xhrCallbacks = {};
- jQuery( window ).unload( xhrOnUnloadAbort );
- }
- // Add to list of active xhrs callbacks
- xhrCallbacks[ handle ] = callback;
- }
- xhr.onreadystatechange = callback;
- }
- },
-
- abort: function() {
- if ( callback ) {
- callback( undefined, true );
- }
- }
- };
- }
- });
-}
-var fxNow, timerId,
- rfxtypes = /^(?:toggle|show|hide)$/,
- rfxnum = new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
- rrun = /queueHooks$/,
- animationPrefilters = [ defaultPrefilter ],
- tweeners = {
- "*": [function( prop, value ) {
- var end, unit,
- tween = this.createTween( prop, value ),
- parts = rfxnum.exec( value ),
- target = tween.cur(),
- start = +target || 0,
- scale = 1,
- maxIterations = 20;
-
- if ( parts ) {
- end = +parts[2];
- unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
-
- // We need to compute starting value
- if ( unit !== "px" && start ) {
- // Iteratively approximate from a nonzero starting point
- // Prefer the current property, because this process will be trivial if it uses the same units
- // Fallback to end or a simple constant
- start = jQuery.css( tween.elem, prop, true ) || end || 1;
-
- do {
- // If previous iteration zeroed out, double until we get *something*
- // Use a string for doubling factor so we don't accidentally see scale as unchanged below
- scale = scale || ".5";
-
- // Adjust and apply
- start = start / scale;
- jQuery.style( tween.elem, prop, start + unit );
-
- // Update scale, tolerating zero or NaN from tween.cur()
- // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
- } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
- }
-
- tween.unit = unit;
- tween.start = start;
- // If a +=/-= token was provided, we're doing a relative animation
- tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
- }
- return tween;
- }]
- };
-
-// Animations created synchronously will run synchronously
-function createFxNow() {
- setTimeout(function() {
- fxNow = undefined;
- });
- return ( fxNow = jQuery.now() );
-}
-
-function createTweens( animation, props ) {
- jQuery.each( props, function( prop, value ) {
- var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
- index = 0,
- length = collection.length;
- for ( ; index < length; index++ ) {
- if ( collection[ index ].call( animation, prop, value ) ) {
-
- // we're done with this property
- return;
- }
- }
- });
-}
-
-function Animation( elem, properties, options ) {
- var result,
- stopped,
- index = 0,
- length = animationPrefilters.length,
- deferred = jQuery.Deferred().always( function() {
- // don't match elem in the :animated selector
- delete tick.elem;
- }),
- tick = function() {
- if ( stopped ) {
- return false;
- }
- var currentTime = fxNow || createFxNow(),
- remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
- // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
- temp = remaining / animation.duration || 0,
- percent = 1 - temp,
- index = 0,
- length = animation.tweens.length;
-
- for ( ; index < length ; index++ ) {
- animation.tweens[ index ].run( percent );
- }
-
- deferred.notifyWith( elem, [ animation, percent, remaining ]);
-
- if ( percent < 1 && length ) {
- return remaining;
- } else {
- deferred.resolveWith( elem, [ animation ] );
- return false;
- }
- },
- animation = deferred.promise({
- elem: elem,
- props: jQuery.extend( {}, properties ),
- opts: jQuery.extend( true, { specialEasing: {} }, options ),
- originalProperties: properties,
- originalOptions: options,
- startTime: fxNow || createFxNow(),
- duration: options.duration,
- tweens: [],
- createTween: function( prop, end ) {
- var tween = jQuery.Tween( elem, animation.opts, prop, end,
- animation.opts.specialEasing[ prop ] || animation.opts.easing );
- animation.tweens.push( tween );
- return tween;
- },
- stop: function( gotoEnd ) {
- var index = 0,
- // if we are going to the end, we want to run all the tweens
- // otherwise we skip this part
- length = gotoEnd ? animation.tweens.length : 0;
- if ( stopped ) {
- return this;
- }
- stopped = true;
- for ( ; index < length ; index++ ) {
- animation.tweens[ index ].run( 1 );
- }
-
- // resolve when we played the last frame
- // otherwise, reject
- if ( gotoEnd ) {
- deferred.resolveWith( elem, [ animation, gotoEnd ] );
- } else {
- deferred.rejectWith( elem, [ animation, gotoEnd ] );
- }
- return this;
- }
- }),
- props = animation.props;
-
- propFilter( props, animation.opts.specialEasing );
-
- for ( ; index < length ; index++ ) {
- result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
- if ( result ) {
- return result;
- }
- }
-
- createTweens( animation, props );
-
- if ( jQuery.isFunction( animation.opts.start ) ) {
- animation.opts.start.call( elem, animation );
- }
-
- jQuery.fx.timer(
- jQuery.extend( tick, {
- elem: elem,
- anim: animation,
- queue: animation.opts.queue
- })
- );
-
- // attach callbacks from options
- return animation.progress( animation.opts.progress )
- .done( animation.opts.done, animation.opts.complete )
- .fail( animation.opts.fail )
- .always( animation.opts.always );
-}
-
-function propFilter( props, specialEasing ) {
- var value, name, index, easing, hooks;
-
- // camelCase, specialEasing and expand cssHook pass
- for ( index in props ) {
- name = jQuery.camelCase( index );
- easing = specialEasing[ name ];
- value = props[ index ];
- if ( jQuery.isArray( value ) ) {
- easing = value[ 1 ];
- value = props[ index ] = value[ 0 ];
- }
-
- if ( index !== name ) {
- props[ name ] = value;
- delete props[ index ];
- }
-
- hooks = jQuery.cssHooks[ name ];
- if ( hooks && "expand" in hooks ) {
- value = hooks.expand( value );
- delete props[ name ];
-
- // not quite $.extend, this wont overwrite keys already present.
- // also - reusing 'index' from above because we have the correct "name"
- for ( index in value ) {
- if ( !( index in props ) ) {
- props[ index ] = value[ index ];
- specialEasing[ index ] = easing;
- }
- }
- } else {
- specialEasing[ name ] = easing;
- }
- }
-}
-
-jQuery.Animation = jQuery.extend( Animation, {
-
- tweener: function( props, callback ) {
- if ( jQuery.isFunction( props ) ) {
- callback = props;
- props = [ "*" ];
- } else {
- props = props.split(" ");
- }
-
- var prop,
- index = 0,
- length = props.length;
-
- for ( ; index < length ; index++ ) {
- prop = props[ index ];
- tweeners[ prop ] = tweeners[ prop ] || [];
- tweeners[ prop ].unshift( callback );
- }
- },
-
- prefilter: function( callback, prepend ) {
- if ( prepend ) {
- animationPrefilters.unshift( callback );
- } else {
- animationPrefilters.push( callback );
- }
- }
-});
-
-function defaultPrefilter( elem, props, opts ) {
- /*jshint validthis:true */
- var prop, index, length,
- value, dataShow, toggle,
- tween, hooks, oldfire,
- anim = this,
- style = elem.style,
- orig = {},
- handled = [],
- hidden = elem.nodeType && isHidden( elem );
-
- // handle queue: false promises
- if ( !opts.queue ) {
- hooks = jQuery._queueHooks( elem, "fx" );
- if ( hooks.unqueued == null ) {
- hooks.unqueued = 0;
- oldfire = hooks.empty.fire;
- hooks.empty.fire = function() {
- if ( !hooks.unqueued ) {
- oldfire();
- }
- };
- }
- hooks.unqueued++;
-
- anim.always(function() {
- // doing this makes sure that the complete handler will be called
- // before this completes
- anim.always(function() {
- hooks.unqueued--;
- if ( !jQuery.queue( elem, "fx" ).length ) {
- hooks.empty.fire();
- }
- });
- });
- }
-
- // height/width overflow pass
- if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
- // Make sure that nothing sneaks out
- // Record all 3 overflow attributes because IE does not
- // change the overflow attribute when overflowX and
- // overflowY are set to the same value
- opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
-
- // Set display property to inline-block for height/width
- // animations on inline elements that are having width/height animated
- if ( jQuery.css( elem, "display" ) === "inline" &&
- jQuery.css( elem, "float" ) === "none" ) {
-
- // inline-level elements accept inline-block;
- // block-level elements need to be inline with layout
- if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
- style.display = "inline-block";
-
- } else {
- style.zoom = 1;
- }
- }
- }
-
- if ( opts.overflow ) {
- style.overflow = "hidden";
- if ( !jQuery.support.shrinkWrapBlocks ) {
- anim.always(function() {
- style.overflow = opts.overflow[ 0 ];
- style.overflowX = opts.overflow[ 1 ];
- style.overflowY = opts.overflow[ 2 ];
- });
- }
- }
-
-
- // show/hide pass
- for ( index in props ) {
- value = props[ index ];
- if ( rfxtypes.exec( value ) ) {
- delete props[ index ];
- toggle = toggle || value === "toggle";
- if ( value === ( hidden ? "hide" : "show" ) ) {
- continue;
- }
- handled.push( index );
- }
- }
-
- length = handled.length;
- if ( length ) {
- dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
- if ( "hidden" in dataShow ) {
- hidden = dataShow.hidden;
- }
-
- // store state if its toggle - enables .stop().toggle() to "reverse"
- if ( toggle ) {
- dataShow.hidden = !hidden;
- }
- if ( hidden ) {
- jQuery( elem ).show();
- } else {
- anim.done(function() {
- jQuery( elem ).hide();
- });
- }
- anim.done(function() {
- var prop;
- jQuery._removeData( elem, "fxshow" );
- for ( prop in orig ) {
- jQuery.style( elem, prop, orig[ prop ] );
- }
- });
- for ( index = 0 ; index < length ; index++ ) {
- prop = handled[ index ];
- tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
- orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
-
- if ( !( prop in dataShow ) ) {
- dataShow[ prop ] = tween.start;
- if ( hidden ) {
- tween.end = tween.start;
- tween.start = prop === "width" || prop === "height" ? 1 : 0;
- }
- }
- }
- }
-}
-
-function Tween( elem, options, prop, end, easing ) {
- return new Tween.prototype.init( elem, options, prop, end, easing );
-}
-jQuery.Tween = Tween;
-
-Tween.prototype = {
- constructor: Tween,
- init: function( elem, options, prop, end, easing, unit ) {
- this.elem = elem;
- this.prop = prop;
- this.easing = easing || "swing";
- this.options = options;
- this.start = this.now = this.cur();
- this.end = end;
- this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
- },
- cur: function() {
- var hooks = Tween.propHooks[ this.prop ];
-
- return hooks && hooks.get ?
- hooks.get( this ) :
- Tween.propHooks._default.get( this );
- },
- run: function( percent ) {
- var eased,
- hooks = Tween.propHooks[ this.prop ];
-
- if ( this.options.duration ) {
- this.pos = eased = jQuery.easing[ this.easing ](
- percent, this.options.duration * percent, 0, 1, this.options.duration
- );
- } else {
- this.pos = eased = percent;
- }
- this.now = ( this.end - this.start ) * eased + this.start;
-
- if ( this.options.step ) {
- this.options.step.call( this.elem, this.now, this );
- }
-
- if ( hooks && hooks.set ) {
- hooks.set( this );
- } else {
- Tween.propHooks._default.set( this );
- }
- return this;
- }
-};
-
-Tween.prototype.init.prototype = Tween.prototype;
-
-Tween.propHooks = {
- _default: {
- get: function( tween ) {
- var result;
-
- if ( tween.elem[ tween.prop ] != null &&
- (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
- return tween.elem[ tween.prop ];
- }
-
- // passing an empty string as a 3rd parameter to .css will automatically
- // attempt a parseFloat and fallback to a string if the parse fails
- // so, simple values such as "10px" are parsed to Float.
- // complex values such as "rotate(1rad)" are returned as is.
- result = jQuery.css( tween.elem, tween.prop, "" );
- // Empty strings, null, undefined and "auto" are converted to 0.
- return !result || result === "auto" ? 0 : result;
- },
- set: function( tween ) {
- // use step hook for back compat - use cssHook if its there - use .style if its
- // available and use plain properties where available
- if ( jQuery.fx.step[ tween.prop ] ) {
- jQuery.fx.step[ tween.prop ]( tween );
- } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
- jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
- } else {
- tween.elem[ tween.prop ] = tween.now;
- }
- }
- }
-};
-
-// Remove in 2.0 - this supports IE8's panic based approach
-// to setting things on disconnected nodes
-
-Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
- set: function( tween ) {
- if ( tween.elem.nodeType && tween.elem.parentNode ) {
- tween.elem[ tween.prop ] = tween.now;
- }
- }
-};
-
-jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
- var cssFn = jQuery.fn[ name ];
- jQuery.fn[ name ] = function( speed, easing, callback ) {
- return speed == null || typeof speed === "boolean" ?
- cssFn.apply( this, arguments ) :
- this.animate( genFx( name, true ), speed, easing, callback );
- };
-});
-
-jQuery.fn.extend({
- fadeTo: function( speed, to, easing, callback ) {
-
- // show any hidden elements after setting opacity to 0
- return this.filter( isHidden ).css( "opacity", 0 ).show()
-
- // animate to the value specified
- .end().animate({ opacity: to }, speed, easing, callback );
- },
- animate: function( prop, speed, easing, callback ) {
- var empty = jQuery.isEmptyObject( prop ),
- optall = jQuery.speed( speed, easing, callback ),
- doAnimation = function() {
- // Operate on a copy of prop so per-property easing won't be lost
- var anim = Animation( this, jQuery.extend( {}, prop ), optall );
- doAnimation.finish = function() {
- anim.stop( true );
- };
- // Empty animations, or finishing resolves immediately
- if ( empty || jQuery._data( this, "finish" ) ) {
- anim.stop( true );
- }
- };
- doAnimation.finish = doAnimation;
-
- return empty || optall.queue === false ?
- this.each( doAnimation ) :
- this.queue( optall.queue, doAnimation );
- },
- stop: function( type, clearQueue, gotoEnd ) {
- var stopQueue = function( hooks ) {
- var stop = hooks.stop;
- delete hooks.stop;
- stop( gotoEnd );
- };
-
- if ( typeof type !== "string" ) {
- gotoEnd = clearQueue;
- clearQueue = type;
- type = undefined;
- }
- if ( clearQueue && type !== false ) {
- this.queue( type || "fx", [] );
- }
-
- return this.each(function() {
- var dequeue = true,
- index = type != null && type + "queueHooks",
- timers = jQuery.timers,
- data = jQuery._data( this );
-
- if ( index ) {
- if ( data[ index ] && data[ index ].stop ) {
- stopQueue( data[ index ] );
- }
- } else {
- for ( index in data ) {
- if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
- stopQueue( data[ index ] );
- }
- }
- }
-
- for ( index = timers.length; index--; ) {
- if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
- timers[ index ].anim.stop( gotoEnd );
- dequeue = false;
- timers.splice( index, 1 );
- }
- }
-
- // start the next in the queue if the last step wasn't forced
- // timers currently will call their complete callbacks, which will dequeue
- // but only if they were gotoEnd
- if ( dequeue || !gotoEnd ) {
- jQuery.dequeue( this, type );
- }
- });
- },
- finish: function( type ) {
- if ( type !== false ) {
- type = type || "fx";
- }
- return this.each(function() {
- var index,
- data = jQuery._data( this ),
- queue = data[ type + "queue" ],
- hooks = data[ type + "queueHooks" ],
- timers = jQuery.timers,
- length = queue ? queue.length : 0;
-
- // enable finishing flag on private data
- data.finish = true;
-
- // empty the queue first
- jQuery.queue( this, type, [] );
-
- if ( hooks && hooks.cur && hooks.cur.finish ) {
- hooks.cur.finish.call( this );
- }
-
- // look for any active animations, and finish them
- for ( index = timers.length; index--; ) {
- if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
- timers[ index ].anim.stop( true );
- timers.splice( index, 1 );
- }
- }
-
- // look for any animations in the old queue and finish them
- for ( index = 0; index < length; index++ ) {
- if ( queue[ index ] && queue[ index ].finish ) {
- queue[ index ].finish.call( this );
- }
- }
-
- // turn off finishing flag
- delete data.finish;
- });
- }
-});
-
-// Generate parameters to create a standard animation
-function genFx( type, includeWidth ) {
- var which,
- attrs = { height: type },
- i = 0;
-
- // if we include width, step value is 1 to do all cssExpand values,
- // if we don't include width, step value is 2 to skip over Left and Right
- includeWidth = includeWidth? 1 : 0;
- for( ; i < 4 ; i += 2 - includeWidth ) {
- which = cssExpand[ i ];
- attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
- }
-
- if ( includeWidth ) {
- attrs.opacity = attrs.width = type;
- }
-
- return attrs;
-}
-
-// Generate shortcuts for custom animations
-jQuery.each({
- slideDown: genFx("show"),
- slideUp: genFx("hide"),
- slideToggle: genFx("toggle"),
- fadeIn: { opacity: "show" },
- fadeOut: { opacity: "hide" },
- fadeToggle: { opacity: "toggle" }
-}, function( name, props ) {
- jQuery.fn[ name ] = function( speed, easing, callback ) {
- return this.animate( props, speed, easing, callback );
- };
-});
-
-jQuery.speed = function( speed, easing, fn ) {
- var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
- complete: fn || !fn && easing ||
- jQuery.isFunction( speed ) && speed,
- duration: speed,
- easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
- };
-
- opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
- opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
-
- // normalize opt.queue - true/undefined/null -> "fx"
- if ( opt.queue == null || opt.queue === true ) {
- opt.queue = "fx";
- }
-
- // Queueing
- opt.old = opt.complete;
-
- opt.complete = function() {
- if ( jQuery.isFunction( opt.old ) ) {
- opt.old.call( this );
- }
-
- if ( opt.queue ) {
- jQuery.dequeue( this, opt.queue );
- }
- };
-
- return opt;
-};
-
-jQuery.easing = {
- linear: function( p ) {
- return p;
- },
- swing: function( p ) {
- return 0.5 - Math.cos( p*Math.PI ) / 2;
- }
-};
-
-jQuery.timers = [];
-jQuery.fx = Tween.prototype.init;
-jQuery.fx.tick = function() {
- var timer,
- timers = jQuery.timers,
- i = 0;
-
- fxNow = jQuery.now();
-
- for ( ; i < timers.length; i++ ) {
- timer = timers[ i ];
- // Checks the timer has not already been removed
- if ( !timer() && timers[ i ] === timer ) {
- timers.splice( i--, 1 );
- }
- }
-
- if ( !timers.length ) {
- jQuery.fx.stop();
- }
- fxNow = undefined;
-};
-
-jQuery.fx.timer = function( timer ) {
- if ( timer() && jQuery.timers.push( timer ) ) {
- jQuery.fx.start();
- }
-};
-
-jQuery.fx.interval = 13;
-
-jQuery.fx.start = function() {
- if ( !timerId ) {
- timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
- }
-};
-
-jQuery.fx.stop = function() {
- clearInterval( timerId );
- timerId = null;
-};
-
-jQuery.fx.speeds = {
- slow: 600,
- fast: 200,
- // Default speed
- _default: 400
-};
-
-// Back Compat <1.8 extension point
-jQuery.fx.step = {};
-
-if ( jQuery.expr && jQuery.expr.filters ) {
- jQuery.expr.filters.animated = function( elem ) {
- return jQuery.grep(jQuery.timers, function( fn ) {
- return elem === fn.elem;
- }).length;
- };
-}
-jQuery.fn.offset = function( options ) {
- if ( arguments.length ) {
- return options === undefined ?
- this :
- this.each(function( i ) {
- jQuery.offset.setOffset( this, options, i );
- });
- }
-
- var docElem, win,
- box = { top: 0, left: 0 },
- elem = this[ 0 ],
- doc = elem && elem.ownerDocument;
-
- if ( !doc ) {
- return;
- }
-
- docElem = doc.documentElement;
-
- // Make sure it's not a disconnected DOM node
- if ( !jQuery.contains( docElem, elem ) ) {
- return box;
- }
-
- // If we don't have gBCR, just use 0,0 rather than error
- // BlackBerry 5, iOS 3 (original iPhone)
- if ( typeof elem.getBoundingClientRect !== core_strundefined ) {
- box = elem.getBoundingClientRect();
- }
- win = getWindow( doc );
- return {
- top: box.top + ( win.pageYOffset || docElem.scrollTop ) - ( docElem.clientTop || 0 ),
- left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
- };
-};
-
-jQuery.offset = {
-
- setOffset: function( elem, options, i ) {
- var position = jQuery.css( elem, "position" );
-
- // set position first, in-case top/left are set even on static elem
- if ( position === "static" ) {
- elem.style.position = "relative";
- }
-
- var curElem = jQuery( elem ),
- curOffset = curElem.offset(),
- curCSSTop = jQuery.css( elem, "top" ),
- curCSSLeft = jQuery.css( elem, "left" ),
- calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
- props = {}, curPosition = {}, curTop, curLeft;
-
- // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
- if ( calculatePosition ) {
- curPosition = curElem.position();
- curTop = curPosition.top;
- curLeft = curPosition.left;
- } else {
- curTop = parseFloat( curCSSTop ) || 0;
- curLeft = parseFloat( curCSSLeft ) || 0;
- }
-
- if ( jQuery.isFunction( options ) ) {
- options = options.call( elem, i, curOffset );
- }
-
- if ( options.top != null ) {
- props.top = ( options.top - curOffset.top ) + curTop;
- }
- if ( options.left != null ) {
- props.left = ( options.left - curOffset.left ) + curLeft;
- }
-
- if ( "using" in options ) {
- options.using.call( elem, props );
- } else {
- curElem.css( props );
- }
- }
-};
-
-
-jQuery.fn.extend({
-
- position: function() {
- if ( !this[ 0 ] ) {
- return;
- }
-
- var offsetParent, offset,
- parentOffset = { top: 0, left: 0 },
- elem = this[ 0 ];
-
- // fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent
- if ( jQuery.css( elem, "position" ) === "fixed" ) {
- // we assume that getBoundingClientRect is available when computed position is fixed
- offset = elem.getBoundingClientRect();
- } else {
- // Get *real* offsetParent
- offsetParent = this.offsetParent();
-
- // Get correct offsets
- offset = this.offset();
- if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
- parentOffset = offsetParent.offset();
- }
-
- // Add offsetParent borders
- parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
- parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
- }
-
- // Subtract parent offsets and element margins
- // note: when an element has margin: auto the offsetLeft and marginLeft
- // are the same in Safari causing offset.left to incorrectly be 0
- return {
- top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
- left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
- };
- },
-
- offsetParent: function() {
- return this.map(function() {
- var offsetParent = this.offsetParent || document.documentElement;
- while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) {
- offsetParent = offsetParent.offsetParent;
- }
- return offsetParent || document.documentElement;
- });
- }
-});
-
-
-// Create scrollLeft and scrollTop methods
-jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
- var top = /Y/.test( prop );
-
- jQuery.fn[ method ] = function( val ) {
- return jQuery.access( this, function( elem, method, val ) {
- var win = getWindow( elem );
-
- if ( val === undefined ) {
- return win ? (prop in win) ? win[ prop ] :
- win.document.documentElement[ method ] :
- elem[ method ];
- }
-
- if ( win ) {
- win.scrollTo(
- !top ? val : jQuery( win ).scrollLeft(),
- top ? val : jQuery( win ).scrollTop()
- );
-
- } else {
- elem[ method ] = val;
- }
- }, method, val, arguments.length, null );
- };
-});
-
-function getWindow( elem ) {
- return jQuery.isWindow( elem ) ?
- elem :
- elem.nodeType === 9 ?
- elem.defaultView || elem.parentWindow :
- false;
-}
-// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
-jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
- jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
- // margin is only for outerHeight, outerWidth
- jQuery.fn[ funcName ] = function( margin, value ) {
- var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
- extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
-
- return jQuery.access( this, function( elem, type, value ) {
- var doc;
-
- if ( jQuery.isWindow( elem ) ) {
- // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
- // isn't a whole lot we can do. See pull request at this URL for discussion:
- // https://github.com/jquery/jquery/pull/764
- return elem.document.documentElement[ "client" + name ];
- }
-
- // Get document width or height
- if ( elem.nodeType === 9 ) {
- doc = elem.documentElement;
-
- // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
- // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
- return Math.max(
- elem.body[ "scroll" + name ], doc[ "scroll" + name ],
- elem.body[ "offset" + name ], doc[ "offset" + name ],
- doc[ "client" + name ]
- );
- }
-
- return value === undefined ?
- // Get width or height on the element, requesting but not forcing parseFloat
- jQuery.css( elem, type, extra ) :
-
- // Set width or height on the element
- jQuery.style( elem, type, value, extra );
- }, type, chainable ? margin : undefined, chainable, null );
- };
- });
-});
-// Limit scope pollution from any deprecated API
-// (function() {
-
-// })();
-// Expose jQuery to the global object
-window.jQuery = window.$ = jQuery;
-
-// Expose jQuery as an AMD module, but only for AMD loaders that
-// understand the issues with loading multiple versions of jQuery
-// in a page that all might call define(). The loader will indicate
-// they have special allowances for multiple jQuery versions by
-// specifying define.amd.jQuery = true. Register as a named module,
-// since jQuery can be concatenated with other files that may use define,
-// but not use a proper concatenation script that understands anonymous
-// AMD modules. A named AMD is safest and most robust way to register.
-// Lowercase jquery is used because AMD module names are derived from
-// file names, and jQuery is normally delivered in a lowercase file name.
-// Do this after creating the global so that if an AMD module wants to call
-// noConflict to hide this version of jQuery, it will work.
-if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
- define( "jquery", [], function () { return jQuery; } );
-}
-
-})( window );// Underscore.js 1.8.2
-// http://underscorejs.org
-// (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
-// Underscore may be freely distributed under the MIT license.
-
-(function() {
-
- // Baseline setup
- // --------------
-
- // Establish the root object, `window` in the browser, or `exports` on the server.
- var root = this;
-
- // Save the previous value of the `_` variable.
- var previousUnderscore = root._;
-
- // Save bytes in the minified (but not gzipped) version:
- var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
-
- // Create quick reference variables for speed access to core prototypes.
- var
- push = ArrayProto.push,
- slice = ArrayProto.slice,
- toString = ObjProto.toString,
- hasOwnProperty = ObjProto.hasOwnProperty;
-
- // All **ECMAScript 5** native function implementations that we hope to use
- // are declared here.
- var
- nativeIsArray = Array.isArray,
- nativeKeys = Object.keys,
- nativeBind = FuncProto.bind,
- nativeCreate = Object.create;
-
- // Naked function reference for surrogate-prototype-swapping.
- var Ctor = function(){};
-
- // Create a safe reference to the Underscore object for use below.
- var _ = function(obj) {
- if (obj instanceof _) return obj;
- if (!(this instanceof _)) return new _(obj);
- this._wrapped = obj;
- };
-
- // Export the Underscore object for **Node.js**, with
- // backwards-compatibility for the old `require()` API. If we're in
- // the browser, add `_` as a global object.
- if (typeof exports !== 'undefined') {
- if (typeof module !== 'undefined' && module.exports) {
- exports = module.exports = _;
- }
- exports._ = _;
- } else {
- root._ = _;
- }
-
- // Current version.
- _.VERSION = '1.8.2';
-
- // Internal function that returns an efficient (for current engines) version
- // of the passed-in callback, to be repeatedly applied in other Underscore
- // functions.
- var optimizeCb = function(func, context, argCount) {
- if (context === void 0) return func;
- switch (argCount == null ? 3 : argCount) {
- case 1: return function(value) {
- return func.call(context, value);
- };
- case 2: return function(value, other) {
- return func.call(context, value, other);
- };
- case 3: return function(value, index, collection) {
- return func.call(context, value, index, collection);
- };
- case 4: return function(accumulator, value, index, collection) {
- return func.call(context, accumulator, value, index, collection);
- };
- }
- return function() {
- return func.apply(context, arguments);
- };
- };
-
- // A mostly-internal function to generate callbacks that can be applied
- // to each element in a collection, returning the desired result 鈥? either
- // identity, an arbitrary callback, a property matcher, or a property accessor.
- var cb = function(value, context, argCount) {
- if (value == null) return _.identity;
- if (_.isFunction(value)) return optimizeCb(value, context, argCount);
- if (_.isObject(value)) return _.matcher(value);
- return _.property(value);
- };
- _.iteratee = function(value, context) {
- return cb(value, context, Infinity);
- };
-
- // An internal function for creating assigner functions.
- var createAssigner = function(keysFunc, undefinedOnly) {
- return function(obj) {
- var length = arguments.length;
- if (length < 2 || obj == null) return obj;
- for (var index = 1; index < length; index++) {
- var source = arguments[index],
- keys = keysFunc(source),
- l = keys.length;
- for (var i = 0; i < l; i++) {
- var key = keys[i];
- if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];
- }
- }
- return obj;
- };
- };
-
- // An internal function for creating a new object that inherits from another.
- var baseCreate = function(prototype) {
- if (!_.isObject(prototype)) return {};
- if (nativeCreate) return nativeCreate(prototype);
- Ctor.prototype = prototype;
- var result = new Ctor;
- Ctor.prototype = null;
- return result;
- };
-
- // Helper for collection methods to determine whether a collection
- // should be iterated as an array or as an object
- // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
- var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
- var isArrayLike = function(collection) {
- var length = collection != null && collection.length;
- return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;
- };
-
- // Collection Functions
- // --------------------
-
- // The cornerstone, an `each` implementation, aka `forEach`.
- // Handles raw objects in addition to array-likes. Treats all
- // sparse array-likes as if they were dense.
- _.each = _.forEach = function(obj, iteratee, context) {
- iteratee = optimizeCb(iteratee, context);
- var i, length;
- if (isArrayLike(obj)) {
- for (i = 0, length = obj.length; i < length; i++) {
- iteratee(obj[i], i, obj);
- }
- } else {
- var keys = _.keys(obj);
- for (i = 0, length = keys.length; i < length; i++) {
- iteratee(obj[keys[i]], keys[i], obj);
- }
- }
- return obj;
- };
-
- // Return the results of applying the iteratee to each element.
- _.map = _.collect = function(obj, iteratee, context) {
- iteratee = cb(iteratee, context);
- var keys = !isArrayLike(obj) && _.keys(obj),
- length = (keys || obj).length,
- results = Array(length);
- for (var index = 0; index < length; index++) {
- var currentKey = keys ? keys[index] : index;
- results[index] = iteratee(obj[currentKey], currentKey, obj);
- }
- return results;
- };
-
- // Create a reducing function iterating left or right.
- function createReduce(dir) {
- // Optimized iterator function as using arguments.length
- // in the main function will deoptimize the, see #1991.
- function iterator(obj, iteratee, memo, keys, index, length) {
- for (; index >= 0 && index < length; index += dir) {
- var currentKey = keys ? keys[index] : index;
- memo = iteratee(memo, obj[currentKey], currentKey, obj);
- }
- return memo;
- }
-
- return function(obj, iteratee, memo, context) {
- iteratee = optimizeCb(iteratee, context, 4);
- var keys = !isArrayLike(obj) && _.keys(obj),
- length = (keys || obj).length,
- index = dir > 0 ? 0 : length - 1;
- // Determine the initial value if none is provided.
- if (arguments.length < 3) {
- memo = obj[keys ? keys[index] : index];
- index += dir;
- }
- return iterator(obj, iteratee, memo, keys, index, length);
- };
- }
-
- // **Reduce** builds up a single result from a list of values, aka `inject`,
- // or `foldl`.
- _.reduce = _.foldl = _.inject = createReduce(1);
-
- // The right-associative version of reduce, also known as `foldr`.
- _.reduceRight = _.foldr = createReduce(-1);
-
- // Return the first value which passes a truth test. Aliased as `detect`.
- _.find = _.detect = function(obj, predicate, context) {
- var key;
- if (isArrayLike(obj)) {
- key = _.findIndex(obj, predicate, context);
- } else {
- key = _.findKey(obj, predicate, context);
- }
- if (key !== void 0 && key !== -1) return obj[key];
- };
-
- // Return all the elements that pass a truth test.
- // Aliased as `select`.
- _.filter = _.select = function(obj, predicate, context) {
- var results = [];
- predicate = cb(predicate, context);
- _.each(obj, function(value, index, list) {
- if (predicate(value, index, list)) results.push(value);
- });
- return results;
- };
-
- // Return all the elements for which a truth test fails.
- _.reject = function(obj, predicate, context) {
- return _.filter(obj, _.negate(cb(predicate)), context);
- };
-
- // Determine whether all of the elements match a truth test.
- // Aliased as `all`.
- _.every = _.all = function(obj, predicate, context) {
- predicate = cb(predicate, context);
- var keys = !isArrayLike(obj) && _.keys(obj),
- length = (keys || obj).length;
- for (var index = 0; index < length; index++) {
- var currentKey = keys ? keys[index] : index;
- if (!predicate(obj[currentKey], currentKey, obj)) return false;
- }
- return true;
- };
-
- // Determine if at least one element in the object matches a truth test.
- // Aliased as `any`.
- _.some = _.any = function(obj, predicate, context) {
- predicate = cb(predicate, context);
- var keys = !isArrayLike(obj) && _.keys(obj),
- length = (keys || obj).length;
- for (var index = 0; index < length; index++) {
- var currentKey = keys ? keys[index] : index;
- if (predicate(obj[currentKey], currentKey, obj)) return true;
- }
- return false;
- };
-
- // Determine if the array or object contains a given value (using `===`).
- // Aliased as `includes` and `include`.
- _.contains = _.includes = _.include = function(obj, target, fromIndex) {
- if (!isArrayLike(obj)) obj = _.values(obj);
- return _.indexOf(obj, target, typeof fromIndex == 'number' && fromIndex) >= 0;
- };
-
- // Invoke a method (with arguments) on every item in a collection.
- _.invoke = function(obj, method) {
- var args = slice.call(arguments, 2);
- var isFunc = _.isFunction(method);
- return _.map(obj, function(value) {
- var func = isFunc ? method : value[method];
- return func == null ? func : func.apply(value, args);
- });
- };
-
- // Convenience version of a common use case of `map`: fetching a property.
- _.pluck = function(obj, key) {
- return _.map(obj, _.property(key));
- };
-
- // Convenience version of a common use case of `filter`: selecting only objects
- // containing specific `key:value` pairs.
- _.where = function(obj, attrs) {
- return _.filter(obj, _.matcher(attrs));
- };
-
- // Convenience version of a common use case of `find`: getting the first object
- // containing specific `key:value` pairs.
- _.findWhere = function(obj, attrs) {
- return _.find(obj, _.matcher(attrs));
- };
-
- // Return the maximum element (or element-based computation).
- _.max = function(obj, iteratee, context) {
- var result = -Infinity, lastComputed = -Infinity,
- value, computed;
- if (iteratee == null && obj != null) {
- obj = isArrayLike(obj) ? obj : _.values(obj);
- for (var i = 0, length = obj.length; i < length; i++) {
- value = obj[i];
- if (value > result) {
- result = value;
- }
- }
- } else {
- iteratee = cb(iteratee, context);
- _.each(obj, function(value, index, list) {
- computed = iteratee(value, index, list);
- if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
- result = value;
- lastComputed = computed;
- }
- });
- }
- return result;
- };
-
- // Return the minimum element (or element-based computation).
- _.min = function(obj, iteratee, context) {
- var result = Infinity, lastComputed = Infinity,
- value, computed;
- if (iteratee == null && obj != null) {
- obj = isArrayLike(obj) ? obj : _.values(obj);
- for (var i = 0, length = obj.length; i < length; i++) {
- value = obj[i];
- if (value < result) {
- result = value;
- }
- }
- } else {
- iteratee = cb(iteratee, context);
- _.each(obj, function(value, index, list) {
- computed = iteratee(value, index, list);
- if (computed < lastComputed || computed === Infinity && result === Infinity) {
- result = value;
- lastComputed = computed;
- }
- });
- }
- return result;
- };
-
- // Shuffle a collection, using the modern version of the
- // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher鈥揧ates_shuffle).
- _.shuffle = function(obj) {
- var set = isArrayLike(obj) ? obj : _.values(obj);
- var length = set.length;
- var shuffled = Array(length);
- for (var index = 0, rand; index < length; index++) {
- rand = _.random(0, index);
- if (rand !== index) shuffled[index] = shuffled[rand];
- shuffled[rand] = set[index];
- }
- return shuffled;
- };
-
- // Sample **n** random values from a collection.
- // If **n** is not specified, returns a single random element.
- // The internal `guard` argument allows it to work with `map`.
- _.sample = function(obj, n, guard) {
- if (n == null || guard) {
- if (!isArrayLike(obj)) obj = _.values(obj);
- return obj[_.random(obj.length - 1)];
- }
- return _.shuffle(obj).slice(0, Math.max(0, n));
- };
-
- // Sort the object's values by a criterion produced by an iteratee.
- _.sortBy = function(obj, iteratee, context) {
- iteratee = cb(iteratee, context);
- return _.pluck(_.map(obj, function(value, index, list) {
- return {
- value: value,
- index: index,
- criteria: iteratee(value, index, list)
- };
- }).sort(function(left, right) {
- var a = left.criteria;
- var b = right.criteria;
- if (a !== b) {
- if (a > b || a === void 0) return 1;
- if (a < b || b === void 0) return -1;
- }
- return left.index - right.index;
- }), 'value');
- };
-
- // An internal function used for aggregate "group by" operations.
- var group = function(behavior) {
- return function(obj, iteratee, context) {
- var result = {};
- iteratee = cb(iteratee, context);
- _.each(obj, function(value, index) {
- var key = iteratee(value, index, obj);
- behavior(result, value, key);
- });
- return result;
- };
- };
-
- // Groups the object's values by a criterion. Pass either a string attribute
- // to group by, or a function that returns the criterion.
- _.groupBy = group(function(result, value, key) {
- if (_.has(result, key)) result[key].push(value); else result[key] = [value];
- });
-
- // Indexes the object's values by a criterion, similar to `groupBy`, but for
- // when you know that your index values will be unique.
- _.indexBy = group(function(result, value, key) {
- result[key] = value;
- });
-
- // Counts instances of an object that group by a certain criterion. Pass
- // either a string attribute to count by, or a function that returns the
- // criterion.
- _.countBy = group(function(result, value, key) {
- if (_.has(result, key)) result[key]++; else result[key] = 1;
- });
-
- // Safely create a real, live array from anything iterable.
- _.toArray = function(obj) {
- if (!obj) return [];
- if (_.isArray(obj)) return slice.call(obj);
- if (isArrayLike(obj)) return _.map(obj, _.identity);
- return _.values(obj);
- };
-
- // Return the number of elements in an object.
- _.size = function(obj) {
- if (obj == null) return 0;
- return isArrayLike(obj) ? obj.length : _.keys(obj).length;
- };
-
- // Split a collection into two arrays: one whose elements all satisfy the given
- // predicate, and one whose elements all do not satisfy the predicate.
- _.partition = function(obj, predicate, context) {
- predicate = cb(predicate, context);
- var pass = [], fail = [];
- _.each(obj, function(value, key, obj) {
- (predicate(value, key, obj) ? pass : fail).push(value);
- });
- return [pass, fail];
- };
-
- // Array Functions
- // ---------------
-
- // Get the first element of an array. Passing **n** will return the first N
- // values in the array. Aliased as `head` and `take`. The **guard** check
- // allows it to work with `_.map`.
- _.first = _.head = _.take = function(array, n, guard) {
- if (array == null) return void 0;
- if (n == null || guard) return array[0];
- return _.initial(array, array.length - n);
- };
-
- // Returns everything but the last entry of the array. Especially useful on
- // the arguments object. Passing **n** will return all the values in
- // the array, excluding the last N.
- _.initial = function(array, n, guard) {
- return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
- };
-
- // Get the last element of an array. Passing **n** will return the last N
- // values in the array.
- _.last = function(array, n, guard) {
- if (array == null) return void 0;
- if (n == null || guard) return array[array.length - 1];
- return _.rest(array, Math.max(0, array.length - n));
- };
-
- // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
- // Especially useful on the arguments object. Passing an **n** will return
- // the rest N values in the array.
- _.rest = _.tail = _.drop = function(array, n, guard) {
- return slice.call(array, n == null || guard ? 1 : n);
- };
-
- // Trim out all falsy values from an array.
- _.compact = function(array) {
- return _.filter(array, _.identity);
- };
-
- // Internal implementation of a recursive `flatten` function.
- var flatten = function(input, shallow, strict, startIndex) {
- var output = [], idx = 0;
- for (var i = startIndex || 0, length = input && input.length; i < length; i++) {
- var value = input[i];
- if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {
- //flatten current level of array or arguments object
- if (!shallow) value = flatten(value, shallow, strict);
- var j = 0, len = value.length;
- output.length += len;
- while (j < len) {
- output[idx++] = value[j++];
- }
- } else if (!strict) {
- output[idx++] = value;
- }
- }
- return output;
- };
-
- // Flatten out an array, either recursively (by default), or just one level.
- _.flatten = function(array, shallow) {
- return flatten(array, shallow, false);
- };
-
- // Return a version of the array that does not contain the specified value(s).
- _.without = function(array) {
- return _.difference(array, slice.call(arguments, 1));
- };
-
- // Produce a duplicate-free version of the array. If the array has already
- // been sorted, you have the option of using a faster algorithm.
- // Aliased as `unique`.
- _.uniq = _.unique = function(array, isSorted, iteratee, context) {
- if (array == null) return [];
- if (!_.isBoolean(isSorted)) {
- context = iteratee;
- iteratee = isSorted;
- isSorted = false;
- }
- if (iteratee != null) iteratee = cb(iteratee, context);
- var result = [];
- var seen = [];
- for (var i = 0, length = array.length; i < length; i++) {
- var value = array[i],
- computed = iteratee ? iteratee(value, i, array) : value;
- if (isSorted) {
- if (!i || seen !== computed) result.push(value);
- seen = computed;
- } else if (iteratee) {
- if (!_.contains(seen, computed)) {
- seen.push(computed);
- result.push(value);
- }
- } else if (!_.contains(result, value)) {
- result.push(value);
- }
- }
- return result;
- };
-
- // Produce an array that contains the union: each distinct element from all of
- // the passed-in arrays.
- _.union = function() {
- return _.uniq(flatten(arguments, true, true));
- };
-
- // Produce an array that contains every item shared between all the
- // passed-in arrays.
- _.intersection = function(array) {
- if (array == null) return [];
- var result = [];
- var argsLength = arguments.length;
- for (var i = 0, length = array.length; i < length; i++) {
- var item = array[i];
- if (_.contains(result, item)) continue;
- for (var j = 1; j < argsLength; j++) {
- if (!_.contains(arguments[j], item)) break;
- }
- if (j === argsLength) result.push(item);
- }
- return result;
- };
-
- // Take the difference between one array and a number of other arrays.
- // Only the elements present in just the first array will remain.
- _.difference = function(array) {
- var rest = flatten(arguments, true, true, 1);
- return _.filter(array, function(value){
- return !_.contains(rest, value);
- });
- };
-
- // Zip together multiple lists into a single array -- elements that share
- // an index go together.
- _.zip = function() {
- return _.unzip(arguments);
- };
-
- // Complement of _.zip. Unzip accepts an array of arrays and groups
- // each array's elements on shared indices
- _.unzip = function(array) {
- var length = array && _.max(array, 'length').length || 0;
- var result = Array(length);
-
- for (var index = 0; index < length; index++) {
- result[index] = _.pluck(array, index);
- }
- return result;
- };
-
- // Converts lists into objects. Pass either a single array of `[key, value]`
- // pairs, or two parallel arrays of the same length -- one of keys, and one of
- // the corresponding values.
- _.object = function(list, values) {
- var result = {};
- for (var i = 0, length = list && list.length; i < length; i++) {
- if (values) {
- result[list[i]] = values[i];
- } else {
- result[list[i][0]] = list[i][1];
- }
- }
- return result;
- };
-
- // Return the position of the first occurrence of an item in an array,
- // or -1 if the item is not included in the array.
- // If the array is large and already in sort order, pass `true`
- // for **isSorted** to use binary search.
- _.indexOf = function(array, item, isSorted) {
- var i = 0, length = array && array.length;
- if (typeof isSorted == 'number') {
- i = isSorted < 0 ? Math.max(0, length + isSorted) : isSorted;
- } else if (isSorted && length) {
- i = _.sortedIndex(array, item);
- return array[i] === item ? i : -1;
- }
- if (item !== item) {
- return _.findIndex(slice.call(array, i), _.isNaN);
- }
- for (; i < length; i++) if (array[i] === item) return i;
- return -1;
- };
-
- _.lastIndexOf = function(array, item, from) {
- var idx = array ? array.length : 0;
- if (typeof from == 'number') {
- idx = from < 0 ? idx + from + 1 : Math.min(idx, from + 1);
- }
- if (item !== item) {
- return _.findLastIndex(slice.call(array, 0, idx), _.isNaN);
- }
- while (--idx >= 0) if (array[idx] === item) return idx;
- return -1;
- };
-
- // Generator function to create the findIndex and findLastIndex functions
- function createIndexFinder(dir) {
- return function(array, predicate, context) {
- predicate = cb(predicate, context);
- var length = array != null && array.length;
- var index = dir > 0 ? 0 : length - 1;
- for (; index >= 0 && index < length; index += dir) {
- if (predicate(array[index], index, array)) return index;
- }
- return -1;
- };
- }
-
- // Returns the first index on an array-like that passes a predicate test
- _.findIndex = createIndexFinder(1);
-
- _.findLastIndex = createIndexFinder(-1);
-
- // Use a comparator function to figure out the smallest index at which
- // an object should be inserted so as to maintain order. Uses binary search.
- _.sortedIndex = function(array, obj, iteratee, context) {
- iteratee = cb(iteratee, context, 1);
- var value = iteratee(obj);
- var low = 0, high = array.length;
- while (low < high) {
- var mid = Math.floor((low + high) / 2);
- if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
- }
- return low;
- };
-
- // Generate an integer Array containing an arithmetic progression. A port of
- // the native Python `range()` function. See
- // [the Python documentation](http://docs.python.org/library/functions.html#range).
- _.range = function(start, stop, step) {
- if (arguments.length <= 1) {
- stop = start || 0;
- start = 0;
- }
- step = step || 1;
-
- var length = Math.max(Math.ceil((stop - start) / step), 0);
- var range = Array(length);
-
- for (var idx = 0; idx < length; idx++, start += step) {
- range[idx] = start;
- }
-
- return range;
- };
-
- // Function (ahem) Functions
- // ------------------
-
- // Determines whether to execute a function as a constructor
- // or a normal function with the provided arguments
- var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {
- if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
- var self = baseCreate(sourceFunc.prototype);
- var result = sourceFunc.apply(self, args);
- if (_.isObject(result)) return result;
- return self;
- };
-
- // Create a function bound to a given object (assigning `this`, and arguments,
- // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
- // available.
- _.bind = function(func, context) {
- if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
- if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
- var args = slice.call(arguments, 2);
- var bound = function() {
- return executeBound(func, bound, context, this, args.concat(slice.call(arguments)));
- };
- return bound;
- };
-
- // Partially apply a function by creating a version that has had some of its
- // arguments pre-filled, without changing its dynamic `this` context. _ acts
- // as a placeholder, allowing any combination of arguments to be pre-filled.
- _.partial = function(func) {
- var boundArgs = slice.call(arguments, 1);
- var bound = function() {
- var position = 0, length = boundArgs.length;
- var args = Array(length);
- for (var i = 0; i < length; i++) {
- args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i];
- }
- while (position < arguments.length) args.push(arguments[position++]);
- return executeBound(func, bound, this, this, args);
- };
- return bound;
- };
-
- // Bind a number of an object's methods to that object. Remaining arguments
- // are the method names to be bound. Useful for ensuring that all callbacks
- // defined on an object belong to it.
- _.bindAll = function(obj) {
- var i, length = arguments.length, key;
- if (length <= 1) throw new Error('bindAll must be passed function names');
- for (i = 1; i < length; i++) {
- key = arguments[i];
- obj[key] = _.bind(obj[key], obj);
- }
- return obj;
- };
-
- // Memoize an expensive function by storing its results.
- _.memoize = function(func, hasher) {
- var memoize = function(key) {
- var cache = memoize.cache;
- var address = '' + (hasher ? hasher.apply(this, arguments) : key);
- if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);
- return cache[address];
- };
- memoize.cache = {};
- return memoize;
- };
-
- // Delays a function for the given number of milliseconds, and then calls
- // it with the arguments supplied.
- _.delay = function(func, wait) {
- var args = slice.call(arguments, 2);
- return setTimeout(function(){
- return func.apply(null, args);
- }, wait);
- };
-
- // Defers a function, scheduling it to run after the current call stack has
- // cleared.
- _.defer = _.partial(_.delay, _, 1);
-
- // Returns a function, that, when invoked, will only be triggered at most once
- // during a given window of time. Normally, the throttled function will run
- // as much as it can, without ever going more than once per `wait` duration;
- // but if you'd like to disable the execution on the leading edge, pass
- // `{leading: false}`. To disable execution on the trailing edge, ditto.
- _.throttle = function(func, wait, options) {
- var context, args, result;
- var timeout = null;
- var previous = 0;
- if (!options) options = {};
- var later = function() {
- previous = options.leading === false ? 0 : _.now();
- timeout = null;
- result = func.apply(context, args);
- if (!timeout) context = args = null;
- };
- return function() {
- var now = _.now();
- if (!previous && options.leading === false) previous = now;
- var remaining = wait - (now - previous);
- context = this;
- args = arguments;
- if (remaining <= 0 || remaining > wait) {
- if (timeout) {
- clearTimeout(timeout);
- timeout = null;
- }
- previous = now;
- result = func.apply(context, args);
- if (!timeout) context = args = null;
- } else if (!timeout && options.trailing !== false) {
- timeout = setTimeout(later, remaining);
- }
- return result;
- };
- };
-
- // Returns a function, that, as long as it continues to be invoked, will not
- // be triggered. The function will be called after it stops being called for
- // N milliseconds. If `immediate` is passed, trigger the function on the
- // leading edge, instead of the trailing.
- _.debounce = function(func, wait, immediate) {
- var timeout, args, context, timestamp, result;
-
- var later = function() {
- var last = _.now() - timestamp;
-
- if (last < wait && last >= 0) {
- timeout = setTimeout(later, wait - last);
- } else {
- timeout = null;
- if (!immediate) {
- result = func.apply(context, args);
- if (!timeout) context = args = null;
- }
- }
- };
-
- return function() {
- context = this;
- args = arguments;
- timestamp = _.now();
- var callNow = immediate && !timeout;
- if (!timeout) timeout = setTimeout(later, wait);
- if (callNow) {
- result = func.apply(context, args);
- context = args = null;
- }
-
- return result;
- };
- };
-
- // Returns the first function passed as an argument to the second,
- // allowing you to adjust arguments, run code before and after, and
- // conditionally execute the original function.
- _.wrap = function(func, wrapper) {
- return _.partial(wrapper, func);
- };
-
- // Returns a negated version of the passed-in predicate.
- _.negate = function(predicate) {
- return function() {
- return !predicate.apply(this, arguments);
- };
- };
-
- // Returns a function that is the composition of a list of functions, each
- // consuming the return value of the function that follows.
- _.compose = function() {
- var args = arguments;
- var start = args.length - 1;
- return function() {
- var i = start;
- var result = args[start].apply(this, arguments);
- while (i--) result = args[i].call(this, result);
- return result;
- };
- };
-
- // Returns a function that will only be executed on and after the Nth call.
- _.after = function(times, func) {
- return function() {
- if (--times < 1) {
- return func.apply(this, arguments);
- }
- };
- };
-
- // Returns a function that will only be executed up to (but not including) the Nth call.
- _.before = function(times, func) {
- var memo;
- return function() {
- if (--times > 0) {
- memo = func.apply(this, arguments);
- }
- if (times <= 1) func = null;
- return memo;
- };
- };
-
- // Returns a function that will be executed at most one time, no matter how
- // often you call it. Useful for lazy initialization.
- _.once = _.partial(_.before, 2);
-
- // Object Functions
- // ----------------
-
- // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
- var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
- var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
- 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
-
- function collectNonEnumProps(obj, keys) {
- var nonEnumIdx = nonEnumerableProps.length;
- var constructor = obj.constructor;
- var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto;
-
- // Constructor is a special case.
- var prop = 'constructor';
- if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);
-
- while (nonEnumIdx--) {
- prop = nonEnumerableProps[nonEnumIdx];
- if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {
- keys.push(prop);
- }
- }
- }
-
- // Retrieve the names of an object's own properties.
- // Delegates to **ECMAScript 5**'s native `Object.keys`
- _.keys = function(obj) {
- if (!_.isObject(obj)) return [];
- if (nativeKeys) return nativeKeys(obj);
- var keys = [];
- for (var key in obj) if (_.has(obj, key)) keys.push(key);
- // Ahem, IE < 9.
- if (hasEnumBug) collectNonEnumProps(obj, keys);
- return keys;
- };
-
- // Retrieve all the property names of an object.
- _.allKeys = function(obj) {
- if (!_.isObject(obj)) return [];
- var keys = [];
- for (var key in obj) keys.push(key);
- // Ahem, IE < 9.
- if (hasEnumBug) collectNonEnumProps(obj, keys);
- return keys;
- };
-
- // Retrieve the values of an object's properties.
- _.values = function(obj) {
- var keys = _.keys(obj);
- var length = keys.length;
- var values = Array(length);
- for (var i = 0; i < length; i++) {
- values[i] = obj[keys[i]];
- }
- return values;
- };
-
- // Returns the results of applying the iteratee to each element of the object
- // In contrast to _.map it returns an object
- _.mapObject = function(obj, iteratee, context) {
- iteratee = cb(iteratee, context);
- var keys = _.keys(obj),
- length = keys.length,
- results = {},
- currentKey;
- for (var index = 0; index < length; index++) {
- currentKey = keys[index];
- results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
- }
- return results;
- };
-
- // Convert an object into a list of `[key, value]` pairs.
- _.pairs = function(obj) {
- var keys = _.keys(obj);
- var length = keys.length;
- var pairs = Array(length);
- for (var i = 0; i < length; i++) {
- pairs[i] = [keys[i], obj[keys[i]]];
- }
- return pairs;
- };
-
- // Invert the keys and values of an object. The values must be serializable.
- _.invert = function(obj) {
- var result = {};
- var keys = _.keys(obj);
- for (var i = 0, length = keys.length; i < length; i++) {
- result[obj[keys[i]]] = keys[i];
- }
- return result;
- };
-
- // Return a sorted list of the function names available on the object.
- // Aliased as `methods`
- _.functions = _.methods = function(obj) {
- var names = [];
- for (var key in obj) {
- if (_.isFunction(obj[key])) names.push(key);
- }
- return names.sort();
- };
-
- // Extend a given object with all the properties in passed-in object(s).
- _.extend = createAssigner(_.allKeys);
-
- // Assigns a given object with all the own properties in the passed-in object(s)
- // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
- _.extendOwn = _.assign = createAssigner(_.keys);
-
- // Returns the first key on an object that passes a predicate test
- _.findKey = function(obj, predicate, context) {
- predicate = cb(predicate, context);
- var keys = _.keys(obj), key;
- for (var i = 0, length = keys.length; i < length; i++) {
- key = keys[i];
- if (predicate(obj[key], key, obj)) return key;
- }
- };
-
- // Return a copy of the object only containing the whitelisted properties.
- _.pick = function(object, oiteratee, context) {
- var result = {}, obj = object, iteratee, keys;
- if (obj == null) return result;
- if (_.isFunction(oiteratee)) {
- keys = _.allKeys(obj);
- iteratee = optimizeCb(oiteratee, context);
- } else {
- keys = flatten(arguments, false, false, 1);
- iteratee = function(value, key, obj) { return key in obj; };
- obj = Object(obj);
- }
- for (var i = 0, length = keys.length; i < length; i++) {
- var key = keys[i];
- var value = obj[key];
- if (iteratee(value, key, obj)) result[key] = value;
- }
- return result;
- };
-
- // Return a copy of the object without the blacklisted properties.
- _.omit = function(obj, iteratee, context) {
- if (_.isFunction(iteratee)) {
- iteratee = _.negate(iteratee);
- } else {
- var keys = _.map(flatten(arguments, false, false, 1), String);
- iteratee = function(value, key) {
- return !_.contains(keys, key);
- };
- }
- return _.pick(obj, iteratee, context);
- };
-
- // Fill in a given object with default properties.
- _.defaults = createAssigner(_.allKeys, true);
-
- // Creates an object that inherits from the given prototype object.
- // If additional properties are provided then they will be added to the
- // created object.
- _.create = function(prototype, props) {
- var result = baseCreate(prototype);
- if (props) _.extendOwn(result, props);
- return result;
- };
-
- // Create a (shallow-cloned) duplicate of an object.
- _.clone = function(obj) {
- if (!_.isObject(obj)) return obj;
- return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
- };
-
- // Invokes interceptor with the obj, and then returns obj.
- // The primary purpose of this method is to "tap into" a method chain, in
- // order to perform operations on intermediate results within the chain.
- _.tap = function(obj, interceptor) {
- interceptor(obj);
- return obj;
- };
-
- // Returns whether an object has a given set of `key:value` pairs.
- _.isMatch = function(object, attrs) {
- var keys = _.keys(attrs), length = keys.length;
- if (object == null) return !length;
- var obj = Object(object);
- for (var i = 0; i < length; i++) {
- var key = keys[i];
- if (attrs[key] !== obj[key] || !(key in obj)) return false;
- }
- return true;
- };
-
-
- // Internal recursive comparison function for `isEqual`.
- var eq = function(a, b, aStack, bStack) {
- // Identical objects are equal. `0 === -0`, but they aren't identical.
- // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
- if (a === b) return a !== 0 || 1 / a === 1 / b;
- // A strict comparison is necessary because `null == undefined`.
- if (a == null || b == null) return a === b;
- // Unwrap any wrapped objects.
- if (a instanceof _) a = a._wrapped;
- if (b instanceof _) b = b._wrapped;
- // Compare `[[Class]]` names.
- var className = toString.call(a);
- if (className !== toString.call(b)) return false;
- switch (className) {
- // Strings, numbers, regular expressions, dates, and booleans are compared by value.
- case '[object RegExp]':
- // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
- case '[object String]':
- // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
- // equivalent to `new String("5")`.
- return '' + a === '' + b;
- case '[object Number]':
- // `NaN`s are equivalent, but non-reflexive.
- // Object(NaN) is equivalent to NaN
- if (+a !== +a) return +b !== +b;
- // An `egal` comparison is performed for other numeric values.
- return +a === 0 ? 1 / +a === 1 / b : +a === +b;
- case '[object Date]':
- case '[object Boolean]':
- // Coerce dates and booleans to numeric primitive values. Dates are compared by their
- // millisecond representations. Note that invalid dates with millisecond representations
- // of `NaN` are not equivalent.
- return +a === +b;
- }
-
- var areArrays = className === '[object Array]';
- if (!areArrays) {
- if (typeof a != 'object' || typeof b != 'object') return false;
-
- // Objects with different constructors are not equivalent, but `Object`s or `Array`s
- // from different frames are.
- var aCtor = a.constructor, bCtor = b.constructor;
- if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor &&
- _.isFunction(bCtor) && bCtor instanceof bCtor)
- && ('constructor' in a && 'constructor' in b)) {
- return false;
- }
- }
- // Assume equality for cyclic structures. The algorithm for detecting cyclic
- // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
-
- // Initializing stack of traversed objects.
- // It's done here since we only need them for objects and arrays comparison.
- aStack = aStack || [];
- bStack = bStack || [];
- var length = aStack.length;
- while (length--) {
- // Linear search. Performance is inversely proportional to the number of
- // unique nested structures.
- if (aStack[length] === a) return bStack[length] === b;
- }
-
- // Add the first object to the stack of traversed objects.
- aStack.push(a);
- bStack.push(b);
-
- // Recursively compare objects and arrays.
- if (areArrays) {
- // Compare array lengths to determine if a deep comparison is necessary.
- length = a.length;
- if (length !== b.length) return false;
- // Deep compare the contents, ignoring non-numeric properties.
- while (length--) {
- if (!eq(a[length], b[length], aStack, bStack)) return false;
- }
- } else {
- // Deep compare objects.
- var keys = _.keys(a), key;
- length = keys.length;
- // Ensure that both objects contain the same number of properties before comparing deep equality.
- if (_.keys(b).length !== length) return false;
- while (length--) {
- // Deep compare each member
- key = keys[length];
- if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
- }
- }
- // Remove the first object from the stack of traversed objects.
- aStack.pop();
- bStack.pop();
- return true;
- };
-
- // Perform a deep comparison to check if two objects are equal.
- _.isEqual = function(a, b) {
- return eq(a, b);
- };
-
- // Is a given array, string, or object empty?
- // An "empty" object has no enumerable own-properties.
- _.isEmpty = function(obj) {
- if (obj == null) return true;
- if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;
- return _.keys(obj).length === 0;
- };
-
- // Is a given value a DOM element?
- _.isElement = function(obj) {
- return !!(obj && obj.nodeType === 1);
- };
-
- // Is a given value an array?
- // Delegates to ECMA5's native Array.isArray
- _.isArray = nativeIsArray || function(obj) {
- return toString.call(obj) === '[object Array]';
- };
-
- // Is a given variable an object?
- _.isObject = function(obj) {
- var type = typeof obj;
- return type === 'function' || type === 'object' && !!obj;
- };
-
- // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.
- _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {
- _['is' + name] = function(obj) {
- return toString.call(obj) === '[object ' + name + ']';
- };
- });
-
- // Define a fallback version of the method in browsers (ahem, IE < 9), where
- // there isn't any inspectable "Arguments" type.
- if (!_.isArguments(arguments)) {
- _.isArguments = function(obj) {
- return _.has(obj, 'callee');
- };
- }
-
- // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,
- // IE 11 (#1621), and in Safari 8 (#1929).
- if (typeof /./ != 'function' && typeof Int8Array != 'object') {
- _.isFunction = function(obj) {
- return typeof obj == 'function' || false;
- };
- }
-
- // Is a given object a finite number?
- _.isFinite = function(obj) {
- return isFinite(obj) && !isNaN(parseFloat(obj));
- };
-
- // Is the given value `NaN`? (NaN is the only number which does not equal itself).
- _.isNaN = function(obj) {
- return _.isNumber(obj) && obj !== +obj;
- };
-
- // Is a given value a boolean?
- _.isBoolean = function(obj) {
- return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
- };
-
- // Is a given value equal to null?
- _.isNull = function(obj) {
- return obj === null;
- };
-
- // Is a given variable undefined?
- _.isUndefined = function(obj) {
- return obj === void 0;
- };
-
- // Shortcut function for checking if an object has a given property directly
- // on itself (in other words, not on a prototype).
- _.has = function(obj, key) {
- return obj != null && hasOwnProperty.call(obj, key);
- };
-
- // Utility Functions
- // -----------------
-
- // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
- // previous owner. Returns a reference to the Underscore object.
- _.noConflict = function() {
- root._ = previousUnderscore;
- return this;
- };
-
- // Keep the identity function around for default iteratees.
- _.identity = function(value) {
- return value;
- };
-
- // Predicate-generating functions. Often useful outside of Underscore.
- _.constant = function(value) {
- return function() {
- return value;
- };
- };
-
- _.noop = function(){};
-
- _.property = function(key) {
- return function(obj) {
- return obj == null ? void 0 : obj[key];
- };
- };
-
- // Generates a function for a given object that returns a given property.
- _.propertyOf = function(obj) {
- return obj == null ? function(){} : function(key) {
- return obj[key];
- };
- };
-
- // Returns a predicate for checking whether an object has a given set of
- // `key:value` pairs.
- _.matcher = _.matches = function(attrs) {
- attrs = _.extendOwn({}, attrs);
- return function(obj) {
- return _.isMatch(obj, attrs);
- };
- };
-
- // Run a function **n** times.
- _.times = function(n, iteratee, context) {
- var accum = Array(Math.max(0, n));
- iteratee = optimizeCb(iteratee, context, 1);
- for (var i = 0; i < n; i++) accum[i] = iteratee(i);
- return accum;
- };
-
- // Return a random integer between min and max (inclusive).
- _.random = function(min, max) {
- if (max == null) {
- max = min;
- min = 0;
- }
- return min + Math.floor(Math.random() * (max - min + 1));
- };
-
- // A (possibly faster) way to get the current timestamp as an integer.
- _.now = Date.now || function() {
- return new Date().getTime();
- };
-
- // List of HTML entities for escaping.
- var escapeMap = {
- '&': '&',
- '<': '<',
- '>': '>',
- '"': '"',
- "'": ''',
- '`': '`'
- };
- var unescapeMap = _.invert(escapeMap);
-
- // Functions for escaping and unescaping strings to/from HTML interpolation.
- var createEscaper = function(map) {
- var escaper = function(match) {
- return map[match];
- };
- // Regexes for identifying a key that needs to be escaped
- var source = '(?:' + _.keys(map).join('|') + ')';
- var testRegexp = RegExp(source);
- var replaceRegexp = RegExp(source, 'g');
- return function(string) {
- string = string == null ? '' : '' + string;
- return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
- };
- };
- _.escape = createEscaper(escapeMap);
- _.unescape = createEscaper(unescapeMap);
-
- // If the value of the named `property` is a function then invoke it with the
- // `object` as context; otherwise, return it.
- _.result = function(object, property, fallback) {
- var value = object == null ? void 0 : object[property];
- if (value === void 0) {
- value = fallback;
- }
- return _.isFunction(value) ? value.call(object) : value;
- };
-
- // Generate a unique integer id (unique within the entire client session).
- // Useful for temporary DOM ids.
- var idCounter = 0;
- _.uniqueId = function(prefix) {
- var id = ++idCounter + '';
- return prefix ? prefix + id : id;
- };
-
- // By default, Underscore uses ERB-style template delimiters, change the
- // following template settings to use alternative delimiters.
- _.templateSettings = {
- evaluate : /<%([\s\S]+?)%>/g,
- interpolate : /<%=([\s\S]+?)%>/g,
- escape : /<%-([\s\S]+?)%>/g
- };
-
- // When customizing `templateSettings`, if you don't want to define an
- // interpolation, evaluation or escaping regex, we need one that is
- // guaranteed not to match.
- var noMatch = /(.)^/;
-
- // Certain characters need to be escaped so that they can be put into a
- // string literal.
- var escapes = {
- "'": "'",
- '\\': '\\',
- '\r': 'r',
- '\n': 'n',
- '\u2028': 'u2028',
- '\u2029': 'u2029'
- };
-
- var escaper = /\\|'|\r|\n|\u2028|\u2029/g;
-
- var escapeChar = function(match) {
- return '\\' + escapes[match];
- };
-
- // JavaScript micro-templating, similar to John Resig's implementation.
- // Underscore templating handles arbitrary delimiters, preserves whitespace,
- // and correctly escapes quotes within interpolated code.
- // NB: `oldSettings` only exists for backwards compatibility.
- _.template = function(text, settings, oldSettings) {
- if (!settings && oldSettings) settings = oldSettings;
- settings = _.defaults({}, settings, _.templateSettings);
-
- // Combine delimiters into one regular expression via alternation.
- var matcher = RegExp([
- (settings.escape || noMatch).source,
- (settings.interpolate || noMatch).source,
- (settings.evaluate || noMatch).source
- ].join('|') + '|$', 'g');
-
- // Compile the template source, escaping string literals appropriately.
- var index = 0;
- var source = "__p+='";
- text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
- source += text.slice(index, offset).replace(escaper, escapeChar);
- index = offset + match.length;
-
- if (escape) {
- source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
- } else if (interpolate) {
- source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
- } else if (evaluate) {
- source += "';\n" + evaluate + "\n__p+='";
- }
-
- // Adobe VMs need the match returned to produce the correct offest.
- return match;
- });
- source += "';\n";
-
- // If a variable is not specified, place data values in local scope.
- if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
-
- source = "var __t,__p='',__j=Array.prototype.join," +
- "print=function(){__p+=__j.call(arguments,'');};\n" +
- source + 'return __p;\n';
-
- try {
- var render = new Function(settings.variable || 'obj', '_', source);
- } catch (e) {
- e.source = source;
- throw e;
- }
-
- var template = function(data) {
- return render.call(this, data, _);
- };
-
- // Provide the compiled source as a convenience for precompilation.
- var argument = settings.variable || 'obj';
- template.source = 'function(' + argument + '){\n' + source + '}';
-
- return template;
- };
-
- // Add a "chain" function. Start chaining a wrapped Underscore object.
- _.chain = function(obj) {
- var instance = _(obj);
- instance._chain = true;
- return instance;
- };
-
- // OOP
- // ---------------
- // If Underscore is called as a function, it returns a wrapped object that
- // can be used OO-style. This wrapper holds altered versions of all the
- // underscore functions. Wrapped objects may be chained.
-
- // Helper function to continue chaining intermediate results.
- var result = function(instance, obj) {
- return instance._chain ? _(obj).chain() : obj;
- };
-
- // Add your own custom functions to the Underscore object.
- _.mixin = function(obj) {
- _.each(_.functions(obj), function(name) {
- var func = _[name] = obj[name];
- _.prototype[name] = function() {
- var args = [this._wrapped];
- push.apply(args, arguments);
- return result(this, func.apply(_, args));
- };
- });
- };
-
- // Add all of the Underscore functions to the wrapper object.
- _.mixin(_);
-
- // Add all mutator Array functions to the wrapper.
- _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
- var method = ArrayProto[name];
- _.prototype[name] = function() {
- var obj = this._wrapped;
- method.apply(obj, arguments);
- if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];
- return result(this, obj);
- };
- });
-
- // Add all accessor Array functions to the wrapper.
- _.each(['concat', 'join', 'slice'], function(name) {
- var method = ArrayProto[name];
- _.prototype[name] = function() {
- return result(this, method.apply(this._wrapped, arguments));
- };
- });
-
- // Extracts the result from a wrapped and chained object.
- _.prototype.value = function() {
- return this._wrapped;
- };
-
- // Provide unwrapping proxy for some methods used in engine operations
- // such as arithmetic and JSON stringification.
- _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;
-
- _.prototype.toString = function() {
- return '' + this._wrapped;
- };
-
- // AMD registration happens at the end for compatibility with AMD loaders
- // that may not enforce next-turn semantics on modules. Even though general
- // practice for AMD registration is to be anonymous, underscore registers
- // as a named module because, like jQuery, it is a base library that is
- // popular enough to be bundled in a third party lib, but not be part of
- // an AMD load request. Those cases could generate an error when an
- // anonymous define() is called outside of a loader request.
- if (typeof define === 'function' && define.amd) {
- define('underscore', [], function() {
- return _;
- });
- }
-}.call(this));/**
- * Created by richie on 15/7/8.
- */
-/**
- * 初始化BI对象
- */
-if (window.BI == null) {
- window.BI = {};
-}/**
- * 基本函数
- * Create By GUY 2014\11\17
- *
- */
-
-if (!window.BI) {
- window.BI = {};
-}
-;
-!(function ($, undefined) {
- var traverse = function (func, context) {
- return function (value, key, obj) {
- return func.call(context, key, value, obj);
- }
- };
- var _apply = function (name) {
- return function () {
- return _[name].apply(_, arguments);
- }
- };
- var _applyFunc = function (name) {
- return function () {
- var args = Array.prototype.slice.call(arguments, 0);
- args[1] = _.isFunction(args[1]) ? traverse(args[1], args[2]) : args[1];
- return _[name].apply(_, args);
- }
- };
-
- //Utility
- _.extend(BI, {
- i18nText: function (key) {
- var localeText = (BI.i18n && BI.i18n[key]) || "";
- if (!localeText) {
- localeText = key;
- }
- var len = arguments.length;
- if (len > 1) {
- for (var i = 1; i < len; i++) {
- var key = "{R" + i + "}";
- localeText = localeText.replaceAll(key, arguments[i] + "");
- }
- }
- return localeText;
- },
-
- assert: function (v, is) {
- if (this.isFunction(is)) {
- if (!is(v)) {
- throw new Error(v + " error");
- } else {
- return true;
- }
- }
- if (!this.isArray(is)) {
- is = [is];
- }
- if (!this.deepContains(is, v)) {
- throw new Error(v + " error");
- }
- },
-
- warn: function (message) {
- console.warn(message)
- },
-
- UUID: function () {
- var f = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
- var str = "";
- for (var i = 0; i < 16; i++) {
- var r = parseInt(f.length * Math.random(), 10);
- str += f[r];
- }
- return str;
- },
-
- isWidget: function (widget) {
- return widget instanceof BI.Widget || (BI.View && widget instanceof BI.View);
- },
-
- createWidgets: function (items, options) {
- if (!BI.isArray(items)) {
- throw new Error("cannot create Widgets")
- }
- return BI.map(BI.flatten(items), function (i, item) {
- return BI.createWidget(item, BI.deepClone(options));
- });
- },
-
- createItems: function (data, innerAttr, outerAttr) {
- innerAttr = BI.isArray(innerAttr) ? innerAttr : BI.makeArray(BI.flatten(data).length, innerAttr);
- outerAttr = BI.isArray(outerAttr) ? outerAttr : BI.makeArray(BI.flatten(data).length, outerAttr);
- return BI.map(data, function (i, item) {
- if (BI.isArray(item)) {
- return BI.createItems(item, innerAttr, outerAttr);
- }
- if (item instanceof BI.Widget) {
- return BI.extend({}, innerAttr.shift(), outerAttr.shift(), {
- type: null,
- el: item
- });
- }
- if (innerAttr[0] instanceof BI.Widget) {
- outerAttr.shift();
- return BI.extend({}, item, {
- el: innerAttr.shift()
- })
- }
- if (item.el instanceof BI.Widget || (BI.View && item.el instanceof BI.View)) {
- innerAttr.shift();
- return BI.extend({}, outerAttr.shift(), {type: null}, item);
- }
- if (item.el) {
- return BI.extend({}, outerAttr.shift(), item, {
- el: BI.extend({}, innerAttr.shift(), item.el)
- })
- }
- return BI.extend({}, outerAttr.shift(), {
- el: BI.extend({}, innerAttr.shift(), item)
- })
- })
- },
-
- //用容器包装items
- packageItems: function (items, layouts) {
- for (var i = layouts.length - 1; i >= 0; i--) {
- items = BI.map(items, function (k, it) {
- return BI.extend({}, layouts[i], {
- items: [
- BI.extend({}, layouts[i].el, {
- el: it
- })
- ]
- })
- })
- }
- return items;
- },
-
- formatEL: function (obj) {
- if (obj && !obj.type && obj.el) {
- return obj;
- }
- return {
- el: obj
- };
- },
-
- //剥开EL
- stripEL: function (obj) {
- return obj.type && obj || obj.el || obj;
- },
-
- trans2Element: function (widgets) {
- return BI.map(widgets, function (i, wi) {
- return wi.element;
- });
- }
- });
-
- //集合相关方法
- _.each(["where", "findWhere", "contains", "invoke", "pluck", "shuffle", "sample", "toArray", "size"], function (name) {
- BI[name] = _apply(name)
- });
- _.each(["each", "map", "reduce", "reduceRight", "find", "filter", "reject", "every", "all", "some", "any", "max", "min",
- "sortBy", "groupBy", "indexBy", "countBy", "partition"], function (name) {
- BI[name] = _applyFunc(name)
- });
- _.extend(BI, {
- clamp: function (value, minValue, maxValue) {
- if (value < minValue) {
- value = minValue;
- }
- if (value > maxValue) {
- value = maxValue;
- }
- return value;
- },
- //数数
- count: function (from, to, predicate) {
- var t;
- if (predicate) {
- for (t = from; t < to; t++) {
- predicate(t);
- }
- }
- return to - from;
- },
-
- //倒数
- inverse: function (from, to, predicate) {
- return BI.count(to, from, predicate);
- },
-
- firstKey: function (obj) {
- var res = undefined;
- BI.any(obj, function (key, value) {
- res = key;
- return true;
- });
- return res;
- },
-
- lastKey: function (obj) {
- var res = undefined;
- BI.each(obj, function (key, value) {
- res = key;
- return true;
- });
- return res;
- },
-
- firstObject: function (obj) {
- var res = undefined;
- BI.any(obj, function (key, value) {
- res = value;
- return true;
- });
- return res;
- },
-
- lastObject: function (obj) {
- var res = undefined;
- BI.each(obj, function (key, value) {
- res = value;
- return true;
- });
- return res;
- },
-
- concat: function (obj1, obj2) {
- if (BI.isKey(obj1)) {
- return obj1 + "" + obj2;
- }
- if (BI.isArray(obj1)) {
- return obj1.concat(obj2);
- }
- if (BI.isObject(obj1)) {
- return _.extend({}, obj1, obj2);
- }
- },
-
- backEach: function (obj, predicate, context) {
- predicate = BI.iteratee(predicate, context);
- for (var index = obj.length - 1; index >= 0; index--) {
- predicate(index, obj[index], obj);
- }
- return false;
- },
-
- backAny: function (obj, predicate, context) {
- predicate = BI.iteratee(predicate, context);
- for (var index = obj.length - 1; index >= 0; index--) {
- if (predicate(index, obj[index], obj)) {
- return true;
- }
- }
- return false;
- },
-
- backEvery: function (obj, predicate, context) {
- predicate = BI.iteratee(predicate, context);
- for (var index = obj.length - 1; index >= 0; index--) {
- if (!predicate(index, obj[index], obj)) {
- return false;
- }
- }
- return true;
- },
-
- backFindKey: function (obj, predicate, context) {
- predicate = BI.iteratee(predicate, context);
- var keys = _.keys(obj), key;
- for (var i = keys.length - 1; i >= 0; i--) {
- key = keys[i];
- if (predicate(obj[key], key, obj)) {
- return key;
- }
- }
- },
-
- backFind: function (obj, predicate, context) {
- var key;
- if (BI.isArray(obj)) {
- key = BI.findLastIndex(obj, predicate, context);
- } else {
- key = BI.backFindKey(obj, predicate, context);
- }
- if (key !== void 0 && key !== -1) {
- return obj[key];
- }
- },
-
- remove: function (obj, target, context) {
- var isFunction = BI.isFunction(target);
- target = isFunction || BI.isArray(target) ? target : [target];
- var i;
- if (BI.isArray(obj)) {
- for (i = 0; i < obj.length; i++) {
- if ((isFunction && target.apply(context, [i, obj[i]]) === true) || (!isFunction && target.contains(obj[i]))) {
- obj.splice(i--, 1);
- }
- }
- } else {
- BI.each(obj, function (i, v) {
- if ((isFunction && target.apply(context, [i, obj[i]]) === true) || (!isFunction && target.contains(obj[i]))) {
- delete obj[i];
- }
- });
- }
- },
-
- removeAt: function (obj, index) {
- index = BI.isArray(index) ? index : [index];
- var isArray = BI.isArray(obj), i;
- for (i = 0; i < index.length; i++) {
- if (isArray) {
- obj[index[i]] = "$deleteIndex";
- } else {
- delete obj[index[i]];
- }
- }
- if (isArray) {
- BI.remove(obj, "$deleteIndex");
- }
- },
-
- string2Array: function (str) {
- return str.split('&-&');
- },
-
- array2String: function (array) {
- return array.join("&-&");
- },
-
- abc2Int: function (str) {
- var idx = 0, start = 'A', str = str.toUpperCase();
- for (var i = 0, len = str.length; i < len; ++i) {
- idx = str.charAt(i).charCodeAt(0) - start.charCodeAt(0) + 26 * idx + 1;
- if (idx > (2147483646 - str.charAt(i).charCodeAt(0) + start.charCodeAt(0)) / 26) {
- return 0;
- }
- }
- return idx;
- },
-
- int2Abc: function (num) {
- var DIGITS = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
- var idx = num, str = "";
- if (num === 0) {
- return "";
- }
- while (idx !== 0) {
- var t = idx % 26;
- if (t === 0) {
- t = 26;
- }
- str = DIGITS[t - 1] + str;
- idx = (idx - t) / 26;
- }
- return str;
- }
- });
-
- //数组相关的方法
- _.each(["first", "initial", "last", "rest", "compact", "flatten", "without", "union", "intersection",
- "difference", "zip", "unzip", "object", "indexOf", "lastIndexOf", "sortedIndex", "range"], function (name) {
- BI[name] = _apply(name)
- });
- _.each(["findIndex", "findLastIndex"], function (name) {
- BI[name] = _applyFunc(name)
- });
- _.extend(BI, {
- //构建一个长度为length的数组
- makeArray: function (length, value) {
- var res = [];
- for (var i = 0; i < length; i++) {
- if (BI.isNull(value)) {
- res.push(i);
- } else {
- res.push(BI.deepClone(value));
- }
- }
- return res;
- },
-
- makeObject: function (array, value) {
- var map = {};
- for (var i = 0; i < array.length; i++) {
- if (BI.isNull(value)) {
- map[array[i]] = array[i];
- } else {
- map[array[i]] = BI.deepClone(value);
- }
- }
- return map;
- },
-
- makeArrayByArray: function (array, value) {
- var res = [];
- if (!array) {
- return res;
- }
- for (var i = 0, len = array.length; i < len; i++) {
- if (BI.isArray(array[i])) {
- res.push(arguments.callee(array[i], value));
- } else {
- res.push(BI.deepClone(value));
- }
- }
- return res;
- },
-
- uniq: function (array, isSorted, iteratee, context) {
- if (array == null) {
- return [];
- }
- if (!_.isBoolean(isSorted)) {
- context = iteratee;
- iteratee = isSorted;
- isSorted = false;
- }
- iteratee && (iteratee = traverse(iteratee, context));
- return _.uniq.call(_, array, isSorted, iteratee, context);
- }
- });
-
- //对象相关方法
- _.each(["keys", "allKeys", "values", "pairs", "invert", "create", "functions", "extend", "extendOwn",
- "defaults", "clone", "property", "propertyOf", "matcher", "isEqual", "isMatch", "isEmpty",
- "isElement", "isNumber", "isString", "isArray", "isObject", "isArguments", "isFunction", "isFinite",
- "isBoolean", "isDate", "isRegExp", "isError", "isNaN", "isUndefined"], function (name) {
- BI[name] = _apply(name)
- });
- _.each(["mapObject", "findKey", "pick", "omit", "tap"], function (name) {
- BI[name] = _applyFunc(name)
- });
- _.extend(BI, {
-
- inherit: function (sb, sp, overrides) {
- if (typeof sp == 'object') {
- overrides = sp;
- sp = sb;
- sb = function () {
- return sp.apply(this, arguments);
- };
- }
- var F = function () {
- }, spp = sp.prototype;
- F.prototype = spp;
- sb.prototype = new F();
- sb.superclass = spp;
- _.extend(sb.prototype, overrides, {
- superclass: sp
- });
- return sb;
- },
-
- has: function (obj, keys) {
- if (BI.isArray(keys)) {
- if (keys.length === 0) {
- return false;
- }
- return BI.every(keys, function (i, key) {
- return _.has(obj, key);
- });
- }
- return _.has.apply(_, arguments);
- },
-
- //数字和字符串可以作为key
- isKey: function (key) {
- return BI.isNumber(key) || (BI.isString(key) && key.length > 0);
- },
-
- //忽略大小写的等于
- isCapitalEqual: function (a, b) {
- a = BI.isNull(a) ? a : ("" + a).toLowerCase();
- b = BI.isNull(b) ? b : ("" + b).toLowerCase();
- return BI.isEqual(a, b);
- },
-
- isWidthOrHeight: function (w) {
- if (typeof w == 'number') {
- return w >= 0;
- } else if (typeof w == 'string') {
- return /^\d{1,3}%$/.exec(w) || w == 'auto' || /^\d+px$/.exec(w);
- }
- },
-
- isNotNull: function (obj) {
- return !BI.isNull(obj);
- },
-
- isNull: function (obj) {
- return typeof obj === "undefined" || obj === null;
- },
-
- isPlainObject: function () {
- return $.isPlainObject.apply($, arguments);
- },
-
- isEmptyArray: function (arr) {
- return BI.isArray(arr) && BI.isEmpty(arr);
- },
-
- isNotEmptyArray: function (arr) {
- return BI.isArray(arr) && !BI.isEmpty(arr);
- },
-
- isEmptyObject: function (obj) {
- return BI.isEqual(obj, {});
- },
-
- isNotEmptyObject: function (obj) {
- return BI.isPlainObject(obj) && !BI.isEmptyObject(obj);
- },
-
- isEmptyString: function (obj) {
- return BI.isString(obj) && obj.length === 0;
- },
-
- isNotEmptyString: function (obj) {
- return BI.isString(obj) && !BI.isEmptyString(obj);
- },
-
- isWindow: function () {
- return $.isWindow.apply($, arguments);
- }
- });
-
- //deep方法
- _.extend(BI, {
- /**
- *完全克隆�?个js对象
- * @param obj
- * @returns {*}
- */
- deepClone: function (obj) {
- if (obj === null || obj === undefined) {
- return obj;
- }
-
- var type = Object.prototype.toString.call(obj);
-
- // Date
- if (type === '[object Date]') {
- return Date.getDate(obj.getTime());
- }
-
- var i, clone, key;
-
- // Array
- if (type === '[object Array]') {
- i = obj.length;
-
- clone = [];
-
- while (i--) {
- clone[i] = BI.deepClone(obj[i]);
- }
- }
- // Object
- else if (type === '[object Object]' && obj.constructor === Object) {
- clone = {};
-
- for (var i in obj) {
- if (_.has(obj, i)) {
- clone[i] = BI.deepClone(obj[i]);
- }
- }
- }
-
- return clone || obj;
- },
-
- isDeepMatch: function (object, attrs) {
- var keys = BI.keys(attrs), length = keys.length;
- if (object == null) {
- return !length;
- }
- var obj = Object(object);
- for (var i = 0; i < length; i++) {
- var key = keys[i];
- if (!BI.isEqual(attrs[key], obj[key]) || !(key in obj)) {
- return false;
- }
- }
- return true;
- },
-
- deepContains: function (obj, copy) {
- if (BI.isObject(copy)) {
- return BI.any(obj, function (i, v) {
- if (BI.isEqual(v, copy)) {
- return true;
- }
- })
- }
- return BI.contains(obj, copy);
- },
-
- deepIndexOf: function (obj, target) {
- for (var i = 0; i < obj.length; i++) {
- if (BI.isEqual(target, obj[i])) {
- return i;
- }
- }
- return -1;
- },
-
- deepRemove: function (obj, target) {
- var done = false;
- var i;
- if (BI.isArray(obj)) {
- for (i = 0; i < obj.length; i++) {
- if (BI.isEqual(target, obj[i])) {
- obj.splice(i--, 1);
- done = true;
- }
- }
- } else {
- BI.each(obj, function (i, v) {
- if (BI.isEqual(target, obj[i])) {
- delete obj[i];
- done = true;
- }
- });
- }
- return done;
- },
-
- deepWithout: function (obj, target) {
- if (BI.isArray(obj)) {
- var result = [];
- for (var i = 0; i < obj.length; i++) {
- if (!BI.isEqual(target, obj[i])) {
- result.push(obj[i]);
- }
- }
- return result;
- } else {
- var result = {};
- BI.each(obj, function (i, v) {
- if (!BI.isEqual(target, obj[i])) {
- result[i] = v;
- }
- });
- return result;
- }
- },
-
- deepUnique: function (array) {
- var result = [];
- BI.each(array, function (i, item) {
- if (!BI.deepContains(result, item)) {
- result.push(item);
- }
- });
- return result;
- },
-
- //比较两个对象得出不一样的key值
- deepDiff: function (object, other) {
- object || (object = {});
- other || (other = {});
- var result = [];
- var used = [];
- for (var b in object) {
- if (this.has(object, b)) {
- if (!this.isEqual(object[b], other[b])) {
- result.push(b);
- }
- used.push(b);
- }
- }
- for (var b in other) {
- if (this.has(other, b) && !used.contains(b)) {
- result.push(b);
- }
- }
- return result;
- }
- });
-
- //通用方法
- _.each(["uniqueId", "result", "chain", "iteratee", "escape", "unescape"], function (name) {
- BI[name] = function () {
- return _[name].apply(_, arguments);
- }
- });
-
- //事件相关方法
- _.each(["bind", "once", "partial", "debounce", "throttle", "delay", "defer", "wrap"], function (name) {
- BI[name] = function () {
- return _[name].apply(_, arguments);
- }
- });
-
- _.extend(BI, {
- nextTick: (function () {
- var callbacks = [];
- var pending = false;
- var timerFunc;
-
- function nextTickHandler() {
- pending = false;
- var copies = callbacks.slice(0);
- callbacks = [];
- for (var i = 0; i < copies.length; i++) {
- copies[i]();
- }
- }
-
- if (typeof Promise !== 'undefined') {
- var p = Promise.resolve();
- timerFunc = function () {
- p.then(nextTickHandler);
- }
- } else
-
- /* istanbul ignore if */
- if (typeof MutationObserver !== 'undefined') {
- var counter = 1;
- var observer = new MutationObserver(nextTickHandler);
- var textNode = document.createTextNode(counter + "");
- observer.observe(textNode, {
- characterData: true
- });
- timerFunc = function () {
- counter = (counter + 1) % 2;
- textNode.data = counter + "";
- }
- } else {
- timerFunc = function () {
- setTimeout(nextTickHandler, 0)
- }
- }
- return function queueNextTick(cb) {
- var _resolve;
- var args = [].slice.call(arguments, 1);
- callbacks.push(function () {
- if (cb) {
- cb.apply(null, args);
- }
- if (_resolve) {
- _resolve.apply(null, args);
- }
- });
- if (!pending) {
- pending = true;
- timerFunc();
- }
- if (!cb && typeof Promise !== 'undefined') {
- return new Promise(function (resolve) {
- _resolve = resolve
- })
- }
- }
- })()
- });
-
- //数字相关方法
- _.each(["random"], function (name) {
- BI[name] = _apply(name)
- });
- _.extend(BI, {
- getTime: function () {
- if (window.performance && window.performance.now) {
- return window.performance.now();
- } else {
- if (window.performance && window.performance.webkitNow) {
- return window.performance.webkitNow();
- } else {
- if (Date.now) {
- return Date.now();
- } else {
- return Date.getDate().getTime();
- }
- }
- }
- },
-
- parseInt: function (number) {
- var radix = 10;
- if (/^0x/g.test(number)) {
- radix = 16;
- }
- try {
- return parseInt(number, radix);
- } catch (e) {
- throw new Error(number + "parse int error");
- return NaN;
- }
- },
-
- parseSafeInt: function (value) {
- var MAX_SAFE_INTEGER = 9007199254740991;
- return value
- ? this.clamp(this.parseInt(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)
- : (value === 0 ? value : 0);
- },
-
- parseFloat: function (number) {
- try {
- return parseFloat(number);
- } catch (e) {
- throw new Error(number + "parse float error");
- return NaN;
- }
- },
-
- isNaturalNumber: function (number) {
- if (/^\d+$/.test(number)) {
- return true;
- }
- return false;
- },
-
- isPositiveInteger: function (number) {
- if (/^\+?[1-9][0-9]*$/.test(number)) {
- return true;
- }
- return false;
- },
-
- isNegativeInteger: function (number) {
- if (/^\-[1-9][0-9]*$/.test(number)) {
- return true;
- }
- return false;
- },
-
- isInteger: function (number) {
- if (/^\-?\d+$/.test(number)) {
- return true;
- }
- return false;
- },
-
- isNumeric: function (number) {
- return $.isNumeric(number);
- },
-
- isFloat: function (number) {
- if (/^([+-]?)\\d*\\.\\d+$/.test(number)) {
- return true;
- }
- return false;
- },
-
- isOdd: function (number) {
- if (!BI.isInteger(number)) {
- return false;
- }
- return number & 1 === 1;
- },
-
- isEven: function (number) {
- if (!BI.isInteger(number)) {
- return false;
- }
- return number & 1 === 0;
- },
-
- sum: function (array, iteratee, context) {
- var sum = 0;
- BI.each(array, function (i, item) {
- if (iteratee) {
- sum += Number(iteratee.apply(context, [i, item]));
- } else {
- sum += Number(item);
- }
- });
- return sum;
- },
-
- average: function (array, iteratee, context) {
- var sum = BI.sum(array, iteratee, context);
- return sum / array.length;
- }
- });
-
- //字符串相关方法
- _.extend(BI, {
- trim: function () {
- return $.trim.apply($, arguments);
- },
-
- toUpperCase: function (string) {
- return (string + "").toLocaleUpperCase();
- },
-
- toLowerCase: function (string) {
- return (string + "").toLocaleLowerCase();
- },
-
- isEndWithBlank: function (string) {
- return /(\s|\u00A0)$/.test(string);
- },
-
- isLiteral: function (exp) {
- var literalValueRE = /^\s?(true|false|-?[\d\.]+|'[^']*'|"[^"]*")\s?$/
- return literalValueRE.test(exp)
- },
-
- stripQuotes: function (str) {
- var a = str.charCodeAt(0)
- var b = str.charCodeAt(str.length - 1)
- return a === b && (a === 0x22 || a === 0x27)
- ? str.slice(1, -1)
- : str
- },
-
- //background-color => backgroundColor
- camelize: function (str) {
- return str.replace(/-(.)/g, function (_, character) {
- return character.toUpperCase();
- });
- },
-
- //backgroundColor => background-color
- hyphenate: function (str) {
- return str.replace(/([A-Z])/g, '-$1').toLowerCase();
- },
-
- isNotEmptyString: function (str) {
- return BI.isString(str) && !BI.isEmpty(str);
- },
-
- isEmptyString: function (str) {
- return BI.isString(str) && BI.isEmpty(str);
- },
-
- /**
- * 对字符串进行加密 {@link #decrypt}
- * @static
- * @param str 原始字符�?
- * @param keyt 密钥
- * @returns {String} 加密后的字符�?
- */
- encrypt: function (str, keyt) {
- if (str == "") {
- return "";
- }
- str = escape(str);
- if (!keyt || keyt == "") {
- keyt = "655";
- }
- keyt = escape(keyt);
- if (keyt == null || keyt.length <= 0) {
- alert("Please enter a password with which to encrypt the message.");
- return null;
- }
- var prand = "";
- for (var i = 0; i < keyt.length; i++) {
- prand += keyt.charCodeAt(i).toString();
- }
- var sPos = Math.floor(prand.length / 5);
- var mult = parseInt(prand.charAt(sPos) + prand.charAt(sPos * 2) + prand.charAt(sPos * 3) + prand.charAt(sPos * 4) + prand.charAt(sPos * 5));
-
- var incr = Math.ceil(keyt.length / 2);
- var modu = Math.pow(2, 31) - 1;
- if (mult < 2) {
- alert("Algorithm cannot find a suitable hash. Please choose a different password. \nPossible considerations are to choose a more complex or longer password.");
- return null;
- }
-// var salt = Math.round(Math.random() * 1000000000) % 100000000;
- var salt = 101;
- prand += salt;
- while (prand.length > 10) {
- prand = (parseInt(prand.substring(0, 10)) + parseInt(prand.substring(10, prand.length), 10)).toString();
- }
- prand = (mult * prand + incr) % modu;
- var enc_chr = "";
- var enc_str = "";
- for (var i = 0; i < str.length; i++) {
- enc_chr = parseInt(str.charCodeAt(i) ^ Math.floor((prand / modu) * 255));
- if (enc_chr < 16) {
- enc_str += "0" + enc_chr.toString(16);
- } else {
- enc_str += enc_chr.toString(16);
- }
- prand = (mult * prand + incr) % modu;
- }
- salt = salt.toString(16);
- while (salt.length < 8) {
- salt = "0" + salt;
- }
- enc_str += salt;
- return enc_str;
- },
-
- /**
- * 对加密后的字符串解密 {@link #encrypt}
- * @static
- * @param str 加密过的字符�?
- * @param keyt 密钥
- * @returns {String} 解密后的字符�?
- */
- decrypt: function (str, keyt) {
- if (str == "") {
- return "";
- }
- if (!keyt || keyt == "") {
- keyt = "655";
- }
- keyt = escape(keyt);
- if (str == null || str.length < 8) {
- return;
- }
- if (keyt == null || keyt.length <= 0) {
- return;
- }
- var prand = "";
- for (var i = 0; i < keyt.length; i++) {
- prand += keyt.charCodeAt(i).toString();
- }
- var sPos = Math.floor(prand.length / 5);
- var tempmult = prand.charAt(sPos) + prand.charAt(sPos * 2) + prand.charAt(sPos * 3) + prand.charAt(sPos * 4);
- if (sPos * 5 < prand.length) {
- tempmult += prand.charAt(sPos * 5);
- }
- var mult = parseInt(tempmult);
- var incr = Math.round(keyt.length / 2);
- var modu = Math.pow(2, 31) - 1;
- var salt = parseInt(str.substring(str.length - 8, str.length), 16);
- str = str.substring(0, str.length - 8);
- prand += salt;
- while (prand.length > 10) {
- prand = (parseInt(prand.substring(0, 10), 10) + parseInt(prand.substring(10, prand.length), 10)).toString();
- }
- prand = (mult * prand + incr) % modu;
- var enc_chr = "";
- var enc_str = "";
- for (var i = 0; i < str.length; i += 2) {
- enc_chr = parseInt(parseInt(str.substring(i, i + 2), 16) ^ Math.floor((prand / modu) * 255));
- enc_str += String.fromCharCode(enc_chr);
- prand = (mult * prand + incr) % modu;
- }
- return unescape(enc_str);
- }
- });
-
- //浏览器相关方法
- _.extend(BI, {
- isIE: function () {
- if (this.__isIE == null) {
- this.__isIE = /(msie|trident)/i.test(navigator.userAgent.toLowerCase());
- }
- return this.__isIE;
- },
-
- getIEVersion: function () {
- if (this.__IEVersion != null) {
- return this.__IEVersion;
- }
- var version = 0;
- var agent = navigator.userAgent.toLowerCase();
- var v1 = agent.match(/(?:msie\s([\w.]+))/);
- var v2 = agent.match(/(?:trident.*rv:([\w.]+))/);
- if (v1 && v2 && v1[1] && v2[1]) {
- version = Math.max(v1[1] * 1, v2[1] * 1);
- } else if (v1 && v1[1]) {
- version = v1[1] * 1;
- } else if (v2 && v2[1]) {
- version = v2[1] * 1;
- } else {
- version = 0;
- }
- return this.__IEVersion = version;
- },
-
- isIE9Below: function () {
- if (!BI.isIE()) {
- return false;
- }
- return this.getIEVersion() < 9;
- },
-
- isEdge: function () {
- return /edge/i.test(navigator.userAgent.toLowerCase());
- },
-
- isChrome: function () {
- return /chrome/i.test(navigator.userAgent.toLowerCase());
- },
-
- isFireFox: function () {
- return /firefox/i.test(navigator.userAgent.toLowerCase());
- },
-
- isOpera: function () {
- return /opera/i.test(navigator.userAgent.toLowerCase());
- },
-
- isSafari: function () {
- return /safari/i.test(navigator.userAgent.toLowerCase());
- },
-
- isKhtml: function () {
- return /Konqueror|Safari|KHTML/i.test(navigator.userAgent);
- },
-
- isMac: function () {
- return /macintosh|mac os x/i.test(navigator.userAgent);
- },
-
- isWindows: function () {
- return /windows|win32/i.test(navigator.userAgent);
- },
-
- isSupportCss3: function (style) {
- var prefix = ['webkit', 'Moz', 'ms', 'o'],
- i, len,
- humpString = [],
- htmlStyle = document.documentElement.style,
- _toHumb = function (string) {
- return string.replace(/-(\w)/g, function ($0, $1) {
- return $1.toUpperCase();
- });
- };
-
- for (i in prefix) {
- humpString.push(_toHumb(prefix[i] + '-' + style));
- }
- humpString.push(_toHumb(style));
-
- for (i = 0, len = humpString.length; i < len; i++) {
- if (humpString[i] in htmlStyle) {
- return true;
- }
- }
- return false;
- }
- });
- //BI请求
- _.extend(BI, {
-
- ajax: function (option) {
- option || (option = {});
- var async = option.async;
- option.data = BI.cjkEncodeDO(option.data || {});
-
- $.ajax({
- url: option.url,
- type: "POST",
- data: option.data,
- async: async,
- error: option.error,
- complete: function (res, status) {
- if (BI.isFunction(option.complete)) {
- option.complete(BI.jsonDecode(res.responseText), status);
- }
- }
- });
- }
- });
-})(jQuery);/**
- * 客户端观察者,主要处理事件的添加、删除、执行等
- * @class BI.OB
- * @abstract
- */
-BI.OB = function (config) {
- var props = this.props;
- if (BI.isFunction(this.props)) {
- props = this.props(config);
- }
- this.options = $.extend(this._defaultConfig(config), props, config);
- this._init();
- this._initRef();
-};
-$.extend(BI.OB.prototype, {
- props: {},
- init: null,
- destroyed: null,
-
- _defaultConfig: function (config) {
- return {};
- },
-
- _init: function () {
- this._initListeners();
- this.init && this.init();
- },
-
- _initListeners: function () {
- var self = this;
- if (this.options.listeners != null) {
- $.each(this.options.listeners, function (i, lis) {
- (lis.target ? lis.target : self)[lis.once ? 'once' : 'on']
- (lis.eventName, _.bind(lis.action, self))
- });
- delete this.options.listeners;
- }
- },
-
- //获得一个当前对象的引用
- _initRef: function () {
- if (this.options.ref) {
- this.options.ref.call(this, this);
- }
- },
-
- _getEvents: function () {
- if (!$.isArray(this.events)) {
- this.events = []
- }
- return this.events;
- },
-
- /**
- * 给观察者绑定一个事件
- * @param {String} eventName 事件的名字
- * @param {Function} fn 事件对应的执行函数
- */
- on: function (eventName, fn) {
- eventName = eventName.toLowerCase();
- var fns = this._getEvents()[eventName];
- if (!$.isArray(fns)) {
- fns = [];
- this._getEvents()[eventName] = fns;
- }
- fns.push(fn);
- },
-
- /**
- * 给观察者绑定一个只执行一次的事件
- * @param {String} eventName 事件的名字
- * @param {Function} fn 事件对应的执行函数
- */
- once: function (eventName, fn) {
- var proxy = function () {
- fn.apply(this, arguments);
- this.un(eventName, proxy);
- };
- this.on(eventName, proxy);
- },
- /**
- * 解除观察者绑定的指定事件
- * @param {String} eventName 要解除绑定事件的名字
- * @param {Function} fn 事件对应的执行函数,该参数是可选的,没有该参数时,将解除绑定所有同名字的事件
- */
- un: function (eventName, fn) {
- eventName = eventName.toLowerCase();
-
- /*alex:如果fn是null,就是把eventName上面所有方法都un掉*/
- if (fn == null) {
- delete this._getEvents()[eventName];
- } else {
- var fns = this._getEvents()[eventName];
- if ($.isArray(fns)) {
- var newFns = [];
- $.each(fns, function (idx, ifn) {
- if (ifn != fn) {
- newFns.push(ifn);
- }
- })
- this._getEvents()[eventName] = newFns;
- }
- }
- },
- /**
- * 清除观察者的所有事件绑定
- */
- purgeListeners: function () {
- /*alex:清空events*/
- this.events = [];
- },
- /**
- * 触发绑定过的事件
- *
- * @param {String} eventName 要触发的事件的名字
- * @returns {Boolean} 如果事件函数返回false,则返回false并中断其他同名事件的执行,否则执行所有的同名事件并返回true
- */
- fireEvent: function () {
- var eventName = arguments[0].toLowerCase();
- var fns = this._getEvents()[eventName];
- if (BI.isArray(fns)) {
- if (BI.isArguments(arguments[1])) {
- for (var i = 0; i < fns.length; i++) {
- if (fns[i].apply(this, arguments[1]) === false) {
- return false;
- }
- }
- } else {
- var args = Array.prototype.slice.call(arguments, 1);
- for (var i = 0; i < fns.length; i++) {
- if (fns[i].apply(this, args) === false) {
- return false;
- }
- }
- }
- }
- return true;
- },
-
- destroy: function () {
- this.destroyed && this.destroyed();
- this.purgeListeners();
- }
-});/**
- * Widget超类
- * @class BI.Widget
- * @extends BI.OB
- *
- * @cfg {JSON} options 配置属性
- */
-BI.Widget = BI.inherit(BI.OB, {
- _defaultConfig: function () {
- return BI.extend(BI.Widget.superclass._defaultConfig.apply(this), {
- root: false,
- tagName: "div",
- attributes: null,
- data: null,
-
- tag: null,
- disabled: false,
- invisible: false,
- invalid: false,
- baseCls: "",
- extraCls: "",
- cls: ""
- })
- },
-
- //生命周期函数
- beforeCreate: null,
-
- created: null,
-
- render: null,
-
- beforeMount: null,
-
- mounted: null,
-
- shouldUpdate: null,
-
- update: function () {
- },
-
- beforeDestroy: null,
-
- destroyed: null,
-
- _init: function () {
- BI.Widget.superclass._init.apply(this, arguments);
- this.beforeCreate && this.beforeCreate();
- this._initRoot();
- this._initElementWidth();
- this._initElementHeight();
- this._initVisual();
- this._initState();
- this._initElement();
- this._initEffects();
- this.created && this.created();
- },
-
- /**
- * 初始化根节点
- * @private
- */
- _initRoot: function () {
- var o = this.options;
- this.widgetName = o.widgetName || BI.uniqueId("widget");
- this._isRoot = o.root;
- if (BI.isWidget(o.element)) {
- if (o.element instanceof BI.Widget) {
- this._parent = o.element;
- this._parent.addWidget(this.widgetName, this);
- } else {
- this._isRoot = true;
- }
- this.element = this.options.element.element;
- } else if (o.element) {
- // if (o.root !== true) {
- // throw new Error("root is a required property");
- // }
- this.element = $(o.element);
- this._isRoot = true;
- } else {
- this.element = $(document.createElement(o.tagName));
- }
- this.element._isWidget = true;
- if (o.baseCls || o.extraCls || o.cls) {
- this.element.addClass((o.baseCls || "") + " " + (o.extraCls || "") + " " + (o.cls || ""));
- }
- if (o.attributes) {
- this.element.attr(o.attributes);
- }
- if (o.data) {
- this.element.data(o.data);
- }
- this._children = {};
- },
-
- _initElementWidth: function () {
- var o = this.options;
- if (BI.isWidthOrHeight(o.width)) {
- this.element.css("width", o.width);
- }
- },
-
- _initElementHeight: function () {
- var o = this.options;
- if (BI.isWidthOrHeight(o.height)) {
- this.element.css("height", o.height);
- }
- },
-
- _initVisual: function () {
- var o = this.options;
- if (o.invisible) {
- //用display属性做显示和隐藏,否则jquery会在显示时将display设为block会覆盖掉display:flex属性
- this.element.css("display", "none");
- }
- },
-
- _initEffects: function () {
- var o = this.options;
- if (o.disabled || o.invalid) {
- if (this.options.disabled) {
- this.setEnable(false);
- }
- if (this.options.invalid) {
- this.setValid(false);
- }
- }
- },
-
- _initState: function () {
- this._isMounted = false;
- },
-
- _initElement: function () {
- var self = this;
- var els = this.render && this.render();
- if (BI.isPlainObject(els)) {
- els = [els];
- }
- if (BI.isArray(els)) {
- BI.each(els, function (i, el) {
- BI.createWidget(el, {
- element: self
- })
- })
- }
- // if (this._isRoot === true || !(this instanceof BI.Layout)) {
- this._mount();
- // }
- },
-
- _setParent: function (parent) {
- this._parent = parent;
- },
-
- _mount: function () {
- var self = this;
- var isMounted = this._isMounted;
- if (isMounted || !this.isVisible()) {
- return;
- }
- if (this._isRoot === true) {
- isMounted = true;
- } else if (this._parent && this._parent._isMounted === true) {
- isMounted = true;
- }
- if (!isMounted) {
- return;
- }
- this.beforeMount && this.beforeMount();
- this._isMounted = true;
- this._mountChildren && this._mountChildren();
- BI.each(this._children, function (i, widget) {
- !self.isEnabled() && widget._setEnable(false);
- !self.isValid() && widget._setValid(false);
- widget._mount && widget._mount();
- });
- this.mounted && this.mounted();
- },
-
- _mountChildren: null,
-
- isMounted: function () {
- return this._isMounted;
- },
-
- setWidth: function (w) {
- this.options.width = w;
- this._initElementWidth();
- },
-
- setHeight: function (h) {
- this.options.height = h;
- this._initElementHeight();
- },
-
- _setEnable: function (enable) {
- if (enable === true) {
- this.options.disabled = false;
- } else if (enable === false) {
- this.options.disabled = true;
- }
- //递归将所有子组件使能
- BI.each(this._children, function (i, child) {
- !child._manualSetEnable && child._setEnable && child._setEnable(enable);
- });
- },
-
- _setValid: function (valid) {
- if (valid === true) {
- this.options.invalid = false;
- } else if (valid === false) {
- this.options.invalid = true;
- }
- //递归将所有子组件使有效
- BI.each(this._children, function (i, child) {
- !child._manualSetValid && child._setValid && child._setValid(valid);
- });
- },
-
- _setVisible: function (visible) {
- if (visible === true) {
- this.options.invisible = false;
- } else if (visible === false) {
- this.options.invisible = true;
- }
- },
-
- setEnable: function (enable) {
- this._manualSetEnable = true;
- this._setEnable(enable);
- if (enable === true) {
- this.element.removeClass("base-disabled disabled");
- } else if (enable === false) {
- this.element.addClass("base-disabled disabled");
- }
- },
-
- setVisible: function (visible) {
- this._setVisible(visible);
- if (visible === true) {
- //用this.element.show()会把display属性改成block
- this.element.css("display", "");
- this._mount();
- } else if (visible === false) {
- this.element.css("display", "none");
- }
- this.fireEvent(BI.Events.VIEW, visible);
- },
-
- setValid: function (valid) {
- this._manualSetValid = true;
- this._setValid(valid);
- if (valid === true) {
- this.element.removeClass("base-invalid invalid");
- } else if (valid === false) {
- this.element.addClass("base-invalid invalid");
- }
- },
-
- doBehavior: function () {
- var args = arguments;
- //递归将所有子组件使有效
- BI.each(this._children, function (i, child) {
- child.doBehavior && child.doBehavior.apply(child, args);
- });
- },
-
- getWidth: function () {
- return this.options.width;
- },
-
- getHeight: function () {
- return this.options.height;
- },
-
- isValid: function () {
- return !this.options.invalid;
- },
-
- addWidget: function (name, widget) {
- var self = this;
- if (name instanceof BI.Widget) {
- widget = name;
- name = widget.getName();
- }
- if (BI.isKey(name)) {
- name = name + "";
- }
- name = name || widget.getName() || BI.uniqueId("widget");
- if (this._children[name]) {
- throw new Error("name has already been existed");
- }
- widget._setParent && widget._setParent(this);
- widget.on(BI.Events.DESTROY, function () {
- BI.remove(self._children, this);
- });
- return (this._children[name] = widget);
- },
-
- getWidgetByName: function (name) {
- if (!BI.isKey(name) || name === this.getName()) {
- return this;
- }
- name = name + "";
- var widget = void 0, other = {};
- BI.any(this._children, function (i, wi) {
- if (i === name) {
- widget = wi;
- return true;
- }
- other[i] = wi;
- });
- if (!widget) {
- BI.any(other, function (i, wi) {
- return (widget = wi.getWidgetByName(i));
- });
- }
- return widget;
- },
-
- removeWidget: function (nameOrWidget) {
- var self = this;
- if (BI.isWidget(nameOrWidget)) {
- BI.remove(this._children, nameOrWidget);
- } else {
- delete this._children[nameOrWidget];
- }
- },
-
- hasWidget: function (name) {
- return this._children[name] != null;
- },
-
- getName: function () {
- return this.widgetName;
- },
-
- setTag: function (tag) {
- this.options.tag = tag;
- },
-
- getTag: function () {
- return this.options.tag;
- },
-
- attr: function (key, value) {
- var self = this;
- if (BI.isPlainObject(key)) {
- BI.each(key, function (k, v) {
- self.attr(k, v);
- })
- return;
- }
- if (BI.isNotNull(value)) {
- return this.options[key] = value;
- }
- return this.options[key];
- },
-
- getText: function () {
-
- },
-
- setText: function (text) {
-
- },
-
- getValue: function () {
-
- },
-
- setValue: function (value) {
-
- },
-
- isEnabled: function () {
- return !this.options.disabled;
- },
-
- isVisible: function () {
- return !this.options.invisible;
- },
-
- disable: function () {
- this.setEnable(false);
- },
-
- enable: function () {
- this.setEnable(true);
- },
-
- valid: function () {
- this.setValid(true);
- },
-
- invalid: function () {
- this.setValid(false);
- },
-
- invisible: function () {
- this.setVisible(false);
- },
-
- visible: function () {
- this.setVisible(true);
- },
-
- __d: function () {
- this.beforeDestroy && this.beforeDestroy();
- BI.each(this._children, function (i, widget) {
- widget && widget._unMount && widget._unMount();
- });
- this._children = {};
- this._parent = null;
- this._isMounted = false;
- this.destroyed && this.destroyed();
- },
-
- _unMount: function () {
- this.__d();
- this.fireEvent(BI.Events.UNMOUNT);
- this.purgeListeners();
- },
-
- isolate: function () {
- if (this._parent) {
- this._parent.removeWidget(this);
- }
- BI.DOM.hang([this]);
- },
-
- empty: function () {
- BI.each(this._children, function (i, widget) {
- widget && widget._unMount && widget._unMount();
- });
- this._children = {};
- this.element.empty();
- },
-
- _destroy: function () {
- this.__d();
- this.element.destroy();
- this.purgeListeners();
- },
-
- destroy: function () {
- this.__d();
- this.element.destroy();
- this.fireEvent(BI.Events.DESTROY);
- this.purgeListeners();
- }
-});(function () {
- var kv = {};
- BI.shortcut = function (xtype, cls) {
- if (kv[xtype] != null) {
- throw ("shortcut:[" + xtype + "] has been registed");
- }
- kv[xtype] = cls;
- };
-
- // 根据配置属性生成widget
- var createWidget = function (config) {
- if (config["classType"]) {
- return new (new Function("return " + config["classType"] + ";")())(config);
- }
-
- var cls = kv[config.type];
- return new cls(config);
- };
-
- BI.createWidget = function (item, options) {
- var el, w;
- options || (options = {});
- if (BI.isEmpty(item) && BI.isEmpty(options)) {
- return BI.createWidget({
- type: "bi.layout"
- });
- }
- if (BI.isWidget(item)) {
- return item;
- }
- if (item && (item.type || options.type)) {
- el = BI.extend({}, options, item);
- w = BI.Plugin.getWidget(el.type, el);
- return w.type === el.type ? BI.Plugin.getObject(el.type, createWidget(w)) : BI.createWidget(BI.extend({}, item, {type: w.type}, options));
- }
- if (item && item.el && (item.el.type || options.type)) {
- el = BI.extend({}, options, item.el);
- w = BI.Plugin.getWidget(el.type, el);
- return w.type === el.type ? BI.Plugin.getObject(el.type, createWidget(w)) : BI.createWidget(BI.extend({}, item, {type: w.type}, options));
- }
- if (item && BI.isWidget(item.el)) {
- return item.el;
- }
- throw new Error("无法根据item创建组件");
- };
-
-})();(function (window, undefined) {
- function aspect(type) {
- return function (target, methodName, advice) {
- var exist = target[methodName],
- dispatcher;
-
- if (!exist || exist.target != target) {
- dispatcher = target[methodName] = function () {
- // before methods
- var beforeArr = dispatcher.before;
- var args = arguments, next;
- for (var l = beforeArr.length; l--;) {
- next = beforeArr[l].advice.apply(this, args);
- if (next === false) {
- return false;
- }
- args = next || args;
- }
- // target method
- var rs = dispatcher.method.apply(this, args);
- // after methods
- var afterArr = dispatcher.after;
- for (var i = 0, ii = afterArr.length; i < ii; i++) {
- next = afterArr[i].advice.call(this, rs, args);
- if (rs === false) {
- return false;
- }
- args = next || args;
- }
- return rs;
- };
-
- dispatcher.before = [];
- dispatcher.after = [];
-
- if (exist) {
- dispatcher.method = exist;
- }
- dispatcher.target = target;
- }
-
- var aspectArr = (dispatcher || exist)[type];
- var obj = {
- advice: advice,
- _index: aspectArr.length,
- remove: function () {
- aspectArr.splice(this._index, 1);
- }
- };
- aspectArr.push(obj);
-
- return obj;
- };
- }
-
- BI.aspect = {
- before: aspect("before"),
- after: aspect("after")
- };
-
- return BI.aspect;
-
-})(window);;
-!(function () {
-
- var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
-
-
- // private method for UTF-8 encoding
- var _utf8_encode = function (string) {
- string = string.replace(/\r\n/g, "\n");
- var utftext = "";
-
- for (var n = 0; n < string.length; n++) {
-
- var c = string.charCodeAt(n);
-
- if (c < 128) {
- utftext += String.fromCharCode(c);
- } else if ((c > 127) && (c < 2048)) {
- utftext += String.fromCharCode((c >> 6) | 192);
- utftext += String.fromCharCode((c & 63) | 128);
- } else {
- utftext += String.fromCharCode((c >> 12) | 224);
- utftext += String.fromCharCode(((c >> 6) & 63) | 128);
- utftext += String.fromCharCode((c & 63) | 128);
- }
-
- }
-
- return utftext;
- };
-
- // private method for UTF-8 decoding
- var _utf8_decode = function (utftext) {
- var string = "";
- var i = 0;
- var c = 0, c3 = 0, c2 = 0;
-
- while (i < utftext.length) {
-
- c = utftext.charCodeAt(i);
-
- if (c < 128) {
- string += String.fromCharCode(c);
- i++;
- } else if ((c > 191) && (c < 224)) {
- c2 = utftext.charCodeAt(i + 1);
- string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
- i += 2;
- } else {
- c2 = utftext.charCodeAt(i + 1);
- c3 = utftext.charCodeAt(i + 2);
- string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
- i += 3;
- }
-
- }
- return string;
- };
-
- _.extend(BI, {
-
- encode: function (input) {
- var output = "";
- var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
- var i = 0;
-
- input = _utf8_encode(input);
-
- while (i < input.length) {
-
- chr1 = input.charCodeAt(i++);
- chr2 = input.charCodeAt(i++);
- chr3 = input.charCodeAt(i++);
-
- enc1 = chr1 >> 2;
- enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
- enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
- enc4 = chr3 & 63;
-
- if (isNaN(chr2)) {
- enc3 = enc4 = 64;
- } else if (isNaN(chr3)) {
- enc4 = 64;
- }
-
- output = output + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4);
-
- }
-
- return output;
- },
-
- // public method for decoding
- decode: function (input) {
- var output = "";
- var chr1, chr2, chr3;
- var enc1, enc2, enc3, enc4;
- var i = 0;
-
- input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
-
- while (i < input.length) {
-
- enc1 = _keyStr.indexOf(input.charAt(i++));
- enc2 = _keyStr.indexOf(input.charAt(i++));
- enc3 = _keyStr.indexOf(input.charAt(i++));
- enc4 = _keyStr.indexOf(input.charAt(i++));
-
- chr1 = (enc1 << 2) | (enc2 >> 4);
- chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
- chr3 = ((enc3 & 3) << 6) | enc4;
-
- output = output + String.fromCharCode(chr1);
-
- if (enc3 != 64) {
- output = output + String.fromCharCode(chr2);
- }
- if (enc4 != 64) {
- output = output + String.fromCharCode(chr3);
- }
-
- }
-
- output = _utf8_decode(output);
-
- return output;
-
- }
- })
-})();
-BI.Cache = {
- _prefix: "bi",
- setUsername: function (username) {
- localStorage.setItem(BI.Cache._prefix + ".username", (username + "" || "").toUpperCase());
- },
- getUsername: function () {
- return localStorage.getItem(BI.Cache._prefix + ".username") || "";
- },
- _getKeyPrefix: function () {
- return BI.Cache.getUsername() + "." + BI.Cache._prefix + ".";
- },
- _generateKey: function (key) {
- return BI.Cache._getKeyPrefix() + (key || "");
- },
- getItem: function (key) {
- return localStorage.getItem(BI.Cache._generateKey(key));
- },
- setItem: function (key, value) {
- localStorage.setItem(BI.Cache._generateKey(key), value);
- },
- removeItem: function (key) {
- localStorage.removeItem(BI.Cache._generateKey(key));
- },
- clear: function () {
- for (var i = localStorage.length; i >= 0; i--) {
- var key = localStorage.key(i);
- if (key) {
- if (key.indexOf(BI.Cache._getKeyPrefix()) === 0) {
- localStorage.removeItem(key);
- }
- }
- }
- },
- keys: function () {
- var result = [];
- for (var i = localStorage.length; i >= 0; i--) {
- var key = localStorage.key(i);
- if (key) {
- var prefix = BI.Cache._getKeyPrefix();
- if (key.indexOf(prefix) === 0) {
- result[result.length] = key.substring(prefix.length);
- }
- }
- }
- return result;
- },
-
- addCookie: function (name, value, path, expiresHours) {
- var cookieString = name + "=" + escape(value);
- // 判断是否设置过期时间
- if (expiresHours && expiresHours > 0) {
- var date = new Date();
- date.setTime(date.getTime() + expiresHours * 3600 * 1000);
- cookieString = cookieString + "; expires=" + date.toGMTString();
- }
- if (path) {
- cookieString = cookieString + "; path=" + path;
- }
- document.cookie = cookieString;
- },
- getCookie: function (name) {
- var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
- if (arr = document.cookie.match(reg))
- return unescape(arr[2]);
- else
- return null;
- },
- deleteCookie: function (name, path) {
- var date = new Date();
- date.setTime(date.getTime() - 10000);
- var cookieString = name + "=v; expires=" + date.toGMTString();
- if (path) {
- cookieString = cookieString + "; path=" + path;
- }
- document.cookie = cookieString;
- }
-};BI.CellSizeAndPositionManager = function (cellCount, cellSizeGetter, estimatedCellSize) {
- this._cellSizeGetter = cellSizeGetter;
- this._cellCount = cellCount;
- this._estimatedCellSize = estimatedCellSize;
- this._cellSizeAndPositionData = {};
- this._lastMeasuredIndex = -1;
-};
-
-BI.CellSizeAndPositionManager.prototype = {
- constructor: BI.CellSizeAndPositionManager,
- configure: function (cellCount, estimatedCellSize) {
- this._cellCount = cellCount;
- this._estimatedCellSize = estimatedCellSize;
- },
-
- getCellCount: function () {
- return this._cellCount;
- },
-
- getEstimatedCellSize: function () {
- return this._estimatedCellSize;
- },
-
- getLastMeasuredIndex: function () {
- return this._lastMeasuredIndex;
- },
-
- getSizeAndPositionOfCell: function (index) {
- if (index < 0 || index >= this._cellCount) {
- return;
- }
- if (index > this._lastMeasuredIndex) {
- var lastMeasuredCellSizeAndPosition = this.getSizeAndPositionOfLastMeasuredCell();
- var offset = lastMeasuredCellSizeAndPosition.offset + lastMeasuredCellSizeAndPosition.size;
-
- for (var i = this._lastMeasuredIndex + 1; i <= index; i++) {
- var size = this._cellSizeGetter(i);
-
- if (size == null || isNaN(size)) {
- continue;
- }
-
- this._cellSizeAndPositionData[i] = {
- offset: offset,
- size: size
- };
-
- offset += size;
- }
-
- this._lastMeasuredIndex = index;
- }
- return this._cellSizeAndPositionData[index];
- },
-
- getSizeAndPositionOfLastMeasuredCell: function () {
- return this._lastMeasuredIndex >= 0
- ? this._cellSizeAndPositionData[this._lastMeasuredIndex]
- : {
- offset: 0,
- size: 0
- }
- },
-
- getTotalSize: function () {
- var lastMeasuredCellSizeAndPosition = this.getSizeAndPositionOfLastMeasuredCell();
- return lastMeasuredCellSizeAndPosition.offset + lastMeasuredCellSizeAndPosition.size + (this._cellCount - this._lastMeasuredIndex - 1) * this._estimatedCellSize
- },
-
- getUpdatedOffsetForIndex: function (align, containerSize, currentOffset, targetIndex) {
- var datum = this.getSizeAndPositionOfCell(targetIndex);
- var maxOffset = datum.offset;
- var minOffset = maxOffset - containerSize + datum.size;
-
- var idealOffset;
-
- switch (align) {
- case 'start':
- idealOffset = maxOffset;
- break;
- case 'end':
- idealOffset = minOffset;
- break;
- case 'center':
- idealOffset = maxOffset - ((containerSize - datum.size) / 2);
- break;
- default:
- idealOffset = Math.max(minOffset, Math.min(maxOffset, currentOffset));
- break;
- }
-
- var totalSize = this.getTotalSize();
-
- return Math.max(0, Math.min(totalSize - containerSize, idealOffset));
- },
-
- getVisibleCellRange: function (containerSize, offset) {
- var totalSize = this.getTotalSize();
-
- if (totalSize === 0) {
- return {}
- }
-
- var maxOffset = offset + containerSize;
- var start = this._findNearestCell(offset);
-
- var datum = this.getSizeAndPositionOfCell(start);
- offset = datum.offset + datum.size;
-
- var stop = start;
-
- while (offset < maxOffset && stop < this._cellCount - 1) {
- stop++;
- offset += this.getSizeAndPositionOfCell(stop).size;
- }
-
- return {
- start: start,
- stop: stop
- }
- },
-
- resetCell: function (index) {
- this._lastMeasuredIndex = Math.min(this._lastMeasuredIndex, index - 1)
- },
-
- _binarySearch: function (high, low, offset) {
- var middle;
- var currentOffset;
-
- while (low <= high) {
- middle = low + Math.floor((high - low) / 2);
- currentOffset = this.getSizeAndPositionOfCell(middle).offset;
-
- if (currentOffset === offset) {
- return middle;
- } else if (currentOffset < offset) {
- low = middle + 1;
- } else if (currentOffset > offset) {
- high = middle - 1;
- }
- }
-
- if (low > 0) {
- return low - 1;
- }
- },
-
- _exponentialSearch: function (index, offset) {
- var interval = 1;
-
- while (index < this._cellCount && this.getSizeAndPositionOfCell(index).offset < offset) {
- index += interval;
- interval *= 2;
- }
-
- return this._binarySearch(Math.min(index, this._cellCount - 1), Math.floor(index / 2), offset);
- },
-
- _findNearestCell: function (offset) {
- if (isNaN(offset)) {
- return;
- }
-
- offset = Math.max(0, offset);
-
- var lastMeasuredCellSizeAndPosition = this.getSizeAndPositionOfLastMeasuredCell();
- var lastMeasuredIndex = Math.max(0, this._lastMeasuredIndex);
-
- if (lastMeasuredCellSizeAndPosition.offset >= offset) {
- return this._binarySearch(lastMeasuredIndex, 0, offset);
- } else {
- return this._exponentialSearch(lastMeasuredIndex, offset);
- }
- }
-};
-
-BI.ScalingCellSizeAndPositionManager = function (cellCount, cellSizeGetter, estimatedCellSize, maxScrollSize) {
- this._cellSizeAndPositionManager = new BI.CellSizeAndPositionManager(cellCount, cellSizeGetter, estimatedCellSize);
- this._maxScrollSize = maxScrollSize || 10000000
-};
-
-BI.ScalingCellSizeAndPositionManager.prototype = {
- constructor: BI.ScalingCellSizeAndPositionManager,
-
- configure: function () {
- this._cellSizeAndPositionManager.configure.apply(this._cellSizeAndPositionManager, arguments);
- },
-
- getCellCount: function () {
- return this._cellSizeAndPositionManager.getCellCount()
- },
-
- getEstimatedCellSize: function () {
- return this._cellSizeAndPositionManager.getEstimatedCellSize()
- },
-
- getLastMeasuredIndex: function () {
- return this._cellSizeAndPositionManager.getLastMeasuredIndex()
- },
-
- getOffsetAdjustment: function (containerSize, offset) {
- var totalSize = this._cellSizeAndPositionManager.getTotalSize();
- var safeTotalSize = this.getTotalSize();
- var offsetPercentage = this._getOffsetPercentage(containerSize, offset, safeTotalSize);
-
- return Math.round(offsetPercentage * (safeTotalSize - totalSize));
- },
-
- getSizeAndPositionOfCell: function (index) {
- return this._cellSizeAndPositionManager.getSizeAndPositionOfCell(index);
- },
-
- getSizeAndPositionOfLastMeasuredCell: function () {
- return this._cellSizeAndPositionManager.getSizeAndPositionOfLastMeasuredCell();
- },
-
- getTotalSize: function () {
- return Math.min(this._maxScrollSize, this._cellSizeAndPositionManager.getTotalSize());
- },
-
- getUpdatedOffsetForIndex: function (align, containerSize, currentOffset, targetIndex) {
- currentOffset = this._safeOffsetToOffset(containerSize, currentOffset);
-
- var offset = this._cellSizeAndPositionManager.getUpdatedOffsetForIndex(align, containerSize, currentOffset, targetIndex);
-
- return this._offsetToSafeOffset(containerSize, offset);
- },
-
- getVisibleCellRange: function (containerSize, offset) {
- offset = this._safeOffsetToOffset(containerSize, offset);
-
- return this._cellSizeAndPositionManager.getVisibleCellRange(containerSize, offset);
- },
-
- resetCell: function (index) {
- this._cellSizeAndPositionManager.resetCell(index)
- },
-
- _getOffsetPercentage: function (containerSize, offset, totalSize) {
- return totalSize <= containerSize
- ? 0
- : offset / (totalSize - containerSize)
- },
-
- _offsetToSafeOffset: function (containerSize, offset) {
- var totalSize = this._cellSizeAndPositionManager.getTotalSize();
- var safeTotalSize = this.getTotalSize();
-
- if (totalSize === safeTotalSize) {
- return offset;
- } else {
- var offsetPercentage = this._getOffsetPercentage(containerSize, offset, totalSize);
-
- return Math.round(offsetPercentage * (safeTotalSize - containerSize));
- }
- },
-
- _safeOffsetToOffset: function (containerSize, offset) {
- var totalSize = this._cellSizeAndPositionManager.getTotalSize();
- var safeTotalSize = this.getTotalSize();
-
- if (totalSize === safeTotalSize) {
- return offset;
- } else {
- var offsetPercentage = this._getOffsetPercentage(containerSize, offset, safeTotalSize);
-
- return Math.round(offsetPercentage * (totalSize - containerSize));
- }
- }
-};/**
- * 汉字拼音索引
- */
-;
-!(function () {
- var _ChineseFirstPY = "YDYQSXMWZSSXJBYMGCCZQPSSQBYCDSCDQLDYLYBSSJGYZZJJFKCCLZDHWDWZJLJPFYYNWJJTMYHZWZHFLZPPQHGSCYYYNJQYXXGJHHSDSJNKKTMOMLCRXYPSNQSECCQZGGLLYJLMYZZSECYKYYHQWJSSGGYXYZYJWWKDJHYCHMYXJTLXJYQBYXZLDWRDJRWYSRLDZJPCBZJJBRCFTLECZSTZFXXZHTRQHYBDLYCZSSYMMRFMYQZPWWJJYFCRWFDFZQPYDDWYXKYJAWJFFXYPSFTZYHHYZYSWCJYXSCLCXXWZZXNBGNNXBXLZSZSBSGPYSYZDHMDZBQBZCWDZZYYTZHBTSYYBZGNTNXQYWQSKBPHHLXGYBFMJEBJHHGQTJCYSXSTKZHLYCKGLYSMZXYALMELDCCXGZYRJXSDLTYZCQKCNNJWHJTZZCQLJSTSTBNXBTYXCEQXGKWJYFLZQLYHYXSPSFXLMPBYSXXXYDJCZYLLLSJXFHJXPJBTFFYABYXBHZZBJYZLWLCZGGBTSSMDTJZXPTHYQTGLJSCQFZKJZJQNLZWLSLHDZBWJNCJZYZSQQYCQYRZCJJWYBRTWPYFTWEXCSKDZCTBZHYZZYYJXZCFFZZMJYXXSDZZOTTBZLQWFCKSZSXFYRLNYJMBDTHJXSQQCCSBXYYTSYFBXDZTGBCNSLCYZZPSAZYZZSCJCSHZQYDXLBPJLLMQXTYDZXSQJTZPXLCGLQTZWJBHCTSYJSFXYEJJTLBGXSXJMYJQQPFZASYJNTYDJXKJCDJSZCBARTDCLYJQMWNQNCLLLKBYBZZSYHQQLTWLCCXTXLLZNTYLNEWYZYXCZXXGRKRMTCNDNJTSYYSSDQDGHSDBJGHRWRQLYBGLXHLGTGXBQJDZPYJSJYJCTMRNYMGRZJCZGJMZMGXMPRYXKJNYMSGMZJYMKMFXMLDTGFBHCJHKYLPFMDXLQJJSMTQGZSJLQDLDGJYCALCMZCSDJLLNXDJFFFFJCZFMZFFPFKHKGDPSXKTACJDHHZDDCRRCFQYJKQCCWJDXHWJLYLLZGCFCQDSMLZPBJJPLSBCJGGDCKKDEZSQCCKJGCGKDJTJDLZYCXKLQSCGJCLTFPCQCZGWPJDQYZJJBYJHSJDZWGFSJGZKQCCZLLPSPKJGQJHZZLJPLGJGJJTHJJYJZCZMLZLYQBGJWMLJKXZDZNJQSYZMLJLLJKYWXMKJLHSKJGBMCLYYMKXJQLBMLLKMDXXKWYXYSLMLPSJQQJQXYXFJTJDXMXXLLCXQBSYJBGWYMBGGBCYXPJYGPEPFGDJGBHBNSQJYZJKJKHXQFGQZKFHYGKHDKLLSDJQXPQYKYBNQSXQNSZSWHBSXWHXWBZZXDMNSJBSBKBBZKLYLXGWXDRWYQZMYWSJQLCJXXJXKJEQXSCYETLZHLYYYSDZPAQYZCMTLSHTZCFYZYXYLJSDCJQAGYSLCQLYYYSHMRQQKLDXZSCSSSYDYCJYSFSJBFRSSZQSBXXPXJYSDRCKGJLGDKZJZBDKTCSYQPYHSTCLDJDHMXMCGXYZHJDDTMHLTXZXYLYMOHYJCLTYFBQQXPFBDFHHTKSQHZYYWCNXXCRWHOWGYJLEGWDQCWGFJYCSNTMYTOLBYGWQWESJPWNMLRYDZSZTXYQPZGCWXHNGPYXSHMYQJXZTDPPBFYHZHTJYFDZWKGKZBLDNTSXHQEEGZZYLZMMZYJZGXZXKHKSTXNXXWYLYAPSTHXDWHZYMPXAGKYDXBHNHXKDPJNMYHYLPMGOCSLNZHKXXLPZZLBMLSFBHHGYGYYGGBHSCYAQTYWLXTZQCEZYDQDQMMHTKLLSZHLSJZWFYHQSWSCWLQAZYNYTLSXTHAZNKZZSZZLAXXZWWCTGQQTDDYZTCCHYQZFLXPSLZYGPZSZNGLNDQTBDLXGTCTAJDKYWNSYZLJHHZZCWNYYZYWMHYCHHYXHJKZWSXHZYXLYSKQYSPSLYZWMYPPKBYGLKZHTYXAXQSYSHXASMCHKDSCRSWJPWXSGZJLWWSCHSJHSQNHCSEGNDAQTBAALZZMSSTDQJCJKTSCJAXPLGGXHHGXXZCXPDMMHLDGTYBYSJMXHMRCPXXJZCKZXSHMLQXXTTHXWZFKHCCZDYTCJYXQHLXDHYPJQXYLSYYDZOZJNYXQEZYSQYAYXWYPDGXDDXSPPYZNDLTWRHXYDXZZJHTCXMCZLHPYYYYMHZLLHNXMYLLLMDCPPXHMXDKYCYRDLTXJCHHZZXZLCCLYLNZSHZJZZLNNRLWHYQSNJHXYNTTTKYJPYCHHYEGKCTTWLGQRLGGTGTYGYHPYHYLQYQGCWYQKPYYYTTTTLHYHLLTYTTSPLKYZXGZWGPYDSSZZDQXSKCQNMJJZZBXYQMJRTFFBTKHZKBXLJJKDXJTLBWFZPPTKQTZTGPDGNTPJYFALQMKGXBDCLZFHZCLLLLADPMXDJHLCCLGYHDZFGYDDGCYYFGYDXKSSEBDHYKDKDKHNAXXYBPBYYHXZQGAFFQYJXDMLJCSQZLLPCHBSXGJYNDYBYQSPZWJLZKSDDTACTBXZDYZYPJZQSJNKKTKNJDJGYYPGTLFYQKASDNTCYHBLWDZHBBYDWJRYGKZYHEYYFJMSDTYFZJJHGCXPLXHLDWXXJKYTCYKSSSMTWCTTQZLPBSZDZWZXGZAGYKTYWXLHLSPBCLLOQMMZSSLCMBJCSZZKYDCZJGQQDSMCYTZQQLWZQZXSSFPTTFQMDDZDSHDTDWFHTDYZJYQJQKYPBDJYYXTLJHDRQXXXHAYDHRJLKLYTWHLLRLLRCXYLBWSRSZZSYMKZZHHKYHXKSMDSYDYCJPBZBSQLFCXXXNXKXWYWSDZYQOGGQMMYHCDZTTFJYYBGSTTTYBYKJDHKYXBELHTYPJQNFXFDYKZHQKZBYJTZBXHFDXKDASWTAWAJLDYJSFHBLDNNTNQJTJNCHXFJSRFWHZFMDRYJYJWZPDJKZYJYMPCYZNYNXFBYTFYFWYGDBNZZZDNYTXZEMMQBSQEHXFZMBMFLZZSRXYMJGSXWZJSPRYDJSJGXHJJGLJJYNZZJXHGXKYMLPYYYCXYTWQZSWHWLYRJLPXSLSXMFSWWKLCTNXNYNPSJSZHDZEPTXMYYWXYYSYWLXJQZQXZDCLEEELMCPJPCLWBXSQHFWWTFFJTNQJHJQDXHWLBYZNFJLALKYYJLDXHHYCSTYYWNRJYXYWTRMDRQHWQCMFJDYZMHMYYXJWMYZQZXTLMRSPWWCHAQBXYGZYPXYYRRCLMPYMGKSJSZYSRMYJSNXTPLNBAPPYPYLXYYZKYNLDZYJZCZNNLMZHHARQMPGWQTZMXXMLLHGDZXYHXKYXYCJMFFYYHJFSBSSQLXXNDYCANNMTCJCYPRRNYTYQNYYMBMSXNDLYLYSLJRLXYSXQMLLYZLZJJJKYZZCSFBZXXMSTBJGNXYZHLXNMCWSCYZYFZLXBRNNNYLBNRTGZQYSATSWRYHYJZMZDHZGZDWYBSSCSKXSYHYTXXGCQGXZZSHYXJSCRHMKKBXCZJYJYMKQHZJFNBHMQHYSNJNZYBKNQMCLGQHWLZNZSWXKHLJHYYBQLBFCDSXDLDSPFZPSKJYZWZXZDDXJSMMEGJSCSSMGCLXXKYYYLNYPWWWGYDKZJGGGZGGSYCKNJWNJPCXBJJTQTJWDSSPJXZXNZXUMELPXFSXTLLXCLJXJJLJZXCTPSWXLYDHLYQRWHSYCSQYYBYAYWJJJQFWQCQQCJQGXALDBZZYJGKGXPLTZYFXJLTPADKYQHPMATLCPDCKBMTXYBHKLENXDLEEGQDYMSAWHZMLJTWYGXLYQZLJEEYYBQQFFNLYXRDSCTGJGXYYNKLLYQKCCTLHJLQMKKZGCYYGLLLJDZGYDHZWXPYSJBZKDZGYZZHYWYFQYTYZSZYEZZLYMHJJHTSMQWYZLKYYWZCSRKQYTLTDXWCTYJKLWSQZWBDCQYNCJSRSZJLKCDCDTLZZZACQQZZDDXYPLXZBQJYLZLLLQDDZQJYJYJZYXNYYYNYJXKXDAZWYRDLJYYYRJLXLLDYXJCYWYWNQCCLDDNYYYNYCKCZHXXCCLGZQJGKWPPCQQJYSBZZXYJSQPXJPZBSBDSFNSFPZXHDWZTDWPPTFLZZBZDMYYPQJRSDZSQZSQXBDGCPZSWDWCSQZGMDHZXMWWFYBPDGPHTMJTHZSMMBGZMBZJCFZWFZBBZMQCFMBDMCJXLGPNJBBXGYHYYJGPTZGZMQBQTCGYXJXLWZKYDPDYMGCFTPFXYZTZXDZXTGKMTYBBCLBJASKYTSSQYYMSZXFJEWLXLLSZBQJJJAKLYLXLYCCTSXMCWFKKKBSXLLLLJYXTYLTJYYTDPJHNHNNKBYQNFQYYZBYYESSESSGDYHFHWTCJBSDZZTFDMXHCNJZYMQWSRYJDZJQPDQBBSTJGGFBKJBXTGQHNGWJXJGDLLTHZHHYYYYYYSXWTYYYCCBDBPYPZYCCZYJPZYWCBDLFWZCWJDXXHYHLHWZZXJTCZLCDPXUJCZZZLYXJJTXPHFXWPYWXZPTDZZBDZCYHJHMLXBQXSBYLRDTGJRRCTTTHYTCZWMXFYTWWZCWJWXJYWCSKYBZSCCTZQNHXNWXXKHKFHTSWOCCJYBCMPZZYKBNNZPBZHHZDLSYDDYTYFJPXYNGFXBYQXCBHXCPSXTYZDMKYSNXSXLHKMZXLYHDHKWHXXSSKQYHHCJYXGLHZXCSNHEKDTGZXQYPKDHEXTYKCNYMYYYPKQYYYKXZLTHJQTBYQHXBMYHSQCKWWYLLHCYYLNNEQXQWMCFBDCCMLJGGXDQKTLXKGNQCDGZJWYJJLYHHQTTTNWCHMXCXWHWSZJYDJCCDBQCDGDNYXZTHCQRXCBHZTQCBXWGQWYYBXHMBYMYQTYEXMQKYAQYRGYZSLFYKKQHYSSQYSHJGJCNXKZYCXSBXYXHYYLSTYCXQTHYSMGSCPMMGCCCCCMTZTASMGQZJHKLOSQYLSWTMXSYQKDZLJQQYPLSYCZTCQQPBBQJZCLPKHQZYYXXDTDDTSJCXFFLLCHQXMJLWCJCXTSPYCXNDTJSHJWXDQQJSKXYAMYLSJHMLALYKXCYYDMNMDQMXMCZNNCYBZKKYFLMCHCMLHXRCJJHSYLNMTJZGZGYWJXSRXCWJGJQHQZDQJDCJJZKJKGDZQGJJYJYLXZXXCDQHHHEYTMHLFSBDJSYYSHFYSTCZQLPBDRFRZTZYKYWHSZYQKWDQZRKMSYNBCRXQBJYFAZPZZEDZCJYWBCJWHYJBQSZYWRYSZPTDKZPFPBNZTKLQYHBBZPNPPTYZZYBQNYDCPJMMCYCQMCYFZZDCMNLFPBPLNGQJTBTTNJZPZBBZNJKLJQYLNBZQHKSJZNGGQSZZKYXSHPZSNBCGZKDDZQANZHJKDRTLZLSWJLJZLYWTJNDJZJHXYAYNCBGTZCSSQMNJPJYTYSWXZFKWJQTKHTZPLBHSNJZSYZBWZZZZLSYLSBJHDWWQPSLMMFBJDWAQYZTCJTBNNWZXQXCDSLQGDSDPDZHJTQQPSWLYYJZLGYXYZLCTCBJTKTYCZJTQKBSJLGMGZDMCSGPYNJZYQYYKNXRPWSZXMTNCSZZYXYBYHYZAXYWQCJTLLCKJJTJHGDXDXYQYZZBYWDLWQCGLZGJGQRQZCZSSBCRPCSKYDZNXJSQGXSSJMYDNSTZTPBDLTKZWXQWQTZEXNQCZGWEZKSSBYBRTSSSLCCGBPSZQSZLCCGLLLZXHZQTHCZMQGYZQZNMCOCSZJMMZSQPJYGQLJYJPPLDXRGZYXCCSXHSHGTZNLZWZKJCXTCFCJXLBMQBCZZWPQDNHXLJCTHYZLGYLNLSZZPCXDSCQQHJQKSXZPBAJYEMSMJTZDXLCJYRYYNWJBNGZZTMJXLTBSLYRZPYLSSCNXPHLLHYLLQQZQLXYMRSYCXZLMMCZLTZSDWTJJLLNZGGQXPFSKYGYGHBFZPDKMWGHCXMSGDXJMCJZDYCABXJDLNBCDQYGSKYDQTXDJJYXMSZQAZDZFSLQXYJSJZYLBTXXWXQQZBJZUFBBLYLWDSLJHXJYZJWTDJCZFQZQZZDZSXZZQLZCDZFJHYSPYMPQZMLPPLFFXJJNZZYLSJEYQZFPFZKSYWJJJHRDJZZXTXXGLGHYDXCSKYSWMMZCWYBAZBJKSHFHJCXMHFQHYXXYZFTSJYZFXYXPZLCHMZMBXHZZSXYFYMNCWDABAZLXKTCSHHXKXJJZJSTHYGXSXYYHHHJWXKZXSSBZZWHHHCWTZZZPJXSNXQQJGZYZYWLLCWXZFXXYXYHXMKYYSWSQMNLNAYCYSPMJKHWCQHYLAJJMZXHMMCNZHBHXCLXTJPLTXYJHDYYLTTXFSZHYXXSJBJYAYRSMXYPLCKDUYHLXRLNLLSTYZYYQYGYHHSCCSMZCTZQXKYQFPYYRPFFLKQUNTSZLLZMWWTCQQYZWTLLMLMPWMBZSSTZRBPDDTLQJJBXZCSRZQQYGWCSXFWZLXCCRSZDZMCYGGDZQSGTJSWLJMYMMZYHFBJDGYXCCPSHXNZCSBSJYJGJMPPWAFFYFNXHYZXZYLREMZGZCYZSSZDLLJCSQFNXZKPTXZGXJJGFMYYYSNBTYLBNLHPFZDCYFBMGQRRSSSZXYSGTZRNYDZZCDGPJAFJFZKNZBLCZSZPSGCYCJSZLMLRSZBZZLDLSLLYSXSQZQLYXZLSKKBRXBRBZCYCXZZZEEYFGKLZLYYHGZSGZLFJHGTGWKRAAJYZKZQTSSHJJXDCYZUYJLZYRZDQQHGJZXSSZBYKJPBFRTJXLLFQWJHYLQTYMBLPZDXTZYGBDHZZRBGXHWNJTJXLKSCFSMWLSDQYSJTXKZSCFWJLBXFTZLLJZLLQBLSQMQQCGCZFPBPHZCZJLPYYGGDTGWDCFCZQYYYQYSSCLXZSKLZZZGFFCQNWGLHQYZJJCZLQZZYJPJZZBPDCCMHJGXDQDGDLZQMFGPSYTSDYFWWDJZJYSXYYCZCYHZWPBYKXRYLYBHKJKSFXTZJMMCKHLLTNYYMSYXYZPYJQYCSYCWMTJJKQYRHLLQXPSGTLYYCLJSCPXJYZFNMLRGJJTYZBXYZMSJYJHHFZQMSYXRSZCWTLRTQZSSTKXGQKGSPTGCZNJSJCQCXHMXGGZTQYDJKZDLBZSXJLHYQGGGTHQSZPYHJHHGYYGKGGCWJZZYLCZLXQSFTGZSLLLMLJSKCTBLLZZSZMMNYTPZSXQHJCJYQXYZXZQZCPSHKZZYSXCDFGMWQRLLQXRFZTLYSTCTMJCXJJXHJNXTNRZTZFQYHQGLLGCXSZSJDJLJCYDSJTLNYXHSZXCGJZYQPYLFHDJSBPCCZHJJJQZJQDYBSSLLCMYTTMQTBHJQNNYGKYRQYQMZGCJKPDCGMYZHQLLSLLCLMHOLZGDYYFZSLJCQZLYLZQJESHNYLLJXGJXLYSYYYXNBZLJSSZCQQCJYLLZLTJYLLZLLBNYLGQCHXYYXOXCXQKYJXXXYKLXSXXYQXCYKQXQCSGYXXYQXYGYTQOHXHXPYXXXULCYEYCHZZCBWQBBWJQZSCSZSSLZYLKDESJZWMYMCYTSDSXXSCJPQQSQYLYYZYCMDJDZYWCBTJSYDJKCYDDJLBDJJSODZYSYXQQYXDHHGQQYQHDYXWGMMMAJDYBBBPPBCMUUPLJZSMTXERXJMHQNUTPJDCBSSMSSSTKJTSSMMTRCPLZSZMLQDSDMJMQPNQDXCFYNBFSDQXYXHYAYKQYDDLQYYYSSZBYDSLNTFQTZQPZMCHDHCZCWFDXTMYQSPHQYYXSRGJCWTJTZZQMGWJJTJHTQJBBHWZPXXHYQFXXQYWYYHYSCDYDHHQMNMTMWCPBSZPPZZGLMZFOLLCFWHMMSJZTTDHZZYFFYTZZGZYSKYJXQYJZQBHMBZZLYGHGFMSHPZFZSNCLPBQSNJXZSLXXFPMTYJYGBXLLDLXPZJYZJYHHZCYWHJYLSJEXFSZZYWXKZJLUYDTMLYMQJPWXYHXSKTQJEZRPXXZHHMHWQPWQLYJJQJJZSZCPHJLCHHNXJLQWZJHBMZYXBDHHYPZLHLHLGFWLCHYYTLHJXCJMSCPXSTKPNHQXSRTYXXTESYJCTLSSLSTDLLLWWYHDHRJZSFGXTSYCZYNYHTDHWJSLHTZDQDJZXXQHGYLTZPHCSQFCLNJTCLZPFSTPDYNYLGMJLLYCQHYSSHCHYLHQYQTMZYPBYWRFQYKQSYSLZDQJMPXYYSSRHZJNYWTQDFZBWWTWWRXCWHGYHXMKMYYYQMSMZHNGCEPMLQQMTCWCTMMPXJPJJHFXYYZSXZHTYBMSTSYJTTQQQYYLHYNPYQZLCYZHZWSMYLKFJXLWGXYPJYTYSYXYMZCKTTWLKSMZSYLMPWLZWXWQZSSAQSYXYRHSSNTSRAPXCPWCMGDXHXZDZYFJHGZTTSBJHGYZSZYSMYCLLLXBTYXHBBZJKSSDMALXHYCFYGMQYPJYCQXJLLLJGSLZGQLYCJCCZOTYXMTMTTLLWTGPXYMZMKLPSZZZXHKQYSXCTYJZYHXSHYXZKXLZWPSQPYHJWPJPWXQQYLXSDHMRSLZZYZWTTCYXYSZZSHBSCCSTPLWSSCJCHNLCGCHSSPHYLHFHHXJSXYLLNYLSZDHZXYLSXLWZYKCLDYAXZCMDDYSPJTQJZLNWQPSSSWCTSTSZLBLNXSMNYYMJQBQHRZWTYYDCHQLXKPZWBGQYBKFCMZWPZLLYYLSZYDWHXPSBCMLJBSCGBHXLQHYRLJXYSWXWXZSLDFHLSLYNJLZYFLYJYCDRJLFSYZFSLLCQYQFGJYHYXZLYLMSTDJCYHBZLLNWLXXYGYYHSMGDHXXHHLZZJZXCZZZCYQZFNGWPYLCPKPYYPMCLQKDGXZGGWQBDXZZKZFBXXLZXJTPJPTTBYTSZZDWSLCHZHSLTYXHQLHYXXXYYZYSWTXZKHLXZXZPYHGCHKCFSYHUTJRLXFJXPTZTWHPLYXFCRHXSHXKYXXYHZQDXQWULHYHMJTBFLKHTXCWHJFWJCFPQRYQXCYYYQYGRPYWSGSUNGWCHKZDXYFLXXHJJBYZWTSXXNCYJJYMSWZJQRMHXZWFQSYLZJZGBHYNSLBGTTCSYBYXXWXYHXYYXNSQYXMQYWRGYQLXBBZLJSYLPSYTJZYHYZAWLRORJMKSCZJXXXYXCHDYXRYXXJDTSQFXLYLTSFFYXLMTYJMJUYYYXLTZCSXQZQHZXLYYXZHDNBRXXXJCTYHLBRLMBRLLAXKYLLLJLYXXLYCRYLCJTGJCMTLZLLCYZZPZPCYAWHJJFYBDYYZSMPCKZDQYQPBPCJPDCYZMDPBCYYDYCNNPLMTMLRMFMMGWYZBSJGYGSMZQQQZTXMKQWGXLLPJGZBQCDJJJFPKJKCXBLJMSWMDTQJXLDLPPBXCWRCQFBFQJCZAHZGMYKPHYYHZYKNDKZMBPJYXPXYHLFPNYYGXJDBKXNXHJMZJXSTRSTLDXSKZYSYBZXJLXYSLBZYSLHXJPFXPQNBYLLJQKYGZMCYZZYMCCSLCLHZFWFWYXZMWSXTYNXJHPYYMCYSPMHYSMYDYSHQYZCHMJJMZCAAGCFJBBHPLYZYLXXSDJGXDHKXXTXXNBHRMLYJSLTXMRHNLXQJXYZLLYSWQGDLBJHDCGJYQYCMHWFMJYBMBYJYJWYMDPWHXQLDYGPDFXXBCGJSPCKRSSYZJMSLBZZJFLJJJLGXZGYXYXLSZQYXBEXYXHGCXBPLDYHWETTWWCJMBTXCHXYQXLLXFLYXLLJLSSFWDPZSMYJCLMWYTCZPCHQEKCQBWLCQYDPLQPPQZQFJQDJHYMMCXTXDRMJWRHXCJZYLQXDYYNHYYHRSLSRSYWWZJYMTLTLLGTQCJZYABTCKZCJYCCQLJZQXALMZYHYWLWDXZXQDLLQSHGPJFJLJHJABCQZDJGTKHSSTCYJLPSWZLXZXRWGLDLZRLZXTGSLLLLZLYXXWGDZYGBDPHZPBRLWSXQBPFDWOFMWHLYPCBJCCLDMBZPBZZLCYQXLDOMZBLZWPDWYYGDSTTHCSQSCCRSSSYSLFYBFNTYJSZDFNDPDHDZZMBBLSLCMYFFGTJJQWFTMTPJWFNLBZCMMJTGBDZLQLPYFHYYMJYLSDCHDZJWJCCTLJCLDTLJJCPDDSQDSSZYBNDBJLGGJZXSXNLYCYBJXQYCBYLZCFZPPGKCXZDZFZTJJFJSJXZBNZYJQTTYJYHTYCZHYMDJXTTMPXSPLZCDWSLSHXYPZGTFMLCJTYCBPMGDKWYCYZCDSZZYHFLYCTYGWHKJYYLSJCXGYWJCBLLCSNDDBTZBSCLYZCZZSSQDLLMQYYHFSLQLLXFTYHABXGWNYWYYPLLSDLDLLBJCYXJZMLHLJDXYYQYTDLLLBUGBFDFBBQJZZMDPJHGCLGMJJPGAEHHBWCQXAXHHHZCHXYPHJAXHLPHJPGPZJQCQZGJJZZUZDMQYYBZZPHYHYBWHAZYJHYKFGDPFQSDLZMLJXKXGALXZDAGLMDGXMWZQYXXDXXPFDMMSSYMPFMDMMKXKSYZYSHDZKXSYSMMZZZMSYDNZZCZXFPLSTMZDNMXCKJMZTYYMZMZZMSXHHDCZJEMXXKLJSTLWLSQLYJZLLZJSSDPPMHNLZJCZYHMXXHGZCJMDHXTKGRMXFWMCGMWKDTKSXQMMMFZZYDKMSCLCMPCGMHSPXQPZDSSLCXKYXTWLWJYAHZJGZQMCSNXYYMMPMLKJXMHLMLQMXCTKZMJQYSZJSYSZHSYJZJCDAJZYBSDQJZGWZQQXFKDMSDJLFWEHKZQKJPEYPZYSZCDWYJFFMZZYLTTDZZEFMZLBNPPLPLPEPSZALLTYLKCKQZKGENQLWAGYXYDPXLHSXQQWQCQXQCLHYXXMLYCCWLYMQYSKGCHLCJNSZKPYZKCQZQLJPDMDZHLASXLBYDWQLWDNBQCRYDDZTJYBKBWSZDXDTNPJDTCTQDFXQQMGNXECLTTBKPWSLCTYQLPWYZZKLPYGZCQQPLLKCCYLPQMZCZQCLJSLQZDJXLDDHPZQDLJJXZQDXYZQKZLJCYQDYJPPYPQYKJYRMPCBYMCXKLLZLLFQPYLLLMBSGLCYSSLRSYSQTMXYXZQZFDZUYSYZTFFMZZSMZQHZSSCCMLYXWTPZGXZJGZGSJSGKDDHTQGGZLLBJDZLCBCHYXYZHZFYWXYZYMSDBZZYJGTSMTFXQYXQSTDGSLNXDLRYZZLRYYLXQHTXSRTZNGZXBNQQZFMYKMZJBZYMKBPNLYZPBLMCNQYZZZSJZHJCTZKHYZZJRDYZHNPXGLFZTLKGJTCTSSYLLGZRZBBQZZKLPKLCZYSSUYXBJFPNJZZXCDWXZYJXZZDJJKGGRSRJKMSMZJLSJYWQSKYHQJSXPJZZZLSNSHRNYPZTWCHKLPSRZLZXYJQXQKYSJYCZTLQZYBBYBWZPQDWWYZCYTJCJXCKCWDKKZXSGKDZXWWYYJQYYTCYTDLLXWKCZKKLCCLZCQQDZLQLCSFQCHQHSFSMQZZLNBJJZBSJHTSZDYSJQJPDLZCDCWJKJZZLPYCGMZWDJJBSJQZSYZYHHXJPBJYDSSXDZNCGLQMBTSFSBPDZDLZNFGFJGFSMPXJQLMBLGQCYYXBQKDJJQYRFKZTJDHCZKLBSDZCFJTPLLJGXHYXZCSSZZXSTJYGKGCKGYOQXJPLZPBPGTGYJZGHZQZZLBJLSQFZGKQQJZGYCZBZQTLDXRJXBSXXPZXHYZYCLWDXJJHXMFDZPFZHQHQMQGKSLYHTYCGFRZGNQXCLPDLBZCSCZQLLJBLHBZCYPZZPPDYMZZSGYHCKCPZJGSLJLNSCDSLDLXBMSTLDDFJMKDJDHZLZXLSZQPQPGJLLYBDSZGQLBZLSLKYYHZTTNTJYQTZZPSZQZTLLJTYYLLQLLQYZQLBDZLSLYYZYMDFSZSNHLXZNCZQZPBWSKRFBSYZMTHBLGJPMCZZLSTLXSHTCSYZLZBLFEQHLXFLCJLYLJQCBZLZJHHSSTBRMHXZHJZCLXFNBGXGTQJCZTMSFZKJMSSNXLJKBHSJXNTNLZDNTLMSJXGZJYJCZXYJYJWRWWQNZTNFJSZPZSHZJFYRDJSFSZJZBJFZQZZHZLXFYSBZQLZSGYFTZDCSZXZJBQMSZKJRHYJZCKMJKHCHGTXKXQGLXPXFXTRTYLXJXHDTSJXHJZJXZWZLCQSBTXWXGXTXXHXFTSDKFJHZYJFJXRZSDLLLTQSQQZQWZXSYQTWGWBZCGZLLYZBCLMQQTZHZXZXLJFRMYZFLXYSQXXJKXRMQDZDMMYYBSQBHGZMWFWXGMXLZPYYTGZYCCDXYZXYWGSYJYZNBHPZJSQSYXSXRTFYZGRHZTXSZZTHCBFCLSYXZLZQMZLMPLMXZJXSFLBYZMYQHXJSXRXSQZZZSSLYFRCZJRCRXHHZXQYDYHXSJJHZCXZBTYNSYSXJBQLPXZQPYMLXZKYXLXCJLCYSXXZZLXDLLLJJYHZXGYJWKJRWYHCPSGNRZLFZWFZZNSXGXFLZSXZZZBFCSYJDBRJKRDHHGXJLJJTGXJXXSTJTJXLYXQFCSGSWMSBCTLQZZWLZZKXJMLTMJYHSDDBXGZHDLBMYJFRZFSGCLYJBPMLYSMSXLSZJQQHJZFXGFQFQBPXZGYYQXGZTCQWYLTLGWSGWHRLFSFGZJMGMGBGTJFSYZZGZYZAFLSSPMLPFLCWBJZCLJJMZLPJJLYMQDMYYYFBGYGYZMLYZDXQYXRQQQHSYYYQXYLJTYXFSFSLLGNQCYHYCWFHCCCFXPYLYPLLZYXXXXXKQHHXSHJZCFZSCZJXCPZWHHHHHAPYLQALPQAFYHXDYLUKMZQGGGDDESRNNZLTZGCHYPPYSQJJHCLLJTOLNJPZLJLHYMHEYDYDSQYCDDHGZUNDZCLZYZLLZNTNYZGSLHSLPJJBDGWXPCDUTJCKLKCLWKLLCASSTKZZDNQNTTLYYZSSYSSZZRYLJQKCQDHHCRXRZYDGRGCWCGZQFFFPPJFZYNAKRGYWYQPQXXFKJTSZZXSWZDDFBBXTBGTZKZNPZZPZXZPJSZBMQHKCYXYLDKLJNYPKYGHGDZJXXEAHPNZKZTZCMXCXMMJXNKSZQNMNLWBWWXJKYHCPSTMCSQTZJYXTPCTPDTNNPGLLLZSJLSPBLPLQHDTNJNLYYRSZFFJFQWDPHZDWMRZCCLODAXNSSNYZRESTYJWJYJDBCFXNMWTTBYLWSTSZGYBLJPXGLBOCLHPCBJLTMXZLJYLZXCLTPNCLCKXTPZJSWCYXSFYSZDKNTLBYJCYJLLSTGQCBXRYZXBXKLYLHZLQZLNZCXWJZLJZJNCJHXMNZZGJZZXTZJXYCYYCXXJYYXJJXSSSJSTSSTTPPGQTCSXWZDCSYFPTFBFHFBBLZJCLZZDBXGCXLQPXKFZFLSYLTUWBMQJHSZBMDDBCYSCCLDXYCDDQLYJJWMQLLCSGLJJSYFPYYCCYLTJANTJJPWYCMMGQYYSXDXQMZHSZXPFTWWZQSWQRFKJLZJQQYFBRXJHHFWJJZYQAZMYFRHCYYBYQWLPEXCCZSTYRLTTDMQLYKMBBGMYYJPRKZNPBSXYXBHYZDJDNGHPMFSGMWFZMFQMMBCMZZCJJLCNUXYQLMLRYGQZCYXZLWJGCJCGGMCJNFYZZJHYCPRRCMTZQZXHFQGTJXCCJEAQCRJYHPLQLSZDJRBCQHQDYRHYLYXJSYMHZYDWLDFRYHBPYDTSSCNWBXGLPZMLZZTQSSCPJMXXYCSJYTYCGHYCJWYRXXLFEMWJNMKLLSWTXHYYYNCMMCWJDQDJZGLLJWJRKHPZGGFLCCSCZMCBLTBHBQJXQDSPDJZZGHGLFQYWBZYZJLTSTDHQHCTCBCHFLQMPWDSHYYTQWCNZZJTLBYMBPDYYYXSQKXWYYFLXXNCWCXYPMAELYKKJMZZZBRXYYQJFLJPFHHHYTZZXSGQQMHSPGDZQWBWPJHZJDYSCQWZKTXXSQLZYYMYSDZGRXCKKUJLWPYSYSCSYZLRMLQSYLJXBCXTLWDQZPCYCYKPPPNSXFYZJJRCEMHSZMSXLXGLRWGCSTLRSXBZGBZGZTCPLUJLSLYLYMTXMTZPALZXPXJTJWTCYYZLBLXBZLQMYLXPGHDSLSSDMXMBDZZSXWHAMLCZCPJMCNHJYSNSYGCHSKQMZZQDLLKABLWJXSFMOCDXJRRLYQZKJMYBYQLYHETFJZFRFKSRYXFJTWDSXXSYSQJYSLYXWJHSNLXYYXHBHAWHHJZXWMYLJCSSLKYDZTXBZSYFDXGXZJKHSXXYBSSXDPYNZWRPTQZCZENYGCXQFJYKJBZMLJCMQQXUOXSLYXXLYLLJDZBTYMHPFSTTQQWLHOKYBLZZALZXQLHZWRRQHLSTMYPYXJJXMQSJFNBXYXYJXXYQYLTHYLQYFMLKLJTMLLHSZWKZHLJMLHLJKLJSTLQXYLMBHHLNLZXQJHXCFXXLHYHJJGBYZZKBXSCQDJQDSUJZYYHZHHMGSXCSYMXFEBCQWWRBPYYJQTYZCYQYQQZYHMWFFHGZFRJFCDPXNTQYZPDYKHJLFRZXPPXZDBBGZQSTLGDGYLCQMLCHHMFYWLZYXKJLYPQHSYWMQQGQZMLZJNSQXJQSYJYCBEHSXFSZPXZWFLLBCYYJDYTDTHWZSFJMQQYJLMQXXLLDTTKHHYBFPWTYYSQQWNQWLGWDEBZWCMYGCULKJXTMXMYJSXHYBRWFYMWFRXYQMXYSZTZZTFYKMLDHQDXWYYNLCRYJBLPSXCXYWLSPRRJWXHQYPHTYDNXHHMMYWYTZCSQMTSSCCDALWZTCPQPYJLLQZYJSWXMZZMMYLMXCLMXCZMXMZSQTZPPQQBLPGXQZHFLJJHYTJSRXWZXSCCDLXTYJDCQJXSLQYCLZXLZZXMXQRJMHRHZJBHMFLJLMLCLQNLDXZLLLPYPSYJYSXCQQDCMQJZZXHNPNXZMEKMXHYKYQLXSXTXJYYHWDCWDZHQYYBGYBCYSCFGPSJNZDYZZJZXRZRQJJYMCANYRJTLDPPYZBSTJKXXZYPFDWFGZZRPYMTNGXZQBYXNBUFNQKRJQZMJEGRZGYCLKXZDSKKNSXKCLJSPJYYZLQQJYBZSSQLLLKJXTBKTYLCCDDBLSPPFYLGYDTZJYQGGKQTTFZXBDKTYYHYBBFYTYYBCLPDYTGDHRYRNJSPTCSNYJQHKLLLZSLYDXXWBCJQSPXBPJZJCJDZFFXXBRMLAZHCSNDLBJDSZBLPRZTSWSBXBCLLXXLZDJZSJPYLYXXYFTFFFBHJJXGBYXJPMMMPSSJZJMTLYZJXSWXTYLEDQPJMYGQZJGDJLQJWJQLLSJGJGYGMSCLJJXDTYGJQJQJCJZCJGDZZSXQGSJGGCXHQXSNQLZZBXHSGZXCXYLJXYXYYDFQQJHJFXDHCTXJYRXYSQTJXYEFYYSSYYJXNCYZXFXMSYSZXYYSCHSHXZZZGZZZGFJDLTYLNPZGYJYZYYQZPBXQBDZTZCZYXXYHHSQXSHDHGQHJHGYWSZTMZMLHYXGEBTYLZKQWYTJZRCLEKYSTDBCYKQQSAYXCJXWWGSBHJYZYDHCSJKQCXSWXFLTYNYZPZCCZJQTZWJQDZZZQZLJJXLSBHPYXXPSXSHHEZTXFPTLQYZZXHYTXNCFZYYHXGNXMYWXTZSJPTHHGYMXMXQZXTSBCZYJYXXTYYZYPCQLMMSZMJZZLLZXGXZAAJZYXJMZXWDXZSXZDZXLEYJJZQBHZWZZZQTZPSXZTDSXJJJZNYAZPHXYYSRNQDTHZHYYKYJHDZXZLSWCLYBZYECWCYCRYLCXNHZYDZYDYJDFRJJHTRSQTXYXJRJHOJYNXELXSFSFJZGHPZSXZSZDZCQZBYYKLSGSJHCZSHDGQGXYZGXCHXZJWYQWGYHKSSEQZZNDZFKWYSSTCLZSTSYMCDHJXXYWEYXCZAYDMPXMDSXYBSQMJMZJMTZQLPJYQZCGQHXJHHLXXHLHDLDJQCLDWBSXFZZYYSCHTYTYYBHECXHYKGJPXHHYZJFXHWHBDZFYZBCAPNPGNYDMSXHMMMMAMYNBYJTMPXYYMCTHJBZYFCGTYHWPHFTWZZEZSBZEGPFMTSKFTYCMHFLLHGPZJXZJGZJYXZSBBQSCZZLZCCSTPGXMJSFTCCZJZDJXCYBZLFCJSYZFGSZLYBCWZZBYZDZYPSWYJZXZBDSYUXLZZBZFYGCZXBZHZFTPBGZGEJBSTGKDMFHYZZJHZLLZZGJQZLSFDJSSCBZGPDLFZFZSZYZYZSYGCXSNXXCHCZXTZZLJFZGQSQYXZJQDCCZTQCDXZJYQJQCHXZTDLGSCXZSYQJQTZWLQDQZTQCHQQJZYEZZZPBWKDJFCJPZTYPQYQTTYNLMBDKTJZPQZQZZFPZSBNJLGYJDXJDZZKZGQKXDLPZJTCJDQBXDJQJSTCKNXBXZMSLYJCQMTJQWWCJQNJNLLLHJCWQTBZQYDZCZPZZDZYDDCYZZZCCJTTJFZDPRRTZTJDCQTQZDTJNPLZBCLLCTZSXKJZQZPZLBZRBTJDCXFCZDBCCJJLTQQPLDCGZDBBZJCQDCJWYNLLZYZCCDWLLXWZLXRXNTQQCZXKQLSGDFQTDDGLRLAJJTKUYMKQLLTZYTDYYCZGJWYXDXFRSKSTQTENQMRKQZHHQKDLDAZFKYPBGGPZREBZZYKZZSPEGJXGYKQZZZSLYSYYYZWFQZYLZZLZHWCHKYPQGNPGBLPLRRJYXCCSYYHSFZFYBZYYTGZXYLXCZWXXZJZBLFFLGSKHYJZEYJHLPLLLLCZGXDRZELRHGKLZZYHZLYQSZZJZQLJZFLNBHGWLCZCFJYSPYXZLZLXGCCPZBLLCYBBBBUBBCBPCRNNZCZYRBFSRLDCGQYYQXYGMQZWTZYTYJXYFWTEHZZJYWLCCNTZYJJZDEDPZDZTSYQJHDYMBJNYJZLXTSSTPHNDJXXBYXQTZQDDTJTDYYTGWSCSZQFLSHLGLBCZPHDLYZJYCKWTYTYLBNYTSDSYCCTYSZYYEBHEXHQDTWNYGYCLXTSZYSTQMYGZAZCCSZZDSLZCLZRQXYYELJSBYMXSXZTEMBBLLYYLLYTDQYSHYMRQWKFKBFXNXSBYCHXBWJYHTQBPBSBWDZYLKGZSKYHXQZJXHXJXGNLJKZLYYCDXLFYFGHLJGJYBXQLYBXQPQGZTZPLNCYPXDJYQYDYMRBESJYYHKXXSTMXRCZZYWXYQYBMCLLYZHQYZWQXDBXBZWZMSLPDMYSKFMZKLZCYQYCZLQXFZZYDQZPZYGYJYZMZXDZFYFYTTQTZHGSPCZMLCCYTZXJCYTJMKSLPZHYSNZLLYTPZCTZZCKTXDHXXTQCYFKSMQCCYYAZHTJPCYLZLYJBJXTPNYLJYYNRXSYLMMNXJSMYBCSYSYLZYLXJJQYLDZLPQBFZZBLFNDXQKCZFYWHGQMRDSXYCYTXNQQJZYYPFZXDYZFPRXEJDGYQBXRCNFYYQPGHYJDYZXGRHTKYLNWDZNTSMPKLBTHBPYSZBZTJZSZZJTYYXZPHSSZZBZCZPTQFZMYFLYPYBBJQXZMXXDJMTSYSKKBJZXHJCKLPSMKYJZCXTMLJYXRZZQSLXXQPYZXMKYXXXJCLJPRMYYGADYSKQLSNDHYZKQXZYZTCGHZTLMLWZYBWSYCTBHJHJFCWZTXWYTKZLXQSHLYJZJXTMPLPYCGLTBZZTLZJCYJGDTCLKLPLLQPJMZPAPXYZLKKTKDZCZZBNZDYDYQZJYJGMCTXLTGXSZLMLHBGLKFWNWZHDXUHLFMKYSLGXDTWWFRJEJZTZHYDXYKSHWFZCQSHKTMQQHTZHYMJDJSKHXZJZBZZXYMPAGQMSTPXLSKLZYNWRTSQLSZBPSPSGZWYHTLKSSSWHZZLYYTNXJGMJSZSUFWNLSOZTXGXLSAMMLBWLDSZYLAKQCQCTMYCFJBSLXCLZZCLXXKSBZQCLHJPSQPLSXXCKSLNHPSFQQYTXYJZLQLDXZQJZDYYDJNZPTUZDSKJFSLJHYLZSQZLBTXYDGTQFDBYAZXDZHZJNHHQBYKNXJJQCZMLLJZKSPLDYCLBBLXKLELXJLBQYCXJXGCNLCQPLZLZYJTZLJGYZDZPLTQCSXFDMNYCXGBTJDCZNBGBQYQJWGKFHTNPYQZQGBKPBBYZMTJDYTBLSQMPSXTBNPDXKLEMYYCJYNZCTLDYKZZXDDXHQSHDGMZSJYCCTAYRZLPYLTLKXSLZCGGEXCLFXLKJRTLQJAQZNCMBYDKKCXGLCZJZXJHPTDJJMZQYKQSECQZDSHHADMLZFMMZBGNTJNNLGBYJBRBTMLBYJDZXLCJLPLDLPCQDHLXZLYCBLCXZZJADJLNZMMSSSMYBHBSQKBHRSXXJMXSDZNZPXLGBRHWGGFCXGMSKLLTSJYYCQLTSKYWYYHYWXBXQYWPYWYKQLSQPTNTKHQCWDQKTWPXXHCPTHTWUMSSYHBWCRWXHJMKMZNGWTMLKFGHKJYLSYYCXWHYECLQHKQHTTQKHFZLDXQWYZYYDESBPKYRZPJFYYZJCEQDZZDLATZBBFJLLCXDLMJSSXEGYGSJQXCWBXSSZPDYZCXDNYXPPZYDLYJCZPLTXLSXYZYRXCYYYDYLWWNZSAHJSYQYHGYWWAXTJZDAXYSRLTDPSSYYFNEJDXYZHLXLLLZQZSJNYQYQQXYJGHZGZCYJCHZLYCDSHWSHJZYJXCLLNXZJJYYXNFXMWFPYLCYLLABWDDHWDXJMCXZTZPMLQZHSFHZYNZTLLDYWLSLXHYMMYLMBWWKYXYADTXYLLDJPYBPWUXJMWMLLSAFDLLYFLBHHHBQQLTZJCQJLDJTFFKMMMBYTHYGDCQRDDWRQJXNBYSNWZDBYYTBJHPYBYTTJXAAHGQDQTMYSTQXKBTZPKJLZRBEQQSSMJJBDJOTGTBXPGBKTLHQXJJJCTHXQDWJLWRFWQGWSHCKRYSWGFTGYGBXSDWDWRFHWYTJJXXXJYZYSLPYYYPAYXHYDQKXSHXYXGSKQHYWFDDDPPLCJLQQEEWXKSYYKDYPLTJTHKJLTCYYHHJTTPLTZZCDLTHQKZXQYSTEEYWYYZYXXYYSTTJKLLPZMCYHQGXYHSRMBXPLLNQYDQHXSXXWGDQBSHYLLPJJJTHYJKYPPTHYYKTYEZYENMDSHLCRPQFDGFXZPSFTLJXXJBSWYYSKSFLXLPPLBBBLBSFXFYZBSJSSYLPBBFFFFSSCJDSTZSXZRYYSYFFSYZYZBJTBCTSBSDHRTJJBYTCXYJEYLXCBNEBJDSYXYKGSJZBXBYTFZWGENYHHTHZHHXFWGCSTBGXKLSXYWMTMBYXJSTZSCDYQRCYTWXZFHMYMCXLZNSDJTTTXRYCFYJSBSDYERXJLJXBBDEYNJGHXGCKGSCYMBLXJMSZNSKGXFBNBPTHFJAAFXYXFPXMYPQDTZCXZZPXRSYWZDLYBBKTYQPQJPZYPZJZNJPZJLZZFYSBTTSLMPTZRTDXQSJEHBZYLZDHLJSQMLHTXTJECXSLZZSPKTLZKQQYFSYGYWPCPQFHQHYTQXZKRSGTTSQCZLPTXCDYYZXSQZSLXLZMYCPCQBZYXHBSXLZDLTCDXTYLZJYYZPZYZLTXJSJXHLPMYTXCQRBLZSSFJZZTNJYTXMYJHLHPPLCYXQJQQKZZSCPZKSWALQSBLCCZJSXGWWWYGYKTJBBZTDKHXHKGTGPBKQYSLPXPJCKBMLLXDZSTBKLGGQKQLSBKKTFXRMDKBFTPZFRTBBRFERQGXYJPZSSTLBZTPSZQZSJDHLJQLZBPMSMMSXLQQNHKNBLRDDNXXDHDDJCYYGYLXGZLXSYGMQQGKHBPMXYXLYTQWLWGCPBMQXCYZYDRJBHTDJYHQSHTMJSBYPLWHLZFFNYPMHXXHPLTBQPFBJWQDBYGPNZTPFZJGSDDTQSHZEAWZZYLLTYYBWJKXXGHLFKXDJTMSZSQYNZGGSWQSPHTLSSKMCLZXYSZQZXNCJDQGZDLFNYKLJCJLLZLMZZNHYDSSHTHZZLZZBBHQZWWYCRZHLYQQJBEYFXXXWHSRXWQHWPSLMSSKZTTYGYQQWRSLALHMJTQJSMXQBJJZJXZYZKXBYQXBJXSHZTSFJLXMXZXFGHKZSZGGYLCLSARJYHSLLLMZXELGLXYDJYTLFBHBPNLYZFBBHPTGJKWETZHKJJXZXXGLLJLSTGSHJJYQLQZFKCGNNDJSSZFDBCTWWSEQFHQJBSAQTGYPQLBXBMMYWXGSLZHGLZGQYFLZBYFZJFRYSFMBYZHQGFWZSYFYJJPHZBYYZFFWODGRLMFTWLBZGYCQXCDJYGZYYYYTYTYDWEGAZYHXJLZYYHLRMGRXXZCLHNELJJTJTPWJYBJJBXJJTJTEEKHWSLJPLPSFYZPQQBDLQJJTYYQLYZKDKSQJYYQZLDQTGJQYZJSUCMRYQTHTEJMFCTYHYPKMHYZWJDQFHYYXWSHCTXRLJHQXHCCYYYJLTKTTYTMXGTCJTZAYYOCZLYLBSZYWJYTSJYHBYSHFJLYGJXXTMZYYLTXXYPZLXYJZYZYYPNHMYMDYYLBLHLSYYQQLLNJJYMSOYQBZGDLYXYLCQYXTSZEGXHZGLHWBLJHEYXTWQMAKBPQCGYSHHEGQCMWYYWLJYJHYYZLLJJYLHZYHMGSLJLJXCJJYCLYCJPCPZJZJMMYLCQLNQLJQJSXYJMLSZLJQLYCMMHCFMMFPQQMFYLQMCFFQMMMMHMZNFHHJGTTHHKHSLNCHHYQDXTMMQDCYZYXYQMYQYLTDCYYYZAZZCYMZYDLZFFFMMYCQZWZZMABTBYZTDMNZZGGDFTYPCGQYTTSSFFWFDTZQSSYSTWXJHXYTSXXYLBYQHWWKXHZXWZNNZZJZJJQJCCCHYYXBZXZCYZTLLCQXYNJYCYYCYNZZQYYYEWYCZDCJYCCHYJLBTZYYCQWMPWPYMLGKDLDLGKQQBGYCHJXY";
-
- //此处收录了375个多音字,数据来自于http://www.51window.net/page/pinyin
- var oMultiDiff = {
- "19969": "DZ",
- "19975": "WM",
- "19988": "QJ",
- "20048": "YL",
- "20056": "SC",
- "20060": "NM",
- "20094": "QG",
- "20127": "QJ",
- "20167": "QC",
- "20193": "YG",
- "20250": "KH",
- "20256": "ZC",
- "20282": "SC",
- "20285": "QJG",
- "20291": "TD",
- "20314": "YD",
- "20315": "BF",
- "20340": "NE",
- "20375": "TD",
- "20389": "YJ",
- "20391": "CZ",
- "20415": "PB",
- "20446": "YS",
- "20447": "SQ",
- "20504": "TC",
- "20608": "KG",
- "20854": "QJ",
- "20857": "ZC",
- "20911": "PF",
- "20985": "AW",
- "21032": "PB",
- "21048": "XQ",
- "21049": "SC",
- "21089": "YS",
- "21119": "JC",
- "21242": "SB",
- "21273": "SC",
- "21305": "YP",
- "21306": "QO",
- "21330": "ZC",
- "21333": "SDC",
- "21345": "QK",
- "21378": "CA",
- "21397": "SC",
- "21414": "XS",
- "21442": "SC",
- "21477": "JG",
- "21480": "TD",
- "21484": "ZS",
- "21494": "YX",
- "21505": "YX",
- "21512": "HG",
- "21523": "XH",
- "21537": "PB",
- "21542": "PF",
- "21549": "KH",
- "21571": "E",
- "21574": "DA",
- "21588": "TD",
- "21589": "O",
- "21618": "ZC",
- "21621": "KHA",
- "21632": "ZJ",
- "21654": "KG",
- "21679": "LKG",
- "21683": "KH",
- "21710": "A",
- "21719": "YH",
- "21734": "WOE",
- "21769": "A",
- "21780": "WN",
- "21804": "XH",
- "21834": "A",
- "21899": "ZD",
- "21903": "RN",
- "21908": "WO",
- "21939": "ZC",
- "21956": "SA",
- "21964": "YA",
- "21970": "TD",
- "22003": "A",
- "22031": "JG",
- "22040": "XS",
- "22060": "ZC",
- "22066": "ZC",
- "22079": "MH",
- "22129": "XJ",
- "22179": "XA",
- "22237": "NJ",
- "22244": "TD",
- "22280": "JQ",
- "22300": "YH",
- "22313": "XW",
- "22331": "YQ",
- "22343": "YJ",
- "22351": "PH",
- "22395": "DC",
- "22412": "TD",
- "22484": "PB",
- "22500": "PB",
- "22534": "ZD",
- "22549": "DH",
- "22561": "PB",
- "22612": "TD",
- "22771": "KQ",
- "22831": "HB",
- "22841": "JG",
- "22855": "QJ",
- "22865": "XQ",
- "23013": "ML",
- "23081": "WM",
- "23487": "SX",
- "23558": "QJ",
- "23561": "YW",
- "23586": "YW",
- "23614": "YW",
- "23615": "SN",
- "23631": "PB",
- "23646": "ZS",
- "23663": "ZT",
- "23673": "YG",
- "23762": "TD",
- "23769": "ZS",
- "23780": "QJ",
- "23884": "QK",
- "24055": "XH",
- "24113": "DC",
- "24162": "ZC",
- "24191": "GA",
- "24273": "QJ",
- "24324": "NL",
- "24377": "TD",
- "24378": "QJ",
- "24439": "PF",
- "24554": "ZS",
- "24683": "TD",
- "24694": "WE",
- "24733": "LK",
- "24925": "TN",
- "25094": "ZG",
- "25100": "XQ",
- "25103": "XH",
- "25153": "PB",
- "25170": "PB",
- "25179": "KG",
- "25203": "PB",
- "25240": "ZS",
- "25282": "FB",
- "25303": "NA",
- "25324": "KG",
- "25341": "ZY",
- "25373": "WZ",
- "25375": "XJ",
- "25384": "A",
- "25457": "A",
- "25528": "SD",
- "25530": "SC",
- "25552": "TD",
- "25774": "ZC",
- "25874": "ZC",
- "26044": "YW",
- "26080": "WM",
- "26292": "PB",
- "26333": "PB",
- "26355": "ZY",
- "26366": "CZ",
- "26397": "ZC",
- "26399": "QJ",
- "26415": "ZS",
- "26451": "SB",
- "26526": "ZC",
- "26552": "JG",
- "26561": "TD",
- "26588": "JG",
- "26597": "CZ",
- "26629": "ZS",
- "26638": "YL",
- "26646": "XQ",
- "26653": "KG",
- "26657": "XJ",
- "26727": "HG",
- "26894": "ZC",
- "26937": "ZS",
- "26946": "ZC",
- "26999": "KJ",
- "27099": "KJ",
- "27449": "YQ",
- "27481": "XS",
- "27542": "ZS",
- "27663": "ZS",
- "27748": "TS",
- "27784": "SC",
- "27788": "ZD",
- "27795": "TD",
- "27812": "O",
- "27850": "PB",
- "27852": "MB",
- "27895": "SL",
- "27898": "PL",
- "27973": "QJ",
- "27981": "KH",
- "27986": "HX",
- "27994": "XJ",
- "28044": "YC",
- "28065": "WG",
- "28177": "SM",
- "28267": "QJ",
- "28291": "KH",
- "28337": "ZQ",
- "28463": "TL",
- "28548": "DC",
- "28601": "TD",
- "28689": "PB",
- "28805": "JG",
- "28820": "QG",
- "28846": "PB",
- "28952": "TD",
- "28975": "ZC",
- "29100": "A",
- "29325": "QJ",
- "29575": "SL",
- "29602": "FB",
- "30010": "TD",
- "30044": "CX",
- "30058": "PF",
- "30091": "YSP",
- "30111": "YN",
- "30229": "XJ",
- "30427": "SC",
- "30465": "SX",
- "30631": "YQ",
- "30655": "QJ",
- "30684": "QJG",
- "30707": "SD",
- "30729": "XH",
- "30796": "LG",
- "30917": "PB",
- "31074": "NM",
- "31085": "JZ",
- "31109": "SC",
- "31181": "ZC",
- "31192": "MLB",
- "31293": "JQ",
- "31400": "YX",
- "31584": "YJ",
- "31896": "ZN",
- "31909": "ZY",
- "31995": "XJ",
- "32321": "PF",
- "32327": "ZY",
- "32418": "HG",
- "32420": "XQ",
- "32421": "HG",
- "32438": "LG",
- "32473": "GJ",
- "32488": "TD",
- "32521": "QJ",
- "32527": "PB",
- "32562": "ZSQ",
- "32564": "JZ",
- "32735": "ZD",
- "32793": "PB",
- "33071": "PF",
- "33098": "XL",
- "33100": "YA",
- "33152": "PB",
- "33261": "CX",
- "33324": "BP",
- "33333": "TD",
- "33406": "YA",
- "33426": "WM",
- "33432": "PB",
- "33445": "JG",
- "33486": "ZN",
- "33493": "TS",
- "33507": "QJ",
- "33540": "QJ",
- "33544": "ZC",
- "33564": "XQ",
- "33617": "YT",
- "33632": "QJ",
- "33636": "XH",
- "33637": "YX",
- "33694": "WG",
- "33705": "PF",
- "33728": "YW",
- "33882": "SR",
- "34067": "WM",
- "34074": "YW",
- "34121": "QJ",
- "34255": "ZC",
- "34259": "XL",
- "34425": "JH",
- "34430": "XH",
- "34485": "KH",
- "34503": "YS",
- "34532": "HG",
- "34552": "XS",
- "34558": "YE",
- "34593": "ZL",
- "34660": "YQ",
- "34892": "XH",
- "34928": "SC",
- "34999": "QJ",
- "35048": "PB",
- "35059": "SC",
- "35098": "ZC",
- "35203": "TQ",
- "35265": "JX",
- "35299": "JX",
- "35782": "SZ",
- "35828": "YS",
- "35830": "E",
- "35843": "TD",
- "35895": "YG",
- "35977": "MH",
- "36158": "JG",
- "36228": "QJ",
- "36426": "XQ",
- "36466": "DC",
- "36710": "JC",
- "36711": "ZYG",
- "36767": "PB",
- "36866": "SK",
- "36951": "YW",
- "37034": "YX",
- "37063": "XH",
- "37218": "ZC",
- "37325": "ZC",
- "38063": "PB",
- "38079": "TD",
- "38085": "QY",
- "38107": "DC",
- "38116": "TD",
- "38123": "YD",
- "38224": "HG",
- "38241": "XTC",
- "38271": "ZC",
- "38415": "YE",
- "38426": "KH",
- "38461": "YD",
- "38463": "AE",
- "38466": "PB",
- "38477": "XJ",
- "38518": "YT",
- "38551": "WK",
- "38585": "ZC",
- "38704": "XS",
- "38739": "LJ",
- "38761": "GJ",
- "38808": "SQ",
- "39048": "JG",
- "39049": "XJ",
- "39052": "HG",
- "39076": "CZ",
- "39271": "XT",
- "39534": "TD",
- "39552": "TD",
- "39584": "PB",
- "39647": "SB",
- "39730": "LG",
- "39748": "TPB",
- "40109": "ZQ",
- "40479": "ND",
- "40516": "HG",
- "40536": "HG",
- "40583": "QJ",
- "40765": "YQ",
- "40784": "QJ",
- "40840": "YK",
- "40863": "QJG"
- };
-
- var _checkPYCh = function (ch) {
- var uni = ch.charCodeAt(0);
- // 如果不在汉字处理范围之内,返回原字符,也可以调用自己的处理函数
- if (uni > 40869 || uni < 19968)
- return ch; // dealWithOthers(ch);
- return (oMultiDiff[uni] ? oMultiDiff[uni] : (_ChineseFirstPY.charAt(uni - 19968)));
- };
-
- var _mkPYRslt = function (arr) {
- var arrRslt = [""], k;
- for (var i = 0, len = arr.length; i < len; i++) {
- var str = arr[i];
- var strlen = str.length;
- if (strlen == 1) {
- for (k = 0; k < arrRslt.length; k++) {
- arrRslt[k] += str;
- }
- } else {
- var tmpArr = arrRslt.slice(0);
- arrRslt = [];
- for (k = 0; k < strlen; k++) {
- // 复制一个相同的arrRslt
- var tmp = tmpArr.slice(0);
- // 把当前字符str[k]添加到每个元素末尾
- for (var j = 0; j < tmp.length; j++) {
- tmp[j] += str.charAt(k);
- }
- // 把复制并修改后的数组连接到arrRslt上
- arrRslt = arrRslt.concat(tmp);
- }
- }
- }
- return arrRslt.join("").toLowerCase();
- };
-
- _.extend(BI, {
- makeFirstPY: function (str) {
- if (typeof (str) != "string")
- return '' + str;
- var arrResult = []; // 保存中间结果的数组
- for (var i = 0, len = str.length; i < len; i++) {
- // 获得unicode码
- var ch = str.charAt(i);
- // 检查该unicode码是否在处理范围之内,在则返回该码对映汉字的拼音首字母,不在则调用其它函数处理
- arrResult.push(_checkPYCh(ch));
- }
- // 处理arrResult,返回所有可能的拼音首字母串数组
- return _mkPYRslt(arrResult);
- }
- });
-})();/**
- * Detect Element Resize.
- * Forked in order to guard against unsafe 'window' and 'document' references.
- *
- * https://github.com/sdecima/javascript-detect-element-resize
- * Sebastian Decima
- *
- * version: 0.5.3
- **/
-!(function () {
- // Check `document` and `window` in case of server-side rendering
- var _window
- if (typeof window !== 'undefined') {
- _window = window
- } else if (typeof self !== 'undefined') {
- _window = self
- } else {
- _window = this
- }
-
- var addEventListener = typeof document !== 'undefined' && document.addEventListener;
- var stylesCreated = false;
-
- if (addEventListener) {
- var requestFrame = (function () {
- var raf = _window.requestAnimationFrame || _window.mozRequestAnimationFrame || _window.webkitRequestAnimationFrame ||
- function (fn) {
- return _window.setTimeout(fn, 20);
- };
- return function (fn) {
- return raf(fn);
- };
- })();
-
- var cancelFrame = (function () {
- var cancel = _window.cancelAnimationFrame || _window.mozCancelAnimationFrame || _window.webkitCancelAnimationFrame ||
- _window.clearTimeout;
- return function (id) {
- return cancel(id);
- };
- })();
-
- var resetTriggers = function (element) {
- var triggers = element.__resizeTriggers__,
- expand = triggers.firstElementChild,
- contract = triggers.lastElementChild,
- expandChild = expand.firstElementChild;
- contract.scrollLeft = contract.scrollWidth;
- contract.scrollTop = contract.scrollHeight;
- expandChild.style.width = expand.offsetWidth + 1 + 'px';
- expandChild.style.height = expand.offsetHeight + 1 + 'px';
- expand.scrollLeft = expand.scrollWidth;
- expand.scrollTop = expand.scrollHeight;
- };
-
- var checkTriggers = function (element) {
- return element.offsetWidth !== element.__resizeLast__.width ||
- element.offsetHeight !== element.__resizeLast__.height;
- }
-
- var scrollListener = function (e) {
- var element = this;
- resetTriggers(this);
- if (this.__resizeRAF__) cancelFrame(this.__resizeRAF__);
- this.__resizeRAF__ = requestFrame(function () {
- if (checkTriggers(element)) {
- element.__resizeLast__.width = element.offsetWidth;
- element.__resizeLast__.height = element.offsetHeight;
- element.__resizeListeners__.forEach(function (fn) {
- fn.call(element, e);
- });
- }
- });
- };
-
- /* Detect CSS Animations support to detect element display/re-attach */
- var animation = false,
- animationstring = 'animation',
- keyframeprefix = '',
- animationstartevent = 'animationstart',
- domPrefixes = 'Webkit Moz O ms'.split(' '),
- startEvents = 'webkitAnimationStart animationstart oAnimationStart MSAnimationStart'.split(' '),
- pfx = '';
- {
- var elm = document.createElement('fakeelement');
- if (elm.style.animationName !== undefined) {
- animation = true;
- }
-
- if (animation === false) {
- for (var i = 0; i < domPrefixes.length; i++) {
- if (elm.style[domPrefixes[i] + 'AnimationName'] !== undefined) {
- pfx = domPrefixes[i];
- animationstring = pfx + 'Animation';
- keyframeprefix = '-' + pfx.toLowerCase() + '-';
- animationstartevent = startEvents[i];
- animation = true;
- break;
- }
- }
- }
- }
-
- var animationName = 'resizeanim';
- var animationKeyframes = '@' + keyframeprefix + 'keyframes ' + animationName + ' { from { opacity: 0; } to { opacity: 0; } } ';
- var animationStyle = keyframeprefix + 'animation: 1ms ' + animationName + '; ';
- }
-
- var createStyles = function () {
- if (!stylesCreated) {
- //opacity:0 works around a chrome bug https://code.google.com/p/chromium/issues/detail?id=286360
- var css = (animationKeyframes ? animationKeyframes : '') +
- '.resize-triggers { ' + (animationStyle ? animationStyle : '') + 'visibility: hidden; opacity: 0; } ' +
- '.resize-triggers, .resize-triggers > div, .contract-trigger:before { content: \" \"; display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden; } .resize-triggers > div { background: #eee; overflow: auto; } .contract-trigger:before { width: 200%; height: 200%; }',
- head = document.head || document.getElementsByTagName('head')[0],
- style = document.createElement('style');
-
- style.type = 'text/css';
- if (style.styleSheet) {
- style.styleSheet.cssText = css;
- } else {
- style.appendChild(document.createTextNode(css));
- }
-
- head.appendChild(style);
- stylesCreated = true;
- }
- }
-
- var addResizeListener = function (element, fn) {
- if (addEventListener){
- if (!element.__resizeTriggers__) {
- if (getComputedStyle(element).position === 'static') element.style.position = 'relative';
- createStyles();
- element.__resizeLast__ = {};
- element.__resizeListeners__ = [];
- (element.__resizeTriggers__ = document.createElement('div')).className = 'resize-triggers';
- element.__resizeTriggers__.innerHTML = '
' +
- '
';
- element.appendChild(element.__resizeTriggers__);
- resetTriggers(element);
- element.addEventListener('scroll', scrollListener, true);
-
- /* Listen for a css animation to detect element display/re-attach */
- animationstartevent && element.__resizeTriggers__.addEventListener(animationstartevent, function (e) {
- if (e.animationName === animationName)
- resetTriggers(element);
- });
- }
- element.__resizeListeners__.push(fn);
-
- } else {
- element.attachEvent('onresize', fn);
- }
- };
-
- var removeResizeListener = function (element, fn) {
- if (addEventListener) {
- element.__resizeListeners__.splice(element.__resizeListeners__.indexOf(fn), 1);
- if (!element.__resizeListeners__.length) {
- element.removeEventListener('scroll', scrollListener, true);
- element.__resizeTriggers__ = !element.removeChild(element.__resizeTriggers__);
- }
- } else {
- element.detachEvent('onresize', fn);
- }
- };
-
- BI.ResizeDetector = {
- addResizeListener: function (widget, fn) {
- addResizeListener(widget.element[0], fn);
- return function () {
- removeResizeListener(widget.element[0], fn);
- }
- },
- removeResizeListener: function (widget, fn) {
- removeResizeListener(widget.element[0], fn);
- }
- };
-}());
-;
-(function () {
- function defaultComparator(a, b) {
- return a < b;
- }
-
- BI.Heap = function (items, comparator) {
- this._items = items || [];
- this._size = this._items.length;
- this._comparator = comparator || defaultComparator;
- this._heapify();
- };
-
- BI.Heap.prototype = {
- constructor: BI.Heap,
- empty: function () {
- return this._size === 0;
- },
-
- pop: function () {
- if (this._size === 0) {
- return;
- }
-
- var elt = this._items[0];
-
- var lastElt = this._items.pop();
- this._size--;
-
- if (this._size > 0) {
- this._items[0] = lastElt;
- this._sinkDown(0);
- }
-
- return elt;
- },
-
- push: function (item) {
- this._items[this._size++] = item;
- this._bubbleUp(this._size - 1);
- },
-
- size: function () {
- return this._size;
- },
-
- peek: function () {
- if (this._size === 0) {
- return;
- }
-
- return this._items[0];
- },
-
- _heapify: function () {
- for (var index = Math.floor((this._size + 1) / 2); index >= 0; index--) {
- this._sinkDown(index);
- }
- },
-
- _bubbleUp: function (index) {
- var elt = this._items[index];
- while (index > 0) {
- var parentIndex = Math.floor((index + 1) / 2) - 1;
- var parentElt = this._items[parentIndex];
-
- // if parentElt < elt, stop
- if (this._comparator(parentElt, elt)) {
- return;
- }
-
- // swap
- this._items[parentIndex] = elt;
- this._items[index] = parentElt;
- index = parentIndex;
- }
- },
-
- _sinkDown: function (index) {
- var elt = this._items[index];
-
- while (true) {
- var leftChildIndex = 2 * (index + 1) - 1;
- var rightChildIndex = 2 * (index + 1);
- var swapIndex = -1;
-
- if (leftChildIndex < this._size) {
- var leftChild = this._items[leftChildIndex];
- if (this._comparator(leftChild, elt)) {
- swapIndex = leftChildIndex;
- }
- }
-
- if (rightChildIndex < this._size) {
- var rightChild = this._items[rightChildIndex];
- if (this._comparator(rightChild, elt)) {
- if (swapIndex === -1 ||
- this._comparator(rightChild, this._items[swapIndex])) {
- swapIndex = rightChildIndex;
- }
- }
- }
-
- // if we don't have a swap, stop
- if (swapIndex === -1) {
- return;
- }
-
- this._items[index] = this._items[swapIndex];
- this._items[swapIndex] = elt;
- index = swapIndex;
- }
- }
- }
-})();
-;(function () {
- var clamp = function (min, value, max) {
- if (value < min) {
- return min;
- }
- if (value > max) {
- return max;
- }
- return value;
- };
-
- var BUFFER_ROWS = 5;
- var NO_ROWS_SCROLL_RESULT = {
- index: 0,
- offset: 0,
- position: 0,
- contentHeight: 0
- };
-
- BI.TableScrollHelper = function (rowCount,
- defaultRowHeight,
- viewportHeight,
- rowHeightGetter) {
- this._rowOffsets = BI.PrefixIntervalTree.uniform(rowCount, defaultRowHeight);
- this._storedHeights = new Array(rowCount);
- for (var i = 0; i < rowCount; ++i) {
- this._storedHeights[i] = defaultRowHeight;
- }
- this._rowCount = rowCount;
- this._position = 0;
- this._contentHeight = rowCount * defaultRowHeight;
- this._defaultRowHeight = defaultRowHeight;
- this._rowHeightGetter = rowHeightGetter ?
- rowHeightGetter : function () {
- return defaultRowHeight
- };
- this._viewportHeight = viewportHeight;
-
- this._updateHeightsInViewport(0, 0);
- };
-
- BI.TableScrollHelper.prototype = {
- constructor: BI.TableScrollHelper,
- setRowHeightGetter: function (rowHeightGetter) {
- this._rowHeightGetter = rowHeightGetter;
- },
-
- setViewportHeight: function (viewportHeight) {
- this._viewportHeight = viewportHeight;
- },
-
- getContentHeight: function () {
- return this._contentHeight;
- },
-
- _updateHeightsInViewport: function (firstRowIndex,
- firstRowOffset) {
- var top = firstRowOffset;
- var index = firstRowIndex;
- while (top <= this._viewportHeight && index < this._rowCount) {
- this._updateRowHeight(index);
- top += this._storedHeights[index];
- index++;
- }
- },
-
- _updateHeightsAboveViewport: function (firstRowIndex) {
- var index = firstRowIndex - 1;
- while (index >= 0 && index >= firstRowIndex - BUFFER_ROWS) {
- var delta = this._updateRowHeight(index);
- this._position += delta;
- index--;
- }
- },
-
- _updateRowHeight: function (rowIndex) {
- if (rowIndex < 0 || rowIndex >= this._rowCount) {
- return 0;
- }
- var newHeight = this._rowHeightGetter(rowIndex);
- if (newHeight !== this._storedHeights[rowIndex]) {
- var change = newHeight - this._storedHeights[rowIndex];
- this._rowOffsets.set(rowIndex, newHeight);
- this._storedHeights[rowIndex] = newHeight;
- this._contentHeight += change;
- return change;
- }
- return 0;
- },
-
- getRowPosition: function (rowIndex) {
- this._updateRowHeight(rowIndex);
- return this._rowOffsets.sumUntil(rowIndex);
- },
-
- scrollBy: function (delta) {
- if (this._rowCount === 0) {
- return NO_ROWS_SCROLL_RESULT;
- }
- var firstRow = this._rowOffsets.greatestLowerBound(this._position);
- firstRow = clamp(firstRow, 0, Math.max(this._rowCount - 1, 0));
- var firstRowPosition = this._rowOffsets.sumUntil(firstRow);
- var rowIndex = firstRow;
- var position = this._position;
-
- var rowHeightChange = this._updateRowHeight(rowIndex);
- if (firstRowPosition !== 0) {
- position += rowHeightChange;
- }
- var visibleRowHeight = this._storedHeights[rowIndex] -
- (position - firstRowPosition);
-
- if (delta >= 0) {
-
- while (delta > 0 && rowIndex < this._rowCount) {
- if (delta < visibleRowHeight) {
- position += delta;
- delta = 0;
- } else {
- delta -= visibleRowHeight;
- position += visibleRowHeight;
- rowIndex++;
- }
- if (rowIndex < this._rowCount) {
- this._updateRowHeight(rowIndex);
- visibleRowHeight = this._storedHeights[rowIndex];
- }
- }
- } else if (delta < 0) {
- delta = -delta;
- var invisibleRowHeight = this._storedHeights[rowIndex] - visibleRowHeight;
-
- while (delta > 0 && rowIndex >= 0) {
- if (delta < invisibleRowHeight) {
- position -= delta;
- delta = 0;
- } else {
- position -= invisibleRowHeight;
- delta -= invisibleRowHeight;
- rowIndex--;
- }
- if (rowIndex >= 0) {
- var change = this._updateRowHeight(rowIndex);
- invisibleRowHeight = this._storedHeights[rowIndex];
- position += change;
- }
- }
- }
-
- var maxPosition = this._contentHeight - this._viewportHeight;
- position = clamp(position, 0, maxPosition);
- this._position = position;
- var firstRowIndex = this._rowOffsets.greatestLowerBound(position);
- firstRowIndex = clamp(firstRowIndex, 0, Math.max(this._rowCount - 1, 0));
- firstRowPosition = this._rowOffsets.sumUntil(firstRowIndex);
- var firstRowOffset = firstRowPosition - position;
-
- this._updateHeightsInViewport(firstRowIndex, firstRowOffset);
- this._updateHeightsAboveViewport(firstRowIndex);
-
- return {
- index: firstRowIndex,
- offset: firstRowOffset,
- position: this._position,
- contentHeight: this._contentHeight
- };
- },
-
- _getRowAtEndPosition: function (rowIndex) {
- // We need to update enough rows above the selected one to be sure that when
- // we scroll to selected position all rows between first shown and selected
- // one have most recent heights computed and will not resize
- this._updateRowHeight(rowIndex);
- var currentRowIndex = rowIndex;
- var top = this._storedHeights[currentRowIndex];
- while (top < this._viewportHeight && currentRowIndex >= 0) {
- currentRowIndex--;
- if (currentRowIndex >= 0) {
- this._updateRowHeight(currentRowIndex);
- top += this._storedHeights[currentRowIndex];
- }
- }
- var position = this._rowOffsets.sumTo(rowIndex) - this._viewportHeight;
- if (position < 0) {
- position = 0;
- }
- return position;
- },
-
- scrollTo: function (position) {
- if (this._rowCount === 0) {
- return NO_ROWS_SCROLL_RESULT;
- }
- if (position <= 0) {
- // If position less than or equal to 0 first row should be fully visible
- // on top
- this._position = 0;
- this._updateHeightsInViewport(0, 0);
-
- return {
- index: 0,
- offset: 0,
- position: this._position,
- contentHeight: this._contentHeight
- };
- } else if (position >= this._contentHeight - this._viewportHeight) {
- // If position is equal to or greater than max scroll value, we need
- // to make sure to have bottom border of last row visible.
- var rowIndex = this._rowCount - 1;
- position = this._getRowAtEndPosition(rowIndex);
- }
- this._position = position;
-
- var firstRowIndex = this._rowOffsets.greatestLowerBound(position);
- firstRowIndex = clamp(firstRowIndex, 0, Math.max(this._rowCount - 1, 0));
- var firstRowPosition = this._rowOffsets.sumUntil(firstRowIndex);
- var firstRowOffset = firstRowPosition - position;
-
- this._updateHeightsInViewport(firstRowIndex, firstRowOffset);
- this._updateHeightsAboveViewport(firstRowIndex);
-
- return {
- index: firstRowIndex,
- offset: firstRowOffset,
- position: this._position,
- contentHeight: this._contentHeight
- };
- },
-
- /**
- * Allows to scroll to selected row with specified offset. It always
- * brings that row to top of viewport with that offset
- */
- scrollToRow: function (rowIndex, offset) {
- rowIndex = clamp(rowIndex, 0, Math.max(this._rowCount - 1, 0));
- offset = clamp(offset, -this._storedHeights[rowIndex], 0);
- var firstRow = this._rowOffsets.sumUntil(rowIndex);
- return this.scrollTo(firstRow - offset);
- },
-
- /**
- * Allows to scroll to selected row by bringing it to viewport with minimal
- * scrolling. This that if row is fully visible, scroll will not be changed.
- * If top border of row is above top of viewport it will be scrolled to be
- * fully visible on the top of viewport. If the bottom border of row is
- * below end of viewport, it will be scrolled up to be fully visible on the
- * bottom of viewport.
- */
- scrollRowIntoView: function (rowIndex) {
- rowIndex = clamp(rowIndex, 0, Math.max(this._rowCount - 1, 0));
- var rowBegin = this._rowOffsets.sumUntil(rowIndex);
- var rowEnd = rowBegin + this._storedHeights[rowIndex];
- if (rowBegin < this._position) {
- return this.scrollTo(rowBegin);
- } else if (this._position + this._viewportHeight < rowEnd) {
- var position = this._getRowAtEndPosition(rowIndex);
- return this.scrollTo(position);
- }
- return this.scrollTo(this._position);
- }
- };
-
-})();
-// Data structure that allows to store values and assign positions to them
-// in a way to minimize changing positions of stored values when new ones are
-// added or when some values are replaced. Stored elements are alwasy assigned
-// a consecutive set of positoins startin from 0 up to count of elements less 1
-// Following actions can be executed
-// * get position assigned to given value (null if value is not stored)
-// * create new entry for new value and get assigned position back
-// * replace value that is furthest from specified value range with new value
-// and get it's position back
-// All operations take amortized log(n) time where n is number of elements in
-// the set.
-BI.IntegerBufferSet = function () {
- this._valueToPositionMap = {};
- this._size = 0;
- this._smallValues = new BI.Heap(
- [], // Initial data in the heap
- this._smallerComparator
- );
- this._largeValues = new BI.Heap(
- [], // Initial data in the heap
- this._greaterComparator
- );
-
-};
-
-BI.IntegerBufferSet.prototype = {
- constructor: BI.IntegerBufferSet,
- getSize: function () /*number*/ {
- return this._size;
- },
-
- getValuePosition: function (/*number*/ value) /*?number*/ {
- if (this._valueToPositionMap[value] === undefined) {
- return null;
- }
- return this._valueToPositionMap[value];
- },
-
- getNewPositionForValue: function (/*number*/ value) /*number*/ {
- var newPosition = this._size;
- this._size++;
- this._pushToHeaps(newPosition, value);
- this._valueToPositionMap[value] = newPosition;
- return newPosition;
- },
-
- replaceFurthestValuePosition: function (/*number*/ lowValue,
- /*number*/ highValue,
- /*number*/ newValue) /*?number*/ {
- this._cleanHeaps();
- if (this._smallValues.empty() || this._largeValues.empty()) {
- // Threre are currently no values stored. We will have to create new
- // position for this value.
- return null;
- }
-
- var minValue = this._smallValues.peek().value;
- var maxValue = this._largeValues.peek().value;
- if (minValue >= lowValue && maxValue <= highValue) {
- // All values currently stored are necessary, we can't reuse any of them.
- return null;
- }
-
- var valueToReplace;
- if (lowValue - minValue > maxValue - highValue) {
- // minValue is further from provided range. We will reuse it's position.
- valueToReplace = minValue;
- this._smallValues.pop();
- } else {
- valueToReplace = maxValue;
- this._largeValues.pop();
- }
- var position = this._valueToPositionMap[valueToReplace];
- delete this._valueToPositionMap[valueToReplace];
- this._valueToPositionMap[newValue] = position;
- this._pushToHeaps(position, newValue);
-
- return position;
- },
-
- _pushToHeaps: function (/*number*/ position, /*number*/ value) {
- var element = {
- position: position,
- value:value
- };
- // We can reuse the same object in both heaps, because we don't mutate them
- this._smallValues.push(element);
- this._largeValues.push(element);
- },
-
- _cleanHeaps: function () {
- // We not usually only remove object from one heap while moving value.
- // Here we make sure that there is no stale data on top of heaps.
- this._cleanHeap(this._smallValues);
- this._cleanHeap(this._largeValues);
- var minHeapSize =
- Math.min(this._smallValues.size(), this._largeValues.size());
- var maxHeapSize =
- Math.max(this._smallValues.size(), this._largeValues.size());
- if (maxHeapSize > 10 * minHeapSize) {
- // There are many old values in one of heaps. We nned to get rid of them
- // to not use too avoid memory leaks
- this._recreateHeaps();
- }
- },
-
- _recreateHeaps: function () {
- var sourceHeap = this._smallValues.size() < this._largeValues.size() ?
- this._smallValues :
- this._largeValues;
- var newSmallValues = new Heap(
- [], // Initial data in the heap
- this._smallerComparator
- );
- var newLargeValues = new Heap(
- [], // Initial datat in the heap
- this._greaterComparator
- );
- while (!sourceHeap.empty()) {
- var element = sourceHeap.pop();
- // Push all stil valid elements to new heaps
- if (this._valueToPositionMap[element.value] !== undefined) {
- newSmallValues.push(element);
- newLargeValues.push(element);
- }
- }
- this._smallValues = newSmallValues;
- this._largeValues = newLargeValues;
- },
-
- _cleanHeap: function (/*object*/ heap) {
- while (!heap.empty() &&
- this._valueToPositionMap[heap.peek().value] === undefined) {
- heap.pop();
- }
- },
-
- _smallerComparator: function (/*object*/ lhs, /*object*/ rhs) /*boolean*/ {
- return lhs.value < rhs.value;
- },
-
- _greaterComparator: function (/*object*/ lhs, /*object*/ rhs) /*boolean*/ {
- return lhs.value > rhs.value;
- }
-};
-;
-!(function () {
- BI.LinkHashMap = function () {
- this.array = [];
- this.map = {};
- };
- BI.LinkHashMap.prototype = {
- constructor: BI.LinkHashMap,
- has: function (key) {
- if (key in this.map) {
- return true;
- }
- return false;
- },
-
- add: function (key, value) {
- if (typeof key == 'undefined') {
- return;
- }
- if (key in this.map) {
- this.map[key] = value;
- } else {
- this.array.push(key);
- this.map[key] = value;
- }
- },
-
- remove: function (key) {
- if (key in this.map) {
- delete this.map[key];
- for (var i = 0; i < this.array.length; i++) {
- if (this.array[i] == key) {
- this.array.splice(i, 1);
- break;
- }
- }
- }
- },
-
- size: function () {
- return this.array.length;
- },
-
- each: function (fn, scope) {
- var scope = scope || window;
- var fn = fn || null;
- if (fn == null || typeof (fn) != "function") {
- return;
- }
- for (var i = 0; i < this.array.length; i++) {
- var key = this.array[i];
- var value = this.map[key];
- var re = fn.call(scope, key, value, i, this.array, this.map);
- if (re == false) {
- break;
- }
- }
- },
-
- get: function (key) {
- return this.map[key];
- },
-
- toArray: function () {
- var array = [];
- this.each(function (key, value) {
- array.push(value);
- })
- return array;
- }
- }
-})();window.BI = window.BI || {};
-
-$.extend(BI, {
- $defaultImport: function (options, type) {
- var config;
- if (BI.isObject(options)) {
- config = $.extend({
- op: 'resource',
- path: null,
- type: null,
- must: false
- }, options);
- config.url = BI.servletURL + '?op=' + config.op + '&resource=' + config.path;
- } else {
- config = {
- url: BI.servletURL + "?op=resource&resource=" + options,
- type: arguments[1],
- must: arguments[2]
- }
- }
- this.$import(config.url, config.type, config.must);
- },
- $import: function () {
- var _LOADED = {}; // alex:保存加载过的
- function loadReady(src, must) {
- var $scripts = $("head script, body script");
- $.each($scripts, function (i, item) {
- if (item.src.indexOf(src) != -1) {
- _LOADED[src] = true;
- }
- });
- var $links = $("head link");
- $.each($links, function (i, item) {
- if (item.href.indexOf(src) != -1 && must) {
- _LOADED[src] = false;
- $(item).remove();
- }
- });
- }
-
- // must=true 强行加载
- return function (src, ext, must) {
- loadReady(src, must);
- // alex:如果已经加载过了的,直接return
- if (_LOADED[src] === true) {
- return;
- }
- if (ext === 'css') {
- var link = document.createElement('link');
- link.rel = 'stylesheet';
- link.type = 'text/css';
- link.href = src;
- var head = document.getElementsByTagName('head')[0];
- head.appendChild(link);
- _LOADED[src] = true;
- } else {
- // alex:这里用同步调用的方式,必须等待ajax完成
- $.ajax({
- url: src,
- dataType: "script", // alex:指定dataType为script,jquery会帮忙做globalEval的事情
- async: false,
- cache: true,
- complete: function (res, status) {
- /*
- * alex:发现jquery会很智能地判断一下返回的数据类型是不是script,然后做一个globalEval
- * 所以当status为success时就不需要再把其中的内容加到script里面去了
- */
- if (status == 'success') {
- _LOADED[src] = true;
- }
- }
- })
- }
- }
- }()
-});;
-!(function () {
- BI.LRU = function (limit) {
- this.size = 0;
- this.limit = limit;
- this.head = this.tail = undefined;
- this._keymap = {};
- };
-
- var p = BI.LRU.prototype;
-
- p.put = function (key, value) {
- var removed;
- if (this.size === this.limit) {
- removed = this.shift();
- }
-
- var entry = this.get(key, true);
- if (!entry) {
- entry = {
- key: key
- };
- this._keymap[key] = entry;
- if (this.tail) {
- this.tail.newer = entry;
- entry.older = this.tail
- } else {
- this.head = entry
- }
- this.tail = entry;
- this.size++;
- }
- entry.value = value;
-
- return removed;
- };
-
- p.shift = function () {
- var entry = this.head;
- if (entry) {
- this.head = this.head.newer;
- this.head.older = undefined;
- entry.newer = entry.older = undefined;
- this._keymap[entry.key] = undefined;
- this.size--;
- }
- return entry;
- };
-
-
- p.get = function (key, returnEntry) {
- var entry = this._keymap[key];
- if (entry === undefined) return;
- if (entry === this.tail) {
- return returnEntry
- ? entry
- : entry.value
- }
- // HEAD--------------TAIL
- // <.older .newer>
- // <--- add direction --
- // A B C
E
- if (entry.newer) {
- if (entry === this.head) {
- this.head = entry.newer
- }
- entry.newer.older = entry.older; // C <-- E.
- }
- if (entry.older) {
- entry.older.newer = entry.newer; // C. --> E
- }
- entry.newer = undefined; // D --x
- entry.older = this.tail; // D. --> E
- if (this.tail) {
- this.tail.newer = entry; // E. <-- D
- }
- this.tail = entry;
- return returnEntry
- ? entry
- : entry.value
- };
-
- p.has = function (key) {
- return this._keymap[key] != null;
- }
-})();;
-!(function () {
- var MD5 = function (hexcase) {
- this.hexcase = !hexcase ? 0 : 1;
- /* hex output format. 0 - lowercase; 1 - uppercase */
- this.b64pad = "";
- /* base-64 pad character. "=" for strict RFC compliance */
- this.chrsz = 8;
- /* bits per input character. 8 - ASCII; 16 - Unicode */
- };
-
- /*
- * These are the functions you'll usually want to call
- * They take string arguments and return either hex or base-64 encoded strings
- */
- MD5.prototype.hex_md5 = function (s) {
- return this.binl2hex(this.core_md5(this.str2binl(s), s.length * this.chrsz));
- };
-
- MD5.prototype.hex_md5_salt = function (s) {
- var md5ed = this.hex_md5(s);
-
- var items1 = [];
- var items2 = [];
- for (var i = 0; i < md5ed.length; i++) {
- if (i % 2 === 0) {
- items1.push(md5ed.charAt(i));
- } else {
- items2.push(md5ed.charAt(i));
- }
- }
- var result = ":" + items1.join("") + items2.join("");
- return result;
- };
-
- MD5.prototype.b64_md5 = function (s) {
- return this.binl2b64(this.core_md5(this.str2binl(s), s.length * this.chrsz));
- };
-
- MD5.prototype.hex_hmac_md5 = function (key, data) {
- return this.binl2hex(this.core_hmac_md5(key, data));
- };
-
- MD5.prototype.b64_hmac_md5 = function (key, data) {
- return this.binl2b64(this.core_hmac_md5(key, data));
- };
-
- /* Backwards compatibility - same as hex_md5() */
- MD5.prototype.calcMD5 = function (s) {
- return this.binl2hex(this.core_md5(this.str2binl(s), s.length * this.chrsz));
- };
-
- MD5.prototype.core_md5 = function (x, len) {
- /* append padding */
- x[len >> 5] |= 0x80 << ((len) % 32);
- x[(((len + 64) >>> 9) << 4) + 14] = len;
-
- var a = 1732584193;
- var b = -271733879;
- var c = -1732584194;
- var d = 271733878;
-
- for (var i = 0; i < x.length; i += 16) {
- var olda = a;
- var oldb = b;
- var oldc = c;
- var oldd = d;
-
- a = this.md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
- d = this.md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
- c = this.md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
- b = this.md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
- a = this.md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
- d = this.md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
- c = this.md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
- b = this.md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
- a = this.md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
- d = this.md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
- c = this.md5_ff(c, d, a, b, x[i + 10], 17, -42063);
- b = this.md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
- a = this.md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
- d = this.md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
- c = this.md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
- b = this.md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
-
- a = this.md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
- d = this.md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
- c = this.md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
- b = this.md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
- a = this.md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
- d = this.md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
- c = this.md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
- b = this.md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
- a = this.md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
- d = this.md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
- c = this.md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
- b = this.md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
- a = this.md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
- d = this.md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
- c = this.md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
- b = this.md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
-
- a = this.md5_hh(a, b, c, d, x[i + 5], 4, -378558);
- d = this.md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
- c = this.md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
- b = this.md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
- a = this.md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
- d = this.md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
- c = this.md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
- b = this.md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
- a = this.md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
- d = this.md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
- c = this.md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
- b = this.md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
- a = this.md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
- d = this.md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
- c = this.md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
- b = this.md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
-
- a = this.md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
- d = this.md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
- c = this.md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
- b = this.md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
- a = this.md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
- d = this.md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
- c = this.md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
- b = this.md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
- a = this.md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
- d = this.md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
- c = this.md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
- b = this.md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
- a = this.md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
- d = this.md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
- c = this.md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
- b = this.md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
-
- a = this.safe_add(a, olda);
- b = this.safe_add(b, oldb);
- c = this.safe_add(c, oldc);
- d = this.safe_add(d, oldd);
- }
- return Array(a, b, c, d);
-
- };
-
- /*
- * These functions implement the four basic operations the algorithm uses.
- */
- MD5.prototype.md5_cmn = function (q, a, b, x, s, t) {
- return this.safe_add(this.bit_rol(this.safe_add(this.safe_add(a, q), this.safe_add(x, t)), s), b);
- };
- MD5.prototype.md5_ff = function (a, b, c, d, x, s, t) {
- return this.md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
- };
- MD5.prototype.md5_gg = function (a, b, c, d, x, s, t) {
- return this.md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
- };
- MD5.prototype.md5_hh = function (a, b, c, d, x, s, t) {
- return this.md5_cmn(b ^ c ^ d, a, b, x, s, t);
- };
- MD5.prototype.md5_ii = function (a, b, c, d, x, s, t) {
- return this.md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
- };
-
- /*
- * Calculate the HMAC-MD5, of a key and some data
- */
- MD5.prototype.core_hmac_md5 = function (key, data) {
- var bkey = this.str2binl(key);
- if (bkey.length > 16)
- bkey = this.core_md5(bkey, key.length * this.chrsz);
-
- var ipad = Array(16), opad = Array(16);
- for (var i = 0; i < 16; i++) {
- ipad[i] = bkey[i] ^ 0x36363636;
- opad[i] = bkey[i] ^ 0x5C5C5C5C;
- }
-
- var hash = this.core_md5(ipad.concat(this.str2binl(data)), 512 + data.length * this.chrsz);
- return this.core_md5(opad.concat(hash), 512 + 128);
- };
-
- /*
- * Add integers, wrapping at 2^32. This uses 16-bit operations internally
- * to work around bugs in some JS interpreters.
- */
- MD5.prototype.safe_add = function (x, y) {
- var lsw = (x & 0xFFFF) + (y & 0xFFFF);
- var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
- return (msw << 16) | (lsw & 0xFFFF);
- };
-
- /*
- * Bitwise rotate a 32-bit number to the left.
- */
- MD5.prototype.bit_rol = function (num, cnt) {
- return (num << cnt) | (num >>> (32 - cnt));
- };
-
- /*
- * Convert a string to an array of little-endian words
- * If chrsz is ASCII, characters >255 have their hi-byte silently ignored.
- */
- MD5.prototype.str2binl = function (str) {
- var bin = Array();
- var mask = (1 << this.chrsz) - 1;
- for (var i = 0; i < str.length * this.chrsz; i += this.chrsz)
- bin[i >> 5] |= (str.charCodeAt(i / this.chrsz) & mask) << (i % 32);
- return bin;
- };
-
- /*
- * Convert an array of little-endian words to a hex string.
- */
- MD5.prototype.binl2hex = function (binarray) {
- var hex_tab = this.hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
- var str = "";
- for (var i = 0; i < binarray.length * 4; i++) {
- str += hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8 + 4)) & 0xF)
- + hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8)) & 0xF);
- }
- return str;
- };
-
- /*
- * Convert an array of little-endian words to a base-64 string
- */
- MD5.prototype.binl2b64 = function (binarray) {
- var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
- var str = "";
- for (var i = 0; i < binarray.length * 4; i += 3) {
- var triplet = (((binarray[i >> 2] >> 8 * (i % 4)) & 0xFF) << 16)
- | (((binarray[i + 1 >> 2] >> 8 * ((i + 1) % 4)) & 0xFF) << 8)
- | ((binarray[i + 2 >> 2] >> 8 * ((i + 2) % 4)) & 0xFF);
- for (var j = 0; j < 4; j++) {
- if (i * 8 + j * 6 > binarray.length * 32)
- str += this.b64pad;
- else
- str += tab.charAt((triplet >> 6 * (3 - j)) & 0x3F);
- }
- }
- return str;
- };
- BI.MD5 = new MD5();
-})();//线段树
-;(function () {
- var parent = function (node) {
- return Math.floor(node / 2);
- };
-
- var Int32Array = window.Int32Array || function (size) {
- var xs = [];
- for (var i = size - 1; i >= 0; --i) {
- xs[i] = 0;
- }
- return xs;
- };
-
- var ceilLog2 = function (x) {
- var y = 1;
- while (y < x) {
- y *= 2;
- }
- return y;
- };
-
- BI.PrefixIntervalTree = function (xs) {
- this._size = xs.length;
- this._half = ceilLog2(this._size);
- this._heap = new Int32Array(2 * this._half);
-
- var i;
- for (i = 0; i < this._size; ++i) {
- this._heap[this._half + i] = xs[i];
- }
-
- for (i = this._half - 1; i > 0; --i) {
- this._heap[i] = this._heap[2 * i] + this._heap[2 * i + 1];
- }
- };
-
- BI.PrefixIntervalTree.prototype = {
- constructor: BI.PrefixIntervalTree,
- set: function (index, value) {
- var node = this._half + index;
- this._heap[node] = value;
-
- node = parent(node);
- for (; node !== 0; node = parent(node)) {
- this._heap[node] =
- this._heap[2 * node] + this._heap[2 * node + 1];
- }
- },
-
- get: function (index) {
- var node = this._half + index;
- return this._heap[node];
- },
-
- getSize: function () {
- return this._size;
- },
-
- /**
- * get(0) + get(1) + ... + get(end - 1).
- */
- sumUntil: function (end) {
- if (end === 0) {
- return 0;
- }
-
- var node = this._half + end - 1;
- var sum = this._heap[node];
- for (; node !== 1; node = parent(node)) {
- if (node % 2 === 1) {
- sum += this._heap[node - 1];
- }
- }
-
- return sum;
- },
-
- /**
- * get(0) + get(1) + ... + get(inclusiveEnd).
- */
- sumTo: function (inclusiveEnd) {
- return this.sumUntil(inclusiveEnd + 1);
- },
-
- /**
- * sum get(begin) + get(begin + 1) + ... + get(end - 1).
- */
- sum: function (begin, end) {
- return this.sumUntil(end) - this.sumUntil(begin);
- },
-
- /**
- * Returns the smallest i such that 0 <= i <= size and sumUntil(i) <= t, or
- * -1 if no such i exists.
- */
- greatestLowerBound: function (t) {
- if (t < 0) {
- return -1;
- }
-
- var node = 1;
- if (this._heap[node] <= t) {
- return this._size;
- }
-
- while (node < this._half) {
- var leftSum = this._heap[2 * node];
- if (t < leftSum) {
- node = 2 * node;
- } else {
- node = 2 * node + 1;
- t -= leftSum;
- }
- }
-
- return node - this._half;
- },
-
- /**
- * Returns the smallest i such that 0 <= i <= size and sumUntil(i) < t, or
- * -1 if no such i exists.
- */
- greatestStrictLowerBound: function (t) {
- if (t <= 0) {
- return -1;
- }
-
- var node = 1;
- if (this._heap[node] < t) {
- return this._size;
- }
-
- while (node < this._half) {
- var leftSum = this._heap[2 * node];
- if (t <= leftSum) {
- node = 2 * node;
- } else {
- node = 2 * node + 1;
- t -= leftSum;
- }
- }
-
- return node - this._half;
- },
-
- /**
- * Returns the smallest i such that 0 <= i <= size and t <= sumUntil(i), or
- * size + 1 if no such i exists.
- */
- leastUpperBound: function (t) {
- return this.greatestStrictLowerBound(t) + 1;
- },
-
- /**
- * Returns the smallest i such that 0 <= i <= size and t < sumUntil(i), or
- * size + 1 if no such i exists.
- */
- leastStrictUpperBound: function (t) {
- return this.greatestLowerBound(t) + 1;
- }
- };
-
- BI.PrefixIntervalTree.uniform = function (size, initialValue) {
- var xs = [];
- for (var i = size - 1; i >= 0; --i) {
- xs[i] = initialValue;
- }
-
- return new BI.PrefixIntervalTree(xs);
- };
-
- BI.PrefixIntervalTree.empty = function (size) {
- return BI.PrefixIntervalTree.uniform(size, 0);
- };
-
-})();
-;
-!(function () {
- BI.Queue = function (capacity) {
- this.capacity = capacity;
- this.array = [];
- };
- BI.Queue.prototype = {
- constructor: BI.Queue,
-
- contains: function (v) {
- return this.array.contains(v);
- },
-
- indexOf: function (v) {
- return this.array.contains(v);
- },
-
- getElementByIndex: function(index) {
- return this.array[index];
- },
-
- push: function (v) {
- this.array.push(v);
- if (this.capacity && this.array.length > this.capacity) {
- this.array.shift();
- }
- },
-
- pop: function () {
- this.array.pop();
- },
-
- shift: function () {
- this.array.shift();
- },
-
- unshift: function (v) {
- this.array.unshift(v);
- if (this.capacity && this.array.length > this.capacity) {
- this.array.pop();
- }
- },
-
- remove: function (v) {
- this.array.remove(v);
- },
-
- splice: function() {
- this.array.splice.apply(this.array, arguments);
- },
-
- slice: function() {
- this.array.slice.apply(this.array, arguments);
- },
-
- size: function () {
- return this.array.length;
- },
-
- each: function (fn, scope) {
- var scope = scope || window;
- var fn = fn || null;
- if (fn == null || typeof (fn) != "function") {
- return;
- }
- for (var i = 0; i < this.array.length; i++) {
- var re = fn.call(scope, i, this.array[i], this.array);
- if (re == false) {
- break;
- }
- }
- },
-
- toArray: function () {
- return this.array;
- },
-
- fromArray: function (array) {
- var self = this;
- BI.each(array, function (i, v) {
- self.push(v);
- })
- },
-
- clear: function () {
- this.array.clear();
- }
- }
-})();!(function () {
- var Section = function (height, width, x, y) {
- this.height = height;
- this.width = width;
- this.x = x;
- this.y = y;
-
- this._indexMap = {};
- this._indices = [];
- };
-
- Section.prototype = {
- constructor: Section,
- addCellIndex: function (index) {
- if (!this._indexMap[index]) {
- this._indexMap[index] = true;
- this._indices.push(index);
- }
- },
-
- getCellIndices: function () {
- return this._indices
- }
- };
-
- var SECTION_SIZE = 100;
- BI.SectionManager = function (sectionSize) {
- this._sectionSize = sectionSize || SECTION_SIZE;
- this._cellMetadata = [];
- this._sections = {};
- };
-
- BI.SectionManager.prototype = {
- constructor: BI.SectionManager,
- getCellIndices: function (height, width, x, y) {
- var indices = {};
-
- BI.each(this.getSections(height, width, x, y), function (i, section) {
- BI.each(section.getCellIndices(), function (j, index) {
- indices[index] = index
- })
- });
-
- return BI.map(BI.keys(indices), function (i, index) {
- return indices[index]
- });
- },
-
- getCellMetadata: function (index) {
- return this._cellMetadata[index];
- },
-
- getSections: function (height, width, x, y) {
- var sectionXStart = Math.floor(x / this._sectionSize);
- var sectionXStop = Math.floor((x + width - 1) / this._sectionSize);
- var sectionYStart = Math.floor(y / this._sectionSize);
- var sectionYStop = Math.floor((y + height - 1) / this._sectionSize);
-
- var sections = [];
-
- for (var sectionX = sectionXStart; sectionX <= sectionXStop; sectionX++) {
- for (var sectionY = sectionYStart; sectionY <= sectionYStop; sectionY++) {
- var key = sectionX + "." + sectionY;
-
- if (!this._sections[key]) {
- this._sections[key] = new Section(this._sectionSize, this._sectionSize, sectionX * this._sectionSize, sectionY * this._sectionSize)
- }
-
- sections.push(this._sections[key])
- }
- }
-
- return sections
- },
-
- getTotalSectionCount: function () {
- return BI.size(this._sections);
- },
-
- registerCell: function (cellMetadatum, index) {
- this._cellMetadata[index] = cellMetadatum;
-
- BI.each(this.getSections(cellMetadatum.height, cellMetadatum.width, cellMetadatum.x, cellMetadatum.y), function (i, section) {
- section.addCellIndex(index);
- });
- }
- }
-})();;
-(function () {
- var clamp = function (value, min, max) {
- if (value < min) {
- return min;
- }
- if (value > max) {
- return max;
- }
- return value;
- };
- var MIN_BUFFER_ROWS = 6;
- var MAX_BUFFER_ROWS = 10;
-
- BI.TableRowBuffer = function (rowsCount,
- defaultRowHeight,
- viewportHeight,
- rowHeightGetter) {
- this._bufferSet = new BI.IntegerBufferSet();
- this._defaultRowHeight = defaultRowHeight;
- this._viewportRowsBegin = 0;
- this._viewportRowsEnd = 0;
- this._maxVisibleRowCount = Math.ceil(viewportHeight / defaultRowHeight) + 1;
- // this._bufferRowsCount = Math.floor(this._maxVisibleRowCount / 2);
- this._bufferRowsCount = clamp(
- Math.floor(this._maxVisibleRowCount / 2),
- MIN_BUFFER_ROWS,
- MAX_BUFFER_ROWS
- );
- this._rowsCount = rowsCount;
- this._rowHeightGetter = rowHeightGetter;
- this._rows = [];
- this._viewportHeight = viewportHeight;
-
- };
- BI.TableRowBuffer.prototype = {
- constructor: BI.TableRowBuffer,
-
- getRowsWithUpdatedBuffer: function () {
- var remainingBufferRows = 2 * this._bufferRowsCount;
- var bufferRowIndex =
- Math.max(this._viewportRowsBegin - this._bufferRowsCount, 0);
- while (bufferRowIndex < this._viewportRowsBegin) {
- this._addRowToBuffer(
- bufferRowIndex,
- this._viewportRowsBegin,
- this._viewportRowsEnd - 1
- );
- bufferRowIndex++;
- remainingBufferRows--;
- }
- bufferRowIndex = this._viewportRowsEnd;
- while (bufferRowIndex < this._rowsCount && remainingBufferRows > 0) {
- this._addRowToBuffer(
- bufferRowIndex,
- this._viewportRowsBegin,
- this._viewportRowsEnd - 1
- );
- bufferRowIndex++;
- remainingBufferRows--;
- }
- return this._rows;
- },
-
- getRows: function (firstRowIndex,
- firstRowOffset) {
- var top = firstRowOffset;
- var totalHeight = top;
- var rowIndex = firstRowIndex;
- var endIndex =
- Math.min(firstRowIndex + this._maxVisibleRowCount, this._rowsCount);
-
- this._viewportRowsBegin = firstRowIndex;
- while (rowIndex < endIndex ||
- (totalHeight < this._viewportHeight && rowIndex < this._rowsCount)) {
- this._addRowToBuffer(
- rowIndex,
- firstRowIndex,
- endIndex - 1
- );
- totalHeight += this._rowHeightGetter(rowIndex);
- ++rowIndex;
- // Store index after the last viewport row as end, to be able to
- // distinguish when there are no rows rendered in viewport
- this._viewportRowsEnd = rowIndex;
- }
-
- return this._rows;
- },
-
- _addRowToBuffer: function (rowIndex,
- firstViewportRowIndex,
- lastViewportRowIndex) {
- var rowPosition = this._bufferSet.getValuePosition(rowIndex);
- var viewportRowsCount = lastViewportRowIndex - firstViewportRowIndex + 1;
- var allowedRowsCount = viewportRowsCount + this._bufferRowsCount * 2;
- if (rowPosition === null &&
- this._bufferSet.getSize() >= allowedRowsCount) {
- rowPosition =
- this._bufferSet.replaceFurthestValuePosition(
- firstViewportRowIndex,
- lastViewportRowIndex,
- rowIndex
- );
- }
- if (rowPosition === null) {
- // We can't reuse any of existing positions for this row. We have to
- // create new position
- rowPosition = this._bufferSet.getNewPositionForValue(rowIndex);
- this._rows[rowPosition] = rowIndex;
- } else {
- // This row already is in the table with rowPosition position or it
- // can replace row that is in that position
- this._rows[rowPosition] = rowIndex;
- }
- }
- }
-
-})();
-;
-(function () {
- BI.Tree = function () {
- this.root = new BI.Node(BI.UUID());
- };
-
- BI.Tree.prototype = {
- constructor: BI.Tree,
- addNode: function (node, newNode, index) {
- if (BI.isNull(newNode)) {
- this.root.addChild(node, index);
- } else if (BI.isNull(node)) {
- this.root.addChild(newNode, index);
- } else {
- node.addChild(newNode, index);
- }
- },
-
- isRoot: function (node) {
- return node === this.root;
- },
-
- getRoot: function () {
- return this.root;
- },
-
- clear: function () {
- this.root.clear();
- },
-
- initTree: function (nodes) {
- var self = this;
- this.clear();
- var queue = [];
- BI.each(nodes, function (i, node) {
- var n = new BI.Node(node);
- n.set("data", node);
- self.addNode(n);
- queue.push(n);
- });
- while (!BI.isEmpty(queue)) {
- var parent = queue.shift();
- var node = parent.get("data");
- BI.each(node.children, function (i, child) {
- var n = new BI.Node(child);
- n.set("data", child);
- queue.push(n);
- self.addNode(parent, n);
- })
- }
- },
-
- _toJSON: function (node) {
- var self = this;
- var children = [];
- BI.each(node.getChildren(), function (i, child) {
- children.push(self._toJSON(child));
- });
- return BI.extend({
- id: node.id
- }, BI.deepClone(node.get("data")), (children.length > 0 ? {
- children: children
- } : {}));
- },
-
- toJSON: function (node) {
- var self = this, result = [];
- BI.each((node || this.root).getChildren(), function (i, child) {
- result.push(self._toJSON(child));
- });
- return result;
- },
-
- _toJSONWithNode: function (node) {
- var self = this;
- var children = [];
- BI.each(node.getChildren(), function (i, child) {
- children.push(self._toJSONWithNode(child));
- });
- return BI.extend({
- id: node.id
- }, BI.deepClone(node.get("data")), {
- node: node
- }, (children.length > 0 ? {
- children: children
- } : {}));
- },
-
- toJSONWithNode: function (node) {
- var self = this, result = [];
- BI.each((node || this.root).getChildren(), function (i, child) {
- result.push(self._toJSONWithNode(child));
- });
- return result;
- },
-
- search: function (root, target, param) {
- if (!(root instanceof BI.Node)) {
- return arguments.callee.apply(this, [this.root, root, target]);
- }
- var self = this, next = null;
-
- if (BI.isNull(target)) {
- return null;
- }
- if (BI.isEqual(root[param || "id"], target)) {
- return root;
- }
- BI.any(root.getChildren(), function (i, child) {
- next = self.search(child, target, param);
- if (null !== next) {
- return true;
- }
- });
- return next;
- },
-
- _traverse: function (node, callback) {
- var queue = [];
- queue.push(node);
- while (!BI.isEmpty(queue)) {
- var temp = queue.shift();
- var b = callback && callback(temp);
- if (b === false) {
- break;
- }
- if (b === true) {
- continue;
- }
- if (temp != null) {
- queue = queue.concat(temp.getChildren());
- }
- }
- },
-
- traverse: function (callback) {
- this._traverse(this.root, callback);
- },
-
- _recursion: function (node, route, callback) {
- var self = this;
- return BI.every(node.getChildren(), function (i, child) {
- var next = BI.clone(route);
- next.push(child.id);
- var b = callback && callback(child, next);
- if (b === false) {
- return false;
- }
- if (b === true) {
- return true;
- }
- return self._recursion(child, next, callback);
- });
- },
-
- recursion: function (callback) {
- this._recursion(this.root, [], callback);
- },
-
- inOrderTraverse: function (callback) {
- this._inOrderTraverse(this.root, callback);
- },
-
- //中序遍历(递归)
- _inOrderTraverse: function (node, callback) {
- if (node != null) {
- this._inOrderTraverse(node.getLeft());
- callback && callback(node);
- this._inOrderTraverse(node.getRight());
- }
- },
-
- //中序遍历(非递归)
- nrInOrderTraverse: function (callback) {
-
- var stack = [];
- var node = this.root;
- while (node != null || !BI.isEmpty(stack)) {
- while (node != null) {
- stack.push(node);
- node = node.getLeft();
- }
- node = stack.pop();
- callback && callback(node);
- node = node.getRight();
- }
- },
-
- preOrderTraverse: function (callback) {
- this._preOrderTraverse(this.root, callback);
- },
-
- //先序遍历(递归)
- _preOrderTraverse: function (node, callback) {
- if (node != null) {
- callback && callback(node);
- this._preOrderTraverse(node.getLeft());
- this._preOrderTraverse(node.getRight());
- }
- },
-
- //先序遍历(非递归)
- nrPreOrderTraverse: function (callback) {
-
- var stack = [];
- var node = this.root;
-
- while (node != null || !BI.isEmpty(stack)) {
-
- while (node != null) {
- callback && callback(node);
- stack.push(node);
- node = node.getLeft();
- }
- node = stack.pop();
- node = node.getRight();
- }
- },
-
- postOrderTraverse: function (callback) {
- this._postOrderTraverse(this.root, callback);
- },
-
- //后序遍历(递归)
- _postOrderTraverse: function (node, callback) {
- if (node != null) {
- this._postOrderTraverse(node.getLeft());
- this._postOrderTraverse(node.getRight());
- callback && callback(node);
- }
- },
-
- //后续遍历(非递归)
- nrPostOrderTraverse: function (callback) {
-
- var stack = [];
- var node = this.root;
- var preNode = null;//表示最近一次访问的节点
-
- while (node != null || !BI.isEmpty(stack)) {
-
- while (node != null) {
- stack.push(node);
- node = node.getLeft();
- }
-
- node = BI.last(stack);
-
- if (node.getRight() == null || node.getRight() == preNode) {
- callback && callback(node);
- node = stack.pop();
- preNode = node;
- node = null;
- } else {
- node = node.getRight();
- }
- }
- }
- };
-
- BI.Node = function (id) {
- if (BI.isObject(id)) {
- BI.extend(this, id);
- } else {
- this.id = id;
- }
- this.clear.apply(this, arguments);
- };
-
- BI.Node.prototype = {
- constructor: BI.Node,
-
- set: function (key, value) {
- if (BI.isObject(key)) {
- BI.extend(this, key);
- return;
- }
- this[key] = value;
- },
-
- get: function (key) {
- return this[key];
- },
-
- isLeaf: function () {
- return BI.isEmpty(this.children);
- },
-
- getChildren: function () {
- return this.children;
- },
-
- getChildrenLength: function () {
- return this.children.length;
- },
-
- getFirstChild: function () {
- return BI.first(this.children);
- },
-
- getLastChild: function () {
- return BI.last(this.children);
- },
-
- setLeft: function (left) {
- this.left = left;
- },
-
- getLeft: function () {
- return this.left;
- },
-
- setRight: function (right) {
- this.right = right;
- },
-
- getRight: function () {
- return this.right;
- },
-
- setParent: function (parent) {
- this.parent = parent;
- },
-
- getParent: function () {
- return this.parent;
- },
-
- getChild: function (index) {
- return this.children[index];
- },
-
- getChildIndex: function (id) {
- return BI.findIndex(this.children, function (i, ch) {
- return ch.get("id") === id;
- });
- },
-
- removeChild: function (id) {
- this.removeChildByIndex(this.getChildIndex(id));
- },
-
- removeChildByIndex: function (index) {
- var before = this.getChild(index - 1);
- var behind = this.getChild(index + 1);
- if (before != null) {
- before.setRight(behind || null);
- }
- if (behind != null) {
- behind.setLeft(before || null);
- }
- this.children.splice(index, 1);
- },
-
- removeAllChilds: function () {
- this.children = [];
- },
-
- addChild: function (child, index) {
- var cur = null;
- if (BI.isUndefined(index)) {
- cur = this.children.length - 1;
- } else {
- cur = index - 1;
- }
- child.setParent(this);
- if (cur >= 0) {
- this.getChild(cur) && this.getChild(cur).setRight(child);
- child.setLeft(this.getChild(cur));
- }
- if (BI.isUndefined(index)) {
- this.children.push(child);
- } else {
- this.children.splice(index, 0, child);
- }
- },
-
- equals: function (obj) {
- return this === obj || this.id === obj.id;
- },
-
- clear: function () {
- this.parent = null;
- this.left = null;
- this.right = null;
- this.children = [];
- }
- };
-
- BI.extend(BI.Tree, {
- transformToArrayFormat: function (nodes, pId) {
- if (!nodes) return [];
- var r = [];
- if (BI.isArray(nodes)) {
- for (var i = 0, l = nodes.length; i < l; i++) {
- var node = BI.clone(nodes[i]);
- node.pId = node.pId == null ? pId : node.pId;
- delete node.children;
- r.push(node);
- if (nodes[i]["children"]) {
- r = r.concat(BI.Tree.transformToArrayFormat(nodes[i]["children"], node.id));
- }
- }
- } else {
- var newNodes = BI.clone(nodes);
- newNodes.pId = newNodes.pId == null ? pId : newNodes.pId;
- delete newNodes.children;
- r.push(newNodes);
- if (nodes["children"]) {
- r = r.concat(BI.Tree.transformToArrayFormat(nodes["children"], newNodes.id));
- }
- }
- return r;
- },
-
- arrayFormat: function (nodes, pId) {
- if (!nodes) {
- return [];
- }
- var r = [];
- if (BI.isArray(nodes)) {
- for (var i = 0, l = nodes.length; i < l; i++) {
- var node = nodes[i];
- node.pId = node.pId == null ? pId : node.pId;
- r.push(node);
- if (nodes[i]["children"]) {
- r = r.concat(BI.Tree.arrayFormat(nodes[i]["children"], node.id));
- }
- }
- } else {
- var newNodes = nodes;
- newNodes.pId = newNodes.pId == null ? pId : newNodes.pId;
- r.push(newNodes);
- if (nodes["children"]) {
- r = r.concat(BI.Tree.arrayFormat(nodes["children"], newNodes.id));
- }
- }
- return r;
- },
-
- transformToTreeFormat: function (sNodes) {
- var i, l;
- if (!sNodes) {
- return [];
- }
-
- if (BI.isArray(sNodes)) {
- var r = [];
- var tmpMap = [];
- for (i = 0, l = sNodes.length; i < l; i++) {
- if (BI.isNull(sNodes[i].id)) {
- return sNodes;
- }
- tmpMap[sNodes[i].id] = BI.clone(sNodes[i]);
- }
- for (i = 0, l = sNodes.length; i < l; i++) {
- if (tmpMap[sNodes[i].pId] && sNodes[i].id !== sNodes[i].pId) {
- if (!tmpMap[sNodes[i].pId].children) {
- tmpMap[sNodes[i].pId].children = [];
- }
- tmpMap[sNodes[i].pId].children.push(tmpMap[sNodes[i].id]);
- } else {
- r.push(tmpMap[sNodes[i].id]);
- }
- delete tmpMap[sNodes[i].id].pId;
- }
- return r;
- } else {
- return [sNodes];
- }
- },
-
- treeFormat: function (sNodes) {
- var i, l;
- if (!sNodes) {
- return [];
- }
-
- if (BI.isArray(sNodes)) {
- var r = [];
- var tmpMap = [];
- for (i = 0, l = sNodes.length; i < l; i++) {
- if (BI.isNull(sNodes[i].id)) {
- return sNodes;
- }
- tmpMap[sNodes[i].id] = sNodes[i];
- }
- for (i = 0, l = sNodes.length; i < l; i++) {
- if (tmpMap[sNodes[i].pId] && sNodes[i].id !== sNodes[i].pId) {
- if (!tmpMap[sNodes[i].pId].children) {
- tmpMap[sNodes[i].pId].children = [];
- }
- tmpMap[sNodes[i].pId].children.push(tmpMap[sNodes[i].id]);
- } else {
- r.push(tmpMap[sNodes[i].id]);
- }
- }
- return r;
- } else {
- return [sNodes];
- }
- },
-
- traversal: function (array, callback) {
- if (BI.isNull(array)) {
- return;
- }
- var self = this;
- BI.any(array, function (i, item) {
- if (callback(i, item) === false) {
- return true;
- }
- self.traversal(item.children, callback);
- })
- }
- })
-})();//向量操作
-BI.Vector = function (x, y) {
- this.x = x;
- this.y = y;
-};
-BI.Vector.prototype = {
- constructor: BI.Vector,
- cross: function (v) {
- return (this.x * v.y - this.y * v.x);
- },
- length: function (v) {
- return (Math.sqrt(this.x * v.x + this.y * v.y));
- }
-};
-BI.Region = function (x, y, w, h) {
- this.x = x;
- this.y = y;
- this.w = w;
- this.h = h;
-};
-BI.Region.prototype = {
- constructor: BI.Region,
- //判断两个区域是否相交,若相交,则要么顶点互相包含,要么矩形边界(或对角线)相交
- isIntersects: function (obj) {
- if (this.isPointInside(obj.x, obj.y) ||
- this.isPointInside(obj.x + obj.w, obj.y) ||
- this.isPointInside(obj.x, obj.y + obj.h) ||
- this.isPointInside(obj.x + obj.w, obj.y + obj.h)) {
- return true;
- } else if (obj.isPointInside(this.x, this.y) ||
- obj.isPointInside(this.x + this.w, this.y) ||
- obj.isPointInside(this.x, this.y + this.h) ||
- obj.isPointInside(this.x + this.w, this.y + this.h)) {
- return true;
- } else if (obj.x != null && obj.y != null)//判断矩形对角线相交 |v1 X v2||v1 X v3| < 0
- {
- var vector1 = new BI.Vector(this.w, this.h);//矩形对角线向量
- var vector2 = new BI.Vector(obj.x - this.x, obj.y - this.y);
- var vector3 = new BI.Vector(vector2.x + obj.w, vector2.y + obj.h);
- if ((vector1.cross(vector2) * vector1.cross(vector3)) < 0) {
- return true;
- }
- }
- return false;
- },
- //判断一个点是否在这个区域内部
- isPointInside: function (x, y) {
- if (this.x == null || this.y == null) {
- return false;
- }
- if (x >= this.x && x <= this.x + this.w && y >= this.y && y <= this.y + this.h) {
- return true;
- }
- return false;
- },
- //返回区域的重心,因为是矩形所以返回中点
- getPosition: function () {
- var pos = [];
- pos.push(this.x + this.w / 2);
- pos.push(this.y + this.h / 2);
- return pos;
- }
-};// ;
-// !(function (BI) {
-//
-// if (BI.isIE()) {
-// XMLSerializer = null;
-// DOMParser = null;
-// }
-//
-//
-// var XML = {
-// Document: {
-// NodeType: {
-// ELEMENT: 1,
-// ATTRIBUTE: 2,
-// TEXT: 3,
-// CDATA_SECTION: 4,
-// ENTITY_REFERENCE: 5,
-// ENTITY: 6,
-// PROCESSING_INSTRUCTION: 7,
-// COMMENT: 8,
-// DOCUMENT: 9,
-// DOCUMENT_TYPE: 10,
-// DOCUMENT_FRAGMENT: 11,
-// NOTATION: 12
-// }
-// }
-// };
-//
-// XML.ResultType = {
-// single: 'single',
-// array: 'array'
-// };
-//
-// XML.fromString = function (xmlStr) {
-// try {
-// var parser = new DOMParser();
-// return parser.parseFromString(xmlStr, "text/xml");
-// } catch (e) {
-// var arrMSXML = ["MSXML2.DOMDocument.6.0", "MSXML2.DOMDocument.3.0"];
-// for (var i = 0; i < arrMSXML.length; i++) {
-// try {
-// var xmlDoc = new ActiveXObject(arrMSXML[i]);
-// xmlDoc.setProperty("SelectionLanguage", "XPath");
-// xmlDoc.async = false;
-// xmlDoc.loadXML(xmlStr);
-// return xmlDoc;
-// } catch (xmlError) {
-// }
-// }
-// }
-// };
-//
-// XML.toString = function (xmlNode) {
-// if (!BI.isIE()) {
-// var xmlSerializer = new XMLSerializer();
-// return xmlSerializer.serializeToString(xmlNode);
-// } else
-// return xmlNode.xml;
-// };
-//
-// XML.getNSResolver = function (str) {
-// if (!str) {
-// return null;
-// }
-// var list = str.split(' ');
-// var namespaces = {};
-// for (var i = 0; i < list.length; i++) {
-// var pair = list[i].split('=');
-// var fix = BI.trim(pair[0]).replace("xmlns:", "");
-// namespaces[fix] = BI.trim(pair[1]).replace(/"/g, "").replace(/'/g, "");
-// }
-// return function (prefix) {
-// return namespaces[prefix];
-// };
-// };
-//
-// XML.eval = function (context, xpathExp, resultType, namespaces) {
-// if ((BI.isIE() && ('undefined' === typeof(context.selectSingleNode) || 'undefined' === typeof(context.selectNodes)))) {
-// return XML.eval2(context, xpathExp, resultType, namespaces);
-// } else {
-// if (BI.isIE()) {
-// namespaces = namespaces ? namespaces : "";
-// var doc = (context.nodeType == XML.Document.NodeType.DOCUMENT) ? context : context.ownerDocument;
-// doc.setProperty("SelectionNamespaces", namespaces);
-// var result;
-// if (resultType == this.ResultType.single) {
-// result = context.selectSingleNode(xpathExp);
-// } else {
-// result = context.selectNodes(xpathExp) || [];
-// }
-// doc.setProperty("SelectionNamespaces", "");
-// return result;
-// } else {
-// var node = context;
-// var xmlDoc = (context.nodeName.indexOf("document") == -1) ? context.ownerDocument : context;
-// var retType = (resultType == this.ResultType.single) ? XPathResult.FIRST_ORDERED_NODE_TYPE : XPathResult.ANY_TYPE;
-// var col = xmlDoc.evaluate(xpathExp, node, XML.getNSResolver(namespaces), retType, null);
-//
-// if (retType == XPathResult.FIRST_ORDERED_NODE_TYPE) {
-// return col.singleNodeValue;
-// } else {
-// var thisColMemb = col.iterateNext();
-// var rowsCol = [];
-// while (thisColMemb) {
-// rowsCol[rowsCol.length] = thisColMemb;
-// thisColMemb = col.iterateNext();
-// }
-// return rowsCol;
-// }
-// }
-// }
-// };
-//
-// XML.eval2 = function (context, xpathExp, resultType, namespaces) {
-// if (resultType !== "single" && resultType !== undefined && resultType !== null) {
-// throw new Error("justep.SimpleXML.eval only be resultType='single', not" + resultType);
-// }
-//
-// if (context === null || context === undefined || xpathExp === null || xpathExp === undefined) {
-// return context;
-// }
-//
-// if (context.nodeType == XML.Document.NodeType.DOCUMENT) {
-// context = context.documentElement;
-// }
-//
-// var childs, i;
-// if (xpathExp.indexOf("/") != -1) {
-// var items = xpathExp.split("/");
-// var isAbs = xpathExp.substring(0, 1) == "/";
-// for (i = 0; i < items.length; i++) {
-// var item = items[i];
-// if (item === "") {
-// continue;
-// } else {
-// var next = null;
-// var ii = i + 1;
-// for (; ii < items.length; ii++) {
-// if (next === null) {
-// next = items[ii];
-// } else {
-// next = next + "/" + items[ii];
-// }
-// }
-//
-// if (item == ".") {
-// return this.eval(context, next, resultType);
-//
-// } else if (item == "..") {
-// return this.eval2(context.parentNode, next, resultType);
-//
-// } else if (item == "*") {
-// if (isAbs) {
-// return this.eval2(context, next, resultType);
-//
-// } else {
-// childs = context.childNodes;
-// for (var j = 0; j < childs.length; j++) {
-// var tmp = this.eval2(childs[j], next, resultType);
-// if (tmp !== null) {
-// return tmp;
-// }
-// }
-// return null;
-// }
-//
-// } else {
-// if (isAbs) {
-// if (context.nodeName == item) {
-// return this.eval2(context, next, resultType);
-// } else {
-// return null;
-// }
-// } else {
-// var child = this.getChildByName(context, item);
-// if (child !== null) {
-// return this.eval2(child, next, resultType);
-// } else {
-// return null;
-// }
-//
-// }
-// }
-//
-// }
-// }
-//
-// return null;
-//
-// } else {
-// if ("text()" == xpathExp) {
-// childs = context.childNodes;
-// for (i = 0; i < childs.length; i++) {
-// if (childs[i].nodeType == XML.Document.NodeType.TEXT) {
-// return childs[i];
-// }
-// }
-// return null;
-// } else {
-// return this.getChildByName(context, xpathExp);
-// }
-// }
-// };
-//
-// XML.getChildByName = function (context, name) {
-// if (context === null || context === undefined || name === null || name === undefined) {
-// return null;
-// }
-//
-// if (context.nodeType == XML.Document.NodeType.DOCUMENT) {
-// context = context.documentElement;
-// }
-//
-// var childs = context.childNodes;
-// for (var i = 0; i < childs.length; i++) {
-// if (childs[i].nodeType == XML.Document.NodeType.ELEMENT && (childs[i].nodeName == name || name == "*")) {
-// return childs[i];
-// }
-// }
-//
-// return null;
-// };
-//
-// XML.appendChildren = function (context, xpathExp, nodes, isBefore) {
-// nodes = (typeof nodes.length != "undefined") ? nodes : [nodes];
-// var finded = this.eval(context, xpathExp);
-// var count = finded.length;
-// for (var i = 0; i < count; i++) {
-// if (isBefore && finded[i].firstNode) {
-// this._insertBefore(finded[i], nodes, finded[i].firstNode);
-// } else {
-// for (var j = 0; j < nodes.length; j++) {
-// finded[i].appendChild(nodes[j]);
-// }
-// }
-// }
-// return count;
-// };
-//
-// XML.removeNodes = function (context, xpathExp) {
-// var nodes = this.eval(context, xpathExp);
-// for (var i = 0; i < nodes.length; i++) {
-// nodes[i].parentNode.removeChild(nodes[i]);
-// }
-// };
-//
-// XML._insertBefore = function (parent, newchildren, refchild) {
-// for (var i = 0; i < newchildren.length; i++) {
-// parent.insertBefore(newchildren[i], refchild);
-// }
-// };
-//
-// XML.insertNodes = function (context, xpathExp, nodes, isBefore) {
-// nodes = (typeof nodes.length != "undefined") ? nodes : [nodes];
-// var finded = this.eval(context, xpathExp);
-// var count = finded.length;
-// for (var i = 0; i < count; i++) {
-// var refnode = (isBefore) ? finded[i] : finded[i].nextSibling;
-// this._insertBefore(finded[i].parentNode, nodes, refnode);
-// }
-// return count;
-// };
-//
-// XML.replaceNodes = function (context, xpathExp, nodes) {
-// nodes = (typeof nodes.length != "undefined") ? nodes : [nodes];
-// var finded = this.eval(context, xpathExp);
-// var count = finded.length;
-// for (var i = 0; i < count; i++) {
-// var refnode = finded[i];
-// var parent = refnode.parentNode;
-// this._insertBefore(parent, nodes, refnode);
-// parent.removeChild(refnode);
-// }
-// return count;
-// };
-//
-// XML.setNodeText = function (context, xpathExp, text) {
-// var finded = this.eval(context, xpathExp, this.ResultType.single);
-// if (finded === null) {
-// return;
-// }
-// if (finded.nodeType == XML.Document.NodeType.ELEMENT) {
-// var textNode = this.eval(finded, "./text()", this.ResultType.single);
-// if (!textNode) {
-// textNode = finded.ownerDocument.createTextNode("");
-// finded.appendChild(textNode);
-// }
-// textNode.nodeValue = text;
-// } else {
-// finded.nodeValue = text;
-// }
-// return;
-// };
-//
-// XML.getNodeText = function (context, xpathExp, defaultValue) {
-// var finded = xpathExp ? this.eval(context, xpathExp, this.ResultType.single) : context;
-// if (finded && (finded.nodeType == XML.Document.NodeType.ELEMENT)) {
-// finded = this.eval(finded, "./text()", this.ResultType.single);
-// }
-// return (finded && finded.nodeValue) ? "" + finded.nodeValue : (defaultValue !== undefined) ? defaultValue : null;
-// };
-//
-// XML.Namespaces = {
-// XMLSCHEMA: "http://www.w3.org/2001/XMLSchema#",
-// XMLSCHEMA_STRING: "http://www.w3.org/2001/XMLSchema#String",
-// XMLSCHEMA_LONG: "http://www.w3.org/2001/XMLSchema#Long",
-// XMLSCHEMA_INTEGER: 'http://www.w3.org/2001/XMLSchema#Integer',
-// XMLSCHEMA_FLOAT: 'http://www.w3.org/2001/XMLSchema#Float',
-// XMLSCHEMA_DOUBLE: 'http://www.w3.org/2001/XMLSchema#Double',
-// XMLSCHEMA_DECIMAL: 'http://www.w3.org/2001/XMLSchema#Decimal',
-// XMLSCHEMA_DATE: 'http://www.w3.org/2001/XMLSchema#Date',
-// XMLSCHEMA_TIME: 'http://www.w3.org/2001/XMLSchema#Time',
-// XMLSCHEMA_DATETIME: 'http://www.w3.org/2001/XMLSchema#DateTime',
-// XMLSCHEMA_BOOLEAN: 'http://www.w3.org/2001/XMLSchema#Boolean',
-// XMLSCHEMA_SYMBOL: 'http://www.w3.org/2001/XMLSchema#Symbol',
-// JUSTEPSCHEMA: "http://www.justep.com/xbiz#",
-// RDF: "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
-// JUSTEP: "http://www.justep.com/x5#",
-// 'get': function (type) {
-// type = type ? type.toLowerCase() : "string";
-// if ("string" == type) {
-// return XML.Namespaces.XMLSCHEMA_STRING;
-// }
-// else if ("integer" == type) {
-// return XML.Namespaces.XMLSCHEMA_INTEGER;
-// }
-// else if ("long" == type) {
-// return XML.Namespaces.XMLSCHEMA_LONG;
-// }
-// else if ("float" == type) {
-// return XML.Namespaces.XMLSCHEMA_FLOAT;
-// }
-// else if ("double" == type) {
-// return XML.Namespaces.XMLSCHEMA_DOUBLE;
-// }
-// else if ("decimal" == type) {
-// return XML.Namespaces.XMLSCHEMA_DECIMAL;
-// }
-// else if ("date" == type) {
-// return XML.Namespaces.XMLSCHEMA_DATE;
-// }
-// else if ("time" == type) {
-// return XML.Namespaces.XMLSCHEMA_TIME;
-// }
-// else if ("datetime" == type) {
-// return XML.Namespaces.XMLSCHEMA_DATETIME;
-// }
-// else if ("boolean" == type) {
-// return XML.Namespaces.XMLSCHEMA_BOOLEAN;
-// }
-// }
-// };
-// })(BI);
-BI.BehaviorFactory = {
- createBehavior: function(key, options){
- var behavior;
- switch (key){
- case "highlight":
- behavior = BI.HighlightBehavior;
- break;
- case "redmark":
- behavior = BI.RedMarkBehavior;
- break;
- }
- return new behavior(options);
- }
-}
-
-/**
- * guy
- * 行为控件
- * @class BI.Behavior
- * @extends BI.OB
- */
-BI.Behavior = BI.inherit(BI.OB, {
- _defaultConfig: function() {
- return BI.extend(BI.Behavior.superclass._defaultConfig.apply(this, arguments), {
- rule: function(){return true;}
- });
- },
-
- _init : function() {
- BI.Behavior.superclass._init.apply(this, arguments);
-
- },
-
- doBehavior: function(){
-
- }
-});/**
- * 布局容器类
- * @class BI.Layout
- * @extends BI.Widget
- *
- * @cfg {JSON} options 配置属性
- * @cfg {Boolean} [options.scrollable=false] 子组件超出容器边界之后是否会出现滚动条
- * @cfg {Boolean} [options.scrollx=false] 子组件超出容器边界之后是否会出现横向滚动条
- * @cfg {Boolean} [options.scrolly=false] 子组件超出容器边界之后是否会出现纵向滚动条
- */
-BI.Layout = BI.inherit(BI.Widget, {
- props: function () {
- return {
- scrollable: null, //true, false, null
- scrollx: false, //true, false
- scrolly: false, //true, false
- items: []
- };
- },
-
- render: function () {
- this._init4Margin();
- this._init4Scroll();
- },
-
- _init4Margin: function () {
- if (this.options.top) {
- this.element.css('top', this.options.top);
- }
- if (this.options.left) {
- this.element.css('left', this.options.left);
- }
- if (this.options.bottom) {
- this.element.css('bottom', this.options.bottom);
- }
- if (this.options.right) {
- this.element.css('right', this.options.right);
- }
- },
-
- _init4Scroll: function () {
- switch (this.options.scrollable) {
- case true:
- this.element.css("overflow", "auto");
- break;
- case false:
- this.element.css("overflow", "hidden");
- break;
- default :
- break;
- }
- if (this.options.scrollx) {
- this.element.css({
- "overflow-x": "auto",
- "overflow-y": "hidden"
- });
- }
- if (this.options.scrolly) {
- this.element.css({
- "overflow-x": "hidden",
- "overflow-y": "auto"
- });
- }
- },
-
- _mountChildren: function () {
- var self = this;
- var frag = document.createDocumentFragment();
- var hasChild = false;
- BI.each(this._children, function (i, widget) {
- if (widget.element !== self.element) {
- frag.appendChild(widget.element[0]);
- hasChild = true;
- }
- });
- if (hasChild === true) {
- this.element.append(frag);
- }
- },
-
- _getChildName: function (index) {
- return index + "";
- },
-
- _addElement: function (i, item) {
- var self = this, w;
- if (!this.hasWidget(this._getChildName(i))) {
- w = BI.createWidget(item);
- w.on(BI.Events.DESTROY, function () {
- BI.each(self._children, function (name, child) {
- if (child === w) {
- BI.remove(self._children, child);
- self.removeItemAt(name | 0);
- }
- });
- });
- this.addWidget(this._getChildName(i), w);
- } else {
- w = this.getWidgetByName(this._getChildName(i));
- }
- return w;
- },
-
- _getOptions: function (item) {
- if (item instanceof BI.Widget) {
- item = item.options;
- }
- item = BI.stripEL(item);
- if (item instanceof BI.Widget) {
- item = item.options;
- }
- return item;
- },
-
- _compare: function (item1, item2) {
- var self = this;
- return eq(item1, item2);
-
- //不比较函数
- function eq(a, b, aStack, bStack) {
- if (a === b) {
- return a !== 0 || 1 / a === 1 / b;
- }
- if (a == null || b == null) {
- return a === b;
- }
- var className = Object.prototype.toString.call(a);
- switch (className) {
- case '[object RegExp]':
- case '[object String]':
- return '' + a === '' + b;
- case '[object Number]':
- if (+a !== +a) {
- return +b !== +b;
- }
- return +a === 0 ? 1 / +a === 1 / b : +a === +b;
- case '[object Date]':
- case '[object Boolean]':
- return +a === +b;
- }
-
- var areArrays = className === '[object Array]';
- if (!areArrays) {
- if (BI.isFunction(a) && BI.isFunction(b)) {
- return true;
- }
- a = self._getOptions(a);
- b = self._getOptions(b);
- }
-
- aStack = aStack || [];
- bStack = bStack || [];
- var length = aStack.length;
- while (length--) {
- if (aStack[length] === a) {
- return bStack[length] === b;
- }
- }
-
- aStack.push(a);
- bStack.push(b);
-
- if (areArrays) {
- length = a.length;
- if (length !== b.length) {
- return false;
- }
- while (length--) {
- if (!eq(a[length], b[length], aStack, bStack)) {
- return false;
- }
- }
- } else {
- var keys = _.keys(a), key;
- length = keys.length;
- if (_.keys(b).length !== length) {
- return false;
- }
- while (length--) {
- key = keys[length];
- if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) {
- return false;
- }
- }
- }
- aStack.pop();
- bStack.pop();
- return true;
- }
- },
-
- _getWrapper: function () {
- return this.element;
- },
-
- _addItemAt: function (index, item) {
- for (var i = this.options.items.length; i > index; i--) {
- this._children[this._getChildName(i)] = this._children[this._getChildName(i - 1)];
- }
- delete this._children[this._getChildName(index)];
- this.options.items.splice(index, 0, item);
- },
-
- _removeItemAt: function (index) {
- for (var i = index; i < this.options.items.length - 1; i++) {
- this._children[this._getChildName(i)] = this._children[this._getChildName(i + 1)];
- }
- delete this._children[this._getChildName(this.options.items.length - 1)];
- this.options.items.splice(index, 1);
- },
-
- /**
- * 添加一个子组件到容器中
- * @param {JSON/BI.Widget} item 子组件
- */
- addItem: function (item) {
- return this.addItemAt(this.options.items.length, item);
- },
-
- prependItem: function (item) {
- return this.addItemAt(0, item);
- },
-
- addItemAt: function (index, item) {
- if (index < 0 || index > this.options.items.length) {
- return;
- }
- this._addItemAt(index, item);
- var w = this._addElement(index, item);
- if (index > 0) {
- this._children[this._getChildName(index - 1)].element.after(w.element);
- } else {
- w.element.prependTo(this._getWrapper());
- }
- w._mount();
- return w;
- },
-
- removeItemAt: function (indexes) {
- indexes = BI.isArray(indexes) ? indexes : [indexes];
- var deleted = [];
- var newItems = [], newChildren = {};
- for (var i = 0, len = this.options.items.length; i < len; i++) {
- var child = this._children[this._getChildName(i)];
- if (indexes.contains(i)) {
- child && deleted.push(child);
- } else {
- newChildren[this._getChildName(newItems.length)] = child;
- newItems.push(this.options.items[i]);
- }
- }
- this.options.items = newItems;
- this._children = newChildren;
- BI.each(deleted, function (i, c) {
- c._destroy();
- });
- },
-
- shouldUpdateItem: function (index, item) {
- if (index < 0 || index > this.options.items.length - 1) {
- return false;
- }
- var child = this._children[this._getChildName(index)];
- if (!child.shouldUpdate) {
- return null;
- }
- return child.shouldUpdate(this._getOptions(item)) === true;
- },
-
- updateItemAt: function (index, item) {
- if (index < 0 || index > this.options.items.length - 1) {
- return;
- }
-
- var child = this._children[this._getChildName(index)];
- var updated;
- if (updated = child.update(this._getOptions(item))) {
- return updated;
- }
- var del = this._children[this._getChildName(index)];
- delete this._children[this._getChildName(index)];
- this.options.items.splice(index, 1);
- var w = this._addElement(index, item);
- this.options.items.splice(index, 0, item);
- this._children[this._getChildName(index)] = w;
- if (index > 0) {
- this._children[this._getChildName(index - 1)].element.after(w.element);
- } else {
- w.element.prependTo(this._getWrapper());
- }
- del._destroy();
- w._mount();
- },
-
- addItems: function (items) {
- var self = this, o = this.options;
- var fragment = document.createDocumentFragment();
- var added = [];
- BI.each(items, function (i, item) {
- var w = self._addElement(o.items.length, item);
- self._children[self._getChildName(o.items.length)] = w;
- o.items.push(item);
- added.push(w);
- fragment.appendChild(w.element[0]);
- });
- this._getWrapper().append(fragment);
- BI.each(added, function (i, w) {
- w._mount();
- })
- },
-
- prependItems: function (items) {
- var self = this;
- items = items || [];
- var fragment = document.createDocumentFragment();
- var added = [];
- for (var i = items.length - 1; i >= 0; i--) {
- this._addItemAt(0, items[i]);
- var w = this._addElement(0, items[i]);
- self._children[self._getChildName(0)] = w;
- this.options.items.unshift(items[i]);
- added.push(w);
- fragment.appendChild(w.element[0]);
- }
- this._getWrapper().prepend(fragment);
- BI.each(added, function (i, w) {
- w._mount();
- })
- },
-
- getValue: function () {
- var self = this, value = [], child;
- BI.each(this.options.items, function (i) {
- if (child = self._children[self._getChildName(i)]) {
- var v = child.getValue();
- v = BI.isArray(v) ? v : [v];
- value = value.concat(v);
- }
- });
- return value;
- },
-
- setValue: function (v) {
- var self = this, child;
- BI.each(this.options.items, function (i) {
- if (child = self._children[self._getChildName(i)]) {
- child.setValue(v);
- }
- })
- },
-
- setText: function (v) {
- var self = this, child;
- BI.each(this.options.items, function (i) {
- if (child = self._children[self._getChildName(i)]) {
- child.setText(v);
- }
- })
- },
-
- patchItem: function (oldVnode, vnode, index) {
- var shouldUpdate = this.shouldUpdateItem(index, vnode);
- if (shouldUpdate === true || (shouldUpdate === null && !this._compare(oldVnode, vnode))) {
- return this.updateItemAt(index, vnode);
- }
- },
-
- updateChildren: function (oldCh, newCh) {
- var self = this;
- var oldStartIdx = 0, newStartIdx = 0;
- var oldEndIdx = oldCh.length - 1;
- var oldStartVnode = oldCh[0];
- var oldEndVnode = oldCh[oldEndIdx];
- var newEndIdx = newCh.length - 1;
- var newStartVnode = newCh[0];
- var newEndVnode = newCh[newEndIdx];
- var before;
- var updated;
- var children = {};
- BI.each(oldCh, function (i, child) {
- child = self._getOptions(child);
- var key = child.key == null ? i : child.key;
- if (BI.isKey(key)) {
- children[key] = self._children[self._getChildName(i)];
- }
- });
-
- while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {
- if (BI.isNull(oldStartVnode)) {
- oldStartVnode = oldCh[++oldStartIdx];
- } else if (BI.isNull(oldEndVnode)) {
- oldEndVnode = oldCh[--oldEndIdx];
- } else if (sameVnode(oldStartVnode, newStartVnode, oldStartIdx, newStartIdx)) {
- updated = this.patchItem(oldStartVnode, newStartVnode, oldStartIdx) || updated;
- children[oldStartVnode.key == null ? this._getChildName(oldStartIdx) : oldStartVnode.key] = this._children[this._getChildName(oldStartIdx)];
- oldStartVnode = oldCh[++oldStartIdx];
- newStartVnode = newCh[++newStartIdx];
- } else if (sameVnode(oldEndVnode, newEndVnode, oldEndIdx, newEndIdx)) {
- updated = this.patchItem(oldEndVnode, newEndVnode, oldEndIdx) || updated;
- children[oldEndVnode.key == null ? this._getChildName(oldEndIdx) : oldEndVnode.key] = this._children[this._getChildName(oldEndIdx)];
- oldEndVnode = oldCh[--oldEndIdx];
- newEndVnode = newCh[--newEndIdx];
- } else if (sameVnode(oldStartVnode, newEndVnode)) {
- updated = this.patchItem(oldStartVnode, newEndVnode, oldStartIdx) || updated;
- children[oldStartVnode.key == null ? this._getChildName(oldStartIdx) : oldStartVnode.key] = this._children[this._getChildName(oldStartIdx)];
- insertBefore(oldStartVnode, oldEndVnode, true);
- oldStartVnode = oldCh[++oldStartIdx];
- newEndVnode = newCh[--newEndIdx];
- } else if (sameVnode(oldEndVnode, newStartVnode)) {
- updated = this.patchItem(oldEndVnode, newStartVnode, oldEndIdx) || updated;
- children[oldEndVnode.key == null ? this._getChildName(oldEndIdx) : oldEndVnode.key] = this._children[this._getChildName(oldEndIdx)];
- insertBefore(oldEndVnode, oldStartVnode);
- oldEndVnode = oldCh[--oldEndIdx];
- newStartVnode = newCh[++newStartIdx];
- } else {
- var node = addNode(newStartVnode);
- insertBefore(node, oldStartVnode);
- newStartVnode = newCh[++newStartIdx];
- }
- }
- if (oldStartIdx > oldEndIdx) {
- before = BI.isNull(newCh[newEndIdx + 1]) ? null : newCh[newEndIdx + 1].elm;
- addVnodes(before, newCh, newStartIdx, newEndIdx);
- } else if (newStartIdx > newEndIdx) {
- removeVnodes(oldCh, oldStartIdx, oldEndIdx);
- }
-
- this._children = {};
- BI.each(newCh, function (i, child) {
- var node = self._getOptions(child);
- var key = node.key == null ? i : node.key;
- children[key]._mount();
- self._children[self._getChildName(i)] = children[key];
- });
-
- function sameVnode(vnode1, vnode2, oldIndex, newIndex) {
- vnode1 = self._getOptions(vnode1);
- vnode2 = self._getOptions(vnode2);
- if (BI.isKey(vnode1.key)) {
- return vnode1.key === vnode2.key;
- }
- if (oldIndex >= 0) {
- return oldIndex === newIndex
- }
- }
-
- function addNode(vnode, index) {
- var opt = self._getOptions(vnode);
- var key = opt.key == null ? index : opt.key;
- return children[key] = self._addElement(key, vnode);
- }
-
- function addVnodes(before, vnodes, startIdx, endIdx) {
- for (; startIdx <= endIdx; ++startIdx) {
- var node = addNode(vnodes[startIdx], startIdx);
- insertBefore(node, before, false, startIdx);
- }
- }
-
- function removeVnodes(vnodes, startIdx, endIdx) {
- for (; startIdx <= endIdx; ++startIdx) {
- var node = self._getOptions(vnodes[startIdx]);
- var key = node.key == null ? startIdx : node.key;
- children[key]._destroy();
- }
- }
-
- function insertBefore(insert, before, isNext, index) {
- insert = self._getOptions(insert);
- before = before && self._getOptions(before);
- var insertKey = BI.isKey(insert.key) ? insert.key : index;
- if (before && children[before.key]) {
- var beforeKey = BI.isKey(before.key) ? before.key : index;
- var next;
- if (isNext) {
- next = children[beforeKey].element.next();
- } else {
- next = children[beforeKey].element;
- }
- if (next.length > 0) {
- next.before(children[insertKey].element);
- } else {
- self._getWrapper().append(children[insertKey].element);
- }
- } else {
- self._getWrapper().append(children[insertKey].element);
- }
- }
-
- return updated;
- },
-
- update: function (opt) {
- var o = this.options;
- var items = opt.items || [];
- var updated = this.updateChildren(o.items, items);
- this.options.items = items;
- return updated;
- // var updated, i, len;
- // for (i = 0, len = Math.min(o.items.length, items.length); i < len; i++) {
- // if (!this._compare(o.items[i], items[i])) {
- // updated = this.updateItemAt(i, items[i]) || updated;
- // }
- // }
- // if (o.items.length > items.length) {
- // var deleted = [];
- // for (i = items.length; i < o.items.length; i++) {
- // deleted.push(this._children[this._getChildName(i)]);
- // delete this._children[this._getChildName(i)];
- // }
- // o.items.splice(items.length);
- // BI.each(deleted, function (i, w) {
- // w._destroy();
- // })
- // } else if (items.length > o.items.length) {
- // for (i = o.items.length; i < items.length; i++) {
- // this.addItemAt(i, items[i]);
- // }
- // }
- // return updated;
- },
-
- stroke: function (items) {
- var self = this;
- BI.each(items, function (i, item) {
- if (!!item) {
- self._addElement(i, item);
- }
- });
- },
-
- removeWidget: function (nameOrWidget) {
- var removeIndex;
- if (BI.isWidget(nameOrWidget)) {
- BI.each(this._children, function (name, child) {
- if (child === nameOrWidget) {
- removeIndex = name;
- }
- })
- } else {
- removeIndex = nameOrWidget;
- }
- if (removeIndex) {
- this._removeItemAt(removeIndex | 0);
- }
- },
-
- empty: function () {
- BI.Layout.superclass.empty.apply(this, arguments);
- this.options.items = [];
- },
-
- destroy: function () {
- BI.Layout.superclass.destroy.apply(this, arguments);
- this.options.items = [];
- },
-
- populate: function (items) {
- var self = this, o = this.options;
- items = items || [];
- if (this._isMounted) {
- this.update({items: items});
- return;
- }
- this.options.items = items;
- this.stroke(items);
- },
-
- resize: function () {
-
- }
-});
-BI.shortcut('bi.layout', BI.Layout);/**
- * guy
- * 由一个元素切换到另一个元素的行为
- * @class BI.Action
- * @extends BI.OB
- * @abstract
- */
-BI.Action = BI.inherit(BI.OB, {
- _defaultConfig: function() {
- return BI.extend(BI.Action.superclass._defaultConfig.apply(this, arguments), {
- src: null,
- tar: null
- });
- },
-
- _init : function() {
- BI.Action.superclass._init.apply(this, arguments);
- },
-
- actionPerformed: function(src, tar, callback){
-
- },
-
- actionBack: function(tar, src, callback){
-
- }
-});
-
-BI.ActionFactory = {
- createAction: function(key, options){
- var action;
- switch (key){
- case "show":
- action = BI.ShowAction;
- break;
- }
- return new action(options);
- }
-}/**
- * guy
- * 由一个元素切换到另一个元素的行为
- * @class BI.ShowAction
- * @extends BI.Action
- */
-BI.ShowAction = BI.inherit(BI.Action, {
- _defaultConfig: function () {
- return BI.extend(BI.ShowAction.superclass._defaultConfig.apply(this, arguments), {});
- },
-
- _init: function () {
- BI.ShowAction.superclass._init.apply(this, arguments);
- },
-
- actionPerformed: function (src, tar, callback) {
- tar = tar || this.options.tar;
- tar.setVisible(true);
- callback && callback();
- },
-
- actionBack: function (tar, src, callback) {
- tar = tar || this.options.tar;
- tar.setVisible(false);
- callback && callback();
- }
-});/**
- * 弹出层
- * @class BI.PopoverSection
- * @extends BI.Widget
- * @abstract
- */
-BI.PopoverSection = BI.inherit(BI.Widget, {
- _init : function() {
- BI.PopoverSection.superclass._init.apply(this, arguments);
- },
-
- rebuildNorth : function(north) {
- return true;
- },
- rebuildCenter : function(center) {},
- rebuildSouth : function(south) {
- return false;
- },
- close: function(){
- this.fireEvent(BI.PopoverSection.EVENT_CLOSE);
- },
- end: function(){
-
- }
-});
-BI.PopoverSection.EVENT_CLOSE = "EVENT_CLOSE";;(function () {
- if (!window.BI) {
- window.BI = {};
- }
- function isEmpty(value) {
- // 判断是否为空值
- var result = value === "" || value === null || value === undefined;
- return result;
- }
-
- // 判断是否是无效的日期
- function isInvalidDate(date) {
- return date == "Invalid Date" || date == "NaN";
- }
-
- /**
- * 科学计数格式
- */
- function _eFormat(text, fmt) {
- var e = fmt.indexOf("E");
- var eleft = fmt.substr(0, e), eright = fmt.substr(e + 1);
- if (/^[0\.-]+$/.test(text)) {
- text = BI._numberFormat(0.0, eleft) + 'E' + BI._numberFormat(0, eright)
- } else {
- var isNegative = text < 0;
- if (isNegative) {
- text = text.substr(1);
- }
- var elvl = (eleft.split('.')[0] || '').length;
- var point = text.indexOf(".");
- if (point < 0) {
- point = text.length;
- }
- var i = 0; //第一个不为0的数的位置
- text = text.replace('.', '');
- for (var len = text.length; i < len; i++) {
- var ech = text.charAt(i);
- if (ech <= '9' && ech >= '1') {
- break;
- }
- }
- var right = point - i - elvl;
- var left = text.substr(i, elvl);
- var dis = i + elvl - text.length;
- if (dis > 0) {
- //末位补全0
- for (var k = 0; k < dis; k++) {
- left += '0';
- }
- } else {
- left += '.' + text.substr(i + elvl);
- }
- left = left.replace(/^[0]+/, '');
- if (right < 0 && eright.indexOf('-') < 0) {
- eright += ';-' + eright;
- }
- text = BI._numberFormat(left, eleft) + 'E' + BI._numberFormat(right, eright);
- if (isNegative) {
- text = '-' + text;
- }
- }
- return text;
- }
-
- /**
- * 数字格式
- */
- function _numberFormat(text, format) {
- var text = text + '';
- //数字格式,区分正负数
- var numMod = format.indexOf(';');
- if (numMod > -1) {
- if (text >= 0) {
- return _numberFormat(text + "", format.substring(0, numMod));
- } else {
- return _numberFormat((-text) + "", format.substr(numMod + 1));
- }
- } else {
- //兼容格式处理负数的情况(copy:fr-jquery.format.js)
- if (+text < 0 && format.charAt(0) !== '-') {
- return _numberFormat((-text) + "", '-' + format);
- }
- }
- var tp = text.split('.'), fp = format.split('.'),
- tleft = tp[0] || '', fleft = fp[0] || '',
- tright = tp[1] || '', fright = fp[1] || '';
- //百分比,千分比的小数点移位处理
- if (/[%‰]$/.test(format)) {
- var paddingZero = /[%]$/.test(format) ? '00' : '000';
- tright += paddingZero;
- tleft += tright.substr(0, paddingZero.length);
- tleft = tleft.replace(/^0+/gi, '');
- tright = tright.substr(paddingZero.length).replace(/0+$/gi, '');
- }
- var right = _dealWithRight(tright, fright);
- if (right.leftPlus) {
- //小数点后有进位
- tleft = parseInt(tleft) + 1 + '';
-
- tleft = isNaN(tleft) ? '1' : tleft;
- }
- right = right.num;
- var left = _dealWithLeft(tleft, fleft);
- if (!(/[0-9]/.test(left))) {
- left = left + '0';
- }
- if (!(/[0-9]/.test(right))) {
- return left + right;
- } else {
- return left + '.' + right;
- }
- }
-
- /**
- * 处理小数点右边小数部分
- * @param tright 右边内容
- * @param fright 右边格式
- * @returns {JSON} 返回处理结果和整数部分是否需要进位
- * @private
- */
- function _dealWithRight(tright, fright) {
- var right = '', j = 0, i = 0;
- for (var len = fright.length; i < len; i++) {
- var ch = fright.charAt(i);
- var c = tright.charAt(j);
- switch (ch) {
- case '0':
- if (isEmpty(c)) {
- c = '0';
- }
- right += c;
- j++;
- break;
- case '#':
- right += c;
- j++;
- break;
- default :
- right += ch;
- break;
- }
- }
- var rll = tright.substr(j);
- var result = {};
- if (!isEmpty(rll) && rll.charAt(0) > 4) {
- //有多余字符,需要四舍五入
- result.leftPlus = true;
- var numReg = right.match(/^[0-9]+/);
- if (numReg) {
- var num = numReg[0];
- var orilen = num.length;
- var newnum = parseInt(num) + 1 + '';
- //进位到整数部分
- if (newnum.length > orilen) {
- newnum = newnum.substr(1);
- } else {
- newnum = String.leftPad(newnum, orilen, '0');
- result.leftPlus = false;
- }
- right = right.replace(/^[0-9]+/, newnum);
- }
- }
- result.num = right;
- return result;
- }
-
- /**
- * 处理小数点左边整数部分
- * @param tleft 左边内容
- * @param fleft 左边格式
- * @returns {string} 返回处理结果
- * @private
- */
- function _dealWithLeft(tleft, fleft) {
- var left = '';
- var j = tleft.length - 1;
- var combo = -1, last = -1;
- var i = fleft.length - 1;
- for (; i >= 0; i--) {
- var ch = fleft.charAt(i);
- var c = tleft.charAt(j);
- switch (ch) {
- case '0':
- if (isEmpty(c)) {
- c = '0';
- }
- last = -1;
- left = c + left;
- j--;
- break;
- case '#':
- last = i;
- left = c + left;
- j--;
- break;
- case ',':
- if (!isEmpty(c)) {
- //计算一个,分隔区间的长度
- var com = fleft.match(/,[#0]+/);
- if (com) {
- combo = com[0].length - 1;
- }
- left = ',' + left;
- }
- break;
- default :
- left = ch + left;
- break;
- }
- }
- if (last > -1) {
- //处理剩余字符
- var tll = tleft.substr(0, j + 1);
- left = left.substr(0, last) + tll + left.substr(last);
- }
- if (combo > 0) {
- //处理,分隔区间
- var res = left.match(/[0-9]+,/);
- if (res) {
- res = res[0];
- var newstr = '', n = res.length - 1 - combo;
- for (; n >= 0; n = n - combo) {
- newstr = res.substr(n, combo) + ',' + newstr;
- }
- var lres = res.substr(0, n + combo);
- if (!isEmpty(lres)) {
- newstr = lres + ',' + newstr;
- }
- }
- left = left.replace(/[0-9]+,/, newstr);
- }
- return left;
- }
-
- BI.cjkEncode = function (text) {
- // alex:如果非字符串,返回其本身(cjkEncode(234) 返回 ""是不对的)
- if (typeof text !== 'string') {
- return text;
- }
-
- var newText = "";
- for (var i = 0; i < text.length; i++) {
- var code = text.charCodeAt(i);
- if (code >= 128 || code === 91 || code === 93) {//91 is "[", 93 is "]".
- newText += "[" + code.toString(16) + "]";
- } else {
- newText += text.charAt(i);
- }
- }
-
- return newText
- };
-
- BI.cjkEncodeDO = function (o) {
- if (BI.isPlainObject(o)) {
- var result = {};
- $.each(o, function (k, v) {
- if (!(typeof v == "string")) {
- v = BI.jsonEncode(v);
- }
- //wei:bug 43338,如果key是中文,cjkencode后o的长度就加了1,ie9以下版本死循环,所以新建对象result。
- k = BI.cjkEncode(k);
- result[k] = BI.cjkEncode(v);
- });
- return result;
- }
- return o;
- };
-
- BI.jsonEncode = function (o) {
- //james:这个Encode是抄的EXT的
- var useHasOwn = {}.hasOwnProperty ? true : false;
-
- // crashes Safari in some instances
- //var validRE = /^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/;
-
- var m = {
- "\b": '\\b',
- "\t": '\\t',
- "\n": '\\n',
- "\f": '\\f',
- "\r": '\\r',
- '"': '\\"',
- "\\": '\\\\'
- };
-
- var encodeString = function (s) {
- if (/["\\\x00-\x1f]/.test(s)) {
- return '"' + s.replace(/([\x00-\x1f\\"])/g, function (a, b) {
- var c = m[b];
- if (c) {
- return c;
- }
- c = b.charCodeAt();
- return "\\u00" +
- Math.floor(c / 16).toString(16) +
- (c % 16).toString(16);
- }) + '"';
- }
- return '"' + s + '"';
- };
-
- var encodeArray = function (o) {
- var a = ["["], b, i, l = o.length, v;
- for (i = 0; i < l; i += 1) {
- v = o[i];
- switch (typeof v) {
- case "undefined":
- case "function":
- case "unknown":
- break;
- default:
- if (b) {
- a.push(',');
- }
- a.push(v === null ? "null" : BI.jsonEncode(v));
- b = true;
- }
- }
- a.push("]");
- return a.join("");
- };
-
- if (typeof o == "undefined" || o === null) {
- return "null";
- } else if (BI.isArray(o)) {
- return encodeArray(o);
- } else if (o instanceof Date) {
- /*
- * alex:原来只是把年月日时分秒简单地拼成一个String,无法decode
- * 现在这么处理就可以decode了,但是JS.jsonDecode和Java.JSONObject也要跟着改一下
- */
- return BI.jsonEncode({
- __time__: o.getTime()
- })
- } else if (typeof o == "string") {
- return encodeString(o);
- } else if (typeof o == "number") {
- return isFinite(o) ? String(o) : "null";
- } else if (typeof o == "boolean") {
- return String(o);
- } else if (BI.isFunction(o)) {
- return String(o);
- } else {
- var a = ["{"], b, i, v;
- for (i in o) {
- if (!useHasOwn || o.hasOwnProperty(i)) {
- v = o[i];
- switch (typeof v) {
- case "undefined":
- case "unknown":
- break;
- default:
- if (b) {
- a.push(',');
- }
- a.push(BI.jsonEncode(i), ":",
- v === null ? "null" : BI.jsonEncode(v));
- b = true;
- }
- }
- }
- a.push("}");
- return a.join("");
- }
- };
-
- BI.jsonDecode = function (text) {
-
- try {
- // 注意0啊
- //var jo = $.parseJSON(text) || {};
- var jo = $.parseJSON(text);
- if (jo == null) {
- jo = {};
- }
- } catch (e) {
- /*
- * richie:浏览器只支持标准的JSON字符串转换,而jQuery会默认调用浏览器的window.JSON.parse()函数进行解析
- * 比如:var str = "{'a':'b'}",这种形式的字符串转换为JSON就会抛异常
- */
- try {
- jo = new Function("return " + text)() || {};
- } catch (e) {
- //do nothing
- }
- if (jo == null) {
- jo = [];
- }
- }
- if (!_hasDateInJson(text)) {
- return jo;
- }
-
- function _hasDateInJson(json) {
- if (!json || typeof json !== "string") {
- return false;
- }
- return json.indexOf("__time__") != -1;
- }
-
- return (function (o) {
- if (typeof o === "string") {
- return o;
- }
- if (o && o.__time__ != null) {
- return new Date(o.__time__);
- }
- for (var a in o) {
- if (o[a] == o || typeof o[a] == 'object' || $.isFunction(o[a])) {
- break;
- }
- o[a] = arguments.callee(o[a]);
- }
-
- return o;
- })(jo);
- };
-
- BI.contentFormat = function (cv, fmt) {
- if (isEmpty(cv)) {
- //原值为空,返回空字符
- return '';
- }
- var text = cv.toString();
- if (isEmpty(fmt)) {
- //格式为空,返回原字符
- return text;
- }
- if (fmt.match(/^T/)) {
- //T - 文本格式
- return text;
- } else if (fmt.match(/^D/)) {
- //D - 日期(时间)格式
- if (!(cv instanceof Date)) {
- if (typeof cv === 'number') {
- //毫秒数类型
- cv = new Date(cv);
- } else {
- //字符串类型,如yyyyMMdd、MMddyyyy等这样无分隔符的结构
- cv = Date.parseDate(cv + "", Date.patterns.ISO8601Long);
- }
- }
- if (!BI.isNull(cv)) {
- var needTrim = fmt.match(/^DT/);
- text = BI.date2Str(cv, fmt.substring(needTrim ? 2 : 1));
- }
- } else if (fmt.match(/E/)) {
- //科学计数格式
- text = _eFormat(text, fmt);
- } else {
- //数字格式
- text = _numberFormat(text, fmt);
- }
- //¤ - 货币格式
- text = text.replace(/¤/g, '¥');
- return text;
- };
-
- /**
- * 把日期对象按照指定格式转化成字符串
- *
- * @example
- * var date = new Date('Thu Dec 12 2013 00:00:00 GMT+0800');
- * var result = BI.date2Str(date, 'yyyy-MM-dd');//2013-12-12
- *
- * @class BI.date2Str
- * @param date 日期
- * @param format 日期格式
- * @returns {String}
- */
- BI.date2Str = function (date, format) {
- if (!date) {
- return '';
- }
- // O(len(format))
- var len = format.length, result = '';
- if (len > 0) {
- var flagch = format.charAt(0), start = 0, str = flagch;
- for (var i = 1; i < len; i++) {
- var ch = format.charAt(i);
- if (flagch !== ch) {
- result += compileJFmt({
- 'char': flagch,
- 'str': str,
- 'len': i - start
- }, date);
- flagch = ch;
- start = i;
- str = flagch;
- } else {
- str += ch;
- }
- }
- result += compileJFmt({
- 'char': flagch,
- 'str': str,
- 'len': len - start
- }, date);
- }
- return result;
-
- function compileJFmt(jfmt, date) {
- var str = jfmt.str, len = jfmt.len, ch = jfmt['char'];
- switch (ch) {
- case 'E': //星期
- str = Date._DN[date.getDay()];
- break;
- case 'y': //年
- if (len <= 3) {
- str = (date.getFullYear() + '').slice(2, 4);
- } else {
- str = date.getFullYear();
- }
- break;
- case 'M': //月
- if (len > 2) {
- str = Date._MN[date.getMonth()];
- } else if (len < 2) {
- str = date.getMonth() + 1;
- } else {
- str = String.leftPad(date.getMonth() + 1 + '', 2, '0');
- }
- break;
- case 'd': //日
- if (len > 1) {
- str = String.leftPad(date.getDate() + '', 2, '0');
- } else {
- str = date.getDate();
- }
- break;
- case 'h': //时(12)
- var hour = date.getHours() % 12;
- if (hour === 0) {
- hour = 12;
- }
- if (len > 1) {
- str = String.leftPad(hour + '', 2, '0');
- } else {
- str = hour;
- }
- break;
- case 'H': //时(24)
- if (len > 1) {
- str = String.leftPad(date.getHours() + '', 2, '0');
- } else {
- str = date.getHours();
- }
- break;
- case 'm':
- if (len > 1) {
- str = String.leftPad(date.getMinutes() + '', 2, '0');
- } else {
- str = date.getMinutes();
- }
- break;
- case 's':
- if (len > 1) {
- str = String.leftPad(date.getSeconds() + '', 2, '0');
- } else {
- str = date.getSeconds();
- }
- break;
- case 'a':
- str = date.getHours() < 12 ? 'am' : 'pm';
- break;
- case 'z':
- str = date.getTimezone();
- break;
- default:
- str = jfmt.str;
- break;
- }
- return str;
- }
- };
-
- BI.object2Number = function (value) {
- if (value == null) {
- return 0;
- }
- if (typeof value == 'number') {
- return value;
- } else {
- var str = value + "";
- if (str.indexOf(".") === -1) {
- return parseInt(str);
- } else {
- return parseFloat(str);
- }
- }
- };
-
- BI.object2Date = function (obj) {
- if (obj == null) {
- return new Date();
- }
- if (obj instanceof Date) {
- return obj;
- } else if (typeof obj == 'number') {
- return new Date(obj);
- } else {
- var str = obj + "";
- str = str.replace(/-/g, '/');
- var dt = new Date(str);
- if (!isInvalidDate(dt)) {
- return dt;
- }
-
- return new Date();
- }
- };
-
- BI.object2Time = function (obj) {
- if (obj == null) {
- return new Date();
- }
- if (obj instanceof Date) {
- return obj;
- } else {
- var str = obj + "";
- str = str.replace(/-/g, '/');
- var dt = new Date(str);
- if (!isInvalidDate(dt)) {
- return dt;
- }
- if (str.indexOf('/') === -1 && str.indexOf(':') !== -1) {
- dt = new Date("1970/01/01 " + str);
- if (!isInvalidDate(dt)) {
- return dt;
- }
- }
- dt = BI.str2Date(str, "HH:mm:ss");
- if (!isInvalidDate(dt)) {
- return dt;
- }
- return new Date();
- }
- };
-})();
-/**
- * guy
- *
- * @class BI.HighlightBehavior
- * @extends BI.Behavior
- */
-BI.HighlightBehavior = BI.inherit(BI.Behavior, {
- _defaultConfig: function () {
- return BI.extend(BI.HighlightBehavior.superclass._defaultConfig.apply(this, arguments), {});
- },
-
- _init: function () {
- BI.HighlightBehavior.superclass._init.apply(this, arguments);
-
- },
-
- doBehavior: function (items) {
- var args = Array.prototype.slice.call(arguments, 1),
- o = this.options;
- BI.each(items, function (i, item) {
- if (item instanceof BI.Single) {
- var rule = o.rule(item.getValue(), item);
-
- function doBe(run) {
- if (run === true) {
- item.doHighLight.apply(item, args);
- } else {
- item.unHighLight.apply(item, args);
- }
- }
-
- if (BI.isFunction(rule)) {
- rule(doBe);
- } else {
- doBe(rule);
- }
- } else {
- item.doBehavior.apply(item, args);
- }
- })
- }
-});/**
- * guy
- * 标红行为
- * @class BI.RedMarkBehavior
- * @extends BI.Behavior
- */
-BI.RedMarkBehavior = BI.inherit(BI.Behavior, {
- _defaultConfig: function() {
- return BI.extend(BI.RedMarkBehavior.superclass._defaultConfig.apply(this, arguments), {
-
- });
- },
-
- _init : function() {
- BI.RedMarkBehavior.superclass._init.apply(this, arguments);
-
- },
-
- doBehavior: function(items){
- var args = Array.prototype.slice.call(arguments, 1),
- o = this.options;
- BI.each(items, function(i, item){
- if(item instanceof BI.Single) {
- if (o.rule(item.getValue(), item)) {
- item.doRedMark.apply(item, args);
- } else {
- item.unRedMark.apply(item, args);
- }
- } else {
- item.doBehavior.apply(item, args);
- }
- })
- }
-});/**
- * guy
- * 控制器
- * Controller层超类
- * @class BI.Controller
- * @extends BI.OB
- * @abstract
- */
-BI.Controller = BI.inherit(BI.OB, {
- _defaultConfig: function() {
- return BI.extend(BI.Controller.superclass._defaultConfig.apply(this, arguments), {
-
- })
- },
- _init : function() {
- BI.Controller.superclass._init.apply(this, arguments);
- },
-
- destroy: function(){
-
- }
-});
-BI.Controller.EVENT_CHANGE = "__EVENT_CHANGE__";/**
- * 广播
- *
- * Created by GUY on 2015/12/23.
- * @class
- */
-BI.BroadcastController = BI.inherit(BI.Controller, {
- _defaultConfig: function () {
- return BI.extend(BI.BroadcastController.superclass._defaultConfig.apply(this, arguments), {});
- },
-
- _init: function () {
- BI.BroadcastController.superclass._init.apply(this, arguments);
- this._broadcasts = {};
- },
-
- on: function (name, fn) {
- var self = this;
- if (!this._broadcasts[name]) {
- this._broadcasts[name] = [];
- }
- this._broadcasts[name].push(fn);
- return function () {
- self.remove(name, fn);
- }
- },
-
- send: function (name) {
- var args = [].slice.call(arguments, 1);
- BI.each(this._broadcasts[name], function (i, fn) {
- fn.apply(null, args);
- });
- },
-
- remove: function (name, fn) {
- if (fn) {
- this._broadcasts[name].remove(fn);
- if (this._broadcasts[name].length === 0) {
- delete this._broadcasts[name];
- }
- } else {
- delete this._broadcasts[name];
- }
- return this;
- }
-});/**
- * 气泡图控制器
- * 控制气泡图的显示方向
- *
- * Created by GUY on 2015/8/21.
- * @class
- */
-BI.BubblesController = BI.inherit(BI.Controller, {
- _defaultConfig: function () {
- return BI.extend(BI.BubblesController.superclass._defaultConfig.apply(this, arguments), {});
- },
-
- _const: {
- bubbleHeight: 35
- },
-
- _init: function () {
- BI.BubblesController.superclass._init.apply(this, arguments);
- this.bubblesManager = {};
- this.storeBubbles = {};
- },
-
- _createBubble: function (direct, text, height) {
- return BI.createWidget({
- type: "bi.bubble",
- text: text,
- height: height || 35,
- direction: direct
- });
- },
-
- _getOffsetLeft: function (name, context, offsetStyle) {
- var left = 0;
- if ("center" === offsetStyle) {
- left = context.element.offset().left + (context.element.bounds().width - this.get(name).element.bounds().width) / 2;
- if (left < 0) {
- left = 0;
- }
- return left;
- }
- if ("right" === offsetStyle) {
- left = context.element.offset().left + context.element.bounds().width - this.get(name).element.bounds().width;
- if (left < 0) {
- left = 0;
- }
- return left;
- }
- return context.element.offset().left;
- },
-
- _getOffsetTop: function (name, context, offsetStyle) {
- var top = 0;
- if ("center" === offsetStyle) {
- top = context.element.offset().top + (context.element.bounds().height - this.get(name).element.bounds().height) / 2;
- if (top < 0) {
- top = 0;
- }
- return top;
- } else if ("right" === offsetStyle) {
- top = context.element.offset().top + context.element.bounds().height - this.get(name).element.bounds().height;
- if (top < 0) {
- top = 0;
- }
- return top;
- }
- return context.element.offset().top;
- },
-
- _getLeftPosition: function (name, context, offsetStyle) {
- var position = $.getLeftPosition(context, this.get(name));
- position.top = this._getOffsetTop(name, context, offsetStyle);
- return position;
- },
-
- _getBottomPosition: function (name, context, offsetStyle) {
- var position = $.getBottomPosition(context, this.get(name));
- position.left = this._getOffsetLeft(name, context, offsetStyle);
- return position;
- },
-
- _getTopPosition: function (name, context, offsetStyle) {
- var position = $.getTopPosition(context, this.get(name));
- position.left = this._getOffsetLeft(name, context, offsetStyle);
- return position;
- },
-
- _getRightPosition: function (name, context, offsetStyle) {
- var position = $.getRightPosition(context, this.get(name));
- position.top = this._getOffsetTop(name, context, offsetStyle);
- return position;
- },
-
- /**
- *
- * @param name
- * @param text
- * @param context
- * @param offsetStyle center, left, right三种类型, 默认left
- * @returns {BI.BubblesController}
- */
- show: function (name, text, context, opt) {
- opt || (opt = {});
- var container = opt.container || context;
- var offsetStyle = opt.offsetStyle || {};
- if (!this.storeBubbles[name]) {
- this.storeBubbles[name] = {};
- }
- if (!this.storeBubbles[name]["top"]) {
- this.storeBubbles[name]["top"] = this._createBubble("top", text);
- }
- BI.createWidget({
- type: "bi.absolute",
- element: container,
- items: [{
- el: this.storeBubbles[name]["top"]
- }]
- });
- this.set(name, this.storeBubbles[name]["top"]);
- var position = this._getTopPosition(name, context, offsetStyle);
- this.get(name).element.css({left: position.left, top: position.top});
- this.get(name).invisible();
- if (!$.isTopSpaceEnough(context, this.get(name))) {
- if (!this.storeBubbles[name]["left"]) {
- this.storeBubbles[name]["left"] = this._createBubble("left", text, 30);
- }
- BI.createWidget({
- type: "bi.absolute",
- element: container,
- items: [{
- el: this.storeBubbles[name]["left"]
- }]
- });
- this.set(name, this.storeBubbles[name]["left"]);
- var position = this._getLeftPosition(name, context, offsetStyle);
- this.get(name).element.css({left: position.left, top: position.top});
- this.get(name).invisible();
- if (!$.isLeftSpaceEnough(context, this.get(name))) {
- if (!this.storeBubbles[name]["right"]) {
- this.storeBubbles[name]["right"] = this._createBubble("right", text, 30);
- }
- BI.createWidget({
- type: "bi.absolute",
- element: container,
- items: [{
- el: this.storeBubbles[name]["right"]
- }]
- });
- this.set(name, this.storeBubbles[name]["right"]);
- var position = this._getRightPosition(name, context, offsetStyle);
- this.get(name).element.css({left: position.left, top: position.top});
- this.get(name).invisible();
- if (!$.isRightSpaceEnough(context, this.get(name))) {
- if (!this.storeBubbles[name]["bottom"]) {
- this.storeBubbles[name]["bottom"] = this._createBubble("bottom", text);
- }
- BI.createWidget({
- type: "bi.absolute",
- element: container,
- items: [{
- el: this.storeBubbles[name]["bottom"]
- }]
- });
- this.set(name, this.storeBubbles[name]["bottom"]);
- var position = this._getBottomPosition(name, context, offsetStyle);
- this.get(name).element.css({left: position.left, top: position.top});
- this.get(name).invisible();
- }
- }
- }
- this.get(name).setText(text);
- this.get(name).visible();
- return this;
- },
-
- hide: function (name) {
- if (!this.has(name)) {
- return this;
- }
- this.get(name).invisible();
- return this;
- },
-
- add: function (name, bubble) {
- if (this.has(name)) {
- return this;
- }
- this.set(name, bubble);
- return this;
- },
-
- get: function (name) {
- return this.bubblesManager[name];
- },
-
- set: function (name, bubble) {
- this.bubblesManager[name] = bubble;
- },
-
- has: function (name) {
- return this.bubblesManager[name] != null;
- },
-
- remove: function (name) {
- if (!this.has(name)) {
- return this;
- }
- BI.each(this.storeBubbles[name], function (dir, bubble) {
- bubble.destroy();
- });
- delete this.storeBubbles[name];
- delete this.bubblesManager[name];
- return this;
- }
-});/**
- * guy
- * FloatBox弹出层控制器, z-index在100w层级
- * @class BI.FloatBoxController
- * @extends BI.Controller
- */
-BI.FloatBoxController = BI.inherit(BI.Controller, {
- _defaultConfig: function () {
- return BI.extend(BI.FloatBoxController.superclass._defaultConfig.apply(this, arguments), {
- modal: true, // 模态窗口
- render: "body"
- });
- },
-
- _init: function () {
- BI.FloatBoxController.superclass._init.apply(this, arguments);
- this.modal = this.options.modal;
- this.floatManager = {};
- this.floatLayer = {};
- this.floatContainer = {};
- this.floatOpened = {};
- this.zindex = BI.zIndex_floatbox;
- this.zindexMap = {};
- },
-
- _check: function (name) {
- return BI.isNotNull(this.floatManager[name]);
- },
-
- create: function (name, section, options) {
- if (this._check(name)) {
- return this;
- }
- var floatbox = BI.createWidget({
- type: "bi.float_box"
- }, options);
- floatbox.populate(section);
- this.add(name, floatbox, options);
- return this;
- },
-
- add: function (name, floatbox, options) {
- var self = this;
- options || (options = {});
- if (this._check(name)) {
- return this;
- }
- this.floatContainer[name] = BI.createWidget({
- type: "bi.absolute",
- cls: "bi-popup-view",
- items: [{
- el: (this.floatLayer[name] = BI.createWidget({
- type: 'bi.absolute',
- items: [floatbox]
- })),
- left: 0,
- right: 0,
- top: 0,
- bottom: 0
- }]
- });
- this.floatManager[name] = floatbox;
- (function (key) {
- floatbox.on(BI.FloatBox.EVENT_FLOAT_BOX_CLOSED, function () {
- self.close(key);
- })
- })(name);
- BI.createWidget({
- type: "bi.absolute",
- element: options.container || this.options.render,
- items: [{
- el: this.floatContainer[name],
- left: 0,
- right: 0,
- top: 0,
- bottom: 0
- }]
- });
- return this;
- },
-
- open: function (name) {
- if (!this._check(name)) {
- return this;
- }
- if (!this.floatOpened[name]) {
- this.floatOpened[name] = true;
- var container = this.floatContainer[name];
- container.element.css("zIndex", this.zindex++);
- this.modal && container.element.__hasZIndexMask__(this.zindexMap[name]) && container.element.__releaseZIndexMask__(this.zindexMap[name]);
- this.zindexMap[name] = this.zindex;
- this.modal && container.element.__buildZIndexMask__(this.zindex++);
- this.get(name).setZindex(this.zindex++);
- this.floatContainer[name].visible();
- var floatbox = this.get(name);
- floatbox.show();
- var W = $(this.options.render).width(), H = $(this.options.render).height();
- var w = floatbox.element.width(), h = floatbox.element.height();
- var left = (W - w) / 2, top = (H - h) / 2;
- if (left < 0) {
- left = 0;
- }
- if (top < 0) {
- top = 0;
- }
- floatbox.element.css({
- left: left + "px",
- top: top + "px"
- });
- }
- return this;
- },
-
- close: function (name) {
- if (!this._check(name)) {
- return this;
- }
- if (this.floatOpened[name]) {
- delete this.floatOpened[name];
- this.floatContainer[name].invisible();
- this.modal && this.floatContainer[name].element.__releaseZIndexMask__(this.zindexMap[name]);
- }
- return this;
- },
-
- get: function (name) {
- return this.floatManager[name];
- },
-
- remove: function (name) {
- if (!this._check(name)) {
- return this;
- }
- this.floatContainer[name].destroy();
- this.modal && this.floatContainer[name].element.__releaseZIndexMask__(this.zindexMap[name]);
- delete this.floatManager[name];
- delete this.floatLayer[name];
- delete this.zindexMap[name];
- delete this.floatContainer[name];
- delete this.floatOpened[name];
- return this;
- }
-});/**
- * 弹出层面板控制器, z-index在10w层级
- *
- * Created by GUY on 2015/6/24.
- * @class
- */
-BI.LayerController = BI.inherit(BI.Controller, {
- _defaultConfig: function () {
- return BI.extend(BI.LayerController.superclass._defaultConfig.apply(this, arguments), {
- render: "body"
- });
- },
-
- _init: function () {
- BI.LayerController.superclass._init.apply(this, arguments);
- this.layerManager = {};
- this.layouts = {};
- this.zindex = BI.zIndex_layer;
- BI.Resizers.add("layerController" + BI.uniqueId(), BI.bind(this._resize, this));
- },
-
- _resize: function () {
- BI.each(this.layouts, function (i, layer) {
- if (layer.element.is(":visible")) {
- layer.element.trigger("__resize__");
- }
- })
- },
-
- make: function (name, container, op) {
- if (this.has(name)) {
- return this.get(name);
- }
- op || (op = {});
- var widget = BI.createWidget((op.render || {}), {
- type: "bi.layout"
- });
- BI.createWidget({
- type: "bi.absolute",
- element: container || this.options.render,
- items: [BI.extend({
- el: widget
- }, {
- top: 0,
- left: 0,
- right: 0,
- bottom: 0
- }, op.offset)]
- });
- this.add(name, widget, widget);
- return widget;
- },
-
- create: function (name, from, op) {
- if (this.has(name)) {
- return this.get(name);
- }
- op || (op = {});
- var offset = op.offset || {};
- var w = from;
- if (BI.isWidget(from)) {
- w = from.element;
- }
- if (BI.isNotEmptyString(w)) {
- w = $(w);
- }
- if (this.has(name)) {
- return this.get(name);
- }
- var widget = BI.createWidget((op.render || {}), {
- type: "bi.layout",
- cls: op.cls
- });
- var layout = BI.createWidget({
- type: "bi.absolute",
- items: [{
- el: widget,
- left: 0,
- right: 0,
- top: 0,
- bottom: 0
- }]
- });
- BI.createWidget({
- type: "bi.absolute",
- element: op.container || this.options.render,
- items: [{
- el: layout,
- left: offset.left || 0,
- right: offset.right || 0,
- top: offset.top || 0,
- bottom: offset.bottom || 0
- }]
- });
- if (w) {
- layout.element.addClass("bi-popup-view");
- layout.element.css({
- left: w.offset().left + (offset.left || 0),
- top: w.offset().top + (offset.top || 0),
- width: offset.width || (w.outerWidth() - (offset.right || 0)) || "",
- height: offset.height || (w.outerHeight() - (offset.bottom || 0)) || ""
- });
- layout.element.on("__resize__", function () {
- w.is(":visible") &&
- layout.element.css({
- left: w.offset().left + (offset.left || 0),
- top: w.offset().top + (offset.top || 0),
- width: offset.width || (w.outerWidth() - (offset.right || 0)) || "",
- height: offset.height || (w.outerHeight() - (offset.bottom || 0)) || ""
- });
- });
- }
- this.add(name, widget, layout);
- return widget;
- },
-
- hide: function (name, callback) {
- if (!this.has(name)) {
- return this;
- }
- this._getLayout(name).invisible();
- this._getLayout(name).element.hide(0, callback);
- return this;
- },
-
- show: function (name, callback) {
- if (!this.has(name)) {
- return this;
- }
- this._getLayout(name).visible();
- this._getLayout(name).element.css("z-index", this.zindex++).show(0, callback).trigger("__resize__");
- return this;
- },
-
- isVisible: function (name) {
- return this.has(name) && this._getLayout(name).isVisible();
- },
-
- add: function (name, layer, layout) {
- if (this.has(name)) {
- throw new Error("name is already exist");
- }
- layout.setVisible(false);
- this.layerManager[name] = layer;
- this.layouts[name] = layout;
- layout.element.css("z-index", this.zindex++);
- return this;
- },
-
- _getLayout: function (name) {
- return this.layouts[name];
- },
-
- get: function (name) {
- return this.layerManager[name];
- },
-
- has: function (name) {
- return this.layerManager[name] != null;
- },
-
- remove: function (name) {
- if (!this.has(name)) {
- return this;
- }
- this.layerManager[name].destroy();
- this.layouts[name].destroy();
- delete this.layerManager[name];
- delete this.layouts[name];
- return this;
- }
-});/**
- * 遮罩面板, z-index在1亿层级
- *
- * Created by GUY on 2015/6/24.
- * @class
- */
-BI.MaskersController = BI.inherit(BI.LayerController, {
- _defaultConfig: function () {
- return BI.extend(BI.MaskersController.superclass._defaultConfig.apply(this, arguments), {});
- },
-
- _init: function () {
- BI.MaskersController.superclass._init.apply(this, arguments);
- this.zindex = BI.zIndex_masker;
- }
-});/**
- * window.resize 控制器
- *
- * Created by GUY on 2015/6/24.
- * @class
- */
-BI.ResizeController = BI.inherit(BI.Controller, {
- _defaultConfig: function () {
- return BI.extend(BI.ResizeController.superclass._defaultConfig.apply(this, arguments), {});
- },
-
- _init: function () {
- BI.ResizeController.superclass._init.apply(this, arguments);
- var self = this;
- this.resizerManger = {};
- var fn = BI.debounce(function (ev) {
- //if (BI.isWindow(ev.target)) {
- self._resize(ev);
- //}
- }, 30);
- $(window).resize(fn);
- },
-
- _resize: function (ev) {
- BI.each(this.resizerManger, function (key, resizer) {
- if (resizer instanceof $) {
- if (resizer.is(":visible")) {
- resizer.trigger("__resize__");
- }
- return;
- }
- if (resizer instanceof BI.Layout) {
- resizer.resize();
- return;
- }
- if (BI.isFunction(resizer)) {
- resizer(ev);
- return;
- }
- })
- },
-
- add: function (name, resizer) {
- var self = this;
- if (this.has(name)) {
- return this;
- }
- this.resizerManger[name] = resizer;
- return function () {
- self.remove(name);
- };
- },
-
- get: function (name) {
- return this.resizerManger[name];
- },
-
- has: function (name) {
- return this.resizerManger[name] != null;
- },
-
- remove: function (name) {
- if (!this.has(name)) {
- return this;
- }
- delete this.resizerManger[name];
- return this;
- }
-});/**
- * tooltip控制器
- * 控制tooltip的显示, 且页面中只有一个tooltip显示
- *
- * Created by GUY on 2015/9/8.
- * @class BI.TooltipsController
- * @extends BI.Controller
- */
-BI.TooltipsController = BI.inherit(BI.Controller, {
- _defaultConfig: function () {
- return BI.extend(BI.TooltipsController.superclass._defaultConfig.apply(this, arguments), {});
- },
-
- _const: {
- height: 20
- },
-
- _init: function () {
- BI.TooltipsController.superclass._init.apply(this, arguments);
- this.tooltipsManager = {};
- this.showingTips = {};//存储正在显示的tooltip
- },
-
- _createTooltip: function (text, level) {
- return BI.createWidget({
- type: "bi.tooltip",
- text: text,
- level: level,
- stopEvent: true,
- height: this._const.height
- });
- },
-
- hide: function (name, callback) {
- if (!this.has(name)) {
- return this;
- }
- delete this.showingTips[name];
- this.get(name).element.hide(0, callback);
- this.get(name).invisible();
- return this;
- },
-
- create: function (name, text, level, context) {
- if (!this.has(name)) {
- var tooltip = this._createTooltip(text, level);
- this.add(name, tooltip);
- BI.createWidget({
- type: "bi.absolute",
- element: context || "body",
- items: [{
- el: tooltip
- }]
- });
- tooltip.invisible();
- }
- return this.get(name);
- },
-
- //opt: {container: '', belowMouse: false}
- show: function (e, name, text, level, context, opt) {
- opt || (opt = {});
- var self = this;
- BI.each(this.showingTips, function (i, tip) {
- self.hide(i);
- });
- this.showingTips = {};
- if (!this.has(name)) {
- this.create(name, text, level, opt.container || context);
- }
- if (!opt.belowMouse) {
- var offset = context.element.offset();
- var bounds = context.element.bounds();
- if (bounds.height === 0 || bounds.width === 0) {
- return;
- }
- var top = offset.top + bounds.height + 5;
- }
- var tooltip = this.get(name);
- tooltip.setText(text);
- tooltip.element.css({
- left: "0px",
- top: "0px"
- });
- tooltip.visible();
- tooltip.element.height(tooltip.element[0].scrollHeight);
- this.showingTips[name] = true;
- var x = (e.pageX || e.clientX) + 15, y = (e.pageY || e.clientY) + 15;
- if (x + tooltip.element.outerWidth() > $("body").outerWidth()) {
- x -= tooltip.element.outerWidth() + 15;
- }
- if (y + tooltip.element.outerHeight() > $("body").outerHeight()) {
- y -= tooltip.element.outerHeight() + 15;
- !opt.belowMouse && (y = Math.min(y, offset.top - tooltip.element.outerHeight() - 5));
- } else {
- !opt.belowMouse && (y = Math.max(y, top));
- }
- tooltip.element.css({
- left: x < 0 ? 0 : x + "px",
- top: y < 0 ? 0 : y + "px"
- });
- tooltip.element.hover(function () {
- self.remove(name);
- context.element.trigger("mouseleave.title" + context.getName());
- });
- return this;
- },
-
- add: function (name, bubble) {
- if (this.has(name)) {
- return this;
- }
- this.set(name, bubble);
- return this;
- },
-
- get: function (name) {
- return this.tooltipsManager[name];
- },
-
- set: function (name, bubble) {
- this.tooltipsManager[name] = bubble;
- },
-
- has: function (name) {
- return this.tooltipsManager[name] != null;
- },
-
- remove: function (name) {
- if (!this.has(name)) {
- return this;
- }
- this.tooltipsManager[name].destroy();
- delete this.tooltipsManager[name];
- return this;
- }
-});/**
- * 事件集合
- * @class BI.Events
- */
-_.extend(BI, {
- Events: {
-
- /**
- * @static
- * @property keydown事件
- */
- KEYDOWN: "_KEYDOWN",
-
- /**
- * @static
- * @property 回撤事件
- */
- BACKSPACE: "_BACKSPACE",
-
- /**
- * @static
- * @property 空格事件
- */
- SPACE: "_SPACE",
-
- /**
- * @static
- * @property 回车事件
- */
- ENTER: "_ENTER",
-
- /**
- * @static
- * @property 确定事件
- */
- CONFIRM: '_CONFIRM',
-
- /**
- * @static
- * @property 错误事件
- */
- ERROR: '_ERROR',
-
- /**
- * @static
- * @property 暂停事件
- */
- PAUSE: '_PAUSE',
-
- /**
- * @static
- * @property destroy事件
- */
- DESTROY: '_DESTROY',
-
- /**
- * @static
- * @property 取消挂载事件
- */
- UNMOUNT: '_UNMOUNT',
-
- /**
- * @static
- * @property 清除选择
- */
- CLEAR: '_CLEAR',
-
- /**
- * @static
- * @property 添加数据
- */
- ADD: '_ADD',
-
- /**
- * @static
- * @property 正在编辑状态事件
- */
- EDITING: '_EDITING',
-
- /**
- * @static
- * @property 空状态事件
- */
- EMPTY: '_EMPTY',
-
- /**
- * @static
- * @property 显示隐藏事件
- */
- VIEW: '_VIEW',
-
- /**
- * @static
- * @property 窗体改变大小
- */
- RESIZE: "_RESIZE",
-
- /**
- * @static
- * @property 编辑前事件
- */
- BEFOREEDIT: '_BEFOREEDIT',
-
- /**
- * @static
- * @property 编辑后事件
- */
- AFTEREDIT: '_AFTEREDIT',
-
- /**
- * @static
- * @property 开始编辑事件
- */
- STARTEDIT: '_STARTEDIT',
-
- /**
- * @static
- * @property 停止编辑事件
- */
- STOPEDIT: '_STOPEDIT',
-
- /**
- * @static
- * @property 值改变事件
- */
- CHANGE: '_CHANGE',
-
- /**
- * @static
- * @property 下拉弹出菜单事件
- */
- EXPAND: '_EXPAND',
-
- /**
- * @static
- * @property 关闭下拉菜单事件
- */
- COLLAPSE: '_COLLAPSE',
-
- /**
- * @static
- * @property 回调事件
- */
- CALLBACK: '_CALLBACK',
-
- /**
- * @static
- * @property 点击事件
- */
- CLICK: '_CLICK',
-
- /**
- * @static
- * @property 状态改变事件,一般是用在复选按钮和单选按钮
- */
- STATECHANGE: '_STATECHANGE',
-
- /**
- * @static
- * @property 状态改变前事件
- */
- BEFORESTATECHANGE: '_BEFORESTATECHANGE',
-
-
- /**
- * @static
- * @property 初始化事件
- */
- INIT: '_INIT',
-
- /**
- * @static
- * @property 初始化后事件
- */
- AFTERINIT: '_AFTERINIT',
-
- /**
- * @static
- * @property 滚动条滚动事件
- */
- SCROLL: '_SCROLL',
-
-
- /**
- * @static
- * @property 开始加载事件
- */
- STARTLOAD: '_STARTLOAD',
-
- /**
- * @static
- * @property 加载后事件
- */
- AFTERLOAD: '_AFTERLOAD',
-
-
- /**
- * @static
- * @property 提交前事件
- */
- BS: 'beforesubmit',
-
- /**
- * @static
- * @property 提交后事件
- */
- AS: 'aftersubmit',
-
- /**
- * @static
- * @property 提交完成事件
- */
- SC: 'submitcomplete',
-
- /**
- * @static
- * @property 提交失败事件
- */
- SF: 'submitfailure',
-
- /**
- * @static
- * @property 提交成功事件
- */
- SS: 'submitsuccess',
-
- /**
- * @static
- * @property 校验提交前事件
- */
- BVW: 'beforeverifywrite',
-
- /**
- * @static
- * @property 校验提交后事件
- */
- AVW: 'afterverifywrite',
-
- /**
- * @static
- * @property 校验后事件
- */
- AV: 'afterverify',
-
- /**
- * @static
- * @property 填报前事件
- */
- BW: 'beforewrite',
-
- /**
- * @static
- * @property 填报后事件
- */
- AW: 'afterwrite',
-
- /**
- * @static
- * @property 填报成功事件
- */
- WS: 'writesuccess',
-
- /**
- * @static
- * @property 填报失败事件
- */
- WF: 'writefailure',
-
- /**
- * @static
- * @property 添加行前事件
- */
- BA: 'beforeappend',
-
- /**
- * @static
- * @property 添加行后事件
- */
- AA: 'afterappend',
-
- /**
- * @static
- * @property 删除行前事件
- */
- BD: 'beforedelete',
-
- /**
- * @static
- * @property 删除行后事件
- */
- AD: 'beforedelete',
-
- /**
- * @static
- * @property 未提交离开事件
- */
- UC: 'unloadcheck',
-
-
- /**
- * @static
- * @property PDF导出前事件
- */
- BTOPDF: 'beforetopdf',
-
- /**
- * @static
- * @property PDF导出后事件
- */
- ATOPDF: 'aftertopdf',
-
- /**
- * @static
- * @property Excel导出前事件
- */
- BTOEXCEL: 'beforetoexcel',
-
- /**
- * @static
- * @property Excel导出后事件
- */
- ATOEXCEL: 'aftertoexcel',
-
- /**
- * @static
- * @property Word导出前事件
- */
- BTOWORD: 'beforetoword',
-
- /**
- * @static
- * @property Word导出后事件
- */
- ATOWORD: 'aftertoword',
-
- /**
- * @static
- * @property 图片导出前事件
- */
- BTOIMAGE: 'beforetoimage',
-
- /**
- * @static
- * @property 图片导出后事件
- */
- ATOIMAGE: 'aftertoimage',
-
- /**
- * @static
- * @property HTML导出前事件
- */
- BTOHTML: 'beforetohtml',
-
- /**
- * @static
- * @property HTML导出后事件
- */
- ATOHTML: 'aftertohtml',
-
- /**
- * @static
- * @property Excel导入前事件
- */
- BIMEXCEL: 'beforeimportexcel',
-
- /**
- * @static
- * @property Excel导出后事件
- */
- AIMEXCEL: 'afterimportexcel',
-
- /**
- * @static
- * @property PDF打印前事件
- */
- BPDFPRINT: 'beforepdfprint',
-
- /**
- * @static
- * @property PDF打印后事件
- */
- APDFPRINT: 'afterpdfprint',
-
- /**
- * @static
- * @property Flash打印前事件
- */
- BFLASHPRINT: 'beforeflashprint',
-
- /**
- * @static
- * @property Flash打印后事件
- */
- AFLASHPRINT: 'afterflashprint',
-
- /**
- * @static
- * @property Applet打印前事件
- */
- BAPPLETPRINT: 'beforeappletprint',
-
- /**
- * @static
- * @property Applet打印后事件
- */
- AAPPLETPRINT: 'afterappletprint',
-
- /**
- * @static
- * @property 服务器打印前事件
- */
- BSEVERPRINT: 'beforeserverprint',
-
- /**
- * @static
- * @property 服务器打印后事件
- */
- ASERVERPRINT: 'afterserverprint',
-
- /**
- * @static
- * @property 邮件发送前事件
- */
- BEMAIL: 'beforeemail',
-
- /**
- * @static
- * @property 邮件发送后事件
- */
- AEMAIL: 'afteremail'
- }
-});/**
- * guy
- * 最基础的dom操作
- */
-BI.extend(jQuery.fn, {
-
- destroy: function () {
- this.remove();
- if (BI.isIE() === true) {
- this[0].outerHTML = '';
- }
- },
- /**
- * 高亮显示
- * @param text 必需
- * @param keyword
- * @param py 必需
- * @returns {*}
- * @private
- */
- __textKeywordMarked__: function (text, keyword, py) {
- if (!BI.isKey(keyword) || (text + "").length > 100) {
- return this.html(BI.Func.formatSpecialCharInHtml(text));
- }
- keyword = keyword + "";
- keyword = BI.toUpperCase(keyword);
- var textLeft = (text || "") + "";
- py = (py || BI.makeFirstPY(text)) + "";
- if (py != null) {
- py = BI.toUpperCase(py);
- }
- this.empty();
- while (true) {
- var tidx = BI.toUpperCase(textLeft).indexOf(keyword);
- var pidx = null;
- if (py != null) {
- pidx = py.indexOf(keyword);
- if (pidx >= 0) {
- pidx = pidx % text.length;
- }
- }
-
- if (tidx >= 0) {
- this.append(textLeft.substr(0, tidx));
- this.append($("").addClass("bi-keyword-red-mark")
- .html(BI.Func.formatSpecialCharInHtml(textLeft.substr(tidx, keyword.length))));
-
- textLeft = textLeft.substr(tidx + keyword.length);
- if (py != null) {
- py = py.substr(tidx + keyword.length);
- }
- } else if (pidx != null && pidx >= 0 && Math.floor(pidx / text.length) === Math.floor((pidx + keyword.length - 1) / text.length)) {
- this.append(textLeft.substr(0, pidx));
- this.append($("").addClass("bi-keyword-red-mark")
- .html(BI.Func.formatSpecialCharInHtml(textLeft.substr(pidx, keyword.length))));
- if (py != null) {
- py = py.substr(pidx + keyword.length);
- }
- textLeft = textLeft.substr(pidx + keyword.length);
- } else {
- this.append(textLeft);
- break;
- }
- }
-
- return this;
- },
-
- getDomHeight: function (parent) {
- var clone = $(this).clone();
- clone.appendTo($(parent || "body"));
- var height = clone.height();
- clone.remove();
- return height;
- },
-
- //是否有竖直滚动条
- hasVerticalScroll: function () {
- return this.height() > 0 && this[0].clientWidth < this[0].offsetWidth;
- },
-
- //是否有水平滚动条
- hasHorizonScroll: function () {
- return this.width() > 0 && this[0].clientHeight < this[0].offsetHeight;
- },
-
- //获取计算后的样式
- getStyle: function (name) {
- var node = this[0];
- var computedStyle = void 0;
-
- // W3C Standard
- if (window.getComputedStyle) {
- // In certain cases such as within an iframe in FF3, this returns null.
- computedStyle = window.getComputedStyle(node, null);
- if (computedStyle) {
- return computedStyle.getPropertyValue(BI.hyphenate(name));
- }
- }
- // Safari
- if (document.defaultView && document.defaultView.getComputedStyle) {
- computedStyle = document.defaultView.getComputedStyle(node, null);
- // A Safari bug causes this to return null for `display: none` elements.
- if (computedStyle) {
- return computedStyle.getPropertyValue(BI.hyphenate(name));
- }
- if (name === 'display') {
- return 'none';
- }
- }
- // Internet Explorer
- if (node.currentStyle) {
- if (name === 'float') {
- return node.currentStyle.cssFloat || node.currentStyle.styleFloat;
- }
- return node.currentStyle[BI.camelize(name)];
- }
- return node.style && node.style[BI.camelize(name)];
- },
-
- __isMouseInBounds__: function (e) {
- var offset2Body = this.offset();
- return !(e.pageX < offset2Body.left || e.pageX > offset2Body.left + this.outerWidth()
- || e.pageY < offset2Body.top || e.pageY > offset2Body.top + this.outerHeight())
- },
-
- __hasZIndexMask__: function (zindex) {
- return zindex && this.zIndexMask[zindex] != null;
- },
-
- __buildZIndexMask__: function (zindex, domArray) {
- this.zIndexMask = this.zIndexMask || {};//存储z-index的mask
- this.indexMask = this.indexMask || [];//存储mask
- var mask = BI.createWidget({
- type: "bi.center_adapt",
- cls: "bi-z-index-mask",
- items: domArray
- });
-
- mask.element.css({"z-index": zindex});
- BI.createWidget({
- type: "bi.absolute",
- element: this,
- items: [{
- el: mask,
- left: 0,
- right: 0,
- top: 0,
- bottom: 0
- }]
- });
- this.indexMask.push(mask);
- zindex && (this.zIndexMask[zindex] = mask);
- return mask.element;
- },
-
- __releaseZIndexMask__: function (zindex) {
- if (zindex && this.zIndexMask[zindex]) {
- this.indexMask.remove(this.zIndexMask[zindex]);
- this.zIndexMask[zindex].destroy();
- return;
- }
- this.indexMask = this.indexMask || [];
- var indexMask = this.indexMask.pop();
- indexMask && indexMask.destroy();
- }
-});
-
-BI.extend(jQuery, {
-
- getLeftPosition: function (combo, popup, extraWidth) {
- return {
- left: combo.element.offset().left - popup.element.outerWidth() - (extraWidth || 0)
- };
- },
-
- getRightPosition: function (combo, popup, extraWidth) {
- var el = combo.element;
- return {
- left: el.offset().left + el.outerWidth() + (extraWidth || 0)
- }
- },
-
- getTopPosition: function (combo, popup, extraHeight) {
- return {
- top: combo.element.offset().top - popup.element.outerHeight() - (extraHeight || 0)
- };
- },
-
- getBottomPosition: function (combo, popup, extraHeight) {
- var el = combo.element;
- return {
- top: el.offset().top + el.outerHeight() + (extraHeight || 0)
- };
- },
-
- isLeftSpaceEnough: function (combo, popup, extraWidth) {
- return $.getLeftPosition(combo, popup, extraWidth).left >= 0;
- },
-
- isRightSpaceEnough: function (combo, popup, extraWidth) {
- var viewBounds = popup.element.bounds(), windowBounds = $("body").bounds();
- return $.getRightPosition(combo, popup, extraWidth).left + viewBounds.width <= windowBounds.width;
- },
-
- isTopSpaceEnough: function (combo, popup, extraHeight) {
- return $.getTopPosition(combo, popup, extraHeight).top >= 0;
- },
-
- isBottomSpaceEnough: function (combo, popup, extraHeight) {
- var viewBounds = popup.element.bounds(), windowBounds = $("body").bounds();
- return $.getBottomPosition(combo, popup, extraHeight).top + viewBounds.height <= windowBounds.height;
- },
-
- isRightSpaceLarger: function (combo) {
- var windowBounds = $("body").bounds();
- return windowBounds.width - combo.element.offset().left - combo.element.bounds().width >= combo.element.offset().left;
- },
-
- isBottomSpaceLarger: function (combo) {
- var windowBounds = $("body").bounds();
- return windowBounds.height - combo.element.offset().top - combo.element.bounds().height >= combo.element.offset().top;
- },
-
- getLeftAlignPosition: function (combo, popup, extraWidth) {
- var viewBounds = popup.element.bounds(), windowBounds = $("body").bounds();
- var left = combo.element.offset().left + extraWidth;
- if (left + viewBounds.width > windowBounds.width) {
- left = windowBounds.width - viewBounds.width;
- }
- if (left < 0) {
- left = 0;
- }
- return {
- left: left
- }
- },
-
- getLeftAdaptPosition: function (combo, popup, extraWidth) {
- if ($.isLeftSpaceEnough(combo, popup, extraWidth)) {
- return $.getLeftPosition(combo, popup, extraWidth);
- }
- return {
- left: 0
- }
- },
-
- getRightAlignPosition: function (combo, popup, extraWidth) {
- var comboBounds = combo.element.bounds(), viewBounds = popup.element.bounds();
- var left = combo.element.offset().left + comboBounds.width - viewBounds.width - extraWidth;
- if (left < 0) {
- left = 0;
- }
- return {
- left: left
- }
- },
-
- getRightAdaptPosition: function (combo, popup, extraWidth) {
- if ($.isRightSpaceEnough(combo, popup, extraWidth)) {
- return $.getRightPosition(combo, popup, extraWidth);
- }
- return {
- left: $("body").bounds().width - popup.element.bounds().width
- }
- },
-
- getTopAlignPosition: function (combo, popup, extraHeight, needAdaptHeight) {
- var comboOffset = combo.element.offset();
- var comboBounds = combo.element.bounds(), popupBounds = popup.element.bounds(),
- windowBounds = $("body").bounds();
- var top, adaptHeight;
- if ($.isBottomSpaceEnough(combo, popup, -1 * comboBounds.height + extraHeight)) {
- top = comboOffset.top + extraHeight;
- } else if (needAdaptHeight) {
- top = comboOffset.top + extraHeight;
- adaptHeight = windowBounds.height - top;
- } else {
- top = windowBounds.height - popupBounds.height;
- if (top < extraHeight) {
- adaptHeight = windowBounds.height - extraHeight;
- }
- }
- if (top < extraHeight) {
- top = extraHeight;
- }
- return adaptHeight ? {
- top: top,
- adaptHeight: adaptHeight
- } : {
- top: top
- }
- },
-
- getTopAdaptPosition: function (combo, popup, extraHeight, needAdaptHeight) {
- var popupBounds = popup.element.bounds(), windowBounds = $("body").bounds();
- if ($.isTopSpaceEnough(combo, popup, extraHeight)) {
- return $.getTopPosition(combo, popup, extraHeight);
- }
- if (needAdaptHeight) {
- return {
- top: 0,
- adaptHeight: combo.element.offset().top - extraHeight
- }
- }
- if (popupBounds.height + extraHeight > windowBounds.height) {
- return {
- top: 0,
- adaptHeight: windowBounds.height - extraHeight
- }
- }
- return {
- top: 0
- }
- },
-
- getBottomAlignPosition: function (combo, popup, extraHeight, needAdaptHeight) {
- var comboOffset = combo.element.offset();
- var comboBounds = combo.element.bounds(), popupBounds = popup.element.bounds(),
- windowBounds = $("body").bounds();
- var top, adaptHeight;
- if ($.isTopSpaceEnough(combo, popup, -1 * comboBounds.height + extraHeight)) {
- top = comboOffset.top + comboBounds.height - popupBounds.height - extraHeight;
- } else if (needAdaptHeight) {
- top = 0;
- adaptHeight = comboOffset.top + comboBounds.height - extraHeight;
- } else {
- top = 0;
- if (popupBounds.height + extraHeight > windowBounds.height) {
- adaptHeight = windowBounds.height - extraHeight;
- }
- }
- if (top < 0) {
- top = 0;
- }
- return adaptHeight ? {
- top: top,
- adaptHeight: adaptHeight
- } : {
- top: top
- }
- },
-
- getBottomAdaptPosition: function (combo, popup, extraHeight, needAdaptHeight) {
- var comboOffset = combo.element.offset();
- var comboBounds = combo.element.bounds(), popupBounds = popup.element.bounds(),
- windowBounds = $("body").bounds();
- if ($.isBottomSpaceEnough(combo, popup, extraHeight)) {
- return $.getBottomPosition(combo, popup, extraHeight);
- }
- if (needAdaptHeight) {
- return {
- top: comboOffset.top + comboBounds.height + extraHeight,
- adaptHeight: windowBounds.height - comboOffset.top - comboBounds.height - extraHeight
- }
- }
- if (popupBounds.height + extraHeight > windowBounds.height) {
- return {
- top: extraHeight,
- adaptHeight: windowBounds.height - extraHeight
- }
- }
- return {
- top: windowBounds.height - popupBounds.height - extraHeight
- }
- },
-
- getCenterAdaptPosition: function (combo, popup) {
- var comboOffset = combo.element.offset();
- var comboBounds = combo.element.bounds(), popupBounds = popup.element.bounds(),
- windowBounds = $("body").bounds();
- var left;
- if (comboOffset.left + comboBounds.width / 2 + popupBounds.width / 2 > windowBounds.width) {
- left = windowBounds.width - popupBounds.width;
- } else {
- left = comboOffset.left + comboBounds.width / 2 - popupBounds.width / 2;
- }
- if (left < 0) {
- left = 0;
- }
- return {
- left: left
- }
- },
-
- getMiddleAdaptPosition: function (combo, popup) {
- var comboOffset = combo.element.offset();
- var comboBounds = combo.element.bounds(), popupBounds = popup.element.bounds(),
- windowBounds = $("body").bounds();
- var top;
- if (comboOffset.top + comboBounds.height / 2 + popupBounds.height / 2 > windowBounds.height) {
- top = windowBounds.height - popupBounds.height;
- } else {
- top = comboOffset.top + comboBounds.height / 2 - popupBounds.height / 2;
- }
- if (top < 0) {
- top = 0;
- }
- return {
- top: top
- }
- },
-
- getComboPositionByDirections: function (combo, popup, extraWidth, extraHeight, needAdaptHeight, directions) {
- extraWidth || (extraWidth = 0);
- extraHeight || (extraHeight = 0);
- var i, direct;
- var leftRight = [], topBottom = [];
- var isNeedAdaptHeight = false, tbFirst = false, lrFirst = false;
- var left, top, pos;
- for (i = 0; i < directions.length; i++) {
- direct = directions[i];
- switch (direct) {
- case "left":
- leftRight.push(direct);
- break;
- case "right":
- leftRight.push(direct);
- break;
- case "top":
- topBottom.push(direct);
- break;
- case "bottom":
- topBottom.push(direct);
- break;
- }
- }
- for (i = 0; i < directions.length; i++) {
- direct = directions[i];
- switch (direct) {
- case "left":
- if (!isNeedAdaptHeight) {
- var tW = tbFirst ? extraHeight : extraWidth, tH = tbFirst ? 0 : extraHeight;
- if ($.isLeftSpaceEnough(combo, popup, tW)) {
- left = $.getLeftPosition(combo, popup, tW).left;
- if (topBottom[0] === "bottom") {
- pos = $.getTopAlignPosition(combo, popup, tH, needAdaptHeight);
- pos.dir = "left,bottom";
- } else {
- pos = $.getBottomAlignPosition(combo, popup, tH, needAdaptHeight);
- pos.dir = "left,top";
- }
- if (tbFirst) {
- pos.change = "left";
- }
- pos.left = left;
- return pos;
- }
- }
- lrFirst = true;
- break;
- case "right":
- if (!isNeedAdaptHeight) {
- var tW = tbFirst ? extraHeight : extraWidth, tH = tbFirst ? extraWidth : extraHeight;
- if ($.isRightSpaceEnough(combo, popup, tW)) {
- left = $.getRightPosition(combo, popup, tW).left;
- if (topBottom[0] === "bottom") {
- pos = $.getTopAlignPosition(combo, popup, tH, needAdaptHeight);
- pos.dir = "right,bottom";
- } else {
- pos = $.getBottomAlignPosition(combo, popup, tH, needAdaptHeight);
- pos.dir = "right,top";
- }
- if (tbFirst) {
- pos.change = "right";
- }
- pos.left = left;
- return pos;
- }
- }
- lrFirst = true;
- break;
- case "top":
- var tW = lrFirst ? extraHeight : extraWidth, tH = lrFirst ? extraWidth : extraHeight;
- if ($.isTopSpaceEnough(combo, popup, tH)) {
- top = $.getTopPosition(combo, popup, tH).top;
- if (leftRight[0] === "right") {
- pos = $.getLeftAlignPosition(combo, popup, tW, needAdaptHeight);
- pos.dir = "top,right";
- } else {
- pos = $.getRightAlignPosition(combo, popup, tW);
- pos.dir = "top,left";
- }
- if (lrFirst) {
- pos.change = "top";
- }
- pos.top = top;
- return pos;
- }
- if (needAdaptHeight) {
- isNeedAdaptHeight = true;
- }
- tbFirst = true;
- break;
- case "bottom":
- var tW = lrFirst ? extraHeight : extraWidth, tH = lrFirst ? extraWidth : extraHeight;
- if ($.isBottomSpaceEnough(combo, popup, tH)) {
- top = $.getBottomPosition(combo, popup, tH).top;
- if (leftRight[0] === "right") {
- pos = $.getLeftAlignPosition(combo, popup, tW, needAdaptHeight);
- pos.dir = "bottom,right";
- } else {
- pos = $.getRightAlignPosition(combo, popup, tW);
- pos.dir = "bottom,left";
- }
- if (lrFirst) {
- pos.change = "bottom";
- }
- pos.top = top;
- return pos;
- }
- if (needAdaptHeight) {
- isNeedAdaptHeight = true;
- }
- tbFirst = true;
- break;
- }
- }
-
- switch (directions[0]) {
- case "left":
- case "right":
- if ($.isRightSpaceLarger(combo)) {
- left = $.getRightAdaptPosition(combo, popup, extraWidth).left;
- } else {
- left = $.getLeftAdaptPosition(combo, popup, extraWidth).left;
- }
- if (topBottom[0] === "bottom") {
- pos = $.getTopAlignPosition(combo, popup, extraHeight, needAdaptHeight);
- pos.left = left;
- pos.dir = directions[0] + ",bottom";
- return pos;
- }
- pos = $.getBottomAlignPosition(combo, popup, extraHeight, needAdaptHeight);
- pos.left = left;
- pos.dir = directions[0] + ",top";
- return pos;
- default :
- if ($.isBottomSpaceLarger(combo)) {
- pos = $.getBottomAdaptPosition(combo, popup, extraHeight, needAdaptHeight);
- } else {
- pos = $.getTopAdaptPosition(combo, popup, extraHeight, needAdaptHeight);
- }
- if (leftRight[0] === "right") {
- left = $.getLeftAlignPosition(combo, popup, extraWidth, needAdaptHeight).left;
- pos.left = left;
- pos.dir = directions[0] + ",right";
- return pos;
- }
- left = $.getRightAlignPosition(combo, popup, extraWidth).left;
- pos.left = left;
- pos.dir = directions[0] + ",left";
- return pos;
- }
- },
-
-
- getComboPosition: function (combo, popup, extraWidth, extraHeight, needAdaptHeight, directions, offsetStyle) {
- extraWidth || (extraWidth = 0);
- extraHeight || (extraHeight = 0);
- var bodyHeight = $("body").bounds().height - extraHeight;
- var maxHeight = Math.min(popup.attr("maxHeight") || bodyHeight, bodyHeight);
- popup.resetHeight && popup.resetHeight(maxHeight);
- var position = $.getComboPositionByDirections(combo, popup, extraWidth, extraHeight, needAdaptHeight, directions || ['bottom', 'top', 'right', 'left']);
- switch (offsetStyle) {
- case "center":
- if (position.change) {
- var p = $.getMiddleAdaptPosition(combo, popup);
- position.top = p.top;
- } else {
- var p = $.getCenterAdaptPosition(combo, popup);
- position.left = p.left;
- }
- break;
- case "middle":
- if (position.change) {
- var p = $.getCenterAdaptPosition(combo, popup);
- position.left = p.left;
- } else {
- var p = $.getMiddleAdaptPosition(combo, popup);
- position.top = p.top;
- }
- break;
- }
- if (needAdaptHeight === true) {
- popup.resetHeight && popup.resetHeight(Math.min(bodyHeight - position.top, maxHeight));
- }
- return position;
- }
-});/**
- * 基本的函数
- * Created by GUY on 2015/6/24.
- */
-BI.Func = {};
-BI.extend(BI.Func, {
- /**
- * 创建唯一的名字
- * @param array
- * @param name
- * @returns {*}
- */
- createDistinctName: function (array, name) {
- var src = name, idx = 1;
- name = name || "";
- while (true) {
- if (BI.every(array, function (i, item) {
- return item.name !== name;
- })) {
- break;
- }
- name = src + (idx++);
- }
- return name;
- },
- /**
- * 获取搜索结果
- * @param items
- * @param keyword
- * @param param 搜索哪个属性
- */
- getSearchResult: function (items, keyword, param) {
- var isArray = BI.isArray(items);
- items = isArray ? BI.flatten(items) : items;
- param || (param = "text");
- if (!BI.isKey(keyword)) {
- return {
- finded: BI.deepClone(items),
- matched: isArray ? [] : {}
- };
- }
- var t, text, py;
- keyword = BI.toUpperCase(keyword);
- var matched = isArray ? [] : {}, finded = isArray ? [] : {};
- BI.each(items, function (i, item) {
- item = BI.deepClone(item);
- t = BI.stripEL(item);
- text = t[param] || t.text || t.value || t.name || t;
- py = BI.makeFirstPY(text);
- text = BI.toUpperCase(text);
- py = BI.toUpperCase(py);
- var pidx;
- if (text.indexOf(keyword) > -1) {
- if (text === keyword) {
- isArray ? matched.push(item) : (matched[i] = item);
- } else {
- isArray ? finded.push(item) : (finded[i] = item);
- }
- } else if (pidx = py.indexOf(keyword), (pidx > -1 && Math.floor(pidx / text.length) === Math.floor((pidx + keyword.length - 1) / text.length))) {
- if (text === keyword || keyword.length === text.length) {
- isArray ? matched.push(item) : (matched[i] = item);
- } else {
- isArray ? finded.push(item) : (finded[i] = item);
- }
- }
- });
- return {
- matched: matched,
- finded: finded
- }
- },
-
- /**
- * 将字符串中的尖括号等字符encode成html能解析的形式
- * @param str
- */
- formatSpecialCharInHtml: function (str) {
- return (str + "").replaceAll("\\s|<=?|>=?", function (str) {
- switch (str) {
- case "<":
- return "<";
- case "<=":
- return "≤";
- case ">":
- return ">";
- case ">=":
- return "≥";
- default:
- return " ";
- }
- });
- }
-});
-
-/**
- * 对DOM操作的通用函数
- * @type {{}}
- */
-BI.DOM = {};
-BI.extend(BI.DOM, {
-
- /**
- * 把dom数组或元素悬挂起来,使其不对html产生影响
- * @param dom
- */
- hang: function (doms) {
- if (BI.isEmpty(doms)) {
- return;
- }
- var frag = document.createDocumentFragment();
- BI.each(doms, function (i, dom) {
- dom instanceof BI.Widget && (dom = dom.element);
- dom instanceof $ && dom[0] && frag.appendChild(dom[0]);
- });
- return frag;
- },
-
- isExist: function (obj) {
- return $("body").find(obj.element).length > 0;
- },
-
- //预加载图片
- preloadImages: function (srcArray, onload) {
- var count = 0, images = [];
-
- function complete() {
- count++;
- if (count >= srcArray.length) {
- onload();
- }
- }
-
- BI.each(srcArray, function (i, src) {
- images[i] = new Image();
- images[i].src = src;
- images[i].onload = function () {
- complete()
- };
- images[i].onerror = function () {
- complete()
- };
- });
- },
-
- isColor: function (color) {
- return color && (this.isRGBColor(color) || this.isHexColor(color));
- },
-
- isRGBColor: function (color) {
- if (!color) {
- return false;
- }
- return color.substr(0, 3) === "rgb";
- },
-
- isHexColor: function (color) {
- if (!color) {
- return false;
- }
- return color[0] === "#" && color.length === 7;
- },
-
- isDarkColor: function (hex) {
- if (!hex || !this.isHexColor(hex)) {
- return false;
- }
- var rgb = this.rgb2json(this.hex2rgb(hex));
- var grayLevel = Math.round(rgb.r * 0.299 + rgb.g * 0.587 + rgb.b * 0.114);
- if (grayLevel < 192/**网上给的是140**/) {
- return true;
- }
- return false;
- },
-
- //获取对比颜色
- getContrastColor: function (color) {
- if (!color || !this.isColor(color)) {
- return "";
- }
- if (this.isDarkColor(color)) {
- return "#ffffff";
- }
- return "#1a1a1a";
- },
-
- rgb2hex: function (rgbColour) {
- if (!rgbColour || rgbColour.substr(0, 3) != "rgb") {
- return "";
- }
- var rgbValues = rgbColour.match(/\d+(\.\d+)?/g);
- var red = BI.parseInt(rgbValues[0]);
- var green = BI.parseInt(rgbValues[1]);
- var blue = BI.parseInt(rgbValues[2]);
-
- var hexColour = "#" + this.int2hex(red) + this.int2hex(green) + this.int2hex(blue);
-
- return hexColour;
- },
-
- rgb2json: function (rgbColour) {
- if (!rgbColour) {
- return {};
- }
- if (!this.isRGBColor(rgbColour)) {
- return {};
- }
- var rgbValues = rgbColour.match(/\d+(\.\d+)?/g);
- return {
- r: BI.parseInt(rgbValues[0]),
- g: BI.parseInt(rgbValues[1]),
- b: BI.parseInt(rgbValues[2])
- };
- },
-
- rgba2json: function (rgbColour) {
- if (!rgbColour) {
- return {};
- }
- var rgbValues = rgbColour.match(/\d+(\.\d+)?/g);
- return {
- r: BI.parseInt(rgbValues[0]),
- g: BI.parseInt(rgbValues[1]),
- b: BI.parseInt(rgbValues[2]),
- a: BI.parseFloat(rgbValues[3])
- };
- },
-
- json2rgb: function (rgb) {
- if (!BI.isKey(rgb.r) || !BI.isKey(rgb.g) || !BI.isKey(rgb.b)) {
- return "";
- }
- return "rgb(" + rgb.r + "," + rgb.g + "," + rgb.b + ")";
- },
-
- json2rgba: function (rgba) {
- if (!BI.isKey(rgba.r) || !BI.isKey(rgba.g) || !BI.isKey(rgba.b)) {
- return "";
- }
- return "rgba(" + rgba.r + "," + rgba.g + "," + rgba.b + "," + rgba.a + ")";
- },
-
- int2hex: function (strNum) {
- var hexdig = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
-
- return hexdig[strNum >>> 4] + '' + hexdig[strNum & 15];
- },
-
- hex2rgb: function (color) {
- if (!color) {
- return "";
- }
- if (!this.isHexColor(color)) {
- return color;
- }
- var tempValue = "rgb(", colorArray;
-
- if (color.length === 7) {
- colorArray = [BI.parseInt('0x' + color.substring(1, 3)),
- BI.parseInt('0x' + color.substring(3, 5)),
- BI.parseInt('0x' + color.substring(5, 7))];
- }
- else if (color.length === 4) {
- colorArray = [BI.parseInt('0x' + color.substring(1, 2)),
- BI.parseInt('0x' + color.substring(2, 3)),
- BI.parseInt('0x' + color.substring(3, 4))];
- }
- tempValue += colorArray[0] + ",";
- tempValue += colorArray[1] + ",";
- tempValue += colorArray[2] + ")";
-
- return tempValue;
- },
-
- rgba2rgb: function (rgbColour, BGcolor) {
- if (BI.isNull(BGcolor)) {
- BGcolor = 1;
- }
- if (rgbColour.substr(0, 4) != "rgba") {
- return "";
- }
- var rgbValues = rgbColour.match(/\d+(\.\d+)?/g);
- if (rgbValues.length < 4) {
- return "";
- }
- var R = BI.parseFloat(rgbValues[0]);
- var G = BI.parseFloat(rgbValues[1]);
- var B = BI.parseFloat(rgbValues[2]);
- var A = BI.parseFloat(rgbValues[3]);
-
- return "rgb(" + Math.floor(255 * (BGcolor * (1 - A )) + R * A) + "," +
- Math.floor(255 * (BGcolor * (1 - A )) + G * A) + "," +
- Math.floor(255 * (BGcolor * (1 - A )) + B * A) + ")";
- },
-
- getTextSizeWidth: function (text, fontSize) {
- var span = $("").addClass("text-width-span").appendTo($("body"));
-
- if (fontSize == null) {
- fontSize = 12;
- }
- fontSize = fontSize + "px";
-
- span.css("font-size", fontSize).text(text);
-
- var width = span.width();
- span.remove();
-
- return width;
- },
-
- //获取滚动条的宽度
- getScrollWidth: function () {
- if (this._scrollWidth == null) {
- var ul = $("").width(50).height(50).css({
- position: "absolute",
- top: "-9999px",
- overflow: "scroll"
- }).appendTo($("body"));
- this._scrollWidth = ul[0].offsetWidth - ul[0].clientWidth;
- ul.destroy();
- }
- return this._scrollWidth;
- }
-});;(function () {
- var constantInjection = {};
- BI.constant = function (xtype, cls) {
- if (constantInjection[xtype] != null) {
- throw ("constant:[" + xtype + "] has been registed");
- }
- constantInjection[xtype] = cls;
- };
-
- var modelInjection = {};
- BI.model = function (xtype, cls) {
- if (modelInjection[xtype] != null) {
- throw ("model:[" + xtype + "] has been registed");
- }
- modelInjection[xtype] = cls;
- };
-
- var storeInjection = {};
- BI.store = function (xtype, cls) {
- if (storeInjection[xtype] != null) {
- throw ("store:[" + xtype + "] has been registed");
- }
- storeInjection[xtype] = cls;
- };
-
- var serviceInjection = {};
- BI.service = function (xtype, cls) {
- if (serviceInjection[xtype] != null) {
- throw ("service:[" + xtype + "] has been registed");
- }
- serviceInjection[xtype] = cls;
- };
-
- var providerInjection = {};
- BI.provider = function (xtype, cls) {
- if (providerInjection[xtype] != null) {
- throw ("provider:[" + xtype + "] has been registed");
- }
- providerInjection[xtype] = cls;
- };
-
- BI.config = function (type, configFn) {
- if (constantInjection[type]) {
- return constantInjection[type] = configFn(constantInjection[type]);
- }
- if (providerInjection[type]) {
- if (!providers[type]) {
- providers[type] = new providerInjection[type]();
- }
- return configFn(providers[type])
- }
- }
-
- var actions = {}
- BI.action = function (type, actionFn) {
- if (!actions[type]) {
- actions[type] = [];
- }
- actions[type].push(actionFn)
- return function () {
- actions[type].remove(actionFn);
- if (actions[type].length === 0) {
- delete actions[type];
- }
- }
- }
-
- BI.Constants = {
- getConstant: function (type) {
- return constantInjection[type];
- }
- }
-
- BI.Models = {
- getModel: function (type, config) {
- return new modelInjection[type](config);
- }
- }
-
- var stores = {};
-
- BI.Stores = {
- getStore: function (type, config) {
- if (stores[type]) {
- return stores[type];
- }
- return stores[type] = new storeInjection[type](config);
- },
- releaseStore: function (type) {
- delete stores[type];
- }
- }
-
- var services = {};
-
- BI.Services = {
- getService: function (type, config) {
- if (services[type]) {
- return services[type];
- }
- return services[type] = new serviceInjection[type](config);
- },
- releaseService: function (type) {
- delete services[type];
- }
- }
-
- var providers = {}, providerInstance = {}
-
- BI.Providers = {
- getProvider: function (type, config) {
- if (!providers[type]) {
- providers[type] = new providerInjection[type]();
- }
- if (!providerInstance[type]) {
- providerInstance[type] = new providers[type].$get()(config);
- }
- return providerInstance[type];
- },
- releaseProvider: function (type) {
- delete providers[type];
- delete providerInstance[type];
- }
- }
-
- BI.Actions = {
- runAction: function (type, config) {
- BI.each(actions[type], function (i, act) {
- act(config);
- })
- }
- }
-})();
-/**
- * guy
- * 检测某个Widget的EventChange事件然后去show某个card
- * @type {*|void|Object}
- * @class BI.ShowListener
- * @extends BI.OB
- */
-BI.ShowListener = BI.inherit(BI.OB, {
- _defaultConfig: function () {
- return BI.extend(BI.ShowListener.superclass._defaultConfig.apply(this, arguments), {
- eventObj: BI.createWidget(),
- cardLayout: null,
- cardNameCreator: function (v) {
- return v;
- },
- cardCreator: BI.emptyFn,
- afterCardCreated: BI.emptyFn,
- afterCardShow: BI.emptyFn
- });
- },
-
- _init: function () {
- BI.ShowListener.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- o.eventObj.on(BI.Controller.EVENT_CHANGE, function (type, v, ob) {
- if (type === BI.Events.CLICK) {
- v = v || o.eventObj.getValue();
- v = BI.isArray(v) ? (v.length > 1 ? v.toString() : v[0]) : v;
- if (BI.isNull(v)) {
- throw new Error("value cannot be null");
- }
- var cardName = o.cardNameCreator(v);
- if (!o.cardLayout.isCardExisted(cardName)) {
- var card = o.cardCreator(cardName);
- o.cardLayout.addCardByName(cardName, card);
- o.afterCardCreated(cardName);
- }
- o.cardLayout.showCardByName(cardName);
- BI.nextTick(function () {
- o.afterCardShow(cardName);
- self.fireEvent(BI.ShowListener.EVENT_CHANGE, cardName);
- });
- }
- })
- }
-});
-BI.ShowListener.EVENT_CHANGE = "ShowListener.EVENT_CHANGE";/**
- * style加载管理器
- *
- * Created by GUY on 2015/9/7.
- * @class
- */
-BI.StyleLoaderManager = BI.inherit(BI.OB, {
- _defaultConfig: function () {
- return BI.extend(BI.StyleLoaderManager.superclass._defaultConfig.apply(this, arguments), {});
- },
-
- _init: function () {
- BI.StyleLoaderManager.superclass._init.apply(this, arguments);
- this.stylesManager = {};
- },
-
- loadStyle: function (name, styleString) {
- var d = document, styles = d.createElement('style');
- d.getElementsByTagName('head')[0].appendChild(styles);
- styles.setAttribute('type', 'text/css');
- if (styles.styleSheet) {
- styles.styleSheet.cssText = styleString;
- } else {
- styles.appendChild(document.createTextNode(styleString));
- }
- this.stylesManager[name] = styles;
-
- return this;
- },
-
- get: function (name) {
- return this.stylesManager[name];
- },
-
- has: function (name) {
- return this.stylesManager[name] != null;
- },
-
- removeStyle: function (name) {
- if (!this.has(name)) {
- return this;
- }
- this.stylesManager[name].parentNode.removeChild(this.stylesManager[name]);
- delete this.stylesManager[name];
- return this;
- }
-});/**
- * @class BI.Logic
- * @extends BI.OB
- */
-BI.Logic = BI.inherit(BI.OB, {
- createLogic: function () {
- return this.options || {};
- }
-});
-
-BI.LogicFactory = {
- Type: {
- Vertical: "vertical",
- Horizontal: "horizontal",
- Table: "table",
- HorizontalFill: "horizontal_fill"
- },
- createLogic: function (key, options) {
- var logic;
- switch (key) {
- case BI.LogicFactory.Type.Vertical:
- logic = BI.VerticalLayoutLogic;
- break;
- case BI.LogicFactory.Type.Horizontal:
- logic = BI.HorizontalLayoutLogic;
- break;
- case BI.LogicFactory.Type.Table:
- logic = BI.TableLayoutLogic;
- break;
- case BI.LogicFactory.Type.HorizontalFill:
- logic = BI.HorizontalFillLayoutLogic;
- break;
- default :
- logic = BI.Logic;
- break;
- }
- return new logic(options).createLogic();
- },
-
- createLogicTypeByDirection: function (direction) {
- switch (direction) {
- case BI.Direction.Top:
- case BI.Direction.Bottom:
- case BI.Direction.Custom:
- return BI.LogicFactory.Type.Vertical;
- break;
- case BI.Direction.Left:
- case BI.Direction.Right:
- return BI.LogicFactory.Type.Horizontal;
- }
- },
-
- createLogicItemsByDirection: function (direction) {
- var layout;
- var items = Array.prototype.slice.call(arguments, 1);
- items = BI.map(items, function (i, item) {
- if (BI.isWidget(item)) {
- return {
- el: item,
- width: item.options.width,
- height: item.options.height
- }
- }
- return item;
- });
- switch (direction) {
- case BI.Direction.Bottom:
- layout = BI.LogicFactory.Type.Vertical;
- items.reverse();
- break;
- case BI.Direction.Right:
- layout = BI.LogicFactory.Type.Horizontal;
- items.reverse();
- break;
- case BI.Direction.Custom:
- items = items.slice(1);
- break;
- }
- return items;
- }
-};/**
- * guy
- * 上下布局逻辑
- * 上下布局的时候要考虑到是动态布局还是静态布局
- *
- * @class BI.VerticalLayoutLogic
- * @extends BI.Logic
- */
-BI.VerticalLayoutLogic = BI.inherit(BI.Logic, {
- _defaultConfig: function () {
- return BI.extend(BI.VerticalLayoutLogic.superclass._defaultConfig.apply(this, arguments), {
- dynamic: false,
- scrollable: null,
- scrolly: false,
- scrollx: false,
- items: [],
- hgap: 0,
- vgap: 0,
- lgap: 0,
- rgap: 0,
- tgap: 0,
- bgap: 0
- });
- },
-
- createLogic: function () {
- var layout, o = this.options;
- if (o.dynamic) {
- layout = "bi.vertical";
- } else {
- layout = "bi.vtape";
- }
- return {
- type: layout,
- scrollable: o.scrollable,
- scrolly: o.scrolly,
- scrollx: o.scrollx,
- hgap: o.hgap,
- vgap: o.vgap,
- lgap: o.lgap,
- rgap: o.rgap,
- tgap: o.tgap,
- bgap: o.bgap,
- items: o.items
- }
- },
-
- _init: function () {
- BI.VerticalLayoutLogic.superclass._init.apply(this, arguments);
- }
-});
-
-
-/**
- * guy
- * 左右布局逻辑
- * 左右布局的时候要考虑到是动态布局还是静态布局
- *
- * @class BI.HorizontalLayoutLogic
- * @extends BI.Logic
- */
-BI.HorizontalLayoutLogic = BI.inherit(BI.Logic, {
- _defaultConfig: function () {
- return BI.extend(BI.HorizontalLayoutLogic.superclass._defaultConfig.apply(this, arguments), {
- dynamic: false,
- scrollable: null,
- scrolly: false,
- scrollx: false,
- items: [],
- hgap: 0,
- vgap: 0,
- lgap: 0,
- rgap: 0,
- tgap: 0,
- bgap: 0
- });
- },
-
- createLogic: function () {
- var layout, o = this.options;
- if (o.dynamic) {
- layout = "bi.vertical_adapt";
- } else {
- layout = "bi.htape";
- }
- return {
- type: layout,
- scrollable: o.scrollable,
- scrolly: o.scrolly,
- scrollx: o.scrollx,
- hgap: o.hgap,
- vgap: o.vgap,
- lgap: o.lgap,
- rgap: o.rgap,
- tgap: o.tgap,
- bgap: o.bgap,
- items: o.items
- }
- },
-
- _init: function () {
- BI.HorizontalLayoutLogic.superclass._init.apply(this, arguments);
- }
-});
-
-/**
- * guy
- * 表格布局逻辑
- * 表格布局的时候要考虑到是动态布局还是静态布局
- *
- * @class BI.TableLayoutLogic
- * @extends BI.OB
- */
-BI.TableLayoutLogic = BI.inherit(BI.Logic, {
- _defaultConfig: function () {
- return BI.extend(BI.TableLayoutLogic.superclass._defaultConfig.apply(this, arguments), {
- dynamic: false,
- scrollable: null,
- scrolly: false,
- scrollx: false,
- columns: 0,
- rows: 0,
- columnSize: [],
- rowSize: [],
- hgap: 0,
- vgap: 0,
- items: []
- });
- },
-
- createLogic: function () {
- var layout, o = this.options;
- if (o.dynamic) {
- layout = "bi.table";
- } else {
- layout = "bi.window";
- }
- return {
- type: layout,
- scrollable: o.scrollable,
- scrolly: o.scrolly,
- scrollx: o.scrollx,
- columns: o.columns,
- rows: o.rows,
- columnSize: o.columnSize,
- rowSize: o.rowSize,
- hgap: o.hgap,
- vgap: o.vgap,
- items: o.items
- }
- },
-
- _init: function () {
- BI.TableLayoutLogic.superclass._init.apply(this, arguments);
- }
-});
-
-/**
- * guy
- * 左右充满布局逻辑
- *
- * @class BI.HorizontalFillLayoutLogic
- * @extends BI.Logic
- */
-BI.HorizontalFillLayoutLogic = BI.inherit(BI.Logic, {
- _defaultConfig: function () {
- return BI.extend(BI.HorizontalFillLayoutLogic.superclass._defaultConfig.apply(this, arguments), {
- dynamic: false,
- scrollable: null,
- scrolly: false,
- scrollx: false,
- items: [],
- hgap: 0,
- vgap: 0,
- lgap: 0,
- rgap: 0,
- tgap: 0,
- bgap: 0
- });
- },
-
- createLogic: function () {
- var layout, o = this.options;
- var columnSize = [];
- BI.each(o.items, function (i, item) {
- columnSize.push(item.width || 0);
- });
- if (o.dynamic) {
- layout = "bi.horizontal_adapt";
- } else {
- layout = "bi.htape";
- }
- return {
- type: layout,
- columnSize: columnSize,
- scrollable: o.scrollable,
- scrolly: o.scrolly,
- scrollx: o.scrollx,
- hgap: o.hgap,
- vgap: o.vgap,
- lgap: o.lgap,
- rgap: o.rgap,
- tgap: o.tgap,
- bgap: o.bgap,
- items: o.items
- }
- },
-
- _init: function () {
- BI.HorizontalFillLayoutLogic.superclass._init.apply(this, arguments);
- }
-});BI.Plugin = BI.Plugin || {};
-;
-(function () {
- var _WidgetsPlugin = {};
- var _ObjectPlugin = {};
- BI.extend(BI.Plugin, {
-
- getWidget: function (type, options) {
- if (_WidgetsPlugin[type]) {
- var res;
- for (var i = _WidgetsPlugin[type].length-1; i >=0; i--) {
- if (res = _WidgetsPlugin[type][i](options)) {
- return res;
- }
- }
- }
- return options;
- },
-
- registerWidget: function (type, fn) {
- if (!_WidgetsPlugin[type]) {
- _WidgetsPlugin[type] = [];
- }
- if (_WidgetsPlugin[type].length > 0) {
- console.log("组件已经注册过了!");
- }
- _WidgetsPlugin[type].push(fn);
- },
-
- relieveWidget: function (type) {
- delete _WidgetsPlugin[type];
- },
-
- getObject: function (type, object) {
- if (_ObjectPlugin[type]) {
- var res;
- for (var i = 0, len = _ObjectPlugin[type].length; i < len; i++) {
- res = _ObjectPlugin[type][i](object);
- }
- }
- return res || object;
- },
-
- registerObject: function (type, fn) {
- if (!_ObjectPlugin[type]) {
- _ObjectPlugin[type] = [];
- }
- if (_ObjectPlugin[type].length > 0) {
- console.log("对象已经注册过了!");
- }
- _ObjectPlugin[type].push(fn);
- },
-
- relieveObject: function (type) {
- delete _ObjectPlugin[type];
- }
- });
-})();/**
- * 对数组对象的扩展
- * @class Array
- */
-$.extend(Array.prototype, {
- contains: function (o) {
- return this.indexOf(o) > -1;
- },
-
- /**
- * 从数组中移除指定的值,如果值不在数组中,则不产生任何效果
- * @param {Object} o 要移除的值
- * @return {Array} 移除制定值后的数组
- */
- remove: function (o) {
- var index = this.indexOf(o);
- if (index !== -1) {
- this.splice(index, 1);
- }
- return this;
- },
-
- pushArray: function (array) {
- for (var i = 0; i < array.length; i++) {
- this.push(array[i]);
- }
- },
- pushDistinct: function (obj) {
- if (!this.contains(obj)) {
- this.push(obj);
- }
- },
- pushDistinctArray: function (array) {
- for (var i = 0, len = array.length; i < len; i++) {
- this.pushDistinct(array[i]);
- }
- }
-});
-$(function () {
- //牵扯到国际化这些常量在页面加载后再生效
- // full day names
- Date._DN = [BI.i18nText("BI-Basic_Sunday"),
- BI.i18nText("BI-Basic_Monday"),
- BI.i18nText("BI-Basic_Tuesday"),
- BI.i18nText("BI-Basic_Wednesday"),
- BI.i18nText("BI-Basic_Thursday"),
- BI.i18nText("BI-Basic_Friday"),
- BI.i18nText("BI-Basic_Saturday"),
- BI.i18nText("BI-Basic_Sunday")];
-
- // short day names
- Date._SDN = [BI.i18nText("BI-Basic_Simple_Sunday"),
- BI.i18nText("BI-Basic_Simple_Monday"),
- BI.i18nText("BI-Basic_Simple_Tuesday"),
- BI.i18nText("BI-Basic_Simple_Wednesday"),
- BI.i18nText("BI-Basic_Simple_Thursday"),
- BI.i18nText("BI-Basic_Simple_Friday"),
- BI.i18nText("BI-Basic_Simple_Saturday"),
- BI.i18nText("BI-Basic_Simple_Sunday")];
-
- // Monday first, etc.
- Date._FD = 1;
-
- // full month namesdat
- Date._MN = [
- BI.i18nText("BI-Basic_January"),
- BI.i18nText("BI-Basic_February"),
- BI.i18nText("BI-Basic_March"),
- BI.i18nText("BI-Basic_April"),
- BI.i18nText("BI-Basic_May"),
- BI.i18nText("BI-Basic_June"),
- BI.i18nText("BI-Basic_July"),
- BI.i18nText("BI-Basic_August"),
- BI.i18nText("BI-Basic_September"),
- BI.i18nText("BI-Basic_October"),
- BI.i18nText("BI-Basic_November"),
- BI.i18nText("BI-Basic_December")];
-
- // short month names
- Date._SMN = [0,
- 1,
- 2,
- 3,
- 4,
- 5,
- 6,
- 7,
- 8,
- 9,
- 10,
- 11];
-
- Date._QN = ["", BI.i18nText("BI-Quarter_1"),
- BI.i18nText("BI-Quarter_2"),
- BI.i18nText("BI-Quarter_3"),
- BI.i18nText("BI-Quarter_4")];
-
- /** Adds the number of days array to the Date object. */
- Date._MD = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
-})
-
-/** Constants used for time computations */
-Date.SECOND = 1000 /* milliseconds */;
-Date.MINUTE = 60 * Date.SECOND;
-Date.HOUR = 60 * Date.MINUTE;
-Date.DAY = 24 * Date.HOUR;
-Date.WEEK = 7 * Date.DAY;
-
-/**
- * 获取时区
- * @returns {String}
- */
-Date.prototype.getTimezone = function () {
- return this.toString().replace(/^.* (?:\((.*)\)|([A-Z]{1,4})(?:[\-+][0-9]{4})?(?: -?\d+)?)$/, "$1$2").replace(/[^A-Z]/g, "");
-};
-
-/** Returns the number of days in the current month */
-Date.prototype.getMonthDays = function (month) {
- var year = this.getFullYear();
- if (typeof month == "undefined") {
- month = this.getMonth();
- }
- if (((0 == (year % 4)) && ( (0 != (year % 100)) || (0 == (year % 400)))) && month == 1) {
- return 29;
- } else {
- return Date._MD[month];
- }
-};
-
-/**
- * 获取每月的最后一天
- * @returns {Date}
- */
-Date.prototype.getLastDateOfMonth = function () {
- return Date.getDate(this.getFullYear(), this.getMonth(), this.getMonthDays());
-};
-
-/** Returns the number of day in the year. */
-Date.prototype.getDayOfYear = function () {
- var now = Date.getDate(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
- var then = Date.getDate(this.getFullYear(), 0, 0, 0, 0, 0);
- var time = now - then;
- return Math.floor(time / Date.DAY);
-};
-
-/** Returns the number of the week in year, as defined in ISO 8601. */
-Date.prototype.getWeekNumber = function () {
- var d = Date.getDate(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
- //周一是一周第一天
- var week = d.getDay();
- if (this.getMonth() === 0 && this.getDate() <= week) {
- return 1;
- }
- d.setDate(this.getDate() - week);
- var ms = d.valueOf(); // GMT
- d.setMonth(0);
- d.setDate(1);
- var offset = Math.floor((ms - d.valueOf()) / (7 * 864e5)) + 1;
- if (d.getDay() > 0) {
- offset++;
- }
- return offset;
-};
-
-Date.prototype.getQuarter = function () {
- return Math.floor(this.getMonth() / 3) + 1;
-};
-
-//离当前时间多少天的时间
-Date.prototype.getOffsetDate = function (offset) {
- return Date.getDate(this.getTime() + offset * 864e5);
-};
-
-Date.prototype.getAfterMulQuarter = function (n) {
- var dt = Date.getDate(this.getTime());
- dt.setMonth(dt.getMonth() + n * 3);
- return dt;
-};
-//获得n个季度前的日期
-Date.prototype.getBeforeMulQuarter = function (n) {
- var dt = Date.getDate(this.getTime());
- dt.setMonth(dt.getMonth() - n * 3);
- return dt;
-};
-//得到本季度的起始月份
-Date.prototype.getQuarterStartMonth = function () {
- var quarterStartMonth = 0;
- var nowMonth = this.getMonth();
- if (nowMonth < 3) {
- quarterStartMonth = 0;
- }
- if (2 < nowMonth && nowMonth < 6) {
- quarterStartMonth = 3;
- }
- if (5 < nowMonth && nowMonth < 9) {
- quarterStartMonth = 6;
- }
- if (nowMonth > 8) {
- quarterStartMonth = 9;
- }
- return quarterStartMonth;
-};
-//获得本季度的起始日期
-Date.prototype.getQuarterStartDate = function () {
- return Date.getDate(this.getFullYear(), this.getQuarterStartMonth(), 1);
-};
-//得到本季度的结束日期
-Date.prototype.getQuarterEndDate = function () {
- var quarterEndMonth = this.getQuarterStartMonth() + 2;
- return Date.getDate(this.getFullYear(), quarterEndMonth, this.getMonthDays(quarterEndMonth));
-};
-Date.prototype.getAfterMultiMonth = function (n) {
- var dt = Date.getDate(this.getTime());
- dt.setMonth(dt.getMonth() + n | 0);
- return dt;
-};
-Date.prototype.getBeforeMultiMonth = function (n) {
- var dt = Date.getDate(this.getTime());
- dt.setMonth(dt.getMonth() - n | 0);
- return dt;
-};
-
-Date.prototype.getAfterMulQuarter = function (n) {
- var dt = Date.getDate(this.getTime());
- dt.setMonth(dt.getMonth() + n * 3);
- return dt;
-};
-//获得n个季度前的日期
-Date.prototype.getBeforeMulQuarter = function (n) {
- var dt = Date.getDate(this.getTime());
- dt.setMonth(dt.getMonth() - n * 3);
- return dt;
-};
-//得到本季度的起始月份
-Date.prototype.getQuarterStartMonth = function () {
- var quarterStartMonth = 0;
- var nowMonth = this.getMonth();
- if (nowMonth < 3) {
- quarterStartMonth = 0;
- }
- if (2 < nowMonth && nowMonth < 6) {
- quarterStartMonth = 3;
- }
- if (5 < nowMonth && nowMonth < 9) {
- quarterStartMonth = 6;
- }
- if (nowMonth > 8) {
- quarterStartMonth = 9;
- }
- return quarterStartMonth;
-};
-
-//指定日期n个月之前或之后的日期
-Date.prototype.getOffsetMonth = function (n) {
- var dt = Date.getDate(this.getTime());
- var day = dt.getDate();
- var monthDay = Date.getDate(dt.getFullYear(), dt.getMonth() + parseInt(n), 1).getMonthDays();
- if (day > monthDay) {
- day = monthDay;
- }
- dt.setDate(day);
- dt.setMonth(dt.getMonth() + parseInt(n));
- return dt;
-};
-
-//获得本周的起始日期
-Date.prototype.getWeekStartDate = function () {
- var w = this.getDay();
- return this.getOffsetDate(-w);
-};
-//得到本周的结束日期
-Date.prototype.getWeekEndDate = function () {
- var w = this.getDay();
- var offset = (w === 0 ? 6 : 6 - w);
- return this.getOffsetDate(offset);
-};
-
-//获得本季度的起始日期
-Date.prototype.getQuarterStartDate = function () {
- return Date.getDate(this.getFullYear(), this.getQuarterStartMonth(), 1);
-};
-//得到本季度的结束日期
-Date.prototype.getQuarterEndDate = function () {
- var quarterEndMonth = this.getQuarterStartMonth() + 2;
- return Date.getDate(this.getFullYear(), quarterEndMonth, this.getMonthDays(quarterEndMonth));
-};
-Date.prototype.getAfterMultiMonth = function (n) {
- var dt = Date.getDate(this.getTime());
- dt.setMonth(dt.getMonth() + n | 0);
- return dt;
-};
-Date.prototype.getBeforeMultiMonth = function (n) {
- var dt = Date.getDate(this.getTime());
- dt.setMonth(dt.getMonth() - n | 0);
- return dt;
-};
-
-//获得当前时区对应指定时区的时间
-Date.prototype.getTimeZoneTimeByTimezoneOffset = function (offset) {
- var dt = Date.getDate(this.getTime());
- var localTime = dt.getTime();
- var localOffset = dt.getTimezoneOffset() * 60000; //获得当地时间偏移的毫秒数
- var utc = localTime + localOffset; //utc即GMT时间标准时区
- return Date.getDate(utc + offset);
-};
-
-/** Checks date and time equality */
-Date.prototype.equalsTo = function (date) {
- return ((this.getFullYear() == date.getFullYear()) &&
- (this.getMonth() == date.getMonth()) &&
- (this.getDate() == date.getDate()) &&
- (this.getHours() == date.getHours()) &&
- (this.getMinutes() == date.getMinutes()) &&
- (this.getSeconds() == date.getSeconds()));
-};
-
-/** Set only the year, month, date parts (keep existing time) */
-Date.prototype.setDateOnly = function (date) {
- var tmp = Date.getDate(date);
- this.setDate(1);
- this.setFullYear(tmp.getFullYear());
- this.setMonth(tmp.getMonth());
- this.setDate(tmp.getDate());
-};
-/** Prints the date in a string according to the given format. */
-Date.prototype.print = function (str) {
- var m = this.getMonth();
- var d = this.getDate();
- var y = this.getFullYear();
- var wn = this.getWeekNumber();
- var qr = this.getQuarter();
- var w = this.getDay();
- var s = {};
- var hr = this.getHours();
- var pm = (hr >= 12);
- var ir = (pm) ? (hr - 12) : hr;
- var dy = this.getDayOfYear();
- if (ir == 0) {
- ir = 12;
- }
- var min = this.getMinutes();
- var sec = this.getSeconds();
- s["%a"] = Date._SDN[w]; // abbreviated weekday name [FIXME: I18N]
- s["%A"] = Date._DN[w]; // full weekday name
- s["%b"] = Date._SMN[m]; // abbreviated month name [FIXME: I18N]
- s["%B"] = Date._MN[m]; // full month name
- // FIXME: %c : preferred date and time representation for the current locale
- s["%C"] = 1 + Math.floor(y / 100); // the century number
- s["%d"] = (d < 10) ? ("0" + d) : d; // the day of the month (range 01 to 31)
- s["%e"] = d; // the day of the month (range 1 to 31)
- // FIXME: %D : american date style: %m/%d/%y
- // FIXME: %E, %F, %G, %g, %h (man strftime)
- s["%H"] = (hr < 10) ? ("0" + hr) : hr; // hour, range 00 to 23 (24h format)
- s["%I"] = (ir < 10) ? ("0" + ir) : ir; // hour, range 01 to 12 (12h format)
- s["%j"] = (dy < 100) ? ((dy < 10) ? ("00" + dy) : ("0" + dy)) : dy; // day of the year (range 001 to 366)
- s["%k"] = hr; // hour, range 0 to 23 (24h format)
- s["%l"] = ir; // hour, range 1 to 12 (12h format)
- s["%X"] = (m < 9) ? ("0" + (1 + m)) : (1 + m); // month, range 01 to 12
- s["%x"] = m + 1 // month, range 1 to 12
- s["%M"] = (min < 10) ? ("0" + min) : min; // minute, range 00 to 59
- s["%n"] = "\n"; // a newline character
- s["%p"] = pm ? "PM" : "AM";
- s["%P"] = pm ? "pm" : "am";
- // FIXME: %r : the time in am/pm notation %I:%M:%S %p
- // FIXME: %R : the time in 24-hour notation %H:%M
- s["%s"] = Math.floor(this.getTime() / 1000);
- s["%S"] = (sec < 10) ? ("0" + sec) : sec; // seconds, range 00 to 59
- s["%t"] = "\t"; // a tab character
- // FIXME: %T : the time in 24-hour notation (%H:%M:%S)
- s["%U"] = s["%W"] = s["%V"] = (wn < 10) ? ("0" + wn) : wn;
- s["%u"] = w + 1; // the day of the week (range 1 to 7, 1 = MON)
- s["%w"] = w; // the day of the week (range 0 to 6, 0 = SUN)
- // FIXME: %x : preferred date representation for the current locale without the time
- // FIXME: %X : preferred time representation for the current locale without the date
- s["%y"] = ('' + y).substr(2, 2); // year without the century (range 00 to 99)
- s["%Y"] = y; // year with the century
- s["%%"] = "%"; // a literal '%' character
- s["%Q"] = qr;
-
- var re = /%./g;
- if (!BI.isKhtml()) {
- return str.replace(re, function (par) {
- return s[par] || par;
- });
- }
-
- var a = str.match(re);
- for (var i = 0; i < a.length; i++) {
- var tmp = s[a[i]];
- if (tmp) {
- re = new RegExp(a[i], 'g');
- str = str.replace(re, tmp);
- }
- }
-
- return str;
-};
-
-/**
- * 是否是闰年
- * @param year
- * @returns {boolean}
- */
-Date.isLeap = function (year) {
- return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
-};
-
-/**
- * 检测是否在有效期
- *
- * @param YY 年
- * @param MM 月
- * @param DD 日
- * @param minDate '1900-01-01'
- * @param maxDate '2099-12-31'
- * @returns {Array} 若无效返回无效状态
- */
-Date.checkVoid = function (YY, MM, DD, minDate, maxDate) {
- var back = [];
- YY = YY | 0;
- MM = MM | 0;
- DD = DD | 0;
- minDate = BI.isString(minDate) ? minDate.match(/\d+/g) : minDate;
- maxDate = BI.isString(maxDate) ? maxDate.match(/\d+/g) : maxDate;
- if (YY < minDate[0]) {
- back = ['y'];
- } else if (YY > maxDate[0]) {
- back = ['y', 1];
- } else if (YY >= minDate[0] && YY <= maxDate[0]) {
- if (YY == minDate[0]) {
- if (MM < minDate[1]) {
- back = ['m'];
- } else if (MM == minDate[1]) {
- if (DD < minDate[2]) {
- back = ['d'];
- }
- }
- }
- if (YY == maxDate[0]) {
- if (MM > maxDate[1]) {
- back = ['m', 1];
- } else if (MM == maxDate[1]) {
- if (DD > maxDate[2]) {
- back = ['d', 1];
- }
- }
- }
- }
- return back;
-};
-
-Date.checkLegal = function (str) {
- var ar = str.match(/\d+/g);
- var YY = ar[0] | 0, MM = ar[1] | 0, DD = ar[2] | 0;
- if (ar.length <= 1) {
- return true;
- }
- if (ar.length <= 2) {
- return MM >= 1 && MM <= 12;
- }
- var MD = Date._MD.slice(0);
- MD[1] = Date.isLeap(YY) ? 29 : 28;
- return MM >= 1 && MM <= 12 && DD <= MD[MM - 1];
-};
-
-Date.parseDateTime = function (str, fmt) {
- var today = Date.getDate();
- var y = 0;
- var m = 0;
- var d = 1;
- //wei : 对于fmt为‘YYYYMM’或者‘YYYYMMdd’的格式,str的值为类似'201111'的形式,因为年月之间没有分隔符,所以正则表达式分割无效,导致bug7376。
- var a = str.split(/\W+/);
- if (fmt.toLowerCase() == '%y%x' || fmt.toLowerCase() == '%y%x%d') {
- var yearlength = 4;
- var otherlength = 2;
- a[0] = str.substring(0, yearlength);
- a[1] = str.substring(yearlength, yearlength + otherlength);
- a[2] = str.substring(yearlength + otherlength, yearlength + otherlength * 2);
- }
- var b = fmt.match(/%./g);
- var i = 0, j = 0;
- var hr = 0;
- var min = 0;
- var sec = 0;
- for (i = 0; i < a.length; ++i) {
- switch (b[i]) {
- case "%d":
- case "%e":
- d = parseInt(a[i], 10);
- break;
-
- case "%X":
- m = parseInt(a[i], 10) - 1;
- break;
- case "%x":
- m = parseInt(a[i], 10) - 1;
- break;
-
- case "%Y":
- case "%y":
- y = parseInt(a[i], 10);
- (y < 100) && (y += (y > 29) ? 1900 : 2000);
- break;
-
- case "%b":
- case "%B":
- for (j = 0; j < 12; ++j) {
- if (Date._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) {
- m = j;
- break;
- }
- }
- break;
-
- case "%H":
- case "%I":
- case "%k":
- case "%l":
- hr = parseInt(a[i], 10);
- break;
-
- case "%P":
- case "%p":
- if (/pm/i.test(a[i]) && hr < 12) {
- hr += 12;
- } else if (/am/i.test(a[i]) && hr >= 12) {
- hr -= 12;
- }
- break;
-
- case "%M":
- min = parseInt(a[i], 10);
- case "%S":
- sec = parseInt(a[i], 10);
- break;
- }
- }
-// if (!a[i]) {
-// continue;
-// }
- if (isNaN(y)) {
- y = today.getFullYear();
- }
- if (isNaN(m)) {
- m = today.getMonth();
- }
- if (isNaN(d)) {
- d = today.getDate();
- }
- if (isNaN(hr)) {
- hr = today.getHours();
- }
- if (isNaN(min)) {
- min = today.getMinutes();
- }
- if (isNaN(sec)) {
- sec = today.getSeconds();
- }
- if (y != 0) {
- return Date.getDate(y, m, d, hr, min, sec);
- }
- y = 0;
- m = -1;
- d = 0;
- for (i = 0; i < a.length; ++i) {
- if (a[i].search(/[a-zA-Z]+/) != -1) {
- var t = -1;
- for (j = 0; j < 12; ++j) {
- if (Date._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) {
- t = j;
- break;
- }
- }
- if (t != -1) {
- if (m != -1) {
- d = m + 1;
- }
- m = t;
- }
- } else if (parseInt(a[i], 10) <= 12 && m == -1) {
- m = a[i] - 1;
- } else if (parseInt(a[i], 10) > 31 && y == 0) {
- y = parseInt(a[i], 10);
- (y < 100) && (y += (y > 29) ? 1900 : 2000);
- } else if (d == 0) {
- d = a[i];
- }
- }
- if (y == 0) {
- y = today.getFullYear();
- }
- if (m != -1 && d != 0) {
- return Date.getDate(y, m, d, hr, min, sec);
- }
- return today;
-};
-
-Date.getDate = function () {
- var dt = new (Function.prototype.bind.apply(Date, BI.concat([null], [].slice.apply(arguments))))();
- if(BI.isNotNull(Date.timeZone) && (arguments.length === 0 || (arguments.length === 1 && BI.isNumber(arguments[0])))){
- var localTime = dt.getTime();
- var localOffset = dt.getTimezoneOffset() * 60000; //获得当地时间偏移的毫秒数
- var utc = localTime + localOffset; //utc即GMT时间标准时区
- return new Date(utc + Date.timeZone);//+ Pool.timeZone.offset);
- }else{
- return dt;
- }
-};
-/*
- * 给jQuery.Event对象添加的工具方法
- */
-$.extend($.Event.prototype, {
- // event.stopEvent
- stopEvent: function () {
- this.stopPropagation();
- this.preventDefault();
- }
-});Function.prototype.before = function (func) {
- var __self = this;
- return function () {
- if (func.apply(this, arguments) === false) {
- return false;
- }
- return __self.apply(this, arguments);
- }
-};
-
-Function.prototype.after = function (func) {
- var __self = this;
- return function () {
- var ret = __self.apply(this, arguments);
- if (ret === false) {
- return false;
- }
- func.apply(this, arguments);
- return ret;
- }
-};if (jQuery) {
- (function ($) {
- // richer:容器在其各个边缘留出的空间
- if (!$.fn.insets) {
- $.fn.insets = function () {
- var p = this.padding(),
- b = this.border();
- return {
- 'top': p.top,
- 'bottom': p.bottom + b.bottom + b.top,
- 'left': p.left,
- 'right': p.right + b.right + b.left
- };
- };
- }
-
- // richer:获取 && 设置jQuery元素的边界
- if (!$.fn.bounds) {
- $.fn.bounds = function (value) {
- var tmp = {hasIgnoredBounds: true};
-
- if (value) {
- if (!isNaN(value.x)) {
- tmp.left = value.x;
- }
- if (!isNaN(value.y)) {
- tmp.top = value.y;
- }
- if (value.width != null) {
- tmp.width = (value.width - (this.outerWidth(true) - this.width()));
- tmp.width = (tmp.width >= 0) ? tmp.width : value.width;
- // fix chrome
- //tmp.width = (tmp.width >= 0) ? tmp.width : 0;
- }
- if (value.height != null) {
- tmp.height = value.height - (this.outerHeight(true) - this.height());
- tmp.height = (tmp.height >= 0) ? tmp.height : value.height;
- // fix chrome
- //tmp.height = (tmp.height >= 0) ? tmp.height : value.0;
- }
- this.css(tmp);
- return this;
- }
- else {
- // richer:注意此方法只对可见元素有效
- tmp = this.position();
- return {
- 'x': tmp.left,
- 'y': tmp.top,
- // richer:这里计算外部宽度和高度的时候,都不包括边框
- 'width': this.outerWidth(),
- 'height': this.outerHeight()
- };
- }
- };
- }
- })(jQuery);
-}
-;if (!Number.prototype.toFixed || (0.00008).toFixed(3) !== '0.000' ||
- (0.9).toFixed(0) === '0' || (1.255).toFixed(2) !== '1.25' ||
- (1000000000000000128).toFixed(0) !== "1000000000000000128") {
- (function () {
- var base, size, data, i;
- base = 1e7;
- size = 6;
- data = [0, 0, 0, 0, 0, 0];
- function multiply(n, c) {
- var i = -1;
- while (++i < size) {
- c += n * data[i];
- data[i] = c % base;
- c = Math.floor(c / base);
- }
- }
-
- function divide(n) {
- var i = size, c = 0;
- while (--i >= 0) {
- c += data[i];
- data[i] = Math.floor(c / n);
- c = (c % n) * base;
- }
- }
-
- function toString() {
- var i = size;
- var s = '';
- while (--i >= 0) {
- if (s !== '' || i === 0 || data[i] !== 0) {
- var t = String(data[i]);
- if (s === '') {
- s = t;
- } else {
- s += '0000000'.slice(0, 7 - t.length) + t;
- }
- }
- }
- return s;
- }
-
- function pow(x, n, acc) {
- return (n === 0 ? acc : (n % 2 === 1 ? pow(x, n - 1, acc * x)
- : pow(x * x, n / 2, acc)));
- }
-
- function log(x) {
- var n = 0;
- while (x >= 4096) {
- n += 12;
- x /= 4096;
- }
- while (x >= 2) {
- n += 1;
- x /= 2;
- }
- return n;
- }
-
- Number.prototype.toFixed = function (fractionDigits) {
- var f, x, s, m, e, z, j, k;
- f = Number(fractionDigits);
- f = f !== f ? 0 : Math.floor(f);
-
- if (f < 0 || f > 20) {
- throw new RangeError('Number.toFixed called with invalid number of decimals');
- }
-
- x = Number(this);
-
- if (x !== x) {
- return "NaN";
- }
-
- if (x <= -1e21 || x > 1e21) {
- return String(x);
- }
-
- s = "";
-
- if (x < 0) {
- s = "-";
- x = -x;
- }
-
- m = "0";
-
- if (x > 1e-21) {
- //1e-21
0) {
- multiply(0, z);
- j = f;
-
- while (j >= 7) {
- multiply(1e7, 0);
- j -= 7;
- }
-
- multiply(pow(10, j, 1), 0);
- j = e - 1;
-
- while (j >= 23) {
- divide(1 << 23);
- j -= 23;
- }
- divide(1 << j);
- multiply(1, 1);
- divide(2);
- m = toString();
- } else {
- multiply(0, z);
- multiply(1 << (-e), 0);
- m = toString() + '0.00000000000000000000'.slice(2, 2 + f);
- }
- }
-
- if (f > 0) {
- k = m.length;
-
- if (k <= f) {
- m = s + '0.0000000000000000000'.slice(0, f - k + 2) + m;
- } else {
- m = s + m.slice(0, k - f) + '.' + m.slice(k - f);
- }
- } else {
- m = s + m;
- }
-
- return m;
- }
-
- })();
-}
-
-
-/**
- ** 加法函数,用来得到精确的加法结果
- ** 说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
- ** 调用:accAdd(arg1,arg2)
- ** 返回值:arg1加上arg2的精确结果
- **/
-function accAdd(arg1, arg2) {
- var r1, r2, m, c;
- try {
- r1 = arg1.toString().split(".")[1].length;
- }
- catch (e) {
- r1 = 0;
- }
- try {
- r2 = arg2.toString().split(".")[1].length;
- }
- catch (e) {
- r2 = 0;
- }
- c = Math.abs(r1 - r2);
- m = Math.pow(10, Math.max(r1, r2));
- if (c > 0) {
- var cm = Math.pow(10, c);
- if (r1 > r2) {
- arg1 = Number(arg1.toString().replace(".", ""));
- arg2 = Number(arg2.toString().replace(".", "")) * cm;
- } else {
- arg1 = Number(arg1.toString().replace(".", "")) * cm;
- arg2 = Number(arg2.toString().replace(".", ""));
- }
- } else {
- arg1 = Number(arg1.toString().replace(".", ""));
- arg2 = Number(arg2.toString().replace(".", ""));
- }
- return (arg1 + arg2) / m;
-}
-
-//给Number类型增加一个add方法,调用起来更加方便。
-Number.prototype.add = function (arg) {
- return accAdd(arg, this);
-};
-/**
- ** 减法函数,用来得到精确的减法结果
- ** 说明:javascript的减法结果会有误差,在两个浮点数相减的时候会比较明显。这个函数返回较为精确的减法结果。
- ** 调用:accSub(arg1,arg2)
- ** 返回值:arg1加上arg2的精确结果
- **/
-function accSub(arg1, arg2) {
- var r1, r2, m, n;
- try {
- r1 = arg1.toString().split(".")[1].length;
- }
- catch (e) {
- r1 = 0;
- }
- try {
- r2 = arg2.toString().split(".")[1].length;
- }
- catch (e) {
- r2 = 0;
- }
- m = Math.pow(10, Math.max(r1, r2)); //last modify by deeka //动态控制精度长度
- n = (r1 >= r2) ? r1 : r2;
- return ((arg1 * m - arg2 * m) / m).toFixed(n);
-}
-
-// 给Number类型增加一个mul方法,调用起来更加方便。
-Number.prototype.sub = function (arg) {
- return accSub(this, arg);
-};
-/**
- ** 乘法函数,用来得到精确的乘法结果
- ** 说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
- ** 调用:accMul(arg1,arg2)
- ** 返回值:arg1乘以 arg2的精确结果
- **/
-function accMul(arg1, arg2) {
- var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
- try {
- m += s1.split(".")[1].length;
- }
- catch (e) {
- }
- try {
- m += s2.split(".")[1].length;
- }
- catch (e) {
- }
- return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
-}
-
-// 给Number类型增加一个mul方法,调用起来更加方便。
-Number.prototype.mul = function (arg) {
- return accMul(arg, this);
-};
-/**
- ** 除法函数,用来得到精确的除法结果
- ** 说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
- ** 调用:accDiv(arg1,arg2)
- ** 返回值:arg1除以arg2的精确结果
- **/
-function accDiv(arg1, arg2) {
- var t1 = 0, t2 = 0, r1, r2;
- try {
- t1 = arg1.toString().split(".")[1].length;
- }
- catch (e) {
- }
- try {
- t2 = arg2.toString().split(".")[1].length;
- }
- catch (e) {
- }
- with (Math) {
- r1 = Number(arg1.toString().replace(".", ""));
- r2 = Number(arg2.toString().replace(".", ""));
- return (t2 > t1) ? (r1 / r2) * pow(10, t2 - t1) : (r1 / r2) / pow(10, t1 - t2);
- }
-}
-
-//给Number类型增加一个div方法,调用起来更加方便。
-Number.prototype.div = function (arg) {
- return accDiv(this, arg);
-};/**
- * 对字符串对象的扩展
- * @class String
- */
-$.extend(String.prototype, {
-
- /**
- * 判断字符串是否已指定的字符串开始
- * @param {String} startTag 指定的开始字符串
- * @return {Boolean} 如果字符串以指定字符串开始则返回true,否则返回false
- */
- startWith: function (startTag) {
- if (startTag == null || startTag == "" || this.length === 0 || startTag.length > this.length) {
- return false;
- }
- return this.substr(0, startTag.length) == startTag;
- },
- /**
- * 判断字符串是否以指定的字符串结束
- * @param {String} endTag 指定的字符串
- * @return {Boolean} 如果字符串以指定字符串结束则返回true,否则返回false
- */
- endWith: function (endTag) {
- if (endTag == null || endTag == "" || this.length === 0 || endTag.length > this.length) {
- return false;
- }
- return this.substring(this.length - endTag.length) == endTag;
- },
-
- /**
- * 获取url中指定名字的参数
- * @param {String} name 参数的名字
- * @return {String} 参数的值
- */
- getQuery: function (name) {
- var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
- var r = this.substr(this.indexOf("?") + 1).match(reg);
- if (r) {
- return unescape(r[2]);
- }
- return null;
- },
-
- /**
- * 给url加上给定的参数
- * @param {Object} paras 参数对象,是一个键值对对象
- * @return {String} 添加了给定参数的url
- */
- appendQuery: function (paras) {
- if (!paras) {
- return this;
- }
- var src = this;
- // 没有问号说明还没有参数
- if (src.indexOf("?") === -1) {
- src += "?";
- }
- // 如果以问号结尾,说明没有其他参数
- if (src.endWith("?") !== false) {
- } else {
- src += "&";
- }
- $.each(paras, function (name, value) {
- if (typeof(name) === 'string') {
- src += name + "=" + value + "&";
- }
- });
- src = src.substr(0, src.length - 1);
- return src;
- },
- /**
- * 将所有符合第一个字符串所表示的字符串替换成为第二个字符串
- * @param {String} s1 要替换的字符串的正则表达式
- * @param {String} s2 替换的结果字符串
- * @returns {String} 替换后的字符串
- */
- replaceAll: function (s1, s2) {
- return this.replace(new RegExp(s1, "gm"), s2);
- },
- /**
- * 总是让字符串以指定的字符开头
- * @param {String} start 指定的字符
- * @returns {String} 以指定字符开头的字符串
- */
- perfectStart: function (start) {
- if (this.startWith(start)) {
- return this;
- } else {
- return start + this;
- }
- },
-
- /**
- * 获取字符串中某字符串的所有项位置数组
- * @param {String} sub 子字符串
- * @return {Number[]} 子字符串在父字符串中出现的所有位置组成的数组
- */
- allIndexOf: function (sub) {
- if (typeof sub != 'string') {
- return [];
- }
- var str = this;
- var location = [];
- var offset = 0;
- while (str.length > 0) {
- var loc = str.indexOf(sub);
- if (loc === -1) {
- break;
- }
- location.push(offset + loc);
- str = str.substring(loc + sub.length, str.length);
- offset += loc + sub.length;
- }
- return location;
- }
-});
-
-/**
- * 对字符串对象的扩展
- * @class String
- */
-$.extend(String, {
-
- /**
- * 对字符串中的'和\做编码处理
- * @static
- * @param {String} string 要做编码处理的字符串
- * @return {String} 编码后的字符串
- */
- escape: function (string) {
- return string.replace(/('|\\)/g, "\\$1");
- },
-
- /**
- * 让字符串通过指定字符做补齐的函数
- *
- * var s = String.leftPad('123', 5, '0');//s的值为:'00123'
- *
- * @static
- * @param {String} val 原始值
- * @param {Number} size 总共需要的位数
- * @param {String} ch 用于补齐的字符
- * @return {String} 补齐后的字符串
- */
- leftPad: function (val, size, ch) {
- var result = String(val);
- if (!ch) {
- ch = " ";
- }
- while (result.length < size) {
- result = ch + result;
- }
- return result.toString();
- },
-
- /**
- * 对字符串做替换的函数
- *
- * var cls = 'my-class', text = 'Some text';
- * var res = String.format('Some text
';
- *
- * @static
- * @param {String} format 要做替换的字符串,替换字符串1,替换字符串2...
- * @return {String} 做了替换后的字符串
- */
- format: function (format) {
- var args = Array.prototype.slice.call(arguments, 1);
- return format.replace(/\{(\d+)\}/g, function (m, i) {
- return args[i];
- });
- }
-});BI.EventListener = {
- listen: function listen(target, eventType, callback) {
- if (target.addEventListener) {
- target.addEventListener(eventType, callback, false);
- return {
- remove: function remove() {
- target.removeEventListener(eventType, callback, false);
- }
- };
- } else if (target.attachEvent) {
- target.attachEvent('on' + eventType, callback);
- return {
- remove: function remove() {
- target.detachEvent('on' + eventType, callback);
- }
- };
- }
- },
-
- capture: function capture(target, eventType, callback) {
- if (target.addEventListener) {
- target.addEventListener(eventType, callback, true);
- return {
- remove: function remove() {
- target.removeEventListener(eventType, callback, true);
- }
- };
- } else {
- return {
- remove: BI.emptyFn
- };
- }
- },
-
- registerDefault: function registerDefault() {
- }
-};!(function () {
- var cancelAnimationFrame =
- window.cancelAnimationFrame ||
- window.webkitCancelAnimationFrame ||
- window.mozCancelAnimationFrame ||
- window.oCancelAnimationFrame ||
- window.msCancelAnimationFrame ||
- window.clearTimeout;
-
- var requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || window.setTimeout;
-
-
- BI.MouseMoveTracker = function (onMove, onMoveEnd, domNode) {
- this._isDragging = false;
- this._animationFrameID = null;
- this._domNode = domNode;
- this._onMove = onMove;
- this._onMoveEnd = onMoveEnd;
-
- this._onMouseMove = BI.bind(this._onMouseMove, this);
- this._onMouseUp = BI.bind(this._onMouseUp, this);
- this._didMouseMove = BI.bind(this._didMouseMove, this);
- };
- BI.MouseMoveTracker.prototype = {
- constructor: BI.MouseMoveTracker,
- captureMouseMoves: function (/*object*/ event) {
- if (!this._eventMoveToken && !this._eventUpToken) {
- this._eventMoveToken = BI.EventListener.listen(
- this._domNode,
- 'mousemove',
- this._onMouseMove
- );
- this._eventUpToken = BI.EventListener.listen(
- this._domNode,
- 'mouseup',
- this._onMouseUp
- );
- }
-
- if (!this._isDragging) {
- this._deltaX = 0;
- this._deltaY = 0;
- this._isDragging = true;
- this._x = event.clientX;
- this._y = event.clientY;
- }
- event.preventDefault ? event.preventDefault() : (event.returnValue = false);
- },
-
- releaseMouseMoves: function () {
- if (this._eventMoveToken && this._eventUpToken) {
- this._eventMoveToken.remove();
- this._eventMoveToken = null;
- this._eventUpToken.remove();
- this._eventUpToken = null;
- }
-
- if (this._animationFrameID !== null) {
- cancelAnimationFrame(this._animationFrameID);
- this._animationFrameID = null;
- }
-
- if (this._isDragging) {
- this._isDragging = false;
- this._x = null;
- this._y = null;
- }
- },
-
- isDragging: function () /*boolean*/ {
- return this._isDragging;
- },
-
- _onMouseMove: function (/*object*/ event) {
- var x = event.clientX;
- var y = event.clientY;
-
- this._deltaX += (x - this._x);
- this._deltaY += (y - this._y);
-
- if (this._animationFrameID === null) {
- // The mouse may move faster then the animation frame does.
- // Use `requestAnimationFrame` to avoid over-updating.
- this._animationFrameID =
- requestAnimationFrame(this._didMouseMove);
- }
-
- this._x = x;
- this._y = y;
- event.preventDefault ? event.preventDefault() : (event.returnValue = false);
- },
-
- _didMouseMove: function () {
- this._animationFrameID = null;
- this._onMove(this._deltaX, this._deltaY);
- this._deltaX = 0;
- this._deltaY = 0;
- },
-
- _onMouseUp: function () {
- if (this._animationFrameID) {
- this._didMouseMove();
- }
- this._onMoveEnd();
- }
- };
-})();!(function () {
- var PIXEL_STEP = 10;
- var LINE_HEIGHT = 40;
- var PAGE_HEIGHT = 800;
- var requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || window.setTimeout;
-
- function normalizeWheel(/*object*/event) /*object*/ {
- var sX = 0,
- sY = 0,
- // spinX, spinY
- pX = 0,
- pY = 0; // pixelX, pixelY
-
- // Legacy
- if ('detail' in event) {
- sY = event.detail;
- }
- if ('wheelDelta' in event) {
- sY = -event.wheelDelta / 120;
- }
- if ('wheelDeltaY' in event) {
- sY = -event.wheelDeltaY / 120;
- }
- if ('wheelDeltaX' in event) {
- sX = -event.wheelDeltaX / 120;
- }
-
- // side scrolling on FF with DOMMouseScroll
- if ('axis' in event && event.axis === event.HORIZONTAL_AXIS) {
- sX = sY;
- sY = 0;
- }
-
- pX = sX * PIXEL_STEP;
- pY = sY * PIXEL_STEP;
-
- if ('deltaY' in event) {
- pY = event.deltaY;
- }
- if ('deltaX' in event) {
- pX = event.deltaX;
- }
-
- if ((pX || pY) && event.deltaMode) {
- if (event.deltaMode === 1) {
- // delta in LINE units
- pX *= LINE_HEIGHT;
- pY *= LINE_HEIGHT;
- } else {
- // delta in PAGE units
- pX *= PAGE_HEIGHT;
- pY *= PAGE_HEIGHT;
- }
- }
-
- // Fall-back if spin cannot be determined
- if (pX && !sX) {
- sX = pX < 1 ? -1 : 1;
- }
- if (pY && !sY) {
- sY = pY < 1 ? -1 : 1;
- }
-
- return {
- spinX: sX,
- spinY: sY,
- pixelX: pX,
- pixelY: pY
- };
- }
-
- BI.WheelHandler = function (onWheel, handleScrollX, handleScrollY, stopPropagation) {
- this._animationFrameID = null;
- this._deltaX = 0;
- this._deltaY = 0;
- this._didWheel = BI.bind(this._didWheel, this);
- if (typeof handleScrollX !== 'function') {
- handleScrollX = handleScrollX ?
- function () {
- return true
- } :
- function () {
- return false
- };
- }
-
- if (typeof handleScrollY !== 'function') {
- handleScrollY = handleScrollY ?
- function () {
- return true
- } :
- function () {
- return false
- };
- }
-
- if (typeof stopPropagation !== 'function') {
- stopPropagation = stopPropagation ?
- function () {
- return true
- } :
- function () {
- return false
- };
- }
-
- this._handleScrollX = handleScrollX;
- this._handleScrollY = handleScrollY;
- this._stopPropagation = stopPropagation;
- this._onWheelCallback = onWheel;
- this.onWheel = BI.bind(this.onWheel, this);
- };
- BI.WheelHandler.prototype = {
- constructor: BI.WheelHandler,
- onWheel: function (/*object*/ event) {
- var normalizedEvent = normalizeWheel(event);
- var deltaX = this._deltaX + normalizedEvent.pixelX;
- var deltaY = this._deltaY + normalizedEvent.pixelY;
- var handleScrollX = this._handleScrollX(deltaX, deltaY);
- var handleScrollY = this._handleScrollY(deltaY, deltaX);
- if (!handleScrollX && !handleScrollY) {
- return;
- }
-
- this._deltaX += handleScrollX ? normalizedEvent.pixelX : 0;
- this._deltaY += handleScrollY ? normalizedEvent.pixelY : 0;
- event.preventDefault ? event.preventDefault() : (event.returnValue = false);
-
- var changed;
- if (this._deltaX !== 0 || this._deltaY !== 0) {
- if (this._stopPropagation()) {
- event.stopPropagation ? event.stopPropagation() : (event.cancelBubble = true);
- }
- changed = true;
- }
-
- if (changed === true && this._animationFrameID === null) {
- this._animationFrameID = requestAnimationFrame(this._didWheel);
- }
- },
-
- _didWheel: function () {
- this._animationFrameID = null;
- this._onWheelCallback(this._deltaX, this._deltaY);
- this._deltaX = 0;
- this._deltaY = 0;
- }
- };
-})();/**
- * 常量
- */
-
-_.extend(BI, {
- MAX: 0xfffffffffffffff,
- MIN: -0xfffffffffffffff,
- EVENT_RESPONSE_TIME: 200,
- zIndex_layer: 1e5,
- zIndex_floatbox: 1e6,
- zIndex_popup: 1e7,
- zIndex_masker: 1e8,
- zIndex_tip: 1e9,
- emptyStr: "",
- emptyFn: function () {
- },
- empty: null,
- Key: {
- "48": "0",
- "49": "1",
- "50": "2",
- "51": "3",
- "52": "4",
- "53": "5",
- "54": "6",
- "55": "7",
- "56": "8",
- "57": "9",
- "65": "a",
- "66": "b",
- "67": "c",
- "68": "d",
- "69": "e",
- "70": "f",
- "71": "g",
- "72": "h",
- "73": "i",
- "74": "j",
- "75": "k",
- "76": "l",
- "77": "m",
- "78": "n",
- "79": "o",
- "80": "p",
- "81": "q",
- "82": "r",
- "83": "s",
- "84": "t",
- "85": "u",
- "86": "v",
- "87": "w",
- "88": "x",
- "89": "y",
- "90": "z",
- "96": "0",
- "97": "1",
- "98": "2",
- "99": "3",
- "100": "4",
- "101": "5",
- "102": "6",
- "103": "7",
- "104": "8",
- "105": "9",
- "106": "*",
- "107": "+",
- "109": "-",
- "110": ".",
- "111": "/"
- },
- KeyCode: {
- BACKSPACE: 8,
- COMMA: 188,
- DELETE: 46,
- DOWN: 40,
- END: 35,
- ENTER: 13,
- ESCAPE: 27,
- HOME: 36,
- LEFT: 37,
- NUMPAD_ADD: 107,
- NUMPAD_DECIMAL: 110,
- NUMPAD_DIVIDE: 111,
- NUMPAD_ENTER: 108,
- NUMPAD_MULTIPLY: 106,
- NUMPAD_SUBTRACT: 109,
- PAGE_DOWN: 34,
- PAGE_UP: 33,
- PERIOD: 190,
- RIGHT: 39,
- SPACE: 32,
- TAB: 9,
- UP: 38
- },
- Status: {
- SUCCESS: 1,
- WRONG: 2,
- START: 3,
- END: 4,
- WAITING: 5,
- READY: 6,
- RUNNING: 7,
- OUTOFBOUNDS: 8,
- NULL: -1
- },
- Direction: {
- Top: "top",
- Bottom: "bottom",
- Left: "left",
- Right: "right",
- Custom: "custom"
- },
- Axis: {
- Vertical: "vertical",
- Horizontal: "horizontal"
- },
- Selection: {
- Default: -2,
- None: -1,
- Single: 0,
- Multi: 1,
- All: 2
- },
- HorizontalAlign: {
- Left: "left",
- Right: "right",
- Center: "center",
- Stretch: "stretch"
- },
- VerticalAlign: {
- Middle: "middle",
- Top: "top",
- Bottom: "bottom",
- Stretch: "stretch"
- }
-});BI.version = "2.0";/**
- * absolute实现的居中布局
- * @class BI.AbsoluteCenterLayout
- * @extends BI.Layout
- */
-BI.AbsoluteCenterLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.AbsoluteCenterLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-absolute-center-layout",
- hgap: 0,
- lgap: 0,
- rgap: 0,
- vgap: 0,
- tgap: 0,
- bgap: 0
- });
- },
-
- render: function () {
- BI.AbsoluteCenterLayout.superclass.render.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- _addElement: function (i, item) {
- var o = this.options;
- var w = BI.AbsoluteCenterLayout.superclass._addElement.apply(this, arguments);
- w.element.css({
- "position": "absolute",
- "left": o.hgap + o.lgap + (item.lgap || 0),
- "right": o.hgap + o.rgap + (item.rgap || 0),
- "top": o.vgap + o.tgap + (item.tgap || 0),
- "bottom": o.vgap + o.bgap + (item.bgap || 0),
- "margin": "auto"
- });
- return w;
- },
-
- resize: function () {
- // console.log("absolute_center_adapt布局不需要resize");
- },
-
- populate: function (items) {
- BI.AbsoluteCenterLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.absolute_center_adapt', BI.AbsoluteCenterLayout);/**
- * absolute实现的居中布局
- * @class BI.AbsoluteHorizontalLayout
- * @extends BI.Layout
- */
-BI.AbsoluteHorizontalLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.AbsoluteHorizontalLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-absolute-horizontal-layout",
- hgap: 0,
- lgap: 0,
- rgap: 0,
- vgap: 0,
- tgap: 0,
- bgap: 0
- });
- },
-
- render: function () {
- BI.AbsoluteHorizontalLayout.superclass.render.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- _addElement: function (i, item) {
- var o = this.options;
- var w = BI.AbsoluteHorizontalLayout.superclass._addElement.apply(this, arguments);
- w.element.css({
- "position": "absolute",
- "left": o.hgap + o.lgap + (item.lgap || 0),
- "right": o.hgap + o.rgap + (item.rgap || 0),
- "margin": "auto"
- });
- if (o.vgap + o.tgap + (item.tgap || 0) !== 0) {
- w.element.css("top", o.vgap + o.tgap + (item.tgap || 0));
- }
- if (o.vgap + o.bgap + (item.bgap || 0) !== 0) {
- w.element.css("bottom", o.vgap + o.bgap + (item.bgap || 0));
- }
- return w;
- },
-
- resize: function () {
- // console.log("absolute_horizontal_adapt布局不需要resize");
- },
-
- populate: function (items) {
- BI.AbsoluteHorizontalLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.absolute_horizontal_adapt', BI.AbsoluteHorizontalLayout);/**
- * absolute实现的居中布局
- * @class BI.AbsoluteVerticalLayout
- * @extends BI.Layout
- */
-BI.AbsoluteVerticalLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.AbsoluteVerticalLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-absolute-vertical-layout",
- hgap: 0,
- lgap: 0,
- rgap: 0,
- vgap: 0,
- tgap: 0,
- bgap: 0
- });
- },
-
- render: function () {
- BI.AbsoluteVerticalLayout.superclass.render.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- _addElement: function (i, item) {
- var o = this.options;
- var w = BI.AbsoluteVerticalLayout.superclass._addElement.apply(this, arguments);
- w.element.css({
- "position": "absolute",
- "left": item.lgap,
- "right": item.rgap,
- "top": o.vgap + o.tgap + (item.tgap || 0),
- "bottom": o.vgap + o.bgap + (item.bgap || 0),
- "margin": "auto"
- });
- if (o.hgap + o.lgap + (item.lgap || 0) !== 0) {
- w.element.css("left", o.hgap + o.lgap + (item.lgap || 0));
- }
- if (o.hgap + o.rgap + (item.rgap || 0) !== 0) {
- w.element.css("right", o.hgap + o.rgap + (item.rgap || 0));
- }
- return w;
- },
-
- resize: function () {
- // console.log("absolute_vertical_adapt布局不需要resize");
- },
-
- populate: function (items) {
- BI.AbsoluteVerticalLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.absolute_vertical_adapt', BI.AbsoluteVerticalLayout);/**
- * 自适应水平和垂直方向都居中容器
- * @class BI.CenterAdaptLayout
- * @extends BI.Layout
- */
-BI.CenterAdaptLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.CenterAdaptLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-center-adapt-layout",
- columnSize: [],
- hgap: 0,
- vgap: 0,
- lgap: 0,
- rgap: 0,
- tgap: 0,
- bgap: 0
- });
- },
- render: function () {
- BI.CenterAdaptLayout.superclass.render.apply(this, arguments);
- this.$table = $("").attr({"cellspacing": 0, "cellpadding": 0}).css({
- "position": "relative",
- "width": "100%",
- "height": "100%",
- "white-space": "nowrap",
- "border-spacing": "0px",
- "border": "none",
- "border-collapse": "separate"
- });
- this.$tr = $("");
- this.$tr.appendTo(this.$table);
- this.populate(this.options.items);
- },
-
- _addElement: function (i, item) {
- var o = this.options;
- var td;
- var width = o.columnSize[i] <= 1 ? (o.columnSize[i] * 100 + "%") : o.columnSize[i];
- if (!this.hasWidget(this._getChildName(i))) {
- var w = BI.createWidget(item);
- w.element.css({"position": "relative", "top": "0", "left": "0", "margin": "0px auto"});
- td = BI.createWidget({
- type: "bi.default",
- tagName: "td",
- attributes: {
- width: width
- },
- items: [w]
- });
- this.addWidget(this._getChildName(i), td);
- } else {
- td = this.getWidgetByName(this._getChildName(i));
- td.element.attr("width", width);
- }
- td.element.css({"max-width": o.columnSize[i]});
- if (i === 0) {
- td.element.addClass("first-element");
- }
- td.element.css({
- "position": "relative",
- "height": "100%",
- "vertical-align": "middle",
- "margin": "0",
- "padding": "0",
- "border": "none"
- });
- if (o.hgap + o.lgap + (item.lgap || 0) !== 0) {
- w.element.css({
- "margin-left": o.hgap + o.lgap + (item.lgap || 0) + "px"
- })
- }
- if (o.hgap + o.rgap + (item.rgap || 0) !== 0) {
- w.element.css({
- "margin-right": o.hgap + o.rgap + (item.rgap || 0) + "px"
- })
- }
- if (o.vgap + o.tgap + (item.tgap || 0) !== 0) {
- w.element.css({
- "margin-top": o.vgap + o.tgap + (item.tgap || 0) + "px"
- })
- }
- if (o.vgap + o.bgap + (item.bgap || 0) !== 0) {
- w.element.css({
- "margin-bottom": o.vgap + o.bgap + (item.bgap || 0) + "px"
- })
- }
- return td;
- },
-
- _mountChildren: function () {
- var self = this;
- var frag = document.createDocumentFragment();
- var hasChild = false;
- BI.each(this._children, function (i, widget) {
- if (widget.element !== self.element) {
- frag.appendChild(widget.element[0]);
- hasChild = true;
- }
- });
- if (hasChild === true) {
- this.$tr.append(frag);
- this.element.append(this.$table);
- }
- },
-
- resize: function () {
- // console.log("center_adapt布局不需要resize");
- },
-
- _getWrapper: function(){
- return this.$tr;
- },
-
- populate: function (items) {
- BI.CenterAdaptLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.center_adapt', BI.CenterAdaptLayout);/**
- * 水平方向居中容器
- * @class BI.HorizontalAdaptLayout
- * @extends BI.Layout
- */
-BI.HorizontalAdaptLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.HorizontalAdaptLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-horizontal-adapt-layout",
- verticalAlign: BI.VerticalAlign.Top,
- columnSize: [],
- hgap: 0,
- vgap: 0,
- lgap: 0,
- rgap: 0,
- tgap: 0,
- bgap: 0
- });
- },
- render: function () {
- BI.HorizontalAdaptLayout.superclass.render.apply(this, arguments);
- this.$table = $("").attr({"cellspacing": 0, "cellpadding": 0}).css({
- "position": "relative",
- "width": "100%",
- "white-space": "nowrap",
- "border-spacing": "0px",
- "border": "none",
- "border-collapse": "separate"
- });
- this.$tr = $("");
- this.$tr.appendTo(this.$table);
- this.populate(this.options.items);
- },
-
- _addElement: function (i, item) {
- var o = this.options;
- var td;
- var width = o.columnSize[i] <= 1 ? (o.columnSize[i] * 100 + "%") : o.columnSize[i];
- if (!this.hasWidget(this._getChildName(i))) {
- var w = BI.createWidget(item);
- w.element.css({"position": "relative", "top": "0", "left": "0", "margin": "0px auto"});
- td = BI.createWidget({
- type: "bi.default",
- tagName: "td",
- attributes: {
- width: width
- },
- items: [w]
- });
- this.addWidget(this._getChildName(i), td);
- } else {
- td = this.getWidgetByName(this._getChildName(i));
- td.element.attr("width", width);
- }
- td.element.css({"max-width": o.columnSize[i] + "px"});
- if (i === 0) {
- td.element.addClass("first-element");
- }
- td.element.css({
- "position": "relative",
- "vertical-align": o.verticalAlign,
- "margin": "0",
- "padding": "0",
- "border": "none"
- });
- if (o.hgap + o.lgap + (item.lgap || 0) !== 0) {
- w.element.css({
- "margin-left": o.hgap + o.lgap + (item.lgap || 0) + "px"
- })
- }
- if (o.hgap + o.rgap + (item.rgap || 0) !== 0) {
- w.element.css({
- "margin-right": o.hgap + o.rgap + (item.rgap || 0) + "px"
- })
- }
- if (o.vgap + o.tgap + (item.tgap || 0) !== 0) {
- w.element.css({
- "margin-top": o.vgap + o.tgap + (item.tgap || 0) + "px"
- })
- }
- if (o.vgap + o.bgap + (item.bgap || 0) !== 0) {
- w.element.css({
- "margin-bottom": o.vgap + o.bgap + (item.bgap || 0) + "px"
- })
- }
- return td;
- },
-
- _mountChildren: function () {
- var self = this;
- var frag = document.createDocumentFragment();
- var hasChild = false;
- BI.each(this._children, function (i, widget) {
- if (widget.element !== self.element) {
- frag.appendChild(widget.element[0]);
- hasChild = true;
- }
- });
- if (hasChild === true) {
- this.$tr.append(frag);
- this.element.append(this.$table);
- }
- },
-
- resize: function () {
- // console.log("horizontal_adapt布局不需要resize");
- },
-
- _getWrapper: function () {
- return this.$tr;
- },
-
- populate: function (items) {
- BI.HorizontalAdaptLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.horizontal_adapt', BI.HorizontalAdaptLayout);/**
- * 左右分离,垂直方向居中容器
- * items:{
- left: [{el:{type:"bi.button"}}],
- right:[{el:{type:"bi.button"}}]
- }
- * @class BI.LeftRightVerticalAdaptLayout
- * @extends BI.Layout
- */
-BI.LeftRightVerticalAdaptLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.LeftRightVerticalAdaptLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-left-right-vertical-adapt-layout",
- items: {},
- llgap: 0,
- lrgap: 0,
- lhgap: 0,
- rlgap: 0,
- rrgap: 0,
- rhgap: 0
- });
- },
- render: function () {
- BI.LeftRightVerticalAdaptLayout.superclass.render.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- resize: function () {
- // console.log("left_right_vertical_adapt布局不需要resize");
- },
-
- addItem: function () {
- //do nothing
- throw new Error("cannot be added")
- },
-
- stroke: function (items) {
- var o = this.options;
- if ("left" in items) {
- var left = BI.createWidget({
- type: "bi.vertical_adapt",
- items: items.left,
- hgap: o.lhgap,
- lgap: o.llgap,
- rgap: o.lrgap
- });
- left.element.css("height", "100%");
- BI.createWidget({
- type: "bi.left",
- element: this,
- items: [left]
- });
- }
- if ("right" in items) {
- var right = BI.createWidget({
- type: "bi.vertical_adapt",
- items: items.right,
- hgap: o.rhgap,
- lgap: o.rlgap,
- rgap: o.rrgap
- });
- right.element.css("height", "100%");
- BI.createWidget({
- type: "bi.right",
- element: this,
- items: [right]
- });
- }
- },
-
- populate: function (items) {
- BI.LeftRightVerticalAdaptLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.left_right_vertical_adapt', BI.LeftRightVerticalAdaptLayout);
-
-
-BI.LeftVerticalAdaptLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.LeftRightVerticalAdaptLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-left-vertical-adapt-layout",
- items: [],
- lgap: 0,
- rgap: 0,
- hgap: 0
- });
- },
- render: function () {
- BI.LeftVerticalAdaptLayout.superclass.render.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- resize: function () {
- // console.log("left_vertical_adapt布局不需要resize");
- },
-
- addItem: function () {
- //do nothing
- throw new Error("cannot be added")
- },
-
- stroke: function (items) {
- var o = this.options;
- var left = BI.createWidget({
- type: "bi.vertical_adapt",
- items: items,
- lgap: o.lgap,
- hgap: o.hgap,
- rgap: o.rgap
- });
- left.element.css("height", "100%");
- BI.createWidget({
- type: "bi.left",
- element: this,
- items: [left]
- });
- },
-
- populate: function (items) {
- BI.LeftVerticalAdaptLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.left_vertical_adapt', BI.LeftVerticalAdaptLayout);
-
-BI.RightVerticalAdaptLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.RightVerticalAdaptLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-right-vertical-adapt-layout",
- items: [],
- lgap: 0,
- rgap: 0,
- hgap: 0
- });
- },
- render: function () {
- BI.RightVerticalAdaptLayout.superclass.render.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- resize: function () {
-
- },
-
- addItem: function () {
- //do nothing
- throw new Error("cannot be added")
- },
-
- stroke: function (items) {
- var o = this.options;
- var right = BI.createWidget({
- type: "bi.vertical_adapt",
- items: items,
- lgap: o.lgap,
- hgap: o.hgap,
- rgap: o.rgap
- });
- right.element.css("height", "100%");
- BI.createWidget({
- type: "bi.right",
- element: this,
- items: [right]
- });
- },
-
- populate: function (items) {
- BI.RightVerticalAdaptLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.right_vertical_adapt', BI.RightVerticalAdaptLayout);/**
- * 垂直方向居中容器
- * @class BI.VerticalAdaptLayout
- * @extends BI.Layout
- */
-BI.VerticalAdaptLayout = BI.inherit(BI.Layout, {
- props: {
- baseCls: "bi-vertical-adapt-layout",
- columnSize: [],
- horizontalAlign: BI.HorizontalAlign.Left,
- hgap: 0,
- vgap: 0,
- lgap: 0,
- rgap: 0,
- tgap: 0,
- bgap: 0
- },
- render: function () {
- BI.VerticalAdaptLayout.superclass.render.apply(this, arguments);
- var o = this.options;
- this.$table = $("").attr({"cellspacing": 0, "cellpadding": 0}).css({
- "position": "relative",
- "width": o.horizontalAlign === BI.HorizontalAlign.Stretch ? "100%" : "auto",
- "height": "100%",
- "white-space": "nowrap",
- "border-spacing": "0px",
- "border": "none",
- "border-collapse": "separate"
- });
- this.$tr = $("");
- this.$tr.appendTo(this.$table);
- this.populate(this.options.items);
- },
-
- _addElement: function (i, item) {
- var o = this.options;
- var td;
- var width = o.columnSize[i] <= 1 ? (o.columnSize[i] * 100 + "%") : o.columnSize[i];
- if (!this.hasWidget(this._getChildName(i))) {
- var w = BI.createWidget(item);
- w.element.css({"position": "relative", "top": "0", "left": "0", "margin": "0px auto"});
- td = BI.createWidget({
- type: "bi.default",
- tagName: "td",
- attributes: {
- width: width
- },
- items: [w]
- });
- this.addWidget(this._getChildName(i), td);
- } else {
- td = this.getWidgetByName(this._getChildName(i));
- td.element.attr("width", width);
- }
-
- if (i === 0) {
- td.element.addClass("first-element");
- }
- td.element.css({
- "position": "relative",
- "height": "100%",
- "vertical-align": "middle",
- "margin": "0",
- "padding": "0",
- "border": "none"
- });
- if (o.hgap + o.lgap + (item.lgap || 0) !== 0) {
- w.element.css({
- "margin-left": o.hgap + o.lgap + (item.lgap || 0) + "px"
- })
- }
- if (o.hgap + o.rgap + (item.rgap || 0) !== 0) {
- w.element.css({
- "margin-right": o.hgap + o.rgap + (item.rgap || 0) + "px"
- })
- }
- if (o.vgap + o.tgap + (item.tgap || 0) !== 0) {
- w.element.css({
- "margin-top": o.vgap + o.tgap + (item.tgap || 0) + "px"
- })
- }
- if (o.vgap + o.bgap + (item.bgap || 0) !== 0) {
- w.element.css({
- "margin-bottom": o.vgap + o.bgap + (item.bgap || 0) + "px"
- })
- }
- return td;
- },
-
- _mountChildren: function () {
- var self = this;
- var frag = document.createDocumentFragment();
- var hasChild = false;
- BI.each(this._children, function (i, widget) {
- if (widget.element !== self.element) {
- frag.appendChild(widget.element[0]);
- hasChild = true;
- }
- });
- if (hasChild === true) {
- this.$tr.append(frag);
- this.element.append(this.$table);
- }
- },
-
- _getWrapper: function () {
- return this.$tr;
- },
-
- resize: function () {
- // console.log("vertical_adapt布局不需要resize");
- },
-
- populate: function (items) {
- BI.VerticalAdaptLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.vertical_adapt', BI.VerticalAdaptLayout);/**
- * 水平方向居中自适应容器
- * @class BI.HorizontalAutoLayout
- * @extends BI.Layout
- */
-BI.HorizontalAutoLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.HorizontalAutoLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-horizon-auto-layout",
- hgap: 0,
- lgap: 0,
- rgap: 0,
- vgap: 0,
- tgap: 0,
- bgap: 0
- });
- },
-
- render: function () {
- BI.HorizontalAutoLayout.superclass.render.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- _addElement: function (i, item) {
- var o = this.options;
- var w = BI.HorizontalAutoLayout.superclass._addElement.apply(this, arguments);
- w.element.css({
- "position": "relative",
- "margin": "0px auto"
- });
- if (o.hgap + o.lgap + (item.lgap || 0) !== 0) {
- w.element.css({
- "margin-left": o.hgap + o.lgap + (item.lgap || 0) + "px"
- })
- }
- if (o.hgap + o.rgap + (item.rgap || 0) !== 0) {
- w.element.css({
- "margin-right": o.hgap + o.rgap + (item.rgap || 0) + "px"
- })
- }
- if (o.vgap + o.tgap + (item.tgap || 0) !== 0) {
- w.element.css({
- "margin-top": o.vgap + o.tgap + (item.tgap || 0) + "px"
- })
- }
- if (o.vgap + o.bgap + (item.bgap || 0) !== 0) {
- w.element.css({
- "margin-bottom": o.vgap + o.bgap + (item.bgap || 0) + "px"
- })
- }
- return w;
- },
-
- resize: function () {
- // console.log("horizontal_adapt布局不需要resize");
- },
-
- populate: function (items) {
- BI.HorizontalAutoLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.horizontal_auto', BI.HorizontalAutoLayout);/**
- * 浮动的居中布局
- */
-BI.FloatCenterAdaptLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.FloatCenterAdaptLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-float-center-adapt-layout",
- items: [],
- hgap: 0,
- vgap: 0,
- tgap: 0,
- bgap: 0,
- lgap: 0,
- rgap: 0
- });
- },
- render: function () {
- BI.FloatCenterAdaptLayout.superclass.render.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- resize: function () {
- // console.log("float_center_adapt布局不需要resize");
- },
-
- addItem: function () {
- //do nothing
- throw new Error("cannot be added")
- },
-
- mounted: function () {
- var self = this;
- var width = this.left.element.outerWidth(),
- height = this.left.element.outerHeight();
- this.left.element.width(width).height(height).css("float", "none");
- BI.remove(this._children, function (i, wi) {
- if (wi === self.container) {
- delete self._children[i];
- }
- });
- BI.createWidget({
- type: "bi.center_adapt",
- element: this,
- items: [this.left]
- });
- },
-
- stroke: function (items) {
- var self = this, o = this.options;
- this.left = BI.createWidget({
- type: "bi.vertical",
- items: items,
- hgap: o.hgap,
- vgap: o.vgap,
- tgap: o.tgap,
- bgap: o.bgap,
- lgap: o.lgap,
- rgap: o.rgap
- });
-
- this.container = BI.createWidget({
- type: "bi.left",
- element: this,
- items: [this.left]
- });
-
- },
-
- populate: function (items) {
- BI.FloatCenterAdaptLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.float_center_adapt', BI.FloatCenterAdaptLayout);/**
- * 浮动的水平居中布局
- */
-BI.FloatHorizontalLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.FloatHorizontalLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-float-horizontal-adapt-layout",
- items: [],
- hgap: 0,
- vgap: 0,
- tgap: 0,
- bgap: 0,
- lgap: 0,
- rgap: 0
- });
- },
- render: function () {
- BI.FloatHorizontalLayout.superclass.render.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- resize: function () {
- // console.log("float_horizontal_adapt布局不需要resize");
- },
-
- mounted: function () {
- var self = this;
- var width = this.left.element.width(),
- height = this.left.element.height();
- this.left.element.width(width).height(height).css("float", "none");
- BI.remove(this._children, function (i, wi) {
- if (wi === self.container) {
- delete self._children[i];
- }
- });
- BI.createWidget({
- type: "bi.horizontal_auto",
- element: this,
- items: [this.left]
- });
- },
-
- _addElement: function (i, item) {
- var self = this, o = this.options;
- this.left = BI.createWidget({
- type: "bi.vertical",
- items: [item],
- hgap: o.hgap,
- vgap: o.vgap,
- tgap: o.tgap,
- bgap: o.bgap,
- lgap: o.lgap,
- rgap: o.rgap
- });
-
- this.container = BI.createWidget({
- type: "bi.left",
- element: this,
- items: [this.left]
- });
-
- return this.left;
- },
-
- populate: function (items) {
- BI.HorizontalAutoLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.horizontal_float', BI.FloatHorizontalLayout);/**
- *自适应水平和垂直方向都居中容器
- * Created by GUY on 2016/12/2.
- *
- * @class BI.FlexCenterLayout
- * @extends BI.Layout
- */
-BI.FlexCenterLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.FlexCenterLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-flex-center-layout"
- });
- },
- render: function () {
- BI.FlexCenterLayout.superclass.render.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- _addElement: function (i, item) {
- var o = this.options;
- var w = BI.FlexCenterLayout.superclass._addElement.apply(this, arguments);
- w.element.css({"position": "relative", "flex-shrink": "0"});
- return w;
- },
-
- resize: function () {
- // console.log("flex_center布局不需要resize");
- },
-
- populate: function (items) {
- BI.FlexCenterLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.flex_center', BI.FlexCenterLayout);/**
- *自适应水平和垂直方向都居中容器
- * Created by GUY on 2016/12/2.
- *
- * @class BI.FlexHorizontalLayout
- * @extends BI.Layout
- */
-BI.FlexHorizontalLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.FlexHorizontalLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-flex-horizontal-layout",
- verticalAlign: BI.VerticalAlign.Top,
- columnSize: [],
- scrollx: true,
- hgap: 0,
- vgap: 0,
- lgap: 0,
- rgap: 0,
- tgap: 0,
- bgap: 0
- });
- },
- render: function () {
- BI.FlexHorizontalLayout.superclass.render.apply(this, arguments);
- var o = this.options;
- this.element.addClass(o.verticalAlign);
- this.populate(this.options.items);
- },
-
- _addElement: function (i, item) {
- var o = this.options;
- var w = BI.FlexHorizontalLayout.superclass._addElement.apply(this, arguments);
- w.element.css({"position": "relative", "flex-shrink": "0"});
- if (o.hgap + o.lgap + (item.lgap || 0) > 0) {
- w.element.css({
- "margin-left": o.hgap + o.lgap + (item.lgap || 0) + "px"
- })
- }
- if (o.hgap + o.rgap + (item.rgap || 0) > 0) {
- w.element.css({
- "margin-right": o.hgap + o.rgap + (item.rgap || 0) + "px"
- })
- }
- if (o.vgap + o.tgap + (item.tgap || 0) > 0) {
- w.element.css({
- "margin-top": o.vgap + o.tgap + (item.tgap || 0) + "px"
- })
- }
- if (o.vgap + o.bgap + (item.bgap || 0) > 0) {
- w.element.css({
- "margin-bottom": o.vgap + o.bgap + (item.bgap || 0) + "px"
- })
- }
- return w;
- },
-
- resize: function () {
- // console.log("flex_horizontal布局不需要resize");
- },
-
- populate: function (items) {
- BI.FlexHorizontalLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.flex_horizontal', BI.FlexHorizontalLayout);/**
- *自适应水平和垂直方向都居中容器
- * Created by GUY on 2016/12/2.
- *
- * @class BI.FlexVerticalCenter
- * @extends BI.Layout
- */
-BI.FlexVerticalCenter = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.FlexVerticalCenter.superclass.props.apply(this, arguments), {
- baseCls: "bi-flex-vertical-center",
- horizontalAlign: BI.HorizontalAlign.Left,
- columnSize: [],
- hgap: 0,
- vgap: 0,
- lgap: 0,
- rgap: 0,
- tgap: 0,
- bgap: 0
- });
- },
- render: function () {
- BI.FlexVerticalCenter.superclass.render.apply(this, arguments);
- var o = this.options;
- this.element.addClass(o.horizontalAlign);
- this.populate(this.options.items);
- },
-
- _addElement: function (i, item) {
- var o = this.options;
- var w = BI.FlexVerticalCenter.superclass._addElement.apply(this, arguments);
- w.element.css({"position": "relative", "flex-shrink": "0"});
- if (o.hgap + o.lgap + (item.lgap || 0) > 0) {
- w.element.css({
- "margin-left": o.hgap + o.lgap + (item.lgap || 0) + "px"
- })
- }
- if (o.hgap + o.rgap + (item.rgap || 0) > 0) {
- w.element.css({
- "margin-right": o.hgap + o.rgap + (item.rgap || 0) + "px"
- })
- }
- if (o.vgap + o.tgap + (item.tgap || 0) > 0) {
- w.element.css({
- "margin-top": o.vgap + o.tgap + (item.tgap || 0) + "px"
- })
- }
- if (o.vgap + o.bgap + (item.bgap || 0) > 0) {
- w.element.css({
- "margin-bottom": o.vgap + o.bgap + (item.bgap || 0) + "px"
- })
- }
- return w;
- },
-
- resize: function () {
- // console.log("flex_vertical_center布局不需要resize");
- },
-
- populate: function (items) {
- BI.FlexVerticalCenter.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.flex_vertical_center', BI.FlexVerticalCenter);/**
- *自适应水平和垂直方向都居中容器
- * Created by GUY on 2016/12/2.
- *
- * @class BI.FlexCenterLayout
- * @extends BI.Layout
- */
-BI.FlexCenterLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.FlexCenterLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-flex-wrapper-center-layout clearfix"
- });
- },
- render: function () {
- BI.FlexCenterLayout.superclass.render.apply(this, arguments);
- this.$wrapper = $("").addClass("flex-wrapper-center-layout-wrapper");
- this.populate(this.options.items);
- },
-
- _addElement: function (i, item) {
- var o = this.options;
- var w = BI.FlexCenterLayout.superclass._addElement.apply(this, arguments);
- w.element.css({"position": "relative"});
- return w;
- },
-
- _mountChildren: function () {
- var self = this;
- var frag = document.createDocumentFragment();
- var hasChild = false;
- BI.each(this._children, function (i, widget) {
- if (widget.element !== self.element) {
- frag.appendChild(widget.element[0]);
- hasChild = true;
- }
- });
- if (hasChild === true) {
- this.$wrapper.append(frag);
- this.element.append(this.$wrapper);
- }
- },
-
- _getWrapper: function(){
- return this.$wrapper;
- },
-
- resize: function () {
- // console.log("flex_center布局不需要resize");
- },
-
- populate: function (items) {
- BI.FlexCenterLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.flex_wrapper_center', BI.FlexCenterLayout);/**
- *自适应水平和垂直方向都居中容器
- * Created by GUY on 2016/12/2.
- *
- * @class BI.FlexHorizontalLayout
- * @extends BI.Layout
- */
-BI.FlexHorizontalLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.FlexHorizontalLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-flex-wrapper-horizontal-layout clearfix",
- verticalAlign: BI.VerticalAlign.Middle,
- columnSize: [],
- // scrollable: true,
- hgap: 0,
- vgap: 0,
- lgap: 0,
- rgap: 0,
- tgap: 0,
- bgap: 0
- });
- },
- render: function () {
- BI.FlexHorizontalLayout.superclass.render.apply(this, arguments);
- var o = this.options;
- this.$wrapper = $("
").addClass("flex-wrapper-horizontal-layout-wrapper " + o.verticalAlign);
- this.populate(this.options.items);
- },
-
- _addElement: function (i, item) {
- var o = this.options;
- var w = BI.FlexHorizontalLayout.superclass._addElement.apply(this, arguments);
- w.element.css({"position": "relative"});
- if (o.hgap + o.lgap + (item.lgap || 0) > 0) {
- w.element.css({
- "margin-left": o.hgap + o.lgap + (item.lgap || 0) + "px"
- })
- }
- if (o.hgap + o.rgap + (item.rgap || 0) > 0) {
- w.element.css({
- "margin-right": o.hgap + o.rgap + (item.rgap || 0) + "px"
- })
- }
- if (o.vgap + o.tgap + (item.tgap || 0) > 0) {
- w.element.css({
- "margin-top": o.vgap + o.tgap + (item.tgap || 0) + "px"
- })
- }
- if (o.vgap + o.bgap + (item.bgap || 0) > 0) {
- w.element.css({
- "margin-bottom": o.vgap + o.bgap + (item.bgap || 0) + "px"
- })
- }
- return w;
- },
-
- _mountChildren: function () {
- var self = this;
- var frag = document.createDocumentFragment();
- var hasChild = false;
- BI.each(this._children, function (i, widget) {
- if (widget.element !== self.element) {
- frag.appendChild(widget.element[0]);
- hasChild = true;
- }
- });
- if (hasChild === true) {
- this.$wrapper.append(frag);
- this.element.append(this.$wrapper);
- }
- },
-
- _getWrapper: function(){
- return this.$wrapper;
- },
-
- resize: function () {
- // console.log("flex_horizontal布局不需要resize");
- },
-
- populate: function (items) {
- BI.FlexHorizontalLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.flex_wrapper_horizontal', BI.FlexHorizontalLayout);/**
- *自适应水平和垂直方向都居中容器
- * Created by GUY on 2016/12/2.
- *
- * @class BI.FlexVerticalCenter
- * @extends BI.Layout
- */
-BI.FlexVerticalCenter = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.FlexVerticalCenter.superclass.props.apply(this, arguments), {
- baseCls: "bi-flex-wrapper-vertical-center clearfix",
- horizontalAlign: BI.HorizontalAlign.Middle,
- columnSize: [],
- // scrollable: true,
- hgap: 0,
- vgap: 0,
- lgap: 0,
- rgap: 0,
- tgap: 0,
- bgap: 0
- });
- },
- render: function () {
- BI.FlexVerticalCenter.superclass.render.apply(this, arguments);
- var o = this.options;
- this.$wrapper = $("
").addClass("flex-wrapper-vertical-center-wrapper " + o.horizontalAlign);
- this.populate(this.options.items);
- },
-
- _addElement: function (i, item) {
- var o = this.options;
- var w = BI.FlexVerticalCenter.superclass._addElement.apply(this, arguments);
- w.element.css({"position": "relative"});
- if (o.hgap + o.lgap + (item.lgap || 0) > 0) {
- w.element.css({
- "margin-left": o.hgap + o.lgap + (item.lgap || 0) + "px"
- })
- }
- if (o.hgap + o.rgap + (item.rgap || 0) > 0) {
- w.element.css({
- "margin-right": o.hgap + o.rgap + (item.rgap || 0) + "px"
- })
- }
- if (o.vgap + o.tgap + (item.tgap || 0) > 0) {
- w.element.css({
- "margin-top": o.vgap + o.tgap + (item.tgap || 0) + "px"
- })
- }
- if (o.vgap + o.bgap + (item.bgap || 0) > 0) {
- w.element.css({
- "margin-bottom": o.vgap + o.bgap + (item.bgap || 0) + "px"
- })
- }
- return w;
- },
-
- _mountChildren: function () {
- var self = this;
- var frag = document.createDocumentFragment();
- var hasChild = false;
- BI.each(this._children, function (i, widget) {
- if (widget.element !== self.element) {
- frag.appendChild(widget.element[0]);
- hasChild = true;
- }
- });
- if (hasChild === true) {
- this.$wrapper.append(frag);
- this.element.append(this.$wrapper);
- }
- },
-
- _getWrapper: function () {
- return this.$wrapper;
- },
-
- resize: function () {
- // console.log("flex_vertical_center布局不需要resize");
- },
-
- populate: function (items) {
- BI.FlexVerticalCenter.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.flex_wrapper_vertical_center', BI.FlexVerticalCenter);/**
- * 固定子组件上下左右的布局容器
- * @class BI.AbsoluteLayout
- * @extends BI.Layout
- */
-BI.AbsoluteLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.AbsoluteLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-absolute-layout",
- hgap: null,
- vgap: null,
- lgap: null,
- rgap: null,
- tgap: null,
- bgap: null
- });
- },
- render: function () {
- BI.AbsoluteLayout.superclass.render.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- _addElement: function (i, item) {
- var o = this.options;
- var w = BI.AbsoluteLayout.superclass._addElement.apply(this, arguments);
- var left = 0, right = 0, top = 0, bottom = 0;
- if (BI.isNotNull(item.left)) {
- w.element.css({"left": item.left});
- left += item.left;
- }
- if (BI.isNotNull(item.right)) {
- w.element.css({"right": item.right});
- right += item.right;
- }
- if (BI.isNotNull(item.top)) {
- w.element.css({"top": item.top});
- top += item.top;
- }
- if (BI.isNotNull(item.bottom)) {
- w.element.css({"bottom": item.bottom});
- bottom += item.bottom;
- }
-
- if (BI.isNotNull(o.hgap)) {
- left += o.hgap;
- w.element.css({"left": left});
- right += o.hgap;
- w.element.css({"right": right});
- }
- if (BI.isNotNull(o.vgap)) {
- top += o.vgap;
- w.element.css({"top": top});
- bottom += o.vgap;
- w.element.css({"bottom": bottom});
- }
-
- if (BI.isNotNull(o.lgap)) {
- left += o.lgap;
- w.element.css({"left": left});
- }
- if (BI.isNotNull(o.rgap)) {
- right += o.rgap;
- w.element.css({"right": right});
- }
- if (BI.isNotNull(o.tgap)) {
- top += o.tgap;
- w.element.css({"top": top});
- }
- if (BI.isNotNull(o.bgap)) {
- bottom += o.bgap;
- w.element.css({"bottom": bottom});
- }
-
-
- if (BI.isNotNull(item.width)) {
- w.element.css({"width": item.width});
- }
- if (BI.isNotNull(item.height)) {
- w.element.css({"height": item.height});
- }
- w.element.css({"position": "absolute"});
- return w;
- },
-
- resize: function () {
- this.stroke(this.options.items);
- },
-
- stroke: function (items) {
- this.options.items = items || [];
- var self = this;
- BI.each(items, function (i, item) {
- if (!!item) {
- if (!BI.isWidget(item) && !item.el) {
- throw new Error("el must be exist");
- }
- self._addElement(i, item);
- }
- });
- },
-
- populate: function (items) {
- BI.AbsoluteLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.absolute', BI.AbsoluteLayout);BI.AdaptiveLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.AdaptiveLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-adaptive-layout",
- hgap: null,
- vgap: null,
- lgap: null,
- rgap: null,
- tgap: null,
- bgap: null
- });
- },
- render: function () {
- BI.AdaptiveLayout.superclass.render.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- _addElement: function (i, item) {
- var o = this.options;
- var w = BI.AdaptiveLayout.superclass._addElement.apply(this, arguments);
- w.element.css({"position": "relative"});
- var left = 0, right = 0, top = 0, bottom = 0;
- if (BI.isNotNull(item.left)) {
- w.element.css({
- "margin-left": item.left
- })
- }
- if (BI.isNotNull(item.right)) {
- w.element.css({
- "margin-right": item.right
- })
- }
- if (BI.isNotNull(item.top)) {
- w.element.css({
- "margin-top": item.top
- })
- }
- if (BI.isNotNull(item.bottom)) {
- w.element.css({
- "margin-bottom": item.bottom
- })
- }
-
- if (BI.isNotNull(o.hgap)) {
- left += o.hgap;
- w.element.css({"left": left});
- right += o.hgap;
- w.element.css({"right": right});
- }
- if (BI.isNotNull(o.vgap)) {
- top += o.vgap;
- w.element.css({"top": top});
- bottom += o.vgap;
- w.element.css({"bottom": bottom});
- }
-
- if (BI.isNotNull(o.lgap)) {
- left += o.lgap;
- w.element.css({"left": left});
- }
- if (BI.isNotNull(o.rgap)) {
- right += o.rgap;
- w.element.css({"right": right});
- }
- if (BI.isNotNull(o.tgap)) {
- top += o.tgap;
- w.element.css({"top": top});
- }
- if (BI.isNotNull(o.bgap)) {
- bottom += o.bgap;
- w.element.css({"bottom": bottom});
- }
-
- if (BI.isNotNull(item.width)) {
- w.element.css({"width": item.width});
- }
- if (BI.isNotNull(item.height)) {
- w.element.css({"height": item.height});
- }
- return w;
- },
-
- resize: function () {
- this.stroke(this.options.items);
- },
-
- populate: function (items) {
- BI.AbsoluteLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.adaptive', BI.AdaptiveLayout);/**
- * 上下的高度固定/左右的宽度固定,中间的高度/宽度自适应
- *
- * @class BI.BorderLayout
- * @extends BI.Layout
- */
-BI.BorderLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.BorderLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-border-layout",
- items: {}
- });
- },
- render: function () {
- BI.BorderLayout.superclass.render.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- resize: function () {
- this.stroke(this.options.items);
- },
-
- addItem: function (item) {
- // do nothing
- throw new Error("cannot be added")
- },
-
- stroke: function(regions){
- var item;
- var top = 0;
- var bottom = 0;
- var left = 0;
- var right = 0;
- if ("north" in regions) {
- item = regions["north"];
- if (item != null) {
- if (item.el) {
- if (!this.hasWidget(this.getName() + "north")) {
- var w = BI.createWidget(item);
- this.addWidget(this.getName() + "north", w);
- }
- this.getWidgetByName(this.getName() + "north").element.height(item.height)
- .css({
- "position": "absolute",
- "top": (item.top || 0),
- "left": (item.left || 0),
- "right": (item.right || 0),
- "bottom": "initial"
- });
- }
- top = (item.height || 0) + (item.top || 0) + (item.bottom || 0);
- }
- }
- if ("south" in regions) {
- item = regions["south"];
- if (item != null) {
- if (item.el) {
- if (!this.hasWidget(this.getName() + "south")) {
- var w = BI.createWidget(item);
- this.addWidget(this.getName() + "south", w);
- }
- this.getWidgetByName(this.getName() + "south").element.height(item.height)
- .css({
- "position": "absolute",
- "bottom": (item.bottom || 0),
- "left": (item.left || 0),
- "right": (item.right || 0),
- "top": "initial"
- });
- }
- bottom = (item.height || 0) + (item.top || 0) + (item.bottom || 0);
- }
- }
- if ("west" in regions) {
- item = regions["west"];
- if (item != null) {
- if (item.el) {
- if (!this.hasWidget(this.getName() + "west")) {
- var w = BI.createWidget(item);
- this.addWidget(this.getName() + "west", w);
- }
- this.getWidgetByName(this.getName() + "west").element.width(item.width)
- .css({
- "position": "absolute",
- "left": (item.left || 0),
- top: top,
- bottom: bottom,
- "right": "initial"
- });
- }
- left = (item.width || 0) + (item.left || 0) + (item.right || 0);
- }
- }
- if ("east" in regions) {
- item = regions["east"];
- if (item != null) {
- if (item.el) {
- if (!this.hasWidget(this.getName() + "east")) {
- var w = BI.createWidget(item);
- this.addWidget(this.getName() + "east", w);
- }
- this.getWidgetByName(this.getName() + "east").element.width(item.width)
- .css({
- "position": "absolute",
- "right": (item.right || 0),
- top: top,
- bottom: bottom,
- "left": "initial"
- });
- }
- right = (item.width || 0) + (item.left || 0) + (item.right || 0);
- }
- }
- if ("center" in regions) {
- item = regions["center"];
- if (item != null) {
- if (!this.hasWidget(this.getName() + "center")) {
- var w = BI.createWidget(item);
- this.addWidget(this.getName() + "center", w);
- }
- this.getWidgetByName(this.getName() + "center").element
- .css({"position": "absolute", "top": top, "bottom": bottom, "left": left, "right": right});
- }
- }
- },
-
- populate: function (items) {
- BI.BorderLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.border', BI.BorderLayout);/**
- * 卡片布局,可以做到当前只显示一个组件,其他的都隐藏
- * @class BI.CardLayout
- * @extends BI.Layout
- *
- * @cfg {JSON} options 配置属性
- * @cfg {String} options.defaultShowName 默认展示的子组件名
- */
-BI.CardLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.CardLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-card-layout",
- items: []
- });
- },
- render: function () {
- BI.CardLayout.superclass.render.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- resize: function () {
- // console.log("default布局不需要resize");
- },
-
- stroke: function (items) {
- var self = this, o = this.options;
- this.showIndex = void 0;
- BI.each(items, function (i, item) {
- if (!!item) {
- if (!self.hasWidget(item.cardName)) {
- var w = BI.createWidget(item);
- w.on(BI.Events.DESTROY, function () {
- var index = BI.findIndex(o.items, function (i, tItem) {
- return tItem.cardName == item.cardName;
- });
- if (index > -1) {
- o.items.splice(index, 1);
- }
- });
- self.addWidget(item.cardName, w);
- } else {
- var w = self.getWidgetByName(item.cardName);
- }
- w.element.css({"position": "absolute", "top": "0", "right": "0", "bottom": "0", "left": "0"});
- w.setVisible(false);
- }
- });
- },
-
- update: function () {
- },
-
- empty: function () {
- BI.CardLayout.superclass.empty.apply(this, arguments);
- this.options.items = [];
- },
-
- populate: function (items) {
- BI.CardLayout.superclass.populate.apply(this, arguments);
- this._mount();
- this.options.defaultShowName && this.showCardByName(this.options.defaultShowName);
- },
-
- isCardExisted: function (cardName) {
- return BI.some(this.options.items, function (i, item) {
- return item.cardName == cardName && item.el;
- });
- },
-
- getCardByName: function (cardName) {
- if (!this.isCardExisted(cardName)) {
- throw new Error("cardName is not exist");
- }
- return this._children[cardName];
- },
-
- _deleteCardByName: function (cardName) {
- delete this._children[cardName];
- var index = BI.findIndex(this.options.items, function (i, item) {
- return item.cardName == cardName;
- });
- if (index > -1) {
- this.options.items.splice(index, 1);
- }
- },
-
- deleteCardByName: function (cardName) {
- if (!this.isCardExisted(cardName)) {
- throw new Error("cardName is not exist");
- }
-
- var child = this._children[cardName];
- this._deleteCardByName(cardName);
- child && child._destroy();
- },
-
- addCardByName: function (cardName, cardItem) {
- if (this.isCardExisted(cardName)) {
- throw new Error("cardName is already exist");
- }
- var widget = BI.createWidget(cardItem);
- widget.element.css({
- "position": "relative",
- "top": "0",
- "left": "0",
- "width": "100%",
- "height": "100%"
- }).appendTo(this.element);
- widget.invisible();
- this.addWidget(cardName, widget);
- this.options.items.push({el: cardItem, cardName: cardName});
- return widget;
- },
-
- showCardByName: function (name, action, callback) {
- var self = this;
- //name不存在的时候全部隐藏
- var exist = this.isCardExisted(name);
- if (this.showIndex != null) {
- this.lastShowIndex = this.showIndex;
- }
- this.showIndex = name;
- var flag = false;
- BI.each(this.options.items, function (i, item) {
- var el = self._children[item.cardName];
- if (el) {
- if (name != item.cardName) {
- //动画效果只有在全部都隐藏的时候才有意义,且只要执行一次动画操作就够了
- !flag && !exist && (BI.Action && action instanceof BI.Action) ? (action.actionBack(el), flag = true) : el.invisible();
- } else {
- (BI.Action && action instanceof BI.Action) ? action.actionPerformed(void 0, el, callback) : (el.visible(), callback && callback())
- }
- }
- });
- },
-
- showLastCard: function () {
- var self = this;
- this.showIndex = this.lastShowIndex;
- BI.each(this.options.items, function (i, item) {
- self._children[item.cardName].setVisible(self.showIndex == i);
- })
- },
-
- setDefaultShowName: function (name) {
- this.options.defaultShowName = name;
- return this;
- },
-
- getDefaultShowName: function () {
- return this.options.defaultShowName;
- },
-
- getAllCardNames: function () {
- return BI.map(this.options.items, function (i, item) {
- return item.cardName;
- })
- },
-
- getShowingCard: function () {
- if (!BI.isKey(this.showIndex)) {
- return void 0;
- }
- return this.getWidgetByName(this.showIndex);
- },
-
- deleteAllCard: function () {
- var self = this;
- BI.each(this.getAllCardNames(), function (i, name) {
- self.deleteCardByName(name);
- })
- },
-
- hideAllCard: function () {
- var self = this;
- BI.each(this.options.items, function (i, item) {
- self._children[item.cardName].invisible();
- });
- },
-
- isAllCardHide: function () {
- var self = this;
- var flag = true;
- BI.some(this.options.items, function (i, item) {
- if (self._children[item.cardName].isVisible()) {
- flag = false;
- return false;
- }
- });
- return flag;
- },
-
- removeWidget: function (nameOrWidget) {
- var removeName;
- if (BI.isWidget(nameOrWidget)) {
- BI.each(this._children, function (name, child) {
- if (child === nameOrWidget) {
- removeName = name;
- }
- })
- } else {
- removeName = nameOrWidget;
- }
- if (removeName) {
- this._deleteCardByName(removeName);
- }
- }
-});
-BI.shortcut('bi.card', BI.CardLayout);/**
- * 默认的布局方式
- *
- * @class BI.DefaultLayout
- * @extends BI.Layout
- */
-BI.DefaultLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.DefaultLayout.superclass.props.apply(this, arguments), {
- hgap: 0,
- vgap: 0,
- lgap: 0,
- rgap: 0,
- tgap: 0,
- bgap: 0,
- items: []
- });
- },
- render: function () {
- BI.DefaultLayout.superclass.render.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- _addElement: function (i, item) {
- var o = this.options;
- var w = BI.DefaultLayout.superclass._addElement.apply(this, arguments);
- if (o.vgap + o.tgap + (item.tgap || 0) !== 0) {
- w.element.css({
- "margin-top": o.vgap + o.tgap + (item.tgap || 0) + "px"
- })
- }
- if (o.hgap + o.lgap + (item.lgap || 0) !== 0) {
- w.element.css({
- "margin-left": o.hgap + o.lgap + (item.lgap || 0) + "px"
- })
- }
- if (o.hgap + o.rgap + (item.rgap || 0) !== 0) {
- w.element.css({
- "margin-right": o.hgap + o.rgap + (item.rgap || 0) + "px"
- })
- }
- if (o.vgap + o.bgap + (item.bgap || 0) !== 0) {
- w.element.css({
- "margin-bottom": o.vgap + o.bgap + (item.bgap || 0) + "px"
- })
- }
- return w;
- },
-
- resize: function () {
- // console.log("default布局不需要resize")
- },
-
- populate: function (items) {
- BI.DefaultLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.default', BI.DefaultLayout);/**
- * 分隔容器的控件,按照宽度和高度所占比平分整个容器
- *
- * @class BI.DivisionLayout
- * @extends BI.Layout
- */
-BI.DivisionLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.DivisionLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-division-layout",
- columns: null,
- rows: null,
- items: []
- // [
- // {
- // column: 0,
- // row: 0,
- // width: 0.25,
- // height: 0.33,
- // el: {type: 'bi.button', text: 'button1'}
- // },
- // {
- // column: 1,
- // row: 1,
- // width: 0.25,
- // height: 0.33,
- // el: {type: 'bi.button', text: 'button2'}
- // },
- // {
- // column: 3,
- // row: 2,
- // width: 0.25,
- // height: 0.33,
- // el: {type: 'bi.button', text: 'button3'}
- // }
- //]
- });
- },
- render: function () {
- BI.DivisionLayout.superclass.render.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- resize: function () {
- this.stroke(this.opitons.items);
- },
-
- addItem: function (item) {
- // do nothing
- throw new Error("cannot be added")
- },
-
- stroke: function(items){
- var o = this.options;
- var rows = o.rows || o.items.length, columns = o.columns || ((o.items[0] && o.items[0].length) | 0);
- var map = BI.makeArray(rows), widths = {}, heights = {};
- function firstElement(item, row, col) {
- if (row === 0) {
- item.addClass("first-row")
- }
- if (col === 0) {
- item.addClass("first-col");
- }
- item.addClass(BI.isOdd(row + 1) ? "odd-row" : "even-row");
- item.addClass(BI.isOdd(col + 1) ? "odd-col" : "even-col");
- item.addClass("center-element");
- }
-
- function firstObject(item, row, col) {
- var cls = "";
- if (row === 0) {
- cls += " first-row";
- }
- if (col === 0) {
- cls += " first-col";
- }
- BI.isOdd(row + 1) ? (cls += " odd-row") : (cls += " even-row");
- BI.isOdd(col + 1) ? (cls += " odd-col") : (cls += " even-col");
- item.cls = (item.cls || "") + cls + " center-element";
- }
-
- function first(item, row, col) {
- if (item instanceof BI.Widget) {
- firstElement(item.element, row, col);
- } else if (item.el instanceof BI.Widget) {
- firstElement(item.el.element, row, col);
- } else if (item.el) {
- firstObject(item.el, row, col)
- } else {
- firstObject(item, row, col);
- }
- }
- BI.each(map, function (i) {
- map[i] = BI.makeArray(columns);
- });
- BI.each(items, function (i, item) {
- if (BI.isArray(item)) {
- BI.each(item, function (j, el) {
- widths[i] = (widths[i] || 0) + item.width;
- heights[j] = (heights[j] || 0) + item.height;
- map[i][j] = el;
- });
- return;
- }
- widths[item.row] = (widths[item.row] || 0) + item.width;
- heights[item.column] = (heights[item.column] || 0) + item.height;
- map[item.row][item.column] = item;
- });
- for (var i = 0; i < rows; i++) {
- var totalW = 0;
- for (var j = 0; j < columns; j++) {
- if (!map[i][j]) {
- throw new Error("item be required");
- }
- if(!this.hasWidget(this.getName() + i + "_" + j)) {
- var w = BI.createWidget(map[i][j]);
- this.addWidget(this.getName() + i + "_" + j, w);
- } else {
- w = this.getWidgetByName(this.getName() + i + "_" + j);
- }
- var left = totalW * 100 / widths[i];
- w.element.css({"position": "absolute", "left": left + "%"});
- if (j > 0) {
- var lastW = this.getWidgetByName(this.getName() + i + "_" + (j - 1));
- lastW.element.css({"right": (100 - left) + "%"});
- }
- if (j == o.columns - 1) {
- w.element.css({"right": "0%"});
- }
- first(w, i, j);
- totalW += map[i][j].width;
- }
- }
- for (var j = 0; j < o.columns; j++) {
- var totalH = 0;
- for (var i = 0; i < o.rows; i++) {
- var w = this.getWidgetByName(this.getName() + i + "_" + j);
- var top = totalH * 100 / heights[j];
- w.element.css({"top": top + "%"});
- if (i > 0) {
- var lastW = this.getWidgetByName(this.getName() + (i - 1) + "_" + j);
- lastW.element.css({"bottom": (100 - top) + "%"});
- }
- if (i == o.rows - 1) {
- w.element.css({"bottom": "0%"});
- }
- totalH += map[i][j].height;
- }
- }
- },
-
- populate: function (items) {
- BI.DivisionLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.division', BI.DivisionLayout);/**
- * 靠左对齐的自由浮动布局
- * @class BI.FloatLeftLayout
- * @extends BI.Layout
- *
- * @cfg {JSON} options 配置属性
- * @cfg {Number} [hgap=0] 水平间隙
- * @cfg {Number} [vgap=0] 垂直间隙
- */
-BI.FloatLeftLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.FloatLeftLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-float-left-layout clearfix",
- hgap: 0,
- vgap: 0,
- lgap: 0,
- rgap: 0,
- tgap: 0,
- bgap: 0
- });
- },
- render: function () {
- BI.FloatLeftLayout.superclass.render.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- _addElement: function (i, item) {
- var o = this.options;
- var w = BI.FloatLeftLayout.superclass._addElement.apply(this, arguments);
- w.element.css({"position": "relative", "float": "left"});
- if (BI.isNotNull(item.left)) {
- w.element.css({"left": item.left});
- }
- if (BI.isNotNull(item.right)) {
- w.element.css({"right": item.right});
- }
- if (BI.isNotNull(item.top)) {
- w.element.css({"top": item.top});
- }
- if ((item.lgap || 0) + o.hgap + o.lgap !== 0) {
- w.element.css("margin-left", (item.lgap || 0) + o.hgap + o.lgap);
- }
- if ((item.rgap || 0) + o.hgap + o.rgap !== 0) {
- w.element.css("margin-right", (item.rgap || 0) + o.hgap + o.rgap);
- }
- if ((item.tgap || 0) + o.vgap + o.tgap !== 0) {
- w.element.css("margin-top", (item.tgap || 0) + o.vgap + o.tgap);
- }
- if ((item.bgap || 0) + o.vgap + o.bgap !== 0) {
- w.element.css("margin-bottom", (item.bgap || 0) + o.vgap + o.bgap);
- }
- return w;
- },
-
- resize: function () {
- this.stroke(this.options.items);
- },
-
- populate: function (items) {
- BI.FloatLeftLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.left', BI.FloatLeftLayout);
-
-/**
- * 靠右对齐的自由浮动布局
- * @class BI.FloatRightLayout
- * @extends BI.Layout
- *
- * @cfg {JSON} options 配置属性
- * @cfg {Number} [hgap=0] 水平间隙
- * @cfg {Number} [vgap=0] 垂直间隙
- */
-BI.FloatRightLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.FloatRightLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-float-right-layout clearfix",
- hgap: 0,
- vgap: 0,
- lgap: 0,
- rgap: 0,
- tgap: 0,
- bgap: 0
- });
- },
- render: function () {
- BI.FloatRightLayout.superclass.render.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- _addElement: function (i, item) {
- var o = this.options;
- var w = BI.FloatRightLayout.superclass._addElement.apply(this, arguments);
- w.element.css({"position": "relative", "float": "right"});
- if (BI.isNotNull(item.left)) {
- w.element.css({"left": item.left});
- }
- if (BI.isNotNull(item.right)) {
- w.element.css({"right": item.right});
- }
- if (BI.isNotNull(item.top)) {
- w.element.css({"top": item.top});
- }
- if ((item.lgap || 0) + o.hgap + o.lgap !== 0) {
- w.element.css("margin-left", (item.lgap || 0) + o.hgap + o.lgap);
- }
- if ((item.rgap || 0) + o.hgap + o.rgap !== 0) {
- w.element.css("margin-right", (item.rgap || 0) + o.hgap + o.rgap);
- }
- if ((item.tgap || 0) + o.vgap + o.tgap !== 0) {
- w.element.css("margin-top", (item.tgap || 0) + o.vgap + o.tgap);
- }
- if ((item.bgap || 0) + o.vgap + o.bgap !== 0) {
- w.element.css("margin-bottom", (item.bgap || 0) + o.vgap + o.bgap);
- }
- return w;
- },
-
- resize: function () {
- this.stroke(this.options.items);
- },
-
- populate: function (items) {
- BI.FloatRightLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.right', BI.FloatRightLayout);/**
- * 上下的高度固定/左右的宽度固定,中间的高度/宽度自适应
- *
- * @class BI.BorderLayout
- * @extends BI.Layout
- */
-BI.GridLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.GridLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-grid-layout",
- columns: null,
- rows: null,
- items: []
- /*[
- {
- column: 0,
- row: 0,
- el: {type: 'bi.button', text: 'button1'}
- },
- {
- column: 1,
- row: 1,
- el: {type: 'bi.button', text: 'button2'}
- },
- {
- column: 3,
- row: 2,
- el: {type: 'bi.button', text: 'button3'}
- }
- ]*/
- });
- },
- render: function () {
- BI.GridLayout.superclass.render.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- resize: function () {
- // console.log("grid布局不需要resize")
- },
-
- addItem: function () {
- //do nothing
- throw new Error("cannot be added")
- },
-
- stroke: function (items) {
- var o = this.options;
- var rows = o.rows || o.items.length, columns = o.columns || ((o.items[0] && o.items[0].length) | 0);
- var width = 100 / columns, height = 100 / rows;
- var els = [];
- for (var i = 0; i < rows; i++) {
- els[i] = [];
- }
- function firstElement(item, row, col) {
- if (row === 0) {
- item.addClass("first-row")
- }
- if (col === 0) {
- item.addClass("first-col");
- }
- item.addClass(BI.isOdd(row + 1) ? "odd-row" : "even-row");
- item.addClass(BI.isOdd(col + 1) ? "odd-col" : "even-col");
- item.addClass("center-element");
- }
-
- function firstObject(item, row, col) {
- var cls = "";
- if (row === 0) {
- cls += " first-row";
- }
- if (col === 0) {
- cls += " first-col";
- }
- BI.isOdd(row + 1) ? (cls += " odd-row") : (cls += " even-row");
- BI.isOdd(col + 1) ? (cls += " odd-col") : (cls += " even-col");
- item.cls = (item.cls || "") + cls + " center-element";
- }
-
- function first(item, row, col) {
- if (item instanceof BI.Widget) {
- firstElement(item.element, row, col);
- } else if (item.el instanceof BI.Widget) {
- firstElement(item.el.element, row, col);
- } else if (item.el) {
- firstObject(item.el, row, col)
- } else {
- firstObject(item, row, col);
- }
- }
-
- BI.each(items, function (i, item) {
- if (BI.isArray(item)) {
- BI.each(item, function (j, el) {
- els[i][j] = BI.createWidget(el);
- });
- return;
- }
- els[item.row][item.column] = BI.createWidget(item);
- });
- for (var i = 0; i < rows; i++) {
- for (var j = 0; j < columns; j++) {
- if (!els[i][j]) {
- els[i][j] = BI.createWidget({
- type: "bi.layout"
- });
- }
- first(els[i][j], i, j);
- els[i][j].element.css({
- "position": "absolute",
- "top": height * i + "%",
- "left": width * j + "%",
- "right": (100 - (width * (j + 1))) + "%",
- "bottom": (100 - (height * (i + 1))) + "%"
- });
- this.addWidget(els[i][j]);
- }
- }
- },
-
- populate: function (items) {
- BI.GridLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.grid', BI.GridLayout);/**
- * 水平布局
- * @class BI.HorizontalLayout
- * @extends BI.Layout
- */
-BI.HorizontalLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.HorizontalLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-horizontal-layout",
- verticalAlign: BI.VerticalAlign.Top,
- columnSize: [],
- scrollx: true,
- hgap: 0,
- vgap: 0,
- lgap: 0,
- rgap: 0,
- tgap: 0,
- bgap: 0
- });
- },
- render: function () {
- BI.HorizontalLayout.superclass.render.apply(this, arguments);
- this.$table = $("
").attr({"cellspacing": 0, "cellpadding": 0}).css({
- "position": "relative",
- "white-space": "nowrap",
- "border-spacing": "0px",
- "border": "none",
- "border-collapse": "separate"
- });
- this.$tr = $("");
- this.$tr.appendTo(this.$table);
- this.populate(this.options.items);
- },
-
- _addElement: function (i, item) {
- var o = this.options;
- var td;
- var width = o.columnSize[i] <= 1 ? (o.columnSize[i] * 100 + "%") : o.columnSize[i];
- if (!this.hasWidget(this._getChildName(i))) {
- var w = BI.createWidget(item);
- w.element.css({"position": "relative", "margin": "0px auto"});
- td = BI.createWidget({
- type: "bi.default",
- tagName: "td",
- attributes: {
- width: width
- },
- items: [w]
- });
- this.addWidget(this._getChildName(i), td);
- } else {
- td = this.getWidgetByName(this._getChildName(i));
- td.element.attr("width", width);
- }
-
- if (i === 0) {
- td.element.addClass("first-element");
- }
- td.element.css({
- "position": "relative",
- "vertical-align": o.verticalAlign,
- "margin": "0",
- "padding": "0",
- "border": "none"
- });
- if (o.hgap + o.lgap + (item.lgap || 0) > 0) {
- w.element.css({
- "margin-left": o.hgap + o.lgap + (item.lgap || 0) + "px"
- })
- }
- if (o.hgap + o.rgap + (item.rgap || 0) > 0) {
- w.element.css({
- "margin-right": o.hgap + o.rgap + (item.rgap || 0) + "px"
- })
- }
- if (o.vgap + o.tgap + (item.tgap || 0) > 0) {
- w.element.css({
- "margin-top": o.vgap + o.tgap + (item.tgap || 0) + "px"
- })
- }
- if (o.vgap + o.bgap + (item.bgap || 0) > 0) {
- w.element.css({
- "margin-bottom": o.vgap + o.bgap + (item.bgap || 0) + "px"
- })
- }
- return td;
- },
-
- _mountChildren: function () {
- var self = this;
- var frag = document.createDocumentFragment();
- var hasChild = false;
- BI.each(this._children, function (i, widget) {
- if (widget.element !== self.element) {
- frag.appendChild(widget.element[0]);
- hasChild = true;
- }
- });
- if (hasChild === true) {
- this.$tr.append(frag);
- this.element.append(this.$table);
- }
- },
-
-
- resize: function () {
- // console.log("horizontal layout do not need to resize");
- },
-
- _getWrapper: function(){
- return this.$tr;
- },
-
- populate: function (items) {
- BI.HorizontalLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.horizontal', BI.HorizontalLayout);
-
-/**
- * 水平布局
- * @class BI.HorizontalCellLayout
- * @extends BI.Layout
- */
-BI.HorizontalCellLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.HorizontalCellLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-horizontal-cell-layout",
- scrollable: true,
- hgap: 0,
- vgap: 0,
- lgap: 0,
- rgap: 0,
- tgap: 0,
- bgap: 0
- });
- },
- render: function () {
- BI.HorizontalCellLayout.superclass.render.apply(this, arguments);
- this.element.css({"display": "table", "vertical-align": "top"});
- this.populate(this.options.items);
- },
-
- _addElement: function (i, item) {
- var o = this.options;
- var w = BI.HorizontalCellLayout.superclass._addElement.apply(this, arguments);
- w.element.css({"position": "relative", "display": "table-cell", "vertical-align": "middle"});
- if (o.hgap + o.lgap > 0) {
- w.element.css({
- "margin-left": o.hgap + o.lgap + "px"
- })
- }
- if (o.hgap + o.rgap > 0) {
- w.element.css({
- "margin-right": o.hgap + o.rgap + "px"
- })
- }
- if (o.vgap + o.tgap > 0) {
- w.element.css({
- "margin-top": o.vgap + o.tgap + "px"
- })
- }
- if (o.vgap + o.bgap > 0) {
- w.element.css({
- "margin-bottom": o.vgap + o.bgap + "px"
- })
- }
- return w;
- },
-
- resize: function () {
- // console.log("horizontal do not need to resize");
- },
-
- populate: function (items) {
- BI.HorizontalCellLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.horizontal_cell', BI.HorizontalCellLayout);/**
- * 靠左对齐的自由浮动布局
- * @class BI.LatticeLayout
- * @extends BI.Layout
- *
- * @cfg {JSON} options 配置属性
- * @cfg {Number} [hgap=0] 水平间隙
- * @cfg {Number} [vgap=0] 垂直间隙
- */
-BI.LatticeLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.LatticeLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-lattice-layout clearfix"
- //columnSize: [0.2, 0.2, 0.6],
- });
- },
- render: function () {
- BI.LatticeLayout.superclass.render.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- _addElement: function (i, item) {
- var o = this.options;
- var w = BI.LatticeLayout.superclass._addElement.apply(this, arguments);
- if (o.columnSize && o.columnSize[i]) {
- var width = o.columnSize[i] / BI.sum(o.columnSize) * 100 + "%";
- } else {
- var width = 1 / this.options.items.length * 100 + "%"
- }
- w.element.css({"position": "relative", "float": "left", "width": width});
- return w;
- },
-
- addItem: function (item) {
- var w = BI.LatticeLayout.superclass.addItem.apply(this, arguments);
- this.resize();
- return w;
- },
-
- addItemAt: function (item) {
- var w = BI.LatticeLayout.superclass.addItemAt.apply(this, arguments);
- this.resize();
- return w;
- },
-
- resize: function () {
- this.stroke(this.options.items);
- },
-
- populate: function (items) {
- BI.LatticeLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.lattice', BI.LatticeLayout);/**
- * 上下的高度固定/左右的宽度固定,中间的高度/宽度自适应
- *
- * @class BI.TableLayout
- * @extends BI.Layout
- */
-BI.TableLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.TableLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-table-layout",
- scrolly: true,
- columnSize: [200, 200, 'fill'],
- rowSize: 30, //or [30,30,30]
- hgap: 0,
- vgap: 0,
- items: [[
- {
- el: {text: 'label1'}
- },
- {
- el: {text: 'label2'}
- },
- {
- el: {text: 'label3'}
- }
- ]]
- });
- },
- render: function () {
- BI.TableLayout.superclass.render.apply(this, arguments);
- this.rows = 0;
- this.populate(this.options.items);
- },
-
- _addElement: function (idx, arr) {
- var o = this.options;
- var abs = [], left = 0, right = 0, i, j;
-
- function firstElement(item, row, col) {
- if (row === 0) {
- item.addClass("first-row")
- }
- if (col === 0) {
- item.addClass("first-col");
- }
- item.addClass(BI.isOdd(row + 1) ? "odd-row" : "even-row");
- item.addClass(BI.isOdd(col + 1) ? "odd-col" : "even-col");
- item.addClass("center-element");
- }
-
- function firstObject(item, row, col) {
- var cls = "";
- if (row === 0) {
- cls += " first-row";
- }
- if (col === 0) {
- cls += " first-col";
- }
- BI.isOdd(row + 1) ? (cls += " odd-row") : (cls += " even-row");
- BI.isOdd(col + 1) ? (cls += " odd-col") : (cls += " even-col");
- item.cls = (item.cls || "") + cls + " center-element";
- }
-
- function first(item, row, col) {
- if (item instanceof BI.Widget) {
- firstElement(item.element, row, col);
- } else if (item.el instanceof BI.Widget) {
- firstElement(item.el.element, row, col);
- } else if (item.el) {
- firstObject(item.el, row, col)
- } else {
- firstObject(item, row, col);
- }
- }
-
- for (i = 0; i < arr.length; i++) {
- if (BI.isNumber(o.columnSize[i])) {
- first(arr[i], this.rows, i);
- abs.push(BI.extend({
- top: 0,
- bottom: 0,
- left: o.columnSize[i] <= 1 ? left * 100 + "%" : left,
- width: o.columnSize[i] <= 1 ? o.columnSize[i] * 100 + "%" : o.columnSize[i]
- }, arr[i]));
- left += o.columnSize[i] + (o.columnSize[i] < 1 ? 0 : o.hgap);
- } else {
- break;
- }
- }
- for (j = arr.length - 1; j > i; j--) {
- if (BI.isNumber(o.columnSize[j])) {
- first(arr[j], this.rows, j);
- abs.push(BI.extend({
- top: 0,
- bottom: 0,
- right: o.columnSize[j] <= 1 ? right * 100 + "%" : right,
- width: o.columnSize[j] <= 1 ? o.columnSize[j] * 100 + "%" : o.columnSize[j]
- }, arr[j]))
- right += o.columnSize[j] + (o.columnSize[j] < 1 ? 0 : o.hgap);
- } else {
- throw new Error("item with fill can only be one");
- }
- }
- if (i >= 0 && i < arr.length) {
- first(arr[i], this.rows, i);
- abs.push(BI.extend({
- top: 0,
- bottom: 0,
- left: left <= 1 ? left * 100 + "%" : left,
- right: right <= 1 ? right * 100 + "%" : right
- }, arr[i]))
- }
- var w = BI.createWidget({
- type: "bi.absolute",
- height: BI.isArray(o.rowSize) ? o.rowSize[this.rows] : o.rowSize,
- items: abs
- });
- if (this.rows > 0) {
- this.getWidgetByName(this.getName() + (this.rows - 1)).element.css({
- "margin-bottom": o.vgap
- })
- }
- w.element.css({
- "position": "relative"
- });
- this.addWidget(this.getName() + (this.rows++), w);
- return w;
- },
-
- resize: function () {
- // console.log("table布局不需要resize");
- },
-
- addItem: function (arr) {
- if (!BI.isArray(arr)) {
- throw new Error("item must be array");
- }
- return BI.TableLayout.superclass.addItem.apply(this, arguments);
- },
-
- populate: function (items) {
- BI.TableLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.table', BI.TableLayout);/**
- * 水平tape布局
- * @class BI.HTapeLayout
- * @extends BI.Layout
- */
-BI.HTapeLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.HTapeLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-h-tape-layout",
- hgap: 0,
- vgap: 0,
- lgap: 0,
- rgap: 0,
- tgap: 0,
- bgap: 0,
- items: [
- {
- width: 100,
- el: {type: 'bi.button', text: 'button1'}
- },
- {
- width: 'fill',
- el: {type: 'bi.button', text: 'button2'}
- },
- {
- width: 200,
- el: {type: 'bi.button', text: 'button3'}
- }
- ]
- });
- },
- render: function () {
- BI.HTapeLayout.superclass.render.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- resize: function () {
- this.stroke(this.options.items);
- },
- addItem: function (item) {
- // do nothing
- throw new Error("cannot be added")
- },
-
- stroke: function (items) {
- var self = this, o = this.options;
- items = BI.compact(items);
- BI.each(items, function (i, item) {
- if (!self.hasWidget(self.getName() + i + "")) {
- var w = BI.createWidget(item);
- self.addWidget(self.getName() + i + "", w);
- } else {
- w = self.getWidgetByName(self.getName() + i + "");
- }
- w.element.css({"position": "absolute", top: o.vgap + o.tgap + "px", bottom: o.vgap + o.bgap + "px"});
- });
-
- var left = {}, right = {};
- left[0] = 0;
- right[items.length - 1] = 0;
-
- BI.any(items, function (i, item) {
- var w = self.getWidgetByName(self.getName() + i + "");
- if (BI.isNull(left[i])) {
- left[i] = left[i - 1] + items[i - 1].width + 2 * o.hgap + o.lgap + o.rgap;
- }
- if (item.width < 1 && item.width >= 0) {
- w.element.css({"left": left[i] * 100 + "%", width: item.width * 100 + "%"})
- } else {
- w.element.css({
- "left": left[i] + o.hgap + o.lgap + "px",
- width: BI.isNumber(item.width) ? item.width : ""
- });
- }
- if (!BI.isNumber(item.width)) {
- return true;
- }
- });
- BI.backAny(items, function (i, item) {
- var w = self.getWidgetByName(self.getName() + i + "");
- if (BI.isNull(right[i])) {
- right[i] = right[i + 1] + items[i + 1].width + 2 * o.hgap + o.lgap + o.rgap;
- }
- if (item.width < 1 && item.width >= 0) {
- w.element.css({"right": right[i] * 100 + "%", width: item.width * 100 + "%"})
- } else {
- w.element.css({
- "right": right[i] + o.hgap + o.rgap + "px",
- width: BI.isNumber(item.width) ? item.width : ""
- });
- }
- if (!BI.isNumber(item.width)) {
- return true;
- }
- })
- },
-
- populate: function (items) {
- BI.HTapeLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.htape', BI.HTapeLayout);
-
-/**
- * 垂直tape布局
- * @class BI.VTapeLayout
- * @extends BI.Layout
- */
-BI.VTapeLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.VTapeLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-v-tape-layout",
- hgap: 0,
- vgap: 0,
- lgap: 0,
- rgap: 0,
- tgap: 0,
- bgap: 0,
- items: [
- {
- height: 100,
- el: {type: 'bi.button', text: 'button1'}
- },
- {
- height: 'fill',
- el: {type: 'bi.button', text: 'button2'}
- },
- {
- height: 200,
- el: {type: 'bi.button', text: 'button3'}
- }
- ]
- });
- },
- render: function () {
- BI.VTapeLayout.superclass.render.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- resize: function () {
- this.stroke(this.options.items);
- },
-
- addItem: function (item) {
- // do nothing
- throw new Error("cannot be added")
- },
-
- stroke: function (items) {
- var self = this, o = this.options;
- items = BI.compact(items);
- BI.each(items, function (i, item) {
- if (!self.hasWidget(self.getName() + i + "")) {
- var w = BI.createWidget(item);
- self.addWidget(self.getName() + i + "", w);
- } else {
- w = self.getWidgetByName(self.getName() + i + "");
- }
- w.element.css({"position": "absolute", left: o.hgap + o.lgap + "px", right: o.hgap + o.rgap + "px"});
- });
-
- var top = {}, bottom = {};
- top[0] = 0;
- bottom[items.length - 1] = 0;
-
- BI.any(items, function (i, item) {
- var w = self.getWidgetByName(self.getName() + i + "");
- if (BI.isNull(top[i])) {
- top[i] = top[i - 1] + items[i - 1].height + 2 * o.vgap + o.tgap + o.bgap;
- }
- if (item.height < 1 && item.height >= 0) {
- w.element.css({"top": top[i] * 100 + "%", height: item.height * 100 + "%"})
- } else {
- w.element.css({
- "top": top[i] + o.vgap + o.tgap + "px",
- height: BI.isNumber(item.height) ? item.height : ""
- });
- }
- if (!BI.isNumber(item.height)) {
- return true;
- }
- });
- BI.backAny(items, function (i, item) {
- var w = self.getWidgetByName(self.getName() + i + "");
- if (BI.isNull(bottom[i])) {
- bottom[i] = bottom[i + 1] + items[i + 1].height + 2 * o.vgap + o.tgap + o.bgap;
- }
- if (item.height < 1 && item.height >= 0) {
- w.element.css({"bottom": bottom[i] * 100 + "%", height: item.height * 100 + "%"})
- } else {
- w.element.css({
- "bottom": bottom[i] + o.vgap + o.bgap + "px",
- height: BI.isNumber(item.height) ? item.height : ""
- });
- }
- if (!BI.isNumber(item.height)) {
- return true;
- }
- })
- },
-
- populate: function (items) {
- BI.VTapeLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.vtape', BI.VTapeLayout);/**
- * td布局
- * @class BI.TdLayout
- * @extends BI.Layout
- */
-BI.TdLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.TdLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-td-layout",
- columnSize: [200, 200, 200],
- hgap: 0,
- vgap: 0,
- items: [[
- {
- el: {text: 'label1'}
- },
- {
- el: {text: 'label2'}
- },
- {
- el: {text: 'label3'}
- }
- ]]
- });
- },
- render: function () {
- BI.TdLayout.superclass.render.apply(this, arguments);
- this.$table = $("").attr({"cellspacing": 0, "cellpadding": 0}).css({
- "position": "relative",
- "width": "100%",
- "height": "100%",
- "border-spacing": "0px",
- "border": "none",
- "border-collapse": "separate"
- });
- this.rows = 0;
- this.populate(this.options.items);
- },
-
- _addElement: function (idx, arr) {
- var o = this.options;
-
- function firstElement(item, row, col) {
- if (row === 0) {
- item.addClass("first-row")
- }
- if (col === 0) {
- item.addClass("first-col");
- }
- item.addClass(BI.isOdd(row + 1) ? "odd-row" : "even-row");
- item.addClass(BI.isOdd(col + 1) ? "odd-col" : "even-col");
- item.addClass("center-element");
- }
-
- function firstObject(item, row, col) {
- var cls = "";
- if (row === 0) {
- cls += " first-row";
- }
- if (col === 0) {
- cls += " first-col";
- }
- BI.isOdd(row + 1) ? (cls += " odd-row") : (cls += " even-row");
- BI.isOdd(col + 1) ? (cls += " odd-col") : (cls += " even-col");
- item.cls = (item.cls || "") + cls + " center-element";
- }
-
- function first(item, row, col) {
- if (item instanceof BI.Widget) {
- firstElement(item.element, row, col);
- } else if (item.el instanceof BI.Widget) {
- firstElement(item.el.element, row, col);
- } else if (item.el) {
- firstObject(item.el, row, col)
- } else {
- firstObject(item, row, col);
- }
- }
-
- var tr = BI.createWidget({
- type: "bi.default",
- tagName: "tr"
- });
-
- for (var i = 0; i < arr.length; i++) {
- var w = BI.createWidget(arr[i]);
- w.element.css({"position": "relative", "top": "0", "left": "0", "margin": "0px auto"});
- if (arr[i].lgap) {
- w.element.css({"margin-left": arr[i].lgap + "px"});
- }
- if (arr[i].rgap) {
- w.element.css({"margin-right": arr[i].rgap + "px"});
- }
- if (arr[i].tgap) {
- w.element.css({"margin-top": arr[i].tgap + "px"});
- }
- if (arr[i].bgap) {
- w.element.css({"margin-bottom": arr[i].bgap + "px"});
- }
- first(w, this.rows++, i);
- var td = BI.createWidget({
- type: 'bi.default',
- attributes: {
- width: o.columnSize[i] <= 1 ? (o.columnSize[i] * 100 + "%") : o.columnSize[i]
- },
- tagName: 'td',
- items: [w]
- });
- td.element.css({
- "position": "relative",
- "vertical-align": "middle",
- "margin": "0",
- "padding": "0",
- "border": "none"
- });
- tr.addItem(td);
- }
- this.addWidget(this.getName() + idx, tr);
- return tr;
- },
-
- _mountChildren: function () {
- var self = this;
- var frag = document.createDocumentFragment();
- var hasChild = false;
- BI.each(this._children, function (i, widget) {
- if (widget.element !== self.element) {
- frag.appendChild(widget.element[0]);
- hasChild = true;
- }
- });
- if (hasChild === true) {
- this.$table.append(frag);
- this.element.append(this.$table);
- }
- },
-
- resize: function () {
- // console.log("td布局不需要resize");
- },
-
- addItem: function (arr) {
- if (!BI.isArray(arr)) {
- throw new Error("item must be array");
- }
- return BI.TdLayout.superclass.addItem.apply(this, arguments);
- },
-
- populate: function (items) {
- BI.TdLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.td', BI.TdLayout);/**
- * 垂直布局
- * @class BI.VerticalLayout
- * @extends BI.Layout
- */
-BI.VerticalLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.VerticalLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-vertical-layout",
- hgap: 0,
- vgap: 0,
- lgap: 0,
- rgap: 0,
- tgap: 0,
- bgap: 0,
- scrolly: true
- });
- },
- render: function () {
- BI.VerticalLayout.superclass.render.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- _addElement: function (i, item) {
- var o = this.options;
- var w = BI.VerticalLayout.superclass._addElement.apply(this, arguments);
- w.element.css({
- "position": "relative"
- });
- if (o.vgap + o.tgap + (item.tgap || 0) !== 0) {
- w.element.css({
- "margin-top": o.vgap + o.tgap + (item.tgap || 0) + "px"
- })
- }
- if (o.hgap + o.lgap + (item.lgap || 0) !== 0) {
- w.element.css({
- "margin-left": o.hgap + o.lgap + (item.lgap || 0) + "px"
- })
- }
- if (o.hgap + o.rgap + (item.rgap || 0) !== 0) {
- w.element.css({
- "margin-right": o.hgap + o.rgap + (item.rgap || 0) + "px"
- })
- }
- if (o.vgap + o.bgap + (item.bgap || 0) !== 0) {
- w.element.css({
- "margin-bottom": o.vgap + o.bgap + (item.bgap || 0) + "px"
- })
- }
- return w;
- },
-
- resize: function () {
- this.stroke(this.options.items);
- },
-
- populate: function (items) {
- BI.VerticalLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.vertical', BI.VerticalLayout);/**
- *
- * @class BI.WindowLayout
- * @extends BI.Layout
- */
-BI.WindowLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.WindowLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-window-layout",
- columns: 3,
- rows: 2,
- hgap: 0,
- vgap: 0,
- lgap: 0,
- rgap: 0,
- tgap: 0,
- bgap: 0,
- columnSize: [100, "fill", 200],
- rowSize: [100, "fill"],
- items: [[
- {
- el: {type: 'bi.button', text: 'button1'}
- },
- {
- el: {type: 'bi.button', text: 'button2'}
- },
- {
- el: {type: 'bi.button', text: 'button3'}
- }
- ]]
- });
- },
- render: function () {
- BI.WindowLayout.superclass.render.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- resize: function () {
- this.stroke(this.options.items);
- },
-
- addItem: function (item) {
- // do nothing
- throw new Error("cannot be added")
- },
-
- stroke: function (items) {
- var o = this.options;
- if (BI.isNumber(o.rowSize)) {
- o.rowSize = BI.makeArray(o.items.length, 1 / o.items.length);
- }
- if (BI.isNumber(o.columnSize)) {
- o.columnSize = BI.makeArray(o.items[0].length, 1 / o.items[0].length);
- }
- function firstElement(item, row, col) {
- if (row === 0) {
- item.addClass("first-row")
- }
- if (col === 0) {
- item.addClass("first-col");
- }
- item.addClass(BI.isOdd(row + 1) ? "odd-row" : "even-row");
- item.addClass(BI.isOdd(col + 1) ? "odd-col" : "even-col");
- item.addClass("center-element");
- }
-
- function firstObject(item, row, col) {
- var cls = "";
- if (row === 0) {
- cls += " first-row";
- }
- if (col === 0) {
- cls += " first-col";
- }
- BI.isOdd(row + 1) ? (cls += " odd-row") : (cls += " even-row");
- BI.isOdd(col + 1) ? (cls += " odd-col") : (cls += " even-col");
- item.cls = (item.cls || "") + cls + " center-element";
- }
-
- function first(item, row, col) {
- if (item instanceof BI.Widget) {
- firstElement(item.element, row, col);
- } else if (item.el instanceof BI.Widget) {
- firstElement(item.el.element, row, col);
- } else if (item.el) {
- firstObject(item.el, row, col)
- } else {
- firstObject(item, row, col);
- }
- }
-
- for (var i = 0; i < o.rows; i++) {
- for (var j = 0; j < o.columns; j++) {
- if (!o.items[i][j]) {
- throw new Error("item be required");
- }
- if (!this.hasWidget(this.getName() + i + "_" + j)) {
- var w = BI.createWidget(o.items[i][j]);
- w.element.css({"position": "absolute"});
- this.addWidget(this.getName() + i + "_" + j, w);
- }
- }
- }
- var left = {}, right = {}, top = {}, bottom = {};
- left[0] = 0;
- top[0] = 0;
- right[o.columns - 1] = 0;
- bottom[o.rows - 1] = 0;
- //从上到下
- for (var i = 0; i < o.rows; i++) {
- for (var j = 0; j < o.columns; j++) {
- var wi = this.getWidgetByName(this.getName() + i + "_" + j);
- if (BI.isNull(top[i])) {
- top[i] = top[i - 1] + (o.rowSize[i - 1] < 1 ? o.rowSize[i - 1] : o.rowSize[i - 1] + o.vgap + o.bgap);
- }
- var t = top[i] <= 1 ? top[i] * 100 + "%" : top[i] + o.vgap + o.tgap + "px", h = "";
- if (BI.isNumber(o.rowSize[i])) {
- h = o.rowSize[i] <= 1 ? o.rowSize[i] * 100 + "%" : o.rowSize[i] + "px";
- }
- wi.element.css({"top": t, height: h});
- first(wi, i, j);
- }
- if (!BI.isNumber(o.rowSize[i])) {
- break;
- }
- }
- //从下到上
- for (var i = o.rows - 1; i >= 0; i--) {
- for (var j = 0; j < o.columns; j++) {
- var wi = this.getWidgetByName(this.getName() + i + "_" + j);
- if (BI.isNull(bottom[i])) {
- bottom[i] = bottom[i + 1] + (o.rowSize[i + 1] < 1 ? o.rowSize[i + 1] : o.rowSize[i + 1] + o.vgap + o.tgap);
- }
- var b = bottom[i] <= 1 ? bottom[i] * 100 + "%" : bottom[i] + o.vgap + o.bgap + "px", h = "";
- if (BI.isNumber(o.rowSize[i])) {
- h = o.rowSize[i] <= 1 ? o.rowSize[i] * 100 + "%" : o.rowSize[i] + "px";
- }
- wi.element.css({"bottom": b, height: h});
- first(wi, i, j);
- }
- if (!BI.isNumber(o.rowSize[i])) {
- break;
- }
- }
- //从左到右
- for (var j = 0; j < o.columns; j++) {
- for (var i = 0; i < o.rows; i++) {
- var wi = this.getWidgetByName(this.getName() + i + "_" + j);
- if (BI.isNull(left[j])) {
- left[j] = left[j - 1] + (o.columnSize[j - 1] < 1 ? o.columnSize[j - 1] : o.columnSize[j - 1] + o.hgap + o.rgap);
- }
- var l = left[j] <= 1 ? left[j] * 100 + "%" : left[j] + o.hgap + o.lgap + "px", w = "";
- if (BI.isNumber(o.columnSize[j])) {
- w = o.columnSize[j] <= 1 ? o.columnSize[j] * 100 + "%" : o.columnSize[j] + "px";
- }
- wi.element.css({"left": l, width: w});
- first(wi, i, j);
- }
- if (!BI.isNumber(o.columnSize[j])) {
- break;
- }
- }
- //从右到左
- for (var j = o.columns - 1; j >= 0; j--) {
- for (var i = 0; i < o.rows; i++) {
- var wi = this.getWidgetByName(this.getName() + i + "_" + j);
- if (BI.isNull(right[j])) {
- right[j] = right[j + 1] + (o.columnSize[j + 1] < 1 ? o.columnSize[j + 1] : o.columnSize[j + 1] + o.hgap + o.lgap)
- }
- var r = right[j] <= 1 ? right[j] * 100 + "%" : right[j] + o.hgap + o.rgap + "px", w = "";
- if (BI.isNumber(o.columnSize[j])) {
- w = o.columnSize[j] <= 1 ? o.columnSize[j] * 100 + "%" : o.columnSize[j] + "px";
- }
- wi.element.css({"right": r, width: w});
- first(wi, i, j);
- }
- if (!BI.isNumber(o.columnSize[j])) {
- break;
- }
- }
- },
-
- populate: function (items) {
- BI.WindowLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.window', BI.WindowLayout);/**
- * 水平和垂直方向都居中容器, 非自适应,用于宽度高度固定的面板
- * @class BI.CenterLayout
- * @extends BI.Layout
- */
-BI.CenterLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.CenterLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-center-layout",
- hgap: 0,
- vgap: 0,
- lgap: 0,
- rgap: 0,
- tgap: 0,
- bgap: 0
- });
- },
-
- render: function () {
- BI.CenterLayout.superclass.render.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- resize: function () {
- // console.log("center布局不需要resize");
- },
-
- addItem: function (item) {
- //do nothing
- throw new Error("cannot be added");
- },
-
- stroke: function (items) {
- var self = this, o = this.options;
- var list = [];
- BI.each(items, function (i) {
- list.push({
- column: i,
- row: 0,
- el: BI.createWidget({
- type: "bi.default",
- cls: "center-element " + (i === 0 ? "first-element " : "") + (i === items.length - 1 ? "last-element" : "")
- })
- });
- });
- BI.each(items, function (i, item) {
- if (!!item) {
- var w = BI.createWidget(item);
- w.element.css({
- position: "absolute",
- left: o.hgap + o.lgap,
- right: o.hgap + o.rgap,
- top: o.vgap + o.tgap,
- bottom: o.vgap + o.bgap,
- width: "auto",
- height: "auto"
- });
- list[i].el.addItem(w);
- }
- });
- BI.createWidget({
- type: "bi.grid",
- element: this,
- columns: list.length,
- rows: 1,
- items: list
- });
- },
-
- populate: function (items) {
- BI.CenterLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.center', BI.CenterLayout);/**
- * 浮动布局实现的居中容器
- * @class BI.FloatCenterLayout
- * @extends BI.Layout
- */
-BI.FloatCenterLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.FloatCenterLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-float-center-layout",
- hgap: 0,
- vgap: 0,
- lgap: 0,
- rgap: 0,
- tgap: 0,
- bgap: 0
- });
- },
- render: function () {
- BI.FloatCenterLayout.superclass.render.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- resize: function () {
- // console.log("floatcenter布局不需要resize");
- },
-
- addItem: function (item) {
- //do nothing
- throw new Error("cannot be added")
- },
-
- stroke: function (items) {
- var self = this, o = this.options;
- var list = [], width = 100 / items.length;
- BI.each(items, function (i) {
- var widget = BI.createWidget({
- type: "bi.default"
- });
- widget.element.addClass("center-element " + (i === 0 ? "first-element " : "") + (i === items.length - 1 ? "last-element" : "")).css({
- width: width + "%",
- height: "100%"
- });
- list.push({
- el: widget
- });
- });
- BI.each(items, function (i, item) {
- if (!!item) {
- var w = BI.createWidget(item);
- w.element.css({
- position: "absolute",
- left: o.hgap + o.lgap,
- right: o.hgap + o.rgap,
- top: o.vgap + o.tgap,
- bottom: o.vgap + o.bgap,
- width: "auto",
- height: "auto"
- });
- list[i].el.addItem(w);
- }
- });
- BI.createWidget({
- type: "bi.left",
- element: this,
- items: list
- });
- },
-
- populate: function (items) {
- BI.FloatCenterLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.float_center', BI.FloatCenterLayout);/**
- * 水平和垂直方向都居中容器, 非自适应,用于宽度高度固定的面板
- * @class BI.HorizontalCenterLayout
- * @extends BI.Layout
- */
-BI.HorizontalCenterLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.HorizontalCenterLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-horizontal-center-layout",
- hgap: 0,
- vgap: 0,
- lgap: 0,
- rgap: 0,
- tgap: 0,
- bgap: 0
- });
- },
- render: function () {
- BI.HorizontalCenterLayout.superclass.render.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- resize: function () {
- // console.log("horizontal_center布局不需要resize");
- },
-
- addItem: function (item) {
- //do nothing
- throw new Error("cannot be added")
- },
-
- stroke: function (items) {
- var o = this.options;
- var list = [];
- BI.each(items, function (i) {
- list.push({
- column: i,
- row: 0,
- el: BI.createWidget({
- type: "bi.default",
- cls: "center-element " + (i === 0 ? "first-element " : "") + (i === items.length - 1 ? "last-element" : "")
- })
- });
- });
- BI.each(items, function (i, item) {
- if (!!item) {
- var w = BI.createWidget(item);
- w.element.css({
- position: "absolute",
- left: o.hgap + o.lgap,
- right: o.hgap + o.rgap,
- top: o.vgap + o.tgap,
- bottom: o.vgap + o.bgap,
- width: "auto"
- });
- list[i].el.addItem(w);
- }
- });
- BI.createWidget({
- type: "bi.grid",
- element: this,
- columns: list.length,
- rows: 1,
- items: list
- });
- },
-
- populate: function (items) {
- BI.HorizontalCenterLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.horizontal_center', BI.HorizontalCenterLayout);/**
- * 垂直方向都居中容器, 非自适应,用于高度不固定的面板
- * @class BI.VerticalCenterLayout
- * @extends BI.Layout
- */
-BI.VerticalCenterLayout = BI.inherit(BI.Layout, {
- props: function () {
- return BI.extend(BI.VerticalCenterLayout.superclass.props.apply(this, arguments), {
- baseCls: "bi-vertical-center-layout",
- hgap: 0,
- vgap: 0,
- lgap: 0,
- rgap: 0,
- tgap: 0,
- bgap: 0
- });
- },
- render: function () {
- BI.VerticalCenterLayout.superclass.render.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- resize: function () {
- // console.log("vertical_center布局不需要resize");
- },
-
- addItem: function (item) {
- //do nothing
- throw new Error("cannot be added")
- },
-
- stroke: function (items) {
- var self = this, o = this.options;
- var list = [];
- BI.each(items, function (i) {
- list.push({
- column: 0,
- row: i,
- el: BI.createWidget({
- type: "bi.default",
- cls: "center-element " + (i === 0 ? "first-element " : "") + (i === items.length - 1 ? "last-element" : "")
- })
- });
- });
- BI.each(items, function (i, item) {
- if (!!item) {
- var w = BI.createWidget(item);
- w.element.css({
- position: "absolute",
- left: o.hgap + o.lgap,
- right: o.hgap + o.rgap,
- top: o.vgap + o.tgap,
- bottom: o.vgap + o.bgap,
- height: "auto"
- });
- list[i].el.addItem(w);
- }
- });
- BI.createWidget({
- type: "bi.grid",
- element: this,
- columns: 1,
- rows: list.length,
- items: list
- });
- },
-
- populate: function (items) {
- BI.VerticalCenterLayout.superclass.populate.apply(this, arguments);
- this._mount();
- }
-});
-BI.shortcut('bi.vertical_center', BI.VerticalCenterLayout);/**
- * 保存数据,将js里面用到的常量数据都分离
- *
- */
-BI.Data = Data = {};
-
-/**
- * 存放bi里面通用的一些常量
- * @type {{}}
- */
-Data.Constant = BICst = {};
-/**
- * 缓冲池
- * @type {{Buffer: {}}}
- */
-;
-(function () {
- var Buffer = {};
- var MODE = false;//设置缓存模式为关闭
-
- Data.BufferPool = {
- put: function (name, cache) {
- if (BI.isNotNull(Buffer[name])) {
- throw new Error("Buffer Pool has the key already!");
- }
- Buffer[name] = cache;
- },
-
- get: function (name) {
- return Buffer[name];
- }
- };
-})();/**
- * 共享池
- * @type {{Shared: {}}}
- */
-;
-(function () {
- var _Shared = {};
- Data.SharingPool = {
- _Shared: _Shared,
- put: function (name, shared) {
- _Shared[name] = shared;
- },
-
- cat: function () {
- var args = Array.prototype.slice.call(arguments, 0),
- copy = _Shared;
- for (var i = 0; i < args.length; i++) {
- copy = copy && copy[args[i]];
- }
- return copy;
- },
-
- get: function () {
- return BI.deepClone(this.cat.apply(this, arguments));
- },
-
- remove: function (key) {
- delete _Shared[key];
- }
- };
-})();Data.Req = {
-
-};
-Data.Source = BISource = {
-
-};//工程配置
-(function () {
- //注册布局
- var isSupportFlex = BI.isSupportCss3("flex");
- BI.Plugin.registerWidget("bi.horizontal", function (ob) {
- if (isSupportFlex) {
- return BI.extend(ob, {type: "bi.flex_horizontal"});
- } else {
- return ob;
- }
- });
- BI.Plugin.registerWidget("bi.center_adapt", function (ob) {
- if (isSupportFlex && ob.items && ob.items.length <= 1) {
- //有滚动条的情况下需要用到flex_wrapper_center布局
- if (ob.scrollable === true || ob.scrollx === true || ob.scrolly === true) {
- //不是IE用flex_wrapper_center布局
- if (!BI.isIE()) {
- return BI.extend(ob, {type: "bi.flex_wrapper_center"});
- }
- return ob;
- }
- return BI.extend(ob, {type: "bi.flex_center"});
- } else {
- return ob;
- }
- });
- BI.Plugin.registerWidget("bi.vertical_adapt", function (ob) {
- if (isSupportFlex) {
- //有滚动条的情况下需要用到flex_wrapper_center布局
- if (ob.scrollable === true || ob.scrollx === true || ob.scrolly === true) {
- //不是IE用flex_wrapper_center布局
- if (!BI.isIE()) {
- return BI.extend({}, ob, {type: "bi.flex_wrapper_vertical_center"});
- }
- return ob;
- }
- return BI.extend(ob, {type: "bi.flex_vertical_center"});
- } else {
- return ob;
- }
- });
- BI.Plugin.registerWidget("bi.float_center_adapt", function (ob) {
- if (isSupportFlex) {
- //有滚动条的情况下需要用到flex_wrapper_center布局
- if (ob.scrollable === true || ob.scrollx === true || ob.scrolly === true) {
- //不是IE用flex_wrapper_center布局
- if (!BI.isIE()) {
- return BI.extend({}, ob, {type: "bi.flex_wrapper_center"});
- }
- return ob;
- }
- return BI.extend(ob, {type: "bi.flex_center"});
- } else {
- return ob;
- }
- });
- //注册滚动条
- BI.Plugin.registerWidget("bi.grid_table_scrollbar", function (ob) {
- if (BI.isIE9Below()) {
- return BI.extend(ob, {type: "bi.native_table_scrollbar"});
- } else {
- return ob;
- }
- });
- BI.Plugin.registerWidget("bi.grid_table_horizontal_scrollbar", function (ob) {
- if (BI.isIE9Below()) {
- return BI.extend(ob, {type: "bi.native_table_horizontal_scrollbar"});
- } else {
- return ob;
- }
- });
-
- //注册控件
- BI.Plugin.registerWidget("bi.grid_table", function (ob) {
- //非chrome下滚动条滑动效果不好,禁止掉
- if (!(BI.isChrome() && BI.isWindows() && !BI.isEdge())) {
- return BI.extend(ob, {type: "bi.quick_grid_table"});
- } else {
- return ob;
- }
- });
- BI.Plugin.registerWidget("bi.collection_table", function (ob) {
- //非chrome下滚动条滑动效果不好,禁止掉
- if (!(BI.isChrome() && BI.isWindows() && !BI.isEdge())) {
- return BI.extend(ob, {type: "bi.quick_collection_table"});
- } else {
- return ob;
- }
- });
- //IE8下滚动条用原生的
- $(function () {
- if (BI.isIE9Below()) {
- BI.GridTableScrollbar.SIZE = 18;
- }
- })
-}());
\ No newline at end of file
diff --git a/bi/polyfill.js b/bi/polyfill.js
deleted file mode 100644
index f67d79a6e..000000000
--- a/bi/polyfill.js
+++ /dev/null
@@ -1,175 +0,0 @@
-// Production steps of ECMA-262, Edition 5, 15.4.4.14
-// Reference: http://es5.github.io/#x15.4.4.14
-if (!Array.prototype.indexOf) {
- Array.prototype.indexOf = function (searchElement, fromIndex) {
-
- var k;
-
- // 1. Let o be the result of calling ToObject passing
- // the this value as the argument.
- if (this == null) {
- throw new TypeError('"this" is null or not defined');
- }
-
- var o = Object(this);
-
- // 2. Let lenValue be the result of calling the Get
- // internal method of o with the argument "length".
- // 3. Let len be ToUint32(lenValue).
- var len = o.length >>> 0;
-
- // 4. If len is 0, return -1.
- if (len === 0) {
- return -1;
- }
-
- // 5. If argument fromIndex was passed let n be
- // ToInteger(fromIndex); else let n be 0.
- var n = fromIndex | 0;
-
- // 6. If n >= len, return -1.
- if (n >= len) {
- return -1;
- }
-
- // 7. If n >= 0, then Let k be n.
- // 8. Else, n<0, Let k be len - abs(n).
- // If k is less than 0, then let k be 0.
- k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
-
- // 9. Repeat, while k < len
- while (k < len) {
- // a. Let Pk be ToString(k).
- // This is implicit for LHS operands of the in operator
- // b. Let kPresent be the result of calling the
- // HasProperty internal method of o with argument Pk.
- // This step can be combined with c
- // c. If kPresent is true, then
- // i. Let elementK be the result of calling the Get
- // internal method of o with the argument ToString(k).
- // ii. Let same be the result of applying the
- // Strict Equality Comparison Algorithm to
- // searchElement and elementK.
- // iii. If same is true, return k.
- if (k in o && o[k] === searchElement) {
- return k;
- }
- k++;
- }
- return -1;
- };
-}
-if (!Array.prototype.lastIndexOf) {
- Array.prototype.lastIndexOf = function (searchElement /*, fromIndex*/) {
- 'use strict';
-
- if (this === void 0 || this === null) {
- throw new TypeError();
- }
-
- var n, k,
- t = Object(this),
- len = t.length >>> 0;
- if (len === 0) {
- return -1;
- }
-
- n = len - 1;
- if (arguments.length > 1) {
- n = Number(arguments[1]);
- if (n != n) {
- n = 0;
- }
- else if (n != 0 && n != (1 / 0) && n != -(1 / 0)) {
- n = (n > 0 || -1) * Math.floor(Math.abs(n));
- }
- }
-
- for (k = n >= 0
- ? Math.min(n, len - 1)
- : len - Math.abs(n); k >= 0; k--) {
- if (k in t && t[k] === searchElement) {
- return k;
- }
- }
- return -1;
- };
-}
-/**
- * 特殊情况
- * Created by wang on 15/6/23.
- */
-//解决console未定义问题 guy
-window.console = window.console || (function () {
- var c = {};
- c.log = c.warn = c.debug = c.info = c.error = c.time = c.dir = c.profile
- = c.clear = c.exception = c.trace = c.assert = function () {
- };
- return c;
- })();
-/*
- * 前端缓存
- */
-window.localStorage || (window.localStorage = {
- items: {},
- setItem: function (k, v) {
- BI.Cache.addCookie(k, v);
- },
- getItem: function (k) {
- return BI.Cache.getCookie(k);
- },
- removeItem: function (k) {
- BI.Cache.deleteCookie(k);
- },
- key: function () {
-
- },
- clear: function () {
- this.items = {};
- }
-});if (typeof Set !== 'undefined' && Set.toString().match(/native code/)) {
-
-} else {
- Set = function () {
- this.set = {}
- };
- Set.prototype.has = function (key) {
- return this.set[key] !== undefined;
- };
- Set.prototype.add = function (key) {
- this.set[key] = 1
- };
- Set.prototype.clear = function () {
- this.set = {}
- };
-}//修复ie9下sort方法的bug
-;!function (window) {
- var ua = window.navigator.userAgent.toLowerCase(),
- reg = /msie|applewebkit.+safari/;
- if (reg.test(ua)) {
- var _sort = Array.prototype.sort;
- Array.prototype.sort = function (fn) {
- if (!!fn && typeof fn === 'function') {
- if (this.length < 2) {
- return this;
- }
- var i = 0, j = i + 1, l = this.length, tmp, r = false, t = 0;
- for (; i < l; i++) {
- for (j = i + 1; j < l; j++) {
- t = fn.call(this, this[i], this[j]);
- r = (typeof t === 'number' ? t :
- !!t ? 1 : 0) > 0;
- if (r === true) {
- tmp = this[i];
- this[i] = this[j];
- this[j] = tmp;
- }
- }
- }
- return this;
- } else {
- return _sort.call(this);
- }
- };
- }
-}(window);
\ No newline at end of file
diff --git a/bi/router.js b/bi/router.js
deleted file mode 100644
index 4ee73d096..000000000
--- a/bi/router.js
+++ /dev/null
@@ -1,585 +0,0 @@
-;(function(){
- var Events = {
-
- // Bind an event to a `callback` function. Passing `"all"` will bind
- // the callback to all events fired.
- on: function (name, callback, context) {
- if (!eventsApi(this, 'on', name, [callback, context]) || !callback) return this;
- this._events || (this._events = {});
- var events = this._events[name] || (this._events[name] = []);
- events.push({callback: callback, context: context, ctx: context || this});
- return this;
- },
-
- // Bind an event to only be triggered a single time. After the first time
- // the callback is invoked, it will be removed.
- once: function (name, callback, context) {
- if (!eventsApi(this, 'once', name, [callback, context]) || !callback) return this;
- var self = this;
- var once = _.once(function () {
- self.off(name, once);
- callback.apply(this, arguments);
- });
- once._callback = callback;
- return this.on(name, once, context);
- },
-
- // Remove one or many callbacks. If `context` is null, removes all
- // callbacks with that function. If `callback` is null, removes all
- // callbacks for the event. If `name` is null, removes all bound
- // callbacks for all events.
- off: function (name, callback, context) {
- if (!this._events || !eventsApi(this, 'off', name, [callback, context])) return this;
-
- // Remove all callbacks for all events.
- if (!name && !callback && !context) {
- this._events = void 0;
- return this;
- }
-
- var names = name ? [name] : _.keys(this._events);
- for (var i = 0, length = names.length; i < length; i++) {
- name = names[i];
-
- // Bail out if there are no events stored.
- var events = this._events[name];
- if (!events) continue;
-
- // Remove all callbacks for this event.
- if (!callback && !context) {
- delete this._events[name];
- continue;
- }
-
- // Find any remaining events.
- var remaining = [];
- for (var j = 0, k = events.length; j < k; j++) {
- var event = events[j];
- if (
- callback && callback !== event.callback &&
- callback !== event.callback._callback ||
- context && context !== event.context
- ) {
- remaining.push(event);
- }
- }
-
- // Replace events if there are any remaining. Otherwise, clean up.
- if (remaining.length) {
- this._events[name] = remaining;
- } else {
- delete this._events[name];
- }
- }
-
- return this;
- },
-
- un: function () {
- this.off.apply(this, arguments);
- },
-
- // Trigger one or many events, firing all bound callbacks. Callbacks are
- // passed the same arguments as `trigger` is, apart from the event name
- // (unless you're listening on `"all"`, which will cause your callback to
- // receive the true name of the event as the first argument).
- trigger: function (name) {
- if (!this._events) return this;
- var args = slice.call(arguments, 1);
- if (!eventsApi(this, 'trigger', name, args)) return this;
- var events = this._events[name];
- var allEvents = this._events.all;
- if (events) triggerEvents(events, args);
- if (allEvents) triggerEvents(allEvents, arguments);
- return this;
- },
-
- fireEvent: function () {
- this.trigger.apply(this, arguments);
- },
-
- // Inversion-of-control versions of `on` and `once`. Tell *this* object to
- // listen to an event in another object ... keeping track of what it's
- // listening to.
- listenTo: function (obj, name, callback) {
- var listeningTo = this._listeningTo || (this._listeningTo = {});
- var id = obj._listenId || (obj._listenId = _.uniqueId('l'));
- listeningTo[id] = obj;
- if (!callback && typeof name === 'object') callback = this;
- obj.on(name, callback, this);
- return this;
- },
-
- listenToOnce: function (obj, name, callback) {
- if (typeof name === 'object') {
- for (var event in name) this.listenToOnce(obj, event, name[event]);
- return this;
- }
- if (eventSplitter.test(name)) {
- var names = name.split(eventSplitter);
- for (var i = 0, length = names.length; i < length; i++) {
- this.listenToOnce(obj, names[i], callback);
- }
- return this;
- }
- if (!callback) return this;
- var once = _.once(function () {
- this.stopListening(obj, name, once);
- callback.apply(this, arguments);
- });
- once._callback = callback;
- return this.listenTo(obj, name, once);
- },
-
- // Tell this object to stop listening to either specific events ... or
- // to every object it's currently listening to.
- stopListening: function (obj, name, callback) {
- var listeningTo = this._listeningTo;
- if (!listeningTo) return this;
- var remove = !name && !callback;
- if (!callback && typeof name === 'object') callback = this;
- if (obj) (listeningTo = {})[obj._listenId] = obj;
- for (var id in listeningTo) {
- obj = listeningTo[id];
- obj.off(name, callback, this);
- if (remove || _.isEmpty(obj._events)) delete this._listeningTo[id];
- }
- return this;
- }
-
- };
-
- // Regular expression used to split event strings.
- var eventSplitter = /\s+/;
-
- // Implement fancy features of the Events API such as multiple event
- // names `"change blur"` and jQuery-style event maps `{change: action}`
- // in terms of the existing API.
- var eventsApi = function (obj, action, name, rest) {
- if (!name) return true;
-
- // Handle event maps.
- if (typeof name === 'object') {
- for (var key in name) {
- obj[action].apply(obj, [key, name[key]].concat(rest));
- }
- return false;
- }
-
- // Handle space separated event names.
- if (eventSplitter.test(name)) {
- var names = name.split(eventSplitter);
- for (var i = 0, length = names.length; i < length; i++) {
- obj[action].apply(obj, [names[i]].concat(rest));
- }
- return false;
- }
-
- return true;
- };
-
- // A difficult-to-believe, but optimized internal dispatch function for
- // triggering events. Tries to keep the usual cases speedy (most internal
- // BI events have 3 arguments).
- var triggerEvents = function (events, args) {
- var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2];
- switch (args.length) {
- case 0:
- while (++i < l) (ev = events[i]).callback.call(ev.ctx);
- return;
- case 1:
- while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1);
- return;
- case 2:
- while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2);
- return;
- case 3:
- while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3);
- return;
- default:
- while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args);
- return;
- }
- };
-
- // BI.Router
- // ---------------
-
- // Routers map faux-URLs to actions, and fire events when routes are
- // matched. Creating a new one sets its `routes` hash, if not set statically.
- var Router = BI.Router = function (options) {
- options || (options = {});
- if (options.routes) this.routes = options.routes;
- this._bindRoutes();
- this._init.apply(this, arguments);
- };
-
- // Cached regular expressions for matching named param parts and splatted
- // parts of route strings.
- var optionalParam = /\((.*?)\)/g;
- var namedParam = /(\(\?)?:\w+/g;
- var splatParam = /\*\w+/g;
- var escapeRegExp = /[\-{}\[\]+?.,\\\^$|#\s]/g;
-
- // Set up all inheritable **BI.Router** properties and methods.
- _.extend(Router.prototype, Events, {
-
- // _init is an empty function by default. Override it with your own
- // initialization logic.
- _init: function () {
- },
-
- // Manually bind a single named route to a callback. For example:
- //
- // this.route('search/:query/p:num', 'search', function(query, num) {
- // ...
- // });
- //
- route: function (route, name, callback) {
- if (!_.isRegExp(route)) route = this._routeToRegExp(route);
- if (_.isFunction(name)) {
- callback = name;
- name = '';
- }
- if (!callback) callback = this[name];
- var router = this;
- BI.history.route(route, function (fragment) {
- var args = router._extractParameters(route, fragment);
- if (router.execute(callback, args, name) !== false) {
- router.trigger.apply(router, ['route:' + name].concat(args));
- router.trigger('route', name, args);
- BI.history.trigger('route', router, name, args);
- }
- });
- return this;
- },
-
- // Execute a route handler with the provided parameters. This is an
- // excellent place to do pre-route setup or post-route cleanup.
- execute: function (callback, args, name) {
- if (callback) callback.apply(this, args);
- },
-
- // Simple proxy to `BI.history` to save a fragment into the history.
- navigate: function (fragment, options) {
- BI.history.navigate(fragment, options);
- return this;
- },
-
- // Bind all defined routes to `BI.history`. We have to reverse the
- // order of the routes here to support behavior where the most general
- // routes can be defined at the bottom of the route map.
- _bindRoutes: function () {
- if (!this.routes) return;
- this.routes = _.result(this, 'routes');
- var route, routes = _.keys(this.routes);
- while ((route = routes.pop()) != null) {
- this.route(route, this.routes[route]);
- }
- },
-
- // Convert a route string into a regular expression, suitable for matching
- // against the current location hash.
- _routeToRegExp: function (route) {
- route = route.replace(escapeRegExp, '\\$&')
- .replace(optionalParam, '(?:$1)?')
- .replace(namedParam, function (match, optional) {
- return optional ? match : '([^/?]+)';
- })
- .replace(splatParam, '([^?]*?)');
- return new RegExp('^' + route + '(?:\\?([\\s\\S]*))?$');
- },
-
- // Given a route, and a URL fragment that it matches, return the array of
- // extracted decoded parameters. Empty or unmatched parameters will be
- // treated as `null` to normalize cross-browser behavior.
- _extractParameters: function (route, fragment) {
- var params = route.exec(fragment).slice(1);
- return _.map(params, function (param, i) {
- // Don't decode the search params.
- if (i === params.length - 1) return param || null;
- return param ? decodeURIComponent(param) : null;
- });
- }
-
- });
-
- // History
- // ----------------
-
- // Handles cross-browser history management, based on either
- // [pushState](http://diveintohtml5.info/history.html) and real URLs, or
- // [onhashchange](https://developer.mozilla.org/en-US/docs/DOM/window.onhashchange)
- // and URL fragments. If the browser supports neither (old IE, natch),
- // falls back to polling.
- var History = function () {
- this.handlers = [];
- _.bindAll(this, 'checkUrl');
-
- // Ensure that `History` can be used outside of the browser.
- if (typeof window !== 'undefined') {
- this.location = window.location;
- this.history = window.history;
- }
- };
-
- // Cached regex for stripping a leading hash/slash and trailing space.
- var routeStripper = /^[#\/]|\s+$/g;
-
- // Cached regex for stripping leading and trailing slashes.
- var rootStripper = /^\/+|\/+$/g;
-
- // Cached regex for stripping urls of hash.
- var pathStripper = /#.*$/;
-
- // Has the history handling already been started?
- History.started = false;
-
- // Set up all inheritable **BI.History** properties and methods.
- _.extend(History.prototype, Events, {
-
- // The default interval to poll for hash changes, if necessary, is
- // twenty times a second.
- interval: 50,
-
- // Are we at the app root?
- atRoot: function () {
- var path = this.location.pathname.replace(/[^\/]$/, '$&/');
- return path === this.root && !this.getSearch();
- },
-
- // In IE6, the hash fragment and search params are incorrect if the
- // fragment contains `?`.
- getSearch: function () {
- var match = this.location.href.replace(/#.*/, '').match(/\?.+/);
- return match ? match[0] : '';
- },
-
- // Gets the true hash value. Cannot use location.hash directly due to bug
- // in Firefox where location.hash will always be decoded.
- getHash: function (window) {
- var match = (window || this).location.href.match(/#(.*)$/);
- return match ? match[1] : '';
- },
-
- // Get the pathname and search params, without the root.
- getPath: function () {
- var path = decodeURI(this.location.pathname + this.getSearch());
- var root = this.root.slice(0, -1);
- if (!path.indexOf(root)) path = path.slice(root.length);
- return path.charAt(0) === '/' ? path.slice(1) : path;
- },
-
- // Get the cross-browser normalized URL fragment from the path or hash.
- getFragment: function (fragment) {
- if (fragment == null) {
- if (this._hasPushState || !this._wantsHashChange) {
- fragment = this.getPath();
- } else {
- fragment = this.getHash();
- }
- }
- return fragment.replace(routeStripper, '');
- },
-
- // Start the hash change handling, returning `true` if the current URL matches
- // an existing route, and `false` otherwise.
- start: function (options) {
- if (History.started) throw new Error('BI.history has already been started');
- History.started = true;
-
- // Figure out the initial configuration. Do we need an iframe?
- // Is pushState desired ... is it available?
- this.options = _.extend({root: '/'}, this.options, options);
- this.root = this.options.root;
- this._wantsHashChange = this.options.hashChange !== false;
- this._hasHashChange = 'onhashchange' in window;
- this._wantsPushState = !!this.options.pushState;
- this._hasPushState = !!(this.options.pushState && this.history && this.history.pushState);
- this.fragment = this.getFragment();
-
- // Normalize root to always include a leading and trailing slash.
- this.root = ('/' + this.root + '/').replace(rootStripper, '/');
-
- // Transition from hashChange to pushState or vice versa if both are
- // requested.
- if (this._wantsHashChange && this._wantsPushState) {
-
- // If we've started off with a route from a `pushState`-enabled
- // browser, but we're currently in a browser that doesn't support it...
- if (!this._hasPushState && !this.atRoot()) {
- var root = this.root.slice(0, -1) || '/';
- this.location.replace(root + '#' + this.getPath());
- // Return immediately as browser will do redirect to new url
- return true;
-
- // Or if we've started out with a hash-based route, but we're currently
- // in a browser where it could be `pushState`-based instead...
- } else if (this._hasPushState && this.atRoot()) {
- this.navigate(this.getHash(), {replace: true});
- }
-
- }
-
- // Proxy an iframe to handle location events if the browser doesn't
- // support the `hashchange` event, HTML5 history, or the user wants
- // `hashChange` but not `pushState`.
- if (!this._hasHashChange && this._wantsHashChange && (!this._wantsPushState || !this._hasPushState)) {
- var iframe = document.createElement('iframe');
- iframe.src = 'javascript:0';
- iframe.style.display = 'none';
- iframe.tabIndex = -1;
- var body = document.body;
- // Using `appendChild` will throw on IE < 9 if the document is not ready.
- this.iframe = body.insertBefore(iframe, body.firstChild).contentWindow;
- this.iframe.document.open().close();
- this.iframe.location.hash = '#' + this.fragment;
- }
-
- // Add a cross-platform `addEventListener` shim for older browsers.
- var addEventListener = window.addEventListener || function (eventName, listener) {
- return attachEvent('on' + eventName, listener);
- };
-
- // Depending on whether we're using pushState or hashes, and whether
- // 'onhashchange' is supported, determine how we check the URL state.
- if (this._hasPushState) {
- addEventListener('popstate', this.checkUrl, false);
- } else if (this._wantsHashChange && this._hasHashChange && !this.iframe) {
- addEventListener('hashchange', this.checkUrl, false);
- } else if (this._wantsHashChange) {
- this._checkUrlInterval = setInterval(this.checkUrl, this.interval);
- }
-
- if (!this.options.silent) return this.loadUrl();
- },
-
- // Disable BI.history, perhaps temporarily. Not useful in a real app,
- // but possibly useful for unit testing Routers.
- stop: function () {
- // Add a cross-platform `removeEventListener` shim for older browsers.
- var removeEventListener = window.removeEventListener || function (eventName, listener) {
- return detachEvent('on' + eventName, listener);
- };
-
- // Remove window listeners.
- if (this._hasPushState) {
- removeEventListener('popstate', this.checkUrl, false);
- } else if (this._wantsHashChange && this._hasHashChange && !this.iframe) {
- removeEventListener('hashchange', this.checkUrl, false);
- }
-
- // Clean up the iframe if necessary.
- if (this.iframe) {
- document.body.removeChild(this.iframe.frameElement);
- this.iframe = null;
- }
-
- // Some environments will throw when clearing an undefined interval.
- if (this._checkUrlInterval) clearInterval(this._checkUrlInterval);
- History.started = false;
- },
-
- // Add a route to be tested when the fragment changes. Routes added later
- // may override previous routes.
- route: function (route, callback) {
- this.handlers.unshift({route: route, callback: callback});
- },
-
- // Checks the current URL to see if it has changed, and if it has,
- // calls `loadUrl`, normalizing across the hidden iframe.
- checkUrl: function (e) {
- var current = this.getFragment();
-
- // If the user pressed the back button, the iframe's hash will have
- // changed and we should use that for comparison.
- if (current === this.fragment && this.iframe) {
- current = this.getHash(this.iframe);
- }
-
- if (current === this.fragment) return false;
- if (this.iframe) this.navigate(current);
- this.loadUrl();
- },
-
- // Attempt to load the current URL fragment. If a route succeeds with a
- // match, returns `true`. If no defined routes matches the fragment,
- // returns `false`.
- loadUrl: function (fragment) {
- fragment = this.fragment = this.getFragment(fragment);
- return _.any(this.handlers, function (handler) {
- if (handler.route.test(fragment)) {
- handler.callback(fragment);
- return true;
- }
- });
- },
-
- // Save a fragment into the hash history, or replace the URL state if the
- // 'replace' option is passed. You are responsible for properly URL-encoding
- // the fragment in advance.
- //
- // The options object can contain `trigger: true` if you wish to have the
- // route callback be fired (not usually desirable), or `replace: true`, if
- // you wish to modify the current URL without adding an entry to the history.
- navigate: function (fragment, options) {
- if (!History.started) return false;
- if (!options || options === true) options = {trigger: !!options};
-
- // Normalize the fragment.
- fragment = this.getFragment(fragment || '');
-
- // Don't include a trailing slash on the root.
- var root = this.root;
- if (fragment === '' || fragment.charAt(0) === '?') {
- root = root.slice(0, -1) || '/';
- }
- var url = root + fragment;
-
- // Strip the hash and decode for matching.
- fragment = decodeURI(fragment.replace(pathStripper, ''));
-
- if (this.fragment === fragment) return;
- this.fragment = fragment;
-
- // If pushState is available, we use it to set the fragment as a real URL.
- if (this._hasPushState) {
- this.history[options.replace ? 'replaceState' : 'pushState']({}, document.title, url);
-
- // If hash changes haven't been explicitly disabled, update the hash
- // fragment to store history.
- } else if (this._wantsHashChange) {
- this._updateHash(this.location, fragment, options.replace);
- if (this.iframe && (fragment !== this.getHash(this.iframe))) {
- // Opening and closing the iframe tricks IE7 and earlier to push a
- // history entry on hash-tag change. When replace is true, we don't
- // want this.
- if (!options.replace) this.iframe.document.open().close();
- this._updateHash(this.iframe.location, fragment, options.replace);
- }
-
- // If you've told us that you explicitly don't want fallback hashchange-
- // based history, then `navigate` becomes a page refresh.
- } else {
- return this.location.assign(url);
- }
- if (options.trigger) return this.loadUrl(fragment);
- },
-
- // Update the hash location, either replacing the current entry, or adding
- // a new one to the browser history.
- _updateHash: function (location, fragment, replace) {
- if (replace) {
- var href = location.href.replace(/(javascript:|#).*$/, '');
- location.replace(href + '#' + fragment);
- } else {
- // Some browsers require that `hash` contains a leading #.
- location.hash = '#' + fragment;
- }
- }
-
- });
-
- // Create the default BI.history.
- BI.history = new History;
-}());
\ No newline at end of file
diff --git a/bi/widget.js b/bi/widget.js
deleted file mode 100644
index 0a9fbe3f6..000000000
--- a/bi/widget.js
+++ /dev/null
@@ -1,22258 +0,0 @@
-/**
- *
- * Created by GUY on 2016/5/26.
- * @class BI.SequenceTableTreeNumber
- * @extends BI.Widget
- */
-BI.SequenceTableTreeNumber = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.SequenceTableTreeNumber.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-sequence-table-tree-number",
- isNeedFreeze: false,
- startSequence: 1,//开始的序号
- scrollTop: 0,
- headerRowSize: 25,
- rowSize: 25,
-
- sequenceHeaderCreator: null,
-
- header: [],
- items: [], //二维数组
-
- //交叉表头
- crossHeader: [],
- crossItems: []
- });
- },
-
- _init: function () {
- BI.SequenceTableTreeNumber.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.vCurr = 1;
- this.hCurr = 1;
- this.tasks = [];
- this.renderedCells = [];
- this.renderedKeys = [];
-
- this.container = BI.createWidget({
- type: "bi.absolute",
- width: 60,
- scrollable: false
- });
-
- this.scrollContainer = BI.createWidget({
- type: "bi.vertical",
- scrollable: false,
- scrolly: false,
- items: [this.container]
- });
-
- this.headerContainer = BI.createWidget({
- type: "bi.absolute",
- cls: "bi-border",
- width: 58,
- scrollable: false
- });
-
- this.layout = BI.createWidget({
- type: "bi.vtape",
- element: this,
- items: [{
- el: this.headerContainer,
- height: this._getHeaderHeight() - 2
- }, {el: {type: "bi.layout"}, height: 2}, {
- el: this.scrollContainer
- }]
- });
- //缓存第一行对应的序号
- this.start = this.options.startSequence;
- this.cache = {};
- this._nextState();
-
- this._populate();
- },
-
- _getNextSequence: function (nodes) {
- var self = this;
- var start = this.start;
- var cnt = this.start;
-
- function track(node) {
- //如果已经有缓存了就不改计数了,复杂表会出现这种情况
- self.cache[node.text || node.value] || (self.cache[node.text || node.value] = cnt);
- cnt++;
- }
-
- BI.each(nodes, function (i, node) {
- if (BI.isNotEmptyArray(node.children)) {
- BI.each(node.children, function (index, child) {
- if (index === 0) {
- if (self.cache[child.text || child.value]) {
- start = cnt = self.cache[child.text || child.value];
- }
- }
- track(child)
- });
- }
- });
- this.start = cnt;
- return start;
- },
-
- _getStart: function (nodes) {
- var self = this;
- var start = this.start;
- BI.some(nodes, function (i, node) {
- if (BI.isNotEmptyArray(node.children)) {
- return BI.some(node.children, function (index, child) {
- if (index === 0) {
- if (self.cache[child.text || child.value]) {
- start = self.cache[child.text || child.value];
- return true;
- }
- }
- });
- }
- });
- return start;
- },
-
- _formatNumber: function (nodes) {
- var self = this, o = this.options;
- var result = [];
- var count = this._getStart(nodes);
-
- function getLeafCount(node) {
- var cnt = 0;
- if (BI.isNotEmptyArray(node.children)) {
- BI.each(node.children, function (index, child) {
- cnt += getLeafCount(child);
- });
- if (/**node.children.length > 1 && **/BI.isNotEmptyArray(node.values)) {
- cnt++;
- }
- } else {
- cnt++;
- }
- return cnt;
- }
-
- var start = 0, top = 0;
- BI.each(nodes, function (i, node) {
- if (BI.isArray(node.children)) {
- BI.each(node.children, function (index, child) {
- var cnt = getLeafCount(child);
- result.push({
- text: count++,
- start: start,
- top: top,
- cnt: cnt,
- index: index,
- height: cnt * o.rowSize
- });
- start += cnt;
- top += cnt * o.rowSize;
- });
- if (BI.isNotEmptyArray(node.values)) {
- result.push({
- text: BI.i18nText("BI-Summary_Values"),
- start: start++,
- top: top,
- cnt: 1,
- isSummary: true,
- height: o.rowSize
- });
- top += o.rowSize;
- }
- }
- });
- return result;
- },
-
- _layout: function () {
- var self = this, o = this.options;
- var headerHeight = this._getHeaderHeight() - 2;
- var items = this.layout.attr("items");
- if (o.isNeedFreeze === false) {
- items[0].height = 0;
- items[1].height = 0;
- } else if (o.isNeedFreeze === true) {
- items[0].height = headerHeight;
- items[1].height = 2;
- }
- this.layout.attr("items", items);
- this.layout.resize();
- try {
- this.scrollContainer.element.scrollTop(o.scrollTop);
- } catch (e) {
-
- }
- },
-
- _getHeaderHeight: function () {
- var o = this.options;
- return o.headerRowSize * (o.crossHeader.length + (o.header.length > 0 ? 1 : 0));
- },
-
- _nextState: function () {
- var o = this.options;
- this._getNextSequence(o.items);
- },
-
- _prevState: function () {
- var self = this, o = this.options;
- var firstChild;
- BI.some(o.items, function (i, node) {
- if (BI.isNotEmptyArray(node.children)) {
- return BI.some(node.children, function (j, child) {
- firstChild = child;
- return true;
- });
- }
- });
- if (firstChild && BI.isNotEmptyObject(this.cache)) {
- this.start = this.cache[firstChild.text || firstChild.value];
- } else {
- this.start = 1;
- }
- this._nextState();
- },
-
- _getMaxScrollTop: function (numbers) {
- var cnt = 0;
- BI.each(numbers, function (i, number) {
- cnt += number.cnt;
- });
- return Math.max(0, cnt * this.options.rowSize - (this.options.height - this._getHeaderHeight()) + BI.DOM.getScrollWidth());
- },
-
- _createHeader: function () {
- var o = this.options;
- BI.createWidget({
- type: "bi.absolute",
- element: this.headerContainer,
- items: [{
- el: o.sequenceHeaderCreator || {
- type: "bi.table_style_cell",
- cls: "sequence-table-title-cell",
- styleGetter: o.headerCellStyleGetter,
- text: BI.i18nText("BI-Number_Index")
- },
- left: 0,
- top: 0,
- right: 0,
- bottom: 0
- }]
- });
- },
-
- _calculateChildrenToRender: function () {
- var self = this, o = this.options;
-
- var renderedCells = [], renderedKeys = [];
- var numbers = this._formatNumber(o.items);
- var intervalTree = BI.PrefixIntervalTree.uniform(numbers.length, 0);
- BI.each(numbers, function (i, number) {
- intervalTree.set(i, number.height);
- });
- var scrollTop = BI.clamp(o.scrollTop, 0, this._getMaxScrollTop(numbers));
- var index = intervalTree.greatestLowerBound(scrollTop);
- var offsetTop = -(scrollTop - (index > 0 ? intervalTree.sumTo(index - 1) : 0));
- var height = offsetTop;
- var bodyHeight = o.height - this._getHeaderHeight();
- while (height < bodyHeight && index < numbers.length) {
- renderedKeys.push(index);
- offsetTop += numbers[index].height;
- height += numbers[index].height;
- index++;
- }
-
- BI.each(renderedKeys, function (i, key) {
- var index = BI.deepIndexOf(self.renderedKeys, key);
- if (index > -1) {
- if (numbers[key].height !== self.renderedCells[index]._height) {
- self.renderedCells[index]._height = numbers[key].height;
- self.renderedCells[index].el.setHeight(numbers[key].height);
- }
- if (numbers[key].top !== self.renderedCells[index].top) {
- self.renderedCells[index].top = numbers[key].top;
- self.renderedCells[index].el.element.css("top", numbers[key].top + "px");
- }
- renderedCells.push(self.renderedCells[index]);
- } else {
- var child = BI.createWidget(BI.extend({
- type: "bi.table_style_cell",
- cls: "sequence-table-number-cell bi-border-left bi-border-right bi-border-bottom",
- width: 60,
- styleGetter: numbers[key].isSummary === true ? function () {
- return o.summaryCellStyleGetter(true);
- } : function (key) {
- return function () {
- return o.sequenceCellStyleGetter(key);
- }
- }(numbers[key].index)
- }, numbers[key]));
- renderedCells.push({
- el: child,
- left: 0,
- top: numbers[key].top,
- _height: numbers[key].height
- });
- }
- });
-
- //已存在的, 需要添加的和需要删除的
- var existSet = {}, addSet = {}, deleteArray = [];
- BI.each(renderedKeys, function (i, key) {
- if (BI.deepContains(self.renderedKeys, key)) {
- existSet[i] = key;
- } else {
- addSet[i] = key;
- }
- });
- BI.each(this.renderedKeys, function (i, key) {
- if (BI.deepContains(existSet, key)) {
- return;
- }
- if (BI.deepContains(addSet, key)) {
- return;
- }
- deleteArray.push(i);
- });
- BI.each(deleteArray, function (i, index) {
- self.renderedCells[index].el.destroy();
- });
- var addedItems = [];
- BI.each(addSet, function (index) {
- addedItems.push(renderedCells[index])
- });
- BI.createWidget({
- type: "bi.absolute",
- element: this.container,
- items: addedItems
- });
- this.renderedCells = renderedCells;
- this.renderedKeys = renderedKeys;
-
- this.container.setHeight(intervalTree.sumUntil(numbers.length));
- },
-
- _restore: function () {
- BI.each(this.renderedCells, function (i, cell) {
- cell.el.destroy();
- });
- this.renderedCells = [];
- this.renderedKeys = [];
- },
-
- _populate: function () {
- var self = this;
- BI.each(this.tasks, function (i, task) {
- task.apply(self);
- });
- this.tasks = [];
- this.headerContainer.empty();
- this._createHeader();
- this._layout();
- this._calculateChildrenToRender();
- },
-
- setVerticalScroll: function (scrollTop) {
- if (this.options.scrollTop !== scrollTop) {
- this.options.scrollTop = scrollTop;
- try {
- this.scrollContainer.element.scrollTop(scrollTop);
- } catch (e) {
-
- }
- }
- },
-
- getVerticalScroll: function () {
- return this.options.scrollTop;
- },
-
- setVPage: function (v) {
- if (v <= 1) {
- this.cache = {};
- this.start = this.options.startSequence;
- this._restore();
- this.tasks.push(this._nextState);
- } else if (v === this.vCurr + 1) {
- this.tasks.push(this._nextState);
- } else if (v === this.vCurr - 1) {
- this.tasks.push(this._prevState);
- }
- this.vCurr = v;
- },
-
- setHPage: function (v) {
- if (v !== this.hCurr) {
- this.tasks.push(this._prevState);
- }
- this.hCurr = v;
- },
-
- restore: function () {
- this._restore();
- },
-
- populate: function (items, header, crossItems, crossHeader) {
- var o = this.options;
- if (items && items !== this.options.items) {
- o.items = items;
- this._restore();
- this.tasks.push(this._prevState);
- }
- if (header && header !== this.options.header) {
- o.header = header;
- }
- if (crossItems && crossItems !== this.options.crossItems) {
- o.crossItems = crossItems;
- }
- if (crossHeader && crossHeader !== this.options.crossHeader) {
- o.crossHeader = crossHeader;
- }
- this._populate();
- }
-});
-BI.shortcut('bi.sequence_table_tree_number', BI.SequenceTableTreeNumber);/**
- * 自适应布局
- *
- * 1、resize
- * 2、吸附
- * 3、当前组件在最上方
- * 4、可以撤销
- * 5、上下之间插入组件
- *
- * Created by GUY on 2016/2/23.
- * @class BI.AdaptiveArrangement
- * @extends BI.Widget
- */
-BI.AdaptiveArrangement = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.AdaptiveArrangement.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-adaptive-arrangement",
- resizable: true,
- layoutType: BI.Arrangement.LAYOUT_TYPE.FREE,
- items: []
- });
- },
-
- _init: function () {
- BI.AdaptiveArrangement.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.arrangement = BI.createWidget({
- type: "bi.arrangement",
- element: this,
- layoutType: o.layoutType,
- items: o.items
- });
- this.arrangement.on(BI.Arrangement.EVENT_SCROLL, function () {
- self.fireEvent(BI.AdaptiveArrangement.EVENT_SCROLL, arguments);
- });
- this.zIndex = 0;
- BI.each(o.items, function (i, item) {
- self._initResizable(item.el);
- });
-
- $(document).mousedown(function (e) {
- BI.each(self.getAllRegions(), function (i, region) {
- if (region.el.element.find(e.target).length === 0) {
- region.el.element.removeClass("selected");
- }
- });
- });
- BI.ResizeDetector.addResizeListener(this, function () {
- self.arrangement.resize();
- self.fireEvent(BI.AdaptiveArrangement.EVENT_RESIZE);
- });
- },
-
- _isEqual: function () {
- return this.arrangement._isEqual.apply(this.arrangement, arguments);
- },
-
- _setSelect: function (item) {
- if (!item.element.hasClass("selected")) {
- item.element.css("zIndex", ++this.zIndex);
- BI.each(this.getAllRegions(), function (i, region) {
- region.el.element.removeClass("selected");
- });
- item.element.addClass("selected");
- }
- },
-
- _initResizable: function (item) {
- var self = this, o = this.options;
- item.element.css("zIndex", ++this.zIndex);
- item.element.mousedown(function () {
- self._setSelect(item)
- });
- },
-
- _getScrollOffset: function () {
- return this.arrangement._getScrollOffset();
- },
-
- getClientWidth: function () {
- return this.arrangement.getClientWidth();
- },
-
- getClientHeight: function () {
- return this.arrangement.getClientHeight();
- },
-
- addRegion: function (region, position) {
- this._initResizable(region.el);
- this._setSelect(region.el);
- var self = this, flag;
- var old = this.arrangement.getAllRegions();
- if (flag = this.arrangement.addRegion(region, position)) {
- this._old = old;
- }
- return flag;
- },
-
- deleteRegion: function (name) {
- var flag;
- var old = this.getAllRegions();
- if (flag = this.arrangement.deleteRegion(name)) {
- this._old = old;
- } else {
- this._old = this.getAllRegions();
- this.relayout();
- }
- return flag;
- },
-
- setRegionSize: function (name, size) {
- var flag;
- var old = this.getAllRegions();
- if (flag = this.arrangement.setRegionSize(name, size)) {
- this._old = old;
- }
- return flag;
- },
-
- setPosition: function (position, size) {
- var self = this;
- return this.arrangement.setPosition(position, size);
- },
-
- setRegionPosition: function (name, position) {
- var region = this.getRegionByName(name);
- return this.arrangement.setRegionPosition(name, position);
- },
-
- setDropPosition: function (position, size) {
- return this.arrangement.setDropPosition(position, size);
- },
-
- scrollInterval: function (e, isBorderScroll, isOverflowScroll, cb) {
- // var self = this;
- // var map = {
- // top: [-1, 0],
- // bottom: [1, 0],
- // left: [0, -1],
- // right: [0, 1]
- // };
- // var clientWidth = this.arrangement.getClientWidth();
- // var clientHeight = this.arrangement.getClientHeight();
- //
- // function scrollTo(direction, callback) {
- // if (direction === "") {
- // self.lastActiveRegion = "";
- // if (self._scrollInterval) {
- // clearInterval(self._scrollInterval);
- // self._scrollInterval = null;
- // }
- // return;
- // }
- // if (self.lastActiveRegion !== direction) {
- // self.lastActiveRegion = direction;
- // if (self._scrollInterval) {
- // clearInterval(self._scrollInterval);
- // self._scrollInterval = null;
- // }
- // var count = 0;
- // self._scrollInterval = setInterval(function () {
- // count++;
- // if (count <= 3) {
- // return;
- // }
- // var offset = self._getScrollOffset();
- // var t = offset.top + map[direction][0] * 40;
- // var l = offset.left + map[direction][1] * 40;
- // if (t < 0 || l < 0) {
- // return;
- // }
- // callback({
- // offsetX: map[direction][1] * 40,
- // offsetY: map[direction][0] * 40
- // });
- // self.scrollTo({
- // top: t,
- // left: l
- // });
- // }, 300);
- // }
- // }
-
- cb({
- offsetX: 0,
- offsetY: 0
- });
- // var offset = this.element.offset();
- // var p = {
- // left: e.pageX - offset.left,
- // top: e.pageY - offset.top
- // };
- // //向上滚
- // if (isBorderScroll && p.top >= 0 && p.top <= 30) {
- // scrollTo("top", cb)
- // }
- // //向下滚
- // else if (isBorderScroll && p.top >= clientHeight - 30 && p.top <= clientHeight) {
- // scrollTo("bottom", cb)
- // }
- // //向左滚
- // else if (isBorderScroll && p.left >= 0 && p.left <= 30) {
- // scrollTo("left", cb)
- // }
- // //向右滚
- // else if (isBorderScroll && p.left >= clientWidth - 30 && p.left <= clientWidth) {
- // scrollTo("right", cb)
- // } else {
- // if (isOverflowScroll === true) {
- // if (p.top < 0) {
- // scrollTo("top", cb);
- // }
- // else if (p.top > clientHeight) {
- // scrollTo("bottom", cb);
- // }
- // else if (p.left < 0) {
- // scrollTo("left", cb);
- // }
- // else if (p.left > clientWidth) {
- // scrollTo("right", cb);
- // } else {
- // scrollTo("", cb);
- // }
- // } else {
- // scrollTo("", cb);
- // }
- // }
- },
-
- scrollEnd: function () {
- this.lastActiveRegion = "";
- if (this._scrollInterval) {
- clearInterval(this._scrollInterval);
- this._scrollInterval = null;
- }
- },
-
- scrollTo: function (scroll) {
- this.arrangement.scrollTo(scroll);
- },
-
- zoom: function (ratio) {
- this.arrangement.zoom(ratio);
- },
-
- resize: function () {
- this.arrangement.resize();
- },
-
- relayout: function () {
- return this.arrangement.relayout();
- },
-
- setLayoutType: function (type) {
- var self = this;
- this.arrangement.setLayoutType(type);
- },
-
- getLayoutType: function () {
- return this.arrangement.getLayoutType();
- },
-
- getLayoutRatio: function () {
- return this.arrangement.getLayoutRatio();
- },
-
- getHelper: function () {
- return this.arrangement.getHelper();
- },
-
- getRegionByName: function (name) {
- return this.arrangement.getRegionByName(name);
- },
-
- getAllRegions: function () {
- return this.arrangement.getAllRegions();
- },
-
- revoke: function () {
- if (this._old) {
- this.populate(BI.toArray(this._old));
- }
- },
-
- populate: function (items) {
- var self = this;
- BI.each(items, function (i, item) {
- self._initResizable(item.el);
- });
- this.arrangement.populate(items);
- }
-});
-BI.AdaptiveArrangement.EVENT_ELEMENT_START_RESIZE = "AdaptiveArrangement.EVENT_ELEMENT_START_RESIZE";
-BI.AdaptiveArrangement.EVENT_ELEMENT_RESIZE = "AdaptiveArrangement.EVENT_ELEMENT_RESIZE";
-BI.AdaptiveArrangement.EVENT_ELEMENT_STOP_RESIZE = "AdaptiveArrangement.EVENT_ELEMENT_STOP_RESIZE";
-BI.AdaptiveArrangement.EVENT_RESIZE = "AdaptiveArrangement.EVENT_RESIZE";
-BI.AdaptiveArrangement.EVENT_SCROLL = "AdaptiveArrangement.EVENT_SCROLL";
-BI.shortcut('bi.adaptive_arrangement', BI.AdaptiveArrangement);/**
- * Arrangement的block面板
- *
- * Created by GUY on 2016/3/1.
- * @class BI.ArrangementBlock
- * @extends BI.Widget
- */
-BI.ArrangementBlock = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.ArrangementBlock.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-arrangement-block bi-mask"
- });
- }
-});
-BI.shortcut('bi.arrangement_block', BI.ArrangementBlock);/**
- * Arrangement的drop面板
- *
- * Created by GUY on 2016/3/1.
- * @class BI.ArrangementDroppable
- * @extends BI.Widget
- */
-BI.ArrangementDroppable = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.ArrangementDroppable.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-arrangement-droppable bi-resizer"
- });
- }
-});
-BI.shortcut('bi.arrangement_droppable', BI.ArrangementDroppable);/**
- * 布局
- *
- * Created by GUY on 2016/2/23.
- * @class BI.Arrangement
- * @extends BI.Widget
- */
-BI.Arrangement = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.Arrangement.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-arrangement",
- layoutType: BI.Arrangement.LAYOUT_TYPE.GRID,
- items: []
- });
- },
-
- _init: function () {
- BI.Arrangement.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.arrangement = BI.createWidget({
- type: "bi.arrangement_droppable",
- cls: "arrangement-block",
- invisible: true
- });
- this.block = BI.createWidget({
- type: "bi.arrangement_block",
- invisible: true
- });
- this.container = BI.createWidget({
- type: "bi.absolute",
- scrollable: true,
- cls: "arrangement-container",
- items: o.items.concat([this.block, this.arrangement])
- });
-
- this.container.element.scroll(function () {
- self.fireEvent(BI.Arrangement.EVENT_SCROLL, {
- scrollLeft: self.container.element.scrollLeft(),
- scrollTop: self.container.element.scrollTop(),
- clientWidth: self.container.element[0].clientWidth,
- clientHeight: self.container.element[0].clientHeight
- });
- });
-
- BI.createWidget({
- type: "bi.absolute",
- element: this,
- items: [{
- el: this.container,
- left: 0,
- right: 0,
- top: 0,
- bottom: 0
- }]
- });
- this.regions = {};
- if (o.items.length > 0) {
- BI.nextTick(function () {
- self.populate(o.items);
- });
- }
- },
-
- ////初始化操作////
- _calculateRegions: function (items) {
- var self = this, o = this.options;
- this.regions = {};
- BI.each(items, function (i, item) {
- var region = self._createOneRegion(item);
- self.regions[region.id] = region;
- });
- },
-
- _isEqual: function (num1, num2) {
- return Math.abs(num1 - num2) < 2;
- },
-
- _isLessThan: function (num1, num2) {
- return num1 < num2 && !this._isEqual(num1, num2);
- },
-
- _isMoreThan: function (num1, num2) {
- return num1 > num2 && !this._isEqual(num1, num2);
- },
-
- _isLessThanEqual: function (num1, num2) {
- return num1 <= num2 || this._isEqual(num1, num2);
- },
-
- _isMoreThanEqual: function (num1, num2) {
- return num1 >= num2 || this._isEqual(num1, num2);
- },
-
- //获取占有的最大Region
- _getRegionOccupied: function (regions) {
- var self = this, o = this.options;
- if (BI.size(regions || this.regions) <= 0) {
- return {
- left: 0,
- top: 0,
- width: 0,
- height: 0
- }
- }
- var minLeft = BI.MAX, maxLeft = BI.MIN, minTop = BI.MAX, maxTop = BI.MIN;
- BI.each(regions || this.regions, function (id, region) {
- minLeft = Math.min(minLeft, region.left);
- maxLeft = Math.max(maxLeft, region.left + region.width);
- minTop = Math.min(minTop, region.top);
- maxTop = Math.max(maxTop, region.top + region.height);
- });
- return {
- left: minLeft,
- top: minTop,
- width: maxLeft - minLeft,
- height: maxTop - minTop
- }
- },
-
- //两个区域的交叉面积
- _getCrossArea: function (region1, region2) {
- if (region1.left <= region2.left) {
- if (region1.top <= region2.top) {
- if (region1.top + region1.height > region2.top && region1.left + region1.width > region2.left) {
- if (this._isEqual(region1.top + region1.height, region2.top) || this._isEqual(region1.left + region1.width, region2.left)) {
- return 0;
- }
- return (region1.top + region1.height - region2.top) * (region1.left + region1.width - region2.left);
- }
- } else {
- if (region2.top + region2.height > region1.top && region1.left + region1.width > region2.left) {
- if (this._isEqual(region2.top + region2.height, region1.top) || this._isEqual(region1.left + region1.width, region2.left)) {
- return 0;
- }
- return (region2.top + region2.height - region1.top) * (region1.left + region1.width - region2.left);
- }
- }
- } else {
- if (region1.top <= region2.top) {
- if (region1.top + region1.height > region2.top && region2.left + region2.width > region1.left) {
- if (this._isEqual(region1.top + region1.height, region2.top) || this._isEqual(region2.left + region2.width, region1.left)) {
- return 0;
- }
- return (region1.top + region1.height - region2.top) * (region2.left + region2.width - region1.left);
- }
- } else {
- if (region2.top + region2.height > region1.top && region2.left + region2.width > region1.left) {
- if (this._isEqual(region2.top + region2.height, region1.top) || this._isEqual(region2.left + region2.width, region1.left)) {
- return 0;
- }
- return (region2.top + region2.height - region1.top) * (region2.left + region2.width - region1.left);
- }
- }
- }
- return 0;
- },
-
- //是否有覆盖的组件
- _isRegionOverlay: function (regions) {
- var reg = [];
- BI.each(regions || this.regions, function (id, region) {
- reg.push(new BI.Region(region.left, region.top, region.width, region.height));
- });
- for (var i = 0, len = reg.length; i < len; i++) {
- for (var j = i + 1; j < len; j++) {
- var area1 = {
- left: reg[i].x,
- top: reg[i].y,
- width: reg[i].w,
- height: reg[i].h
- };
- var area2 = {
- left: reg[j].x,
- top: reg[j].y,
- width: reg[j].w,
- height: reg[j].h
- };
- if (reg[i].isIntersects(reg[j]) && this._getCrossArea(area1, area2) > 1) {
- return true;
- }
- }
- }
- return false;
- },
-
- //布局是否是优良的
- _isArrangeFine: function (regions) {
- switch (this.options.layoutType) {
- case BI.Arrangement.LAYOUT_TYPE.FREE:
- return true;
- case BI.Arrangement.LAYOUT_TYPE.GRID:
- // if (this._isRegionOverlay()) {
- // return false;
- // }
- }
- return true;
- },
-
- _getRegionNames: function (regions) {
- var names = [];
- BI.each(regions || this.regions, function (i, region) {
- names.push(region.id || region.attr("id"));
- });
- return names;
- },
-
- _getRegionsByNames: function (names, regions) {
- names = BI.isArray(names) ? names : [names];
- regions = regions || this.regions;
- if (BI.isArray(regions)) {
- var result = [];
- BI.each(regions, function (i, region) {
- if (names.contains(region.id || region.attr("id"))) {
- result.push(region);
- }
- });
- } else {
- var result = {};
- BI.each(names, function (i, name) {
- result[name] = regions[name];
- });
- }
- return result;
- },
-
- _cloneRegion: function (regions) {
- var clone = {};
- BI.each(regions || this.regions, function (id, region) {
- clone[id] = {};
- clone[id].el = region.el;
- clone[id].id = region.id;
- clone[id].left = region.left;
- clone[id].top = region.top;
- clone[id].width = region.width;
- clone[id].height = region.height;
- });
- return clone;
- },
-
- //测试合法性
- _test: function (regions) {
- var self = this;
- return !BI.any(regions || this.regions, function (i, region) {
- if (BI.isNaN(region.width) || BI.isNaN(region.height) || region.width <= 21 || region.height <= 21) {
- return true;
- }
- })
- },
-
- _getScrollOffset: function () {
- return {
- left: this.container.element[0].scrollLeft,
- top: this.container.element[0].scrollTop
- }
- },
-
- ////操作////
- _createOneRegion: function (item) {
- var el = BI.createWidget(item.el);
- el.setVisible(true);
- return {
- id: el.attr("id"),
- left: item.left,
- top: item.top,
- width: item.width,
- height: item.height,
- el: el
- }
- },
-
- _applyRegion: function (regions) {
- var self = this, o = this.options;
- BI.each(regions || this.regions, function (i, region) {
- region.el.element.css({
- left: region.left,
- top: region.top,
- width: region.width,
- height: region.height
- });
- });
- this._applyContainer();
- this.ratio = this.getLayoutRatio();
- },
-
- _renderRegion: function () {
- var items = BI.toArray(this.regions);
- BI.each(items, function (i, item) {
- if (BI.isNotNull(item.el)) {
- item.el.options.key = item.id;
- } else {
- item.key = item.id;
- }
- });
- if (BI.isNull(this.wrapper)) {
- this.wrapper = BI.createWidget({
- type: "bi.absolute",
- element: this.container
- });
- }
- this.wrapper.addItems(items);
- },
-
- getClientWidth: function () {
- return this.container.element[0].clientWidth;
- },
-
- getClientHeight: function () {
- return this.container.element[0].clientHeight;
- },
-
- _applyContainer: function () {
- var occupied = this._getRegionOccupied();
- return occupied;
- },
-
- _modifyRegion: function (regions) {
- BI.each(this.regions, function (id, region) {
- if (regions[id]) {
- region.left = regions[id].left;
- region.top = regions[id].top;
- region.width = regions[id].width;
- region.height = regions[id].height;
- }
- });
- },
-
- _addRegion: function (item) {
- var region = this._createOneRegion(item);
- this.regions[region.id] = region;
- BI.createWidget({
- type: "bi.absolute",
- element: this.container,
- items: [region]
- });
- },
-
- _deleteRegionByName: function (name) {
- this.regions[name].el.setVisible(false);
- delete this.regions[name];
- },
-
- _setArrangeSize: function (size) {
- this.arrangement.element.css({
- left: size.left,
- top: size.top,
- width: size.width,
- height: size.height
- })
- },
-
- //Grid
- _getOneWidthPortion: function () {
- return this.getClientWidth() / BI.Arrangement.PORTION;
- },
- _getOneHeightPortion: function () {
- return this.getClientHeight() / BI.Arrangement.H_PORTION;
- },
-
- _getGridPositionAndSize: function (position) {
- var perWidth = this._getOneWidthPortion();
- var perHeight = this._getOneHeightPortion();
- var widthPortion = Math.round(position.width / perWidth);
- var leftPortion = Math.round(position.left / perWidth);
- var topPortion = Math.round(position.top / perHeight);
- var heightPortion = Math.round(position.height / perHeight);
- // if (leftPortion > BI.Arrangement.PORTION) {
- // leftPortion = BI.Arrangement.PORTION;
- // }
- // if (widthPortion > BI.Arrangement.PORTION) {
- // widthPortion = BI.Arrangement.PORTION;
- // }
- // if (leftPortion + widthPortion > BI.Arrangement.PORTION) {
- // leftPortion = BI.Arrangement.PORTION - widthPortion;
- // }
- if (widthPortion === 0) {
- widthPortion = 1;
- }
- if (heightPortion === 0) {
- heightPortion = 1;
- }
- return {
- x: leftPortion,
- y: topPortion,
- w: widthPortion,
- h: heightPortion
- }
- },
-
- _getBlockPositionAndSize: function (position) {
- var perWidth = this._getOneWidthPortion();
- var perHeight = this._getOneHeightPortion();
- return {
- left: position.x * perWidth,
- top: position.y * perHeight,
- width: position.w * perWidth,
- height: position.h * perHeight
- };
- },
-
- _getLayoutsByRegions: function (regions) {
- var self = this;
- var result = [];
- BI.each(regions || this.regions, function (id, region) {
- result.push(BI.extend(self._getGridPositionAndSize(region), {
- i: region.id
- }))
- });
- return result;
- },
-
- _getLayoutIndexByName: function (layout, name) {
- return BI.findIndex(layout, function (i, l) {
- return l.i === name;
- });
- },
-
- _setBlockPositionAndSize: function (size) {
- this.block.element.css({
- left: size.left,
- top: size.top,
- width: size.width,
- height: size.height
- });
- },
-
- _getRegionsByLayout: function (layout) {
- var self = this;
- var regions = {};
- BI.each(layout, function (i, ly) {
- regions[ly.i] = BI.extend(self._getBlockPositionAndSize(ly), {
- id: ly.i
- });
- });
- return regions;
- },
-
- _setRegionsByLayout: function (regions, layout) {
- var self = this;
- regions || (regions = this.regions);
- BI.each(layout, function (i, ly) {
- if (regions[ly.i]) {
- BI.extend(regions[ly.i], self._getBlockPositionAndSize(ly));
- }
- });
- return regions;
- },
-
- _moveElement: function (layout, l, x, y, isUserAction) {
- var self = this;
- if (l._static) {
- return layout;
- }
-
- if (l.y === y && l.x === x) {
- return layout;
- }
-
- var movingUp = y && l.y > y;
- if (typeof x === 'number') {
- l.x = x;
- }
- if (typeof y === 'number') {
- l.y = y;
- }
- l.moved = true;
-
- var sorted = this._sortLayoutItemsByRowCol(layout);
- if (movingUp) {
- sorted = sorted.reverse();
- }
- var collisions = getAllCollisions(sorted, l);
-
- for (var i = 0, len = collisions.length; i < len; i++) {
- var collision = collisions[i];
- if (collision.moved) {
- continue;
- }
-
- if (l.y > collision.y && l.y - collision.y > collision.h / 4) {
- continue;
- }
-
- if (collision._static) {
- layout = this._moveElementAwayFromCollision(layout, collision, l, isUserAction);
- } else {
- layout = this._moveElementAwayFromCollision(layout, l, collision, isUserAction);
- }
- }
-
- return layout;
-
- function getAllCollisions(layout, layoutItem) {
- return BI.filter(layout, function (i, l) {
- return self._collides(l, layoutItem);
- });
- }
- },
-
- _sortLayoutItemsByRowCol: function (layout) {
- return [].concat(layout).sort(function (a, b) {
- if (a.y > b.y || (a.y === b.y && a.x > b.x)) {
- return 1;
- }
- return -1;
- });
- },
-
- _collides: function (l1, l2) {
- if (l1 === l2) {
- return false;
- } // same element
- if (l1.x + l1.w <= l2.x) {
- return false;
- } // l1 is left of l2
- if (l1.x >= l2.x + l2.w) {
- return false;
- } // l1 is right of l2
- if (l1.y + l1.h <= l2.y) {
- return false;
- } // l1 is above l2
- if (l1.y >= l2.y + l2.h) {
- return false;
- } // l1 is below l2
- return true; // boxes overlap
- },
-
- _getFirstCollision: function (layout, layoutItem) {
- for (var i = 0, len = layout.length; i < len; i++) {
- if (this._collides(layout[i], layoutItem)) {
- return layout[i];
- }
- }
- },
-
- _moveElementAwayFromCollision: function (layout, collidesWith,
- itemToMove, isUserAction) {
- if (isUserAction) {
- var fakeItem = {
- x: itemToMove.x,
- y: itemToMove.y,
- w: itemToMove.w,
- h: itemToMove.h,
- i: '-1'
- };
- fakeItem.y = Math.max(collidesWith.y - itemToMove.h, 0);
- if (!this._getFirstCollision(layout, fakeItem)) {
- return this._moveElement(layout, itemToMove, undefined, fakeItem.y);
- }
- }
-
- return this._moveElement(layout, itemToMove, undefined, itemToMove.y + 1);
- },
-
- _compactItem: function (compareWith, l, verticalCompact) {
- if (verticalCompact) {
- while (l.y > 0 && !this._getFirstCollision(compareWith, l)) {
- l.y--;
- }
- }
-
- var collides;
- while ((collides = this._getFirstCollision(compareWith, l))) {
- l.y = collides.y + collides.h;
- }
- return l;
- },
-
- compact: function (layout, verticalCompact) {
- var compareWith = getStatics(layout);
- var sorted = this._sortLayoutItemsByRowCol(layout);
- var out = [];
-
- for (var i = 0, len = sorted.length; i < len; i++) {
- var l = sorted[i];
-
- if (!l._static) {
- l = this._compactItem(compareWith, l, verticalCompact);
-
- compareWith.push(l);
- }
-
- out[layout.indexOf(l)] = l;
-
- l.moved = false;
- }
-
- return out;
-
- function getStatics(layout) {
- return BI.filter(layout, function (i, l) {
- return l._static;
- });
- }
- },
-
- ////公有方法////
- getRegionByName: function (name) {
- var obj = {};
- obj[name] = this.regions[name];
- return this._cloneRegion(obj)[name];
- },
-
- getAllRegions: function () {
- return BI.toArray(this._cloneRegion());
- },
-
- getHelper: function () {
- var helper = BI.createWidget({
- type: "bi.layout",
- width: 18,
- height: 18,
- cls: "arrangement-helper bi-border"
- });
- BI.createWidget({
- type: "bi.absolute",
- element: this,
- items: [helper]
- });
- return helper;
- },
-
- _start: function () {
- if (this.options.layoutType === BI.Arrangement.LAYOUT_TYPE.GRID) {
- this.block.setVisible(true);
- } else {
- this.arrangement.setVisible(true);
- }
- },
-
- _stop: function () {
- this.arrangement.setVisible(false);
- this.block.setVisible(false);
- },
-
- ////公有操作////
- setLayoutType: function (type) {
- var self = this, o = this.options;
- if (type !== o.layoutType) {
- o.layoutType = type;
- switch (o.layoutType) {
- case BI.Arrangement.LAYOUT_TYPE.FREE:
- break;
- case BI.Arrangement.LAYOUT_TYPE.GRID:
- this.relayout();
- break;
- }
- }
- },
-
- getLayoutType: function () {
- return this.options.layoutType;
- },
-
- getLayoutRatio: function () {
- var occupied = this._getRegionOccupied();
- var width = this.getClientWidth(), height = this.getClientHeight();
- return {
- x: BI.parseFloat(BI.contentFormat((occupied.left + occupied.width) / width, "#.##;-#.##")),
- y: BI.parseFloat(BI.contentFormat((occupied.top + occupied.height) / height, "#.##;-#.##"))
- }
- },
-
- addRegion: function (region, position) {
- if (position) {
- this.setPosition(position, region);
- }
- var self = this, o = this.options;
- if (!this.position) {
- return false;
- }
- var test = this._cloneRegion();
- BI.each(this.position.regions, function (i, region) {
- test[region.id].left = region.left;
- test[region.id].top = region.top;
- test[region.id].width = region.width;
- test[region.id].height = region.height;
-
- });
- var item = BI.extend({}, region, {
- left: this.position.insert.left,
- top: this.position.insert.top,
- width: this.position.insert.width,
- height: this.position.insert.height
- });
- var added = this._createOneRegion(item);
- test[added.id] = added;
- if (this._test(test)) {
- delete test[added.id];
- this._modifyRegion(test);
- this._addRegion(item);
- this._populate(this.getAllRegions());
- return true;
- }
- return false;
- },
-
- deleteRegion: function (name) {
- if (!this.regions[name]) {
- return false;
- }
- var self = this, o = this.options;
- switch (o.layoutType) {
- case BI.Arrangement.LAYOUT_TYPE.FREE:
- this._deleteRegionByName(name);
- this._populate(this.getAllRegions());
- return true;
- case BI.Arrangement.LAYOUT_TYPE.GRID:
- this._deleteRegionByName(name);
- this._populate(this.getAllRegions());
- this.resize();
- return true;
- }
- return false;
- },
-
- setRegionSize: function (name, size) {
- var self = this, o = this.options;
- var flag = false;
- switch (o.layoutType) {
- case BI.Arrangement.LAYOUT_TYPE.FREE:
- var clone = this._cloneRegion();
- BI.extend(clone[name], {
- width: size.width,
- height: size.height
- });
- if (this._test(clone)) {
- this._modifyRegion(clone);
- flag = true;
- }
- break;
- case BI.Arrangement.LAYOUT_TYPE.GRID:
- var clone = this._cloneRegion();
- BI.extend(clone[name], {
- width: size.width,
- height: size.height
- });
- if (this._test(clone)) {
- var layout = this._getLayoutsByRegions(clone);
- layout = this.compact(layout, true);
- var regions = this._getRegionsByLayout(layout);
- this._modifyRegion(regions);
- flag = true;
- }
- break;
- }
- this._applyRegion();
- return flag;
- },
-
- setPosition: function (position, size) {
- var self = this, o = this.options;
- var insert, regions = [], cur;
- if (position.left < 0 || position.top < 0) {
- switch (o.layoutType) {
- case BI.Arrangement.LAYOUT_TYPE.FREE:
- break;
- case BI.Arrangement.LAYOUT_TYPE.GRID:
- this.resize();
- break;
- }
- this._stop();
- this.position = null;
- return null;
- }
- var offset = this._getScrollOffset();
- position = {
- left: position.left + offset.left,
- top: position.top + offset.top
- };
- switch (o.layoutType) {
- case BI.Arrangement.LAYOUT_TYPE.FREE:
- var insert = {
- top: position.top < 0 ? 0 : position.top,
- left: position.left < 0 ? 0 : position.left,
- width: size.width,
- height: size.height
- };
- this.position = {
- insert: insert
- };
- this._setArrangeSize(insert);
- this._start();
- break;
- case BI.Arrangement.LAYOUT_TYPE.GRID:
- var p = {
- top: position.top < 0 ? 0 : position.top,
- left: position.left < 0 ? 0 : position.left,
- width: size.width,
- height: size.height
- };
- this._setArrangeSize(p);
- var cur = this._getGridPositionAndSize(p);
- var layout = [{
- x: 0, y: BI.MAX, w: cur.w, h: cur.h, i: cur.i
- }].concat(this._getLayoutsByRegions());
- layout = this._moveElement(layout, layout[0], cur.x, cur.y, true);
- layout = this.compact(layout, true);
- var regions = this._setRegionsByLayout(this._cloneRegion(), layout);
- var insert = this._getBlockPositionAndSize(layout[0]);
- this.position = {
- insert: insert,
- regions: regions
- };
- this._applyRegion(regions);
- this._setBlockPositionAndSize(insert);
- this._start();
- break;
- }
- return this.position;
- },
-
- setRegionPosition: function (name, position) {
- var self = this, o = this.options;
- var offset = this._getScrollOffset();
- position = BI.extend(position, {
- left: position.left + offset.left,
- top: position.top + offset.top
- });
- switch (o.layoutType) {
- case BI.Arrangement.LAYOUT_TYPE.FREE:
- BI.extend(this.regions[name], {
- left: position.left < 0 ? 0 : position.left,
- top: position.top < 0 ? 0 : position.top
- });
- this._applyRegion();
- break;
- case BI.Arrangement.LAYOUT_TYPE.GRID:
- if (!position.stop) {
- BI.extend(this.regions[name], {
- left: position.left < 0 ? 0 : position.left,
- top: position.top < 0 ? 0 : position.top
- });
- var cloned = this._cloneRegion();
- var cur = this._getGridPositionAndSize(BI.extend(cloned[name], {
- left: position.left < 0 ? 0 : position.left,
- top: position.top < 0 ? 0 : position.top
- }));
- var x = cur.x, y = cur.y;
- cur = BI.extend(cur, {
- x: 0, y: BI.MAX, i: -1
- });
- delete cloned[name];
- var layout = this._getLayoutsByRegions(cloned);
- layout = this._moveElement([cur].concat(layout), cur, x, y, true);
- layout = this.compact(layout, true);
- var regions = this._getRegionsByLayout(layout);
- this._modifyRegion(regions);
- this._applyRegion();
-
- this._setBlockPositionAndSize(this._getBlockPositionAndSize(cur));
- this.block.setVisible(true);
- } else {
- BI.extend(this.regions[name], {
- left: position.left < 0 ? 0 : position.left,
- top: position.top < 0 ? 0 : position.top
- });
- var cloned = this._cloneRegion();
- var layout = this._getLayoutsByRegions(cloned);
- layout = this.compact(layout, true);
- var regions = this._getRegionsByLayout(layout);
- this._modifyRegion(regions);
- this._applyRegion();
- this.block.setVisible(false);
- }
- break;
- }
- },
-
- setDropPosition: function (position, size) {
- var self = this;
- this.arrangement.setVisible(true);
- var offset = this._getScrollOffset();
- this._setArrangeSize(BI.extend({}, size, {
- left: position.left + offset.left,
- top: position.top + offset.top
- }));
- return function () {
- self.arrangement.setVisible(false);
- }
- },
-
- scrollTo: function (scroll) {
- this.container.element.scrollTop(scroll.top);
- this.container.element.scrollLeft(scroll.left);
- },
-
- zoom: function (ratio) {
- var self = this, o = this.options;
- if (!ratio) {
- return;
- }
- var occupied = this._applyContainer();
- switch (this.getLayoutType()) {
- case BI.Arrangement.LAYOUT_TYPE.FREE:
- if (this._isArrangeFine()) {
- var width = this.getClientWidth();
- var xRatio = (ratio.x || 1) * width / (occupied.left + occupied.width);
- //var yRatio = ratio.y * height / (occupied.top + occupied.height);
- var regions = this._cloneRegion();
- BI.each(regions, function (i, region) {
- region.left = region.left * xRatio;
- //region.top = region.top * yRatio;
- region.width = region.width * xRatio;
- //region.height = region.height * yRatio;
- });
- if (this._test(regions)) {
- this._modifyRegion(regions);
- this._applyRegion();
- }
- this.resize();
- // } else {
- this.relayout();
- }
- break;
- case BI.Arrangement.LAYOUT_TYPE.GRID:
- if (this._isArrangeFine()) {
- var width = this.getClientWidth(), height = this.getClientHeight();
- var xRatio = (ratio.x || 1) * width / (occupied.left + occupied.width);
- var yRatio = (ratio.y || 1) * height / (occupied.top + occupied.height);
- var regions = this._cloneRegion();
- BI.each(regions, function (i, region) {
- region.left = region.left * xRatio;
- region.width = region.width * xRatio;
- region.top = region.top * yRatio;
- region.height = region.height * yRatio;
- //做一下自适应布局到网格布局的兼容
- var perWidth = self._getOneWidthPortion();
- var widthPortion = Math.round(region.width / perWidth);
- var leftPortion = Math.round(region.left / perWidth);
- var comparePortion = Math.round((region.width + region.left) / perWidth);
- if (leftPortion + widthPortion !== comparePortion) {
- region.left = leftPortion * perWidth;
- region.width = comparePortion * perWidth - region.left;
- }
- });
- if (this._test(regions)) {
- var layout = this._getLayoutsByRegions(regions);
- layout = this.compact(layout, true);
- regions = this._getRegionsByLayout(layout);
- this._modifyRegion(regions);
- this._applyRegion();
- }
- } else {
- this.relayout();
- }
- break;
- }
- },
-
- resize: function () {
- var self = this, o = this.options;
- switch (o.layoutType) {
- case BI.Arrangement.LAYOUT_TYPE.FREE:
- break;
- case BI.Arrangement.LAYOUT_TYPE.GRID:
- this.zoom(this.ratio);
- var regions = this._cloneRegion();
- var layout = this._getLayoutsByRegions(regions);
- layout = this.compact(layout, true);
- regions = this._getRegionsByLayout(layout);
- this._modifyRegion(regions);
- this._applyRegion();
- break;
- }
- },
-
- relayout: function () {
- var self = this, o = this.options;
- switch (o.layoutType) {
- case BI.Arrangement.LAYOUT_TYPE.FREE:
- break;
- case BI.Arrangement.LAYOUT_TYPE.GRID:
- if (!this._isArrangeFine()) {
- var perHeight = this._getOneHeightPortion();
- var width = this.getClientWidth(), height = this.getClientHeight();
- var regions = this._cloneRegion();
- var clone = BI.toArray(regions);
- clone.sort(function (r1, r2) {
- if (self._isEqual(r1.top, r2.top)) {
- return r1.left - r2.left;
- }
- return r1.top - r2.top;
- });
- var count = clone.length;
- var cols = 4, rows = Math.floor((count - 1) / 4 + 1);
- var w = width / cols, h = height / rows;
- var store = {};
- BI.each(clone, function (i, region) {
- var row = Math.floor(i / 4), col = i % 4;
- BI.extend(region, {
- top: row * perHeight * 6,
- left: col * w,
- width: w,
- height: perHeight * 6
- });
- if (!store[row]) {
- store[row] = {};
- }
- store[row][col] = region;
- });
- //非4的倍数
- // if (count % 4 !== 0) {
- // var lasts = store[rows - 1];
- // var perWidth = width / (count % 4);
- // BI.each(lasts, function (i, region) {
- // BI.extend(region, {
- // left: BI.parseInt(i) * perWidth,
- // width: perWidth
- // });
- // });
- // }
- if (this._test(clone)) {
- var layout = this._getLayoutsByRegions(regions);
- layout = this.compact(layout, true);
- regions = this._getRegionsByLayout(layout);
- this._modifyRegion(regions);
- this._populate(clone);
- }
- } else {
- this.resize();
- }
- break;
- }
- },
-
- _populate: function (items) {
- this._stop();
- this._calculateRegions(items);
- this._applyRegion();
- },
-
- populate: function (items) {
- // this.regions = {};
- var self = this;
- BI.each(this.regions, function (name, region) {
- var exist = BI.some(items, function (i, item) {
- return item.el.attr("id") === name;
- });
- if (!exist) {
- self.regions[name].el.setVisible(false);
- }
- delete self.regions[name];
- });
- this._populate(items);
- this._renderRegion();
- }
-});
-BI.Arrangement.EVENT_SCROLL = "EVENT_SCROLL";
-BI.extend(BI.Arrangement, {
- PORTION: 36,
- H_PORTION: 18,
- LAYOUT_TYPE: {
- GRID: 0,
- FREE: 1
- }
-});
-BI.shortcut('bi.arrangement', BI.Arrangement);/**
- * 日期控件中的月份下拉框
- *
- * Created by GUY on 2015/9/7.
- * @class BI.MonthDateCombo
- * @extends BI.Trigger
- */
-BI.MonthDateCombo = BI.inherit(BI.Trigger, {
- _defaultConfig: function() {
- return BI.extend( BI.MonthDateCombo.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-month-combo",
- height: 25
- });
- },
- _init: function() {
- BI.MonthDateCombo.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
-
- this.trigger = BI.createWidget({
- type: "bi.date_triangle_trigger"
- });
-
- this.popup = BI.createWidget({
- type: "bi.month_popup"
- });
-
- this.popup.on(BI.YearPopup.EVENT_CHANGE, function(){
- self.setValue(self.popup.getValue());
- })
-
-
- this.combo = BI.createWidget({
- type: "bi.combo",
- offsetStyle: "center",
- element: this,
- isNeedAdjustHeight: false,
- isNeedAdjustWidth: false,
- el: this.trigger,
- popup: {
- minWidth: 85,
- stopPropagation: false,
- el: this.popup
- }
- })
- this.combo.on(BI.Combo.EVENT_CHANGE, function(){
- self.combo.hideView();
- self.fireEvent(BI.MonthDateCombo.EVENT_CHANGE);
- });
- },
-
- setValue: function(v){
- this.trigger.setValue(v + 1);
- this.popup.setValue(v);
- },
-
- getValue: function(){
- return this.popup.getValue();
- }
-});
-BI.MonthDateCombo.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut('bi.month_date_combo', BI.MonthDateCombo);/**
- * 年份下拉框
- *
- * Created by GUY on 2015/9/7.
- * @class BI.YearDateCombo
- * @extends BI.Trigger
- */
-BI.YearDateCombo = BI.inherit(BI.Trigger, {
- _defaultConfig: function() {
- return BI.extend( BI.YearDateCombo.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-year-combo",
- min: '1900-01-01', //最小日期
- max: '2099-12-31', //最大日期
- height: 25
- });
- },
- _init: function() {
- BI.YearDateCombo.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
-
- this.trigger = BI.createWidget({
- type: "bi.date_triangle_trigger"
- });
-
- this.popup = BI.createWidget({
- type: "bi.year_popup",
- min: o.min,
- max: o.max
- });
-
- this.popup.on(BI.YearPopup.EVENT_CHANGE, function(){
- self.setValue(self.popup.getValue());
- self.combo.hideView();
- self.fireEvent(BI.YearDateCombo.EVENT_CHANGE);
- })
-
-
- this.combo = BI.createWidget({
- type: "bi.combo",
- offsetStyle: "center",
- element: this,
- isNeedAdjustHeight: false,
- isNeedAdjustWidth: false,
- el: this.trigger,
- popup: {
- minWidth: 85,
- stopPropagation: false,
- el: this.popup
- }
- })
- this.combo.on(BI.Combo.EVENT_CHANGE, function(){
- self.fireEvent(BI.YearDateCombo.EVENT_CHANGE);
- })
- },
-
- setValue: function(v){
- this.trigger.setValue(v);
- this.popup.setValue(v);
- },
-
- getValue: function(){
- return this.popup.getValue();
- }
-});
-BI.YearDateCombo.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut('bi.year_date_combo', BI.YearDateCombo);/**
- * Created by GUY on 2015/9/7.
- * @class BI.DatePicker
- * @extends BI.Widget
- */
-BI.DatePicker = BI.inherit(BI.Widget, {
- _defaultConfig: function () {
- var conf = BI.DatePicker.superclass._defaultConfig.apply(this, arguments);
- return BI.extend(conf, {
- baseCls: "bi-date-picker bi-background",
- height: 25,
- min: '1900-01-01', //最小日期
- max: '2099-12-31' //最大日期
- })
- },
-
- _init: function () {
- BI.DatePicker.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this._year = Date.getDate().getFullYear();
- this._month = Date.getDate().getMonth();
- this.left = BI.createWidget({
- type: "bi.icon_button",
- cls: "pre-page-h-font",
- width: 25,
- height: 25
- });
- this.left.on(BI.IconButton.EVENT_CHANGE, function () {
- if (self._month === 0) {
- self.setValue({
- year: self.year.getValue() - 1,
- month: 11
- })
- } else {
- self.setValue({
- year: self.year.getValue(),
- month: self.month.getValue() - 1
- })
- }
- self.fireEvent(BI.DatePicker.EVENT_CHANGE);
- self._checkLeftValid();
- self._checkRightValid();
- });
-
- this.right = BI.createWidget({
- type: "bi.icon_button",
- cls: "next-page-h-font",
- width: 25,
- height: 25
- });
-
- this.right.on(BI.IconButton.EVENT_CHANGE, function () {
- if (self._month === 11) {
- self.setValue({
- year: self.year.getValue() + 1,
- month: 0
- })
- } else {
- self.setValue({
- year: self.year.getValue(),
- month: self.month.getValue() + 1
- })
- }
- self.fireEvent(BI.DatePicker.EVENT_CHANGE);
- self._checkLeftValid();
- self._checkRightValid();
- });
-
- this.year = BI.createWidget({
- type: "bi.year_date_combo",
- min: o.min,
- max: o.max
- });
- this.year.on(BI.YearDateCombo.EVENT_CHANGE, function () {
- self.setValue({
- year: self.year.getValue(),
- month: self.month.getValue()
- });
- self.fireEvent(BI.DatePicker.EVENT_CHANGE);
- })
- this.month = BI.createWidget({
- type: "bi.month_date_combo"
- });
- this.month.on(BI.MonthDateCombo.EVENT_CHANGE, function () {
- self.setValue({
- year: self.year.getValue(),
- month: self.month.getValue()
- });
- self.fireEvent(BI.DatePicker.EVENT_CHANGE);
- });
-
- BI.createWidget({
- type: "bi.htape",
- element: this,
- items: [{
- el: this.left,
- width: 25
- }, {
- type: "bi.center_adapt",
- items: [{
- type: "bi.horizontal",
- width: 100,
- items: [this.year, this.month]
- }]
- }, {
- el: this.right,
- width: 25
- }]
- })
- this.setValue({
- year: this._year,
- month: this._month
- })
- },
-
- _checkLeftValid: function () {
- var o = this.options;
- var valid = !(this._month === 0 && this._year === Date.parseDateTime(o.min, "%Y-%X-%d").getFullYear());
- this.left.setEnable(valid);
- return valid;
- },
-
- _checkRightValid: function () {
- var o = this.options;
- var valid = !(this._month === 11 && this._year === Date.parseDateTime(o.max, "%Y-%X-%d").getFullYear());
- this.right.setEnable(valid);
- return valid;
- },
-
-
-
- setValue: function (ob) {
- this._year = ob.year;
- this._month = ob.month;
- this.year.setValue(ob.year);
- this.month.setValue(ob.month);
- this._checkLeftValid();
- this._checkRightValid();
- },
-
- getValue: function () {
- return {
- year: this.year.getValue(),
- month: this.month.getValue()
- }
- }
-});
-BI.DatePicker.EVENT_CHANGE = "EVENT_CHANGE"
-BI.shortcut("bi.date_picker", BI.DatePicker);/**
- * Created by GUY on 2015/9/7.
- * @class BI.DateCalendarPopup
- * @extends BI.Widget
- */
-BI.DateCalendarPopup = BI.inherit(BI.Widget, {
- _defaultConfig: function () {
- var conf = BI.DateCalendarPopup.superclass._defaultConfig.apply(this, arguments);
- return BI.extend(conf, {
- baseCls: "bi-date-calendar-popup",
- min: '1900-01-01', //最小日期
- max: '2099-12-31', //最大日期
- selectedTime: null
- })
- },
-
- _createNav: function (v) {
- var date = BI.Calendar.getDateJSONByPage(v);
- var calendar = BI.createWidget({
- type: "bi.calendar",
- logic: {
- dynamic: true
- },
- min: this.options.min,
- max: this.options.max,
- year: date.year,
- month: date.month,
- day: this.selectedTime.day
- });
- return calendar
- },
-
- _init: function () {
- BI.DateCalendarPopup.superclass._init.apply(this, arguments);
- var self = this,
- o = this.options;
- this.today = Date.getDate();
- this._year = this.today.getFullYear();
- this._month = this.today.getMonth();
- this._day = this.today.getDate();
-
- this.selectedTime = o.selectedTime || {
- year: this._year,
- month: this._month,
- day: this._day
- };
- this.datePicker = BI.createWidget({
- type: "bi.date_picker",
- min: o.min,
- max: o.max
- });
-
- this.calendar = BI.createWidget({
- direction: "top",
- element: this,
- logic: {
- dynamic: true
- },
- type: "bi.navigation",
- tab: this.datePicker,
- cardCreator: BI.bind(this._createNav, this),
-
- afterCardCreated: function () {
-
- },
-
- afterCardShow: function () {
- this.setValue(self.selectedTime);
- }
- });
-
- this.datePicker.on(BI.DatePicker.EVENT_CHANGE, function () {
- self.selectedTime = self.datePicker.getValue();
- self.selectedTime.day = 1;
- self.calendar.setSelect(BI.Calendar.getPageByDateJSON(self.selectedTime));
- });
-
- this.calendar.on(BI.Navigation.EVENT_CHANGE, function () {
- self.selectedTime = self.calendar.getValue();
- self.setValue(self.selectedTime);
- self.fireEvent(BI.DateCalendarPopup.EVENT_CHANGE);
- });
- },
-
- setValue: function (timeOb) {
- this.datePicker.setValue(timeOb);
- this.calendar.setSelect(BI.Calendar.getPageByDateJSON(timeOb));
- this.calendar.setValue(timeOb);
- this.selectedTime = timeOb;
- },
-
- getValue: function () {
- return this.selectedTime;
- }
-});
-BI.DateCalendarPopup.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut("bi.date_calendar_popup", BI.DateCalendarPopup);/**
- * 日期控件中的年份或月份trigger
- *
- * Created by GUY on 2015/9/7.
- * @class BI.DateTriangleTrigger
- * @extends BI.Trigger
- */
-BI.DateTriangleTrigger = BI.inherit(BI.Trigger, {
- _const: {
- height: 25,
- iconWidth: 16,
- iconHeight: 13
- },
-
- _defaultConfig: function() {
- return BI.extend( BI.DateTriangleTrigger.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-date-triangle-trigger pull-down-ha-font cursor-pointer",
- height: 25
- });
- },
- _init: function() {
- BI.DateTriangleTrigger.superclass._init.apply(this, arguments);
- var o = this.options, c = this._const;
- this.text = BI.createWidget({
- type: "bi.label",
- cls: "list-item-text",
- textAlign: "right",
- text: o.text,
- value: o.value,
- height: c.height
- })
- this.icon = BI.createWidget({
- type: "bi.icon",
- width: c.iconWidth,
- height: c.iconHeight
- });
-
- BI.createWidget({
- type: "bi.center_adapt",
- element: this,
- items: [{
- type: "bi.center_adapt",
- width: 50,
- height: c.height,
- items: [this.text, this.icon]
- }]
- })
- },
-
- setValue: function(v){
- this.text.setValue(v);
- },
-
- getValue: function(){
- return this.text.getValue();
- },
-
- setText: function(v){
- this.text.setText(v);
- },
-
- getText: function(){
- return this.item.getText();
- },
-
- getKey: function(){
-
- }
-});
-BI.shortcut('bi.date_triangle_trigger', BI.DateTriangleTrigger);/**
- * 日期下拉框
- *
- * Created by GUY on 2015/9/7.
- * @class BI.DateCombo
- * @extends BI.Widget
- */
-BI.DateCombo = BI.inherit(BI.Widget, {
- _defaultConfig: function () {
- return BI.extend(BI.DateCombo.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-date-combo bi-border",
- height: 25
- });
- },
- _init: function () {
- BI.DateCombo.superclass._init.apply(this, arguments);
- var self = this,
- o = this.options;
-
- this.trigger = BI.createWidget({
- type: "bi.date_trigger"
- });
-
- this.trigger.on(BI.DateTrigger.EVENT_TRIGGER_CLICK, function () {
- self.combo.toggle();
- });
-
- this.popup = BI.createWidget({
- type: "bi.date_calendar_popup"
- });
-
- this.popup.on(BI.DateCalendarPopup.EVENT_CHANGE, function () {
- self.setValue(self.popup.getValue());
- });
-
- this.combo = BI.createWidget({
- type: "bi.combo",
- toggle: false,
- element: this,
- isNeedAdjustHeight: false,
- isNeedAdjustWidth: false,
- el: this.trigger,
- popup: {
- width: 270,
- el: this.popup,
- stopPropagation: false
- }
- })
- },
-
- setValue: function (v) {
- this.trigger.setValue(v);
- this.popup.setValue(v);
- },
-
- getValue: function () {
- return this.popup.getValue();
- }
-});
-BI.shortcut('bi.date_combo', BI.DateCombo);BI.DateTrigger = BI.inherit(BI.Trigger, {
- _const: {
- hgap: 4,
- vgap: 2,
- yearLength: 4,
- yearMonthLength: 7
- },
-
- _defaultConfig: function () {
- return BI.extend(BI.DateTrigger.superclass._defaultConfig.apply(this, arguments), {
- extraCls: "bi-date-trigger",
- min: '1900-01-01', //最小日期
- max: '2099-12-31', //最大日期
- height: 24
- });
- },
- _init: function () {
- BI.DateTrigger.superclass._init.apply(this, arguments);
- var self = this, o = this.options, c = this._const;
- this.editor = BI.createWidget({
- type: "bi.sign_editor",
- height: o.height,
- validationChecker: function (v) {
- var date = v.match(/\d+/g);
- self._autoAppend(v, date);
- return self._dateCheck(v) && Date.checkLegal(v) && self._checkVoid({
- year: date[0],
- month: date[1],
- day: date[2]
- });
- },
- quitChecker: function () {
- return false;
- },
- hgap: c.hgap,
- vgap: c.vgap,
- allowBlank: true,
- watermark: BI.i18nText("BI-Basic_Unrestricted"),
- errorText: function () {
- if (self.editor.isEditing()) {
- return BI.i18nText("BI-Date_Trigger_Error_Text");
- }
- return BI.i18nText("BI-Year_Trigger_Invalid_Text");
- }
- });
- this.editor.on(BI.SignEditor.EVENT_KEY_DOWN, function () {
- self.fireEvent(BI.DateTrigger.EVENT_KEY_DOWN)
- });
- this.editor.on(BI.SignEditor.EVENT_FOCUS, function () {
- self.fireEvent(BI.DateTrigger.EVENT_FOCUS);
- });
- this.editor.on(BI.SignEditor.EVENT_STOP, function () {
- self.fireEvent(BI.DateTrigger.EVENT_STOP);
- });
- this.editor.on(BI.SignEditor.EVENT_VALID, function () {
- self.fireEvent(BI.DateTrigger.EVENT_VALID);
- });
- this.editor.on(BI.SignEditor.EVENT_ERROR, function () {
- self.fireEvent(BI.DateTrigger.EVENT_ERROR);
- });
- this.editor.on(BI.SignEditor.EVENT_CONFIRM, function () {
- var value = self.editor.getValue();
- if (BI.isNotNull(value)) {
- self.editor.setState(value);
- }
-
- if (BI.isNotEmptyString(value)) {
- var date = value.split("-");
- self.store_value = {
- type: BI.DateTrigger.MULTI_DATE_CALENDAR,
- value:{
- year: date[0] | 0,
- month: date[1] - 1,
- day: date[2] | 0
- }
- };
- }
- self.fireEvent(BI.DateTrigger.EVENT_CONFIRM);
- });
- this.editor.on(BI.SignEditor.EVENT_SPACE, function () {
- if (self.editor.isValid()) {
- self.editor.blur();
- }
- });
- this.editor.on(BI.SignEditor.EVENT_START, function () {
- self.fireEvent(BI.DateTrigger.EVENT_START);
- });
- this.editor.on(BI.SignEditor.EVENT_CHANGE, function () {
- self.fireEvent(BI.DateTrigger.EVENT_CHANGE);
- });
- BI.createWidget({
- type: "bi.htape",
- element: this,
- items: [{
- el: BI.createWidget(),
- width: 30
- }, {
- el: this.editor
- }]
- })
- },
- _dateCheck: function (date) {
- return Date.parseDateTime(date, "%Y-%x-%d").print("%Y-%x-%d") == date || Date.parseDateTime(date, "%Y-%X-%d").print("%Y-%X-%d") == date || Date.parseDateTime(date, "%Y-%x-%e").print("%Y-%x-%e") == date || Date.parseDateTime(date, "%Y-%X-%e").print("%Y-%X-%e") == date;
- },
- _checkVoid: function (obj) {
- return !Date.checkVoid(obj.year, obj.month, obj.day, this.options.min, this.options.max)[0];
- },
- _autoAppend: function (v, dateObj) {
- var self = this;
- var date = Date.parseDateTime(v, "%Y-%X-%d").print("%Y-%X-%d");
- var yearCheck = function (v) {
- return Date.parseDateTime(v, "%Y").print("%Y") == v && date >= self.options.min && date <= self.options.max;
- };
- var monthCheck = function (v) {
- return Date.parseDateTime(v, "%Y-%X").print("%Y-%X") == v && date >= self.options.min && date <= self.options.max;
- };
- if (BI.isNotNull(dateObj) && Date.checkLegal(v)) {
- switch (v.length) {
- case this._const.yearLength:
- if (yearCheck(v)) {
- this.editor.setValue(v + "-");
- }
- break;
- case this._const.yearMonthLength:
- if (monthCheck(v)) {
- this.editor.setValue(v + "-");
- }
- break;
- }
- }
- },
-
- setValue: function (v) {
- var type, value, self = this;
- var date = Date.getDate();
- this.store_value = v;
- if (BI.isNotNull(v)) {
- type = v.type || BI.DateTrigger.MULTI_DATE_CALENDAR; value = v.value;
- if(BI.isNull(value)){
- value = v;
- }
- }
- var _setInnerValue = function (date, text) {
- var dateStr = date.print("%Y-%x-%e");
- self.editor.setState(dateStr);
- self.editor.setValue(dateStr);
- self.setTitle(text + ":" + dateStr);
- };
- switch (type) {
- case BI.DateTrigger.MULTI_DATE_YEAR_PREV:
- var text = value + BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_YEAR_PREV];
- date = Date.getDate((date.getFullYear() - 1 * value), date.getMonth(), date.getDate());
- _setInnerValue(date, text);
- break;
- case BI.DateTrigger.MULTI_DATE_YEAR_AFTER:
- var text = value + BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_YEAR_AFTER];
- date = Date.getDate((date.getFullYear() + 1 * value), date.getMonth(), date.getDate());
- _setInnerValue(date, text);
- break;
- case BI.DateTrigger.MULTI_DATE_YEAR_BEGIN:
- var text = BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_YEAR_BEGIN];
- date = Date.getDate(date.getFullYear(), 0, 1);
- _setInnerValue(date, text);
- break;
- case BI.DateTrigger.MULTI_DATE_YEAR_END:
- var text = BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_YEAR_END];
- date = Date.getDate(date.getFullYear(), 11, 31);
- _setInnerValue(date, text);
- break;
- case BI.DateTrigger.MULTI_DATE_QUARTER_PREV:
- var text = value + BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_QUARTER_PREV];
- date = Date.getDate().getBeforeMulQuarter(value);
- _setInnerValue(date, text);
- break;
- case BI.DateTrigger.MULTI_DATE_QUARTER_AFTER:
- var text = value + BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_QUARTER_AFTER];
- date = Date.getDate().getAfterMulQuarter(value);
- _setInnerValue(date, text);
- break;
- case BI.DateTrigger.MULTI_DATE_QUARTER_BEGIN:
- var text = BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_QUARTER_BEGIN];
- date = Date.getDate().getQuarterStartDate();
- _setInnerValue(date, text);
- break;
- case BI.DateTrigger.MULTI_DATE_QUARTER_END:
- var text = BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_QUARTER_END];
- date = Date.getDate().getQuarterEndDate();
- _setInnerValue(date, text);
- break;
- case BI.DateTrigger.MULTI_DATE_MONTH_PREV:
- var text = value + BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_MONTH_PREV];
- date = Date.getDate().getBeforeMultiMonth(value);
- _setInnerValue(date, text);
- break;
- case BI.DateTrigger.MULTI_DATE_MONTH_AFTER:
- var text = value + BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_MONTH_AFTER];
- date = Date.getDate().getAfterMultiMonth(value);
- _setInnerValue(date, text);
- break;
- case BI.DateTrigger.MULTI_DATE_MONTH_BEGIN:
- var text = BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_MONTH_BEGIN];
- date = Date.getDate(date.getFullYear(), date.getMonth(), 1);
- _setInnerValue(date, text);
- break;
- case BI.DateTrigger.MULTI_DATE_MONTH_END:
- var text = BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_MONTH_END];
- date = Date.getDate(date.getFullYear(), date.getMonth(), (date.getLastDateOfMonth()).getDate());
- _setInnerValue(date, text);
- break;
- case BI.DateTrigger.MULTI_DATE_WEEK_PREV:
- var text = value + BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_WEEK_PREV];
- date = date.getOffsetDate(-7 * value);
- _setInnerValue(date, text);
- break;
- case BI.DateTrigger.MULTI_DATE_WEEK_AFTER:
- var text = value + BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_WEEK_AFTER];
- date = date.getOffsetDate(7 * value);
- _setInnerValue(date, text);
- break;
- case BI.DateTrigger.MULTI_DATE_DAY_PREV:
- var text = value + BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_DAY_PREV];
- date = date.getOffsetDate(-1 * value);
- _setInnerValue(date, text);
- break;
- case BI.DateTrigger.MULTI_DATE_DAY_AFTER:
- var text = value + BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_DAY_AFTER];
- date = date.getOffsetDate(1 * value);
- _setInnerValue(date, text);
- break;
- case BI.DateTrigger.MULTI_DATE_DAY_TODAY:
- var text = BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_DAY_TODAY];
- date = Date.getDate();
- _setInnerValue(date, text);
- break;
- default:
- if (BI.isNull(value) || BI.isNull(value.day)) {
- this.editor.setState("");
- this.editor.setValue("");
- this.setTitle("");
- } else {
- var dateStr = value.year + "-" + (value.month + 1) + "-" + value.day;
- this.editor.setState(dateStr);
- this.editor.setValue(dateStr);
- this.setTitle(dateStr);
- }
- break;
- }
- },
-
- getKey: function () {
- return this.editor.getValue();
- },
- getValue: function () {
- return this.store_value;
- }
-
-});
-
-BI.DateTrigger.MULTI_DATE_YEAR_PREV = 1;
-BI.DateTrigger.MULTI_DATE_YEAR_AFTER = 2;
-BI.DateTrigger.MULTI_DATE_YEAR_BEGIN = 3;
-BI.DateTrigger.MULTI_DATE_YEAR_END = 4;
-
-BI.DateTrigger.MULTI_DATE_MONTH_PREV = 5;
-BI.DateTrigger.MULTI_DATE_MONTH_AFTER = 6;
-BI.DateTrigger.MULTI_DATE_MONTH_BEGIN = 7;
-BI.DateTrigger.MULTI_DATE_MONTH_END = 8;
-
-BI.DateTrigger.MULTI_DATE_QUARTER_PREV = 9;
-BI.DateTrigger.MULTI_DATE_QUARTER_AFTER = 10;
-BI.DateTrigger.MULTI_DATE_QUARTER_BEGIN = 11;
-BI.DateTrigger.MULTI_DATE_QUARTER_END = 12;
-
-BI.DateTrigger.MULTI_DATE_WEEK_PREV = 13;
-BI.DateTrigger.MULTI_DATE_WEEK_AFTER = 14;
-
-BI.DateTrigger.MULTI_DATE_DAY_PREV = 15;
-BI.DateTrigger.MULTI_DATE_DAY_AFTER = 16;
-BI.DateTrigger.MULTI_DATE_DAY_TODAY = 17;
-
-BI.DateTrigger.MULTI_DATE_PARAM = 18;
-BI.DateTrigger.MULTI_DATE_CALENDAR = 19;
-
-BI.DateTrigger.MULTI_DATE_SEGMENT_NUM = {};
-BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_YEAR_PREV] = BI.i18nText("BI-Multi_Date_Year_Prev");
-BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_YEAR_AFTER] = BI.i18nText("BI-Multi_Date_Year_Next");
-BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_YEAR_BEGIN] = BI.i18nText("BI-Multi_Date_Year_Begin");
-BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_YEAR_END] = BI.i18nText("BI-Multi_Date_Year_End");
-
-BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_QUARTER_PREV] = BI.i18nText("BI-Multi_Date_Quarter_Prev");
-BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_QUARTER_AFTER] = BI.i18nText("BI-Multi_Date_Quarter_Next");
-BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_QUARTER_BEGIN] = BI.i18nText("BI-Multi_Date_Quarter_Begin");
-BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_QUARTER_END] = BI.i18nText("BI-Multi_Date_Quarter_End");
-
-BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_MONTH_PREV] = BI.i18nText("BI-Multi_Date_Month_Prev");
-BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_MONTH_AFTER] = BI.i18nText("BI-Multi_Date_Month_Next");
-BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_MONTH_BEGIN] = BI.i18nText("BI-Multi_Date_Month_Begin");
-BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_MONTH_END] = BI.i18nText("BI-Multi_Date_Month_End");
-
-BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_WEEK_PREV] = BI.i18nText("BI-Multi_Date_Week_Prev");
-BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_WEEK_AFTER] = BI.i18nText("BI-Multi_Date_Week_Next");
-
-BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_DAY_PREV] = BI.i18nText("BI-Multi_Date_Day_Prev");
-BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_DAY_AFTER] = BI.i18nText("BI-Multi_Date_Day_Next");
-BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_DAY_TODAY] = BI.i18nText("BI-Multi_Date_Today");
-
-BI.DateTrigger.EVENT_FOCUS = "EVENT_FOCUS";
-BI.DateTrigger.EVENT_START = "EVENT_START";
-BI.DateTrigger.EVENT_STOP = "EVENT_STOP";
-BI.DateTrigger.EVENT_CONFIRM = "EVENT_CONFIRM";
-BI.DateTrigger.EVENT_CHANGE = "EVENT_CHANGE";
-BI.DateTrigger.EVENT_VALID = "EVENT_VALID";
-BI.DateTrigger.EVENT_ERROR = "EVENT_ERROR";
-BI.DateTrigger.EVENT_TRIGGER_CLICK = "EVENT_TRIGGER_CLICK";
-BI.DateTrigger.EVENT_KEY_DOWN = "EVENT_KEY_DOWN";
-BI.shortcut("bi.date_trigger", BI.DateTrigger);/**
- * Created by zcf on 2017/2/20.
- */
-BI.DatePaneWidget = BI.inherit(BI.Widget, {
- _defaultConfig: function () {
- var conf = BI.DatePaneWidget.superclass._defaultConfig.apply(this, arguments);
- return BI.extend(conf, {
- baseCls: "bi-date-pane",
- min: '1900-01-01', //最小日期
- max: '2099-12-31', //最大日期
- selectedTime: null
- })
- },
- _init: function () {
- BI.DatePaneWidget.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
-
- this.today = Date.getDate();
- this._year = this.today.getFullYear();
- this._month = this.today.getMonth();
-
- this.selectedTime = o.selectedTime || {
- year: this._year,
- month: this._month
- };
-
- this.datePicker = BI.createWidget({
- type: "bi.date_picker",
- min: o.min,
- max: o.max
- });
- this.datePicker.on(BI.DatePicker.EVENT_CHANGE, function () {
- self.selectedTime = self.datePicker.getValue();
- // self.selectedTime.day = 1;
- self.calendar.setSelect(BI.Calendar.getPageByDateJSON(self.selectedTime));
- });
-
- this.calendar = BI.createWidget({
- direction: "top",
- element: this,
- logic: {
- dynamic: false
- },
- type: "bi.navigation",
- tab: this.datePicker,
- cardCreator: BI.bind(this._createNav, this)
-
- // afterCardCreated: function () {
- //
- // },
- //
- // afterCardShow: function () {
- // // this.setValue(self.selectedTime);
- // }
- });
- this.calendar.on(BI.Navigation.EVENT_CHANGE, function () {
- self.selectedTime = self.calendar.getValue();
- self.calendar.empty();
- self.setValue(self.selectedTime);
- self.fireEvent(BI.DateCalendarPopup.EVENT_CHANGE);
- });
-
- },
-
- _createNav: function (v) {
- var date = BI.Calendar.getDateJSONByPage(v);
- var calendar = BI.createWidget({
- type: "bi.calendar",
- logic: {
- dynamic: false
- },
- min: this.options.min,
- max: this.options.max,
- year: date.year,
- month: date.month,
- day: this.selectedTime.day
- });
- return calendar;
- },
-
- _getNewCurrentDate: function () {
- var today = Date.getDate();
- return {
- year: today.getFullYear(),
- month: today.getMonth()
- }
- },
-
- _setCalenderValue: function (date) {
- this.calendar.setSelect(BI.Calendar.getPageByDateJSON(date));
- this.calendar.setValue(date);
- this.selectedTime = date;
- },
-
- _setDatePicker: function (timeOb) {
- if (BI.isNull(timeOb) || BI.isNull(timeOb.year) || BI.isNull(timeOb.month)) {
- this.datePicker.setValue(this._getNewCurrentDate());
- } else {
- this.datePicker.setValue(timeOb);
- }
- },
-
- _setCalendar: function (timeOb) {
- if (BI.isNull(timeOb) || BI.isNull(timeOb.day)) {
- this.calendar.empty();
- this._setCalenderValue(this._getNewCurrentDate());
- } else {
- this._setCalenderValue(timeOb)
- }
- },
-
- setValue: function (timeOb) {
- this._setDatePicker(timeOb);
- this._setCalendar(timeOb);
- },
-
- getValue: function () {
- return this.selectedTime;
- }
-
-});
-BI.shortcut("bi.date_pane", BI.DatePaneWidget);/**
- * Created by Urthur on 2017/7/14.
- */
-BI.DateTimeCombo = BI.inherit(BI.Single, {
- constants: {
- popupHeight: 290,
- popupWidth: 270,
- comboAdjustHeight: 1,
- border: 1,
- DATE_MIN_VALUE: "1900-01-01",
- DATE_MAX_VALUE: "2099-12-31"
- },
- _defaultConfig: function () {
- return BI.extend(BI.DateTimeCombo.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-date-time-combo bi-border',
- width: 200,
- height: 24
- });
- },
- _init: function () {
- BI.DateTimeCombo.superclass._init.apply(this, arguments);
- var self = this, opts = this.options;
- var date = Date.getDate();
- this.storeValue = {
- year: date.getFullYear(),
- month: date.getMonth(),
- day: date.getDate(),
- hour: date.getHours(),
- minute: date.getMinutes(),
- second: date.getSeconds()
- };
- this.trigger = BI.createWidget({
- type: 'bi.date_time_trigger',
- min: this.constants.DATE_MIN_VALUE,
- max: this.constants.DATE_MAX_VALUE
- });
-
- this.popup = BI.createWidget({
- type: "bi.date_time_popup",
- min: this.constants.DATE_MIN_VALUE,
- max: this.constants.DATE_MAX_VALUE
- });
- self.setValue(this.storeValue);
-
- this.popup.on(BI.DateTimePopup.BUTTON_CANCEL_EVENT_CHANGE, function () {
- self.setValue(self.storeValue);
- self.hidePopupView();
- self.fireEvent(BI.DateTimeCombo.EVENT_CANCEL);
- });
- this.popup.on(BI.DateTimePopup.BUTTON_OK_EVENT_CHANGE, function () {
- self.storeValue = self.popup.getValue();
- self.setValue(self.storeValue);
- self.hidePopupView();
- self.fireEvent(BI.DateTimeCombo.EVENT_CONFIRM);
- });
- this.popup.on(BI.DateTimePopup.CALENDAR_EVENT_CHANGE, function () {
- self.trigger.setValue(self.popup.getValue());
- self.fireEvent(BI.DateTimeCombo.EVENT_CHANGE);
- });
- this.combo = BI.createWidget({
- type: 'bi.combo',
- toggle: false,
- isNeedAdjustHeight: false,
- isNeedAdjustWidth: false,
- el: this.trigger,
- adjustLength: this.constants.comboAdjustHeight,
- popup: {
- el: this.popup,
- maxHeight: this.constants.popupHeight,
- width: this.constants.popupWidth,
- stopPropagation: false
- }
- });
- this.combo.on(BI.Combo.EVENT_BEFORE_POPUPVIEW, function () {
- self.popup.setValue(self.storeValue);
- self.fireEvent(BI.DateTimeCombo.EVENT_BEFORE_POPUPVIEW);
- });
-
- var triggerBtn = BI.createWidget({
- type: "bi.icon_button",
- cls: "bi-trigger-icon-button date-font bi-border-right",
- width: 24,
- height: 24
- });
- triggerBtn.on(BI.TriggerIconButton.EVENT_CHANGE, function () {
- if (self.combo.isViewVisible()) {
- self.combo.hideView();
- } else {
- self.combo.showView();
- }
- });
-
- BI.createWidget({
- type: "bi.htape",
- element: this,
- items: [{
- type: "bi.absolute",
- items: [{
- el: this.combo,
- top: 0,
- left: 0,
- right: 0,
- bottom: 0
- }, {
- el: triggerBtn,
- top: 0,
- left: 0
- }]
- }]
- })
- },
-
- setValue: function (v) {
- this.storeValue = v;
- this.popup.setValue(v);
- this.trigger.setValue(v);
- },
- getValue: function () {
- return this.storeValue;
- },
-
- hidePopupView: function () {
- this.combo.hideView();
- }
-});
-
-BI.DateTimeCombo.EVENT_CANCEL = "EVENT_CANCEL";
-BI.DateTimeCombo.EVENT_CONFIRM = "EVENT_CONFIRM";
-BI.DateTimeCombo.EVENT_CHANGE = "EVENT_CHANGE";
-BI.DateTimeCombo.EVENT_BEFORE_POPUPVIEW = "BI.DateTimeCombo.EVENT_BEFORE_POPUPVIEW";
-BI.shortcut('bi.date_time_combo', BI.DateTimeCombo);
-/**
- * Created by Urthur on 2017/7/14.
- */
-BI.DateTimePopup = BI.inherit(BI.Widget, {
- _defaultConfig: function () {
- return BI.extend(BI.DateTimePopup.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-date-time-popup',
- width: 268,
- height: 290
- });
- },
- _init: function () {
- BI.DateTimePopup.superclass._init.apply(this, arguments);
- var self = this, opts = this.options;
- this.cancelButton = BI.createWidget({
- type: 'bi.text_button',
- forceCenter: true,
- cls: 'multidate-popup-button bi-border-top bi-border-right',
- shadow: true,
- text: BI.i18nText("BI-Basic_Cancel")
- });
- this.cancelButton.on(BI.TextButton.EVENT_CHANGE, function () {
- self.fireEvent(BI.DateTimePopup.BUTTON_CANCEL_EVENT_CHANGE);
- });
-
- this.okButton = BI.createWidget({
- type: "bi.text_button",
- forceCenter: true,
- cls: 'multidate-popup-button bi-border-top',
- shadow: true,
- text: BI.i18nText("BI-Basic_OK")
- });
- this.okButton.on(BI.TextButton.EVENT_CHANGE, function () {
- self.fireEvent(BI.DateTimePopup.BUTTON_OK_EVENT_CHANGE);
- });
-
- this.dateCombo = BI.createWidget({
- type: "bi.date_calendar_popup",
- min: self.options.min,
- max: self.options.max
- });
- self.dateCombo.on(BI.DateCalendarPopup.EVENT_CHANGE, function () {
- self.fireEvent(BI.DateTimePopup.CALENDAR_EVENT_CHANGE);
- });
-
- this.dateSelect = BI.createWidget({
- type: "bi.vertical_adapt",
- cls: "bi-border-top",
- items: [{
- type: "bi.label",
- text: BI.i18nText("BI-Basic_Time"),
- width: 45
- }, {
- type: "bi.date_time_select",
- max: 23,
- min: 0,
- width: 60,
- height: 30,
- listeners: [{
- eventName: BI.DateTimeSelect.EVENT_CONFIRM,
- action: function () {
- self.fireEvent(BI.DateTimePopup.CALENDAR_EVENT_CHANGE);
- }
- }],
- ref: function (_ref) {
- self.hour = _ref;
- }
- }, {
- type: "bi.label",
- text: ":",
- width: 15
- }, {
- type: "bi.date_time_select",
- max: 59,
- min: 0,
- width: 60,
- height: 30,
- listeners: [{
- eventName: BI.DateTimeSelect.EVENT_CONFIRM,
- action: function () {
- self.fireEvent(BI.DateTimePopup.CALENDAR_EVENT_CHANGE);
- }
- }],
- ref: function (_ref) {
- self.minute = _ref;
- }
- }, {
- type: "bi.label",
- text: ":",
- width: 15
- }, {
- type: "bi.date_time_select",
- max: 59,
- min: 0,
- width: 60,
- height: 30,
- listeners: [{
- eventName: BI.DateTimeSelect.EVENT_CONFIRM,
- action: function () {
- self.fireEvent(BI.DateTimePopup.CALENDAR_EVENT_CHANGE);
- }
- }],
- ref: function (_ref) {
- self.second = _ref;
- }
- }]
- });
-
- var date = Date.getDate();
- this.dateCombo.setValue({
- year: date.getFullYear(),
- month: date.getMonth(),
- day: date.getDate()
- });
- this.hour.setValue(date.getHours());
- this.minute.setValue(date.getMinutes());
- this.second.setValue(date.getSeconds());
-
- this.dateButton = BI.createWidget({
- type: "bi.grid",
- items: [[this.cancelButton, this.okButton]]
- });
- BI.createWidget({
- element: this,
- type: "bi.vtape",
- items: [{
- el: this.dateCombo
- }, {
- el: this.dateSelect,
- height: 50
- }, {
- el: this.dateButton,
- height: 30
- }]
- });
- },
-
- setValue: function (v) {
- var value = v, date;
- if (BI.isNull(value)) {
- date = Date.getDate();
- this.dateCombo.setValue({
- year: date.getFullYear(),
- month: date.getMonth(),
- day: date.getDate()
- });
- this.hour.setValue(date.getHours());
- this.minute.setValue(date.getMinutes());
- this.second.setValue(date.getSeconds());
- } else {
- this.dateCombo.setValue({
- year: value.year,
- month: value.month,
- day: value.day
- });
- this.hour.setValue(value.hour);
- this.minute.setValue(value.minute);
- this.second.setValue(value.second);
- }
- },
-
- getValue: function () {
- return {
- year: this.dateCombo.getValue().year,
- month: this.dateCombo.getValue().month,
- day: this.dateCombo.getValue().day,
- hour: this.hour.getValue(),
- minute: this.minute.getValue(),
- second: this.second.getValue()
- }
- }
-});
-BI.DateTimePopup.BUTTON_OK_EVENT_CHANGE = "BUTTON_OK_EVENT_CHANGE";
-BI.DateTimePopup.BUTTON_CANCEL_EVENT_CHANGE = "BUTTON_CANCEL_EVENT_CHANGE";
-BI.DateTimePopup.CALENDAR_EVENT_CHANGE = "CALENDAR_EVENT_CHANGE";
-BI.shortcut('bi.date_time_popup', BI.DateTimePopup);
-/**
- * Created by Urthur on 2017/7/14.
- */
-BI.DateTimeSelect = BI.inherit(BI.Widget, {
- _defaultConfig: function () {
- return BI.extend(BI.DateTimeSelect.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-date-time-select bi-border",
- max: 23,
- min: 0
- })
- },
-
- _init: function () {
- BI.DateTimeSelect.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.editor = BI.createWidget({
- type: "bi.sign_editor",
- value: this._alertInEditorValue(o.min),
- allowBlank: false,
- errorText: BI.i18nText("BI-Please_Input_Natural_Number"),
- validationChecker: function(v){
- return BI.isNaturalNumber(v);
- }
- });
- this.editor.on(BI.TextEditor.EVENT_CONFIRM, function(){
- self._finetuning(0);
- self.fireEvent(BI.DateTimeSelect.EVENT_CONFIRM);
- });
- this.topBtn = BI.createWidget({
- type: "bi.icon_button",
- cls: "column-pre-page-h-font top-button bi-border-left bi-border-bottom"
- });
- this.topBtn.on(BI.IconButton.EVENT_CHANGE, function(){
- self._finetuning(1);
- self.fireEvent(BI.DateTimeSelect.EVENT_CONFIRM);
- });
- this.bottomBtn = BI.createWidget({
- type: "bi.icon_button",
- cls: "column-next-page-h-font bottom-button bi-border-left"
- });
- this.bottomBtn.on(BI.IconButton.EVENT_CHANGE, function(){
- self._finetuning(-1);
- self.fireEvent(BI.DateTimeSelect.EVENT_CONFIRM);
- });
- this._finetuning(0);
- BI.createWidget({
- type: "bi.htape",
- element: this,
- items: [this.editor, {
- el: {
- type: "bi.grid",
- columns: 1,
- rows: 2,
- items: [{
- column: 0,
- row: 0,
- el: this.topBtn
- }, {
- column: 0,
- row: 1,
- el: this.bottomBtn
- }]
- },
- width: 30
- }]
- });
- },
-
- _alertOutEditorValue: function(v){
- if (v > this.options.max){
- v = this.options.min;
- }
- if (v < this.options.min){
- v = this.options.max
- }
- return BI.parseInt(v);
- },
-
- _alertInEditorValue: function(v){
- if (v > this.options.max){
- v = this.options.min;
- }
- if (v < this.options.min){
- v = this.options.max;
- }
- v = v < 10 ? "0" + v : v;
- return v;
- },
-
- _finetuning: function(add){
- var v = BI.parseInt(this._alertOutEditorValue(this.editor.getValue()));
- this.editor.setValue(this._alertInEditorValue(v + add));
- },
-
- getValue: function () {
- var v = this.editor.getValue();
- return this._alertOutEditorValue(v);
- },
-
- setValue: function (v) {
- this.editor.setValue(this._alertInEditorValue(v));
- this._finetuning(0);
- }
-
-});
-BI.DateTimeSelect.EVENT_CONFIRM = "EVENT_CONFIRM";
-BI.shortcut("bi.date_time_select", BI.DateTimeSelect);/**
- * Created by Urthur on 2017/7/14.
- */
-BI.DateTimeTrigger = BI.inherit(BI.Trigger, {
- _const: {
- hgap: 4
- },
-
- _defaultConfig: function () {
- return BI.extend(BI.DateTimeTrigger.superclass._defaultConfig.apply(this, arguments), {
- extraCls: "bi-date-time-trigger",
- min: '1900-01-01', //最小日期
- max: '2099-12-31', //最大日期
- height: 24,
- width: 200
- });
- },
- _init: function () {
- BI.DateTimeTrigger.superclass._init.apply(this, arguments);
- var self = this, o = this.options, c = this._const;
- this.text = BI.createWidget({
- type: "bi.label",
- textAlign: "left",
- height: o.height,
- width: o.width,
- hgap: c.hgap
- });
-
- BI.createWidget({
- type: "bi.htape",
- element: this,
- items: [{
- el: BI.createWidget(),
- width: o.height
- }, {
- el: this.text
- }]
- })
- },
-
- _printTime: function (v) {
- return v < 10 ? "0" + v : v;
- },
-
- setValue: function (v) {
- var self = this;
- var value = v, dateStr;
- if(BI.isNull(value)){
- value = Date.getDate();
- dateStr = value.print("%Y-%X-%d %H:%M:%S");
- } else {
- var date = Date.getDate(value.year,value.month,value.day,value.hour,value.minute,value.second);
- dateStr = date.print("%Y-%X-%d %H:%M:%S");
-
- }
- this.text.setText(dateStr);
- this.text.setTitle(dateStr);
- }
-
-});
-BI.shortcut("bi.date_time_trigger", BI.DateTimeTrigger);/**
- * 带有方向的pathchooser
- *
- * Created by GUY on 2016/4/21.
- * @class BI.DirectionPathChooser
- * @extends BI.Widget
- */
-BI.DirectionPathChooser = BI.inherit(BI.Widget, {
-
- _const: {
- lineColor: "#808080",
- selectLineColor: "#009de3"
- },
-
- _defaultConfig: function () {
- return BI.extend(BI.DirectionPathChooser.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-excel-table",
- items: []
- });
- },
-
- _init: function () {
- BI.DirectionPathChooser.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.pathChooser = BI.createWidget({
- type: "bi.path_chooser",
- element: this,
- items: o.items
- });
- this.pathChooser.on(BI.PathChooser.EVENT_CHANGE, function (start, index) {
- //self._unselectAllArrows();
- self._setValue(start, index);
- self.fireEvent(BI.DirectionPathChooser.EVENT_CHANGE);
- });
- this._drawArrows();
-
- },
-
- _unselectAllArrows: function () {
- var self = this, lineColor = this._const.lineColor;
- BI.each(this.arrows, function (region, rs) {
- BI.each(rs, function (idx, arrows) {
- BI.each(arrows, function (i, arrow) {
- arrow.attr({fill: lineColor, stroke: lineColor});
- });
- });
- });
- },
-
- _drawOneArrow: function (dot, direction) {
- //0,1,2,3 上右下左
- var lineColor = this._const.lineColor;
- var selectLineColor = this._const.selectLineColor;
- var svg = this.pathChooser.svg;
- var path = "";
- switch (direction) {
- case 0:
- path = "M" + dot.x + "," + dot.y
- + "L" + (dot.x - 3) + "," + (dot.y + 5)
- + "L" + (dot.x + 3) + "," + (dot.y + 5)
- + "L" + dot.x + "," + dot.y;
- break;
- case 1:
- path = "M" + dot.x + "," + dot.y
- + "L" + (dot.x - 5) + "," + (dot.y - 3)
- + "L" + (dot.x - 5) + "," + (dot.y + 3)
- + "L" + dot.x + "," + dot.y;
- break;
- case 2:
- path = "M" + dot.x + "," + dot.y
- + "L" + (dot.x - 3) + "," + (dot.y - 5)
- + "L" + (dot.x + 3) + "," + (dot.y - 5)
- + "L" + dot.x + "," + dot.y;
- break;
- case 3:
- path = "M" + dot.x + "," + dot.y
- + "L" + (dot.x + 5) + "," + (dot.y - 3)
- + "L" + (dot.x + 5) + "," + (dot.y + 3)
- + "L" + dot.x + "," + dot.y;
- break;
- }
- return svg.path(path).attr({fill: lineColor, stroke: lineColor});
- },
-
- _drawArrows: function () {
- var self = this, o = this.options;
- var routes = this.pathChooser.routes;
- var pathes = this.pathChooser.pathes;
- var cache = this.pathChooser.cache;
- this.arrows = {};
- BI.each(routes, function (region, ps) {
- self.arrows[region] = [];
- BI.each(ps, function (idx, path) {
- self.arrows[region][idx] = [];
- var dots = pathes[region][idx];
- BI.each(dots, function (i, dot) {
- if (i > 0 && i < dots.length - 1) {
- var arrow;
- if (dot.y === dots[i - 1].y) {
- if (dots[i + 1].y != dot.y) {
- if (cache[path[path.length - 2]].direction === -1) {
- if (i - 1 > 0) {
- arrow = self._drawOneArrow(dots[i - 1], 3);
- }
- } else {
- arrow = self._drawOneArrow(dots[i], 1);
- }
- }
- } else if (dot.x === dots[i - 1].x) {
- if (dot.y > dots[i - 1].y) {
- if (cache[BI.first(path)].direction === -1) {
- arrow = self._drawOneArrow(dots[i - 1], 0);
- } else {
- arrow = self._drawOneArrow(dot, 2);
- }
- } else {
- if (cache[path[path.length - 2]].direction === -1) {
- arrow = self._drawOneArrow(dots[i - 1], 2);
- } else {
- arrow = self._drawOneArrow(dot, 0);
- }
- }
- }
- if (arrow) {
- self.arrows[region][idx].push(arrow);
- }
- }
- });
- BI.each(path, function (i, node) {
- if (i !== 0) {
- var arrow;
- var from = path[i - 1];
- if (cache[from].direction === -1) {
- var regionIndex = self.pathChooser.getRegionIndexById(from);
- var x = getXoffsetByRegionIndex(regionIndex, -1);
- var y = getYByXoffset(dots, x);
- arrow = self._drawOneArrow({x: x, y: y}, 3);
- } else {
- var regionIndex = self.pathChooser.getRegionIndexById(node);
- var x = getXoffsetByRegionIndex(regionIndex);
- var y = getYByXoffset(dots, x);
- arrow = self._drawOneArrow({x: x, y: y}, 1);
- }
- if (arrow) {
- self.arrows[region][idx].push(arrow);
- }
- }
- });
- })
- });
-
- function getXoffsetByRegionIndex(regionIndex, diregion) {
- if (diregion === -1) {
- return 100 * (regionIndex + 1) - 20;
- }
- return 100 * regionIndex + 20;
- }
-
- function getYByXoffset(dots, xoffset) {
- var finded = BI.find(dots, function (i, dot) {
- if (i > 0) {
- if (dots[i - 1].x < xoffset && dots[i].x > xoffset) {
- return true;
- }
- }
- });
- return finded.y;
- }
- },
-
- _setValue: function (start, index) {
- var self = this;
- var lineColor = this._const.lineColor;
- var selectLineColor = this._const.selectLineColor;
- var routes = this.pathChooser.routes;
- var starts = this.pathChooser.start;
- var each = [start];
- if (starts.contains(start)) {
- each = starts;
- }
- BI.each(each, function (i, s) {
- BI.each(self.arrows[s], function (j, arrows) {
- BI.each(arrows, function (k, arrow) {
- arrow.attr({fill: lineColor, stroke: lineColor}).toFront();
- });
- });
- });
- BI.each(this.arrows[start][index], function (i, arrow) {
- arrow.attr({fill: selectLineColor, stroke: selectLineColor}).toFront();
- });
- var current = BI.last(routes[start][index]);
- while (current && routes[current] && routes[current].length === 1) {
- BI.each(self.arrows[current][0], function (i, arrow) {
- arrow.attr({fill: selectLineColor, stroke: selectLineColor}).toFront();
- });
- current = BI.last(routes[current][0]);
- }
- },
-
- setValue: function (v) {
- this.pathChooser.setValue(v);
- this._unselectAllArrows();
- var routes = this.pathChooser.routes;
- var nodes = BI.keys(routes), self = this;
- var result = [], array = [];
- BI.each(v, function (i, val) {
- if (BI.contains(nodes, val)) {
- if (array.length > 0) {
- array.push(val);
- result.push(array);
- array = [];
- }
- }
- array.push(val);
- });
- if (array.length > 0) {
- result.push(array);
- }
- //画这n条路径
- BI.each(result, function (idx, path) {
- var start = path[0];
- var index = BI.findIndex(routes[start], function (idx, p) {
- if (BI.isEqual(path, p)) {
- return true;
- }
- });
- if (index >= 0) {
- self._setValue(start, index);
- }
- });
- },
-
- getValue: function () {
- return this.pathChooser.getValue();
- },
-
- populate: function (items) {
- this.pathChooser.populate(items);
- this._drawArrows();
- }
-});
-BI.DirectionPathChooser.EVENT_CHANGE = "DirectionPathChooser.EVENT_CHANGE";
-BI.shortcut('bi.direction_path_chooser', BI.DirectionPathChooser);/**
- * Created by roy on 15/8/14.
- */
-BI.DownListCombo = BI.inherit(BI.Widget, {
- _defaultConfig: function () {
- return BI.extend(BI.DownListCombo.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-down-list-combo",
- invalid: false,
- height: 25,
- items: [],
- adjustLength: 0,
- direction: "bottom",
- trigger: "click",
- container: null,
- el: {}
- })
- },
-
- _init: function () {
- BI.DownListCombo.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.popupview = BI.createWidget({
- type: "bi.down_list_popup",
- items: o.items,
- chooseType: o.chooseType
- });
-
- this.popupview.on(BI.DownListPopup.EVENT_CHANGE, function (value) {
- self.fireEvent(BI.DownListCombo.EVENT_CHANGE, value);
- self.downlistcombo.hideView();
- });
-
- this.popupview.on(BI.DownListPopup.EVENT_SON_VALUE_CHANGE, function (value, fatherValue) {
- self.fireEvent(BI.DownListCombo.EVENT_SON_VALUE_CHANGE, value, fatherValue);
- self.downlistcombo.hideView();
- });
-
-
- this.downlistcombo = BI.createWidget({
- element: this,
- type: 'bi.combo',
- trigger: o.trigger,
- isNeedAdjustWidth: false,
- container: o.container,
- adjustLength: o.adjustLength,
- direction: o.direction,
- el: BI.createWidget(o.el, {
- type: "bi.icon_trigger",
- extraCls: o.iconCls ? o.iconCls : "pull-down-font",
- width: o.width,
- height: o.height
- }),
- popup: {
- el: this.popupview,
- stopPropagation: true,
- maxHeight: 1000
- }
- });
-
- this.downlistcombo.on(BI.Combo.EVENT_BEFORE_POPUPVIEW, function () {
- self.fireEvent(BI.DownListCombo.EVENT_BEFORE_POPUPVIEW);
- });
- },
-
- hideView: function () {
- this.downlistcombo.hideView();
- },
-
- showView: function () {
- this.downlistcombo.showView();
- },
-
- populate: function (items) {
- this.popupview.populate(items);
- },
-
- setValue: function (v) {
- this.popupview.setValue(v);
- },
- getValue: function () {
- return this.popupview.getValue()
- }
-});
-BI.DownListCombo.EVENT_CHANGE = "EVENT_CHANGE";
-BI.DownListCombo.EVENT_SON_VALUE_CHANGE = "EVENT_SON_VALUE_CHANGE";
-BI.DownListCombo.EVENT_BEFORE_POPUPVIEW = "EVENT_BEFORE_POPUPVIEW";
-
-BI.shortcut("bi.down_list_combo", BI.DownListCombo);/**
- * Created by roy on 15/9/6.
- */
-BI.DownListGroup = BI.inherit(BI.Widget, {
- constants: {
- iconCls: "check-mark-ha-font"
- },
- _defaultConfig: function () {
- return BI.extend(BI.DownListGroup.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-down-list-group",
- items: [
- {
- el: {}
- }
- ]
- })
- },
- _init: function () {
- BI.DownListGroup.superclass._init.apply(this, arguments);
- var o = this.options, self = this;
-
- this.downlistgroup = BI.createWidget({
- element: this,
- type: "bi.button_tree",
- items: o.items,
- chooseType: 0,//0单选,1多选
- layouts: [{
- type: "bi.vertical",
- hgap: 0,
- vgap: 0
- }]
- });
- this.downlistgroup.on(BI.Controller.EVENT_CHANGE, function (type) {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- if(type === BI.Events.CLICK) {
- self.fireEvent(BI.DownListGroup.EVENT_CHANGE, arguments);
- }
- })
- },
- getValue:function(){
- return this.downlistgroup.getValue();
- },
- setValue:function(v){
- this.downlistgroup.setValue(v);
- }
-
-
-})
-BI.DownListGroup.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut("bi.down_list_group", BI.DownListGroup);BI.DownListItem = BI.inherit(BI.Single, {
- _defaultConfig: function () {
- var conf = BI.DownListItem.superclass._defaultConfig.apply(this, arguments);
- return BI.extend(conf, {
- baseCls: "bi-down-list-item bi-list-item-active",
- cls: "",
- height: 25,
- logic: {
- dynamic: true
- },
- selected: false,
- iconHeight: null,
- iconWidth: null,
- textHgap: 0,
- textVgap: 0,
- textLgap: 0,
- textRgap: 0
- })
- },
- _init: function () {
- BI.DownListItem.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.text = BI.createWidget({
- type: "bi.icon_text_item",
- element: this,
- height: o.height,
- text: o.text,
- value: o.value,
- logic: o.logic,
- selected: o.selected,
- disabled: o.disabled,
- iconHeight: o.iconHeight,
- iconWidth: o.iconWidth,
- textHgap: o.textHgap,
- textVgap: o.textVgap,
- textLgap: o.textLgap,
- textRgap: o.textRgap,
- father: o.father
- });
- this.text.on(BI.Controller.EVENT_CHANGE, function () {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
- this.text.on(BI.IconTextItem.EVENT_CHANGE, function () {
- self.fireEvent(BI.DownListItem.EVENT_CHANGE);
- });
- // this.setSelected(o.selected);
- },
-
- doRedMark: function () {
- this.text.doRedMark.apply(this.text, arguments);
- },
-
- unRedMark: function () {
- this.text.unRedMark.apply(this.text, arguments);
- },
-
- isSelected: function () {
- return this.text.isSelected();
- },
-
- setSelected: function (b) {
- this.text.setSelected(b);
- // if (b === true) {
- // this.element.addClass("dot-e-font");
- // } else {
- // this.element.removeClass("dot-e-font");
- // }
- },
-
- setValue: function (v) {
- this.text.setValue(v);
- },
-
- getValue: function () {
- return this.text.getValue();
- }
-});
-BI.DownListItem.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut("bi.down_list_item", BI.DownListItem);BI.DownListGroupItem = BI.inherit(BI.BasicButton, {
- _defaultConfig: function () {
- var conf = BI.DownListGroupItem.superclass._defaultConfig.apply(this, arguments);
- return BI.extend(conf, {
- baseCls: (conf.baseCls || "") + " bi-down-list-group-item",
- logic: {
- dynamic: false
- },
- // invalid: true,
- iconCls1: "dot-e-font",
- iconCls2: "pull-right-e-font"
- })
- },
- _init: function () {
- BI.DownListGroupItem.superclass._init.apply(this, arguments);
- var o = this.options;
- var self = this;
- this.text = BI.createWidget({
- type: "bi.label",
- cls: "list-group-item-text",
- textAlign: "left",
- text: o.text,
- value: o.value,
- height: o.height
- });
-
- this.icon1 = BI.createWidget({
- type: "bi.icon_button",
- cls: o.iconCls1,
- width: 25,
- forceNotSelected: true
- });
-
- this.icon2 = BI.createWidget({
- type: "bi.icon_button",
- cls: o.iconCls2,
- width: 25,
- forceNotSelected: true
- });
-
- var blank = BI.createWidget({
- type: "bi.layout",
- width: 25
- });
- BI.createWidget({
- type: "bi.absolute",
- element: this,
- items: [{
- el: this.icon2,
- top: 0,
- bottom: 0,
- right: 0
- }]
- });
-
- BI.createWidget(BI.extend({
- element: this
- }, BI.LogicFactory.createLogic("horizontal", BI.extend(o.logic, {
- items: BI.LogicFactory.createLogicItemsByDirection("left", this.icon1, this.text, blank)
- }))));
-
- this.element.hover(function () {
- if (self.isEnabled()) {
- self.hover();
- }
- }, function () {
- if (self.isEnabled()) {
- self.dishover()
- }
- });
- },
-
- hover: function () {
- BI.DownListGroupItem.superclass.hover.apply(this, arguments);
- this.icon1.element.addClass("hover");
- this.icon2.element.addClass("hover");
-
- },
-
- dishover: function () {
- BI.DownListGroupItem.superclass.dishover.apply(this, arguments);
- this.icon1.element.removeClass("hover");
- this.icon2.element.removeClass("hover");
- },
-
- doClick: function () {
- BI.DownListGroupItem.superclass.doClick.apply(this, arguments);
- if (this.isValid()) {
- this.fireEvent(BI.DownListGroupItem.EVENT_CHANGE, this.getValue());
- }
- },
-
- doRedMark: function () {
- this.text.doRedMark.apply(this.text, arguments);
- },
-
- unRedMark: function () {
- this.text.unRedMark.apply(this.text, arguments);
- },
-
- setValue: function (v) {
- var self = this, o = this.options;
- v = BI.isArray(v) ? v : [v];
- BI.find(v, function (idx, value) {
- if (BI.contains(o.childValues, value)) {
- self.icon1.setSelected(true);
- return true;
- } else {
- self.icon1.setSelected(false);
- }
- })
- }
-});
-BI.DownListGroupItem.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut("bi.down_list_group_item", BI.DownListGroupItem);/**
- * Created by roy on 15/9/8.
- * 处理popup中的item分组样式
- * 一个item分组中的成员大于一时,该分组设置为单选,并且默认状态第一个成员设置为已选择项
- */
-BI.DownListPopup = BI.inherit(BI.Pane, {
- constants: {
- nextIcon: "pull-right-e-font",
- height: 25,
- iconHeight: 12,
- iconWidth: 12,
- hgap: 0,
- vgap: 0,
- border: 1
- },
- _defaultConfig: function () {
- var conf = BI.DownListPopup.superclass._defaultConfig.apply(this, arguments);
- return BI.extend(conf, {
- baseCls: "bi-down-list-popup",
- items: [],
- chooseType: BI.Selection.Multi
- })
- },
- _init: function () {
- BI.DownListPopup.superclass._init.apply(this, arguments);
- this.singleValues = [];
- this.childValueMap = {};
- this.fatherValueMap = {};
- var self = this, o = this.options, children = this._createChildren(o.items);
- this.popup = BI.createWidget({
- type: "bi.button_tree",
- items: BI.createItems(children,
- {}, {
- adjustLength: -2
- }
- ),
- layouts: [{
- type: "bi.vertical",
- hgap: this.constants.hgap,
- vgap: this.constants.vgap
- }],
- chooseType: o.chooseType
- });
-
- this.popup.on(BI.ButtonTree.EVENT_CHANGE, function (value, object) {
- var changedValue = value;
- if (BI.isNotNull(self.childValueMap[value])) {
- changedValue = self.childValueMap[value];
- self.fireEvent(BI.DownListPopup.EVENT_SON_VALUE_CHANGE, changedValue, self.fatherValueMap[value])
- } else {
- self.fireEvent(BI.DownListPopup.EVENT_CHANGE, changedValue, object);
- }
-
-
- if (!self.singleValues.contains(changedValue)) {
- var item = self.getValue();
- var result = [];
- BI.each(item, function (i, valueObject) {
- if (valueObject.value != changedValue) {
- result.push(valueObject);
- }
- });
- self.setValue(result);
- }
-
- });
-
- BI.createWidget({
- type: "bi.vertical",
- element: this,
- items: [this.popup]
- });
-
- },
- _createChildren: function (items) {
- var self = this, result = [];
- BI.each(items, function (i, it) {
- var item_done = {
- type: "bi.down_list_group",
- items: []
- };
-
- BI.each(it, function (i, item) {
- if (BI.isNotEmptyArray(item.children) && !BI.isEmpty(item.el)) {
- item.type = "bi.combo_group";
- item.cls = "down-list-group";
- item.trigger = "hover";
- item.isNeedAdjustWidth = false;
- item.el.title = item.el.title || item.el.text;
- item.el.type = "bi.down_list_group_item";
- item.el.logic = {
- dynamic: true
- };
- item.el.height = self.constants.height;
- item.el.iconCls2 = self.constants.nextIcon;
- item.popup = {
- lgap: 4,
- el: {
- type: "bi.button_tree",
- chooseType: 0,
- layouts: [{
- type: "bi.vertical"
- }]
-
- }
- };
- item.el.childValues = [];
- BI.each(item.children, function (i, child) {
- var fatherValue = BI.deepClone(item.el.value);
- var childValue = BI.deepClone(child.value);
- self.singleValues.push(child.value);
- child.type = "bi.down_list_item";
- child.extraCls = " child-down-list-item";
- child.title = child.title || child.text;
- child.textRgap = 10;
- child.isNeedAdjustWidth = false;
- child.logic = {
- dynamic: true
- };
- child.father = fatherValue;
- self.fatherValueMap[self._createChildValue(fatherValue, childValue)] = fatherValue;
- self.childValueMap[self._createChildValue(fatherValue, childValue)] = childValue;
- child.value = self._createChildValue(fatherValue, childValue);
- item.el.childValues.push(child.value);
- })
- } else {
- item.type = "bi.down_list_item";
- item.title = item.title || item.text;
- item.textRgap = 10;
- item.isNeedAdjustWidth = false;
- item.logic = {
- dynamic: true
- }
- }
- var el_done = {};
- el_done.el = item;
- item_done.items.push(el_done);
- });
- if (self._isGroup(item_done.items)) {
- BI.each(item_done.items, function (i, item) {
- self.singleValues.push(item.el.value);
- })
- }
-
- result.push(item_done);
- if (self._needSpliter(i, items.length)) {
- var spliter_container = BI.createWidget({
- type: "bi.vertical",
- items: [{
- el: {
- type: "bi.layout",
- cls: "bi-down-list-spliter bi-border-top cursor-pointer",
- height: 0
- }
-
- }],
- cls: "bi-down-list-spliter-container cursor-pointer",
- lgap: 10,
- rgap: 10
- });
- result.push(spliter_container);
- }
- });
- return result;
- },
-
- _isGroup: function (i) {
- return i.length > 1;
- },
-
- _needSpliter: function (i, itemLength) {
- return i < itemLength - 1;
- },
-
- _createChildValue: function (fatherValue, childValue) {
- return fatherValue + "_" + childValue
- },
-
- populate: function (items) {
- BI.DownListPopup.superclass.populate.apply(this, arguments);
- var self = this;
- self.childValueMap = {};
- self.fatherValueMap = {};
- self.singleValues = [];
- var children = self._createChildren(items);
- var popupItem = BI.createItems(children,
- {}, {
- adjustLength: -2
- }
- );
- self.popup.populate(popupItem);
- },
-
- setValue: function (valueItem) {
- var self = this;
- var valueArray = [];
- BI.each(valueItem, function (i, item) {
- var value;
- if (BI.isNotNull(item.childValue)) {
- value = self._createChildValue(item.value, item.childValue);
- } else {
- value = item.value;
- }
- valueArray.push(value);
- }
- );
- this.popup.setValue(valueArray);
- },
-
- getValue: function () {
- var self = this, result = [];
- var values = this.popup.getValue();
- BI.each(values, function (i, value) {
- var valueItem = {};
- if (BI.isNotNull(self.childValueMap[value])) {
- var fartherValue = self.fatherValueMap[value];
- valueItem.childValue = self.childValueMap[value];
- valueItem.value = fartherValue;
- } else {
- valueItem.value = value;
- }
- result.push(valueItem);
- });
- return result;
- }
-
-
-});
-
-BI.DownListPopup.EVENT_CHANGE = "EVENT_CHANGE";
-BI.DownListPopup.EVENT_SON_VALUE_CHANGE = "EVENT_SON_VALUE_CHANGE";
-BI.shortcut("bi.down_list_popup", BI.DownListPopup);/**
- * Created by roy on 15/9/14.
- */
-BI.SearchEditor = BI.inherit(BI.Widget, {
- _defaultConfig: function () {
- var conf = BI.SearchEditor.superclass._defaultConfig.apply(this, arguments);
- return BI.extend(conf, {
- baseCls: "bi-search-editor bi-border",
- height: 24,
- errorText: "",
- watermark: BI.i18nText("BI-Basic_Search"),
- validationChecker: BI.emptyFn,
- quitChecker: BI.emptyFn
- });
- },
- _init: function () {
- this.options.height -= 2;
- BI.SearchEditor.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.editor = BI.createWidget({
- type: "bi.editor",
- height: o.height,
- watermark: o.watermark,
- allowBlank: true,
- errorText: o.errorText,
- validationChecker: o.validationChecker,
- quitChecker: o.quitChecker
- });
- this.clear = BI.createWidget({
- type: "bi.icon_button",
- stopEvent: true,
- cls: "search-close-h-font"
- });
- this.clear.on(BI.IconButton.EVENT_CHANGE, function () {
- self.setValue("");
- self.fireEvent(BI.Controller.EVENT_CHANGE, BI.Events.STOPEDIT);
- self.fireEvent(BI.SearchEditor.EVENT_CLEAR);
- });
- BI.createWidget({
- element: this,
- type: "bi.htape",
- items: [
- {
- el: {
- type: "bi.center_adapt",
- cls: "search-font",
- items: [{
- el: {
- type: "bi.icon"
- }
- }]
- },
- width: 25
- },
- {
- el: self.editor
- },
- {
- el: this.clear,
- width: 25
- }
- ]
- });
- this.editor.on(BI.Controller.EVENT_CHANGE, function () {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
-
- this.editor.on(BI.Editor.EVENT_FOCUS, function () {
- self.fireEvent(BI.SearchEditor.EVENT_FOCUS);
- });
- this.editor.on(BI.Editor.EVENT_BLUR, function () {
- self.fireEvent(BI.SearchEditor.EVENT_BLUR);
- });
- this.editor.on(BI.Editor.EVENT_CLICK, function () {
- self.fireEvent(BI.SearchEditor.EVENT_CLICK);
- });
- this.editor.on(BI.Editor.EVENT_CHANGE, function () {
- self._checkClear();
- self.fireEvent(BI.SearchEditor.EVENT_CHANGE);
- });
- this.editor.on(BI.Editor.EVENT_KEY_DOWN, function (v) {
- self.fireEvent(BI.SearchEditor.EVENT_KEY_DOWN, v);
- });
- this.editor.on(BI.Editor.EVENT_SPACE, function () {
- self.fireEvent(BI.SearchEditor.EVENT_SPACE)
- });
- this.editor.on(BI.Editor.EVENT_BACKSPACE, function () {
- self.fireEvent(BI.SearchEditor.EVENT_BACKSPACE)
- });
-
-
- this.editor.on(BI.Editor.EVENT_VALID, function () {
- self.fireEvent(BI.SearchEditor.EVENT_VALID)
- });
- this.editor.on(BI.Editor.EVENT_ERROR, function () {
- self.fireEvent(BI.SearchEditor.EVENT_ERROR)
- });
- this.editor.on(BI.Editor.EVENT_ENTER, function () {
- self.fireEvent(BI.SearchEditor.EVENT_ENTER);
- });
- this.editor.on(BI.Editor.EVENT_RESTRICT, function () {
- self.fireEvent(BI.SearchEditor.EVENT_RESTRICT)
- });
- this.editor.on(BI.Editor.EVENT_EMPTY, function () {
- self._checkClear();
- self.fireEvent(BI.SearchEditor.EVENT_EMPTY)
- });
- this.editor.on(BI.Editor.EVENT_REMOVE, function () {
- self.fireEvent(BI.SearchEditor.EVENT_REMOVE)
- });
- this.editor.on(BI.Editor.EVENT_CONFIRM, function () {
- self.fireEvent(BI.SearchEditor.EVENT_CONFIRM)
- });
- this.editor.on(BI.Editor.EVENT_START, function () {
- self.fireEvent(BI.SearchEditor.EVENT_START);
- });
- this.editor.on(BI.Editor.EVENT_PAUSE, function () {
- self.fireEvent(BI.SearchEditor.EVENT_PAUSE);
- });
- this.editor.on(BI.Editor.EVENT_STOP, function () {
- self.fireEvent(BI.SearchEditor.EVENT_STOP);
- });
-
- this.clear.invisible();
- },
-
- _checkClear: function () {
- if (!this.getValue()) {
- this.clear.invisible();
- } else {
- this.clear.visible();
- }
- },
-
- focus: function () {
- this.editor.focus();
- },
-
- blur: function () {
- this.editor.blur();
- },
-
- getValue: function () {
- if (this.isValid()) {
- var res = this.editor.getValue().match(/[\S]+/g);
- return BI.isNull(res) ? "" : res[res.length - 1];
- }
- },
-
- getLastValidValue: function () {
- return this.editor.getLastValidValue();
- },
-
- setValue: function (v) {
- this.editor.setValue(v);
- if (BI.isKey(v)) {
- this.clear.visible();
- }
- },
-
- isEditing: function () {
- return this.editor.isEditing();
- },
-
- isValid: function () {
- return this.editor.isValid();
- }
-});
-BI.SearchEditor.EVENT_CHANGE = "EVENT_CHANGE";
-BI.SearchEditor.EVENT_FOCUS = "EVENT_FOCUS";
-BI.SearchEditor.EVENT_BLUR = "EVENT_BLUR";
-BI.SearchEditor.EVENT_CLICK = "EVENT_CLICK";
-BI.SearchEditor.EVENT_KEY_DOWN = "EVENT_KEY_DOWN";
-BI.SearchEditor.EVENT_SPACE = "EVENT_SPACE";
-BI.SearchEditor.EVENT_BACKSPACE = "EVENT_BACKSPACE";
-BI.SearchEditor.EVENT_CLEAR = "EVENT_CLEAR";
-
-BI.SearchEditor.EVENT_START = "EVENT_START";
-BI.SearchEditor.EVENT_PAUSE = "EVENT_PAUSE";
-BI.SearchEditor.EVENT_STOP = "EVENT_STOP";
-BI.SearchEditor.EVENT_CONFIRM = "EVENT_CONFIRM";
-BI.SearchEditor.EVENT_VALID = "EVENT_VALID";
-BI.SearchEditor.EVENT_ERROR = "EVENT_ERROR";
-BI.SearchEditor.EVENT_ENTER = "EVENT_ENTER";
-BI.SearchEditor.EVENT_RESTRICT = "EVENT_RESTRICT";
-BI.SearchEditor.EVENT_REMOVE = "EVENT_REMOVE";
-BI.SearchEditor.EVENT_EMPTY = "EVENT_EMPTY";
-BI.shortcut("bi.search_editor", BI.SearchEditor);/**
- * 小号搜索框
- * Created by GUY on 2015/9/29.
- * @class BI.SmallSearchEditor
- * @extends BI.SearchEditor
- */
-BI.SmallSearchEditor = BI.inherit(BI.SearchEditor, {
- _defaultConfig: function () {
- var conf = BI.SmallSearchEditor.superclass._defaultConfig.apply(this, arguments);
- return BI.extend(conf, {
- baseCls: (conf.baseCls || "") + " bi-small-search-editor",
- height: 24
- });
- },
-
- _init: function () {
- BI.SmallSearchEditor.superclass._init.apply(this, arguments);
- }
-});
-BI.shortcut("bi.small_search_editor", BI.SmallSearchEditor);/**
- * guy
- * @class BI.TextEditor
- * @extends BI.Single
- */
-BI.TextEditor = BI.inherit(BI.Widget, {
- _defaultConfig: function () {
- var conf = BI.TextEditor.superclass._defaultConfig.apply(this, arguments);
- return BI.extend(conf, {
- extraCls: "bi-text-editor bi-border",
- hgap: 4,
- vgap: 2,
- lgap: 0,
- rgap: 0,
- tgap: 0,
- bgap: 0,
- validationChecker: BI.emptyFn,
- quitChecker: BI.emptyFn,
- allowBlank: false,
- watermark: "",
- errorText: "",
- height: 24
- })
- },
-
- _init: function () {
- BI.TextEditor.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- if (BI.isNumber(o.height)) {
- this.element.css({height: o.height - 2});
- }
- if (BI.isNumber(o.width)) {
- this.element.css({width: o.width - 2});
- }
- this.editor = BI.createWidget({
- type: "bi.editor",
- height: o.height - 2,
- hgap: o.hgap,
- vgap: o.vgap,
- lgap: o.lgap,
- rgap: o.rgap,
- tgap: o.tgap,
- bgap: o.bgap,
- value: o.value,
- title: o.title,
- tipType: o.tipType,
- validationChecker: o.validationChecker,
- quitChecker: o.quitChecker,
- allowBlank: o.allowBlank,
- watermark: o.watermark,
- errorText: o.errorText
- });
- this.editor.on(BI.Controller.EVENT_CHANGE, function () {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
-
- this.editor.on(BI.Editor.EVENT_FOCUS, function () {
- self.fireEvent(BI.TextEditor.EVENT_FOCUS);
- });
- this.editor.on(BI.Editor.EVENT_BLUR, function () {
- self.fireEvent(BI.TextEditor.EVENT_BLUR);
- });
- this.editor.on(BI.Editor.EVENT_CLICK, function () {
- self.fireEvent(BI.TextEditor.EVENT_CLICK);
- });
- this.editor.on(BI.Editor.EVENT_CHANGE, function () {
- self.fireEvent(BI.TextEditor.EVENT_CHANGE);
- });
- this.editor.on(BI.Editor.EVENT_KEY_DOWN, function (v) {
- self.fireEvent(BI.TextEditor.EVENT_KEY_DOWN);
- });
- this.editor.on(BI.Editor.EVENT_SPACE, function (v) {
- self.fireEvent(BI.TextEditor.EVENT_SPACE);
- });
- this.editor.on(BI.Editor.EVENT_BACKSPACE, function (v) {
- self.fireEvent(BI.TextEditor.EVENT_BACKSPACE);
- });
-
-
- this.editor.on(BI.Editor.EVENT_VALID, function () {
- self.fireEvent(BI.TextEditor.EVENT_VALID);
- });
- this.editor.on(BI.Editor.EVENT_CONFIRM, function () {
- self.fireEvent(BI.TextEditor.EVENT_CONFIRM);
- });
- this.editor.on(BI.Editor.EVENT_REMOVE, function (v) {
- self.fireEvent(BI.TextEditor.EVENT_REMOVE);
- });
- this.editor.on(BI.Editor.EVENT_START, function () {
- self.fireEvent(BI.TextEditor.EVENT_START);
- });
- this.editor.on(BI.Editor.EVENT_PAUSE, function () {
- self.fireEvent(BI.TextEditor.EVENT_PAUSE);
- });
- this.editor.on(BI.Editor.EVENT_STOP, function () {
- self.fireEvent(BI.TextEditor.EVENT_STOP);
- });
- this.editor.on(BI.Editor.EVENT_ERROR, function () {
- self.fireEvent(BI.TextEditor.EVENT_ERROR, arguments);
- });
- this.editor.on(BI.Editor.EVENT_ENTER, function () {
- self.fireEvent(BI.TextEditor.EVENT_ENTER);
- });
- this.editor.on(BI.Editor.EVENT_RESTRICT, function () {
- self.fireEvent(BI.TextEditor.EVENT_RESTRICT);
- });
- this.editor.on(BI.Editor.EVENT_EMPTY, function () {
- self.fireEvent(BI.TextEditor.EVENT_EMPTY);
- });
- BI.createWidget({
- type: "bi.vertical",
- scrolly: false,
- element: this,
- items: [this.editor]
- });
- },
-
- focus: function () {
- this.editor.focus();
- },
-
- blur: function () {
- this.editor.blur();
- },
-
- setErrorText: function (text) {
- this.editor.setErrorText(text);
- },
-
- getErrorText: function () {
- return this.editor.getErrorText();
- },
-
- isValid: function () {
- return this.editor.isValid();
- },
-
- setValue: function (v) {
- this.editor.setValue(v);
- },
-
- getValue: function () {
- return this.editor.getValue();
- }
-});
-BI.TextEditor.EVENT_CHANGE = "EVENT_CHANGE";
-BI.TextEditor.EVENT_FOCUS = "EVENT_FOCUS";
-BI.TextEditor.EVENT_BLUR = "EVENT_BLUR";
-BI.TextEditor.EVENT_CLICK = "EVENT_CLICK";
-BI.TextEditor.EVENT_KEY_DOWN = "EVENT_KEY_DOWN";
-BI.TextEditor.EVENT_SPACE = "EVENT_SPACE";
-BI.TextEditor.EVENT_BACKSPACE = "EVENT_BACKSPACE";
-
-BI.TextEditor.EVENT_START = "EVENT_START";
-BI.TextEditor.EVENT_PAUSE = "EVENT_PAUSE";
-BI.TextEditor.EVENT_STOP = "EVENT_STOP";
-BI.TextEditor.EVENT_CONFIRM = "EVENT_CONFIRM";
-BI.TextEditor.EVENT_VALID = "EVENT_VALID";
-BI.TextEditor.EVENT_ERROR = "EVENT_ERROR";
-BI.TextEditor.EVENT_ENTER = "EVENT_ENTER";
-BI.TextEditor.EVENT_RESTRICT = "EVENT_RESTRICT";
-BI.TextEditor.EVENT_REMOVE = "EVENT_REMOVE";
-BI.TextEditor.EVENT_EMPTY = "EVENT_EMPTY";
-
-BI.shortcut("bi.text_editor", BI.TextEditor);/**
- * 小号搜索框
- * Created by GUY on 2015/9/29.
- * @class BI.SmallTextEditor
- * @extends BI.SearchEditor
- */
-BI.SmallTextEditor = BI.inherit(BI.TextEditor, {
- _defaultConfig: function () {
- var conf = BI.SmallTextEditor.superclass._defaultConfig.apply(this, arguments);
- return BI.extend(conf, {
- baseCls: (conf.baseCls || "") + " bi-small-text-editor",
- height: 25
- });
- },
-
- _init: function () {
- BI.SmallTextEditor.superclass._init.apply(this, arguments);
- }
-});
-BI.shortcut("bi.small_text_editor", BI.SmallTextEditor);/**
- * 文件管理控件组
- *
- * Created by GUY on 2015/12/11.
- * @class BI.FileManagerButtonGroup
- * @extends BI.Widget
- */
-BI.FileManagerButtonGroup = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.FileManagerButtonGroup.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-file-manager-button_group",
- items: []
- })
- },
-
- _init: function () {
- BI.FileManagerButtonGroup.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.button_group = BI.createWidget({
- type: "bi.button_tree",
- element: this,
- chooseType: BI.Selection.Multi,
- items: this._formatItems(o.items),
- layouts: [{
- type: "bi.vertical"
- }]
- });
- this.button_group.on(BI.Controller.EVENT_CHANGE, function () {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
- },
-
- _formatItems: function (items) {
- var self = this, o = this.options;
- BI.each(items, function (i, item) {
- if (item.children && item.children.length > 0) {
- item.type = "bi.file_manager_folder_item";
- } else {
- item.type = "bi.file_manager_file_item";
- }
- });
- return items;
- },
-
- setValue: function (v) {
- this.button_group.setValue(v);
- },
-
- getValue: function () {
- return this.button_group.getValue();
- },
-
- getNotSelectedValue: function () {
- return this.button_group.getNotSelectedValue();
- },
-
- getAllLeaves: function () {
- return this.button_group.getAllLeaves();
- },
-
- getAllButtons: function () {
- return this.button_group.getAllButtons();
- },
-
- getSelectedButtons: function () {
- return this.button_group.getSelectedButtons();
- },
-
- getNotSelectedButtons: function () {
- return this.button_group.getNotSelectedButtons();
- },
-
- populate: function (items) {
- this.button_group.populate(this._formatItems(items));
- }
-});
-BI.FileManagerButtonGroup.EVENT_CHANGE = "FileManagerButtonGroup.EVENT_CHANGE";
-BI.shortcut("bi.file_manager_button_group", BI.FileManagerButtonGroup);/**
- * 文件管理控件
- *
- * Created by GUY on 2015/12/11.
- * @class BI.FileManager
- * @extends BI.Widget
- */
-BI.FileManager = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.FileManager.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-file-manager",
- el: {},
- items: []
- })
- },
-
- _init: function () {
- BI.FileManager.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.tree = new BI.Tree();
- var items = BI.Tree.transformToTreeFormat(o.items);
- this.tree.initTree(items);
- this.selectedValues = [];
- this.nav = BI.createWidget({
- type: "bi.file_manager_nav",
- items: BI.deepClone(items)
- });
- this.nav.on(BI.FileManagerNav.EVENT_CHANGE, function (value, obj) {
- if (value == "-1") {//根节点
- self.populate({children: self.tree.toJSON()});
- } else {
- var node = self.tree.search(obj.attr("id"));
- self.populate(BI.extend({id: node.id}, node.get("data"), {children: self.tree.toJSON(node)}));
- }
- self.setValue(self.selectedValues);
- });
- this.list = BI.createWidget(o.el, {
- type: "bi.file_manager_list",
- items: items
- });
- this.list.on(BI.Controller.EVENT_CHANGE, function (type, selected, obj) {
- if (type === BI.Events.CHANGE) {
- var node = self.tree.search(obj.attr("id"));
- self.populate(BI.extend({id: node.id}, node.get("data"), {children: self.tree.toJSON(node)}));
- } else if (type === BI.Events.CLICK) {
- var values = [];
- if (obj instanceof BI.MultiSelectBar) {
- var t = self.list.getValue();
- selected = t.type === BI.Selection.All;
- values = BI.concat(t.assist, t.value);
- } else {
- values = obj.getAllLeaves();
- }
- BI.each(values, function (i, v) {
- if (selected === true) {
- self.selectedValues.pushDistinct(v);
- } else {
- self.selectedValues.remove(v);
- }
- });
- }
- self.setValue(self.selectedValues);
- });
-
- BI.createWidget({
- type: "bi.absolute",
- element: this,
- items: [{
- el: this.list,
- left: 0,
- right: 0,
- top: 0,
- bottom: 10
- }, {
- el: this.nav,
- left: 40,
- right: 100,
- top: 0
- }]
- });
- },
-
- setValue: function (value) {
- this.selectedValues = value || [];
- this.list.setValue(this.selectedValues);
- },
-
- getValue: function () {
- var obj = this.list.getValue();
- var res = obj.type === BI.Selection.All ? obj.assist : obj.value;
- res.pushDistinctArray(this.selectedValues);
- return res;
- },
-
- _populate: function (items) {
- this.list.populate(items);
- },
-
- getSelectedValue: function () {
- return this.nav.getValue()[0];
- },
-
- getSelectedId: function () {
- return this.nav.getId()[0];
- },
-
- populate: function (node) {
- var clone = BI.deepClone(node);
- this._populate(node.children);
- this.nav.populate(clone);
- }
-});
-BI.FileManager.EVENT_CHANGE = "FileManager.EVENT_CHANGE";
-BI.shortcut("bi.file_manager", BI.FileManager);/**
- * 文件管理控件
- *
- * Created by GUY on 2015/12/11.
- * @class BI.FileManagerFileItem
- * @extends BI.Single
- */
-BI.FileManagerFileItem = BI.inherit(BI.Single, {
-
- _defaultConfig: function () {
- return BI.extend(BI.FileManagerFileItem.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-file-manager-file-item bi-list-item bi-border-bottom",
- height: 30
- })
- },
-
- _init: function () {
- BI.FileManagerFileItem.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.checked = BI.createWidget({
- type: "bi.multi_select_bar",
- text: "",
- width: 36,
- height: o.height
- });
- this.checked.on(BI.Controller.EVENT_CHANGE, function () {
- arguments[2] = self;
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
-
- BI.createWidget({
- type: "bi.htape",
- element: this,
- items: [{
- el: this.checked,
- width: 36
- }, {
- el: {
- type: "bi.icon_button",
- cls: "create-by-me-file-font"
- },
- width: 20
- }, {
- el: {
- type: "bi.label",
- textAlign: "left",
- height: o.height,
- text: o.text,
- value: o.value
- }
- }]
- })
- },
-
- getAllLeaves: function(){
- return [this.options.value];
- },
-
- isSelected: function () {
- return this.checked.isSelected();
- },
-
- setSelected: function (v) {
- this.checked.setSelected(v);
- }
-});
-BI.FileManagerFileItem.EVENT_CHANGE = "FileManagerFileItem.EVENT_CHANGE";
-BI.shortcut("bi.file_manager_file_item", BI.FileManagerFileItem);/**
- * 文件管理控件
- *
- * Created by GUY on 2015/12/11.
- * @class BI.FileManagerFolderItem
- * @extends BI.Single
- */
-BI.FileManagerFolderItem = BI.inherit(BI.Single, {
-
- _defaultConfig: function () {
- return BI.extend(BI.FileManagerFolderItem.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-file-manager-folder-item bi-list-item bi-border-bottom",
- height: 30
- })
- },
-
- _init: function () {
- BI.FileManagerFolderItem.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.checked = BI.createWidget({
- type: "bi.multi_select_bar",
- text: "",
- width: 36,
- height: o.height
- });
- this.checked.on(BI.Controller.EVENT_CHANGE, function () {
- arguments[2] = self;
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
- this.button = BI.createWidget({
- type: "bi.text_button",
- textAlign: "left",
- height: o.height,
- text: o.text,
- value: o.value
- });
- this.button.on(BI.Controller.EVENT_CHANGE, function () {
- self.fireEvent(BI.Controller.EVENT_CHANGE, BI.Events.CHANGE, o.value, self);
- });
-
- this.tree = new BI.Tree();
- this.tree.initTree([{
- id: o.id,
- children: o.children
- }]);
- this.selectValue = [];
-
- BI.createWidget({
- type: "bi.htape",
- element: this,
- items: [{
- el: this.checked,
- width: 36
- }, {
- el: {
- type: "bi.icon_button",
- cls: "create-by-me-folder-font"
- },
- width: 20
- }, {
- el: this.button
- }]
- })
- },
-
- setAllSelected: function (v) {
- this.checked.setSelected(v);
- this.selectValue = [];
- },
-
- setHalfSelected: function (v) {
- this.checked.setHalfSelected(v);
- if(!v){
- this.selectValue = [];
- }
- },
-
- setValue: function (v) {
- var self = this, o = this.options;
- var isHalf = false;
- var selectValue = [];
- this.tree.traverse(function (node) {
- if (node.isLeaf()) {
- if (BI.contains(v, node.get("data").value)) {
- selectValue.push(node.get("data").value);
- } else {
- isHalf = true;
- }
- }
- });
- this.setAllSelected(selectValue.length > 0 && !isHalf);
- this.setHalfSelected(selectValue.length > 0 && isHalf);
- if (this.checked.isHalfSelected()) {
- this.selectValue = selectValue;
- }
- },
-
- getAllButtons: function () {
- return [this];
- },
-
- getAllLeaves: function () {
- var o = this.options;
- var res = [];
- this.tree.traverse(function (node) {
- if (node.isLeaf()) {
- res.push(node.get("data").value)
- }
- });
- return res;
- },
-
- getNotSelectedValue: function () {
- var self = this, o = this.options;
- var res = [];
- var isAllSelected = this.checked.isSelected();
- if (isAllSelected === true) {
- return res;
- }
- var isHalfSelected = this.checked.isHalfSelected();
- this.tree.traverse(function (node) {
- if (node.isLeaf()) {
- var v = node.get("data").value;
- if (isHalfSelected === true) {
- if (!BI.contains(self.selectValue, node.get("data").value)) {
- res.push(v);
- }
- } else {
- res.push(v);
- }
- }
- });
- return res;
- },
-
- getValue: function () {
- var res = [];
- if (this.checked.isSelected()) {
- this.tree.traverse(function (node) {
- if (node.isLeaf()) {
- res.push(node.get("data").value);
- }
- });
- return res;
- }
- if (this.checked.isHalfSelected()) {
- return this.selectValue;
- }
- return [];
- }
-});
-BI.FileManagerFolderItem.EVENT_CHANGE = "FileManagerFolderItem.EVENT_CHANGE";
-BI.shortcut("bi.file_manager_folder_item", BI.FileManagerFolderItem);/**
- * 文件管理控件列表
- *
- * Created by GUY on 2015/12/11.
- * @class BI.FileManagerList
- * @extends BI.Widget
- */
-BI.FileManagerList = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.FileManagerList.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-file-manager-list",
- el: {},
- items: []
- })
- },
-
- _init: function () {
- BI.FileManagerList.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.list = BI.createWidget({
- type: "bi.select_list",
- element: this,
- items: o.items,
- toolbar: {
- type: "bi.multi_select_bar",
- height: 40,
- text: ""
- },
- el: {
- type: "bi.list_pane",
- el: BI.isWidget(o.el) ? o.el : BI.extend({
- type: "bi.file_manager_button_group"
- }, o.el)
- }
- });
- this.list.on(BI.Controller.EVENT_CHANGE, function () {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
- },
-
- setValue: function (v) {
- this.list.setValue({
- value: v
- });
- },
-
- getValue: function () {
- return this.list.getValue();
- },
-
- populate: function (items) {
- this.list.populate(items);
- this.list.setToolBarVisible(true);
- }
-});
-BI.FileManagerList.EVENT_CHANGE = "FileManagerList.EVENT_CHANGE";
-BI.shortcut("bi.file_manager_list", BI.FileManagerList);/**
- * 文件管理导航按钮
- *
- * Created by GUY on 2015/12/11.
- * @class BI.FileManagerNavButton
- * @extends BI.Widget
- */
-BI.FileManagerNavButton = BI.inherit(BI.Widget, {
-
- _const: {
- normal_color: "#ffffff",
- select_color: "#eff1f4"
- },
- _defaultConfig: function () {
- return BI.extend(BI.FileManagerNavButton.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-file-manager-nav-button",
- selected: false,
- height: 40
- })
- },
-
- _init: function () {
- BI.FileManagerNavButton.superclass._init.apply(this, arguments);
- var self = this, o = this.options, c = this._const;
- this.button = BI.createWidget({
- type: "bi.text_button",
- cls: "file-manager-nav-button-text bi-card",
- once: true,
- selected: o.selected,
- text: o.text,
- title: o.text,
- value: o.value,
- height: o.height,
- lgap: 20,
- rgap: 10
- });
- this.button.on(BI.Controller.EVENT_CHANGE, function () {
- arguments[2] = self;
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
- var svg = BI.createWidget({
- type: "bi.svg",
- cls: "file-manager-nav-button-triangle",
- width: 15,
- height: o.height
- });
- var path = svg.path("M0,0L15,20L0,40").attr({
- "stroke": c.select_color,
- "fill": o.selected ? c.select_color : c.normal_color
- });
- this.button.on(BI.TextButton.EVENT_CHANGE, function () {
- if (this.isSelected()) {
- path.attr("fill", c.select_color);
- } else {
- path.attr("fill", c.normal_color);
- }
- });
- BI.createWidget({
- type: "bi.default",
- element: this,
- items: [this.button]
- });
- BI.createWidget({
- type: "bi.absolute",
- element: this,
- items: [{
- el: svg,
- right: -15,
- top: 0,
- bottom: 0
- }]
- })
- },
-
- isSelected: function () {
- return this.button.isSelected();
- },
-
- setValue: function (v) {
- this.button.setValue(v);
- },
-
- getValue: function () {
- return this.button.getValue();
- },
-
- populate: function (items) {
-
- }
-});
-BI.FileManagerNavButton.EVENT_CHANGE = "FileManagerNavButton.EVENT_CHANGE";
-BI.shortcut("bi.file_manager_nav_button", BI.FileManagerNavButton);/**
- * 文件管理导航
- *
- * Created by GUY on 2015/12/11.
- * @class BI.FileManagerNav
- * @extends BI.Widget
- */
-BI.FileManagerNav = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.FileManagerNav.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-file-manager-nav bi-border-left",
- height: 40,
- items: []
- })
- },
-
- _init: function () {
- BI.FileManagerNav.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.tree = new BI.Tree();
- this.refreshTreeData(o.items);
- this.tree.getRoot().set("data", {
- text: BI.i18nText("BI-Created_By_Me"),
- value: BI.FileManagerNav.ROOT_CREATE_BY_ME,
- id: BI.FileManagerNav.ROOT_CREATE_BY_ME
- });
- this.button_group = BI.createWidget({
- type: "bi.button_group",
- element: this,
- items: [{
- type: "bi.file_manager_nav_button",
- text: BI.i18nText("BI-Created_By_Me"),
- selected: true,
- id: BI.FileManagerNav.ROOT_CREATE_BY_ME,
- value: BI.FileManagerNav.ROOT_CREATE_BY_ME
- }],
- layouts: [{
- type: "bi.horizontal"
- }]
- });
- this.button_group.on(BI.Controller.EVENT_CHANGE, function () {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
- this.button_group.on(BI.ButtonGroup.EVENT_CHANGE, function (value, obj) {
- self.fireEvent(BI.FileManagerNav.EVENT_CHANGE, arguments);
- });
- },
-
- _getAllParents: function (id) {
- var node, res = [];
- if (!id) {
- node = this.tree.getRoot();
- } else {
- node = this.tree.search(id);
- }
- while (node.parent) {
- res.push(node);
- node = node.parent;
- }
- res.push(node);
- return res.reverse();
- },
-
- _formatNodes: function (nodes) {
- var res = [];
- BI.each(nodes, function (i, node) {
- res.push(BI.extend({
- type: "bi.file_manager_nav_button",
- id: node.id
- }, node.get("data")));
- });
- BI.last(res).selected = true;
- return res;
- },
-
- getValue: function () {
- return this.button_group.getValue();
- },
-
- getId: function () {
- var ids = [];
- BI.each(this.button_group.getSelectedButtons(), function (i, btn) {
- ids.push(btn.attr("id"));
- });
- return ids;
- },
-
- refreshTreeData: function(items){
- this.tree.initTree(BI.Tree.transformToTreeFormat(items));
- this.tree.getRoot().set("data", {
- text: BI.i18nText("BI-Created_By_Me"),
- value: BI.FileManagerNav.ROOT_CREATE_BY_ME,
- id: BI.FileManagerNav.ROOT_CREATE_BY_ME
- });
- },
-
- populate: function (node) {
- var parents = BI.isNull(node) ? [this.tree.getRoot()] : this._getAllParents(node.id);
- this.button_group.populate(this._formatNodes(parents));
- }
-});
-BI.extend(BI.FileManagerNav, {
- ROOT_CREATE_BY_ME: "-1"
-});
-BI.FileManagerNav.EVENT_CHANGE = "FileManagerNav.EVENT_CHANGE";
-BI.shortcut("bi.file_manager_nav", BI.FileManagerNav);/**
- * 交互行为布局
- *
- *
- * Created by GUY on 2016/7/23.
- * @class BI.InteractiveArrangement
- * @extends BI.Widget
- */
-BI.InteractiveArrangement = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.InteractiveArrangement.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-interactive-arrangement",
- resizable: true,
- layoutType: BI.Arrangement.LAYOUT_TYPE.GRID,
- items: []
- });
- },
-
- _init: function () {
- BI.InteractiveArrangement.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.arrangement = BI.createWidget({
- type: "bi.adaptive_arrangement",
- element: this,
- resizable: o.resizable,
- layoutType: o.layoutType,
- items: o.items
- });
- this.arrangement.on(BI.AdaptiveArrangement.EVENT_SCROLL, function () {
- self.fireEvent(BI.InteractiveArrangement.EVENT_SCROLL, arguments);
- });
- this.arrangement.on(BI.AdaptiveArrangement.EVENT_RESIZE, function () {
- self.fireEvent(BI.InteractiveArrangement.EVENT_RESIZE, arguments);
- });
-
- this.arrangement.on(BI.AdaptiveArrangement.EVENT_ELEMENT_RESIZE, function (id, size) {
- var p = self._getRegionClientPosition(id);
- self.draw({
- left: p.left,
- top: p.top
- }, size, id);
- });
- this.arrangement.on(BI.AdaptiveArrangement.EVENT_ELEMENT_STOP_RESIZE, function (id, size) {
- self.stopDraw();
- self.setRegionSize(id, size);
- });
-
- this.tags = [];
-
- },
-
- _isEqual: function (num1, num2) {
- return this.arrangement._isEqual(num1, num2);
- },
-
- _getScrollOffset: function () {
- return this.arrangement._getScrollOffset();
- },
-
- _positionAt: function (position, regions) {
- var self = this;
- regions = regions || this.getAllRegions();
- var left = [], center = [], right = [], top = [], middle = [], bottom = [];
- BI.each(regions, function (i, region) {
- var client = self._getRegionClientPosition(region.id);
- if (Math.abs(client.left - position.left) <= 3) {
- left.push(region);
- }
- if (Math.abs(client.left + client.width / 2 - position.left) <= 3) {
- center.push(region);
- }
- if (Math.abs(client.left + client.width - position.left) <= 3) {
- right.push(region);
- }
- if (Math.abs(client.top - position.top) <= 3) {
- top.push(region);
- }
- if (Math.abs(client.top + client.height / 2 - position.top) <= 3) {
- middle.push(region);
- }
- if (Math.abs(client.top + client.height - position.top) <= 3) {
- bottom.push(region);
- }
- });
- return {
- left: left,
- center: center,
- right: right,
- top: top,
- middle: middle,
- bottom: bottom
- }
- },
-
- _getRegionClientPosition: function (name) {
- var region = this.getRegionByName(name);
- var offset = this.arrangement._getScrollOffset();
- return {
- top: region.top - offset.top,
- left: region.left - offset.left,
- width: region.width,
- height: region.height,
- id: region.id
- }
- },
-
- _vAlign: function (position, regions) {
- var self = this;
- var vs = this._positionAt(position, regions);
- var positions = [];
- var l;
- if (vs.left.length > 0) {
- l = this._getRegionClientPosition(vs.left[0].id).left;
- } else if (vs.right.length > 0) {
- var temp = this._getRegionClientPosition(vs.right[0].id);
- l = temp.left + temp.width;
- } else if (vs.center.length > 0) {
- var temp = this._getRegionClientPosition(vs.center[0].id);
- l = temp.left + temp.width / 2;
- }
- var rs = vs.left.concat(vs.right).concat(vs.center);
- BI.each(rs, function (i, region) {
- var p = self._getRegionClientPosition(region.id);
- if (self._isEqual(p.left, l) || self._isEqual(p.left + p.width, l) || self._isEqual(p.left + p.width / 2, l)) {
- var topPoint = {
- top: p.top + p.height / 2,
- left: l
- };
- positions.push({
- id: region.id,
- start: topPoint,
- end: {
- left: l,
- top: position.top
- }
- });
- }
- });
- return positions;
- },
-
- _leftAlign: function (position, size, regions) {
- var self = this;
- return this._vAlign({
- left: position.left,
- top: position.top + size.height / 2
- }, regions);
- },
-
- _rightAlign: function (position, size, regions) {
- var self = this;
- return this._vAlign({
- left: position.left + size.width,
- top: position.top + size.height / 2
- }, regions);
- },
-
- _hAlign: function (position, regions) {
- var self = this;
- var hs = this._positionAt(position, regions);
- var positions = [];
- var t;
- if (hs.top.length > 0) {
- var temp = this._getRegionClientPosition(hs.top[0].id);
- t = temp.top;
- } else if (hs.bottom.length > 0) {
- var temp = this._getRegionClientPosition(hs.bottom[0].id);
- t = temp.top + temp.height;
- } else if (hs.middle.length > 0) {
- var temp = this._getRegionClientPosition(hs.middle[0].id);
- t = temp.top + temp.height / 2;
- }
- var rs = hs.top.concat(hs.bottom).concat(hs.middle);
- BI.each(rs, function (i, region) {
- var p = self._getRegionClientPosition(region.id);
- if (self._isEqual(p.top, t) || self._isEqual(p.top + p.height, t) || self._isEqual(p.top + p.height / 2, t)) {
- var leftPoint = {
- top: t,
- left: p.left + p.width / 2
- };
- positions.push({
- id: p.id,
- start: leftPoint,
- end: {
- left: position.left,
- top: t
- }
- });
- }
- });
- return positions;
- },
-
- _topAlign: function (position, size, regions) {
- var self = this;
- return this._hAlign({
- left: position.left + size.width / 2,
- top: position.top
- }, regions);
- },
-
- _bottomAlign: function (position, size, regions) {
- var self = this;
- return this._hAlign({
- left: position.left + size.width / 2,
- top: position.top + size.height
- }, regions);
- },
-
- _centerAlign: function (position, size, regions) {
- var self = this;
- return this._vAlign({
- left: position.left + size.width / 2,
- top: position.top + size.height / 2
- }, regions);
- },
-
- _middleAlign: function (position, size, regions) {
- var self = this;
- return this._hAlign({
- left: position.left + size.width / 2,
- top: position.top + size.height / 2
- }, regions);
- },
-
-
- _drawOneTag: function (start, end) {
- var s = BI.createWidget({
- type: "bi.icon_button",
- //invisible: true,
- width: 13,
- height: 13,
- cls: "drag-tag-font interactive-arrangement-dragtag-icon"
- });
- var e = BI.createWidget({
- type: "bi.icon_button",
- //invisible: true,
- width: 13,
- height: 13,
- cls: "drag-tag-font interactive-arrangement-dragtag-icon"
- });
- if (this._isEqual(start.left, end.left)) {
- var line = BI.createWidget({
- type: "bi.layout",
- //invisible: true,
- cls: "interactive-arrangement-dragtag-line",
- width: 1,
- height: Math.abs(start.top - end.top)
- });
- } else {
- var line = BI.createWidget({
- type: "bi.layout",
- //invisible: true,
- cls: "interactive-arrangement-dragtag-line",
- height: 1,
- width: Math.abs(start.left - end.left)
- });
- }
- BI.createWidget({
- type: "bi.absolute",
- element: this,
- items: [{
- el: s,
- left: start.left - 6,
- top: start.top - 7
- }, {
- el: e,
- left: end.left - 6,
- top: end.top - 7
- }, {
- el: line,
- left: Math.min(start.left, end.left),
- top: Math.min(start.top, end.top)
- }]
- });
- this.tags.push(s);
- this.tags.push(e);
- this.tags.push(line);
- },
-
- stopDraw: function () {
- BI.each(this.tags, function (i, w) {
- w.destroy();
- });
- this.tags = [];
- },
-
- _getRegionExcept: function (name, regions) {
- var other = [];
- BI.each(regions || this.getAllRegions(), function (i, region) {
- if (!(name && region.id === name)) {
- other.push(region);
- }
- });
- return other;
- },
-
- getClientWidth: function () {
- return this.arrangement.getClientWidth();
- },
-
- getClientHeight: function () {
- return this.arrangement.getClientHeight();
- },
-
- getPosition: function (name, position, size) {
- var regions = this.getAllRegions();
- var me;
- if (name) {
- me = this._getRegionClientPosition(name);
- }
- var other = this._getRegionExcept(name, regions);
- position = position || {
- left: me.left,
- top: me.top
- };
- size = size || {
- width: me.width,
- height: me.height
- };
- var left = this._leftAlign(position, size, other);
- var right = this._rightAlign(position, size, other);
- var top = this._topAlign(position, size, other, other);
- var bottom = this._bottomAlign(position, size, other);
- var center = this._centerAlign(position, size, other);
- var middle = this._middleAlign(position, size, other);
-
- BI.each(center, function (i, pos) {
- position.left = pos.end.left - size.width / 2;
- });
- BI.each(right, function (i, pos) {
- position.left = pos.end.left - size.width;
- });
- BI.each(left, function (i, pos) {
- position.left = pos.end.left;
- });
- BI.each(middle, function (i, pos) {
- position.top = pos.end.top - size.height / 2;
- });
- BI.each(bottom, function (i, pos) {
- position.top = pos.end.top - size.height;
- });
- BI.each(top, function (i, pos) {
- position.top = pos.end.top;
- });
- return position;
- },
-
- //position不动 变size
- getSize: function (name, position, size) {
- var regions = this.getAllRegions();
- var me;
- if (name) {
- me = this._getRegionClientPosition(name);
- }
- var other = this._getRegionExcept(name, regions);
- position = position || {
- left: me.left,
- top: me.top
- };
- size = size || {
- width: me.width,
- height: me.height
- };
- var left = this._leftAlign(position, size, other);
- var right = this._rightAlign(position, size, other);
- var top = this._topAlign(position, size, other, other);
- var bottom = this._bottomAlign(position, size, other);
- var center = this._centerAlign(position, size, other);
- var middle = this._middleAlign(position, size, other);
-
- BI.each(center, function (i, pos) {
- size.width = (pos.end.left - position.left) * 2;
- });
- BI.each(right, function (i, pos) {
- size.width = pos.end.left - position.left;
- });
- BI.each(left, function (i, pos) {
- });
- BI.each(middle, function (i, pos) {
- size.height = (pos.end.top - position.top) * 2;
- });
- BI.each(bottom, function (i, pos) {
- size.height = pos.end.top - position.top;
- });
- BI.each(top, function (i, pos) {
- });
- return size;
- },
-
- draw: function (position, size, name) {
- var self = this;
- this.stopDraw();
- switch (this.getLayoutType()) {
- case BI.Arrangement.LAYOUT_TYPE.FREE:
- var other = this._getRegionExcept(name);
- var left = this._leftAlign(position, size, other);
- var right = this._rightAlign(position, size, other);
- var top = this._topAlign(position, size, other);
- var bottom = this._bottomAlign(position, size, other);
- var center = this._centerAlign(position, size, other);
- var middle = this._middleAlign(position, size, other);
-
- BI.each(center, function (i, pos) {
- self._drawOneTag(pos.start, pos.end);
- });
- BI.each(right, function (i, pos) {
- self._drawOneTag(pos.start, pos.end);
- });
- BI.each(left, function (i, pos) {
- self._drawOneTag(pos.start, pos.end);
- });
- BI.each(middle, function (i, pos) {
- self._drawOneTag(pos.start, pos.end);
- });
- BI.each(bottom, function (i, pos) {
- self._drawOneTag(pos.start, pos.end);
- });
- BI.each(top, function (i, pos) {
- self._drawOneTag(pos.start, pos.end);
- });
- break;
- case BI.Arrangement.LAYOUT_TYPE.GRID:
- break;
- }
- },
-
- addRegion: function (region, position) {
- this.stopDraw();
- return this.arrangement.addRegion(region, position);
- },
-
- deleteRegion: function (name) {
- return this.arrangement.deleteRegion(name);
- },
-
- setRegionSize: function (name, size) {
- size = this.getSize(name, null, size);
- return this.arrangement.setRegionSize(name, size);
- },
-
- setPosition: function (position, size) {
- var self = this;
- this.stopDraw();
- if (position.left > 0 && position.top > 0) {
- switch (this.getLayoutType()) {
- case BI.Arrangement.LAYOUT_TYPE.FREE:
- position = this.getPosition(null, position, size);
- this.draw(position, size);
- break;
- case BI.Arrangement.LAYOUT_TYPE.GRID:
- break;
- }
- }
- var at = this.arrangement.setPosition(position, size);
- return at;
- },
-
- setRegionPosition: function (name, position) {
- if (position.left > 0 && position.top > 0) {
- switch (this.getLayoutType()) {
- case BI.Arrangement.LAYOUT_TYPE.FREE:
- position = this.getPosition(name, position);
- break;
- case BI.Arrangement.LAYOUT_TYPE.GRID:
- break;
- }
- }
- return this.arrangement.setRegionPosition(name, position);
- },
-
- setDropPosition: function (position, size) {
- var self = this;
- this.stopDraw();
- if (position.left > 0 && position.top > 0) {
- switch (this.getLayoutType()) {
- case BI.Arrangement.LAYOUT_TYPE.FREE:
- position = this.getPosition(null, position, size);
- this.draw(position, size);
- break;
- case BI.Arrangement.LAYOUT_TYPE.GRID:
- break;
- }
- }
- var callback = self.arrangement.setDropPosition(position, size);
- return function () {
- callback();
- self.stopDraw();
- }
- },
-
- scrollInterval: function () {
- this.arrangement.scrollInterval.apply(this.arrangement, arguments);
- },
-
- scrollEnd: function () {
- this.arrangement.scrollEnd.apply(this.arrangement, arguments);
- },
-
- scrollTo: function (scroll) {
- this.arrangement.scrollTo(scroll);
- },
-
- zoom: function (ratio) {
- this.arrangement.zoom(ratio);
- },
-
- resize: function () {
- return this.arrangement.resize();
- },
-
- relayout: function () {
- return this.arrangement.relayout();
- },
-
- setLayoutType: function (type) {
- this.arrangement.setLayoutType(type);
- },
-
- getLayoutType: function () {
- return this.arrangement.getLayoutType();
- },
-
- getLayoutRatio: function () {
- return this.arrangement.getLayoutRatio();
- },
-
- getHelper: function () {
- return this.arrangement.getHelper();
- },
-
- getRegionByName: function (name) {
- return this.arrangement.getRegionByName(name);
- },
-
- getAllRegions: function () {
- return this.arrangement.getAllRegions();
- },
-
- revoke: function () {
- return this.arrangement.revoke();
- },
-
- populate: function (items) {
- var self = this;
- this.arrangement.populate(items);
- }
-});
-BI.InteractiveArrangement.EVENT_RESIZE = "InteractiveArrangement.EVENT_RESIZE";
-BI.InteractiveArrangement.EVENT_SCROLL = "InteractiveArrangement.EVENT_SCROLL";
-BI.shortcut('bi.interactive_arrangement', BI.InteractiveArrangement);/**
- * Created by zcf on 2016/9/26.
- */
-BI.IntervalSlider = BI.inherit(BI.Widget, {
- _constant: {
- EDITOR_WIDTH: 58,
- EDITOR_R_GAP: 60,
- EDITOR_HEIGHT: 30,
- SLIDER_WIDTH_HALF: 15,
- SLIDER_WIDTH: 30,
- SLIDER_HEIGHT: 30,
- TRACK_HEIGHT: 24
- },
-
- _defaultConfig: function () {
- return BI.extend(BI.IntervalSlider.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-interval-slider bi-slider-track",
- digit: false,
- unit: ""
- })
- },
-
- _init: function () {
- BI.IntervalSlider.superclass._init.apply(this, arguments);
-
- var self = this;
- var c = this._constant;
- this.enable = false;
- this.valueOne = "";
- this.valueTwo = "";
- this.calculation = new BI.AccurateCalculationModel();
-
- // this.backgroundTrack = BI.createWidget({
- // type: "bi.layout",
- // cls: "background-track",
- // height: c.TRACK_HEIGHT
- // });
- this.grayTrack = BI.createWidget({
- type: "bi.layout",
- cls: "gray-track",
- height: 6
- });
- this.blueTrack = BI.createWidget({
- type: "bi.layout",
- cls: "blue-track bi-high-light-background",
- height: 6
- });
- this.track = this._createTrackWrapper();
-
- this.labelOne = BI.createWidget({
- type: "bi.sign_text_editor",
- cls: "slider-editor-button",
- text: this.options.unit,
- errorText: "",
- allowBlank: false,
- width: c.EDITOR_WIDTH,
- validationChecker: function (v) {
- return self._checkValidation(v);
- }
- });
- this.labelOne.element.hover(function () {
- self.labelOne.element.removeClass("bi-border").addClass("bi-border");
- }, function () {
- self.labelOne.element.removeClass("bi-border");
- });
- this.labelOne.on(BI.Editor.EVENT_CONFIRM, function () {
- var v = BI.parseFloat(this.getValue());
- self.valueOne = v;
- var percent = self._getPercentByValue(v);
- var significantPercent = BI.parseFloat(percent.toFixed(1));//分成1000份
- self._setLabelOnePosition(significantPercent);
- self._setSliderOnePosition(significantPercent);
- self._setBlueTrack();
- self.fireEvent(BI.IntervalSlider.EVENT_CHANGE);
- });
-
- this.labelTwo = BI.createWidget({
- type: "bi.sign_text_editor",
- cls: "slider-editor-button",
- errorText: "",
- text: this.options.unit,
- allowBlank: false,
- width: c.EDITOR_WIDTH,
- validationChecker: function (v) {
- return self._checkValidation(v);
- }
- });
- this.labelTwo.element.hover(function () {
- self.labelTwo.element.removeClass("bi-border").addClass("bi-border");
- }, function () {
- self.labelTwo.element.removeClass("bi-border");
- });
- this.labelTwo.on(BI.Editor.EVENT_CONFIRM, function () {
- var v = BI.parseFloat(this.getValue());
- self.valueTwo = v;
- var percent = self._getPercentByValue(v);
- var significantPercent = BI.parseFloat(percent.toFixed(1));
- self._setLabelTwoPosition(significantPercent);
- self._setSliderTwoPosition(significantPercent);
- self._setBlueTrack();
- self.fireEvent(BI.IntervalSlider.EVENT_CHANGE);
- });
-
- this.sliderOne = BI.createWidget({
- type: "bi.single_slider_button"
- });
- this.sliderTwo = BI.createWidget({
- type: "bi.single_slider_button"
- });
- this._draggable(this.sliderOne, true);
- this._draggable(this.sliderTwo, false);
- this._setVisible(false);
-
- BI.createWidget({
- type: "bi.absolute",
- element: this,
- items: [{
- el: {
- type: "bi.vertical",
- items: [{
- type: "bi.absolute",
- items: [{
- el: this.track,
- width: "100%",
- height: c.TRACK_HEIGHT
- }]
- }],
- hgap: 7,
- height: c.TRACK_HEIGHT
- },
- top: 23,
- left: 0,
- width: "100%"
- },
- this._createLabelWrapper(),
- this._createSliderWrapper()
- ]
- })
- },
-
- _rePosBySizeAfterMove: function (size, isLeft) {
- var o = this.options;
- var percent = size * 100 / (this._getGrayTrackLength());
- var significantPercent = BI.parseFloat(percent.toFixed(1));
- var v = this._getValueByPercent(significantPercent);
- v = this._assertValue(v);
- v = o.digit === false ? v : v.toFixed(o.digit);
- if(isLeft){
- this._setLabelOnePosition(significantPercent);
- this._setSliderOnePosition(significantPercent);
- this.labelOne.setValue(v);
- this.valueOne = v;
- }else{
- this._setLabelTwoPosition(significantPercent);
- this._setSliderTwoPosition(significantPercent);
- this.labelTwo.setValue(v);
- this.valueTwo = v;
- }
- this._setBlueTrack();
- },
-
- _rePosBySizeAfterStop: function (size, isLeft) {
- var percent = size * 100 / (this._getGrayTrackLength());
- var significantPercent = BI.parseFloat(percent.toFixed(1));
- isLeft ? this._setSliderOnePosition(significantPercent) : this._setSliderTwoPosition(significantPercent);
- },
-
- _draggable: function (widget, isLeft) {
- var self = this, o = this.options;
- var startDrag = false;
- var size = 0, offset = 0, defaultSize = 0;
- var mouseMoveTracker = new BI.MouseMoveTracker(function (deltaX) {
- if (mouseMoveTracker.isDragging()) {
- startDrag = true;
- offset += deltaX;
- size = optimizeSize(defaultSize + offset);
- widget.element.addClass("dragging");
- self._rePosBySizeAfterMove(size, isLeft);
- }
- }, function () {
- if (startDrag === true) {
- size = optimizeSize(size);
- self._rePosBySizeAfterStop(size, isLeft);
- size = 0;
- offset = 0;
- defaultSize = size;
- startDrag = false;
- }
- widget.element.removeClass("dragging");
- mouseMoveTracker.releaseMouseMoves();
- self.fireEvent(BI.IntervalSlider.EVENT_CHANGE);
- }, document);
- widget.element.on("mousedown", function (event) {
- if(!widget.isEnabled()){
- return;
- }
- defaultSize = this.offsetLeft;
- optimizeSize(defaultSize);
- mouseMoveTracker.captureMouseMoves(event);
- });
-
- function optimizeSize(s) {
- return BI.clamp(s, 0, self._getGrayTrackLength());
- }
- },
-
- _createLabelWrapper: function () {
- var c = this._constant;
- return {
- el: {
- type: "bi.vertical",
- items: [{
- type: "bi.absolute",
- items: [{
- el: this.labelOne,
- top: 0,
- left: "0%"
- }]
- }, {
- type: "bi.absolute",
- items: [{
- el: this.labelTwo,
- top: 0,
- left: "100%"
- }]
- }],
- rgap: c.EDITOR_R_GAP,
- height: 70
- },
- top: 0,
- left: 0,
- width: "100%"
- }
- },
-
- _createSliderWrapper: function () {
- var c = this._constant;
- return {
- el: {
- type: "bi.vertical",
- items: [{
- type: "bi.absolute",
- items: [{
- el: this.sliderOne,
- top: 0,
- left: "0%"
- }]
- }, {
- type: "bi.absolute",
- items: [{
- el: this.sliderTwo,
- top: 0,
- left: "100%"
- }]
- }],
- hgap: c.SLIDER_WIDTH_HALF,
- height: c.SLIDER_HEIGHT
- },
- top: 20,
- left: 0,
- width: "100%"
- }
- },
-
- _createTrackWrapper: function () {
- return BI.createWidget({
- type: "bi.absolute",
- items: [{
- el: {
- type: "bi.vertical",
- items: [{
- type: "bi.absolute",
- items: [{
- el: this.grayTrack,
- top: 0,
- left: 0,
- width: "100%"
- }, {
- el: this.blueTrack,
- top: 0,
- left: 0,
- width: "0%"
- }]
- }],
- hgap: 8,
- height: 8
- },
- top: 8,
- left: 0,
- width: "100%"
- }]
- })
- },
-
- _checkValidation: function (v) {
- var o = this.options;
- var valid = false;
- //像90.这样的既不属于整数又不属于小数,是不合法的值
- var dotText = (v + "").split(".")[1];
- if (BI.isEmptyString(dotText)) {
- }else{
- if (BI.isNumeric(v) && !(BI.isNull(v) || v < this.min || v > this.max)) {
- if(o.digit === false){
- valid = true;
- }else{
- dotText = dotText || "";
- valid = (dotText.length === o.digit);
- }
- }
- }
- return valid;
- },
-
- _checkOverlap: function () {
- var labelOneLeft = this.labelOne.element[0].offsetLeft;
- var labelTwoLeft = this.labelTwo.element[0].offsetLeft;
- if (labelOneLeft <= labelTwoLeft) {
- if ((labelTwoLeft - labelOneLeft) < 90) {
- this.labelTwo.element.css({"top": 40});
- } else {
- this.labelTwo.element.css({"top": 0});
- }
- } else {
- if ((labelOneLeft - labelTwoLeft) < 90) {
- this.labelTwo.element.css({"top": 40});
- } else {
- this.labelTwo.element.css({"top": 0});
- }
- }
- },
-
- _setLabelOnePosition: function (percent) {
- this.labelOne.element.css({"left": percent + "%"});
- this._checkOverlap();
- },
-
- _setLabelTwoPosition: function (percent) {
- this.labelTwo.element.css({"left": percent + "%"});
- this._checkOverlap();
- },
-
- _setSliderOnePosition: function (percent) {
- this.sliderOne.element.css({"left": percent + "%"});
- },
-
- _setSliderTwoPosition: function (percent) {
- this.sliderTwo.element.css({"left": percent + "%"});
- },
-
- _setBlueTrackLeft: function (percent) {
- this.blueTrack.element.css({"left": percent + "%"});
- },
-
- _setBlueTrackWidth: function (percent) {
- this.blueTrack.element.css({"width": percent + "%"});
- },
-
- _setBlueTrack: function () {
- var percentOne = this._getPercentByValue(this.labelOne.getValue());
- var percentTwo = this._getPercentByValue(this.labelTwo.getValue());
- if (percentOne <= percentTwo) {
- this._setBlueTrackLeft(percentOne);
- this._setBlueTrackWidth(percentTwo - percentOne);
- } else {
- this._setBlueTrackLeft(percentTwo);
- this._setBlueTrackWidth(percentOne - percentTwo);
- }
- },
-
- _setAllPosition: function (one, two) {
- this._setSliderOnePosition(one);
- this._setLabelOnePosition(one);
- this._setSliderTwoPosition(two);
- this._setLabelTwoPosition(two);
- this._setBlueTrack();
- },
-
- _setVisible: function (visible) {
- this.sliderOne.setVisible(visible);
- this.sliderTwo.setVisible(visible);
- this.labelOne.setVisible(visible);
- this.labelTwo.setVisible(visible);
- },
-
- _setErrorText: function () {
- var errorText = BI.i18nText("BI-Please_Enter") + this.min + "-" + this.max + BI.i18nText("BI-Basic_De") + BI.i18nText("BI-Basic_Number");
- this.labelOne.setErrorText(errorText);
- this.labelTwo.setErrorText(errorText);
- },
-
- _getGrayTrackLength: function () {
- return this.grayTrack.element[0].scrollWidth
- },
-
- //其中取max-min后保留4为有效数字后的值的小数位数为最终value的精度
- _getValueByPercent: function (percent) {//return (((max-min)*percent)/100+min)
- var sub = this.calculation.accurateSubtraction(this.max, this.min);
- var mul = this.calculation.accurateMultiplication(sub, percent);
- var div = this.calculation.accurateDivisionTenExponent(mul, 2);
- if(this.precision < 0){
- var value = BI.parseFloat(this.calculation.accurateAddition(div, this.min));
- var reduceValue = Math.round(this.calculation.accurateDivisionTenExponent(value, -this.precision));
- return this.calculation.accurateMultiplication(reduceValue, Math.pow(10, -this.precision));
- }else{
- return BI.parseFloat(this.calculation.accurateAddition(div, this.min).toFixed(this.precision));
- }
- },
-
- _getPercentByValue: function (v) {
- return (v - this.min) * 100 / (this.max - this.min);
- },
-
- _setDraggableEnable: function (enable) {
- this.sliderOne.setEnable(enable);
- this.sliderTwo.setEnable(enable);
- },
-
- _getPrecision: function () {
- //计算每一份值的精度(最大值和最小值的差值保留4为有效数字后的精度)
- //如果差值的整数位数大于4,toPrecision(4)得到的是科学计数法123456 => 1.235e+5
- //返回非负值: 保留的小数位数
- //返回负值: 保留的10^n精度中的n
- var sub = this.calculation.accurateSubtraction(this.max, this.min);
- var pre = sub.toPrecision(4);
- //科学计数法
- var eIndex = pre.indexOf("e");
- var arr = [];
- if(eIndex > -1){
- arr = pre.split("e");
- var decimalPartLength = BI.size(arr[0].split(".")[1]);
- var sciencePartLength = BI.parseInt(arr[1].substring(1));
- return decimalPartLength - sciencePartLength;
- }else{
- arr = pre.split(".");
- return arr.length > 1 ? arr[1].length : 0;
- }
- },
-
- _assertValue: function (value) {
- if(value <= this.min){
- return this.min
- }
- if(value >= this.max){
- return this.max;
- }
- return value;
- },
-
- getValue: function () {
- if (this.valueOne <= this.valueTwo) {
- return {min: this.valueOne, max: this.valueTwo}
- } else {
- return {min: this.valueTwo, max: this.valueOne}
- }
- },
-
- setMinAndMax: function (v) {
- var minNumber = BI.parseFloat(v.min);
- var maxNumber = BI.parseFloat(v.max);
- if ((!isNaN(minNumber)) && (!isNaN(maxNumber)) && (maxNumber >= minNumber )) {
- this.min = minNumber;
- this.max = maxNumber;
- this.valueOne = minNumber;
- this.valueTwo = maxNumber;
- this.precision = this._getPrecision();
- this._setDraggableEnable(true);
- }
- if (maxNumber === minNumber) {
- this._setDraggableEnable(false);
- }
- },
-
- setValue: function (v) {
- var o = this.options;
- var valueOne = BI.parseFloat(v.min);
- var valueTwo = BI.parseFloat(v.max);
- valueOne = o.digit === false ? valueOne : valueOne.toFixed(o.digit);
- valueTwo = o.digit === false ? valueTwo : valueTwo.toFixed(o.digit);
- if (!isNaN(valueOne) && !isNaN(valueTwo)) {
- if (this._checkValidation(valueOne)) {
- this.valueOne = valueOne;
- }
- if (this._checkValidation(valueTwo)) {
- this.valueTwo = valueTwo;
- }
- if (valueOne < this.min) {
- this.valueOne = this.min;
- }
- if (valueTwo > this.max) {
- this.valueTwo = this.max;
- }
- }
- },
-
- reset: function () {
- this._setVisible(false);
- this.enable = false;
- this.valueOne = "";
- this.valueTwo = "";
- this.min = NaN;
- this.max = NaN;
- this._setBlueTrackWidth(0);
- },
-
- populate: function () {
- if (!isNaN(this.min) && !isNaN(this.max)) {
- this.enable = true;
- this._setVisible(true);
- this._setErrorText();
- if ((BI.isNumeric(this.valueOne) || BI.isNotEmptyString(this.valueOne)) && (BI.isNumeric(this.valueTwo) || BI.isNotEmptyString(this.valueTwo))) {
- this.labelOne.setValue(this.valueOne);
- this.labelTwo.setValue(this.valueTwo);
- this._setAllPosition(this._getPercentByValue(this.valueOne), this._getPercentByValue(this.valueTwo));
- } else {
- this.labelOne.setValue(this.min);
- this.labelTwo.setValue(this.max);
- this._setAllPosition(0, 100)
- }
- }
- }
-});
-BI.IntervalSlider.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut("bi.interval_slider", BI.IntervalSlider);/**
- * Created by zcf on 2017/3/1.
- * 万恶的IEEE-754
- * 使用字符串精确计算含小数加法、减法、乘法和10的指数倍除法,支持负数
- */
-BI.AccurateCalculationModel = BI.inherit(BI.Widget, {
- _defaultConfig: function () {
- return BI.extend(BI.AccurateCalculationModel.superclass._defaultConfig.apply(this, arguments), {
- baseCls: ""
- })
- },
-
- _init: function () {
- BI.AccurateCalculationModel.superclass._init.apply(this, arguments);
- },
-
- _getMagnitude: function (n) {
- var magnitude = "1";
- for (var i = 0; i < n; i++) {
- magnitude += "0";
- }
- return BI.parseInt(magnitude);
- },
-
- _formatDecimal: function (stringNumber1, stringNumber2) {
- if (stringNumber1.numDecimalLength === stringNumber2.numDecimalLength) {
- return;
- }
- var magnitudeDiff = stringNumber1.numDecimalLength - stringNumber2.numDecimalLength;
- if (magnitudeDiff > 0) {
- var needAddZero = stringNumber2
- } else {
- var needAddZero = stringNumber1;
- magnitudeDiff = (0 - magnitudeDiff);
- }
- for (var i = 0; i < magnitudeDiff; i++) {
- if (needAddZero.numDecimal === "0" && i === 0) {
- continue
- }
- needAddZero.numDecimal += "0"
- }
- },
-
- _stringNumberFactory: function (num) {
- var strNum = num.toString();
- var numStrArray = strNum.split(".");
- var numInteger = numStrArray[0];
- if (numStrArray.length === 1) {
- var numDecimal = "0";
- var numDecimalLength = 0;
- } else {
- var numDecimal = numStrArray[1];
- var numDecimalLength = numStrArray[1].length;
- }
- return {
- "numInteger": numInteger,
- "numDecimal": numDecimal,
- "numDecimalLength": numDecimalLength
- }
- },
-
- _accurateSubtraction: function (num1, num2) {//num1-num2 && num1>num2
- var stringNumber1 = this._stringNumberFactory(num1);
- var stringNumber2 = this._stringNumberFactory(num2);
- //整数部分计算
- var integerResult = BI.parseInt(stringNumber1.numInteger) - BI.parseInt(stringNumber2.numInteger);
- //小数部分
- this._formatDecimal(stringNumber1, stringNumber2);
- var decimalMaxLength = getDecimalMaxLength(stringNumber1, stringNumber2);
-
- if (BI.parseInt(stringNumber1.numDecimal) >= BI.parseInt(stringNumber2.numDecimal)) {
- var decimalResultTemp = (BI.parseInt(stringNumber1.numDecimal) - BI.parseInt(stringNumber2.numDecimal)).toString();
- var decimalResult = addZero(decimalResultTemp, decimalMaxLength);
- } else {//否则借位
- integerResult--;
- var borrow = this._getMagnitude(decimalMaxLength);
- var decimalResultTemp = (borrow + BI.parseInt(stringNumber1.numDecimal) - BI.parseInt(stringNumber2.numDecimal)).toString();
- var decimalResult = addZero(decimalResultTemp, decimalMaxLength);
- }
- var result = integerResult + "." + decimalResult;
- return BI.parseFloat(result);
-
- function getDecimalMaxLength(num1, num2) {
- if (num1.numDecimal.length >= num2.numDecimal.length) {
- return num1.numDecimal.length
- }
- return num2.numDecimal.length
- }
-
- function addZero(resultTemp, length) {
- var diff = length - resultTemp.length;
- for (var i = 0; i < diff; i++) {
- resultTemp = "0" + resultTemp;
- }
- return resultTemp
- }
- },
-
- _accurateAddition: function (num1, num2) {//加法结合律
- var stringNumber1 = this._stringNumberFactory(num1);
- var stringNumber2 = this._stringNumberFactory(num2);
- //整数部分计算
- var integerResult = BI.parseInt(stringNumber1.numInteger) + BI.parseInt(stringNumber2.numInteger);
- //小数部分
- this._formatDecimal(stringNumber1, stringNumber2);
-
- var decimalResult = (BI.parseInt(stringNumber1.numDecimal) + BI.parseInt(stringNumber2.numDecimal)).toString();
-
- if (decimalResult !== "0") {
- if (decimalResult.length <= stringNumber1.numDecimal.length) {
- decimalResult = addZero(decimalResult, stringNumber1.numDecimal.length)
- } else {
- integerResult++;//进一
- decimalResult = decimalResult.slice(1);
- }
- }
- var result = integerResult + "." + decimalResult;
- return BI.parseFloat(result);
-
- function addZero(resultTemp, length) {
- var diff = length - resultTemp.length;
- for (var i = 0; i < diff; i++) {
- resultTemp = "0" + resultTemp;
- }
- return resultTemp
- }
- },
-
- _accurateMultiplication: function (num1, num2) {//乘法分配律
- var stringNumber1 = this._stringNumberFactory(num1);
- var stringNumber2 = this._stringNumberFactory(num2);
- //整数部分计算
- var integerResult = BI.parseInt(stringNumber1.numInteger) * BI.parseInt(stringNumber2.numInteger);
- //num1的小数和num2的整数
- var dec1Int2 = this._accurateDivisionTenExponent(BI.parseInt(stringNumber1.numDecimal) * BI.parseInt(stringNumber2.numInteger), stringNumber1.numDecimalLength);
- //num1的整数和num2的小数
- var int1dec2 = this._accurateDivisionTenExponent(BI.parseInt(stringNumber1.numInteger) * BI.parseInt(stringNumber2.numDecimal), stringNumber2.numDecimalLength);
- //小数*小数
- var dec1dec2 = this._accurateDivisionTenExponent(BI.parseInt(stringNumber1.numDecimal) * BI.parseInt(stringNumber2.numDecimal), (stringNumber1.numDecimalLength + stringNumber2.numDecimalLength));
-
- return this._accurateAddition(this._accurateAddition(this._accurateAddition(integerResult, dec1Int2), int1dec2), dec1dec2);
- },
-
- _accurateDivisionTenExponent: function (num, n) {// num/10^n && n>0
- var stringNumber = this._stringNumberFactory(num);
- if (stringNumber.numInteger.length > n) {
- var integerResult = stringNumber.numInteger.slice(0, (stringNumber.numInteger.length - n));
- var partDecimalResult = stringNumber.numInteger.slice(-n);
- } else {
- var integerResult = "0";
- var partDecimalResult = addZero(stringNumber.numInteger, n);
- }
- var result = integerResult + "." + partDecimalResult + stringNumber.numDecimal;
- return BI.parseFloat(result);
-
- function addZero(resultTemp, length) {
- var diff = length - resultTemp.length;
- for (var i = 0; i < diff; i++) {
- resultTemp = "0" + resultTemp;
- }
- return resultTemp
- }
- },
-
- accurateSubtraction: function (num1, num2) {
- if (num1 >= 0 && num2 >= 0) {
- if (num1 >= num2) {
- return this._accurateSubtraction(num1, num2)
- }
- return -this._accurateSubtraction(num2, num1)
- }
- if (num1 >= 0 && num2 < 0) {
- return this._accurateAddition(num1, -num2)
- }
- if (num1 < 0 && num2 >= 0) {
- return -this._accurateAddition(-num1, num2)
- }
- if (num1 < 0 && num2 < 0) {
- if (num1 >= num2) {
- return this._accurateSubtraction(-num2, -num1)
- }
- return this._accurateSubtraction(-num1, -num2)
- }
- },
-
- accurateAddition: function (num1, num2) {
- if (num1 >= 0 && num2 >= 0) {
- return this._accurateAddition(num1, num2)
- }
- if (num1 >= 0 && num2 < 0) {
- return this.accurateSubtraction(num1, -num2)
- }
- if (num1 < 0 && num2 >= 0) {
- return this.accurateSubtraction(num2, -num1)
- }
- if (num1 < 0 && num2 < 0) {
- return -this._accurateAddition(-num1, -num2)
- }
- },
-
- accurateMultiplication: function (num1, num2) {
- if (num1 >= 0 && num2 >= 0) {
- return this._accurateMultiplication(num1, num2)
- }
- if (num1 >= 0 && num2 < 0) {
- return -this._accurateMultiplication(num1, -num2)
- }
- if (num1 < 0 && num2 >= 0) {
- return -this._accurateMultiplication(-num1, num2)
- }
- if (num1 < 0 && num2 < 0) {
- return this._accurateMultiplication(-num1, -num2)
- }
- },
-
- accurateDivisionTenExponent: function (num1, n) {
- if (num1 >= 0) {
- return this._accurateDivisionTenExponent(num1, n);
- }
- return -this._accurateDivisionTenExponent(-num1, n);
- }
-});/**
- * 月份下拉框
- *
- * Created by GUY on 2015/8/28.
- * @class BI.MonthCombo
- * @extends BI.Trigger
- */
-BI.MonthCombo = BI.inherit(BI.Widget, {
- _defaultConfig: function () {
- return BI.extend(BI.MonthCombo.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-month-combo",
- behaviors: {},
- height: 25
- });
- },
- _init: function () {
- BI.MonthCombo.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
-
- this.trigger = BI.createWidget({
- type: "bi.month_trigger"
- });
-
- this.trigger.on(BI.MonthTrigger.EVENT_CONFIRM, function (v) {
- if (self.combo.isViewVisible()) {
- return;
- }
- if (this.getKey() && this.getKey() !== self.storeValue) {
- self.setValue(this.getValue());
- } else if (!this.getKey()) {
- self.setValue();
- }
- self.fireEvent(BI.MonthCombo.EVENT_CONFIRM);
- });
- this.trigger.on(BI.MonthTrigger.EVENT_FOCUS, function () {
- self.storeValue = this.getKey();
- });
- this.trigger.on(BI.MonthTrigger.EVENT_START, function () {
- self.combo.hideView();
- });
- this.trigger.on(BI.MonthTrigger.EVENT_STOP, function () {
- if (!self.combo.isViewVisible()) {
- self.combo.showView();
- }
- });
-
- this.popup = BI.createWidget({
- type: "bi.month_popup",
- behaviors: o.behaviors
- });
- this.popup.on(BI.MonthPopup.EVENT_CHANGE, function () {
- self.setValue(self.popup.getValue());
- self.combo.hideView();
- self.fireEvent(BI.MonthCombo.EVENT_CONFIRM);
- });
-
- this.combo = BI.createWidget({
- type: "bi.combo",
- element: this,
- isNeedAdjustHeight: false,
- isNeedAdjustWidth: false,
- el: this.trigger,
- popup: {
- minWidth: 85,
- el: this.popup
- }
- });
- this.combo.on(BI.Combo.EVENT_BEFORE_POPUPVIEW, function () {
- self.fireEvent(BI.MonthCombo.EVENT_BEFORE_POPUPVIEW);
- });
- },
-
- setValue: function (v) {
- this.trigger.setValue(v);
- this.popup.setValue(v);
- },
-
- getValue: function () {
- return this.popup.getValue();
- }
-});
-
-BI.MonthCombo.EVENT_CONFIRM = "EVENT_CONFIRM";
-BI.MonthCombo.EVENT_BEFORE_POPUPVIEW = "EVENT_BEFORE_POPUPVIEW";
-BI.shortcut('bi.month_combo', BI.MonthCombo);/**
- * 月份展示面板
- *
- * Created by GUY on 2015/9/2.
- * @class BI.MonthPopup
- * @extends BI.Trigger
- */
-BI.MonthPopup = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.MonthPopup.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-month-popup",
- behaviors: {}
- });
- },
-
- _init: function () {
- BI.MonthPopup.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
-
- //纵向排列月
- var month = [0, 6, 1, 7, 2, 8, 3, 9, 4, 10, 5, 11];
- var items = [];
- items.push(month.slice(0, 2));
- items.push(month.slice(2, 4));
- items.push(month.slice(4, 6));
- items.push(month.slice(6, 8));
- items.push(month.slice(8, 10));
- items.push(month.slice(10, 12));
- items = BI.map(items, function (i, item) {
- return BI.map(item, function (j, td) {
- return {
- type: "bi.text_item",
- cls: "bi-list-item-active",
- textAlign: "center",
- whiteSpace: "nowrap",
- once: false,
- forceSelected: true,
- height: 23,
- width: 38,
- value: td,
- text: td + 1
- };
- });
- });
-
- this.month = BI.createWidget({
- type: "bi.button_group",
- element: this,
- behaviors: o.behaviors,
- items: BI.createItems(items, {}),
- layouts: [BI.LogicFactory.createLogic("table", BI.extend({
- dynamic: true
- }, {
- columns: 2,
- rows: 6,
- columnSize: [1 / 2, 1 / 2],
- rowSize: 25
- })), {
- type: "bi.center_adapt",
- vgap: 1,
- hgap: 2
- }]
- });
-
- this.month.on(BI.Controller.EVENT_CHANGE, function (type) {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- if (type === BI.Events.CLICK) {
- self.fireEvent(BI.MonthPopup.EVENT_CHANGE);
- }
- })
- },
-
- getValue: function () {
- return this.month.getValue()[0];
- },
-
- setValue: function (v) {
- this.month.setValue([v]);
- }
-});
-BI.MonthPopup.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut("bi.month_popup", BI.MonthPopup);/**
- * 月份trigger
- *
- * Created by GUY on 2015/8/21.
- * @class BI.MonthTrigger
- * @extends BI.Trigger
- */
-BI.MonthTrigger = BI.inherit(BI.Trigger, {
- _const: {
- hgap: 4,
- vgap: 2,
- errorText: BI.i18nText("BI-Month_Trigger_Error_Text")
- },
-
- _defaultConfig: function () {
- return BI.extend(BI.MonthTrigger.superclass._defaultConfig.apply(this, arguments), {
- extraCls: "bi-month-trigger bi-border",
- height: 24
- });
- },
- _init: function () {
- BI.MonthTrigger.superclass._init.apply(this, arguments);
- var self = this, o = this.options, c = this._const;
- this.editor = BI.createWidget({
- type: "bi.sign_editor",
- height: o.height,
- validationChecker: function (v) {
- return v === "" || (BI.isPositiveInteger(v) && v >= 1 && v <= 12);
- },
- quitChecker: function (v) {
- return false;
- },
- hgap: c.hgap,
- vgap: c.vgap,
- allowBlank: true,
- errorText: c.errorText
- });
- this.editor.on(BI.SignEditor.EVENT_FOCUS, function () {
- self.fireEvent(BI.MonthTrigger.EVENT_FOCUS);
- });
- this.editor.on(BI.SignEditor.EVENT_CHANGE, function () {
- self.fireEvent(BI.MonthTrigger.EVENT_CHANGE);
- });
- this.editor.on(BI.SignEditor.EVENT_CONFIRM, function () {
- var value = self.editor.getValue();
- if (BI.isNotNull(value)) {
- self.editor.setValue(value);
- self.editor.setTitle(value);
- }
- self.fireEvent(BI.MonthTrigger.EVENT_CONFIRM);
- });
- this.editor.on(BI.SignEditor.EVENT_SPACE, function () {
- if (self.editor.isValid()) {
- self.editor.blur();
- }
- });
- this.editor.on(BI.SignEditor.EVENT_START, function () {
- self.fireEvent(BI.MonthTrigger.EVENT_START);
- });
- this.editor.on(BI.SignEditor.EVENT_STOP, function () {
- self.fireEvent(BI.MonthTrigger.EVENT_STOP);
- });
- BI.createWidget({
- element: this,
- type: 'bi.htape',
- items: [
- {
- el: this.editor
- }, {
- el: {
- type: "bi.text_button",
- text: BI.i18nText("BI-Multi_Date_Month"),
- baseCls: "bi-trigger-month-text",
- width: o.height
- },
- width: o.height
- }, {
- el: {
- type: "bi.trigger_icon_button",
- width: o.height
- },
- width: o.height
- }
- ]
- });
- },
- setValue: function (v) {
- if(BI.isNotNull(v)){
- this.editor.setState(v + 1);
- this.editor.setValue(v + 1);
- this.editor.setTitle(v + 1);
- return;
- }
- this.editor.setState("");
- this.editor.setValue("");
- this.editor.setTitle("");
- },
- getKey: function () {
- return this.editor.getValue() | 0;
- },
- getValue: function () {
- return this.editor.getValue() - 1;
- }
-});
-BI.MonthTrigger.EVENT_FOCUS = "EVENT_FOCUS";
-BI.MonthTrigger.EVENT_CONFIRM = "EVENT_CONFIRM";
-BI.MonthTrigger.EVENT_START = "EVENT_START";
-BI.MonthTrigger.EVENT_STOP = "EVENT_STOP";
-BI.MonthTrigger.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut("bi.month_trigger", BI.MonthTrigger);/**
- * 普通控件
- *
- * @class BI.MultiDateCard
- * @extends BI.Widget
- * @abstract
- */
-BI.MultiDateCard = BI.inherit(BI.Widget, {
-
- constants: {
- lgap: 80,
- itemHeight: 35,
- defaultEditorValue: "1"
- },
-
- _defaultConfig: function () {
- return $.extend(BI.MultiDateCard.superclass._defaultConfig.apply(this, arguments), {});
- },
-
- dateConfig: function () {
-
- },
-
- defaultSelectedItem: function () {
-
- },
-
- _init: function () {
- BI.MultiDateCard.superclass._init.apply(this, arguments);
- var self = this, opts = this.options;
-
- this.label = BI.createWidget({
- type: 'bi.label',
- height: this.constants.itemHeight,
- textAlign: "left",
- text: BI.i18nText("BI-Multi_Date_Relative_Current_Time"),
- cls: 'bi-multidate-inner-label bi-tips'
- });
- this.radioGroup = BI.createWidget({
- type: "bi.button_group",
- chooseType: 0,
- items: BI.createItems(this.dateConfig(), {
- type: 'bi.multidate_segment',
- height: this.constants.itemHeight
- }),
- layouts: [{
- type: "bi.vertical"
- }]
- });
-
- this.radioGroup.on(BI.Controller.EVENT_CHANGE, function (type) {
- if (type === BI.Events.CONFIRM) {
- self.fireEvent(BI.MultiDateCard.EVENT_CHANGE);
- }
- });
- this.radioGroup.on(BI.ButtonGroup.EVENT_CHANGE, function () {
- self.setValue(self.getValue());
- self.fireEvent(BI.MultiDateCard.EVENT_CHANGE);
- });
- BI.createWidget({
- element: this,
- type: 'bi.center_adapt',
- lgap: this.constants.lgap,
- items: [{
- type: 'bi.vertical',
- items: [this.label, this.radioGroup]
- }]
- });
- },
-
- getValue: function () {
- var button = this.radioGroup.getSelectedButtons()[0];
- var type = button.getValue(), value = button.getInputValue();
- return {
- type: type,
- value: value
- }
- },
-
- _isTypeAvaliable: function (type) {
- var res = false;
- BI.find(this.dateConfig(), function (i, item) {
- if (item.value === type) {
- res = true;
- return true;
- }
- });
- return res;
- },
-
- setValue: function (v) {
- var self = this;
- if (BI.isNotNull(v) && this._isTypeAvaliable(v.type)) {
- this.radioGroup.setValue(v.type);
- BI.each(this.radioGroup.getAllButtons(), function (i, button) {
- if (button.isEditorExist() === true && button.isSelected()) {
- button.setInputValue(v.value);
- } else {
- button.setInputValue(self.constants.defaultEditorValue);
- }
- });
- } else {
- this.radioGroup.setValue(this.defaultSelectedItem());
- BI.each(this.radioGroup.getAllButtons(), function (i, button) {
- button.setInputValue(self.constants.defaultEditorValue);
- });
- }
- },
-
- getCalculationValue: function () {
- var valueObject = this.getValue();
- var type = valueObject.type, value = valueObject.value;
- switch (type) {
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_DAY_PREV:
- return Date.getDate().getOffsetDate(-1 * value);
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_DAY_AFTER:
- return Date.getDate().getOffsetDate(value);
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_DAY_TODAY:
- return Date.getDate();
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_MONTH_PREV:
- return Date.getDate().getBeforeMultiMonth(value);
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_MONTH_AFTER:
- return Date.getDate().getAfterMultiMonth(value);
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_MONTH_BEGIN:
- return Date.getDate(Date.getDate().getFullYear(), Date.getDate().getMonth(), 1);
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_MONTH_END:
- return Date.getDate(Date.getDate().getFullYear(), Date.getDate().getMonth(), (Date.getDate().getLastDateOfMonth()).getDate());
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_QUARTER_PREV:
- return Date.getDate().getBeforeMulQuarter(value);
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_QUARTER_AFTER:
- return Date.getDate().getAfterMulQuarter(value);
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_QUARTER_BEGIN:
- return Date.getDate().getQuarterStartDate();
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_QUARTER_END:
- return Date.getDate().getQuarterEndDate();
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_WEEK_PREV:
- return Date.getDate().getOffsetDate(-7 * value);
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_WEEK_AFTER:
- return Date.getDate().getOffsetDate(7 * value);
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_YEAR_PREV:
- return Date.getDate((Date.getDate().getFullYear() - 1 * value), Date.getDate().getMonth(), Date.getDate().getDate());
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_YEAR_AFTER:
- return Date.getDate((Date.getDate().getFullYear() + 1 * value), Date.getDate().getMonth(), Date.getDate().getDate());
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_YEAR_BEGIN:
- return Date.getDate(Date.getDate().getFullYear(), 0, 1);
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_YEAR_END:
- return Date.getDate(Date.getDate().getFullYear(), 11, 31);
- }
- }
-});
-BI.MultiDateCard.EVENT_CHANGE = "EVENT_CHANGE";
-/**
- * 日期控件
- * @class BI.MultiDateCombo
- * @extends BI.Widget
- */
-BI.MultiDateCombo = BI.inherit(BI.Single, {
- constants: {
- popupHeight: 259,
- popupWidth: 270,
- comboAdjustHeight: 1,
- border: 1,
- DATE_MIN_VALUE: "1900-01-01",
- DATE_MAX_VALUE: "2099-12-31"
- },
- _defaultConfig: function () {
- return BI.extend(BI.MultiDateCombo.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-multidate-combo bi-border',
- height: 24
- });
- },
- _init: function () {
- BI.MultiDateCombo.superclass._init.apply(this, arguments);
- var self = this, opts = this.options;
- this.storeTriggerValue = "";
- var date = Date.getDate();
- this.storeValue = null;
- this.trigger = BI.createWidget({
- type: 'bi.date_trigger',
- min: this.constants.DATE_MIN_VALUE,
- max: this.constants.DATE_MAX_VALUE
- });
- this.trigger.on(BI.DateTrigger.EVENT_KEY_DOWN, function () {
- if (self.combo.isViewVisible()) {
- self.combo.hideView();
- }
- });
- this.trigger.on(BI.DateTrigger.EVENT_STOP, function () {
- if (!self.combo.isViewVisible()) {
- self.combo.showView();
- }
- });
- this.trigger.on(BI.DateTrigger.EVENT_TRIGGER_CLICK, function () {
- self.combo.toggle();
- });
- this.trigger.on(BI.DateTrigger.EVENT_FOCUS, function () {
- self.storeTriggerValue = self.trigger.getKey();
- if (!self.combo.isViewVisible()) {
- self.combo.showView();
- }
- self.fireEvent(BI.MultiDateCombo.EVENT_FOCUS);
- });
- this.trigger.on(BI.DateTrigger.EVENT_ERROR, function () {
- self.storeValue = {
- year: date.getFullYear(),
- month: date.getMonth()
- };
- self.popup.setValue();
- self.fireEvent(BI.MultiDateCombo.EVENT_ERROR);
- });
- this.trigger.on(BI.DateTrigger.EVENT_VALID, function () {
- self.fireEvent(BI.MultiDateCombo.EVENT_VALID);
- });
- this.trigger.on(BI.DateTrigger.EVENT_CHANGE, function () {
- self.fireEvent(BI.MultiDateCombo.EVENT_CHANGE);
- });
- this.trigger.on(BI.DateTrigger.EVENT_CONFIRM, function () {
- if (self.combo.isViewVisible()) {
- return;
- }
- var dateStore = self.storeTriggerValue;
- var dateObj = self.trigger.getKey();
- if (BI.isNotEmptyString(dateObj) && !BI.isEqual(dateObj, dateStore)) {
- self.storeValue = self.trigger.getValue();
- self.setValue(self.trigger.getValue());
- } else if (BI.isEmptyString(dateObj)) {
- self.storeValue = null;
- self.trigger.setValue();
- }
- self.fireEvent(BI.MultiDateCombo.EVENT_CONFIRM);
- });
- this.popup = BI.createWidget({
- type: "bi.multidate_popup",
- min: this.constants.DATE_MIN_VALUE,
- max: this.constants.DATE_MAX_VALUE
- });
- this.popup.on(BI.MultiDatePopup.BUTTON_CLEAR_EVENT_CHANGE, function () {
- self.setValue();
- self.combo.hideView();
- self.fireEvent(BI.MultiDateCombo.EVENT_CONFIRM);
- });
- this.popup.on(BI.MultiDatePopup.BUTTON_lABEL_EVENT_CHANGE, function () {
- var date = Date.getDate();
- self.setValue({
- year: date.getFullYear(),
- month: date.getMonth(),
- day: date.getDate()
- });
- self.combo.hideView();
- self.fireEvent(BI.MultiDateCombo.EVENT_CONFIRM);
- });
- this.popup.on(BI.MultiDatePopup.BUTTON_OK_EVENT_CHANGE, function () {
- self.setValue(self.popup.getValue());
- self.combo.hideView();
- self.fireEvent(BI.MultiDateCombo.EVENT_CONFIRM);
- });
- this.popup.on(BI.MultiDatePopup.CALENDAR_EVENT_CHANGE, function () {
- self.setValue(self.popup.getValue());
- self.combo.hideView();
- //self.fireEvent(BI.MultiDateCombo.EVENT_CHANGE);
- self.fireEvent(BI.MultiDateCombo.EVENT_CONFIRM);
- });
- this.combo = BI.createWidget({
- type: 'bi.combo',
- toggle: false,
- isNeedAdjustHeight: false,
- isNeedAdjustWidth: false,
- el: this.trigger,
- adjustLength: this.constants.comboAdjustHeight,
- popup: {
- el: this.popup,
- maxHeight: this.constants.popupHeight,
- width: this.constants.popupWidth,
- stopPropagation: false
- }
- });
- this.combo.on(BI.Combo.EVENT_BEFORE_POPUPVIEW, function () {
- self.popup.setValue(self.storeValue);
- self.fireEvent(BI.MultiDateCombo.EVENT_BEFORE_POPUPVIEW);
- });
-
- var triggerBtn = BI.createWidget({
- type: "bi.icon_button",
- cls: "bi-trigger-icon-button date-font",
- width: 24,
- height: 24
- });
- triggerBtn.on(BI.TriggerIconButton.EVENT_CHANGE, function () {
- if (self.combo.isViewVisible()) {
- self.combo.hideView();
- } else {
- self.combo.showView();
- }
- });
- this.changeIcon = BI.createWidget({
- type: "bi.icon_button",
- cls: "bi-trigger-icon-button date-change-h-font",
- width: 24,
- height: 24
- });
-
-
- var leftPart = BI.createWidget({
- type: "bi.absolute",
- items: [{
- el: this.combo,
- top: 0,
- left: 0,
- right: 0,
- bottom: 0
- }, {
- el: triggerBtn,
- top: 0,
- left: 0
- }]
- });
-
- BI.createWidget({
- type: "bi.htape",
- element: this,
- items: [leftPart, {
- el: this.changeIcon,
- width: 30
- }],
- ref: function (_ref) {
- self.comboWrapper = _ref;
- }
- })
- },
-
- _checkDynamicValue: function (v) {
- var type = null;
- if (BI.isNotNull(v)) {
- type = v.type
- }
- switch (type) {
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_YEAR_PREV:
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_YEAR_AFTER:
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_YEAR_BEGIN:
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_YEAR_END:
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_QUARTER_PREV:
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_QUARTER_AFTER:
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_QUARTER_BEGIN:
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_QUARTER_END:
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_MONTH_PREV:
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_MONTH_AFTER:
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_MONTH_BEGIN:
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_MONTH_END:
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_WEEK_PREV:
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_WEEK_AFTER:
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_DAY_PREV:
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_DAY_AFTER:
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_DAY_TODAY:
- this.changeIcon.setVisible(true);
- this.comboWrapper.attr("items")[1].width = 30;
- this.comboWrapper.resize();
- break;
- default:
- this.comboWrapper.attr("items")[1].width = 0;
- this.comboWrapper.resize();
- this.changeIcon.setVisible(false);
- break;
- }
- },
-
- setValue: function (v) {
- this.storeValue = v;
- this.popup.setValue(v);
- this.trigger.setValue(v);
- this._checkDynamicValue(v)
- },
- getValue: function () {
- return this.storeValue;
- },
- getKey: function () {
- return this.trigger.getKey();
- },
- hidePopupView: function () {
- this.combo.hideView();
- }
-});
-BI.shortcut('bi.multidate_combo', BI.MultiDateCombo);
-
-BI.MultiDateCombo.EVENT_CONFIRM = "EVENT_CONFIRM";
-BI.MultiDateCombo.EVENT_FOCUS = "EVENT_FOCUS";
-BI.MultiDateCombo.EVENT_CHANGE = "EVENT_CHANGE";
-BI.MultiDateCombo.EVENT_VALID = "EVENT_VALID";
-BI.MultiDateCombo.EVENT_ERROR = "EVENT_ERROR";
-BI.MultiDateCombo.EVENT_BEFORE_POPUPVIEW = "BI.MultiDateCombo.EVENT_BEFORE_POPUPVIEW";
-
-BI.extend(BI.MultiDateCombo, {
- MULTI_DATE_YMD_CARD: 1,
- MULTI_DATE_YEAR_CARD: 2,
- MULTI_DATE_QUARTER_CARD: 3,
- MULTI_DATE_MONTH_CARD: 4,
- MULTI_DATE_WEEK_CARD: 5,
- MULTI_DATE_DAY_CARD: 6
-});
-
-BI.extend(BI.MultiDateCombo, {
- DATE_TYPE: {
- MULTI_DATE_YEAR_PREV: 1,
- MULTI_DATE_YEAR_AFTER: 2,
- MULTI_DATE_YEAR_BEGIN: 3,
- MULTI_DATE_YEAR_END: 4,
- MULTI_DATE_MONTH_PREV: 5,
- MULTI_DATE_MONTH_AFTER: 6,
- MULTI_DATE_MONTH_BEGIN: 7,
- MULTI_DATE_MONTH_END: 8,
- MULTI_DATE_QUARTER_PREV: 9,
- MULTI_DATE_QUARTER_AFTER: 10,
- MULTI_DATE_QUARTER_BEGIN: 11,
- MULTI_DATE_QUARTER_END: 12,
- MULTI_DATE_WEEK_PREV: 13,
- MULTI_DATE_WEEK_AFTER: 14,
- MULTI_DATE_DAY_PREV: 15,
- MULTI_DATE_DAY_AFTER: 16,
- MULTI_DATE_DAY_TODAY: 17,
- MULTI_DATE_PARAM: 18,
- MULTI_DATE_CALENDAR: 19,
- YEAR_QUARTER: 20,
- YEAR_MONTH: 21,
- YEAR_WEEK: 22,
- YEAR_DAY: 23,
- MONTH_WEEK: 24,
- MONTH_DAY: 25,
- YEAR: 26,
- SAME_PERIOD: 27,
- LAST_SAME_PERIOD: 28
- }
-});
-/**
- * 普通控件
- *
- * @class BI.DayCard
- * @extends BI.MultiDateCard
- */
-BI.DayCard = BI.inherit(BI.MultiDateCard, {
-
- _defaultConfig: function () {
- return $.extend(BI.DayCard.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-multidate-daycard'
- });
- },
-
- _init: function () {
- BI.DayCard.superclass._init.apply(this, arguments);
- },
-
- dateConfig: function () {
- return [{
- isEditorExist: true,
- selected: true,
- text: BI.i18nText("BI-Multi_Date_Day_Prev"),
- value: BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_DAY_PREV
- },
- {
- isEditorExist: true,
- text: BI.i18nText("BI-Multi_Date_Day_Next"),
- value: BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_DAY_AFTER
- },
- {
- isEditorExist: false,
- value: BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_DAY_TODAY,
- text: BI.i18nText("BI-Multi_Date_Today")
- }];
- },
-
- defaultSelectedItem: function () {
- return BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_DAY_PREV
- }
-});
-BI.DayCard.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut('bi.daycard', BI.DayCard);
-/**
- * 普通控件
- *
- * @class BI.MonthCard
- * @extends BI.MultiDateCard
- */
-BI.MonthCard = BI.inherit(BI.MultiDateCard, {
- _defaultConfig: function () {
- return $.extend(BI.MonthCard.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-multidate-monthcard'
- });
- },
-
- _init: function () {
- BI.MonthCard.superclass._init.apply(this, arguments);
- },
-
- dateConfig: function () {
- return [{
- selected: true,
- isEditorExist: true,
- value: BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_MONTH_PREV,
- text: BI.i18nText("BI-Multi_Date_Month_Prev")
- },
- {
- isEditorExist: true,
- value: BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_MONTH_AFTER,
- text: BI.i18nText("BI-Multi_Date_Month_Next")
- },
- {
- value: BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_MONTH_BEGIN,
- isEditorExist: false,
- text: BI.i18nText("BI-Multi_Date_Month_Begin")
- },
- {
- value: BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_MONTH_END,
- isEditorExist: false,
- text: BI.i18nText("BI-Multi_Date_Month_End")
- }];
- },
-
- defaultSelectedItem: function () {
- return BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_MONTH_PREV;
- }
-});
-BI.MonthCard.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut('bi.monthcard', BI.MonthCard);
-/**
- * 日期控件
- * @class BI.MultiDatePopup
- * @extends BI.Widget
- */
-BI.MultiDatePopup = BI.inherit(BI.Widget, {
- constants: {
- tabHeight: 30,
- tabWidth: 42,
- titleHeight: 27,
- itemHeight: 30,
- triggerHeight: 24,
- buttonWidth: 90,
- buttonHeight: 25,
- cardHeight: 229,
- cardWidth: 270,
- popupHeight: 259,
- popupWidth: 270,
- comboAdjustHeight: 1,
- ymdWidth: 58,
- lgap: 2,
- border: 1
- },
- _defaultConfig: function () {
- return BI.extend(BI.MultiDatePopup.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-multidate-popup',
- width: 268,
- height: 260
- });
- },
- _init: function () {
- BI.MultiDatePopup.superclass._init.apply(this, arguments);
- var self = this, opts = this.options;
- this.storeValue = "";
- this.textButton = BI.createWidget({
- type: 'bi.text_button',
- forceCenter: true,
- cls: 'bi-multidate-popup-label bi-border-left bi-border-right bi-border-top',
- shadow: true,
- text: BI.i18nText("BI-Multi_Date_Today")
- });
- this.textButton.on(BI.TextButton.EVENT_CHANGE, function () {
- self.fireEvent(BI.MultiDatePopup.BUTTON_lABEL_EVENT_CHANGE);
- });
- this.clearButton = BI.createWidget({
- type: "bi.text_button",
- forceCenter: true,
- cls: 'bi-multidate-popup-button bi-border-top',
- shadow: true,
- text: BI.i18nText("BI-Basic_Clear")
- });
- this.clearButton.on(BI.TextButton.EVENT_CHANGE, function () {
- self.fireEvent(BI.MultiDatePopup.BUTTON_CLEAR_EVENT_CHANGE);
- });
- this.okButton = BI.createWidget({
- type: "bi.text_button",
- forceCenter: true,
- cls: 'bi-multidate-popup-button bi-border-top',
- shadow: true,
- text: BI.i18nText("BI-Basic_OK")
- });
- this.okButton.on(BI.TextButton.EVENT_CHANGE, function () {
- self.fireEvent(BI.MultiDatePopup.BUTTON_OK_EVENT_CHANGE);
- });
- this.dateTab = BI.createWidget({
- type: 'bi.tab',
- tab: {
- cls: "bi-multidate-popup-tab bi-border-bottom",
- height: this.constants.tabHeight,
- items: BI.createItems([{
- text: BI.i18nText("BI-Multi_Date_YMD"),
- value: BI.MultiDateCombo.MULTI_DATE_YMD_CARD,
- width: this.constants.ymdWidth
- }, {
- text: BI.i18nText("BI-Multi_Date_Year"),
- value: BI.MultiDateCombo.MULTI_DATE_YEAR_CARD
- }, {
- text: BI.i18nText("BI-Multi_Date_Quarter"),
- value: BI.MultiDateCombo.MULTI_DATE_QUARTER_CARD
- }, {
- text: BI.i18nText("BI-Multi_Date_Month"),
- value: BI.MultiDateCombo.MULTI_DATE_MONTH_CARD
- }, {
- text: BI.i18nText("BI-Multi_Date_Week"),
- value: BI.MultiDateCombo.MULTI_DATE_WEEK_CARD
- }, {
- text: BI.i18nText("BI-Multi_Date_Day"),
- value: BI.MultiDateCombo.MULTI_DATE_DAY_CARD
- }], {
- width: this.constants.tabWidth,
- textAlign: "center",
- height: this.constants.itemHeight,
- cls: 'bi-multidate-popup-item bi-list-item-active'
- }),
- layouts: [{
- type: 'bi.left'
- }]
- },
- cardCreator: function (v) {
- switch (v) {
- case BI.MultiDateCombo.MULTI_DATE_YMD_CARD:
- self.ymd = BI.createWidget({
- type: "bi.date_calendar_popup",
- min: self.options.min,
- max: self.options.max
- });
- self.ymd.on(BI.DateCalendarPopup.EVENT_CHANGE, function () {
- self.fireEvent(BI.MultiDatePopup.CALENDAR_EVENT_CHANGE);
- });
- return self.ymd;
- case BI.MultiDateCombo.MULTI_DATE_YEAR_CARD:
- self.year = BI.createWidget({
- type: "bi.yearcard"
- });
- self.year.on(BI.MultiDateCard.EVENT_CHANGE, function (v) {
- self._setInnerValue(self.year, v);
- });
- return self.year;
- case BI.MultiDateCombo.MULTI_DATE_QUARTER_CARD:
- self.quarter = BI.createWidget({
- type: 'bi.quartercard'
- });
- self.quarter.on(BI.MultiDateCard.EVENT_CHANGE, function (v) {
- self._setInnerValue(self.quarter, v);
- });
- return self.quarter;
- case BI.MultiDateCombo.MULTI_DATE_MONTH_CARD:
- self.month = BI.createWidget({
- type: 'bi.monthcard'
- });
- self.month.on(BI.MultiDateCard.EVENT_CHANGE, function (v) {
- self._setInnerValue(self.month, v);
- });
- return self.month;
- case BI.MultiDateCombo.MULTI_DATE_WEEK_CARD:
- self.week = BI.createWidget({
- type: 'bi.weekcard'
- });
- self.week.on(BI.MultiDateCard.EVENT_CHANGE, function (v) {
- self._setInnerValue(self.week, v);
- });
- return self.week;
- case BI.MultiDateCombo.MULTI_DATE_DAY_CARD:
- self.day = BI.createWidget({
- type: 'bi.daycard'
- });
- self.day.on(BI.MultiDateCard.EVENT_CHANGE, function (v) {
- self._setInnerValue(self.day, v);
- });
- return self.day;
- }
- }
- });
- this.dateTab.setSelect(BI.MultiDateCombo.MULTI_DATE_YMD_CARD);
- this.cur = BI.MultiDateCombo.MULTI_DATE_YMD_CARD;
- this.dateTab.on(BI.Tab.EVENT_CHANGE, function () {
- var v = self.dateTab.getSelect();
- switch (v) {
- case BI.MultiDateCombo.MULTI_DATE_YMD_CARD:
- var date = this.getTab(self.cur).getCalculationValue();
- self.ymd.setValue({
- year: date.getFullYear(),
- month: date.getMonth(),
- day: date.getDate()
- });
- self._setInnerValue(self.ymd);
- break;
- case BI.MultiDateCombo.MULTI_DATE_YEAR_CARD:
- self.year.setValue(self.storeValue);
- self._setInnerValue(self.year);
- break;
- case BI.MultiDateCombo.MULTI_DATE_QUARTER_CARD:
- self.quarter.setValue(self.storeValue);
- self._setInnerValue(self.quarter);
- break;
- case BI.MultiDateCombo.MULTI_DATE_MONTH_CARD:
- self.month.setValue(self.storeValue);
- self._setInnerValue(self.month);
- break;
- case BI.MultiDateCombo.MULTI_DATE_WEEK_CARD:
- self.week.setValue(self.storeValue);
- self._setInnerValue(self.week);
- break;
- case BI.MultiDateCombo.MULTI_DATE_DAY_CARD:
- self.day.setValue(self.storeValue);
- self._setInnerValue(self.day);
- break;
- }
- self.cur = v;
- });
- this.dateButton = BI.createWidget({
- type: "bi.grid",
- items: [[this.clearButton, this.textButton, this.okButton]]
- });
- BI.createWidget({
- element: this,
- type: "bi.vtape",
- items: [{
- el: this.dateTab
- }, {
- el: this.dateButton,
- height: 30
- }]
- });
- },
- _setInnerValue: function (obj) {
- if (this.dateTab.getSelect() === BI.MultiDateCombo.MULTI_DATE_YMD_CARD) {
- this.textButton.setValue(BI.i18nText("BI-Multi_Date_Today"));
- this.textButton.setEnable(true);
- } else {
- var date = obj.getCalculationValue();
- date = date.print("%Y-%x-%e");
- this.textButton.setValue(date);
- this.textButton.setEnable(false);
- }
- },
-
- _checkValueValid: function (value) {
- return BI.isNull(value) || BI.isEmptyObject(value) || BI.isEmptyString(value);
- },
-
- setValue: function (v) {
- this.storeValue = v;
- var self = this, date;
- var type, value;
- if (BI.isNotNull(v)) {
- type = v.type || BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_CALENDAR;
- value = v.value;
- if (BI.isNull(value)) {
- value = v;
- }
- }
- switch (type) {
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_YEAR_PREV:
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_YEAR_AFTER:
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_YEAR_BEGIN:
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_YEAR_END:
- this.dateTab.setSelect(BI.MultiDateCombo.MULTI_DATE_YEAR_CARD);
- this.year.setValue({type: type, value: value});
- this.cur = BI.MultiDateCombo.MULTI_DATE_YEAR_CARD;
- self._setInnerValue(this.year);
- break;
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_QUARTER_PREV:
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_QUARTER_AFTER:
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_QUARTER_BEGIN:
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_QUARTER_END:
- this.dateTab.setSelect(BI.MultiDateCombo.MULTI_DATE_QUARTER_CARD);
- this.cur = BI.MultiDateCombo.MULTI_DATE_QUARTER_CARD;
- this.quarter.setValue({type: type, value: value});
- self._setInnerValue(this.quarter);
- break;
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_MONTH_PREV:
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_MONTH_AFTER:
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_MONTH_BEGIN:
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_MONTH_END:
- this.dateTab.setSelect(BI.MultiDateCombo.MULTI_DATE_MONTH_CARD);
- this.cur = BI.MultiDateCombo.MULTI_DATE_MONTH_CARD;
- this.month.setValue({type: type, value: value});
- self._setInnerValue(this.month);
- break;
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_WEEK_PREV:
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_WEEK_AFTER:
- this.dateTab.setSelect(BI.MultiDateCombo.MULTI_DATE_WEEK_CARD);
- this.cur = BI.MultiDateCombo.MULTI_DATE_WEEK_CARD;
- this.week.setValue({type: type, value: value});
- self._setInnerValue(this.week);
- break;
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_DAY_PREV:
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_DAY_AFTER:
- case BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_DAY_TODAY:
- this.dateTab.setSelect(BI.MultiDateCombo.MULTI_DATE_DAY_CARD);
- this.cur = BI.MultiDateCombo.MULTI_DATE_DAY_CARD;
- this.day.setValue({type: type, value: value});
- self._setInnerValue(this.day);
- break;
- default:
- if (this._checkValueValid(value)) {
- var date = Date.getDate();
- this.dateTab.setSelect(BI.MultiDateCombo.MULTI_DATE_YMD_CARD);
- this.ymd.setValue({
- year: date.getFullYear(),
- month: date.getMonth(),
- day: date.getDate()
- });
- this.textButton.setValue(BI.i18nText("BI-Multi_Date_Today"));
- } else {
- this.dateTab.setSelect(BI.MultiDateCombo.MULTI_DATE_YMD_CARD);
- this.ymd.setValue(value);
- this.textButton.setValue(BI.i18nText("BI-Multi_Date_Today"));
- }
- this.textButton.setEnable(true);
- break;
- }
- },
- getValue: function () {
- var tab = this.dateTab.getSelect();
- switch (tab) {
- case BI.MultiDateCombo.MULTI_DATE_YMD_CARD:
- return this.ymd.getValue();
- case BI.MultiDateCombo.MULTI_DATE_YEAR_CARD:
- return this.year.getValue();
- case BI.MultiDateCombo.MULTI_DATE_QUARTER_CARD:
- return this.quarter.getValue();
- case BI.MultiDateCombo.MULTI_DATE_MONTH_CARD:
- return this.month.getValue();
- case BI.MultiDateCombo.MULTI_DATE_WEEK_CARD:
- return this.week.getValue();
- case BI.MultiDateCombo.MULTI_DATE_DAY_CARD:
- return this.day.getValue();
- }
- }
-});
-BI.MultiDatePopup.BUTTON_OK_EVENT_CHANGE = "BUTTON_OK_EVENT_CHANGE";
-BI.MultiDatePopup.BUTTON_lABEL_EVENT_CHANGE = "BUTTON_lABEL_EVENT_CHANGE";
-BI.MultiDatePopup.BUTTON_CLEAR_EVENT_CHANGE = "BUTTON_CLEAR_EVENT_CHANGE";
-BI.MultiDatePopup.CALENDAR_EVENT_CHANGE = "CALENDAR_EVENT_CHANGE";
-BI.shortcut('bi.multidate_popup', BI.MultiDatePopup);
-/**
- * 普通控件
- *
- * @class BI.QuarterCard
- * @extends BI.MultiDateCard
- */
-BI.QuarterCard = BI.inherit(BI.MultiDateCard, {
-
- _defaultConfig: function () {
- return $.extend(BI.QuarterCard.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-multidate-quartercard'
- });
- },
-
- _init: function () {
- BI.QuarterCard.superclass._init.apply(this, arguments);
- },
-
- dateConfig: function () {
- return [{
- selected: true,
- value: BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_QUARTER_PREV,
- isEditorExist: true,
- text: BI.i18nText("BI-Multi_Date_Quarter_Prev")
- },
- {
- value: BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_QUARTER_AFTER,
- isEditorExist: true,
- text: BI.i18nText("BI-Multi_Date_Quarter_Next")
- },
- {
- value: BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_QUARTER_BEGIN,
- isEditorExist: false,
- text: BI.i18nText("BI-Multi_Date_Quarter_Begin")
- },
- {
- value: BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_QUARTER_END,
- isEditorExist: false,
- text: BI.i18nText("BI-Multi_Date_Quarter_End")
- }]
- },
-
- defaultSelectedItem: function () {
- return BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_QUARTER_PREV;
- }
-});
-BI.QuarterCard.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut('bi.quartercard', BI.QuarterCard);
-/**
- * 普通控件
- *
- * @class BI.MultiDateSegment
- * @extends BI.Single
- */
-BI.MultiDateSegment = BI.inherit(BI.Single, {
- constants: {
- itemHeight: 24,
- maxGap: 15,
- minGap: 10,
- textWidth: 60,
- defaultEditorValue: "1"
- },
-
- _defaultConfig: function () {
- return $.extend(BI.MultiDateSegment.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-multidate-segment',
- text: "",
- height: 30,
- isEditorExist: true,
- selected: false,
- defaultEditorValue: "1"
- });
- },
-
- _init: function () {
- BI.MultiDateSegment.superclass._init.apply(this, arguments);
- var self = this, opts = this.options;
- this.radio = BI.createWidget({
- type: "bi.radio",
- selected: opts.selected
- });
- this.radio.on(BI.Controller.EVENT_CHANGE, function (v) {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
- this.textEditor = BI.createWidget({
- type: 'bi.text_editor',
- value: this.constants.defaultEditorValue,
- title: function () {
- return self.textEditor.getValue();
- },
- tipType: "success",
- cls: 'bi-multidate-editor',
- width: this.constants.textWidth,
- height: this.constants.itemHeight
- });
- this.textEditor.on(BI.Controller.EVENT_CHANGE, function (v) {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
- this.text = BI.createWidget({
- type: "bi.label",
- textAlign: "left",
- cls: 'bi-multidate-normal-label',
- text: opts.text,
- height: this.constants.itemHeight
- });
- this._createSegment();
- },
- _createSegment: function () {
- if (this.options.isEditorExist === true) {
- return BI.createWidget({
- element: this,
- type: 'bi.left',
- items: [{
- el: {
- type: "bi.center_adapt",
- items: [this.radio],
- height: this.constants.itemHeight
- },
- lgap: 0
- },
- {
- el: {
- type: "bi.center_adapt",
- items: [this.textEditor],
- widgetName: 'textEditor'
- },
- lgap: this.constants.maxGap
- },
- {
- el: this.text,
- lgap: this.constants.minGap
- }]
- });
- }
- return BI.createWidget({
- element: this,
- type: 'bi.left',
- items: [{
- el: {
- type: "bi.center_adapt",
- items: [this.radio],
- height: this.constants.itemHeight
- },
- lgap: 0
- },
- {
- el: this.text,
- lgap: this.constants.maxGap
- }]
- })
- },
- setSelected: function (v) {
- if (BI.isNotNull(this.radio)) {
- this.radio.setSelected(v);
- this.textEditor.setEnable(v);
- }
- },
- isSelected: function () {
- return this.radio.isSelected();
- },
- getValue: function () {
- return this.options.value;
- },
- getInputValue: function () {
- return this.textEditor.getValue() | 0;
- },
- setInputValue: function (v) {
- this.textEditor.setValue(v);
- },
- isEditorExist: function () {
- return this.options.isEditorExist;
- }
-});
-BI.MultiDateSegment.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut('bi.multidate_segment', BI.MultiDateSegment);/**
- * 普通控件
- *
- * @class BI.WeekCard
- * @extends BI.MultiDateCard
- */
-BI.WeekCard = BI.inherit(BI.MultiDateCard, {
- _defaultConfig: function () {
- return $.extend(BI.WeekCard.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-multidate-weekcard'
- });
- },
-
- _init: function () {
- BI.WeekCard.superclass._init.apply(this, arguments);
- },
-
- dateConfig: function () {
- return [{
- selected: true,
- isEditorExist: true,
- text: BI.i18nText("BI-Multi_Date_Week_Prev"),
- value: BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_WEEK_PREV
- },
- {
- isEditorExist: true,
- text: BI.i18nText("BI-Multi_Date_Week_Next"),
- value: BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_WEEK_AFTER
- }];
- },
-
- defaultSelectedItem: function () {
- return BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_WEEK_PREV;
- }
-});
-BI.WeekCard.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut('bi.weekcard', BI.WeekCard);
-/**
- * 普通控件
- *
- * @class BI.YearCard
- * @extends BI.MultiDateCard
- */
-BI.YearCard = BI.inherit(BI.MultiDateCard, {
- _defaultConfig: function () {
- return $.extend(BI.YearCard.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-multidate-yearcard'
- });
- },
-
- _init: function () {
- BI.YearCard.superclass._init.apply(this, arguments);
- },
-
- dateConfig: function () {
- return [{
- selected: true,
- isEditorExist: true,
- text: BI.i18nText("BI-Multi_Date_Year_Prev"),
- value: BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_YEAR_PREV
- },
- {
- isEditorExist: true,
- text: BI.i18nText("BI-Multi_Date_Year_Next"),
- value: BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_YEAR_AFTER
- },
- {
- isEditorExist: false,
- value: BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_YEAR_BEGIN,
- text: BI.i18nText("BI-Multi_Date_Year_Begin")
- },
- {
- isEditorExist: false,
- value: BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_YEAR_END,
- text: BI.i18nText("BI-Multi_Date_Year_End")
- }]
- },
-
- defaultSelectedItem: function () {
- return BI.MultiDateCombo.DATE_TYPE.MULTI_DATE_YEAR_PREV;
- }
-});
-BI.YearCard.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut('bi.yearcard', BI.YearCard);
-/**
- * @class BI.MultiLayerSelectTreeCombo
- * @extends BI.Widget
- */
-BI.MultiLayerSelectTreeCombo = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.MultiLayerSelectTreeCombo.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-multilayer_select_tree-combo",
- isDefaultInit: false,
- height: 30,
- text: "",
- items: []
- });
- },
-
- _init: function () {
- BI.MultiLayerSelectTreeCombo.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
-
- this.trigger = BI.createWidget({
- type: "bi.single_tree_trigger",
- text: o.text,
- height: o.height,
- items: o.items
- });
-
- this.popup = BI.createWidget({
- type: "bi.multilayer_select_tree_popup",
- isDefaultInit: o.isDefaultInit,
- items: o.items
- });
-
- this.combo = BI.createWidget({
- type: "bi.combo",
- element: this,
- adjustLength: 2,
- el: this.trigger,
- popup: {
- el: this.popup
- }
- });
-
- this.combo.on(BI.Controller.EVENT_CHANGE, function () {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
-
- this.popup.on(BI.MultiLayerSelectTreePopup.EVENT_CHANGE, function () {
- self.setValue(self.popup.getValue());
- self.combo.hideView();
- self.fireEvent(BI.MultiLayerSelectTreeCombo.EVENT_CHANGE);
- });
- },
-
- setValue: function (v) {
- v = BI.isArray(v) ? v : [v];
- this.trigger.setValue(v);
- this.popup.setValue(v);
- },
-
- getValue: function () {
- return this.popup.getValue();
- },
-
- populate: function (items) {
- this.combo.populate(items);
- }
-});
-BI.MultiLayerSelectTreeCombo.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut("bi.multilayer_select_tree_combo", BI.MultiLayerSelectTreeCombo);/**
- * guy
- * 二级树
- * @class BI.MultiLayerSelectLevelTree
- * @extends BI.Select
- */
-BI.MultiLayerSelectLevelTree = BI.inherit(BI.Widget, {
- _defaultConfig: function () {
- return BI.extend(BI.MultiLayerSelectLevelTree.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-multilayer-select-level-tree",
- isDefaultInit: false,
- items: [],
- itemsCreator: BI.emptyFn
- })
- },
-
- _init: function () {
- BI.MultiLayerSelectLevelTree.superclass._init.apply(this, arguments);
-
- this.initTree(this.options.items);
- },
-
- _formatItems: function (nodes, layer) {
- var self = this;
- BI.each(nodes, function (i, node) {
- var extend = {};
- node.layer = layer;
- if (!BI.isKey(node.id)) {
- node.id = BI.UUID();
- }
- if (node.isParent === true || BI.isNotEmptyArray(node.children)) {
- switch (i) {
- case 0 :
- extend.type = "bi.multilayer_select_tree_first_plus_group_node";
- break;
- case nodes.length - 1 :
- extend.type = "bi.multilayer_select_tree_last_plus_group_node";
- break;
- default :
- extend.type = "bi.multilayer_select_tree_mid_plus_group_node";
- break;
- }
- BI.defaults(node, extend);
-
- self._formatItems(node.children, layer + 1);
- } else {
- switch (i) {
- case nodes.length - 1:
- extend.type = "bi.multilayer_single_tree_last_tree_leaf_item";
- break;
- default :
- extend.type = "bi.multilayer_single_tree_mid_tree_leaf_item";
- }
- BI.defaults(node, extend);
- }
- });
- return nodes;
- },
-
- _assertId: function (sNodes) {
- BI.each(sNodes, function (i, node) {
- node.id = node.id || BI.UUID();
- });
- },
-
- //构造树结构,
- initTree: function (nodes) {
- var self = this, o = this.options;
- this.empty();
- this._assertId(nodes);
- this.tree = BI.createWidget({
- type: "bi.custom_tree",
- element: this,
- expander: {
- type: "bi.select_tree_expander",
- isDefaultInit: o.isDefaultInit,
- el: {},
- popup: {
- type: "bi.custom_tree"
- }
- },
-
- items: this._formatItems(BI.Tree.transformToTreeFormat(nodes), 0),
- itemsCreator: o.itemsCreator,
-
- el: {
- type: "bi.button_tree",
- chooseType: BI.Selection.Single,
- layouts: [{
- type: "bi.vertical"
- }]
- }
- });
- this.tree.on(BI.Controller.EVENT_CHANGE, function (type) {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- if (type === BI.Events.CLICK) {
- self.fireEvent(BI.MultiLayerSelectLevelTree.EVENT_CHANGE, arguments);
- }
- })
- },
-
- populate: function (nodes) {
- this.tree.populate(this._formatItems(BI.Tree.transformToTreeFormat(nodes), 0));
- },
-
- setValue: function (v) {
- this.tree.setValue(v);
- },
-
- getValue: function () {
- return this.tree.getValue();
- },
-
- getAllLeaves: function () {
- return this.tree.getAllLeaves();
- },
-
- getNodeById: function (id) {
- return this.tree.getNodeById(id);
- },
-
- getNodeByValue: function (id) {
- return this.tree.getNodeByValue(id);
- }
-});
-BI.MultiLayerSelectLevelTree.EVENT_CHANGE = "EVENT_CHANGE";
-
-BI.shortcut("bi.multilayer_select_level_tree", BI.MultiLayerSelectLevelTree);/**
- * Created by GUY on 2016/1/26.
- *
- * @class BI.MultiLayerSelectTreePopup
- * @extends BI.Pane
- */
-
-BI.MultiLayerSelectTreePopup = BI.inherit(BI.Pane, {
-
- _defaultConfig: function () {
- return BI.extend(BI.MultiLayerSelectTreePopup.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-multilayer-select-tree-popup",
- tipText: BI.i18nText("BI-No_Selected_Item"),
- isDefaultInit: false,
- itemsCreator: BI.emptyFn,
- items: []
- });
- },
-
- _init: function () {
- BI.MultiLayerSelectTreePopup.superclass._init.apply(this, arguments);
-
- var self = this, o = this.options;
-
- this.tree = BI.createWidget({
- type: 'bi.multilayer_select_level_tree',
- isDefaultInit: o.isDefaultInit,
- items: o.items,
- itemsCreator: o.itemsCreator
- });
-
- BI.createWidget({
- type: "bi.vertical",
- scrolly: false,
- scrollable: true,
- element: this,
- items: [this.tree]
- });
-
- this.tree.on(BI.Controller.EVENT_CHANGE, function () {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
-
- this.tree.on(BI.MultiLayerSelectLevelTree.EVENT_CHANGE, function () {
- self.fireEvent(BI.MultiLayerSelectTreePopup.EVENT_CHANGE);
- });
-
- this.check();
- },
-
- getValue: function () {
- return this.tree.getValue();
- },
-
- setValue: function (v) {
- v = BI.isArray(v) ? v : [v];
- this.tree.setValue(v);
- },
-
- populate: function (items) {
- BI.MultiLayerSelectTreePopup.superclass.populate.apply(this, arguments);
- this.tree.populate(items);
- }
-});
-
-BI.MultiLayerSelectTreePopup.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut("bi.multilayer_select_tree_popup", BI.MultiLayerSelectTreePopup);/**
- * 加号表示的组节点
- *
- * Created by GUY on 2016/1/27.
- * @class BI.MultiLayerSelectTreeFirstPlusGroupNode
- * @extends BI.NodeButton
- */
-BI.MultiLayerSelectTreeFirstPlusGroupNode = BI.inherit(BI.NodeButton, {
- _defaultConfig: function () {
- var conf = BI.MultiLayerSelectTreeFirstPlusGroupNode.superclass._defaultConfig.apply(this, arguments);
- return BI.extend(conf, {
- extraCls: "bi-multilayer-select-tree-first-plus-group-node bi-list-item-active",
- layer: 0,//第几层级
- id: "",
- pId: "",
- readonly: true,
- open: false,
- height: 25
- })
- },
- _init: function () {
- BI.MultiLayerSelectTreeFirstPlusGroupNode.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.node = BI.createWidget({
- type: "bi.select_tree_first_plus_group_node",
- cls: "bi-list-item-none",
- stopPropagation: true,
- logic: {
- dynamic: true
- },
- id: o.id,
- pId: o.pId,
- open: o.open,
- height: o.height,
- hgap: o.hgap,
- text: o.text,
- value: o.value,
- py: o.py
- });
- this.node.on(BI.Controller.EVENT_CHANGE, function (type) {
- self.setSelected(self.isSelected());
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
-
- var items = [];
- BI.count(0, o.layer, function () {
- items.push({
- type: "bi.layout",
- cls: "base-line-conn-background",
- width: 13,
- height: o.height
- })
- });
- items.push(this.node);
- BI.createWidget({
- type: "bi.td",
- element: this,
- columnSize: BI.makeArray(o.layer, 13),
- items: [items]
- })
- },
-
- isOnce: function () {
- return true;
- },
-
- doRedMark: function () {
- this.node.doRedMark.apply(this.node, arguments);
- },
-
- unRedMark: function () {
- this.node.unRedMark.apply(this.node, arguments);
- },
-
- isSelected: function () {
- return this.node.isSelected();
- },
-
- setSelected: function (b) {
- BI.MultiLayerSelectTreeFirstPlusGroupNode.superclass.setSelected.apply(this, arguments);
- this.node.setSelected(b);
- },
-
- doClick: function () {
- BI.NodeButton.superclass.doClick.apply(this, arguments);
- this.node.setSelected(this.isSelected());
- },
-
- setOpened: function (v) {
- BI.MultiLayerSelectTreeFirstPlusGroupNode.superclass.setOpened.apply(this, arguments);
- this.node.setOpened(v);
- }
-});
-
-BI.shortcut("bi.multilayer_select_tree_first_plus_group_node", BI.MultiLayerSelectTreeFirstPlusGroupNode);/**
- * 加号表示的组节点
- *
- * Created by GUY on 2016/1/27.
- * @class BI.MultiLayerSelectTreeLastPlusGroupNode
- * @extends BI.NodeButton
- */
-BI.MultiLayerSelectTreeLastPlusGroupNode = BI.inherit(BI.NodeButton, {
- _defaultConfig: function () {
- var conf = BI.MultiLayerSelectTreeLastPlusGroupNode.superclass._defaultConfig.apply(this, arguments);
- return BI.extend(conf, {
- extraCls: "bi-multilayer-select-tree-last-plus-group-node bi-list-item-active",
- layer: 0,//第几层级
- id: "",
- pId: "",
- readonly: true,
- open: false,
- height: 25
- })
- },
- _init: function () {
- BI.MultiLayerSelectTreeLastPlusGroupNode.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.node = BI.createWidget({
- type: "bi.select_tree_last_plus_group_node",
- cls: "bi-list-item-none",
- stopPropagation: true,
- logic: {
- dynamic: true
- },
- id: o.id,
- pId: o.pId,
- open: o.open,
- height: o.height,
- hgap: o.hgap,
- text: o.text,
- value: o.value,
- py: o.py
- });
- this.node.on(BI.Controller.EVENT_CHANGE, function (type) {
- self.setSelected(self.isSelected());
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
-
- var items = [];
- BI.count(0, o.layer, function () {
- items.push({
- type: "bi.layout",
- cls: "base-line-conn-background",
- width: 13,
- height: o.height
- })
- });
- items.push(this.node);
- BI.createWidget({
- type: "bi.td",
- element: this,
- columnSize: BI.makeArray(o.layer, 13),
- items: [items]
- })
- },
-
- doRedMark: function () {
- this.node.doRedMark.apply(this.node, arguments);
- },
-
- unRedMark: function () {
- this.node.unRedMark.apply(this.node, arguments);
- },
-
- isSelected: function () {
- return this.node.isSelected();
- },
-
- setSelected: function (b) {
- BI.MultiLayerSelectTreeLastPlusGroupNode.superclass.setSelected.apply(this, arguments);
- this.node.setSelected(b);
- },
-
- doClick: function () {
- BI.MultiLayerSelectTreeLastPlusGroupNode.superclass.doClick.apply(this, arguments);
- this.node.setSelected(this.isSelected());
- },
-
- setOpened: function (v) {
- BI.MultiLayerSelectTreeLastPlusGroupNode.superclass.setOpened.apply(this, arguments);
- this.node.setOpened(v);
- }
-});
-
-BI.shortcut("bi.multilayer_select_tree_last_plus_group_node", BI.MultiLayerSelectTreeLastPlusGroupNode);/**
- * 加号表示的组节点
- *
- * Created by GUY on 2016/1/27.
- * @class BI.MultiLayerSelectTreeMidPlusGroupNode
- * @extends BI.NodeButton
- */
-BI.MultiLayerSelectTreeMidPlusGroupNode = BI.inherit(BI.NodeButton, {
- _defaultConfig: function () {
- var conf = BI.MultiLayerSelectTreeMidPlusGroupNode.superclass._defaultConfig.apply(this, arguments);
- return BI.extend(conf, {
- extraCls: "bi-multilayer-select-tree-mid-plus-group-node bi-list-item-active",
- layer: 0,//第几层级
- id: "",
- pId: "",
- readonly: true,
- open: false,
- height: 25
- })
- },
- _init: function () {
- BI.MultiLayerSelectTreeMidPlusGroupNode.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.node = BI.createWidget({
- type: "bi.select_tree_mid_plus_group_node",
- cls: "bi-list-item-none",
- stopPropagation: true,
- logic: {
- dynamic: true
- },
- id: o.id,
- pId: o.pId,
- open: o.open,
- height: o.height,
- hgap: o.hgap,
- text: o.text,
- value: o.value,
- py: o.py
- });
- this.node.on(BI.Controller.EVENT_CHANGE, function (type) {
- self.setSelected(self.isSelected());
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
-
- var items = [];
- BI.count(0, o.layer, function () {
- items.push({
- type: "bi.layout",
- cls: "base-line-conn-background",
- width: 13,
- height: o.height
- })
- });
- items.push(this.node);
- BI.createWidget({
- type: "bi.td",
- element: this,
- columnSize: BI.makeArray(o.layer, 13),
- items: [items]
- })
- },
-
- doRedMark: function () {
- this.node.doRedMark.apply(this.node, arguments);
- },
-
- unRedMark: function () {
- this.node.unRedMark.apply(this.node, arguments);
- },
-
- isSelected: function () {
- return this.node.isSelected();
- },
-
- setSelected: function (b) {
- BI.MultiLayerSelectTreeMidPlusGroupNode.superclass.setSelected.apply(this, arguments);
- this.node.setSelected(b);
- },
-
- doClick: function () {
- BI.MultiLayerSelectTreeMidPlusGroupNode.superclass.doClick.apply(this, arguments);
- this.node.setSelected(this.isSelected());
- },
-
- setOpened: function (v) {
- BI.MultiLayerSelectTreeMidPlusGroupNode.superclass.setOpened.apply(this, arguments);
- this.node.setOpened(v);
- }
-});
-
-BI.shortcut("bi.multilayer_select_tree_mid_plus_group_node", BI.MultiLayerSelectTreeMidPlusGroupNode);/**
- * 多层级下拉单选树
- * Created by GUY on 2016/1/26.
- *
- * @class BI.MultiLayerSingleTreeCombo
- * @extends BI.Widget
- */
-BI.MultiLayerSingleTreeCombo = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.MultiLayerSingleTreeCombo.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-multilayer-singletree-combo",
- isDefaultInit: false,
- height: 30,
- text: "",
- itemsCreator: BI.emptyFn,
- items: []
- });
- },
-
- _init: function () {
- BI.MultiLayerSingleTreeCombo.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
-
- this.trigger = BI.createWidget({
- type: "bi.single_tree_trigger",
- text: o.text,
- height: o.height,
- items: o.items
- });
-
- this.popup = BI.createWidget({
- type: "bi.multilayer_single_tree_popup",
- isDefaultInit: o.isDefaultInit,
- items: o.items
- });
-
- this.combo = BI.createWidget({
- type: "bi.combo",
- element: this,
- adjustLength: 2,
- el: this.trigger,
- popup: {
- el: this.popup
- }
- });
-
- this.combo.on(BI.Controller.EVENT_CHANGE, function () {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
-
- this.popup.on(BI.MultiLayerSingleTreePopup.EVENT_CHANGE, function () {
- self.setValue(self.popup.getValue());
- self.combo.hideView();
- self.fireEvent(BI.MultiLayerSingleTreeCombo.EVENT_CHANGE);
- });
- },
-
- setValue: function (v) {
- v = BI.isArray(v) ? v : [v];
- this.trigger.setValue(v);
- this.popup.setValue(v);
- },
-
- getValue: function () {
- return this.popup.getValue();
- },
-
- populate: function (items) {
- this.combo.populate(items);
- }
-});
-
-BI.MultiLayerSingleTreeCombo.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut("bi.multilayer_single_tree_combo", BI.MultiLayerSingleTreeCombo);/**
- * guy
- * 二级树
- * @class BI.MultiLayerSingleLevelTree
- * @extends BI.Single
- */
-BI.MultiLayerSingleLevelTree = BI.inherit(BI.Widget, {
- _defaultConfig: function () {
- return BI.extend(BI.MultiLayerSingleLevelTree.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-multilayer-single-level-tree",
- isDefaultInit: false,
- items: [],
- itemsCreator: BI.emptyFn
- })
- },
-
- _init: function () {
- BI.MultiLayerSingleLevelTree.superclass._init.apply(this, arguments);
-
- this.initTree(this.options.items);
- },
-
- _formatItems: function (nodes, layer) {
- var self = this;
- BI.each(nodes, function (i, node) {
- var extend = {};
- node.layer = layer;
- if (!BI.isKey(node.id)) {
- node.id = BI.UUID();
- }
- if (node.isParent === true || BI.isNotEmptyArray(node.children)) {
- switch (i) {
- case 0 :
- extend.type = "bi.multilayer_single_tree_first_plus_group_node";
- break;
- case nodes.length - 1 :
- extend.type = "bi.multilayer_single_tree_last_plus_group_node";
- break;
- default :
- extend.type = "bi.multilayer_single_tree_mid_plus_group_node";
- break;
- }
- BI.defaults(node, extend);
-
- self._formatItems(node.children, layer + 1);
- } else {
- switch (i) {
- case nodes.length - 1:
- extend.type = "bi.multilayer_single_tree_last_tree_leaf_item";
- break;
- default :
- extend.type = "bi.multilayer_single_tree_mid_tree_leaf_item";
- }
- BI.defaults(node, extend);
- }
- });
- return nodes;
- },
-
- _assertId: function (sNodes) {
- BI.each(sNodes, function (i, node) {
- node.id = node.id || BI.UUID();
- });
- },
-
- //构造树结构,
- initTree: function (nodes) {
- var self = this, o = this.options;
- this.empty();
- this._assertId(nodes);
- this.tree = BI.createWidget({
- type: "bi.custom_tree",
- element: this,
- expander: {
- isDefaultInit: o.isDefaultInit,
- el: {},
- popup: {
- type: "bi.custom_tree"
- }
- },
-
- items: this._formatItems(BI.Tree.transformToTreeFormat(nodes), 0),
- itemsCreator: function (op, callback) {
- o.itemsCreator(op, function (items) {
- callback(BI.Tree.transformToTreeFormat(items), 0)
- })
- },
-
- el: {
- type: "bi.button_tree",
- chooseType: BI.Selection.Single,
- layouts: [{
- type: "bi.vertical"
- }]
- }
- });
- this.tree.on(BI.Controller.EVENT_CHANGE, function (type, v) {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- if (type === BI.Events.CLICK) {
- self.fireEvent(BI.MultiLayerSingleLevelTree.EVENT_CHANGE, v);
- }
- })
- },
-
- populate: function (nodes) {
- this.tree.populate(this._formatItems(BI.Tree.transformToTreeFormat(nodes), 0));
- },
-
- setValue: function (v) {
- this.tree.setValue(v);
- },
-
- getValue: function () {
- return this.tree.getValue();
- },
-
- getAllLeaves: function () {
- return this.tree.getAllLeaves();
- },
-
- getNodeById: function (id) {
- return this.tree.getNodeById(id);
- },
-
- getNodeByValue: function (id) {
- return this.tree.getNodeByValue(id);
- }
-});
-BI.MultiLayerSingleLevelTree.EVENT_CHANGE = "EVENT_CHANGE";
-
-BI.shortcut("bi.multilayer_single_level_tree", BI.MultiLayerSingleLevelTree);
-/**
- * Created by GUY on 2016/1/26.
- *
- * @class BI.MultiLayerSingleTreePopup
- * @extends BI.Pane
- */
-
-BI.MultiLayerSingleTreePopup = BI.inherit(BI.Pane, {
-
- _defaultConfig: function () {
- return BI.extend(BI.MultiLayerSingleTreePopup.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-multilayer-singletree-popup",
- tipText: BI.i18nText("BI-No_Selected_Item"),
- isDefaultInit: false,
- itemsCreator: BI.emptyFn,
- items: []
- });
- },
-
- _init: function () {
- BI.MultiLayerSingleTreePopup.superclass._init.apply(this, arguments);
-
- var self = this, o = this.options;
-
- this.tree = BI.createWidget({
- type: 'bi.multilayer_single_level_tree',
- isDefaultInit: o.isDefaultInit,
- items: o.items,
- itemsCreator: o.itemsCreator
- });
-
- BI.createWidget({
- type: "bi.vertical",
- scrolly: false,
- scrollable: true,
- element: this,
- items: [this.tree]
- });
-
- this.tree.on(BI.Controller.EVENT_CHANGE, function () {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
-
- this.tree.on(BI.MultiLayerSingleLevelTree.EVENT_CHANGE, function () {
- self.fireEvent(BI.MultiLayerSingleTreePopup.EVENT_CHANGE);
- });
-
- this.check();
- },
-
- getValue: function () {
- return this.tree.getValue();
- },
-
- setValue: function (v) {
- v = BI.isArray(v) ? v : [v];
- this.tree.setValue(v);
- },
-
- populate: function (items) {
- BI.MultiLayerSingleTreePopup.superclass.populate.apply(this, arguments);
- this.tree.populate(items);
- }
-});
-
-BI.MultiLayerSingleTreePopup.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut("bi.multilayer_single_tree_popup", BI.MultiLayerSingleTreePopup);/**
- * 加号表示的组节点
- *
- * Created by GUY on 2016/1/27.
- * @class BI.MultiLayerSingleTreeFirstPlusGroupNode
- * @extends BI.NodeButton
- */
-BI.MultiLayerSingleTreeFirstPlusGroupNode = BI.inherit(BI.NodeButton, {
- _defaultConfig: function () {
- var conf = BI.MultiLayerSingleTreeFirstPlusGroupNode.superclass._defaultConfig.apply(this, arguments);
- return BI.extend(conf, {
- extraCls: "bi-multilayer-single-tree-first-plus-group-node bi-list-item",
- layer: 0,//第几层级
- id: "",
- pId: "",
- open: false,
- height: 25
- })
- },
- _init: function () {
- BI.MultiLayerSingleTreeFirstPlusGroupNode.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.node = BI.createWidget({
- type: "bi.first_plus_group_node",
- cls: "bi-list-item-none",
- logic: {
- dynamic: true
- },
- id: o.id,
- pId: o.pId,
- open: o.open,
- height: o.height,
- hgap: o.hgap,
- text: o.text,
- value: o.value,
- py: o.py
- });
- this.node.on(BI.Controller.EVENT_CHANGE, function (type) {
- if (type === BI.Events.CLICK) {//本身实现click功能
- return;
- }
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
-
- var items = [];
- BI.count(0, o.layer, function () {
- items.push({
- type: "bi.layout",
- cls: "base-line-conn-background",
- width: 13,
- height: o.height
- })
- });
- items.push(this.node);
- BI.createWidget({
- type: "bi.td",
- element: this,
- columnSize: BI.makeArray(o.layer, 13),
- items: [items]
- })
- },
-
- doRedMark: function () {
- this.node.doRedMark.apply(this.node, arguments);
- },
-
- unRedMark: function () {
- this.node.unRedMark.apply(this.node, arguments);
- },
-
- doClick: function () {
- BI.MultiLayerSingleTreeFirstPlusGroupNode.superclass.doClick.apply(this, arguments);
- this.node.setSelected(this.isSelected());
- },
-
- setOpened: function (v) {
- BI.MultiLayerSingleTreeFirstPlusGroupNode.superclass.setOpened.apply(this, arguments);
- if (BI.isNotNull(this.node)) {
- this.node.setOpened(v);
- }
- }
-});
-
-BI.shortcut("bi.multilayer_single_tree_first_plus_group_node", BI.MultiLayerSingleTreeFirstPlusGroupNode);/**
- * 加号表示的组节点
- *
- * Created by GUY on 2016/1/27.
- * @class BI.MultiLayerSingleTreeLastPlusGroupNode
- * @extends BI.NodeButton
- */
-BI.MultiLayerSingleTreeLastPlusGroupNode = BI.inherit(BI.NodeButton, {
- _defaultConfig: function () {
- var conf = BI.MultiLayerSingleTreeLastPlusGroupNode.superclass._defaultConfig.apply(this, arguments);
- return BI.extend(conf, {
- extraCls: "bi-multilayer-single-tree-last-plus-group-node bi-list-item",
- layer: 0,//第几层级
- id: "",
- pId: "",
- open: false,
- height: 25
- })
- },
- _init: function () {
- BI.MultiLayerSingleTreeLastPlusGroupNode.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.node = BI.createWidget({
- type: "bi.last_plus_group_node",
- cls: "bi-list-item-none",
- logic: {
- dynamic: true
- },
- id: o.id,
- pId: o.pId,
- open: o.open,
- height: o.height,
- hgap: o.hgap,
- text: o.text,
- value: o.value,
- py: o.py
- });
- this.node.on(BI.Controller.EVENT_CHANGE, function (type) {
- if (type === BI.Events.CLICK) {//本身实现click功能
- return;
- }
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
-
- var items = [];
- BI.count(0, o.layer, function () {
- items.push({
- type: "bi.layout",
- cls: "base-line-conn-background",
- width: 13,
- height: o.height
- })
- });
- items.push(this.node);
- BI.createWidget({
- type: "bi.td",
- element: this,
- columnSize: BI.makeArray(o.layer, 13),
- items: [items]
- })
- },
-
- doRedMark: function () {
- this.node.doRedMark.apply(this.node, arguments);
- },
-
- unRedMark: function () {
- this.node.unRedMark.apply(this.node, arguments);
- },
-
- doClick: function () {
- BI.MultiLayerSingleTreeLastPlusGroupNode.superclass.doClick.apply(this, arguments);
- this.node.setSelected(this.isSelected());
- },
-
- setOpened: function (v) {
- BI.MultiLayerSingleTreeLastPlusGroupNode.superclass.setOpened.apply(this, arguments);
- if (BI.isNotNull(this.node)) {
- this.node.setOpened(v);
- }
- }
-});
-
-BI.shortcut("bi.multilayer_single_tree_last_plus_group_node", BI.MultiLayerSingleTreeLastPlusGroupNode);/**
- * 加号表示的组节点
- *
- * Created by GUY on 2016/1/27.
- * @class BI.MultiLayerSingleTreeMidPlusGroupNode
- * @extends BI.NodeButton
- */
-BI.MultiLayerSingleTreeMidPlusGroupNode = BI.inherit(BI.NodeButton, {
- _defaultConfig: function () {
- var conf = BI.MultiLayerSingleTreeMidPlusGroupNode.superclass._defaultConfig.apply(this, arguments);
- return BI.extend(conf, {
- extraCls: "bi-multilayer-single-tree-mid-plus-group-node bi-list-item",
- layer: 0,//第几层级
- id: "",
- pId: "",
- open: false,
- height: 25
- })
- },
- _init: function () {
- BI.MultiLayerSingleTreeMidPlusGroupNode.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.node = BI.createWidget({
- type: "bi.mid_plus_group_node",
- cls: "bi-list-item-none",
- logic: {
- dynamic: true
- },
- id: o.id,
- pId: o.pId,
- open: o.open,
- height: o.height,
- hgap: o.hgap,
- text: o.text,
- value: o.value,
- py: o.py
- });
- this.node.on(BI.Controller.EVENT_CHANGE, function (type) {
- if (type === BI.Events.CLICK) {//本身实现click功能
- return;
- }
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
-
- var items = [];
- BI.count(0, o.layer, function () {
- items.push({
- type: "bi.layout",
- cls: "base-line-conn-background",
- width: 13,
- height: o.height
- })
- });
- items.push(this.node);
- BI.createWidget({
- type: "bi.td",
- element: this,
- columnSize: BI.makeArray(o.layer, 13),
- items: [items]
- })
- },
-
- doRedMark: function () {
- this.node.doRedMark.apply(this.node, arguments);
- },
-
- unRedMark: function () {
- this.node.unRedMark.apply(this.node, arguments);
- },
-
- doClick: function () {
- BI.MultiLayerSingleTreeMidPlusGroupNode.superclass.doClick.apply(this, arguments);
- this.node.setSelected(this.isSelected());
- },
-
- setOpened: function (v) {
- BI.MultiLayerSingleTreeMidPlusGroupNode.superclass.setOpened.apply(this, arguments);
- if (BI.isNotNull(this.node)) {
- this.node.setOpened(v);
- }
- }
-});
-
-BI.shortcut("bi.multilayer_single_tree_mid_plus_group_node", BI.MultiLayerSingleTreeMidPlusGroupNode);/**
- *
- * Created by GUY on 2016/1/27.
- * @class BI.MultiLayerSingleTreeFirstTreeLeafItem
- * @extends BI.BasicButton
- */
-BI.MultiLayerSingleTreeFirstTreeLeafItem = BI.inherit(BI.BasicButton, {
- _defaultConfig: function () {
- return BI.extend(BI.MultiLayerSingleTreeFirstTreeLeafItem.superclass._defaultConfig.apply(this, arguments), {
- extraCls: "bi-multilayer-single-tree-first-tree-leaf-item bi-list-item-active",
- logic: {
- dynamic: false
- },
- layer: 0,
- id: "",
- pId: "",
- height: 25
- })
- },
- _init: function () {
- BI.MultiLayerSingleTreeFirstTreeLeafItem.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.item = BI.createWidget({
- type: "bi.first_tree_leaf_item",
- cls: "bi-list-item-none",
- logic: {
- dynamic: true
- },
- id: o.id,
- pId: o.pId,
- height: o.height,
- hgap: o.hgap,
- text: o.text,
- value: o.value,
- py: o.py
- });
- this.item.on(BI.Controller.EVENT_CHANGE, function (type) {
- if (type === BI.Events.CLICK) {//本身实现click功能
- return;
- }
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
-
- var items = [];
- BI.count(0, o.layer, function () {
- items.push({
- type: "bi.layout",
- cls: "base-line-conn-background",
- width: 13,
- height: o.height
- })
- });
- items.push(this.item);
- BI.createWidget({
- type: "bi.td",
- element: this,
- columnSize: BI.makeArray(o.layer, 13),
- items: [items]
- })
- },
-
- doRedMark: function () {
- this.item.doRedMark.apply(this.item, arguments);
- },
-
- unRedMark: function () {
- this.item.unRedMark.apply(this.item, arguments);
- },
-
- doHighLight: function () {
- this.item.doHighLight.apply(this.item, arguments);
- },
-
- unHighLight: function () {
- this.item.unHighLight.apply(this.item, arguments);
- },
-
- getId: function () {
- return this.options.id;
- },
-
- getPId: function () {
- return this.options.pId;
- },
-
- doClick: function () {
- BI.MultiLayerSingleTreeFirstTreeLeafItem.superclass.doClick.apply(this, arguments);
- this.item.setSelected(this.isSelected());
- },
-
- setSelected: function (v) {
- BI.MultiLayerSingleTreeFirstTreeLeafItem.superclass.setSelected.apply(this, arguments);
- this.item.setSelected(v);
- }
-});
-
-BI.shortcut("bi.multilayer_single_tree_first_tree_leaf_item", BI.MultiLayerSingleTreeFirstTreeLeafItem);/**
- *
- * Created by GUY on 2016/1/27.
- * @class BI.MultiLayerSingleTreeLastTreeLeafItem
- * @extends BI.BasicButton
- */
-BI.MultiLayerSingleTreeLastTreeLeafItem = BI.inherit(BI.BasicButton, {
- _defaultConfig: function () {
- return BI.extend(BI.MultiLayerSingleTreeLastTreeLeafItem.superclass._defaultConfig.apply(this, arguments), {
- extraCls: "bi-multilayer-single-tree-last-tree-leaf-item bi-list-item-active",
- logic: {
- dynamic: false
- },
- layer: 0,
- id: "",
- pId: "",
- height: 25
- })
- },
- _init: function () {
- BI.MultiLayerSingleTreeLastTreeLeafItem.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.item = BI.createWidget({
- type: "bi.last_tree_leaf_item",
- cls: "bi-list-item-none",
- logic: {
- dynamic: true
- },
- id: o.id,
- pId: o.pId,
- height: o.height,
- hgap: o.hgap,
- text: o.text,
- value: o.value,
- py: o.py
- });
- this.item.on(BI.Controller.EVENT_CHANGE, function (type) {
- if (type === BI.Events.CLICK) {//本身实现click功能
- return;
- }
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
-
- var items = [];
- BI.count(0, o.layer, function () {
- items.push({
- type: "bi.layout",
- cls: "base-line-conn-background",
- width: 13,
- height: o.height
- })
- });
- items.push(this.item);
- BI.createWidget({
- type: "bi.td",
- element: this,
- columnSize: BI.makeArray(o.layer, 13),
- items: [items]
- })
- },
-
- doRedMark: function () {
- this.item.doRedMark.apply(this.item, arguments);
- },
-
- unRedMark: function () {
- this.item.unRedMark.apply(this.item, arguments);
- },
-
- doHighLight: function () {
- this.item.doHighLight.apply(this.item, arguments);
- },
-
- unHighLight: function () {
- this.item.unHighLight.apply(this.item, arguments);
- },
-
- getId: function () {
- return this.options.id;
- },
-
- getPId: function () {
- return this.options.pId;
- },
-
- doClick: function () {
- BI.MultiLayerSingleTreeLastTreeLeafItem.superclass.doClick.apply(this, arguments);
- this.item.setSelected(this.isSelected());
- },
-
- setSelected: function (v) {
- BI.MultiLayerSingleTreeLastTreeLeafItem.superclass.setSelected.apply(this, arguments);
- this.item.setSelected(v);
- }
-});
-
-BI.shortcut("bi.multilayer_single_tree_last_tree_leaf_item", BI.MultiLayerSingleTreeLastTreeLeafItem);/**
- *
- * Created by GUY on 2016/1/27.
- * @class BI.MultiLayerSingleTreeMidTreeLeafItem
- * @extends BI.BasicButton
- */
-BI.MultiLayerSingleTreeMidTreeLeafItem = BI.inherit(BI.BasicButton, {
- _defaultConfig: function () {
- return BI.extend(BI.MultiLayerSingleTreeMidTreeLeafItem.superclass._defaultConfig.apply(this, arguments), {
- extraCls: "bi-multilayer-single-tree-mid-tree-leaf-item bi-list-item-active",
- logic: {
- dynamic: false
- },
- layer: 0,
- id: "",
- pId: "",
- height: 25
- })
- },
- _init: function () {
- BI.MultiLayerSingleTreeMidTreeLeafItem.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.item = BI.createWidget({
- type: "bi.mid_tree_leaf_item",
- cls: "bi-list-item-none",
- logic: {
- dynamic: true
- },
- id: o.id,
- pId: o.pId,
- height: o.height,
- hgap: o.hgap,
- text: o.text,
- value: o.value,
- py: o.py
- });
- this.item.on(BI.Controller.EVENT_CHANGE, function (type) {
- if (type === BI.Events.CLICK) {//本身实现click功能
- return;
- }
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
-
- var items = [];
- BI.count(0, o.layer, function () {
- items.push({
- type: "bi.layout",
- cls: "base-line-conn-background",
- width: 13,
- height: o.height
- })
- });
- items.push(this.item);
- BI.createWidget({
- type: "bi.td",
- element: this,
- columnSize: BI.makeArray(o.layer, 13),
- items: [items]
- })
- },
-
- doRedMark: function () {
- this.item.doRedMark.apply(this.item, arguments);
- },
-
- unRedMark: function () {
- this.item.unRedMark.apply(this.item, arguments);
- },
-
- doHighLight: function () {
- this.item.doHighLight.apply(this.item, arguments);
- },
-
- unHighLight: function () {
- this.item.unHighLight.apply(this.item, arguments);
- },
-
- getId: function () {
- return this.options.id;
- },
-
- getPId: function () {
- return this.options.pId;
- },
-
- doClick: function () {
- BI.MultiLayerSingleTreeMidTreeLeafItem.superclass.doClick.apply(this, arguments);
- this.item.setSelected(this.isSelected());
- },
-
- setSelected: function (v) {
- BI.MultiLayerSingleTreeMidTreeLeafItem.superclass.setSelected.apply(this, arguments);
- this.item.setSelected(v);
- }
-});
-
-BI.shortcut("bi.multilayer_single_tree_mid_tree_leaf_item", BI.MultiLayerSingleTreeMidTreeLeafItem);/**
- *
- * @class BI.MultiSelectCheckPane
- * @extends BI.Widget
- */
-BI.MultiSelectCheckPane = BI.inherit(BI.Widget, {
-
- constants: {
- height: 25,
- lgap: 10,
- tgap: 5
- },
-
- _defaultConfig: function () {
- return BI.extend(BI.MultiSelectCheckPane.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-multi-select-check-pane bi-background",
- items: [],
- itemsCreator: BI.emptyFn,
- valueFormatter: BI.emptyFn,
- onClickContinueSelect: BI.emptyFn
- });
- },
-
- _init: function () {
- BI.MultiSelectCheckPane.superclass._init.apply(this, arguments);
-
- var self = this, opts = this.options;
-
- this.storeValue = {};
- this.display = BI.createWidget({
- type: 'bi.display_selected_list',
- items: opts.items,
- itemsCreator: function (op, callback) {
- op = BI.extend(op || {}, {
- selectedValues: self.storeValue.value
- });
- if (self.storeValue.type === BI.Selection.Multi) {
- callback({
- items: BI.map(self.storeValue.value, function (i, v) {
- var txt = opts.valueFormatter(v) || v;
- return {
- text: txt,
- value: v,
- title: txt
- }
- })
- });
- return;
- }
- opts.itemsCreator(op, callback);
- }
- });
-
- this.continueSelect = BI.createWidget({
- type: 'bi.text_button',
- text: BI.i18nText('BI-Continue_Select'),
- cls: 'multi-select-check-selected bi-high-light'
- });
-
- this.continueSelect.on(BI.TextButton.EVENT_CHANGE, function () {
- opts.onClickContinueSelect();
- });
-
- BI.createWidget({
- type: 'bi.vtape',
- element: this,
- items: [{
- height: this.constants.height,
- el: {
- type: 'bi.left',
- cls: 'multi-select-continue-select',
- items: [
- {
- el: {
- type: "bi.label",
- text: BI.i18nText('BI-Selected_Data')
- },
- lgap: this.constants.lgap,
- tgap: this.constants.tgap
- },
- {
- el: this.continueSelect,
- lgap: this.constants.lgap,
- tgap: this.constants.tgap
- }]
- }
- }, {
- height: 'fill',
- el: this.display
- }]
- });
- },
-
- setValue: function (v) {
- this.storeValue = v || {};
- },
-
- empty: function () {
- this.display.empty();
- },
-
- populate: function () {
- this.display.populate.apply(this.display, arguments);
- }
-});
-
-BI.shortcut("bi.multi_select_check_pane", BI.MultiSelectCheckPane);/**
- *
- *
- * 查看已选弹出层的展示面板
- * @class BI.DisplaySelectedList
- * @extends BI.Widget
- */
-BI.DisplaySelectedList = BI.inherit(BI.Pane, {
-
- constants: {
- height: 25,
- lgap: 10
- },
-
- _defaultConfig: function () {
- return BI.extend(BI.DisplaySelectedList.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-display-list",
- itemsCreator: BI.emptyFn,
- items: []
- });
- },
-
- _init: function () {
- BI.DisplaySelectedList.superclass._init.apply(this, arguments);
-
- var self = this, opts = this.options;
-
- this.hasNext = false;
-
- this.button_group = BI.createWidget({
- type: "bi.list_pane",
- element: this,
- el: {
- type: "bi.loader",
- isDefaultInit: false,
- logic: {
- dynamic: true,
- scrolly: true
- },
- items: this._createItems(opts.items),
- chooseType: BI.ButtonGroup.CHOOSE_TYPE_MULTI,
- layouts: [{
- type: "bi.vertical",
- lgap: 10
- }]
- },
- itemsCreator: function (options, callback) {
-
- opts.itemsCreator(options, function (ob) {
- self.hasNext = !!ob.hasNext;
- callback(self._createItems(ob.items));
- })
- },
- hasNext: function () {
- return self.hasNext;
- }
- });
- },
-
- _createItems: function (items) {
- return BI.createItems(items, {
- type: 'bi.icon_text_item',
- cls: 'cursor-default check-font display-list-item bi-tips',
- once: true,
- invalid: true,
- selected: true,
- height: this.constants.height,
- logic: {
- dynamic: true
- }
- });
- },
-
- empty: function () {
- this.button_group.empty();
- },
-
- populate: function (items) {
- if (arguments.length === 0) {
- this.button_group.populate();
- } else {
- this.button_group.populate(this._createItems(items));
- }
- }
-});
-
-BI.shortcut('bi.display_selected_list', BI.DisplaySelectedList);/**
- *
- * @class BI.MultiSelectInsertCombo
- * @extends BI.Single
- */
-BI.MultiSelectInsertCombo = BI.inherit(BI.Single, {
-
- _defaultConfig: function () {
- return BI.extend(BI.MultiSelectInsertCombo.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-multi-select-insert-combo',
- itemsCreator: BI.emptyFn,
- valueFormatter: BI.emptyFn,
- height: 28
- });
- },
-
- _init: function () {
- BI.MultiSelectInsertCombo.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
-
- var assertShowValue = function () {
- BI.isKey(self._startValue) && self.storeValue.value[self.storeValue.type === BI.Selection.All ? "remove" : "pushDistinct"](self._startValue);
- self.trigger.getSearcher().setState(self.storeValue);
- self.trigger.getCounter().setButtonChecked(self.storeValue);
- };
- this.storeValue = {};
- //标记正在请求数据
- this.requesting = false;
-
- this.trigger = BI.createWidget({
- type: "bi.multi_select_trigger",
- height: o.height,
- // adapter: this.popup,
- masker: {
- offset: {
- left: 1,
- top: 1,
- right: 2,
- bottom: 33
- }
- },
- valueFormatter: o.valueFormatter,
- itemsCreator: function (op, callback) {
- o.itemsCreator(op, function (res) {
- if (op.times === 1 && BI.isNotNull(op.keywords)) {
- //预防trigger内部把当前的storeValue改掉
- self.trigger.setValue(BI.deepClone(self.getValue()));
- }
- callback.apply(self, arguments);
- });
- }
- });
-
- this.trigger.on(BI.MultiSelectTrigger.EVENT_START, function () {
- self._setStartValue("");
- this.getSearcher().setValue(self.storeValue);
- });
- this.trigger.on(BI.MultiSelectTrigger.EVENT_STOP, function () {
- self._setStartValue("");
- });
- this.trigger.on(BI.MultiSelectTrigger.EVENT_PAUSE, function () {
- // if (this.getSearcher().hasMatched()) {
- var keyword = this.getSearcher().getKeyword();
- self._join({
- type: BI.Selection.Multi,
- value: [keyword]
- }, function () {
- //如果在不选的状态下直接把该值添加进来
- if (self.storeValue.type === BI.Selection.Multi) {
- self.storeValue.value.pushDistinct(keyword);
- }
- self.combo.setValue(self.storeValue);
- self._setStartValue(keyword);
- assertShowValue();
- self.populate();
- self._setStartValue("");
- })
- // }
- });
- this.trigger.on(BI.MultiSelectTrigger.EVENT_SEARCHING, function (keywords) {
- var last = BI.last(keywords);
- keywords = BI.initial(keywords || []);
- if (keywords.length > 0) {
- self._joinKeywords(keywords, function () {
- if (BI.isEndWithBlank(last)) {
- self.combo.setValue(self.storeValue);
- assertShowValue();
- self.combo.populate();
- self._setStartValue("");
- } else {
- self.combo.setValue(self.storeValue);
- assertShowValue();
- }
- });
- }
- });
-
- this.trigger.on(BI.MultiSelectTrigger.EVENT_CHANGE, function (value, obj) {
- if (obj instanceof BI.MultiSelectBar) {
- self._joinAll(this.getValue(), function () {
- assertShowValue();
- });
- } else {
- self._join(this.getValue(), function () {
- assertShowValue();
- });
- }
- });
- this.trigger.on(BI.MultiSelectTrigger.EVENT_BEFORE_COUNTER_POPUPVIEW, function () {
- this.getCounter().setValue(self.storeValue);
- });
- this.trigger.on(BI.MultiSelectTrigger.EVENT_COUNTER_CLICK, function () {
- if (!self.combo.isViewVisible()) {
- self.combo.showView();
- }
- });
-
- this.combo = BI.createWidget({
- type: "bi.combo",
- toggle: false,
- el: this.trigger,
- adjustLength: 1,
- popup: {
- type: 'bi.multi_select_popup_view',
- ref: function () {
- self.popup = this;
- self.trigger.setAdapter(this);
- },
- listeners: [{
- eventName: BI.MultiSelectPopupView.EVENT_CHANGE,
- action: function () {
- self.storeValue = this.getValue();
- self._adjust(function () {
- assertShowValue();
- });
- }
- }, {
- eventName: BI.MultiSelectPopupView.EVENT_CLICK_CONFIRM,
- action: function () {
- self._defaultState();
- }
- }, {
- eventName: BI.MultiSelectPopupView.EVENT_CLICK_CLEAR,
- action: function () {
- self.setValue();
- self._defaultState();
- }
- }],
- itemsCreator: o.itemsCreator,
- valueFormatter: o.valueFormatter,
- onLoaded: function () {
- BI.nextTick(function () {
- self.combo.adjustWidth();
- self.combo.adjustHeight();
- self.trigger.getCounter().adjustView();
- self.trigger.getSearcher().adjustView();
- });
- }
- },
- hideChecker: function (e) {
- return triggerBtn.element.find(e.target).length === 0;
- }
- });
-
- this.combo.on(BI.Combo.EVENT_BEFORE_POPUPVIEW, function () {
- this.setValue(self.storeValue);
- BI.nextTick(function () {
- self.populate();
- });
- });
- //当退出的时候如果还在处理请求,则等请求结束后再对外发确定事件
- this.wants2Quit = false;
- this.combo.on(BI.Combo.EVENT_AFTER_HIDEVIEW, function () {
- //important:关闭弹出时又可能没有退出编辑状态
- self.trigger.stopEditing();
- if (self.requesting === true) {
- self.wants2Quit = true;
- } else {
- self.fireEvent(BI.MultiSelectInsertCombo.EVENT_CONFIRM);
- }
- });
-
- var triggerBtn = BI.createWidget({
- type: "bi.trigger_icon_button",
- width: o.height,
- height: o.height,
- cls: "multi-select-trigger-icon-button bi-border-left"
- });
- triggerBtn.on(BI.TriggerIconButton.EVENT_CHANGE, function () {
- self.trigger.getCounter().hideView();
- if (self.combo.isViewVisible()) {
- self.combo.hideView();
- } else {
- self.combo.showView();
- }
- });
- BI.createWidget({
- type: "bi.absolute",
- element: this,
- items: [{
- el: this.combo,
- left: 0,
- right: 0,
- top: 0,
- bottom: 0
- }, {
- el: triggerBtn,
- right: 0,
- top: 0,
- bottom: 0
- }]
- })
- },
-
- _defaultState: function () {
- this.trigger.stopEditing();
- this.combo.hideView();
- },
-
- _assertValue: function (val) {
- val || (val = {});
- val.type || (val.type = BI.Selection.Multi);
- val.value || (val.value = []);
- },
-
- _makeMap: function (values) {
- return BI.makeObject(values || []);
- },
-
- _joinKeywords: function (keywords, callback) {
- var self = this, o = this.options;
- this._assertValue(this.storeValue);
- this.requesting = true;
- o.itemsCreator({
- type: BI.MultiSelectInsertCombo.REQ_GET_ALL_DATA,
- keywords: keywords
- }, function (ob) {
- var values = BI.pluck(ob.items, "value");
- digest(values);
- });
-
- function digest(items) {
- var selectedMap = self._makeMap(items);
- BI.each(keywords, function (i, val) {
- if (BI.isNotNull(selectedMap[val])) {
- self.storeValue.value[self.storeValue.type === BI.Selection.Multi ? "pushDistinct" : "remove"](val);
- }
- });
- self._adjust(callback);
- }
- },
-
- _joinAll: function (res, callback) {
- var self = this, o = this.options;
- this._assertValue(res);
- this.requesting = true;
- o.itemsCreator({
- type: BI.MultiSelectInsertCombo.REQ_GET_ALL_DATA,
- keywords: [this.trigger.getKey()]
- }, function (ob) {
- var items = BI.pluck(ob.items, "value");
- if (self.storeValue.type === res.type) {
- var change = false;
- var map = self._makeMap(self.storeValue.value);
- BI.each(items, function (i, v) {
- if (BI.isNotNull(map[v])) {
- change = true;
- delete map[v];
- }
- });
- change && (self.storeValue.value = BI.values(map));
- self._adjust(callback);
- return;
- }
- var selectedMap = self._makeMap(self.storeValue.value);
- var notSelectedMap = self._makeMap(res.value);
- var newItems = [];
- BI.each(items, function (i, item) {
- if (BI.isNotNull(selectedMap[items[i]])) {
- delete selectedMap[items[i]];
- }
- if (BI.isNull(notSelectedMap[items[i]])) {
- newItems.push(item);
- }
- });
- self.storeValue.value = newItems.concat(BI.values(selectedMap));
- self._adjust(callback);
- })
- },
-
- _adjust: function (callback) {
- var self = this, o = this.options;
- adjust();
- callback();
- function adjust() {
- if (self.wants2Quit === true) {
- self.fireEvent(BI.MultiSelectInsertCombo.EVENT_CONFIRM);
- self.wants2Quit = false;
- }
- self.requesting = false;
- }
- },
-
- _join: function (res, callback) {
- var self = this, o = this.options;
- this._assertValue(res);
- this._assertValue(this.storeValue);
- if (this.storeValue.type === res.type) {
- var map = this._makeMap(this.storeValue.value);
- BI.each(res.value, function (i, v) {
- if (!map[v]) {
- self.storeValue.value.push(v);
- map[v] = v;
- }
- });
- var change = false;
- BI.each(res.assist, function (i, v) {
- if (BI.isNotNull(map[v])) {
- change = true;
- delete map[v];
- }
- });
- change && (this.storeValue.value = BI.values(map));
- self._adjust(callback);
- return;
- }
- this._joinAll(res, callback);
- },
-
- _setStartValue: function (value) {
- this._startValue = value;
- this.popup.setStartValue(value);
- },
-
- setValue: function (v) {
- this.storeValue = v || {};
- this._assertValue(this.storeValue);
- this.combo.setValue(this.storeValue);
- },
-
- getValue: function () {
- return BI.deepClone(this.storeValue);
- },
-
- populate: function () {
- this.combo.populate.apply(this.combo, arguments);
- }
-});
-
-BI.extend(BI.MultiSelectInsertCombo, {
- REQ_GET_DATA_LENGTH: 0,
- REQ_GET_ALL_DATA: -1
-});
-
-BI.MultiSelectInsertCombo.EVENT_CONFIRM = "EVENT_CONFIRM";
-
-BI.shortcut('bi.multi_select_insert_combo', BI.MultiSelectInsertCombo);/**
- *
- * @class BI.MultiSelectCombo
- * @extends BI.Single
- */
-BI.MultiSelectCombo = BI.inherit(BI.Single, {
-
- _defaultConfig: function () {
- return BI.extend(BI.MultiSelectCombo.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-multi-select-combo',
- itemsCreator: BI.emptyFn,
- valueFormatter: BI.emptyFn,
- height: 28
- });
- },
-
- _init: function () {
- BI.MultiSelectCombo.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
-
- var assertShowValue = function () {
- BI.isKey(self._startValue) && self.storeValue.value[self.storeValue.type === BI.Selection.All ? "remove" : "pushDistinct"](self._startValue);
- self.trigger.getSearcher().setState(self.storeValue);
- self.trigger.getCounter().setButtonChecked(self.storeValue);
- };
- this.storeValue = {};
- //标记正在请求数据
- this.requesting = false;
-
- this.trigger = BI.createWidget({
- type: "bi.multi_select_trigger",
- height: o.height,
- // adapter: this.popup,
- masker: {
- offset: {
- left: 1,
- top: 1,
- right: 2,
- bottom: 33
- }
- },
- valueFormatter: o.valueFormatter,
- itemsCreator: function (op, callback) {
- o.itemsCreator(op, function (res) {
- if (op.times === 1 && BI.isNotNull(op.keywords)) {
- //预防trigger内部把当前的storeValue改掉
- self.trigger.setValue(BI.deepClone(self.getValue()));
- }
- callback.apply(self, arguments);
- });
- }
- });
-
- this.trigger.on(BI.MultiSelectTrigger.EVENT_START, function () {
- self._setStartValue("");
- this.getSearcher().setValue(self.storeValue);
- });
- this.trigger.on(BI.MultiSelectTrigger.EVENT_STOP, function () {
- self._setStartValue("");
- });
- this.trigger.on(BI.MultiSelectTrigger.EVENT_PAUSE, function () {
- if (this.getSearcher().hasMatched()) {
- var keyword = this.getSearcher().getKeyword();
- self._join({
- type: BI.Selection.Multi,
- value: [keyword]
- }, function () {
- self.combo.setValue(self.storeValue);
- self._setStartValue(keyword);
- assertShowValue();
- self.populate();
- self._setStartValue("");
- })
- }
- });
- this.trigger.on(BI.MultiSelectTrigger.EVENT_SEARCHING, function (keywords) {
- var last = BI.last(keywords);
- keywords = BI.initial(keywords || []);
- if (keywords.length > 0) {
- self._joinKeywords(keywords, function () {
- if (BI.isEndWithBlank(last)) {
- self.combo.setValue(self.storeValue);
- assertShowValue();
- self.combo.populate();
- self._setStartValue("");
- } else {
- self.combo.setValue(self.storeValue);
- assertShowValue();
- }
- });
- }
- });
-
- this.trigger.on(BI.MultiSelectTrigger.EVENT_CHANGE, function (value, obj) {
- if (obj instanceof BI.MultiSelectBar) {
- self._joinAll(this.getValue(), function () {
- assertShowValue();
- });
- } else {
- self._join(this.getValue(), function () {
- assertShowValue();
- });
- }
- });
- this.trigger.on(BI.MultiSelectTrigger.EVENT_BEFORE_COUNTER_POPUPVIEW, function () {
- this.getCounter().setValue(self.storeValue);
- });
- this.trigger.on(BI.MultiSelectTrigger.EVENT_COUNTER_CLICK, function () {
- if (!self.combo.isViewVisible()) {
- self.combo.showView();
- }
- });
-
- this.combo = BI.createWidget({
- type: "bi.combo",
- toggle: false,
- el: this.trigger,
- adjustLength: 1,
- popup: {
- type: 'bi.multi_select_popup_view',
- ref: function () {
- self.popup = this;
- self.trigger.setAdapter(this);
- },
- listeners: [{
- eventName: BI.MultiSelectPopupView.EVENT_CHANGE,
- action: function () {
- self.storeValue = this.getValue();
- self._adjust(function () {
- assertShowValue();
- });
- }
- }, {
- eventName: BI.MultiSelectPopupView.EVENT_CLICK_CONFIRM,
- action: function () {
- self._defaultState();
- }
- }, {
- eventName: BI.MultiSelectPopupView.EVENT_CLICK_CLEAR,
- action: function () {
- self.setValue();
- self._defaultState();
- }
- }],
- itemsCreator: o.itemsCreator,
- valueFormatter: o.valueFormatter,
- onLoaded: function () {
- BI.nextTick(function () {
- self.combo.adjustWidth();
- self.combo.adjustHeight();
- self.trigger.getCounter().adjustView();
- self.trigger.getSearcher().adjustView();
- });
- }
- },
- hideChecker: function (e) {
- return triggerBtn.element.find(e.target).length === 0;
- }
- });
-
- this.combo.on(BI.Combo.EVENT_BEFORE_POPUPVIEW, function () {
- this.setValue(self.storeValue);
- BI.nextTick(function () {
- self.populate();
- });
- });
- //当退出的时候如果还在处理请求,则等请求结束后再对外发确定事件
- this.wants2Quit = false;
- this.combo.on(BI.Combo.EVENT_AFTER_HIDEVIEW, function () {
- //important:关闭弹出时又可能没有退出编辑状态
- self.trigger.stopEditing();
- if (self.requesting === true) {
- self.wants2Quit = true;
- } else {
- self.fireEvent(BI.MultiSelectCombo.EVENT_CONFIRM);
- }
- });
-
- var triggerBtn = BI.createWidget({
- type: "bi.trigger_icon_button",
- width: o.height,
- height: o.height,
- cls: "multi-select-trigger-icon-button bi-border-left"
- });
- triggerBtn.on(BI.TriggerIconButton.EVENT_CHANGE, function () {
- self.trigger.getCounter().hideView();
- if (self.combo.isViewVisible()) {
- self.combo.hideView();
- } else {
- self.combo.showView();
- }
- });
- BI.createWidget({
- type: "bi.absolute",
- element: this,
- items: [{
- el: this.combo,
- left: 0,
- right: 0,
- top: 0,
- bottom: 0
- }, {
- el: triggerBtn,
- right: 0,
- top: 0,
- bottom: 0
- }]
- })
- },
-
- _defaultState: function () {
- this.trigger.stopEditing();
- this.combo.hideView();
- },
-
- _assertValue: function (val) {
- val || (val = {});
- val.type || (val.type = BI.Selection.Multi);
- val.value || (val.value = []);
- },
-
- _makeMap: function (values) {
- return BI.makeObject(values || []);
- },
-
- _joinKeywords: function (keywords, callback) {
- var self = this, o = this.options;
- this._assertValue(this.storeValue);
- this.requesting = true;
- o.itemsCreator({
- type: BI.MultiSelectCombo.REQ_GET_ALL_DATA,
- keywords: keywords
- }, function (ob) {
- var values = BI.pluck(ob.items, "value");
- digest(values);
- });
-
- function digest(items) {
- var selectedMap = self._makeMap(items);
- BI.each(keywords, function (i, val) {
- if (BI.isNotNull(selectedMap[val])) {
- self.storeValue.value[self.storeValue.type === BI.Selection.Multi ? "pushDistinct" : "remove"](val);
- }
- });
- self._adjust(callback);
- }
- },
-
- _joinAll: function (res, callback) {
- var self = this, o = this.options;
- this._assertValue(res);
- this.requesting = true;
- o.itemsCreator({
- type: BI.MultiSelectCombo.REQ_GET_ALL_DATA,
- keywords: [this.trigger.getKey()]
- }, function (ob) {
- var items = BI.pluck(ob.items, "value");
- if (self.storeValue.type === res.type) {
- var change = false;
- var map = self._makeMap(self.storeValue.value);
- BI.each(items, function (i, v) {
- if (BI.isNotNull(map[v])) {
- change = true;
- delete map[v];
- }
- });
- change && (self.storeValue.value = BI.values(map));
- self._adjust(callback);
- return;
- }
- var selectedMap = self._makeMap(self.storeValue.value);
- var notSelectedMap = self._makeMap(res.value);
- var newItems = [];
- BI.each(items, function (i, item) {
- if (BI.isNotNull(selectedMap[items[i]])) {
- delete selectedMap[items[i]];
- }
- if (BI.isNull(notSelectedMap[items[i]])) {
- newItems.push(item);
- }
- });
- self.storeValue.value = newItems.concat(BI.values(selectedMap));
- self._adjust(callback);
- })
- },
-
- _adjust: function (callback) {
- var self = this, o = this.options;
- if (!this._count) {
- o.itemsCreator({
- type: BI.MultiSelectCombo.REQ_GET_DATA_LENGTH
- }, function (res) {
- self._count = res.count;
- adjust();
- callback();
- });
- } else {
- adjust();
- callback();
-
- }
-
- function adjust() {
- if (self.storeValue.type === BI.Selection.All && self.storeValue.value.length >= self._count) {
- self.storeValue = {
- type: BI.Selection.Multi,
- value: []
- }
- } else if (self.storeValue.type === BI.Selection.Multi && self.storeValue.value.length >= self._count) {
- self.storeValue = {
- type: BI.Selection.All,
- value: []
- }
- }
- if (self.wants2Quit === true) {
- self.fireEvent(BI.MultiSelectCombo.EVENT_CONFIRM);
- self.wants2Quit = false;
- }
- self.requesting = false;
- }
- },
-
- _join: function (res, callback) {
- var self = this, o = this.options;
- this._assertValue(res);
- this._assertValue(this.storeValue);
- if (this.storeValue.type === res.type) {
- var map = this._makeMap(this.storeValue.value);
- BI.each(res.value, function (i, v) {
- if (!map[v]) {
- self.storeValue.value.push(v);
- map[v] = v;
- }
- });
- var change = false;
- BI.each(res.assist, function (i, v) {
- if (BI.isNotNull(map[v])) {
- change = true;
- delete map[v];
- }
- });
- change && (this.storeValue.value = BI.values(map));
- self._adjust(callback);
- return;
- }
- this._joinAll(res, callback);
- },
-
- _setStartValue: function (value) {
- this._startValue = value;
- this.popup.setStartValue(value);
- },
-
- setValue: function (v) {
- this.storeValue = v || {};
- this._assertValue(this.storeValue);
- this.combo.setValue(this.storeValue);
- },
-
- getValue: function () {
- return BI.deepClone(this.storeValue);
- },
-
- populate: function () {
- this._count = null;
- this.combo.populate.apply(this.combo, arguments);
- }
-});
-
-BI.extend(BI.MultiSelectCombo, {
- REQ_GET_DATA_LENGTH: 0,
- REQ_GET_ALL_DATA: -1
-});
-
-BI.MultiSelectCombo.EVENT_CONFIRM = "EVENT_CONFIRM";
-
-BI.shortcut('bi.multi_select_combo', BI.MultiSelectCombo);/**
- * 多选加载数据面板
- * Created by guy on 15/11/2.
- * @class BI.MultiSelectLoader
- * @extends Widget
- */
-BI.MultiSelectLoader = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.MultiSelectLoader.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-multi-select-loader',
- logic: {
- dynamic: true
- },
- el: {
- height: 400
- },
- valueFormatter: BI.emptyFn,
- itemsCreator: BI.emptyFn,
- onLoaded: BI.emptyFn
- });
- },
-
- _init: function () {
- BI.MultiSelectLoader.superclass._init.apply(this, arguments);
-
- var self = this, opts = this.options;
- var hasNext = false;
-
- this.button_group = BI.createWidget({
- type: "bi.select_list",
- element: this,
- logic: opts.logic,
- el: BI.extend({
- onLoaded: opts.onLoaded,
- el: {
- type: "bi.loader",
- isDefaultInit: false,
- logic: {
- dynamic: true,
- scrolly: true
- },
- el: {
- chooseType: BI.ButtonGroup.CHOOSE_TYPE_MULTI,
- behaviors: {
- redmark: function () {
- return true;
- }
- },
- layouts: [{
- type: "bi.vertical"
- }]
- }
- }
- }, opts.el),
- itemsCreator: function (op, callback) {
- var startValue = self._startValue;
- self.storeValue && (op = BI.extend(op || {}, {
- selectedValues: BI.isKey(startValue) && self.storeValue.type === BI.Selection.Multi
- ? self.storeValue.value.concat(startValue) : self.storeValue.value
- }));
- opts.itemsCreator(op, function (ob) {
- hasNext = ob.hasNext;
- var firstItems = [];
- if (op.times === 1 && self.storeValue) {
- var json = BI.map(self.storeValue.value, function (i, v) {
- var txt = opts.valueFormatter(v) || v;
- return {
- text: txt,
- value: v,
- title: txt,
- selected: self.storeValue.type === BI.Selection.Multi
- }
- });
- if (BI.isKey(self._startValue) && !self.storeValue.value.contains(self._startValue)) {
- var txt = opts.valueFormatter(startValue) || startValue;
- json.unshift({
- text: txt,
- value: startValue,
- title: txt,
- selected: true
- })
- }
- firstItems = self._createItems(json);
- }
- callback(firstItems.concat(self._createItems(ob.items)), ob.keyword || "");
- if (op.times === 1 && self.storeValue) {
- BI.isKey(startValue) && self.storeValue.value[self.storeValue.type === BI.Selection.All ? "remove" : "pushDistinct"](startValue);
- self.setValue(self.storeValue);
- }
- (op.times === 1) && self._scrollToTop();
- });
- },
- hasNext: function () {
- return hasNext;
- }
- });
- this.button_group.on(BI.Controller.EVENT_CHANGE, function () {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
- this.button_group.on(BI.SelectList.EVENT_CHANGE, function () {
- self.fireEvent(BI.MultiSelectLoader.EVENT_CHANGE, arguments);
- });
- },
-
- _createItems: function (items) {
- return BI.createItems(items, {
- type: "bi.multi_select_item",
- logic: this.options.logic,
- height: 25,
- selected: this.isAllSelected()
- })
- },
-
- _scrollToTop: function () {
- var self = this;
- BI.delay(function () {
- self.button_group.element.scrollTop(0);
- }, 30);
- },
-
- isAllSelected: function () {
- return this.button_group.isAllSelected();
- },
-
- _assertValue: function (val) {
- val || (val = {});
- val.type || (val.type = BI.Selection.Multi);
- val.value || (val.value = []);
- },
-
- setStartValue: function (v) {
- this._startValue = v;
- },
-
- setValue: function (v) {
- this.storeValue = v || {};
- this._assertValue(this.storeValue);
- this.button_group.setValue(this.storeValue);
- },
-
- getValue: function () {
- return this.button_group.getValue();
- },
-
- getAllButtons: function () {
- return this.button_group.getAllButtons();
- },
-
- empty: function () {
- this.button_group.empty();
- },
-
- populate: function (items) {
- this.button_group.populate.apply(this.button_group, arguments);
- },
-
- resetHeight: function (h) {
- this.button_group.resetHeight(h);
- },
-
- resetWidth: function (w) {
- this.button_group.resetWidth(w);
- }
-});
-
-BI.MultiSelectLoader.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut('bi.multi_select_loader', BI.MultiSelectLoader);/**
- * 带加载的多选下拉面板
- * @class BI.MultiSelectPopupView
- * @extends Widget
- */
-BI.MultiSelectPopupView = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.MultiSelectPopupView.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-multi-select-popup-view',
- maxWidth: 'auto',
- minWidth: 135,
- maxHeight: 400,
- valueFormatter: BI.emptyFn,
- itemsCreator: BI.emptyFn,
- onLoaded: BI.emptyFn
- });
- },
-
- _init: function () {
- BI.MultiSelectPopupView.superclass._init.apply(this, arguments);
- var self = this, opts = this.options;
-
- this.loader = BI.createWidget({
- type: "bi.multi_select_loader",
- itemsCreator: opts.itemsCreator,
- valueFormatter: opts.valueFormatter,
- onLoaded: opts.onLoaded
- });
-
- this.popupView = BI.createWidget({
- type: "bi.multi_popup_view",
- stopPropagation: false,
- maxWidth: opts.maxWidth,
- minWidth: opts.minWidth,
- maxHeight: opts.maxHeight,
- element: this,
- buttons: [BI.i18nText('BI-Basic_Clears'), BI.i18nText('BI-Basic_Sure')],
- el: this.loader
- });
-
- this.popupView.on(BI.MultiPopupView.EVENT_CHANGE, function () {
- self.fireEvent(BI.MultiSelectPopupView.EVENT_CHANGE);
- });
- this.popupView.on(BI.MultiPopupView.EVENT_CLICK_TOOLBAR_BUTTON, function (index) {
- switch (index) {
- case 0:
- self.fireEvent(BI.MultiSelectPopupView.EVENT_CLICK_CLEAR);
- break;
- case 1:
- self.fireEvent(BI.MultiSelectPopupView.EVENT_CLICK_CONFIRM);
- break;
- }
- });
- },
-
- isAllSelected: function () {
- return this.loader.isAllSelected();
- },
-
- setStartValue: function (v) {
- this.loader.setStartValue(v);
- },
-
- setValue: function (v) {
- this.popupView.setValue(v);
- },
-
- getValue: function () {
- return this.popupView.getValue();
- },
-
- populate: function (items) {
- this.popupView.populate.apply(this.popupView, arguments);
- },
-
- resetHeight: function (h) {
- this.popupView.resetHeight(h);
- },
-
- resetWidth: function (w) {
- this.popupView.resetWidth(w);
- }
-});
-
-BI.MultiSelectPopupView.EVENT_CHANGE = "EVENT_CHANGE";
-BI.MultiSelectPopupView.EVENT_CLICK_CONFIRM = "EVENT_CLICK_CONFIRM";
-BI.MultiSelectPopupView.EVENT_CLICK_CLEAR = "EVENT_CLICK_CLEAR";
-
-
-BI.shortcut('bi.multi_select_popup_view', BI.MultiSelectPopupView);/**
- *
- * 复选下拉框
- * @class BI.MultiSelectTrigger
- * @extends BI.Trigger
- */
-
-BI.MultiSelectTrigger = BI.inherit(BI.Trigger, {
-
- constants: {
- height: 14,
- rgap: 4,
- lgap: 4
- },
-
- _defaultConfig: function () {
- return BI.extend(BI.MultiSelectTrigger.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-multi-select-trigger bi-border",
- itemsCreator: BI.emptyFn,
- valueFormatter: BI.emptyFn,
- searcher: {},
- switcher: {},
-
- adapter: null,
- masker: {}
- });
- },
-
- _init: function () {
- BI.MultiSelectTrigger.superclass._init.apply(this, arguments);
-
- var self = this, o = this.options;
- if (o.height) {
- this.setHeight(o.height - 2);
- }
-
- this.searcher = BI.createWidget(o.searcher, {
- type: "bi.multi_select_searcher",
- height: o.height,
- itemsCreator: o.itemsCreator,
- valueFormatter: o.valueFormatter,
- popup: {},
- adapter: o.adapter,
- masker: o.masker
- });
- this.searcher.on(BI.MultiSelectSearcher.EVENT_START, function () {
- self.fireEvent(BI.MultiSelectTrigger.EVENT_START);
- });
- this.searcher.on(BI.MultiSelectSearcher.EVENT_PAUSE, function () {
- self.fireEvent(BI.MultiSelectTrigger.EVENT_PAUSE);
- });
- this.searcher.on(BI.MultiSelectSearcher.EVENT_SEARCHING, function () {
- self.fireEvent(BI.MultiSelectTrigger.EVENT_SEARCHING, arguments);
- });
- this.searcher.on(BI.MultiSelectSearcher.EVENT_STOP, function () {
- self.fireEvent(BI.MultiSelectTrigger.EVENT_STOP);
- });
- this.searcher.on(BI.MultiSelectSearcher.EVENT_CHANGE, function () {
- self.fireEvent(BI.MultiSelectTrigger.EVENT_CHANGE, arguments);
- });
- this.numberCounter = BI.createWidget(o.switcher, {
- type: 'bi.multi_select_check_selected_switcher',
- valueFormatter: o.valueFormatter,
- itemsCreator: o.itemsCreator,
- adapter: o.adapter,
- masker: o.masker
- });
- this.numberCounter.on(BI.MultiSelectCheckSelectedSwitcher.EVENT_TRIGGER_CHANGE, function () {
- self.fireEvent(BI.MultiSelectTrigger.EVENT_COUNTER_CLICK);
- });
- this.numberCounter.on(BI.MultiSelectCheckSelectedSwitcher.EVENT_BEFORE_POPUPVIEW, function () {
- self.fireEvent(BI.MultiSelectTrigger.EVENT_BEFORE_COUNTER_POPUPVIEW);
- });
-
- var wrapNumberCounter = BI.createWidget({
- type: 'bi.right_vertical_adapt',
- hgap: 4,
- items: [{
- el: this.numberCounter
- }]
- });
-
- var wrapper = BI.createWidget({
- type: 'bi.htape',
- element: this,
- items: [
- {
- el: this.searcher,
- width: 'fill'
- }, {
- el: wrapNumberCounter,
- width: 0
- }, {
- el: BI.createWidget(),
- width: 30
- }]
- });
-
- this.numberCounter.on(BI.Events.VIEW, function (b) {
- BI.nextTick(function () {//自动调整宽度
- wrapper.attr("items")[1].width = (b === true ? self.numberCounter.element.outerWidth() + 8 : 0);
- wrapper.resize();
- });
- });
-
- this.element.click(function (e) {
- if (self.element.__isMouseInBounds__(e) && !self.numberCounter.element.__isMouseInBounds__(e)) {
- self.numberCounter.hideView();
- }
- });
- },
-
- getCounter: function () {
- return this.numberCounter;
- },
-
- getSearcher: function () {
- return this.searcher;
- },
-
- stopEditing: function () {
- this.searcher.stopSearch();
- this.numberCounter.hideView();
- },
-
- setAdapter: function (adapter) {
- this.searcher.setAdapter(adapter);
- this.numberCounter.setAdapter(adapter);
- },
-
- setValue: function (ob) {
- this.searcher.setValue(ob);
- this.numberCounter.setValue(ob);
- },
-
- getKey: function () {
- return this.searcher.getKey();
- },
-
- getValue: function () {
- return this.searcher.getValue();
- }
-});
-
-BI.MultiSelectTrigger.EVENT_TRIGGER_CLICK = "EVENT_TRIGGER_CLICK";
-BI.MultiSelectTrigger.EVENT_COUNTER_CLICK = "EVENT_COUNTER_CLICK";
-BI.MultiSelectTrigger.EVENT_CHANGE = "EVENT_CHANGE";
-BI.MultiSelectTrigger.EVENT_START = "EVENT_START";
-BI.MultiSelectTrigger.EVENT_STOP = "EVENT_STOP";
-BI.MultiSelectTrigger.EVENT_PAUSE = "EVENT_PAUSE";
-BI.MultiSelectTrigger.EVENT_SEARCHING = "EVENT_SEARCHING";
-BI.MultiSelectTrigger.EVENT_BEFORE_COUNTER_POPUPVIEW = "EVENT_BEFORE_COUNTER_POPUPVIEW";
-
-BI.shortcut('bi.multi_select_trigger', BI.MultiSelectTrigger);/**
- * 多选加载数据搜索loader面板
- * Created by guy on 15/11/4.
- * @class BI.MultiSelectSearchLoader
- * @extends Widget
- */
-BI.MultiSelectSearchLoader = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.MultiSelectSearchLoader.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-multi-select-search-loader',
- itemsCreator: BI.emptyFn,
- keywordGetter: BI.emptyFn,
- valueFormatter: BI.emptyFn
- });
- },
-
- _init: function () {
- BI.MultiSelectSearchLoader.superclass._init.apply(this, arguments);
-
- var self = this, opts = this.options;
- var hasNext = false;
-
- this.button_group = BI.createWidget({
- type: "bi.select_list",
- element: this,
- logic: {
- dynamic: false
- },
- el: {
- tipText: BI.i18nText("BI-No_Select"),
- el: {
- type: "bi.loader",
- isDefaultInit: false,
- logic: {
- dynamic: true,
- scrolly: true
- },
- el: {
- chooseType: BI.ButtonGroup.CHOOSE_TYPE_MULTI,
- behaviors: {
- redmark: function () {
- return true;
- }
- },
- layouts: [{
- type: "bi.vertical"
- }]
- }
- }
- },
- itemsCreator: function (op, callback) {
- self.storeValue && (op = BI.extend(op || {}, {
- selectedValues: self.storeValue.value
- }));
- opts.itemsCreator(op, function (ob) {
- var keyword = ob.keyword = opts.keywordGetter();
- hasNext = ob.hasNext;
- var firstItems = [];
- if (op.times === 1 && self.storeValue) {
- var json = self._filterValues(self.storeValue);
- firstItems = self._createItems(json);
- }
- callback(firstItems.concat(self._createItems(ob.items)), keyword);
- if (op.times === 1 && self.storeValue) {
- self.setValue(self.storeValue);
- }
- });
- },
- hasNext: function () {
- return hasNext;
- }
- });
- this.button_group.on(BI.Controller.EVENT_CHANGE, function () {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
- this.button_group.on(BI.SelectList.EVENT_CHANGE, function () {
- self.fireEvent(BI.MultiSelectSearchLoader.EVENT_CHANGE, arguments);
- });
- },
-
- _createItems: function (items) {
- return BI.createItems(items, {
- type: "bi.multi_select_item",
- logic: {
- dynamic: false
- },
- height: 25,
- selected: this.isAllSelected()
- })
- },
-
- isAllSelected: function () {
- return this.button_group.isAllSelected();
- },
-
- _filterValues: function (src) {
- var o = this.options;
- var keyword = o.keywordGetter();
- var values = BI.deepClone(src.value) || [];
- var newValues = BI.map(values, function (i, v) {
- return {
- text: o.valueFormatter(v) || v,
- value: v
- };
- });
- if (BI.isKey(keyword)) {
- var search = BI.Func.getSearchResult(newValues, keyword);
- values = search.matched.concat(search.finded);
- }
- return BI.map(values, function (i, v) {
- return {
- text: v.text,
- title: v.text,
- value: v.value,
- selected: src.type === BI.Selection.All
- }
- })
- },
-
- setValue: function (v) {
- //暂存的值一定是新的值,不然v改掉后,storeValue也跟着改了
- this.storeValue = BI.deepClone(v);
- this.button_group.setValue(v);
- },
-
- getValue: function () {
- return this.button_group.getValue();
- },
-
- getAllButtons: function () {
- return this.button_group.getAllButtons();
- },
-
- empty: function () {
- this.button_group.empty();
- },
-
- populate: function (items) {
- this.button_group.populate.apply(this.button_group, arguments);
- },
-
- resetHeight: function (h) {
- this.button_group.resetHeight(h);
- },
-
- resetWidth: function (w) {
- this.button_group.resetWidth(w);
- }
-});
-
-BI.MultiSelectSearchLoader.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut('bi.multi_select_search_loader', BI.MultiSelectSearchLoader);/**
- *
- * 在搜索框中输入文本弹出的面板
- * @class BI.MultiSelectSearchPane
- * @extends Widget
- */
-
-BI.MultiSelectSearchPane = BI.inherit(BI.Widget, {
-
- constants: {
- height: 25,
- lgap: 10,
- tgap: 5
- },
-
- _defaultConfig: function () {
- return BI.extend(BI.MultiSelectSearchPane.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-multi-select-search-pane bi-card",
- itemsCreator: BI.emptyFn,
- valueFormatter: BI.emptyFn,
- keywordGetter: BI.emptyFn
- });
- },
-
- _init: function () {
- BI.MultiSelectSearchPane.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
-
- this.tooltipClick = BI.createWidget({
- type: "bi.label",
- invisible: true,
- text: BI.i18nText('BI-Click_Blank_To_Select'),
- cls: 'multi-select-toolbar',
- height: this.constants.height
- });
-
- this.loader = BI.createWidget({
- type: "bi.multi_select_search_loader",
- keywordGetter: o.keywordGetter,
- valueFormatter: o.valueFormatter,
- itemsCreator: function (op, callback) {
- o.itemsCreator.apply(self, [op, function (res) {
- callback(res);
- self.setKeyword(o.keywordGetter());
- }]);
- }
- });
- this.loader.on(BI.Controller.EVENT_CHANGE, function () {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
-
- this.resizer = BI.createWidget({
- type: "bi.vtape",
- element: this,
- items: [{
- el: this.tooltipClick,
- height: 0
- }, {
- el: this.loader
- }]
- });
- this.tooltipClick.setVisible(false);
- },
-
- setKeyword: function (keyword) {
- var btn;
- var isVisible = this.loader.getAllButtons().length > 0 && (btn = this.loader.getAllButtons()[0]) && (keyword === btn.getValue());
- if (isVisible !== this.tooltipClick.isVisible()) {
- this.tooltipClick.setVisible(isVisible);
- this.resizer.attr("items")[0].height = (isVisible ? this.constants.height : 0);
- this.resizer.resize();
- }
- },
-
- isAllSelected: function () {
- return this.loader.isAllSelected();
- },
-
- hasMatched: function () {
- return this.tooltipClick.isVisible();
- },
-
- setValue: function (v) {
- this.loader.setValue(v);
- },
-
- getValue: function () {
- return this.loader.getValue();
- },
-
- empty: function () {
- this.loader.empty();
- },
-
- populate: function (items) {
- this.loader.populate.apply(this.loader, arguments);
- }
-});
-
-BI.MultiSelectSearchPane.EVENT_CHANGE = "EVENT_CHANGE";
-
-BI.shortcut("bi.multi_select_search_pane", BI.MultiSelectSearchPane);/**
- * 查看已选按钮
- * Created by guy on 15/11/3.
- * @class BI.MultiSelectCheckSelectedButton
- * @extends BI.Single
- */
-BI.MultiSelectCheckSelectedButton = BI.inherit(BI.Single, {
-
- _const: {
- checkSelected: BI.i18nText('BI-Check_Selected')
- },
-
- _defaultConfig: function () {
- return BI.extend(BI.MultiSelectCheckSelectedButton.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-multi-select-check-selected-button bi-high-light',
- itemsCreator: BI.emptyFn
- });
- },
-
- _init: function () {
- BI.MultiSelectCheckSelectedButton.superclass._init.apply(this, arguments);
- var self = this;
- this.numberCounter = BI.createWidget({
- type: 'bi.text_button',
- element: this,
- hgap: 4,
- text: "0",
- textAlign: 'center',
- textHeight: 15
- });
- this.numberCounter.on(BI.Controller.EVENT_CHANGE, function () {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
-
- this.numberCounter.on(BI.TextButton.EVENT_CHANGE, function () {
- self.fireEvent(BI.MultiSelectCheckSelectedButton.EVENT_CHANGE, arguments);
- });
-
- this.numberCounter.element.hover(function () {
- self.numberCounter.setTag(self.numberCounter.getText());
- self.numberCounter.setText(self._const.checkSelected);
- }, function () {
- self.numberCounter.setText(self.numberCounter.getTag());
- });
- this.setVisible(false);
- },
-
- setValue: function (ob) {
- var self = this, o = this.options;
- ob || (ob = {});
- ob.type || (ob.type = BI.Selection.Multi);
- ob.value || (ob.value = []);
- if (ob.type === BI.Selection.All) {
- o.itemsCreator({
- type: BI.MultiSelectCombo.REQ_GET_DATA_LENGTH
- }, function (res) {
- var length = res.count - ob.value.length;
- BI.nextTick(function(){
- self.numberCounter.setText(length);
- self.setVisible(length > 0);
- });
- });
- return;
- }
- BI.nextTick(function(){
- self.numberCounter.setText(ob.value.length);
- self.setVisible(ob.value.length > 0);
- })
- },
-
- getValue: function () {
-
- }
-});
-
-BI.MultiSelectCheckSelectedButton.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut('bi.multi_select_check_selected_button', BI.MultiSelectCheckSelectedButton);/**
- * 多选输入框
- * Created by guy on 15/11/3.
- * @class BI.MultiSelectEditor
- * @extends Widget
- */
-BI.MultiSelectEditor = BI.inherit(BI.Widget, {
-
- _const: {
- checkSelected: BI.i18nText('BI-Check_Selected')
- },
-
- _defaultConfig: function () {
- return BI.extend(BI.MultiSelectEditor.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-multi-select-editor',
- el: {}
- });
- },
-
- _init: function () {
- BI.MultiSelectEditor.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.editor = BI.createWidget(o.el, {
- type: 'bi.state_editor',
- element: this,
- height: o.height,
- watermark: BI.i18nText('BI-Basic_Search'),
- allowBlank: true
- });
-
- this.editor.on(BI.Controller.EVENT_CHANGE, function () {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
-
- this.editor.on(BI.StateEditor.EVENT_PAUSE, function () {
- self.fireEvent(BI.MultiSelectEditor.EVENT_PAUSE);
- });
- this.editor.on(BI.StateEditor.EVENT_CLICK_LABEL, function () {
-
- });
- },
-
- focus: function () {
- this.editor.focus();
- },
-
- blur: function () {
- this.editor.blur();
- },
-
- setState: function (state) {
- this.editor.setState(state);
- },
-
- setValue: function (v) {
- this.editor.setValue(v);
- },
-
- getValue: function () {
- var v = this.editor.getState();
- if (BI.isArray(v) && v.length > 0) {
- return v[v.length - 1];
- } else {
- return "";
- }
- },
-
- getKeywords: function () {
- var val = this.editor.getLastValidValue();
- var keywords = val.match(/[\S]+/g);
- if (BI.isEndWithBlank(val)) {
- return keywords.concat([' ']);
- }
- return keywords;
- },
-
- populate: function (items) {
-
- }
-});
-BI.MultiSelectEditor.EVENT_PAUSE = "MultiSelectEditor.EVENT_PAUSE";
-BI.shortcut('bi.multi_select_editor', BI.MultiSelectEditor);/**
- * searcher
- * Created by guy on 15/11/3.
- * @class BI.MultiSelectSearcher
- * @extends Widget
- */
-BI.MultiSelectSearcher = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.MultiSelectSearcher.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-multi-select-searcher',
- itemsCreator: BI.emptyFn,
- el: {},
- popup: {},
- valueFormatter: BI.emptyFn,
- adapter: null,
- masker: {}
- });
- },
-
- _init: function () {
- BI.MultiSelectSearcher.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.editor = BI.createWidget(o.el, {
- type: 'bi.multi_select_editor',
- height: o.height
- });
-
- this.searcher = BI.createWidget({
- type: "bi.searcher",
- element: this,
- height: o.height,
- isAutoSearch: false,
- isAutoSync: false,
- onSearch: function (op, callback) {
- callback();
- },
- el: this.editor,
-
- popup: BI.extend({
- type: "bi.multi_select_search_pane",
- valueFormatter: o.valueFormatter,
- keywordGetter: function () {
- return self.editor.getValue();
- },
- itemsCreator: function (op, callback) {
- op.keyword = self.editor.getValue();
- this.setKeyword(op.keyword);
- o.itemsCreator(op, callback);
- }
- }, o.popup),
-
- adapter: o.adapter,
- masker: o.masker
- });
- this.searcher.on(BI.Searcher.EVENT_START, function () {
- self.fireEvent(BI.MultiSelectSearcher.EVENT_START);
- });
- this.searcher.on(BI.Searcher.EVENT_PAUSE, function () {
- if (this.hasMatched()) {
-
- }
- self.fireEvent(BI.MultiSelectSearcher.EVENT_PAUSE);
- });
- this.searcher.on(BI.Searcher.EVENT_STOP, function () {
- self.fireEvent(BI.MultiSelectSearcher.EVENT_STOP);
- });
- this.searcher.on(BI.Searcher.EVENT_CHANGE, function () {
- self.fireEvent(BI.MultiSelectSearcher.EVENT_CHANGE, arguments);
- });
- this.searcher.on(BI.Searcher.EVENT_SEARCHING, function () {
- var keywords = this.getKeywords();
- self.fireEvent(BI.MultiSelectSearcher.EVENT_SEARCHING, keywords);
- });
- },
-
- adjustView: function () {
- this.searcher.adjustView();
- },
-
- isSearching: function () {
- return this.searcher.isSearching();
- },
-
- stopSearch: function () {
- this.searcher.stopSearch();
- },
-
- getKeyword: function () {
- return this.editor.getValue();
- },
-
- hasMatched: function () {
- return this.searcher.hasMatched();
- },
-
- hasChecked: function () {
- return this.searcher.getView() && this.searcher.getView().hasChecked();
- },
-
- setAdapter: function (adapter) {
- this.searcher.setAdapter(adapter);
- },
-
- setState: function (ob) {
- var o = this.options;
- ob || (ob = {});
- ob.value || (ob.value = []);
- if (ob.type === BI.Selection.All) {
- if (ob.value.length === 0) {
- this.editor.setState(BI.Selection.All);
- } else if (BI.size(ob.assist) <= 20) {
- var state = "";
- BI.each(ob.assist, function (i, v) {
- if (i === 0) {
- state += "" + (o.valueFormatter(v + "") || v);
- } else {
- state += "," + (o.valueFormatter(v + "") || v);
- }
- });
- this.editor.setState(state);
- } else {
- this.editor.setState(BI.Selection.Multi);
- }
- } else {
- if (ob.value.length === 0) {
- this.editor.setState(BI.Selection.None);
- } else if (BI.size(ob.value) <= 20) {
- var state = "";
- BI.each(ob.value, function (i, v) {
- if (i === 0) {
- state += "" + (o.valueFormatter(v + "") || v);
- } else {
- state += "," + (o.valueFormatter(v + "") || v);
- }
- });
- this.editor.setState(state);
- } else {
- this.editor.setState(BI.Selection.Multi);
- }
- }
- },
-
- setValue: function (ob) {
- this.setState(ob);
- this.searcher.setValue(ob);
- },
-
- getKey: function () {
- return this.editor.getValue();
- },
-
- getValue: function () {
- return this.searcher.getValue();
- },
-
- populate: function (items) {
- this.searcher.populate.apply(this.searcher, arguments);
- }
-});
-
-BI.MultiSelectSearcher.EVENT_BEFORE_POPUPVIEW = "EVENT_BEFORE_POPUPVIEW";
-BI.MultiSelectSearcher.EVENT_CHANGE = "EVENT_CHANGE";
-BI.MultiSelectSearcher.EVENT_START = "EVENT_START";
-BI.MultiSelectSearcher.EVENT_STOP = "EVENT_STOP";
-BI.MultiSelectSearcher.EVENT_PAUSE = "EVENT_PAUSE";
-BI.MultiSelectSearcher.EVENT_SEARCHING = "EVENT_SEARCHING";
-BI.shortcut('bi.multi_select_searcher', BI.MultiSelectSearcher);/**
- * 查看已选switcher
- * Created by guy on 15/11/3.
- * @class BI.MultiSelectCheckSelectedSwitcher
- * @extends Widget
- */
-BI.MultiSelectCheckSelectedSwitcher = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.MultiSelectCheckSelectedSwitcher.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-multi-select-check-selected-switcher',
- itemsCreator: BI.emptyFn,
- valueFormatter: BI.emptyFn,
- el: {},
- popup: {},
- adapter: null,
- masker: {}
- });
- },
-
- _init: function () {
- BI.MultiSelectCheckSelectedSwitcher.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
-
- this.button = BI.createWidget(o.el, {
- type: "bi.multi_select_check_selected_button",
- itemsCreator: o.itemsCreator
- });
- this.button.on(BI.Events.VIEW, function () {
- self.fireEvent(BI.Events.VIEW, arguments);
- });
- this.switcher = BI.createWidget({
- type: "bi.switcher",
- toggle: false,
- element: this,
- el: this.button,
- popup: BI.extend({
- type: "bi.multi_select_check_pane",
- valueFormatter: o.valueFormatter,
- itemsCreator: o.itemsCreator,
- onClickContinueSelect: function () {
- self.switcher.hideView();
- }
- }, o.popup),
- adapter: o.adapter,
- masker: o.masker
- });
- this.switcher.on(BI.Switcher.EVENT_TRIGGER_CHANGE, function () {
- self.fireEvent(BI.MultiSelectCheckSelectedSwitcher.EVENT_TRIGGER_CHANGE);
- });
- this.switcher.on(BI.Switcher.EVENT_BEFORE_POPUPVIEW, function () {
- self.fireEvent(BI.MultiSelectCheckSelectedSwitcher.EVENT_BEFORE_POPUPVIEW);
- });
- this.switcher.on(BI.Switcher.EVENT_AFTER_POPUPVIEW, function () {
- var me = this;
- BI.nextTick(function () {
- me.populate();
- });
- });
-
- this.switcher.element.click(function (e) {
- e.stopPropagation();
- });
- },
-
- adjustView: function () {
- this.switcher.adjustView();
- },
-
- hideView: function () {
- this.switcher.empty();
- this.switcher.hideView();
- },
-
- setAdapter: function (adapter) {
- this.switcher.setAdapter(adapter);
- },
-
- setValue: function (v) {
- this.switcher.setValue(v);
- },
-
- setButtonChecked: function (v) {
- this.button.setValue(v)
- },
-
- getValue: function () {
-
- },
-
- populate: function (items) {
- this.switcher.populate.apply(this.switcher, arguments);
- }
-});
-
-BI.MultiSelectCheckSelectedSwitcher.EVENT_TRIGGER_CHANGE = "MultiSelectCheckSelectedSwitcher.EVENT_TRIGGER_CHANGE";
-BI.MultiSelectCheckSelectedSwitcher.EVENT_BEFORE_POPUPVIEW = "MultiSelectCheckSelectedSwitcher.EVENT_BEFORE_POPUPVIEW";
-BI.shortcut('bi.multi_select_check_selected_switcher', BI.MultiSelectCheckSelectedSwitcher);/**
- * Created by zcf_1 on 2017/5/2.
- */
-BI.MultiSelectInsertList = BI.inherit(BI.Widget, {
- _defaultConfig: function () {
- return BI.extend(BI.MultiSelectInsertList.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-multi-select-insert-list',
- itemsCreator: BI.emptyFn,
- valueFormatter: BI.emptyFn
- })
- },
- _init: function () {
- BI.MultiSelectInsertList.superclass._init.apply(this, arguments);
-
- var self = this, o = this.options;
- this.storeValue = {};
-
- var assertShowValue = function () {
- BI.isKey(self._startValue) && self.storeValue.value[self.storeValue.type === BI.Selection.All ? "remove" : "pushDistinct"](self._startValue);
- // self.trigger.setValue(self.storeValue);
- };
-
- this.adapter = BI.createWidget({
- type: "bi.multi_select_loader",
- cls: "popup-multi-select-list bi-border-left bi-border-right bi-border-bottom",
- itemsCreator: o.itemsCreator,
- valueFormatter: o.valueFormatter,
- logic: {
- dynamic: false
- },
- // onLoaded: o.onLoaded,
- el: {}
- });
- this.adapter.on(BI.MultiSelectLoader.EVENT_CHANGE, function () {
- self.storeValue = this.getValue();
- assertShowValue();
- self.fireEvent(BI.MultiSelectInsertList.EVENT_CHANGE);
- });
-
- this.searcherPane = BI.createWidget({
- type: "bi.multi_select_search_pane",
- cls: "bi-border-left bi-border-right bi-border-bottom",
- valueFormatter: o.valueFormatter,
- keywordGetter: function () {
- return self.trigger.getKeyword();
- },
- itemsCreator: function (op, callback) {
- op.keyword = self.trigger.getKeyword();
- this.setKeyword(op.keyword);
- o.itemsCreator(op, callback);
- }
- });
- this.searcherPane.setVisible(false);
-
- this.trigger = BI.createWidget({
- type: "bi.searcher",
- isAutoSearch: false,
- isAutoSync: false,
- onSearch: function (op, callback) {
- callback();
- },
- adapter: this.adapter,
- popup: this.searcherPane,
- height: 200,
- masker: false,
- listeners: [{
- eventName: BI.Searcher.EVENT_START,
- action: function () {
- self._showSearcherPane();
- self._setStartValue("");
- this.setValue(BI.deepClone(self.storeValue));
- }
- }, {
- eventName: BI.Searcher.EVENT_STOP,
- action: function () {
- self._showAdapter();
- self._setStartValue("");
- self.adapter.setValue(self.storeValue);
- //需要刷新回到初始界面,否则搜索的结果不能放在最前面
- self.adapter.populate();
- }
- }, {
- eventName: BI.Searcher.EVENT_PAUSE,
- action: function () {
- var keyword = this.getKeyword();
- if (this.hasMatched()) {
- self._join({
- type: BI.Selection.Multi,
- value: [keyword]
- }, function () {
- if (self.storeValue.type === BI.Selection.Multi) {
- self.storeValue.value.pushDistinct(keyword)
- }
- self._showAdapter();
- self.adapter.setValue(self.storeValue);
- self._setStartValue(keyword);
- assertShowValue();
- self.adapter.populate();
- self._setStartValue("");
- self.fireEvent(BI.MultiSelectInsertList.EVENT_CHANGE);
- })
- } else {
- if (self.storeValue.type === BI.Selection.Multi) {
- self.storeValue.value.pushDistinct(keyword)
- }
- self._showAdapter();
- self.adapter.setValue(self.storeValue);
- self.adapter.populate();
- if (self.storeValue.type === BI.Selection.Multi) {
- self.fireEvent(BI.MultiSelectInsertList.EVENT_CHANGE);
- }
- }
- }
- }, {
- eventName: BI.Searcher.EVENT_SEARCHING,
- action: function () {
- var keywords = this.getKeyword();
- var last = BI.last(keywords);
- keywords = BI.initial(keywords || []);
- if (keywords.length > 0) {
- self._joinKeywords(keywords, function () {
- if (BI.isEndWithBlank(last)) {
- self.adapter.setValue(self.storeValue);
- assertShowValue();
- self.adapter.populate();
- self._setStartValue("");
- } else {
- self.adapter.setValue(self.storeValue);
- assertShowValue();
- }
- });
- }
- }
- }, {
- eventName: BI.Searcher.EVENT_CHANGE,
- action: function (value, obj) {
- if (obj instanceof BI.MultiSelectBar) {
- self._joinAll(this.getValue(), function () {
- assertShowValue();
- self.fireEvent(BI.MultiSelectInsertList.EVENT_CHANGE);
- });
- } else {
- self._join(this.getValue(), function () {
- assertShowValue();
- self.fireEvent(BI.MultiSelectInsertList.EVENT_CHANGE);
- });
- }
- }
- }]
- });
-
- BI.createWidget({
- type: "bi.vtape",
- element: this,
- items: [{
- el: this.trigger,
- height: 24
- }, {
- el: this.adapter,
- height: "fill"
- }]
- });
- BI.createWidget({
- type: "bi.absolute",
- element: this,
- items: [{
- el: this.searcherPane,
- top: 30,
- bottom: 0,
- left: 0,
- right: 0
- }]
- })
- },
-
- _showAdapter: function () {
- this.adapter.setVisible(true);
- this.searcherPane.setVisible(false);
- },
-
- _showSearcherPane: function () {
- this.searcherPane.setVisible(true);
- this.adapter.setVisible(false);
- },
-
- _defaultState: function () {
- this.trigger.stopEditing();
- },
-
- _assertValue: function (val) {
- val || (val = {});
- val.type || (val.type = BI.Selection.Multi);
- val.value || (val.value = []);
- },
-
- _makeMap: function (values) {
- return BI.makeObject(values || []);
- },
-
- _joinKeywords: function (keywords, callback) {
- var self = this, o = this.options;
- this._assertValue(this.storeValue);
- if (!this._allData) {
- o.itemsCreator({
- type: BI.MultiSelectInsertList.REQ_GET_ALL_DATA
- }, function (ob) {
- self._allData = BI.pluck(ob.items, "value");
- digest(self._allData);
- })
- } else {
- digest(this._allData)
- }
-
- function digest(items) {
- var selectedMap = self._makeMap(items);
- BI.each(keywords, function (i, val) {
- if (BI.isNotNull(selectedMap[val])) {
- self.storeValue.value[self.storeValue.type === BI.Selection.Multi ? "pushDistinct" : "remove"](val);
- }
- });
- callback();
- }
- },
-
- _joinAll: function (res, callback) {
- var self = this, o = this.options;
- this._assertValue(res);
- o.itemsCreator({
- type: BI.MultiSelectInsertList.REQ_GET_ALL_DATA,
- keyword: self.trigger.getKeyword()
- }, function (ob) {
- var items = BI.pluck(ob.items, "value");
- if (self.storeValue.type === res.type) {
- var change = false;
- var map = self._makeMap(self.storeValue.value);
- BI.each(items, function (i, v) {
- if (BI.isNotNull(map[v])) {
- change = true;
- delete map[v];
- }
- });
- change && (self.storeValue.value = BI.values(map));
- callback();
- return;
- }
- var selectedMap = self._makeMap(self.storeValue.value);
- var notSelectedMap = self._makeMap(res.value);
- var newItems = [];
- BI.each(items, function (i, item) {
- if (BI.isNotNull(selectedMap[items[i]])) {
- delete selectedMap[items[i]];
- }
- if (BI.isNull(notSelectedMap[items[i]])) {
- newItems.push(item);
- }
- });
- self.storeValue.value = newItems.concat(BI.values(selectedMap));
- callback();
- })
- },
-
- _join: function (res, callback) {
- var self = this, o = this.options;
- this._assertValue(res);
- this._assertValue(this.storeValue);
- if (this.storeValue.type === res.type) {
- var map = this._makeMap(this.storeValue.value);
- BI.each(res.value, function (i, v) {
- if (!map[v]) {
- self.storeValue.value.push(v);
- map[v] = v;
- }
- });
- var change = false;
- BI.each(res.assist, function (i, v) {
- if (BI.isNotNull(map[v])) {
- change = true;
- delete map[v];
- }
- });
- change && (this.storeValue.value = BI.values(map));
- callback();
- return;
- }
- this._joinAll(res, callback);
- },
-
- _setStartValue: function (value) {
- this._startValue = value;
- this.adapter.setStartValue(value);
- },
-
- isAllSelected: function () {
- return this.adapter.isAllSelected();
- },
-
- resize: function () {
- // this.trigger.getCounter().adjustView();
- // this.trigger.adjustView();
- },
- setValue: function (v) {
- this.storeValue = v || {};
- this._assertValue(this.storeValue);
- this.adapter.setValue(this.storeValue);
- this.trigger.setValue(this.storeValue);
- },
-
- getValue: function () {
- return BI.deepClone(this.storeValue);
- },
-
- populate: function () {
- this._count = null;
- this._allData = null;
- this.adapter.populate.apply(this.adapter, arguments);
- this.trigger.populate.apply(this.trigger, arguments);
- }
-});
-
-BI.extend(BI.MultiSelectInsertList, {
- REQ_GET_DATA_LENGTH: 0,
- REQ_GET_ALL_DATA: -1
-});
-
-BI.MultiSelectInsertList.EVENT_CHANGE = "BI.MultiSelectInsertList.EVENT_CHANGE";
-BI.shortcut("bi.multi_select_insert_list", BI.MultiSelectInsertList);/**
- * Created by zcf_1 on 2017/5/2.
- */
-BI.MultiSelectList = BI.inherit(BI.Widget, {
- _defaultConfig: function () {
- return BI.extend(BI.MultiSelectList.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-multi-select-list',
- itemsCreator: BI.emptyFn,
- valueFormatter: BI.emptyFn
- })
- },
- _init: function () {
- BI.MultiSelectList.superclass._init.apply(this, arguments);
-
- var self = this, o = this.options;
- this.storeValue = {};
-
- var assertShowValue = function () {
- BI.isKey(self._startValue) && self.storeValue.value[self.storeValue.type === BI.Selection.All ? "remove" : "pushDistinct"](self._startValue);
- // self.trigger.setValue(self.storeValue);
- };
-
- this.adapter = BI.createWidget({
- type: "bi.multi_select_loader",
- cls: "popup-multi-select-list bi-border-left bi-border-right bi-border-bottom",
- itemsCreator: o.itemsCreator,
- valueFormatter: o.valueFormatter,
- logic: {
- dynamic: false
- },
- // onLoaded: o.onLoaded,
- el: {}
- });
- this.adapter.on(BI.MultiSelectLoader.EVENT_CHANGE, function () {
- self.storeValue = this.getValue();
- self._adjust(function () {
- assertShowValue();
- self.fireEvent(BI.MultiSelectList.EVENT_CHANGE);
- });
- });
-
- this.searcherPane = BI.createWidget({
- type: "bi.multi_select_search_pane",
- cls: "bi-border-left bi-border-right bi-border-bottom",
- valueFormatter: o.valueFormatter,
- keywordGetter: function () {
- return self.trigger.getKeyword();
- },
- itemsCreator: function (op, callback) {
- op.keyword = self.trigger.getKeyword();
- this.setKeyword(op.keyword);
- o.itemsCreator(op, callback);
- }
- });
- this.searcherPane.setVisible(false);
-
- this.trigger = BI.createWidget({
- type: "bi.searcher",
- isAutoSearch: false,
- isAutoSync: false,
- onSearch: function (op, callback) {
- callback();
- },
- adapter: this.adapter,
- popup: this.searcherPane,
- height: 200,
- masker: false,
- listeners: [{
- eventName: BI.Searcher.EVENT_START,
- action: function () {
- self._showSearcherPane();
- self._setStartValue("");
- this.setValue(BI.deepClone(self.storeValue));
- }
- }, {
- eventName: BI.Searcher.EVENT_STOP,
- action: function () {
- self._showAdapter();
- self._setStartValue("");
- self.adapter.setValue(self.storeValue);
- //需要刷新回到初始界面,否则搜索的结果不能放在最前面
- self.adapter.populate();
- }
- }, {
- eventName: BI.Searcher.EVENT_PAUSE,
- action: function () {
- var keyword = this.getKeyword();
- if (this.hasMatched()) {
- self._join({
- type: BI.Selection.Multi,
- value: [keyword]
- }, function () {
- self._showAdapter();
- self.adapter.setValue(self.storeValue);
- self._setStartValue(keyword);
- assertShowValue();
- self.adapter.populate();
- self._setStartValue("");
- self.fireEvent(BI.MultiSelectList.EVENT_CHANGE);
- })
- }
- }
- }, {
- eventName: BI.Searcher.EVENT_SEARCHING,
- action: function () {
- var keywords = this.getKeyword();
- var last = BI.last(keywords);
- keywords = BI.initial(keywords || []);
- if (keywords.length > 0) {
- self._joinKeywords(keywords, function () {
- if (BI.isEndWithBlank(last)) {
- self.adapter.setValue(self.storeValue);
- assertShowValue();
- self.adapter.populate();
- self._setStartValue("");
- } else {
- self.adapter.setValue(self.storeValue);
- assertShowValue();
- }
- });
- }
- }
- }, {
- eventName: BI.Searcher.EVENT_CHANGE,
- action: function (value, obj) {
- if (obj instanceof BI.MultiSelectBar) {
- self._joinAll(this.getValue(), function () {
- assertShowValue();
- self.fireEvent(BI.MultiSelectList.EVENT_CHANGE);
- });
- } else {
- self._join(this.getValue(), function () {
- assertShowValue();
- self.fireEvent(BI.MultiSelectList.EVENT_CHANGE);
- });
- }
- }
- }]
- });
-
- BI.createWidget({
- type: "bi.vtape",
- element: this,
- items: [{
- el: this.trigger,
- height: 24
- }, {
- el: this.adapter,
- height: "fill"
- }]
- });
- BI.createWidget({
- type: "bi.absolute",
- element: this,
- items: [{
- el: this.searcherPane,
- top: 30,
- bottom: 0,
- left: 0,
- right: 0
- }]
- })
- },
-
- _showAdapter: function () {
- this.adapter.setVisible(true);
- this.searcherPane.setVisible(false);
- },
-
- _showSearcherPane: function () {
- this.searcherPane.setVisible(true);
- this.adapter.setVisible(false);
- },
-
- _defaultState: function () {
- this.trigger.stopEditing();
- },
-
- _assertValue: function (val) {
- val || (val = {});
- val.type || (val.type = BI.Selection.Multi);
- val.value || (val.value = []);
- },
-
- _makeMap: function (values) {
- return BI.makeObject(values || []);
- },
-
- _joinKeywords: function (keywords, callback) {
- var self = this, o = this.options;
- this._assertValue(this.storeValue);
- if (!this._allData) {
- o.itemsCreator({
- type: BI.MultiSelectList.REQ_GET_ALL_DATA
- }, function (ob) {
- self._allData = BI.pluck(ob.items, "value");
- digest(self._allData);
- })
- } else {
- digest(this._allData)
- }
-
- function digest(items) {
- var selectedMap = self._makeMap(items);
- BI.each(keywords, function (i, val) {
- if (BI.isNotNull(selectedMap[val])) {
- self.storeValue.value[self.storeValue.type === BI.Selection.Multi ? "pushDistinct" : "remove"](val);
- }
- });
- self._adjust(callback);
- }
- },
-
- _joinAll: function (res, callback) {
- var self = this, o = this.options;
- this._assertValue(res);
- o.itemsCreator({
- type: BI.MultiSelectList.REQ_GET_ALL_DATA,
- keyword: self.trigger.getKeyword()
- }, function (ob) {
- var items = BI.pluck(ob.items, "value");
- if (self.storeValue.type === res.type) {
- var change = false;
- var map = self._makeMap(self.storeValue.value);
- BI.each(items, function (i, v) {
- if (BI.isNotNull(map[v])) {
- change = true;
- delete map[v];
- }
- });
- change && (self.storeValue.value = BI.values(map));
- self._adjust(callback);
- return;
- }
- var selectedMap = self._makeMap(self.storeValue.value);
- var notSelectedMap = self._makeMap(res.value);
- var newItems = [];
- BI.each(items, function (i, item) {
- if (BI.isNotNull(selectedMap[items[i]])) {
- delete selectedMap[items[i]];
- }
- if (BI.isNull(notSelectedMap[items[i]])) {
- newItems.push(item);
- }
- });
- self.storeValue.value = newItems.concat(BI.values(selectedMap));
- self._adjust(callback);
- })
- },
-
- _adjust: function (callback) {
- var self = this, o = this.options;
- if (!this._count) {
- o.itemsCreator({
- type: BI.MultiSelectList.REQ_GET_DATA_LENGTH
- }, function (res) {
- self._count = res.count;
- adjust();
- callback();
- });
- } else {
- adjust();
- callback();
- }
-
- function adjust() {
- if (self.storeValue.type === BI.Selection.All && self.storeValue.value.length >= self._count) {
- self.storeValue = {
- type: BI.Selection.Multi,
- value: []
- }
- } else if (self.storeValue.type === BI.Selection.Multi && self.storeValue.value.length >= self._count) {
- self.storeValue = {
- type: BI.Selection.All,
- value: []
- }
- }
- }
- },
-
- _join: function (res, callback) {
- var self = this, o = this.options;
- this._assertValue(res);
- this._assertValue(this.storeValue);
- if (this.storeValue.type === res.type) {
- var map = this._makeMap(this.storeValue.value);
- BI.each(res.value, function (i, v) {
- if (!map[v]) {
- self.storeValue.value.push(v);
- map[v] = v;
- }
- });
- var change = false;
- BI.each(res.assist, function (i, v) {
- if (BI.isNotNull(map[v])) {
- change = true;
- delete map[v];
- }
- });
- change && (this.storeValue.value = BI.values(map));
- self._adjust(callback);
- return;
- }
- this._joinAll(res, callback);
- },
-
- _setStartValue: function (value) {
- this._startValue = value;
- this.adapter.setStartValue(value);
- },
-
- isAllSelected: function () {
- return this.adapter.isAllSelected();
- },
-
- resize: function () {
- // this.trigger.getCounter().adjustView();
- // this.trigger.adjustView();
- },
- setValue: function (v) {
- this.storeValue = v || {};
- this._assertValue(this.storeValue);
- this.adapter.setValue(this.storeValue);
- this.trigger.setValue(this.storeValue);
- },
-
- getValue: function () {
- return BI.deepClone(this.storeValue);
- },
-
- populate: function () {
- this._count = null;
- this._allData = null;
- this.adapter.populate.apply(this.adapter, arguments);
- this.trigger.populate.apply(this.trigger, arguments);
- }
-});
-
-BI.extend(BI.MultiSelectList, {
- REQ_GET_DATA_LENGTH: 0,
- REQ_GET_ALL_DATA: -1
-});
-
-BI.MultiSelectList.EVENT_CHANGE = "BI.MultiSelectList.EVENT_CHANGE";
-BI.shortcut("bi.multi_select_list", BI.MultiSelectList);/**
- * Created by zcf_1 on 2017/5/11.
- */
-BI.MultiSelectTree = BI.inherit(BI.Widget, {
- _defaultConfig: function () {
- return BI.extend(BI.MultiSelectTree.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-multi-select-tree',
- itemsCreator: BI.emptyFn
- })
- },
-
- _init: function () {
- BI.MultiSelectTree.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.storeValue = {value: {}};
-
- this.adapter = BI.createWidget({
- type: "bi.multi_select_tree_popup",
- itemsCreator: o.itemsCreator
- });
- this.adapter.on(BI.MultiSelectTreePopup.EVENT_CHANGE, function () {
- if (self.searcher.isSearching()) {
- self.storeValue = {value: self.searcherPane.getValue()};
- } else {
- self.storeValue = {value: self.adapter.getValue()};
- }
- self.setSelectedValue(self.storeValue.value);
- self.fireEvent(BI.MultiSelectTree.EVENT_CHANGE);
- });
-
- //搜索中的时候用的是parttree,同adapter中的synctree不一样
- this.searcherPane = BI.createWidget({
- type: "bi.multi_tree_search_pane",
- cls: "bi-border-left bi-border-right bi-border-bottom",
- keywordGetter: function () {
- return self.searcher.getKeyword();
- },
- itemsCreator: function (op, callback) {
- op.keyword = self.searcher.getKeyword();
- o.itemsCreator(op, callback);
- }
- });
- this.searcherPane.setVisible(false);
-
- this.searcher = BI.createWidget({
- type: "bi.searcher",
- isAutoSearch: false,
- isAutoSync: false,
- onSearch: function (op, callback) {
- callback({
- keyword: self.searcher.getKeyword()
- });
- },
- adapter: this.adapter,
- popup: this.searcherPane,
- masker: false,
- listeners: [{
- eventName: BI.Searcher.EVENT_START,
- action: function () {
- self._showSearcherPane();
- // self.storeValue = {value: self.adapter.getValue()};
- // self.searcherPane.setSelectedValue(self.storeValue.value);
- }
- }, {
- eventName: BI.Searcher.EVENT_STOP,
- action: function () {
- self._showAdapter();
- // self.storeValue = {value: self.searcherPane.getValue()};
- // self.adapter.setSelectedValue(self.storeValue.value);
- BI.nextTick(function () {
- self.adapter.populate();
- });
- }
- }, {
- eventName: BI.Searcher.EVENT_CHANGE,
- action: function () {
- if (self.searcher.isSearching()) {
- self.storeValue = {value: self.searcherPane.getValue()};
- } else {
- self.storeValue = {value: self.adapter.getValue()};
- }
- self.setSelectedValue(self.storeValue.value);
- self.fireEvent(BI.MultiSelectTree.EVENT_CHANGE);
- }
- }, {
- eventName: BI.Searcher.EVENT_PAUSE,
- action: function () {
- self._showAdapter();
- }
- }]
- });
-
- BI.createWidget({
- type: "bi.vtape",
- element: this,
- items: [{
- el: this.searcher,
- height: 24
- }, {
- el: this.adapter,
- height: "fill"
- }]
- });
- BI.createWidget({
- type: "bi.absolute",
- element: this,
- items: [{
- el: this.searcherPane,
- top: 30,
- bottom: 0,
- left: 0,
- right: 0
- }]
- })
-
- },
-
- _showAdapter: function () {
- this.adapter.setVisible(true);
- this.searcherPane.setVisible(false);
- },
-
- _showSearcherPane: function () {
- this.searcherPane.setVisible(true);
- this.adapter.setVisible(false);
- },
-
- resize: function () {
-
- },
-
- setSelectedValue: function (v) {
- this.storeValue.value = v || {};
- this.adapter.setSelectedValue(v);
- this.searcherPane.setSelectedValue(v);
- this.searcher.setValue({
- value: v || {}
- });
- },
-
- setValue: function (v) {
- this.adapter.setValue(v);
- },
-
- stopSearch: function () {
- this.searcher.stopSearch();
- },
-
- updateValue: function (v) {
- this.adapter.updateValue(v);
- },
-
- getValue: function () {
- return this.storeValue.value;
- },
-
- populate: function () {
- this.searcher.populate.apply(this.searcher, arguments);
- this.adapter.populate.apply(this.adapter, arguments);
- }
-});
-BI.MultiSelectTree.EVENT_CHANGE = "BI.MultiSelectTree.EVENT_CHANGE";
-BI.shortcut("bi.multi_select_tree", BI.MultiSelectTree);/**
- * Created by zcf on 2016/12/21.
- */
-BI.MultiSelectTreePopup = BI.inherit(BI.Widget, {
- _defaultConfig: function () {
- return BI.extend(BI.MultiSelectTreePopup.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-multi-select-tree-popup bi-border-left bi-border-right bi-border-bottom",
- itemsCreator: BI.emptyFn
- });
- },
- _init: function () {
- BI.MultiSelectTreePopup.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.popup = BI.createWidget({
- type: "bi.async_tree",
- element: this,
- itemsCreator: o.itemsCreator
- });
- this.popup.on(BI.TreeView.EVENT_AFTERINIT, function () {
- self.fireEvent(BI.MultiSelectTreePopup.EVENT_AFTER_INIT)
- });
- this.popup.on(BI.TreeView.EVENT_CHANGE, function () {
- self.fireEvent(BI.MultiSelectTreePopup.EVENT_CHANGE)
- });
- },
-
- hasChecked: function () {
- return this.popup.hasChecked();
- },
-
- getValue: function () {
- return this.popup.getValue();
- },
-
- setValue: function (v) {
- v || (v = {});
- this.popup.setValue(v);
- },
-
- setSelectedValue: function (v) {
- v || (v = {});
- this.popup.setSelectedValue(v);
- },
-
- updateValue: function (v) {
- this.popup.updateValue(v);
- this.popup.refresh();
- },
-
- populate: function (config) {
- this.popup.stroke(config);
- }
-
-});
-BI.MultiSelectTreePopup.EVENT_AFTER_INIT = "BI.MultiSelectTreePopup.EVENT_AFTER_INIT";
-BI.MultiSelectTreePopup.EVENT_CHANGE = "BI.MultiSelectTreePopup.EVENT_CHANGE";
-BI.shortcut("bi.multi_select_tree_popup", BI.MultiSelectTreePopup);/**
- *
- * @class BI.MultiTreeCheckPane
- * @extends BI.Pane
- */
-BI.MultiTreeCheckPane = BI.inherit(BI.Pane, {
-
- constants: {
- height: 25,
- lgap: 10,
- tgap: 5
- },
-
- _defaultConfig: function () {
- return BI.extend(BI.MultiTreeCheckPane.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-multi-tree-check-pane bi-background",
- onClickContinueSelect: BI.emptyFn
- });
- },
-
- _init: function () {
- BI.MultiTreeCheckPane.superclass._init.apply(this, arguments);
-
- var self = this, opts = this.options;
-
- this.selectedValues = {};
-
- var continueSelect = BI.createWidget({
- type: 'bi.text_button',
- text: BI.i18nText('BI-Continue_Select'),
- cls: 'multi-tree-check-selected'
- });
- continueSelect.on(BI.TextButton.EVENT_CHANGE, function () {
- opts.onClickContinueSelect();
- BI.nextTick(function () {
- self.empty();
- });
- });
-
- var backToPopup = BI.createWidget({
- type: 'bi.left',
- cls: 'multi-tree-continue-select',
- items: [
- {
- el: {
- type: "bi.label",
- text: BI.i18nText('BI-Selected_Data')
- },
- lgap: this.constants.lgap,
- tgap: this.constants.tgap
- },
- {
- el: continueSelect,
- lgap: this.constants.lgap,
- tgap: this.constants.tgap
- }]
- });
-
- this.display = BI.createWidget({
- type: "bi.display_tree",
- cls: "bi-multi-tree-display",
- itemsCreator: function (op, callback) {
- op.type = BI.TreeView.REQ_TYPE_GET_SELECTED_DATA;
- opts.itemsCreator(op, callback);
- }
- });
-
- this.display.on(BI.Events.AFTERINIT, function () {
- self.fireEvent(BI.Events.AFTERINIT);
- });
-
- this.display.on(BI.TreeView.EVENT_INIT, function () {
- backToPopup.setVisible(false);
- });
-
- this.display.on(BI.TreeView.EVENT_AFTERINIT, function () {
- backToPopup.setVisible(true);
- });
-
- BI.createWidget({
- type: 'bi.vtape',
- element: this,
- items: [{
- height: this.constants.height,
- el: backToPopup
- }, {
- height: 'fill',
- el: this.display
- }]
- });
-
- },
-
- empty: function () {
- this.display.empty();
- },
-
- populate: function (configs) {
- this.display.stroke(configs);
- },
-
- setValue: function (v) {
- v || (v = {});
- this.display.setSelectedValue(v.value);
- },
-
- getValue: function () {
-
- }
-});
-
-BI.MultiTreeCheckPane.EVENT_CONTINUE_CLICK = "EVENT_CONTINUE_CLICK";
-
-
-BI.shortcut("bi.multi_tree_check_pane", BI.MultiTreeCheckPane);/**
- *
- * @class BI.MultiTreeCombo
- * @extends BI.Single
- */
-
-BI.MultiTreeCombo = BI.inherit(BI.Single, {
-
- constants: {
- offset: {
- top: 1,
- left: 1,
- right: 2,
- bottom: 33
- }
- },
-
- _defaultConfig: function () {
- return BI.extend(BI.MultiTreeCombo.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-multi-tree-combo',
- itemsCreator: BI.emptyFn,
- height: 25
- });
- },
-
- _init: function () {
- BI.MultiTreeCombo.superclass._init.apply(this, arguments);
-
- var self = this, o = this.options;
-
- var isInit = false;
- var want2showCounter = false;
-
- this.trigger = BI.createWidget({
- type: "bi.multi_select_trigger",
- height: o.height,
- // adapter: this.popup,
- masker: {
- offset: this.constants.offset
- },
- searcher: {
- type: "bi.multi_tree_searcher",
- itemsCreator: o.itemsCreator
- },
- switcher: {
- el: {
- type: "bi.multi_tree_check_selected_button"
- },
- popup: {
- type: "bi.multi_tree_check_pane",
- itemsCreator: o.itemsCreator
- }
- }
-
- });
-
- this.combo = BI.createWidget({
- type: "bi.combo",
- toggle: false,
- el: this.trigger,
- adjustLength: 1,
- popup: {
- type: 'bi.multi_tree_popup_view',
- ref: function () {
- self.popup = this;
- self.trigger.setAdapter(this);
- },
- listeners: [{
- eventName: BI.MultiTreePopup.EVENT_AFTERINIT,
- action: function () {
- self.trigger.getCounter().adjustView();
- isInit = true;
- if (want2showCounter === true) {
- showCounter();
- }
- }
- }, {
- eventName: BI.MultiTreePopup.EVENT_CHANGE,
- action: function () {
- change = true;
- var val = {
- type: BI.Selection.Multi,
- value: this.hasChecked() ? this.getValue() : {}
- };
- self.trigger.getSearcher().setState(val);
- self.trigger.getCounter().setButtonChecked(val);
- }
- }, {
- eventName: BI.MultiTreePopup.EVENT_CLICK_CONFIRM,
- action: function () {
- self.combo.hideView();
- }
- }, {
- eventName: BI.MultiTreePopup.EVENT_CLICK_CLEAR,
- action: function () {
- clear = true;
- self.setValue();
- self._defaultState();
- }
- }],
- itemsCreator: o.itemsCreator,
- onLoaded: function () {
- BI.nextTick(function () {
- self.trigger.getCounter().adjustView();
- self.trigger.getSearcher().adjustView();
- });
- }
- },
- hideChecker: function (e) {
- return triggerBtn.element.find(e.target).length === 0;
- }
- });
-
- this.storeValue = {value: {}};
- var change = false;
- var clear = false; //标识当前是否点击了清空
-
- var isSearching = function () {
- return self.trigger.getSearcher().isSearching();
- };
-
- var isPopupView = function () {
- return self.combo.isViewVisible();
- };
-
- this.trigger.on(BI.MultiSelectTrigger.EVENT_START, function () {
- self.storeValue = {value: self.combo.getValue()};
- this.setValue(self.storeValue);
- });
- this.trigger.on(BI.MultiSelectTrigger.EVENT_STOP, function () {
- self.storeValue = {value: this.getValue()};
- self.combo.setValue(self.storeValue);
- BI.nextTick(function () {
- if (isPopupView()) {
- self.combo.populate();
- }
- });
- });
-
- function showCounter() {
- if (isSearching()) {
- self.storeValue = {value: self.trigger.getValue()};
- } else if (isPopupView()) {
- self.storeValue = {value: self.combo.getValue()};
- }
- self.trigger.setValue(self.storeValue);
- }
-
- this.trigger.on(BI.MultiSelectTrigger.EVENT_BEFORE_COUNTER_POPUPVIEW, function () {
- if (want2showCounter === false) {
- want2showCounter = true;
- }
- if (isInit === true) {
- want2showCounter = null;
- showCounter();
- }
- });
- this.trigger.on(BI.MultiSelectTrigger.EVENT_TRIGGER_CLICK, function () {
- self.combo.toggle();
- });
- this.trigger.on(BI.MultiSelectTrigger.EVENT_COUNTER_CLICK, function () {
- if (!self.combo.isViewVisible()) {
- self.combo.showView();
- }
- });
-
- this.trigger.on(BI.MultiSelectTrigger.EVENT_CHANGE, function () {
- var checked = this.getSearcher().hasChecked();
- var val = {
- type: BI.Selection.Multi,
- value: checked ? {1: 1} : {}
- };
- this.getSearcher().setState(checked ? BI.Selection.Multi : BI.Selection.None);
- this.getCounter().setButtonChecked(val);
- });
-
- this.combo.on(BI.Combo.EVENT_BEFORE_POPUPVIEW, function () {
- if (isSearching()) {
- return;
- }
- if (change === true) {
- self.storeValue = {value: self.combo.getValue()};
- change = false;
- }
- self.combo.setValue(self.storeValue);
- self.populate();
-
- });
- this.combo.on(BI.Combo.EVENT_BEFORE_HIDEVIEW, function () {
- if (isSearching()) {
- self.trigger.stopEditing();
- self.fireEvent(BI.MultiTreeCombo.EVENT_CONFIRM);
- } else {
- if (isPopupView()) {
- self.trigger.stopEditing();
- self.storeValue = {value: self.combo.getValue()};
- if (clear === true) {
- self.storeValue = {value: {}};
- }
- self.fireEvent(BI.MultiTreeCombo.EVENT_CONFIRM);
- }
- }
- clear = false;
- change = false;
- });
-
- var triggerBtn = BI.createWidget({
- type: "bi.trigger_icon_button",
- width: o.height,
- height: o.height,
- cls: "multi-select-trigger-icon-button bi-border-left"
- });
- triggerBtn.on(BI.TriggerIconButton.EVENT_CHANGE, function () {
- self.trigger.getCounter().hideView();
- if (self.combo.isViewVisible()) {
- self.combo.hideView();
- } else {
- self.combo.showView();
- }
- });
- BI.createWidget({
- type: "bi.absolute",
- element: this,
- items: [{
- el: this.combo,
- left: 0,
- right: 0,
- top: 0,
- bottom: 0
- }, {
- el: triggerBtn,
- right: 0,
- top: 0,
- bottom: 0
- }]
- })
- },
-
- _defaultState: function () {
- this.trigger.stopEditing();
- this.combo.hideView();
- },
-
- setValue: function (v) {
- this.storeValue.value = v || {};
- this.combo.setValue({
- value: v || {}
- });
- },
-
- getValue: function () {
- return this.storeValue.value;
- },
-
- populate: function () {
- this.combo.populate.apply(this.combo, arguments);
- }
-});
-
-BI.MultiTreeCombo.EVENT_CONFIRM = "MultiTreeCombo.EVENT_CONFIRM";
-
-BI.shortcut('bi.multi_tree_combo', BI.MultiTreeCombo);/**
- * 带加载的多选下拉面板
- * @class BI.MultiTreePopup
- * @extends BI.Pane
- */
-BI.MultiTreePopup = BI.inherit(BI.Pane, {
-
- _defaultConfig: function () {
- return BI.extend(BI.MultiTreePopup.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-multi-tree-popup',
- maxWidth: 'auto',
- minWidth: 100,
- maxHeight: 400,
- onLoaded: BI.emptyFn
- });
- },
-
- _init: function () {
- BI.MultiTreePopup.superclass._init.apply(this, arguments);
-
- var self = this, opts = this.options;
-
- this.selectedValues = {};
-
- this.tree = BI.createWidget({
- type: "bi.async_tree",
- height: 400,
- cls:"popup-view-tree",
- itemsCreator: opts.itemsCreator,
- onLoaded: opts.onLoaded
- });
-
- this.popupView = BI.createWidget({
- type: "bi.multi_popup_view",
- element: this,
- stopPropagation: false,
- maxWidth: opts.maxWidth,
- minWidth: opts.minWidth,
- maxHeight: opts.maxHeight,
- buttons: [BI.i18nText('BI-Basic_Clears'), BI.i18nText('BI-Basic_Sure')],
- el: this.tree
- });
-
- this.popupView.on(BI.MultiPopupView.EVENT_CLICK_TOOLBAR_BUTTON, function (index) {
- switch (index) {
- case 0:
- self.fireEvent(BI.MultiTreePopup.EVENT_CLICK_CLEAR);
- break;
- case 1:
- self.fireEvent(BI.MultiTreePopup.EVENT_CLICK_CONFIRM);
- break;
- }
- });
-
- this.tree.on(BI.TreeView.EVENT_CHANGE, function () {
- self.fireEvent(BI.MultiTreePopup.EVENT_CHANGE);
- });
-
- this.tree.on(BI.TreeView.EVENT_AFTERINIT, function () {
- self.fireEvent(BI.MultiTreePopup.EVENT_AFTERINIT);
- });
-
- },
-
- getValue: function () {
- return this.tree.getValue();
- },
-
- setValue: function (v) {
- v || (v = {});
- this.tree.setSelectedValue(v.value);
- },
-
- populate: function (config) {
- this.tree.stroke(config);
- },
-
- hasChecked: function () {
- return this.tree.hasChecked();
- },
-
- resetHeight: function (h) {
- this.popupView.resetHeight(h);
- },
-
- resetWidth: function (w) {
- this.popupView.resetWidth(w);
- }
-});
-
-BI.MultiTreePopup.EVENT_CHANGE = "EVENT_CHANGE";
-BI.MultiTreePopup.EVENT_CLICK_CONFIRM = "EVENT_CLICK_CONFIRM";
-BI.MultiTreePopup.EVENT_CLICK_CLEAR = "EVENT_CLICK_CLEAR";
-BI.MultiTreePopup.EVENT_AFTERINIT = "EVENT_AFTERINIT";
-
-
-BI.shortcut('bi.multi_tree_popup_view', BI.MultiTreePopup);/**
- *
- * 在搜索框中输入文本弹出的面板
- * @class BI.MultiTreeSearchPane
- * @extends BI.Pane
- */
-
-BI.MultiTreeSearchPane = BI.inherit(BI.Pane, {
-
- _defaultConfig: function () {
- return BI.extend(BI.MultiTreeSearchPane.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-multi-tree-search-pane bi-card",
- itemsCreator: BI.emptyFn,
- keywordGetter: BI.emptyFn
- });
- },
-
- _init: function () {
- BI.MultiTreeSearchPane.superclass._init.apply(this, arguments);
-
- var self = this, opts = this.options;
-
- this.partTree = BI.createWidget({
- type: "bi.part_tree",
- element: this,
- tipText: BI.i18nText("BI-No_Select"),
- itemsCreator: function (op, callback) {
- op.keyword = opts.keywordGetter();
- opts.itemsCreator(op, callback);
- }
- });
-
- this.partTree.on(BI.Controller.EVENT_CHANGE, function () {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
-
- this.partTree.on(BI.TreeView.EVENT_CHANGE, function () {
- self.fireEvent(BI.MultiTreeSearchPane.EVENT_CHANGE);
- });
- },
-
- hasChecked: function () {
- return this.partTree.hasChecked();
- },
-
- setValue: function (v) {
- this.setSelectedValue(v.value);
- },
-
- setSelectedValue: function (v) {
- v || (v = {});
- this.partTree.setSelectedValue(v);
- },
-
- getValue: function () {
- return this.partTree.getValue();
- },
-
- empty: function () {
- this.partTree.empty();
- },
-
- populate: function (op) {
- this.partTree.stroke.apply(this.partTree, arguments);
- }
-});
-
-BI.MultiTreeSearchPane.EVENT_CHANGE = "EVENT_CHANGE";
-
-BI.MultiTreeSearchPane.EVENT_CLICK_CONFIRM = "EVENT_CLICK_CONFIRM";
-BI.MultiTreeSearchPane.EVENT_CLICK_CLEAR = "EVENT_CLICK_CLEAR";
-
-BI.shortcut("bi.multi_tree_search_pane", BI.MultiTreeSearchPane);/**
- * 查看已选按钮
- * Created by guy on 15/11/3.
- * @class BI.MultiTreeCheckSelectedButton
- * @extends BI.Single
- */
-BI.MultiTreeCheckSelectedButton = BI.inherit(BI.Single, {
-
- _const: {
- checkSelected: BI.i18nText('BI-Check_Selected')
- },
-
- _defaultConfig: function () {
- return BI.extend(BI.MultiTreeCheckSelectedButton.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-multi-tree-check-selected-button',
- itemsCreator: BI.emptyFn
- });
- },
-
- _init: function () {
- BI.MultiTreeCheckSelectedButton.superclass._init.apply(this, arguments);
- var self = this;
- this.indicator = BI.createWidget({
- type: 'bi.icon_button',
- cls: 'check-font trigger-check-selected',
- width: 15,
- height: 15,
- stopPropagation: true
- });
-
- this.checkSelected = BI.createWidget({
- type: 'bi.text_button',
- cls: "trigger-check-selected",
- invisible: true,
- hgap: 4,
- text: this._const.checkSelected,
- textAlign: 'center',
- textHeight: 15
- });
- this.checkSelected.on(BI.Controller.EVENT_CHANGE, function () {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
-
- this.checkSelected.on(BI.TextButton.EVENT_CHANGE, function () {
- self.fireEvent(BI.MultiSelectCheckSelectedButton.EVENT_CHANGE, arguments);
- });
-
- BI.createWidget({
- type: "bi.horizontal",
- element: this,
- items: [this.indicator, this.checkSelected]
- })
-
- this.element.hover(function () {
- self.indicator.setVisible(false);
- self.checkSelected.setVisible(true);
- }, function () {
- self.indicator.setVisible(true);
- self.checkSelected.setVisible(false);
- });
- this.setVisible(false);
- },
-
- setValue: function (v) {
- v || (v = {});
- this.setVisible(BI.size(v.value) > 0);
- }
-});
-
-BI.MultiTreeCheckSelectedButton.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut('bi.multi_tree_check_selected_button', BI.MultiTreeCheckSelectedButton);/**
- * searcher
- * Created by guy on 15/11/3.
- * @class BI.MultiTreeSearcher
- * @extends Widget
- */
-BI.MultiTreeSearcher = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.MultiTreeSearcher.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-multi-tree-searcher',
- itemsCreator: BI.emptyFn,
- popup: {},
-
- adapter: null,
- masker: {}
- });
- },
-
- _init: function () {
- BI.MultiTreeSearcher.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.editor = BI.createWidget({
- type: 'bi.multi_select_editor',
- height: o.height,
- el: {
- type: "bi.simple_state_editor",
- height: o.height
- }
- });
-
- this.searcher = BI.createWidget({
- type: "bi.searcher",
- element: this,
- isAutoSearch: false,
- isAutoSync: false,
- onSearch: function (op, callback) {
- callback({
- keyword: self.editor.getValue()
- });
- },
- el: this.editor,
-
- popup: BI.extend({
- type: "bi.multi_tree_search_pane",
- keywordGetter: function () {
- return self.editor.getValue();
- },
- itemsCreator: function (op, callback) {
- op.keyword = self.editor.getValue();
- o.itemsCreator(op, callback);
- }
- }, o.popup),
-
- adapter: o.adapter,
- masker: o.masker
- });
- this.searcher.on(BI.Searcher.EVENT_START, function () {
- self.fireEvent(BI.MultiTreeSearcher.EVENT_START);
- });
- this.searcher.on(BI.Searcher.EVENT_PAUSE, function () {
- if (this.hasMatched()) {
-
- }
- self.fireEvent(BI.MultiTreeSearcher.EVENT_PAUSE);
- });
- this.searcher.on(BI.Searcher.EVENT_STOP, function () {
- self.fireEvent(BI.MultiTreeSearcher.EVENT_STOP);
- });
- this.searcher.on(BI.Searcher.EVENT_CHANGE, function () {
- self.fireEvent(BI.MultiTreeSearcher.EVENT_CHANGE, arguments);
- });
- },
-
- adjustView: function () {
- this.searcher.adjustView();
- },
-
- setAdapter: function (adapter) {
- this.searcher.setAdapter(adapter);
- },
-
- isSearching: function () {
- return this.searcher.isSearching();
- },
-
- stopSearch: function () {
- this.searcher.stopSearch();
- },
-
- getKeyword: function () {
- return this.editor.getValue();
- },
-
- hasMatched: function () {
- return this.searcher.hasMatched();
- },
-
- hasChecked: function () {
- return this.searcher.getView() && this.searcher.getView().hasChecked();
- },
-
- setState: function (ob) {
- ob || (ob = {});
- ob.value || (ob.value = {});
- if (BI.isNumber(ob)) {
- this.editor.setState(ob);
- } else if (BI.size(ob.value) === 0) {
- this.editor.setState(BI.Selection.None);
- } else {
- var text = "";
- BI.each(ob.value, function (name, children) {
- var childNodes = getChildrenNode(children);
- text += name + (childNodes === "" ? "" : (":" + childNodes)) + "; ";
- });
- this.editor.setState(text);
- }
-
- function getChildrenNode(ob) {
- var text = "";
- var index = 0, size = BI.size(ob);
- BI.each(ob, function (name, children) {
- index++;
- var childNodes = getChildrenNode(children);
- text += name + (childNodes === "" ? "" : (":" + childNodes)) + (index === size ? "" : ",");
- });
- return text;
- }
- },
-
- setValue: function (ob) {
- this.setState(ob);
- this.searcher.setValue(ob);
- },
-
- getKey: function () {
- return this.editor.getValue();
- },
-
- getValue: function () {
- return this.searcher.getValue();
- },
-
- populate: function (items) {
- this.searcher.populate.apply(this.searcher, arguments);
- }
-});
-
-BI.MultiTreeSearcher.EVENT_BEFORE_POPUPVIEW = "EVENT_BEFORE_POPUPVIEW";
-BI.MultiTreeSearcher.EVENT_CHANGE = "EVENT_CHANGE";
-BI.MultiTreeSearcher.EVENT_START = "EVENT_START";
-BI.MultiTreeSearcher.EVENT_STOP = "EVENT_STOP";
-BI.MultiTreeSearcher.EVENT_PAUSE = "EVENT_PAUSE";
-BI.shortcut('bi.multi_tree_searcher', BI.MultiTreeSearcher);/**
- * Created by windy on 2017/3/13.
- * 数值微调器
- */
-BI.NumberEditor = BI.inherit(BI.Widget, {
- _defaultConfig: function () {
- return BI.extend(BI.NumberEditor.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-number-editor bi-border",
- validationChecker: function () {
- return true;
- },
- valueFormatter: function (v) {
- return v;
- },
- value: 0,
- allowBlank: false,
- errorText: "",
- step: 1
- })
- },
-
- _init: function () {
- BI.NumberEditor.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.editor = BI.createWidget({
- type: "bi.sign_editor",
- height: o.height,
- allowBlank: o.allowBlank,
- value: o.valueFormatter(o.value),
- validationChecker: o.validationChecker,
- errorText: o.errorText
- });
- this.editor.on(BI.TextEditor.EVENT_CHANGE, function () {
- o.value = this.getValue();
- self.fireEvent(BI.NumberEditor.EVENT_CHANGE);
- });
- this.editor.on(BI.TextEditor.EVENT_CONFIRM, function () {
- self.fireEvent(BI.NumberEditor.EVENT_CONFIRM);
- });
- this.topBtn = BI.createWidget({
- type: "bi.icon_button",
- trigger: "lclick,",
- cls: "column-pre-page-h-font top-button bi-border-left bi-border-bottom"
- });
- this.topBtn.on(BI.IconButton.EVENT_CHANGE, function () {
- self._finetuning(o.step);
- self.fireEvent(BI.NumberEditor.EVENT_CHANGE);
- self.fireEvent(BI.NumberEditor.EVENT_CONFIRM);
- });
- this.bottomBtn = BI.createWidget({
- type: "bi.icon_button",
- trigger: "lclick,",
- cls: "column-next-page-h-font bottom-button bi-border-left bi-border-top"
- });
- this.bottomBtn.on(BI.IconButton.EVENT_CHANGE, function () {
- self._finetuning(-o.step);
- self.fireEvent(BI.NumberEditor.EVENT_CHANGE);
- self.fireEvent(BI.NumberEditor.EVENT_CONFIRM);
- });
- BI.createWidget({
- type: "bi.htape",
- element: this,
- items: [this.editor, {
- el: {
- type: "bi.grid",
- columns: 1,
- rows: 2,
- items: [{
- column: 0,
- row: 0,
- el: this.topBtn
- }, {
- column: 0,
- row: 1,
- el: this.bottomBtn
- }]
- },
- width: 23
- }]
- });
- },
-
- //微调
- _finetuning: function (add) {
- var v = BI.parseFloat(this.getValue());
- this.setValue(v.add(add));
- },
-
- setUpEnable: function (v) {
- this.topBtn.setEnable(!!v);
- },
-
- setDownEnable: function (v) {
- this.bottomBtn.setEnable(!!v);
- },
-
- getValue: function () {
- return this.options.value;
- },
-
- setValue: function (v) {
- var o = this.options;
- o.value = v;
- this.editor.setValue(o.valueFormatter(v));
- }
-
-});
-BI.NumberEditor.EVENT_CONFIRM = "EVENT_CONFIRM";
-BI.NumberEditor.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut("bi.number_editor", BI.NumberEditor);//小于号的值为:0,小于等于号的值为:1
-//closeMIn:最小值的符号,closeMax:最大值的符号
-/**
- * Created by roy on 15/9/17.
- *
- */
-BI.NumberInterval = BI.inherit(BI.Single, {
- constants: {
- typeError: "typeBubble",
- numberError: "numberBubble",
- signalError: "signalBubble",
- editorWidth: 114,
- columns: 5,
- width: 30,
- rows: 1,
- numberErrorCls: "number-error",
- border: 1,
- less: 0,
- less_equal: 1,
- numTip: ""
- },
- _defaultConfig: function () {
- var conf = BI.NumberInterval.superclass._defaultConfig.apply(this, arguments)
- return BI.extend(conf, {
- extraCls: "bi-number-interval",
- height: 25,
- validation: "valid"
- })
- },
- _init: function () {
- var self = this, c = this.constants, o = this.options;
- BI.NumberInterval.superclass._init.apply(this, arguments)
- this.smallEditor = BI.createWidget({
- type: "bi.editor",
- height: o.height - 2,
- watermark: BI.i18nText("BI-Basic_Unrestricted"),
- allowBlank: true,
- value: o.min,
- level: "warning",
- tipType: "warning",
- quitChecker: function () {
- return false;
- },
- validationChecker: function (v) {
- if (!BI.isNumeric(v)) {
- self.smallEditorBubbleType = c.typeError;
- return false;
- }
- return true;
- },
- cls: "number-interval-small-editor bi-border-top bi-border-bottom bi-border-left"
- });
-
- this.smallTip = BI.createWidget({
- type: "bi.label",
- text: o.numTip,
- height: o.height - 2,
- invisible: true
- });
- BI.createWidget({
- type: "bi.absolute",
- element: this.smallEditor.element,
- items: [{
- el: this.smallTip,
- top: 0,
- right: 5
- }]
- });
-
- this.bigEditor = BI.createWidget({
- type: "bi.editor",
- height: o.height - 2,
- watermark: BI.i18nText("BI-Basic_Unrestricted"),
- allowBlank: true,
- value: o.max,
- level: "warning",
- tipType: "warning",
- quitChecker: function () {
- return false;
- },
- validationChecker: function (v) {
- if (!BI.isNumeric(v)) {
- self.bigEditorBubbleType = c.typeError;
- return false;
- }
- return true;
- },
- cls: "number-interval-big-editor bi-border-top bi-border-bottom bi-border-right"
- });
-
- this.bigTip = BI.createWidget({
- type: "bi.label",
- text: o.numTip,
- height: o.height - 2,
- invisible: true
- });
- BI.createWidget({
- type: "bi.absolute",
- element: this.bigEditor.element,
- items: [{
- el: this.bigTip,
- top: 0,
- right: 5
- }]
- });
-
- //this.smallCombo = BI.createWidget({
- // type: "bi.number_interval_combo",
- // cls: "number-interval-small-combo",
- // height: o.height,
- // value: o.closemin ? 1 : 0,
- // offsetStyle: "left"
- //});
- //
- //this.bigCombo = BI.createWidget({
- // type: "bi.number_interval_combo",
- // cls: "number-interval-big-combo",
- // height: o.height,
- // value: o.closemax ? 1 : 0,
- // offsetStyle: "left"
- //});
- this.smallCombo = BI.createWidget({
- type: "bi.icon_combo",
- cls: "number-interval-small-combo bi-border",
- height: o.height - 2,
- items: [{
- text: "(" + BI.i18nText("BI-Less_Than") + ")",
- iconClass: "less-font",
- value: 0
- }, {
- text: "(" + BI.i18nText("BI-Less_And_Equal") + ")",
- value: 1,
- iconClass: "less-equal-font"
- }]
- });
- if (o.closemin === true) {
- this.smallCombo.setValue(1);
- } else {
- this.smallCombo.setValue(0);
- }
- this.bigCombo = BI.createWidget({
- type: "bi.icon_combo",
- cls: "number-interval-big-combo bi-border",
- height: o.height - 2,
- items: [{
- text: "(" + BI.i18nText("BI-Less_Than") + ")",
- iconClass: "less-font",
- value: 0
- }, {
- text: "(" + BI.i18nText("BI-Less_And_Equal") + ")",
- value: 1,
- iconClass: "less-equal-font"
- }]
- });
- if (o.closemax === true) {
- this.bigCombo.setValue(1);
- } else {
- this.bigCombo.setValue(0);
- }
- this.label = BI.createWidget({
- type: "bi.label",
- text: BI.i18nText("BI-Basic_Value"),
- textHeight: o.height - c.border * 2,
- width: c.width - c.border * 2,
- height: o.height - c.border * 2,
- level: "warning",
- tipType: "warning"
- });
- this.left = BI.createWidget({
- type: "bi.htape",
- items: [{
- el: self.smallEditor
- }, {
- el: self.smallCombo,
- width: c.width - c.border * 2
- }]
-
- });
- this.right = BI.createWidget({
- type: "bi.htape",
- items: [{
- el: self.bigCombo,
- width: c.width - c.border * 2
- }, {
- el: self.bigEditor
- }]
- });
-
-
- BI.createWidget({
- element: self,
- type: "bi.center",
- hgap: 15,
- height: o.height,
- items: [
- {
- type: "bi.absolute",
- items: [{
- el: self.left,
- left: -15,
- right: 0,
- top: 0,
- bottom: 0
- }]
- }, {
- type: "bi.absolute",
- items: [{
- el: self.right,
- left: 0,
- right: -15,
- top: 0,
- bottom: 0
- }]
- }
- ]
- });
-
- BI.createWidget({
- element: self,
- type: "bi.horizontal_auto",
- items: [
- self.label
- ]
- });
-
-
- self._setValidEvent(self.bigEditor, c.bigEditor);
- self._setValidEvent(self.smallEditor, c.smallEditor);
- self._setErrorEvent(self.bigEditor, c.bigEditor);
- self._setErrorEvent(self.smallEditor, c.smallEditor);
- self._setBlurEvent(self.bigEditor);
- self._setBlurEvent(self.smallEditor);
- self._setFocusEvent(self.bigEditor);
- self._setFocusEvent(self.smallEditor);
- self._setComboValueChangedEvent(self.bigCombo);
- self._setComboValueChangedEvent(self.smallCombo);
- self._setEditorValueChangedEvent(self.bigEditor);
- self._setEditorValueChangedEvent(self.smallEditor);
- },
-
- _checkValidation: function () {
- var self = this, c = this.constants, o = this.options;
- self._setTitle("");
- BI.Bubbles.hide(c.typeError);
- BI.Bubbles.hide(c.numberError);
- BI.Bubbles.hide(c.signalError);
- if (!self.smallEditor.isValid() || !self.bigEditor.isValid()) {
- self.element.removeClass("number-error");
- o.validation = "invalid";
- return c.typeError;
- } else {
- if (BI.isEmptyString(self.smallEditor.getValue()) || BI.isEmptyString(self.bigEditor.getValue())) {
- self.element.removeClass("number-error");
- o.validation = "valid";
- return "";
- } else {
- var smallValue = parseFloat(self.smallEditor.getValue()), bigValue = parseFloat(self.bigEditor.getValue()),
- bigComboValue = self.bigCombo.getValue(), smallComboValue = self.smallCombo.getValue();
- if (bigComboValue[0] === c.less_equal && smallComboValue[0] === c.less_equal) {
- if (smallValue > bigValue) {
- self.element.addClass("number-error");
- o.validation = "invalid";
- return c.numberError;
- } else {
- self.element.removeClass("number-error");
- o.validation = "valid";
- return "";
- }
- } else {
- if (smallValue > bigValue) {
- self.element.addClass("number-error");
- o.validation = "invalid";
- return c.numberError;
- } else if (smallValue === bigValue) {
- self.element.addClass("number-error");
- o.validation = "invalid";
- return c.signalError;
- } else {
- self.element.removeClass("number-error");
- o.validation = "valid";
- return "";
- }
- }
- }
-
- }
- },
-
- _setTitle: function (v) {
- var self = this;
- self.bigEditor.setTitle(v);
- self.smallEditor.setTitle(v);
- self.label.setTitle(v);
- },
-
- _setFocusEvent: function (w) {
- var self = this, c = this.constants;
- w.on(BI.Editor.EVENT_FOCUS, function () {
- self._setTitle("");
- switch (self._checkValidation()) {
- case c.typeError:
- BI.Bubbles.show(c.typeError, BI.i18nText("BI-Numerical_Interval_Input_Data"), self, {
- offsetStyle: "center"
- });
- break;
- case c.numberError:
- BI.Bubbles.show(c.numberError, BI.i18nText("BI-Numerical_Interval_Number_Value"), self, {
- offsetStyle: "center"
- });
- break;
- case c.signalError:
- BI.Bubbles.show(c.signalError, BI.i18nText("BI-Numerical_Interval_Signal_Value"), self, {
- offsetStyle: "center"
- });
- break;
- default :
- return
- }
-
- })
- },
- _setBlurEvent: function (w) {
- var c = this.constants, self = this;
- w.on(BI.Editor.EVENT_BLUR, function () {
- BI.Bubbles.hide(c.typeError);
- BI.Bubbles.hide(c.numberError);
- BI.Bubbles.hide(c.signalError);
- switch (self._checkValidation()) {
- case c.typeError:
- self._setTitle(BI.i18nText("BI-Numerical_Interval_Input_Data"));
- break;
- case c.numberError:
- self._setTitle(BI.i18nText("BI-Numerical_Interval_Number_Value"));
- break;
- case c.signalError:
- self._setTitle(BI.i18nText("BI-Numerical_Interval_Signal_Value"));
- break;
- default:
- self._setTitle("");
- }
- })
- },
-
- _setErrorEvent: function (w) {
- var c = this.constants, self = this
- w.on(BI.Editor.EVENT_ERROR, function () {
- self._checkValidation();
- BI.Bubbles.show(c.typeError, BI.i18nText("BI-Numerical_Interval_Input_Data"), self, {
- offsetStyle: "center"
- });
- self.fireEvent(BI.NumberInterval.EVENT_ERROR);
- })
- },
-
-
- _setValidEvent: function (w) {
- var self = this, c = this.constants;
- w.on(BI.Editor.EVENT_VALID, function () {
- switch (self._checkValidation()) {
- case c.numberError:
- BI.Bubbles.show(c.numberError, BI.i18nText("BI-Numerical_Interval_Number_Value"), self, {
- offsetStyle: "center"
- });
- self.fireEvent(BI.NumberInterval.EVENT_ERROR);
- break;
- case c.signalError:
- BI.Bubbles.show(c.signalError, BI.i18nText("BI-Numerical_Interval_Signal_Value"), self, {
- offsetStyle: "center"
- });
- self.fireEvent(BI.NumberInterval.EVENT_ERROR);
- break;
- default:
- self.fireEvent(BI.NumberInterval.EVENT_VALID);
- }
- })
- },
-
-
- _setEditorValueChangedEvent: function (w) {
- var self = this, c = this.constants;
- w.on(BI.Editor.EVENT_CHANGE, function () {
- switch (self._checkValidation()) {
- case c.typeError:
- BI.Bubbles.show(c.typeError, BI.i18nText("BI-Numerical_Interval_Input_Data"), self, {
- offsetStyle: "center"
- });
- break;
- case c.numberError:
- BI.Bubbles.show(c.numberError, BI.i18nText("BI-Numerical_Interval_Number_Value"), self, {
- offsetStyle: "center"
- });
- break;
- case c.signalError:
- BI.Bubbles.show(c.signalError, BI.i18nText("BI-Numerical_Interval_Signal_Value"), self, {
- offsetStyle: "center"
- });
- break;
- default :
- break;
- }
- self.fireEvent(BI.NumberInterval.EVENT_CHANGE);
- });
- },
-
- _setComboValueChangedEvent: function (w) {
- var self = this, c = this.constants;
- w.on(BI.IconCombo.EVENT_CHANGE, function () {
- switch (self._checkValidation()) {
- case c.typeError:
- self._setTitle(BI.i18nText("BI-Numerical_Interval_Input_Data"));
- self.fireEvent(BI.NumberInterval.EVENT_ERROR);
- break;
- case c.numberError:
- self._setTitle(BI.i18nText("BI-Numerical_Interval_Number_Value"));
- self.fireEvent(BI.NumberInterval.EVENT_ERROR);
- break;
- case c.signalError:
- self._setTitle(BI.i18nText("BI-Numerical_Interval_Signal_Value"));
- self.fireEvent(BI.NumberInterval.EVENT_ERROR);
- break;
- default :
- self.fireEvent(BI.NumberInterval.EVENT_CHANGE);
- self.fireEvent(BI.NumberInterval.EVENT_VALID);
- }
- })
- },
-
- isStateValid: function () {
- return this.options.validation === "valid";
- },
-
- setMinEnable: function (b) {
- this.smallEditor.setEnable(b);
- },
-
- setCloseMinEnable: function (b) {
- this.smallCombo.setEnable(b);
- },
-
- setMaxEnable: function (b) {
- this.bigEditor.setEnable(b);
- },
-
- setCloseMaxEnable: function (b) {
- this.bigCombo.setEnable(b);
- },
-
- showNumTip: function () {
- this.smallTip.setVisible(true);
- this.bigTip.setVisible(true);
- },
-
- hideNumTip: function () {
- this.smallTip.setVisible(false);
- this.bigTip.setVisible(false);
- },
-
- setNumTip: function(numTip) {
- this.smallTip.setText(numTip);
- this.bigTip.setText(numTip);
- },
-
- getNumTip: function() {
- return this.smallTip.getText();
- },
-
- setValue: function (data) {
- data = data || {};
- var self = this, combo_value;
- if (BI.isNumeric(data.min) || BI.isEmptyString(data.min)) {
- self.smallEditor.setValue(data.min);
- }
-
- if (!BI.isNotNull(data.min)) {
- self.smallEditor.setValue("");
- }
-
- if (BI.isNumeric(data.max) || BI.isEmptyString(data.max)) {
- self.bigEditor.setValue(data.max);
- }
-
- if (!BI.isNotNull(data.max)) {
- self.bigEditor.setValue("");
- }
-
- if (!BI.isNull(data.closemin)) {
- if (data.closemin === true) {
- combo_value = 1
- } else {
- combo_value = 0
- }
- self.smallCombo.setValue(combo_value);
- }
-
- if (!BI.isNull(data.closemax)) {
- if (data.closemax === true) {
- combo_value = 1
- } else {
- combo_value = 0
- }
- self.bigCombo.setValue(combo_value);
- }
- },
-
-
- getValue: function () {
- var self = this, value = {}, minComboValue = self.smallCombo.getValue(), maxComboValue = self.bigCombo.getValue();
- value.min = self.smallEditor.getValue();
- value.max = self.bigEditor.getValue();
- if (minComboValue[0] === 0) {
- value.closemin = false
- } else {
- value.closemin = true
- }
-
- if (maxComboValue[0] === 0) {
- value.closemax = false
- } else {
- value.closemax = true
- }
- return value;
- }
-});
-BI.NumberInterval.EVENT_CHANGE = "EVENT_CHANGE";
-BI.NumberInterval.EVENT_VALID = "EVENT_VALID";
-BI.NumberInterval.EVENT_ERROR = "EVENT_ERROR";
-BI.shortcut("bi.number_interval", BI.NumberInterval);/**
- *
- * 表格
- *
- * Created by GUY on 2015/9/22.
- * @class BI.PageTableCell
- * @extends BI.Single
- */
-BI.PageTableCell = BI.inherit(BI.Widget, {
- _defaultConfig: function () {
- return BI.extend(BI.PageTableCell.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-page-table-cell",
- text: "",
- title: ""
- })
- },
-
- _init: function () {
- BI.PageTableCell.superclass._init.apply(this, arguments);
- var label = BI.createWidget({
- type: "bi.label",
- element: this,
- textAlign: "left",
- whiteSpace: "nowrap",
- height: this.options.height,
- text: this.options.text,
- title: this.options.title,
- value: this.options.value,
- lgap: 5,
- rgap: 5
- });
-
- if (BI.isNotNull(this.options.styles) && BI.isObject(this.options.styles)) {
- this.element.css(this.options.styles);
- }
- }
-});
-
-BI.shortcut("bi.page_table_cell", BI.PageTableCell);/**
- * 分页表格
- *
- * Created by GUY on 2016/2/15.
- * @class BI.PageTable
- * @extends BI.Widget
- */
-BI.PageTable = BI.inherit(BI.Widget, {
-
- _const: {
- scrollWidth: 18,
- minScrollWidth: 100
- },
-
- _defaultConfig: function () {
- return BI.extend(BI.PageTable.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-page-table",
- el: {
- type: "bi.sequence_table"
- },
- pager: {
- horizontal: {
- pages: false, //总页数
- curr: 1, //初始化当前页, pages为数字时可用
-
- hasPrev: BI.emptyFn,
- hasNext: BI.emptyFn,
- firstPage: 1,
- lastPage: BI.emptyFn
- },
- vertical: {
- pages: false, //总页数
- curr: 1, //初始化当前页, pages为数字时可用
-
- hasPrev: BI.emptyFn,
- hasNext: BI.emptyFn,
- firstPage: 1,
- lastPage: BI.emptyFn
- }
- },
-
- itemsCreator: BI.emptyFn,
-
- isNeedFreeze: false,//是否需要冻结单元格
- freezeCols: [], //冻结的列号,从0开始,isNeedFreeze为true时生效
-
- isNeedMerge: false,//是否需要合并单元格
- mergeCols: [], //合并的单元格列号
- mergeRule: BI.emptyFn,
-
- columnSize: [],
- minColumnSize: [],
- maxColumnSize: [],
- headerRowSize: 25,
- rowSize: 25,
-
- regionColumnSize: [],
-
- headerCellStyleGetter: BI.emptyFn,
- summaryCellStyleGetter: BI.emptyFn,
- sequenceCellStyleGetter: BI.emptyFn,
-
- header: [],
- items: [], //二维数组
-
- //交叉表头
- crossHeader: [],
- crossItems: []
- });
- },
-
- _init: function () {
- BI.PageTable.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.hCurr = 1;
- this.vCurr = 1;
-
- this.table = BI.createWidget(o.el, {
- type: "bi.sequence_table",
- width: o.width,
- height: o.height && o.height - 30,
-
- isNeedResize: true,
- isResizeAdapt: false,
-
- isNeedFreeze: o.isNeedFreeze,
- freezeCols: o.freezeCols,
-
- isNeedMerge: o.isNeedMerge,
- mergeCols: o.mergeCols,
- mergeRule: o.mergeRule,
-
- columnSize: o.columnSize,
- minColumnSize: o.minColumnSize,
- maxColumnSize: o.maxColumnSize,
- headerRowSize: o.headerRowSize,
- rowSize: o.rowSize,
-
- regionColumnSize: o.regionColumnSize,
-
- headerCellStyleGetter: o.headerCellStyleGetter,
- summaryCellStyleGetter: o.summaryCellStyleGetter,
- sequenceCellStyleGetter: o.sequenceCellStyleGetter,
-
- header: o.header,
- items: o.items,
- //交叉表头
- crossHeader: o.crossHeader,
- crossItems: o.crossItems
- });
-
- this.table.on(BI.Table.EVENT_TABLE_SCROLL, function () {
- self.fireEvent(BI.Table.EVENT_TABLE_SCROLL, arguments);
- });
- this.table.on(BI.Table.EVENT_TABLE_AFTER_REGION_RESIZE, function () {
- o.regionColumnSize = this.getRegionColumnSize();
- o.columnSize = this.getColumnSize();
- self.fireEvent(BI.Table.EVENT_TABLE_AFTER_REGION_RESIZE, arguments);
- });
- this.table.on(BI.Table.EVENT_TABLE_AFTER_COLUMN_RESIZE, function () {
- o.regionColumnSize = this.getRegionColumnSize();
- o.columnSize = this.getColumnSize();
- self.fireEvent(BI.Table.EVENT_TABLE_AFTER_COLUMN_RESIZE, arguments);
- });
-
- this.pager = BI.createWidget(o.pager, {
- type: "bi.direction_pager",
- height: 30
- });
- this.pager.on(BI.Pager.EVENT_CHANGE, function () {
- var vpage = this.getVPage && this.getVPage();
- if (BI.isNull(vpage)) {
- vpage = this.getCurrentPage();
- }
- var hpage = this.getHPage && this.getHPage();
- o.itemsCreator({
- vpage: vpage,
- hpage: hpage
- }, function (items, header, crossItems, crossHeader) {
- self.table.setVPage ? self.table.setVPage(vpage) : self.table.setValue(vpage);
- self.table.setHPage && self.table.setHPage(hpage);
- self.populate.apply(self, arguments);
- });
- });
-
- BI.createWidget({
- type: "bi.absolute",
- element: this,
- items: [{
- el: this.table,
- left: 0,
- top: 0
- }, {
- el: this.pager,
- left: 0,
- right: 0,
- bottom: 0
- }]
- })
- },
-
- setHPage: function (v) {
- this.hCurr = v;
- this.pager.setHPage && this.pager.setHPage(v);
- this.table.setHPage && this.table.setHPage(v);
- },
-
- setVPage: function (v) {
- this.vCurr = v;
- this.pager.setVPage && this.pager.setVPage(v);
- this.table.setVPage && this.table.setVPage(v);
- },
-
- getHPage: function () {
- var hpage = this.pager.getHPage && this.pager.getHPage();
- if (BI.isNotNull(hpage)) {
- return hpage;
- }
- hpage = this.pager.getCurrentPage && this.pager.getCurrentPage();
- if (BI.isNotNull(hpage)) {
- return hpage;
- }
- return this.hpage;
- },
-
- getVPage: function () {
- var vpage = this.pager.getVPage && this.pager.getVPage();
- if (BI.isNotNull(vpage)) {
- return vpage;
- }
- vpage = this.pager.getCurrentPage && this.pager.getCurrentPage();
- if (BI.isNotNull(vpage)) {
- return vpage;
- }
- return this.vpage;
- },
-
- setWidth: function (width) {
- BI.PageTable.superclass.setWidth.apply(this, arguments);
- this.table.setWidth(width);
- },
-
- setHeight: function (height) {
- BI.PageTable.superclass.setHeight.apply(this, arguments);
- var showPager = false;
- if (this.pager.alwaysShowPager) {
- showPager = true;
- } else if (this.pager.hasHNext && this.pager.hasHNext()) {
- showPager = true;
- } else if (this.pager.hasHPrev && this.pager.hasHPrev()) {
- showPager = true;
- } else if (this.pager.hasVNext && this.pager.hasVNext()) {
- showPager = true;
- } else if (this.pager.hasVPrev && this.pager.hasVPrev()) {
- showPager = true;
- } else if (this.pager.hasNext && this.pager.hasNext()) {
- showPager = true;
- } else if (this.pager.hasPrev && this.pager.hasPrev()) {
- showPager = true;
- }
- this.table.setHeight(height - (showPager ? 30 : 0));
- },
-
- setColumnSize: function (columnSize) {
- this.options.columnSize = columnSize;
- this.table.setColumnSize(columnSize);
- },
-
- getColumnSize: function () {
- return this.table.getColumnSize();
- },
-
- setRegionColumnSize: function (columnSize) {
- this.options.columnSize = columnSize;
- this.table.setRegionColumnSize(columnSize);
- },
-
- getRegionColumnSize: function () {
- return this.table.getRegionColumnSize();
- },
-
- getVerticalScroll: function () {
- return this.table.getVerticalScroll();
- },
-
- setLeftHorizontalScroll: function (scrollLeft) {
- this.table.setLeftHorizontalScroll(scrollLeft);
- },
-
- setRightHorizontalScroll: function (scrollLeft) {
- this.table.setRightHorizontalScroll(scrollLeft);
- },
-
- setVerticalScroll: function (scrollTop) {
- this.table.setVerticalScroll(scrollTop);
- },
-
- restore: function () {
- this.table.restore();
- },
-
- attr: function () {
- BI.PageTable.superclass.attr.apply(this, arguments);
- this.table.attr.apply(this.table, arguments);
- },
-
- populate: function () {
- this.pager.populate();
- this.table.populate.apply(this.table, arguments);
- },
-
- destroy: function () {
- this.table.destroy();
- this.pager && this.pager.destroy();
- BI.PageTable.superclass.destroy.apply(this, arguments);
- }
-});
-BI.shortcut('bi.page_table', BI.PageTable);/**
- * 路径选择
- *
- * Created by GUY on 2015/12/4.
- * @class BI.PathChooser
- * @extends BI.Widget
- */
-BI.PathChooser = BI.inherit(BI.Widget, {
-
- _const: {
- lineColor: "#d4dadd",
- selectLineColor: "#3f8ce8"
- },
-
- _defaultConfig: function () {
- return BI.extend(BI.PathChooser.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-path-chooser",
- items: []
- })
- },
-
- _init: function () {
- BI.PathChooser.superclass._init.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- _createRegions: function (regions) {
- var self = this;
- this.regions = BI.createWidgets(BI.map(regions, function (i, region) {
- return {
- type: "bi.path_region",
- title: self.texts[region] || region
- }
- }));
- this.regionMap = {};
- BI.each(regions, function (i, region) {
- self.regionMap[region] = i;
- });
- this.container = BI.createWidget({
- type: "bi.horizontal",
- verticalAlign: "top",
- scrollx: false,
- scrolly: false,
- hgap: 10,
- items: this.regions
- });
- BI.createWidget({
- type: "bi.vertical_adapt",
- element: this,
- scrollable: true,
- hgap: 10,
- items: [this.container]
- });
- },
-
- getRegionIndexById: function (id) {
- var node = this.cache[id];
- var regionType = node.get("region");
- return this.regionMap[regionType];
- },
-
- _drawPath: function (start, offset, index) {
- var self = this;
- var starts = [];
- if (BI.contains(this.start, start)) {
- starts = this.start;
- } else {
- starts = [start];
- }
-
- BI.each(starts, function (i, s) {
- BI.each(self.radios[s], function (i, rad) {
- rad.setSelected(false);
- });
- BI.each(self.lines[s], function (i, line) {
- line.attr("stroke", self._const.lineColor);
- });
- BI.each(self.regionIndexes[s], function (i, idx) {
- self.regions[idx].reset();
- });
- });
-
- BI.each(this.routes[start][index], function (i, id) {
- var regionIndex = self.getRegionIndexById(id);
- self.regions[regionIndex].setSelect(offset + index, id);
- });
- var current = BI.last(this.routes[start][index]);
-
- while (current && this.routes[current] && this.routes[current].length === 1) {
- BI.each(this.routes[current][0], function (i, id) {
- var regionIndex = self.getRegionIndexById(id);
- self.regions[regionIndex].setSelect(0, id);
- });
- this.lines[current][0].attr("stroke", self._const.selectLineColor).toFront();
- current = BI.last(this.routes[current][0]);
- }
- this.lines[start][index].attr("stroke", self._const.selectLineColor).toFront();
- this.radios[start] && this.radios[start][index] && this.radios[start][index].setSelected(true);
- },
-
- _drawRadio: function (start, offset, index, x, y) {
- var self = this;
- var radio = BI.createWidget({
- type: "bi.radio",
- cls: "path-chooser-radio",
- selected: offset + index === 0,
- start: start,
- index: index
- });
- radio.on(BI.Radio.EVENT_CHANGE, function () {
- self._drawPath(start, offset, index);
- self.fireEvent(BI.PathChooser.EVENT_CHANGE, start, index);
- });
- if (!this.radios[start]) {
- this.radios[start] = [];
- }
- this.radios[start].push(radio);
- BI.createWidget({
- type: "bi.absolute",
- element: this.container,
- items: [{
- el: radio,
- left: x - 6.5,
- top: y - 6.5
- }]
- })
- },
-
- _drawLine: function (start, lines) {
- var self = this;
- if (!this.lines[start]) {
- this.lines[start] = [];
- }
- if (!this.pathes[start]) {
- this.pathes[start] = [];
- }
- var startRegionIndex = this.getRegionIndexById(start);
- //start所在的位置,然后接着往下画其他的路径
- var offset = this.regions[startRegionIndex].getIndexByValue(start);
- BI.each(lines, function (i, line) {
- self.pathes[start][i] = [];
- var idx = i + offset;
- var path = "";
- var stop = 47.5 + 29 * idx;
- var sleft = 50 + 100 * startRegionIndex;
- var radioStartX = sleft, radioStartY = stop;
- var etop = stop;
- var endRegionIndex = self.getRegionIndexById(BI.last(line));
- var endOffset = self.regions[endRegionIndex].getIndexByValue(BI.last(line));
- var eleft = 50 + 100 * endRegionIndex;
- if (BI.contains(self.start, start)) {
- radioStartX = sleft - 50;
- path += "M" + (sleft - 50) + "," + stop;
- self.pathes[start][i].push({
- x: sleft - 50,
- y: stop
- })
- } else if (idx === 0) {
- radioStartX = sleft + 50;
- path += "M" + sleft + "," + stop;
- self.pathes[start][i].push({
- x: sleft,
- y: stop
- })
- } else {
- radioStartX = sleft + 50;
- path += "M" + sleft + "," + 47.5 + "L" + (sleft + 50) + "," + 47.5 + "L" + (sleft + 50) + "," + stop;
- self.pathes[start][i].push({
- x: sleft,
- y: 47.5
- });
- self.pathes[start][i].push({
- x: sleft + 50,
- y: 47.5
- });
- self.pathes[start][i].push({
- x: sleft + 50,
- y: stop
- });
- }
- if (idx > 0) {
- var endY = endOffset * 29 + 47.5;
- path += "L" + (eleft - 50) + "," + etop + "L" + (eleft - 50) + "," + endY + "L" + eleft + "," + endY;
- self.pathes[start][i].push({
- x: eleft - 50,
- y: etop
- });
- self.pathes[start][i].push({
- x: eleft - 50,
- y: endY
- });
- self.pathes[start][i].push({
- x: eleft,
- y: endY
- });
- } else {
- path += "L" + eleft + "," + etop;
- self.pathes[start][i].push({
- x: eleft,
- y: etop
- });
- }
-
- var graph = self.svg.path(path)
- .attr({
- stroke: idx === 0 ? self._const.selectLineColor : self._const.lineColor,
- 'stroke-dasharray': '-'
- });
- self.lines[start].push(graph);
- if (lines.length > 1) {
- self.lines[start][0].toFront();
- }
- //第一个元素无论有多少个都要显示radio
- if (BI.contains(self.start, start)) {
- self.lines[self.regions[0].getValueByIndex(0)][0].toFront();
- }
- if (lines.length > 1 || BI.contains(self.start, start)) {
- self._drawRadio(start, offset, i, radioStartX, radioStartY);
- }
- });
- },
-
- _drawLines: function (routes) {
- var self = this;
- this.lines = {};
- this.pathes = {};
- this.radios = {};
- this.regionIndexes = {};
- BI.each(routes, function (k, route) {
- if (!self.regionIndexes[k]) {
- self.regionIndexes[k] = [];
- }
- BI.each(route, function (i, rs) {
- BI.each(rs, function (j, id) {
- var regionIndex = self.getRegionIndexById(id);
- if (!BI.contains(self.regionIndexes[k], regionIndex)) {
- self.regionIndexes[k].push(regionIndex);
- }
- });
- })
- });
- BI.each(routes, function (k, route) {
- self._drawLine(k, route);
- });
- },
-
- _pushNodes: function (nodes) {
- var self = this;
- var indexes = [];
- for (var i = 0; i < nodes.length; i++) {
- var id = nodes[i];
- var index = self.getRegionIndexById(id);
- indexes.push(index);
- var region = self.regions[index];
- if (i === nodes.length - 1) {
- if (!region.hasItem(id)) {
- region.addItem(id, self.texts[id]);
- }
- break;
- }
- if (i > 0 || BI.contains(self.start, id)) {
- region.addItem(id, self.texts[id]);
- }
- }
- for (var i = BI.first(indexes); i < BI.last(indexes); i++) {
- if (!BI.contains(indexes, i)) {
- self.regions[i].addItem("");
- }
- }
- },
-
- _createNodes: function () {
- var self = this, o = this.options;
- this.cache = {};
- this.texts = {};
- this.start = [];
- this.end = [];
- BI.each(o.items, function (i, item) {
- self.start.push(BI.first(item).value);
- self.end.push(BI.last(item).value);
- });
- this.start = BI.uniq(this.start);
- this.end = BI.uniq(this.end);
- var regions = [];
- var tree = new BI.Tree();
- var branches = {}, max = 0;
- BI.each(o.items, function (i, items) {
- BI.each(items, function (j, item) {
- if (!BI.has(branches, item.value)) {
- branches[item.value] = 0;
- }
- branches[item.value]++;
- max = Math.max(max, branches[item.value]);
- var prev = {};
- if (j > 0) {
- prev = items[j - 1];
- }
- var parent = self.cache[prev.value || ""];
- var node = self.cache[item.value] || new BI.Node(item.value);
- node.set(item);
- self.cache[item.value] = node;
- self.texts[item.value] = item.text;
- self.texts[item.region] = item.regionText;
- parent = BI.isNull(parent) ? tree.getRoot() : parent;
- if (parent.getChildIndex(item.value) === -1) {
- tree.addNode(parent, node);
- }
- })
- });
-
- //算出区域列表
- tree.traverse(function (node) {
- BI.each(node.getChildren(), function (i, child) {
- if (BI.contains(regions, child.get("region"))) {
- var index1 = BI.indexOf(regions, node.get("region"));
- var index2 = BI.indexOf(regions, child.get("region"));
- //交换区域
- if (index1 > index2) {
- var t = regions[index2];
- for (var j = index2; j < index1; j++) {
- regions[j] = regions[j + 1];
- }
- regions[index1] = t;
- }
- } else {
- regions.push(child.get("region"));
- }
- });
- });
- this._createRegions(regions);
-
- //算出节点
- BI.each(branches, function (k, branch) {
- if (branch < max) {
- delete branches[k];
- }
- });
-
- //过滤节点
- var nodes = [];
- var n = tree.getRoot();
- while (n && n.getChildrenLength() === 1) {
- if (BI.has(branches, n.getChildren()[0].id)) {
- delete branches[n.getChildren()[0].id];
- n = n.getChildren()[0];
- } else {
- n = null;
- }
- }
- tree.traverse(function (node) {
- if (BI.has(branches, node.id)) {
- nodes.push(node.id);
- delete branches[node.id];
- }
- });
-
- //填充节点
- var routes = {};
- var s, e;
- for (var i = 0, len = nodes.length; i < len + 1; i++) {
- if (len === 0) {
- s = [];
- BI.each(this.start, function (i, id) {
- s.push(tree.search(id));
- });
- e = [];
- BI.each(this.end, function (i, id) {
- e.push(tree.search(id));
- });
- } else if (i === len) {
- s = e;
- e = [];
- BI.each(this.end, function (i, id) {
- e.push(tree.search(id));
- });
- } else if (i === 0) {
- s = [];
- BI.each(this.start, function (i, id) {
- s.push(tree.search(id));
- });
- e = [tree.search(nodes[i])];
- } else {
- s = [tree.search(e[0] || tree.getRoot(), nodes[i - 1])];
- e = [tree.search(s[0], nodes[i])];
- }
- BI.each(s, function (i, n) {
- tree._recursion(n, [n.id], function (node, route) {
- if (BI.contains(e, node)) {
- if (!routes[n.id]) {
- routes[n.id] = [];
- }
- routes[n.id].push(route);
- self._pushNodes(route);
- if (e.length <= 1) {
- return true;
- }
- }
- })
- });
- }
- this.routes = routes;
- this._drawLines(routes);
- },
-
- _unselectAllPath: function () {
- var self = this;
- BI.each(this.radios, function (idx, rad) {
- BI.each(rad, function (i, r) {
- r.setSelected(false);
- });
- });
- BI.each(this.lines, function (idx, line) {
- BI.each(line, function (i, li) {
- li.attr("stroke", self._const.lineColor);
- });
- });
- BI.each(this.regions, function (idx, region) {
- region.reset();
- });
- },
-
- populate: function (items) {
- this.options.items = items || [];
- var self = this;
- this.empty();
- if (this.options.items.length <= 0) {
- return;
- }
- this.svg = BI.createWidget({
- type: "bi.svg"
- });
- this._createNodes();
- BI.createWidget({
- type: "bi.absolute",
- element: this.container,
- items: [{
- el: this.svg,
- top: 0,
- left: 0,
- right: 0,
- bottom: 0
- }]
- });
- },
-
- setValue: function (v) {
- this._unselectAllPath();
- var nodes = BI.keys(this.routes), self = this;
- var result = [], array = [];
- BI.each(v, function (i, val) {
- if (BI.contains(nodes, val)) {
- if (array.length > 0) {
- array.push(val);
- result.push(array);
- array = [];
- }
- }
- array.push(val);
- });
- if (array.length > 0) {
- result.push(array);
- }
- //画这n条路径
- BI.each(result, function (idx, path) {
- var start = path[0];
- var index = BI.findIndex(self.routes[start], function (idx, p) {
- if (BI.isEqual(path, p)) {
- return true;
- }
- });
- if (index >= 0) {
- var startRegionIndex = self.getRegionIndexById(start);
- var offset = self.regions[startRegionIndex].getIndexByValue(start);
- self._drawPath(start, offset, index);
- }
- });
- },
-
- getValue: function () {
- var path = [];
- BI.each(this.regions, function (i, region) {
- var val = region.getValue();
- if (BI.isKey(val)) {
- path.push(val);
- }
- });
- return path;
- }
-});
-BI.PathChooser.EVENT_CHANGE = "PathChooser.EVENT_CHANGE";
-BI.shortcut("bi.path_chooser", BI.PathChooser);/**
- * 路径选择区域
- *
- * Created by GUY on 2015/12/4.
- * @class BI.PathRegion
- * @extends BI.Widget
- */
-BI.PathRegion = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.PathRegion.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-path-region bi-background",
- width: 80,
- title: ""
- })
- },
-
- _init: function () {
- BI.PathRegion.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.zIndex = 100;
- var title = BI.createWidget({
- type: "bi.label",
- text: o.title,
- title: o.title,
- height: 30
- });
- title.element.css("zIndex", this.zIndex--);
- this.items = [];
- this.vertical = BI.createWidget({
- type: "bi.vertical",
- element: this,
- bgap: 5,
- hgap: 10,
- items: [title]
- })
- },
-
- hasItem: function (val) {
- return BI.any(this.items, function (i, item) {
- return val === item.getValue();
- });
- },
-
- addItem: function (value, text) {
- if (BI.isKey(value)) {
- var label = BI.createWidget({
- type: "bi.label",
- cls: "path-region-label bi-card bi-border bi-list-item-select",
- text: text,
- value: value,
- title: text || value,
- height: 24
- });
- } else {
- var label = BI.createWidget({
- type: "bi.layout",
- height: 24
- });
- }
- label.element.css("zIndex", this.zIndex--);
- this.items.push(label);
- this.vertical.addItem(label);
- if (this.items.length === 1) {
- this.setSelect(0, value);
- }
- },
-
- reset: function () {
- BI.each(this.items, function (i, item) {
- item.element.removeClass("active");
- });
- },
-
- setSelect: function (index, value) {
- this.reset();
- if (this.items.length <= 0) {
- return;
- }
- if (this.items.length === 1) {
- this.items[0].element.addClass("active");
- return;
- }
- if (this.items[index].attr("value") === value) {
- this.items[index].element.addClass("active");
- }
- },
-
- setValue: function (value) {
- this.setSelect(this.getIndexByValue(value), value);
- },
-
- getValueByIndex: function (idx) {
- return this.items[idx].attr("value");
- },
-
- getIndexByValue: function (value) {
- return BI.findIndex(this.items, function (i, item) {
- return item.attr("value") === value;
- });
- },
-
- getValue: function () {
- var res;
- BI.any(this.items, function (i, item) {
- if (item.element.hasClass("active")) {
- res = item.getValue();
- return true;
- }
- });
- return res;
- }
-});
-BI.PathRegion.EVENT_CHANGE = "PathRegion.EVENT_CHANGE";
-BI.shortcut("bi.path_region", BI.PathRegion);/**
- * 预览表列
- *
- * Created by GUY on 2015/12/25.
- * @class BI.PreviewTableCell
- * @extends BI.Widget
- */
-BI.PreviewTableCell = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.PreviewTableCell.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-preview-table-cell",
- text: ""
- });
- },
-
- _init: function () {
- BI.PreviewTableCell.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
-
- BI.createWidget({
- type: "bi.label",
- element: this,
- textAlign: "left",
- whiteSpace: "normal",
- height: this.options.height,
- text: this.options.text,
- value: this.options.value
- })
- }
-});
-BI.shortcut('bi.preview_table_cell', BI.PreviewTableCell);/**
- * 预览表
- *
- * Created by GUY on 2015/12/25.
- * @class BI.PreviewTableHeaderCell
- * @extends BI.Widget
- */
-BI.PreviewTableHeaderCell = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.PreviewTableHeaderCell.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-preview-table-header-cell",
- text: ""
- });
- },
-
- _init: function () {
- BI.PreviewTableHeaderCell.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
-
- BI.createWidget({
- type: "bi.label",
- element: this,
- textAlign: "left",
- whiteSpace: "normal",
- height: this.options.height,
- text: this.options.text,
- value: this.options.value
- })
- }
-});
-BI.shortcut('bi.preview_table_header_cell', BI.PreviewTableHeaderCell);/**
- * 预览表
- *
- * Created by GUY on 2015/12/25.
- * @class BI.PreviewTable
- * @extends BI.Widget
- */
-BI.PreviewTable = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.PreviewTable.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-preview-table",
- isNeedFreeze: false,
- freezeCols: [],
- rowSize: null,
- columnSize: [],
- headerRowSize: 30,
- header: [],
- items: []
- });
- },
-
- _init: function () {
- BI.PreviewTable.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
-
- this.table = BI.createWidget({
- type: "bi.table_view",
- element: this,
- isNeedResize: false,
-
- isResizeAdapt: false,
-
- isNeedFreeze: o.isNeedFreeze,
- freezeCols: o.freezeCols,
-
- rowSize: o.rowSize,
- columnSize: o.columnSize,
- headerRowSize: o.headerRowSize,
-
- header: BI.map(o.header, function (i, items) {
- return BI.map(items, function (j, item) {
- return BI.extend({
- type: "bi.preview_table_header_cell"
- }, item);
- });
- }),
- items: BI.map(o.items, function (i, items) {
- return BI.map(items, function (j, item) {
- return BI.extend({
- type: "bi.preview_table_cell"
- }, item);
- });
- })
- });
- this.table.on(BI.Table.EVENT_TABLE_AFTER_INIT, function () {
- self._adjustColumns();
- self.fireEvent(BI.Table.EVENT_TABLE_AFTER_INIT, arguments);
- });
- this.table.on(BI.Table.EVENT_TABLE_RESIZE, function () {
- self._adjustColumns();
- });
- },
-
- //是否有自适应调节的列,即列宽为""
- _hasAdaptCol: function (columnSize) {
- return BI.any(columnSize, function (i, size) {
- return size === "";
- })
- },
-
- _isPercentage: function (columnSize) {
- return columnSize[0] <= 1;
- },
-
- _adjustColumns: function () {
- var self = this, o = this.options;
- if (o.isNeedFreeze === true) {
- //如果存在百分比的情况
- if (this._isPercentage(o.columnSize)) {
- if (this._hasAdaptCol(o.columnSize)) {
- var findCols = [], remain = 0;
- BI.each(o.columnSize, function (i, size) {
- if (size === "") {
- findCols.push(i);
- } else {
- remain += size;
- }
- });
- remain = 1 - remain;
- var average = remain / findCols.length;
- BI.each(findCols, function (i, col) {
- o.columnSize[col] = average;
- });
- }
- var isRight = BI.first(o.freezeCols) !== 0;
- var freezeSize = [], notFreezeSize = [];
- BI.each(o.columnSize, function (i, size) {
- if (o.freezeCols.contains(i)) {
- freezeSize.push(size);
- } else {
- notFreezeSize.push(size);
- }
- });
- var sumFreezeSize = BI.sum(freezeSize), sumNotFreezeSize = BI.sum(notFreezeSize);
- BI.each(freezeSize, function (i, size) {
- freezeSize[i] = size / sumFreezeSize;
- });
- BI.each(notFreezeSize, function (i, size) {
- notFreezeSize[i] = size / sumNotFreezeSize;
- });
- this.table.setRegionColumnSize(isRight ? ["fill", sumFreezeSize] : [sumFreezeSize, "fill"]);
- this.table.setColumnSize(isRight ? (notFreezeSize.concat(freezeSize)) : (freezeSize.concat(notFreezeSize)));
- }
- } else {
- //如果存在自适应宽度的列或者是百分比计算的列,需要将整个表宽设为100%
- if (this._hasAdaptCol(o.columnSize) || this._isPercentage(o.columnSize)) {
- this.table.setRegionColumnSize(["100%"]);
- }
- }
- },
-
- setColumnSize: function (columnSize) {
- return this.table.setColumnSize(columnSize);
- },
-
- getColumnSize: function () {
- return this.table.getColumnSize();
- },
-
- getCalculateColumnSize: function () {
- return this.table.getCalculateColumnSize();
- },
-
- setHeaderColumnSize: function (columnSize) {
- return this.table.setHeaderColumnSize(columnSize);
- },
-
- setRegionColumnSize: function (columnSize) {
- return this.table.setRegionColumnSize(columnSize);
- },
-
- getRegionColumnSize: function () {
- return this.table.getRegionColumnSize();
- },
-
- getCalculateRegionColumnSize: function () {
- return this.table.getCalculateRegionColumnSize();
- },
-
- getCalculateRegionRowSize: function () {
- return this.table.getCalculateRegionRowSize();
- },
-
- getClientRegionColumnSize: function () {
- return this.table.getClientRegionColumnSize();
- },
-
- getScrollRegionColumnSize: function () {
- return this.table.getScrollRegionColumnSize()
- },
-
- getScrollRegionRowSize: function () {
- return this.table.getScrollRegionRowSize()
- },
-
- hasVerticalScroll: function () {
- return this.table.hasVerticalScroll();
- },
-
- setVerticalScroll: function (scrollTop) {
- return this.table.setVerticalScroll(scrollTop);
- },
-
- setLeftHorizontalScroll: function (scrollLeft) {
- return this.table.setLeftHorizontalScroll(scrollLeft)
- },
-
- setRightHorizontalScroll: function (scrollLeft) {
- return this.table.setRightHorizontalScroll(scrollLeft);
- },
-
- getVerticalScroll: function () {
- return this.table.getVerticalScroll();
- },
-
- getLeftHorizontalScroll: function () {
- return this.table.getLeftHorizontalScroll();
- },
-
- getRightHorizontalScroll: function () {
- return this.table.getRightHorizontalScroll();
- },
-
- getColumns: function () {
- return this.table.getColumns();
- },
-
- populate: function (items, header) {
- this.table.populate(items, header);
- }
-});
-BI.PreviewTable.EVENT_CHANGE = "PreviewTable.EVENT_CHANGE";
-BI.shortcut('bi.preview_table', BI.PreviewTable);/**
- * 季度下拉框
- *
- * Created by GUY on 2015/8/28.
- * @class BI.QuarterCombo
- * @extends BI.Widget
- */
-BI.QuarterCombo = BI.inherit(BI.Widget, {
- _defaultConfig: function () {
- return BI.extend(BI.QuarterCombo.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-quarter-combo",
- behaviors: {},
- height: 25
- });
- },
- _init: function () {
- BI.QuarterCombo.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.storeValue = "";
- this.trigger = BI.createWidget({
- type: "bi.quarter_trigger"
- });
-
- this.trigger.on(BI.QuarterTrigger.EVENT_FOCUS, function () {
- self.storeValue = this.getKey();
- });
- this.trigger.on(BI.QuarterTrigger.EVENT_START, function () {
- self.combo.isViewVisible() && self.combo.hideView();
- });
- this.trigger.on(BI.QuarterTrigger.EVENT_STOP, function () {
- if (!self.combo.isViewVisible()) {
- self.combo.showView();
- }
- });
- this.trigger.on(BI.QuarterTrigger.EVENT_CONFIRM, function () {
- if (self.combo.isViewVisible()) {
- return;
- }
- if (this.getKey() && this.getKey() !== self.storeValue) {
- self.setValue(this.getKey());
- } else if (!this.getKey()) {
- self.setValue();
- }
- self.fireEvent(BI.QuarterCombo.EVENT_CONFIRM);
- });
- this.popup = BI.createWidget({
- type: "bi.quarter_popup",
- behaviors: o.behaviors
- });
-
- this.popup.on(BI.QuarterPopup.EVENT_CHANGE, function () {
- self.setValue(self.popup.getValue());
- self.combo.hideView();
- self.fireEvent(BI.QuarterCombo.EVENT_CONFIRM);
- });
-
- this.combo = BI.createWidget({
- type: "bi.combo",
- element: this,
- isNeedAdjustHeight: false,
- isNeedAdjustWidth: false,
- el: this.trigger,
- popup: {
- minWidth: 85,
- el: this.popup
- }
- });
- this.combo.on(BI.Combo.EVENT_BEFORE_POPUPVIEW, function () {
- self.fireEvent(BI.QuarterCombo.EVENT_BEFORE_POPUPVIEW);
- });
- },
-
- setValue: function (v) {
- this.trigger.setValue(v);
- this.popup.setValue(v);
- },
-
- getValue: function () {
- return this.popup.getValue() || "";
- }
-});
-
-BI.QuarterCombo.EVENT_CONFIRM = "EVENT_CONFIRM";
-BI.QuarterCombo.EVENT_BEFORE_POPUPVIEW = "EVENT_BEFORE_POPUPVIEW";
-BI.shortcut('bi.quarter_combo', BI.QuarterCombo);/**
- * 季度展示面板
- *
- * Created by GUY on 2015/9/2.
- * @class BI.QuarterPopup
- * @extends BI.Trigger
- */
-BI.QuarterPopup = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.QuarterPopup.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-quarter-popup",
- behaviors: {}
- });
- },
-
- _init: function () {
- BI.QuarterPopup.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
-
- var items = [{
- text: Date._QN[01],
- value: 1
- }, {
- text: Date._QN[2],
- value: 2
- }, {
- text: Date._QN[3],
- value: 3
- }, {
- text: Date._QN[4],
- value: 4
- }];
- items = BI.map(items, function (j, item) {
- return BI.extend(item, {
- type: "bi.text_item",
- cls: "bi-list-item-active",
- textAlign: "left",
- whiteSpace: "nowrap",
- once: false,
- forceSelected: true,
- height: 25
- });
- });
-
- this.quarter = BI.createWidget({
- type: "bi.button_group",
- element: this,
- behaviors: o.behaviors,
- items: BI.createItems(items, {}),
- layouts: [{
- type: "bi.vertical"
- }]
- });
-
- this.quarter.on(BI.Controller.EVENT_CHANGE, function (type) {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- if (type === BI.Events.CLICK) {
- self.fireEvent(BI.MonthPopup.EVENT_CHANGE);
- }
- })
- },
-
- getValue: function () {
- return this.quarter.getValue()[0];
- },
-
- setValue: function (v) {
- this.quarter.setValue([v]);
- }
-});
-BI.QuarterPopup.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut("bi.quarter_popup", BI.QuarterPopup);/**
- * 季度trigger
- *
- * Created by GUY on 2015/8/21.
- * @class BI.QuarterTrigger
- * @extends BI.Trigger
- */
-BI.QuarterTrigger = BI.inherit(BI.Trigger, {
- _const: {
- hgap: 4,
- vgap: 2,
- textWidth: 40,
- errorText: BI.i18nText("BI-Quarter_Trigger_Error_Text")
- },
-
- _defaultConfig: function () {
- return BI.extend(BI.QuarterTrigger.superclass._defaultConfig.apply(this, arguments), {
- extraCls: "bi-quarter-trigger bi-border",
- height: 24
- });
- },
- _init: function () {
- BI.QuarterTrigger.superclass._init.apply(this, arguments);
- var self = this, o = this.options, c = this._const;
- this.editor = BI.createWidget({
- type: "bi.sign_editor",
- height: o.height,
- validationChecker: function (v) {
- return v === "" || (BI.isPositiveInteger(v) && v >= 1 && v <= 4);
- },
- quitChecker: function (v) {
- return false;
- },
- hgap: c.hgap,
- vgap: c.vgap,
- allowBlank: true,
- errorText: c.errorText
- });
- this.editor.on(BI.SignEditor.EVENT_FOCUS, function () {
- self.fireEvent(BI.QuarterTrigger.EVENT_FOCUS);
- });
- this.editor.on(BI.SignEditor.EVENT_CHANGE, function () {
- self.fireEvent(BI.QuarterTrigger.EVENT_CHANGE);
- });
- this.editor.on(BI.SignEditor.EVENT_CONFIRM, function () {
- var value = self.editor.getValue();
- if (BI.isNotNull(value)) {
- self.editor.setValue(value);
- self.editor.setTitle(value);
- }
- self.fireEvent(BI.QuarterTrigger.EVENT_CONFIRM);
- });
- this.editor.on(BI.SignEditor.EVENT_SPACE, function () {
- if (self.editor.isValid()) {
- self.editor.blur();
- }
- });
- this.editor.on(BI.SignEditor.EVENT_START, function () {
- self.fireEvent(BI.QuarterTrigger.EVENT_START);
- });
- this.editor.on(BI.SignEditor.EVENT_STOP, function () {
- self.fireEvent(BI.QuarterTrigger.EVENT_STOP);
- });
-
- BI.createWidget({
- element: this,
- type: 'bi.htape',
- items: [
- {
- el: this.editor
- }, {
- el: {
- type: "bi.text_button",
- baseCls: "bi-trigger-quarter-text",
- text: BI.i18nText("BI-Multi_Date_Quarter"),
- width: c.textWidth
- },
- width: c.textWidth
- }, {
- el: {
- type: "bi.trigger_icon_button",
- width: o.height
- },
- width: o.height
- }
- ]
- });
- },
-
- setValue: function (v) {
- v = v || "";
- this.editor.setState(v);
- this.editor.setValue(v);
- this.editor.setTitle(v);
- },
-
- getKey: function () {
- return this.editor.getValue();
- }
-});
-BI.QuarterTrigger.EVENT_FOCUS = "EVENT_FOCUS";
-BI.QuarterTrigger.EVENT_CHANGE = "EVENT_CHANGE";
-BI.QuarterTrigger.EVENT_START = "EVENT_START";
-BI.QuarterTrigger.EVENT_STOP = "EVENT_STOP";
-BI.QuarterTrigger.EVENT_CONFIRM = "EVENT_CONFIRM";
-BI.shortcut("bi.quarter_trigger", BI.QuarterTrigger);/**
- * 关联视图字段Item
- *
- * Created by GUY on 2015/12/23.
- * @class BI.RelationViewItem
- * @extends BI.Widget
- */
-BI.RelationViewItem = BI.inherit(BI.BasicButton, {
-
- _defaultConfig: function () {
- return BI.extend(BI.RelationViewItem.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-relation-view-item bi-list-item-active",
- height: 25,
- hoverIn: BI.emptyFn,
- hoverOut: BI.emptyFn
- });
- },
-
- _init: function () {
- BI.RelationViewItem.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.element.hover(o.hoverIn, o.hoverOut);
- var items = [];
- if (o.isPrimary) {
- items.push({
- type: "bi.icon",
- width: 16,
- height: 16,
- title: BI.i18nText("BI-Primary_Key")
- });
- }
- items.push({
- type: "bi.label",
- text: o.text,
- value: o.value,
- height: o.height,
- textAlign: "left",
- width: o.isPrimary ? 70 : 90,
- lgap: o.isPrimary ? 0 : 10
- });
- BI.createWidget({
- type: "bi.vertical_adapt",
- element: this,
- items: items,
- cls: "primary-key-font",
- lgap: 5
- });
- },
-
- enableHover: function (opt) {
- BI.RelationViewRegion.superclass.enableHover.apply(this, [{
- container: "body"
- }]);
- },
-
- setSelected: function (b) {
- this.element[b ? "addClass" : "removeClass"]("active");
- }
-});
-BI.shortcut('bi.relation_view_item', BI.RelationViewItem);/**
- * 关联视图
- *
- * Created by GUY on 2015/12/22.
- * @class BI.RelationView
- * @extends BI.Widget
- */
-BI.RelationView = BI.inherit(BI.Widget, {
-
- _const: {
- lineColor: "#c4c6c6",
- selectLineColor: "#009de3"
- },
-
- _defaultConfig: function () {
- return BI.extend(BI.RelationView.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-relation-view",
- items: []
- });
- },
-
- _init: function () {
- BI.RelationView.superclass._init.apply(this, arguments);
- this.populate(this.options.items);
- },
-
- _calculateWidths: function () {
- var widths = [];
- BI.each(this.views, function (i, items) {
- BI.each(items, function (j, obj) {
- if (!widths[j]) {
- widths[j] = BI.MIN;
- }
- widths[j] = Math.max(widths[j], obj.getWidth());
- })
- });
- return widths;
- },
-
- _calculateHeights: function () {
- var heights = BI.makeArray(BI.size(this.views), BI.MIN);
- BI.each(this.views, function (i, items) {
- BI.each(items, function (j, obj) {
- heights[i] = Math.max(heights[i], obj.getHeight());
- })
- });
- return heights;
- },
-
- _hoverIn: function (target) {
- var self = this, c = this._const;
- BI.each(this.relations, function (start, rs) {
- BI.each(rs, function (end, relation) {
- if (relation[0].primary.value === target || relation[0].foreign.value === target) {
- self.lines[start][end].attr("stroke", c.selectLineColor).toFront();
- self.storeViews[start].setValue(relation[0].primary.value);
- self.storeViews[end].setValue(relation[0].foreign.value);
- }
- });
- });
- },
-
- _hoverOut: function (target) {
- var self = this, c = this._const;
- BI.each(this.relations, function (start, rs) {
- BI.each(rs, function (end, relation) {
- if (relation[0].primary.value === target || relation[0].foreign.value === target) {
- self.lines[start][end].attr("stroke", c.lineColor);
- self.storeViews[start].setValue([]);
- self.storeViews[end].setValue([]);
- }
- });
- });
- },
-
- previewRelationTables: function(relationTables, show) {
- if (!show) {
- BI.each(this.storeViews, function (i, view) {
- view.toggleRegion(true);
- view.setPreviewSelected(false);
- });
- BI.each(this.lines, function (i, lines) {
- BI.each(lines, function (j, line) {
- line.show();
- });
- });
- return;
- }
- BI.each(this.storeViews, function (id, view) {
- if (!relationTables.contains(id)) {
- view.toggleRegion(false);
- } else {
- view.setPreviewSelected(true);
- }
- });
- BI.each(this.lines, function (id, lines) {
- BI.each(lines, function (cId, line) {
- if (!relationTables.contains(id) || !relationTables.contains(cId)) {
- line.hide();
- }
- });
- });
- },
-
- populate: function (items) {
- var self = this, o = this.options, c = this._const;
- o.items = items || [];
- this.empty();
- this.svg = BI.createWidget({
- type: "bi.svg"
- });
-
- //算出所有的区域和关联
- var regions = this.regions = {}, relations = this.relations = {};
- BI.each(items, function (i, item) {
- var pr = item.primary.region, fr = item.foreign && item.foreign.region;
- if (pr && !relations[pr]) {
- relations[pr] = {};
- }
- if (pr && fr && !relations[pr][fr]) {
- relations[pr][fr] = [];
- }
- if (pr && !regions[pr]) {
- regions[pr] = [];
- }
- if (fr && !regions[fr]) {
- regions[fr] = [];
- }
- if (pr && !BI.deepContains(regions[pr], item.primary)) {
- regions[pr].push(item.primary);
- }
- if (fr && !BI.deepContains(regions[fr], item.foreign)) {
- regions[fr].push(item.foreign);
- }
- pr && fr && relations[pr][fr].push(item);
- });
- //求拓扑
- var topology = [];
- var rs = BI.clone(regions), store = {};
- while (!BI.isEmpty(rs)) {
- var clone = BI.clone(rs);
- BI.each(o.items, function (i, item) {
- if (!store[item.primary.region]) {
- delete clone[item.foreign && item.foreign.region];
- }
- });
- topology.push(BI.keys(clone));
- BI.extend(store, clone);
- BI.each(clone, function (k, v) {
- delete rs[k];
- });
- }
- //构建视图
- var views = this.views = {}, storeViews = this.storeViews = {}, indexes = this.indexes = {};
- var verticals = [];
- BI.each(topology, function (i, items) {
- if (!views[i]) {
- views[i] = {};
- }
- var horizontal = [];
- BI.each(items, function (j, region) {
- var items = regions[region];
- views[i][j] = storeViews[region] = BI.createWidget({
- type: "bi.relation_view_region_container",
- value: region,
- header: items[0].regionTitle,
- text: items.length > 0 ? items[0].regionText : "",
- handler: items.length > 0 ? items[0].regionHandler : BI.emptyFn,
- items: items,
- belongPackage: items.length > 0 ? items[0].belongPackage : true
- });
- if (BI.isNotNull(items[0]) && BI.isNotNull(items[0].keyword)) {
- views[i][j].doRedMark(items[0].keyword);
- }
- views[i][j].on(BI.RelationViewRegionContainer.EVENT_HOVER_IN, function (v) {
- self._hoverIn(v);
- });
- views[i][j].on(BI.RelationViewRegionContainer.EVENT_HOVER_OUT, function (v) {
- self._hoverOut(v);
- });
- views[i][j].on(BI.RelationViewRegionContainer.EVENT_PREVIEW, function (v) {
- self.fireEvent(BI.RelationView.EVENT_PREVIEW, region, v);
- });
- indexes[region] = {i: i, j: j};
- horizontal.push(views[i][j]);
- });
- verticals.push({
- type: "bi.horizontal",
- items: horizontal
- })
- });
-
- //求每一行的高度
- var heights = this._calculateHeights();
-
- //求每一列的宽度
- var widths = this._calculateWidths();
-
- //求相对宽度和高度
- var offsetWidths = [0], offsetHeights = [0];
- BI.each(heights, function (i, h) {
- if (i === 0) {
- return;
- }
- offsetHeights[i] = offsetHeights[i - 1] + heights[i - 1];
- });
- BI.each(widths, function (i, w) {
- if (i === 0) {
- return;
- }
- offsetWidths[i] = offsetWidths[i - 1] + widths[i - 1];
- });
-
- //画线
- var lines = this.lines = {};//缓存所有的线
- BI.each(relations, function (start, rs) {
- BI.each(rs, function (end, relation) {
- var startIndex = indexes[start], endIndex = indexes[end];
- var top = 0, right = 1, bottom = 2, left = 3;
- var startDirection = bottom, endDirection = top;
- // if (startIndex.j > endIndex.j) {
- // startDirection = left;
- // endDirection = right;
- // } else if (startIndex.j < endIndex.j) {
- // startDirection = right;
- // endDirection = left;
- // } else if (startIndex.i < endIndex.i) {
- // startDirection = bottom;
- // endDirection = top;
- // } else if (startIndex.i > endIndex.i) {
- // startDirection = top;
- // endDirection = bottom;
- // }
- var draw = function (i, j, direction, isForeign) {
- var x = offsetWidths[j] + (widths[j] - views[i][j].getWidth()) / 2;
- var y = offsetHeights[i] + (heights[i] - views[i][j].getHeight()) / 2;
- var path = "", position;
- switch (direction) {
- case top:
- position = isForeign ? views[i][j].getTopRightPosition() : views[i][j].getTopLeftPosition();
- x += position.x;
- y += position.y;
- path = "M" + x + "," + y + "L" + x + "," + (y - 10);
- y -= 10;
- break;
- case right:
- position = views[i][j].getRightPosition();
- x += position.x;
- y += position.y;
- path = "M" + x + "," + y + "L" + (x + 10) + "," + y;
- x += 10;
- break;
- case bottom:
- position = views[i][j].getBottomPosition();
- x += position.x;
- y += position.y;
- path = "M" + x + "," + y + "L" + x + "," + (y + 10);
- y += 10;
- break;
- case left:
- position = views[i][j].getLeftPosition();
- x += position.x;
- y += position.y;
- path = "M" + x + "," + y + "L" + (x - 10) + "," + y;
- x -= 10;
- break;
- }
- return {x: x, y: y, path: path};
- };
- var path = "";
- var si = draw(startIndex.i, startIndex.j, startDirection);
- var ei = draw(endIndex.i, endIndex.j, endDirection, true);
- path += si.path + ei.path;
- if (!lines[start]) {
- lines[start] = {};
- }
- path += "M" + si.x + "," + si.y + "L" + ei.x + "," + ei.y;
- var line = lines[start][end] = self.svg.path(path)
- .attr({"stroke": c.lineColor, "stroke-width": "2"})
- .hover(function () {
- line.attr("stroke", c.selectLineColor).toFront();
- storeViews[start].setValue(relation[0].primary.value);
- storeViews[end].setValue(relation[0].foreign.value);
- }, function () {
- line.attr("stroke", c.lineColor);
- storeViews[start].setValue([]);
- storeViews[end].setValue([]);
- });
- });
- });
- var container = BI.createWidget();
- BI.createWidget({
- type: "bi.vertical",
- element: container,
- items: verticals
- });
- BI.createWidget({
- type: "bi.absolute",
- element: container,
- items: [{
- el: this.svg,
- left: 0,
- right: 0,
- top: 0,
- bottom: 0
- }]
- });
-
- BI.createWidget({
- type: "bi.center_adapt",
- scrollable: true,
- element: this,
- items: [container]
- });
- }
-});
-BI.RelationView.EVENT_CHANGE = "RelationView.EVENT_CHANGE";
-BI.RelationView.EVENT_PREVIEW = "EVENT_PREVIEW";
-BI.shortcut('bi.relation_view', BI.RelationView);/**
- * Created by Young's on 2017/3/10.
- */
-BI.RelationViewRegionContainer = BI.inherit(BI.Widget, {
- _defaultConfig: function () {
- return BI.extend(BI.RelationViewRegionContainer.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-relation-view-region-container",
- width: 150
- });
- },
-
- _init: function () {
- BI.RelationViewRegionContainer.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.region = BI.createWidget({
- type: "bi.relation_view_region",
- value: o.value,
- header: o.header,
- text: o.text,
- handler: o.handler,
- items: o.items,
- belongPackage: o.belongPackage
- });
- this.region.on(BI.RelationViewRegion.EVENT_PREVIEW, function (v) {
- self.fireEvent(BI.RelationViewRegionContainer.EVENT_PREVIEW, v);
- });
- this.region.on(BI.RelationViewRegion.EVENT_HOVER_IN, function (v) {
- self.fireEvent(BI.RelationViewRegionContainer.EVENT_HOVER_IN, v);
- });
- this.region.on(BI.RelationViewRegion.EVENT_HOVER_OUT, function (v) {
- self.fireEvent(BI.RelationViewRegionContainer.EVENT_HOVER_OUT, v);
- });
- BI.createWidget({
- type: "bi.vertical",
- element: this,
- items: [this.region],
- width: this.region.getWidth(),
- height: this.region.getHeight()
- });
- },
-
- doRedMark: function () {
- this.region.doRedMark.apply(this.region, arguments);
- },
-
- unRedMark: function () {
- this.region.unRedMark.apply(this.region, arguments);
- },
-
- getWidth: function () {
- return this.region.getWidth();
- },
-
- getHeight: function () {
- return this.region.getHeight();
- },
-
- //获取上方开始划线的位置
- getTopLeftPosition: function () {
- return this.region.getTopLeftPosition();
- },
-
- getTopRightPosition: function () {
- return this.region.getTopRightPosition();
- },
-
- getBottomPosition: function () {
- return this.region.getBottomPosition();
- },
-
- getLeftPosition: function () {
- return this.region.getLeftPosition();
- },
-
- getRightPosition: function () {
- return this.region.getRightPosition();
- },
-
- setValue: function (v) {
- this.region.setValue(v);
- },
-
- toggleRegion: function (v) {
- v === true ? this.region.element.fadeIn() : this.region.element.fadeOut();
- },
-
- setPreviewSelected: function(v) {
- this.region.setPreviewSelected(v);
- }
-});
-BI.RelationViewRegionContainer.EVENT_HOVER_IN = "RelationViewRegion.EVENT_HOVER_IN";
-BI.RelationViewRegionContainer.EVENT_HOVER_OUT = "RelationViewRegion.EVENT_HOVER_OUT";
-BI.RelationViewRegionContainer.EVENT_PREVIEW = "RelationViewRegion.EVENT_PREVIEW";
-BI.shortcut("bi.relation_view_region_container", BI.RelationViewRegionContainer);/**
- * 关联视图
- *
- * Created by GUY on 2015/12/23.
- * @class BI.RelationViewRegion
- * @extends BI.BasicButton
- */
-BI.RelationViewRegion = BI.inherit(BI.BasicButton, {
-
- _defaultConfig: function () {
- return BI.extend(BI.RelationViewRegion.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-relation-view-region cursor-pointer",
- width: 150,
- text: "",
- value: "",
- header: "",
- items: [],
- belongPackage: true
- });
- },
-
- _init: function () {
- BI.RelationViewRegion.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
-
- this.preview = BI.createWidget({
- type: "bi.icon_button",
- cls: "relation-table-preview-font",
- width: 25,
- height: 25,
- stopPropagation: true
- });
- this.preview.on(BI.IconButton.EVENT_CHANGE, function () {
- self.fireEvent(BI.RelationViewRegion.EVENT_PREVIEW, this.isSelected());
- });
-
- this.title = BI.createWidget({
- type: "bi.label",
- height: 25,
- width: 70,
- text: o.text,
- value: o.value,
- textAlign: "left"
- });
- //title放body上
- if (BI.isKey(o.header)) {
- this.title.setTitle(o.header, {
- container: "body"
- })
- }
-
- this.button_group = BI.createWidget({
- type: "bi.button_group",
- items: this._createItems(o.items),
- layouts: [{
- type: "bi.vertical"
- }]
- });
-
- BI.createWidget({
- type: "bi.vertical",
- element: this,
- items: [{
- type: "bi.vertical",
- cls: "relation-view-region-container bi-card bi-border " + (o.belongPackage ? "" : "other-package"),
- items: [{
- type: "bi.vertical_adapt",
- cls: "relation-view-region-title bi-border-bottom",
- items: [this.preview, this.title]
- }, this.button_group]
- }],
- hgap: 25,
- vgap: 20
- })
- },
-
- _createItems: function (items) {
- var self = this;
- return BI.map(items, function (i, item) {
- return BI.extend(item, {
- type: "bi.relation_view_item",
- hoverIn: function () {
- self.setValue(item.value);
- self.fireEvent(BI.RelationViewRegion.EVENT_HOVER_IN, item.value);
- },
- hoverOut: function () {
- self.setValue([]);
- self.fireEvent(BI.RelationViewRegion.EVENT_HOVER_OUT, item.value);
- }
- })
- });
- },
-
- doRedMark: function () {
- this.title.doRedMark.apply(this.title, arguments);
- },
-
- unRedMark: function () {
- this.title.unRedMark.apply(this.title, arguments);
- },
-
- getWidth: function () {
- return this.options.width;
- },
-
- getHeight: function () {
- return this.button_group.getAllButtons().length * 25 + 25 + 2 * 20 + 3;
- },
-
- //获取上方开始划线的位置
- getTopLeftPosition: function () {
- return {
- x: 25 + 10,
- y: 20
- }
- },
-
- getTopRightPosition: function () {
- return {
- x: this.getWidth() - 25 - 10,
- y: 20
- }
- },
-
- getBottomPosition: function () {
- return {
- x: 25 + 10,
- y: this.getHeight() - 20
- }
- },
-
- getLeftPosition: function () {
- return {
- x: 25,
- y: 20 + 10
- }
- },
-
- getRightPosition: function () {
- return {
- x: this.getWidth() - 25,
- y: 20 + 10
- }
- },
-
- setValue: function (v) {
- this.button_group.setValue(v);
- },
-
- setPreviewSelected: function(v) {
- this.preview.setSelected(v);
- }
-});
-BI.RelationViewRegion.EVENT_HOVER_IN = "RelationViewRegion.EVENT_HOVER_IN";
-BI.RelationViewRegion.EVENT_HOVER_OUT = "RelationViewRegion.EVENT_HOVER_OUT";
-BI.RelationViewRegion.EVENT_PREVIEW = "RelationViewRegion.EVENT_PREVIEW";
-BI.shortcut('bi.relation_view_region', BI.RelationViewRegion);/**
- * 自适应宽度的表格
- *
- * Created by GUY on 2016/2/3.
- * @class BI.ResponisveTable
- * @extends BI.Widget
- */
-BI.ResponisveTable = BI.inherit(BI.Widget, {
-
- _const: {
- perColumnSize: 100
- },
-
- _defaultConfig: function () {
- return BI.extend(BI.ResponisveTable.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-responsive-table",
- isNeedFreeze: false,//是否需要冻结单元格
- freezeCols: [], //冻结的列号,从0开始,isNeedFreeze为true时生效
-
- isNeedMerge: false,//是否需要合并单元格
- mergeCols: [], //合并的单元格列号
- mergeRule: function (row1, row2) { //合并规则, 默认相等时合并
- return BI.isEqual(row1, row2);
- },
-
- columnSize: [],
- headerRowSize: 25,
- footerRowSize: 25,
- rowSize: 25,
-
- regionColumnSize: false,
-
- header: [],
- footer: false,
- items: [], //二维数组
-
- //交叉表头
- crossHeader: [],
- crossItems: []
- });
- },
-
- _init: function () {
- BI.ResponisveTable.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
-
- this.table = BI.createWidget({
- type: "bi.table_view",
- element: this,
-
- isNeedFreeze: o.isNeedFreeze,
- freezeCols: o.freezeCols,
-
- isNeedMerge: o.isNeedMerge,
- mergeCols: o.mergeCols,
- mergeRule: o.mergeRule,
-
- columnSize: o.columnSize,
- headerRowSize: o.headerRowSize,
- footerRowSize: o.footerRowSize,
- rowSize: o.rowSize,
-
- regionColumnSize: o.regionColumnSize,
-
- header: o.header,
- footer: o.footer,
- items: o.items,
- //交叉表头
- crossHeader: o.crossHeader,
- crossItems: o.crossItems
- });
- this.table.on(BI.Table.EVENT_TABLE_AFTER_INIT, function () {
- self._initRegionSize();
- self.table.resize();
- self._resizeHeader();
- self.fireEvent(BI.Table.EVENT_TABLE_AFTER_INIT, arguments);
- });
- this.table.on(BI.Table.EVENT_TABLE_RESIZE, function () {
- self._resizeRegion();
- self._resizeHeader();
- self.fireEvent(BI.Table.EVENT_TABLE_RESIZE, arguments);
- });
- this.table.on(BI.Table.EVENT_TABLE_SCROLL, function () {
- self.fireEvent(BI.Table.EVENT_TABLE_SCROLL, arguments);
- });
- this.table.on(BI.Table.EVENT_TABLE_BEFORE_REGION_RESIZE, function () {
- self.fireEvent(BI.Table.EVENT_TABLE_BEFORE_REGION_RESIZE, arguments);
- });
- this.table.on(BI.Table.EVENT_TABLE_REGION_RESIZE, function () {
- //important:在冻结并自适应列宽的情况下要随时变更表头宽度
- if (o.isNeedResize === true && self._isAdaptiveColumn()) {
- self._resizeHeader();
- }
- self.fireEvent(BI.Table.EVENT_TABLE_REGION_RESIZE, arguments);
- });
- this.table.on(BI.Table.EVENT_TABLE_AFTER_REGION_RESIZE, function () {
- self._resizeHeader();
- self.fireEvent(BI.Table.EVENT_TABLE_AFTER_REGION_RESIZE, arguments);
- });
-
- this.table.on(BI.Table.EVENT_TABLE_BEFORE_COLUMN_RESIZE, function () {
- self._resizeBody();
- self.fireEvent(BI.Table.EVENT_TABLE_BEFORE_COLUMN_RESIZE, arguments);
- });
- this.table.on(BI.Table.EVENT_TABLE_COLUMN_RESIZE, function () {
- self.fireEvent(BI.Table.EVENT_TABLE_COLUMN_RESIZE, arguments);
- });
- this.table.on(BI.Table.EVENT_TABLE_AFTER_COLUMN_RESIZE, function () {
- self._resizeRegion();
- self._resizeHeader();
- self.fireEvent(BI.Table.EVENT_TABLE_AFTER_COLUMN_RESIZE, arguments);
- });
- },
-
- _initRegionSize: function () {
- var o = this.options;
- if (o.isNeedFreeze === true) {
- var regionColumnSize = this.table.getRegionColumnSize();
- var maxWidth = this.table.element.width();
- if (!regionColumnSize[0] || (regionColumnSize[0] === 'fill') || regionColumnSize[0] > maxWidth || regionColumnSize[1] > maxWidth) {
- var freezeCols = o.freezeCols;
- if (freezeCols.length === 0) {
- this.table.setRegionColumnSize([0, "fill"]);
- } else if (freezeCols.length > 0 && freezeCols.length < o.columnSize.length) {
- var size = maxWidth / 3;
- if (freezeCols.length > o.columnSize.length / 2) {
- size = maxWidth * 2 / 3;
- }
- this.table.setRegionColumnSize([size, "fill"]);
- } else {
- this.table.setRegionColumnSize(["fill", 0]);
- }
- }
- }
- },
-
- _getBlockSize: function () {
- var o = this.options;
- var columnSize = this.table.getCalculateColumnSize();
- if (o.isNeedFreeze === true) {
- var columnSizeLeft = [], columnSizeRight = [];
- BI.each(columnSize, function (i, size) {
- if (o.freezeCols.contains(i)) {
- columnSizeLeft.push(size);
- } else {
- columnSizeRight.push(size);
- }
- });
- //因为有边框,所以加上数组长度的参数调整
- var sumLeft = BI.sum(columnSizeLeft) + columnSizeLeft.length,
- sumRight = BI.sum(columnSizeRight) + columnSizeRight.length;
- return {
- sumLeft: sumLeft,
- sumRight: sumRight,
- left: columnSizeLeft,
- right: columnSizeRight
- }
- }
- return {
- size: columnSize,
- sum: BI.sum(columnSize) + columnSize.length
- };
- },
-
- _isAdaptiveColumn: function (columnSize) {
- return !(BI.last(columnSize || this.table.getColumnSize()) > 1.05);
- },
-
- _resizeHeader: function () {
- var self = this, o = this.options;
- if (o.isNeedFreeze === true) {
- //若是当前处于自适应调节阶段
- if (this._isAdaptiveColumn()) {
- var columnSize = this.table.getCalculateColumnSize();
- this.table.setHeaderColumnSize(columnSize);
- } else {
- var regionColumnSize = this.table.getClientRegionColumnSize();
- var block = this._getBlockSize();
- var sumLeft = block.sumLeft, sumRight = block.sumRight;
- var columnSizeLeft = block.left, columnSizeRight = block.right;
- columnSizeLeft[columnSizeLeft.length - 1] += regionColumnSize[0] - sumLeft;
- columnSizeRight[columnSizeRight.length - 1] += regionColumnSize[1] - sumRight;
-
- var newLeft = BI.clone(columnSizeLeft), newRight = BI.clone(columnSizeRight);
- newLeft[newLeft.length - 1] = "";
- newRight[newRight.length - 1] = "";
- this.table.setColumnSize(newLeft.concat(newRight));
-
- block = self._getBlockSize();
- if (columnSizeLeft[columnSizeLeft.length - 1] < block.left[block.left.length - 1]) {
- columnSizeLeft[columnSizeLeft.length - 1] = block.left[block.left.length - 1]
- }
- if (columnSizeRight[columnSizeRight.length - 1] < block.right[block.right.length - 1]) {
- columnSizeRight[columnSizeRight.length - 1] = block.right[block.right.length - 1]
- }
-
- self.table.setColumnSize(columnSizeLeft.concat(columnSizeRight));
- }
- } else {
- if (!this._isAdaptiveColumn()) {
- var regionColumnSize = this.table.getClientRegionColumnSize();
- var block = this._getBlockSize();
- var sum = block.sum;
- var size = block.size;
-
- size[size.length - 1] += regionColumnSize[0] - sum;
-
- var newSize = BI.clone(size);
- newSize[newSize.length - 1] = "";
- this.table.setColumnSize(newSize);
- block = this._getBlockSize();
-
- if (size[size.length - 1] < block.size[block.size.length - 1]) {
- size[size.length - 1] = block.size[block.size.length - 1]
- }
- this.table.setColumnSize(size);
- }
- }
- },
-
- _resizeBody: function () {
- if (this._isAdaptiveColumn()) {
- var columnSize = this.table.getCalculateColumnSize();
- this.setColumnSize(columnSize);
- }
- },
-
- _adjustRegion: function () {
- var o = this.options;
- var regionColumnSize = this.table.getCalculateRegionColumnSize();
- if (o.isNeedFreeze === true && o.freezeCols.length > 0 && o.freezeCols.length < o.columnSize.length) {
- var block = this._getBlockSize();
- var sumLeft = block.sumLeft, sumRight = block.sumRight;
- if (sumLeft < regionColumnSize[0] || regionColumnSize[0] >= (sumLeft + sumRight)) {
- this.table.setRegionColumnSize([sumLeft, "fill"]);
- }
- this._resizeRegion();
- }
- },
-
- _resizeRegion: function () {
- var o = this.options;
- var regionColumnSize = this.table.getCalculateRegionColumnSize();
- if (o.isNeedFreeze === true && o.freezeCols.length > 0 && o.freezeCols.length < o.columnSize.length) {
- var maxWidth = this.table.element.width();
- if (regionColumnSize[0] < 15 || regionColumnSize[1] < 15) {
- var freezeCols = o.freezeCols;
- var size = maxWidth / 3;
- if (freezeCols.length > o.columnSize.length / 2) {
- size = maxWidth * 2 / 3;
- }
- this.table.setRegionColumnSize([size, "fill"]);
- }
- }
- },
-
-
- resize: function () {
- this.table.resize();
- this._resizeRegion();
- this._resizeHeader();
- },
-
- setColumnSize: function (columnSize) {
- this.table.setColumnSize(columnSize);
- this._adjustRegion();
- this._resizeHeader();
- },
-
- getColumnSize: function () {
- return this.table.getColumnSize();
- },
-
- getCalculateColumnSize: function () {
- return this.table.getCalculateColumnSize();
- },
-
- setHeaderColumnSize: function (columnSize) {
- this.table.setHeaderColumnSize(columnSize);
- this._adjustRegion();
- this._resizeHeader();
- },
-
- setRegionColumnSize: function (columnSize) {
- this.table.setRegionColumnSize(columnSize);
- this._resizeHeader();
- },
-
- getRegionColumnSize: function () {
- return this.table.getRegionColumnSize();
- },
-
- getCalculateRegionColumnSize: function () {
- return this.table.getCalculateRegionColumnSize();
- },
-
- getCalculateRegionRowSize: function () {
- return this.table.getCalculateRegionRowSize();
- },
-
- getClientRegionColumnSize: function () {
- return this.table.getClientRegionColumnSize();
- },
-
- getScrollRegionColumnSize: function () {
- return this.table.getScrollRegionColumnSize();
- },
-
- getScrollRegionRowSize: function () {
- return this.table.getScrollRegionRowSize();
- },
-
- hasVerticalScroll: function () {
- return this.table.hasVerticalScroll();
- },
-
- setVerticalScroll: function (scrollTop) {
- this.table.setVerticalScroll(scrollTop);
- },
-
- setLeftHorizontalScroll: function (scrollLeft) {
- this.table.setLeftHorizontalScroll(scrollLeft);
- },
-
- setRightHorizontalScroll: function (scrollLeft) {
- this.table.setRightHorizontalScroll(scrollLeft);
- },
-
- getVerticalScroll: function () {
- return this.table.getVerticalScroll();
- },
-
- getLeftHorizontalScroll: function () {
- return this.table.getLeftHorizontalScroll();
- },
-
- getRightHorizontalScroll: function () {
- return this.table.getRightHorizontalScroll();
- },
-
- getColumns: function () {
- return this.table.getColumns();
- },
-
- attr: function () {
- BI.ResponisveTable.superclass.attr.apply(this, arguments);
- this.table.attr.apply(this.table, arguments);
- },
-
- populate: function (items) {
- var self = this, o = this.options;
- this.table.populate.apply(this.table, arguments);
- if (o.isNeedFreeze === true) {
- BI.nextTick(function () {
- self._initRegionSize();
- self.table.resize();
- self._resizeHeader();
- });
- }
- }
-});
-BI.shortcut('bi.responsive_table', BI.ResponisveTable);/**
- * 加号表示的组节点
- * Created by GUY on 2015/9/6.
- * @class BI.SelectTreeFirstPlusGroupNode
- * @extends BI.NodeButton
- */
-BI.SelectTreeFirstPlusGroupNode = BI.inherit(BI.NodeButton, {
- _defaultConfig: function () {
- var conf = BI.SelectTreeFirstPlusGroupNode.superclass._defaultConfig.apply(this, arguments);
- return BI.extend(conf, {
- baseCls: (conf.baseCls || "") + " bi-select-tree-first-plus-group-node bi-list-item-active",
- logic: {
- dynamic: false
- },
- id: "",
- pId: "",
- readonly: true,
- open: false,
- height: 25
- })
- },
- _init: function () {
- BI.SelectTreeFirstPlusGroupNode.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.checkbox = BI.createWidget({
- type: "bi.first_tree_node_checkbox",
- stopPropagation: true
- });
- this.text = BI.createWidget({
- type: "bi.label",
- textAlign: "left",
- whiteSpace: "nowrap",
- textHeight: o.height,
- height: o.height,
- hgap: o.hgap,
- text: o.text,
- value: o.value,
- py: o.py
- });
- this.checkbox.on(BI.Controller.EVENT_CHANGE, function (type) {
- if (type === BI.Events.CLICK) {
- if (this.isSelected()) {
- self.triggerExpand();
- } else {
- self.triggerCollapse();
- }
- }
- });
- var type = BI.LogicFactory.createLogicTypeByDirection(BI.Direction.Left);
- var items = BI.LogicFactory.createLogicItemsByDirection(BI.Direction.Left, {
- width: 25,
- el: this.checkbox
- }, this.text);
- BI.createWidget(BI.extend({
- element: this
- }, BI.LogicFactory.createLogic(type, BI.extend(o.logic, {
- items: items
- }))));
- },
-
- isOnce: function () {
- return true;
- },
-
- doRedMark: function () {
- this.text.doRedMark.apply(this.text, arguments);
- },
-
- unRedMark: function () {
- this.text.unRedMark.apply(this.text, arguments);
- },
-
- doClick: function () {
- BI.NodeButton.superclass.doClick.apply(this, arguments);
- },
-
- setOpened: function (v) {
- BI.SelectTreeFirstPlusGroupNode.superclass.setOpened.apply(this, arguments);
- if (BI.isNotNull(this.checkbox)) {
- this.checkbox.setSelected(v);
- }
- }
-});
-
-BI.shortcut("bi.select_tree_first_plus_group_node", BI.SelectTreeFirstPlusGroupNode);/**
- * 加号表示的组节点
- * Created by GUY on 2015/9/6.
- * @class BI.SelectTreeLastPlusGroupNode
- * @extends BI.NodeButton
- */
-BI.SelectTreeLastPlusGroupNode = BI.inherit(BI.NodeButton, {
- _defaultConfig: function () {
- var conf = BI.SelectTreeLastPlusGroupNode.superclass._defaultConfig.apply(this, arguments);
- return BI.extend(conf, {
- baseCls: (conf.baseCls || "") + " bi-select-tree-last-plus-group-node bi-list-item-active",
- logic: {
- dynamic: false
- },
- id: "",
- pId: "",
- readonly: true,
- open: false,
- height: 25
- })
- },
- _init: function () {
- BI.SelectTreeLastPlusGroupNode.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.checkbox = BI.createWidget({
- type: "bi.last_tree_node_checkbox",
- stopPropagation: true
- })
- this.text = BI.createWidget({
- type: "bi.label",
- textAlign: "left",
- whiteSpace: "nowrap",
- textHeight: o.height,
- height: o.height,
- hgap: o.hgap,
- text: o.text,
- value: o.value,
- py: o.py
- });
- this.checkbox.on(BI.Controller.EVENT_CHANGE, function (type) {
- if (type === BI.Events.CLICK) {
- if (this.isSelected()) {
- self.triggerExpand();
- } else {
- self.triggerCollapse();
- }
- }
- });
- var type = BI.LogicFactory.createLogicTypeByDirection(BI.Direction.Left);
- var items = BI.LogicFactory.createLogicItemsByDirection(BI.Direction.Left, {
- width: 25,
- el: this.checkbox
- }, this.text);
- BI.createWidget(BI.extend({
- element: this
- }, BI.LogicFactory.createLogic(type, BI.extend(o.logic, {
- items: items
- }))));
- },
-
- isOnce: function () {
- return true;
- },
-
- doRedMark: function () {
- this.text.doRedMark.apply(this.text, arguments);
- },
-
- unRedMark: function () {
- this.text.unRedMark.apply(this.text, arguments);
- },
-
- doClick: function () {
- BI.NodeButton.superclass.doClick.apply(this, arguments);
- },
-
- setOpened: function (v) {
- BI.SelectTreeLastPlusGroupNode.superclass.setOpened.apply(this, arguments);
- if (BI.isNotNull(this.checkbox)) {
- this.checkbox.setSelected(v);
- }
- }
-});
-
-BI.shortcut("bi.select_tree_last_plus_group_node", BI.SelectTreeLastPlusGroupNode);/**
- * 加号表示的组节点
- * Created by GUY on 2015/9/6.
- * @class BI.SelectTreeMidPlusGroupNode
- * @extends BI.NodeButton
- */
-BI.SelectTreeMidPlusGroupNode = BI.inherit(BI.NodeButton, {
- _defaultConfig: function () {
- var conf = BI.SelectTreeMidPlusGroupNode.superclass._defaultConfig.apply(this, arguments);
- return BI.extend(conf, {
- baseCls: (conf.baseCls || "") + " bi-select-tree-mid-plus-group-node bi-list-item-active",
- logic: {
- dynamic: false
- },
- id: "",
- pId: "",
- readonly: true,
- open: false,
- height: 25
- })
- },
- _init: function () {
- BI.SelectTreeMidPlusGroupNode.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.checkbox = BI.createWidget({
- type: "bi.mid_tree_node_checkbox",
- stopPropagation: true
- });
- this.text = BI.createWidget({
- type: "bi.label",
- textAlign: "left",
- whiteSpace: "nowrap",
- textHeight: o.height,
- height: o.height,
- hgap: o.hgap,
- text: o.text,
- value: o.value,
- py: o.py
- });
- this.checkbox.on(BI.Controller.EVENT_CHANGE, function (type) {
- if (type === BI.Events.CLICK) {
- if (this.isSelected()) {
- self.triggerExpand();
- } else {
- self.triggerCollapse();
- }
- }
- });
- var type = BI.LogicFactory.createLogicTypeByDirection(BI.Direction.Left);
- var items = BI.LogicFactory.createLogicItemsByDirection(BI.Direction.Left, {
- width: 25,
- el: this.checkbox
- }, this.text);
- BI.createWidget(BI.extend({
- element: this
- }, BI.LogicFactory.createLogic(type, BI.extend(o.logic, {
- items: items
- }))));
- },
-
- isOnce: function () {
- return true;
- },
-
- doRedMark: function () {
- this.text.doRedMark.apply(this.text, arguments);
- },
-
- unRedMark: function () {
- this.text.unRedMark.apply(this.text, arguments);
- },
-
- doClick: function () {
- BI.NodeButton.superclass.doClick.apply(this, arguments);
- },
-
- setOpened: function (v) {
- BI.SelectTreeMidPlusGroupNode.superclass.setOpened.apply(this, arguments);
- if (BI.isNotNull(this.checkbox)) {
- this.checkbox.setSelected(v);
- }
- }
-});
-
-BI.shortcut("bi.select_tree_mid_plus_group_node", BI.SelectTreeMidPlusGroupNode);/**
- * @class BI.SelectTreeCombo
- * @extends BI.Widget
- */
-BI.SelectTreeCombo = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.SelectTreeCombo.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-select-tree-combo",
- height: 30,
- text: "",
- items: []
- });
- },
-
- _init: function () {
- BI.SelectTreeCombo.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
-
- this.trigger = BI.createWidget({
- type: "bi.single_tree_trigger",
- text: o.text,
- height: o.height,
- items: o.items
- });
-
- this.popup = BI.createWidget({
- type: "bi.select_level_tree",
- items: o.items
- });
-
- this.combo = BI.createWidget({
- type: "bi.combo",
- element: this,
- adjustLength: 2,
- el: this.trigger,
- popup: {
- el: this.popup
- }
- });
-
- this.combo.on(BI.Controller.EVENT_CHANGE, function () {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
-
- this.popup.on(BI.SingleTreePopup.EVENT_CHANGE, function () {
- self.setValue(self.popup.getValue());
- self.combo.hideView();
- });
- },
-
- setValue: function (v) {
- v = BI.isArray(v) ? v : [v];
- this.trigger.setValue(v);
- this.popup.setValue(v);
- },
-
- getValue: function () {
- return this.popup.getValue();
- },
-
- populate: function (items) {
- this.combo.populate(items);
- }
-});
-
-
-BI.shortcut("bi.select_tree_combo", BI.SelectTreeCombo);/**
- * @class BI.SelectTreeExpander
- * @extends BI.Widget
- */
-BI.SelectTreeExpander = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.SelectTreeExpander.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-select-tree-expander",
- trigger: "click",
- toggle: true,
- direction: "bottom",
- isDefaultInit: true,
- el: {},
- popup: {}
- });
- },
-
- _init: function () {
- BI.SelectTreeExpander.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
-
- this.trigger = BI.createWidget(BI.extend({stopPropagation: true}, o.el));
- this.trigger.on(BI.Controller.EVENT_CHANGE, function (type) {
- if (type === BI.Events.CLICK) {
- if (this.isSelected()) {
- self.expander.setValue([]);
- }
- }
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
-
- this.expander = BI.createWidget({
- type: "bi.expander",
- element: this,
- trigger: o.trigger,
- toggle: o.toggle,
- direction: o.direction,
- isDefaultInit: o.isDefaultInit,
- el: this.trigger,
- popup: o.popup
- });
- this.expander.on(BI.Controller.EVENT_CHANGE, function (type) {
- if (type === BI.Events.CLICK) {
- self.trigger.setSelected(false);
- }
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
- },
-
- setValue: function (v) {
- if (BI.contains(v, this.trigger.getValue())) {
- this.trigger.setSelected(true);
- this.expander.setValue([]);
- } else {
- this.trigger.setSelected(false);
- this.expander.setValue(v);
- }
- },
-
- getValue: function () {
- if (this.trigger.isSelected()) {
- return [this.trigger.getValue()];
- }
- return this.expander.getValue();
- },
-
- populate: function (items) {
- this.expander.populate(items);
- }
-});
-
-BI.shortcut("bi.select_tree_expander", BI.SelectTreeExpander);/**
- * @class BI.SelectTreePopup
- * @extends BI.Pane
- */
-
-BI.SelectTreePopup = BI.inherit(BI.Pane, {
-
- _defaultConfig: function () {
- return BI.extend(BI.SelectTreePopup.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-select-level-tree",
- tipText: BI.i18nText("BI-No_Selected_Item"),
- items: []
- });
- },
-
- _formatItems: function (nodes, layer) {
- var self = this;
- BI.each(nodes, function (i, node) {
- var extend = {layer: layer};
- node.id = node.id || BI.UUID();
- if (node.isParent === true || BI.isNotEmptyArray(node.children)) {
- switch (i) {
- case 0 :
- extend.type = "bi.select_tree_first_plus_group_node";
- break;
- case nodes.length - 1 :
- extend.type = "bi.select_tree_last_plus_group_node";
- break;
- default :
- extend.type = "bi.select_tree_mid_plus_group_node";
- break;
- }
- BI.defaults(node, extend);
- self._formatItems(node.children);
- } else {
- switch (i) {
- case nodes.length - 1:
- extend.type = "bi.last_tree_leaf_item";
- break;
- default :
- extend.type = "bi.mid_tree_leaf_item";
- }
- BI.defaults(node, extend);
- }
- });
- return nodes;
- },
-
- _init: function () {
- BI.SelectTreePopup.superclass._init.apply(this, arguments);
-
- var self = this, o = this.options;
-
- this.tree = BI.createWidget({
- type: 'bi.level_tree',
- expander: {
- type: "bi.select_tree_expander",
- isDefaultInit: true
- },
- items: this._formatItems(BI.Tree.transformToTreeFormat(o.items)),
- chooseType: BI.Selection.Single
- });
-
- BI.createWidget({
- type: "bi.vertical",
- element: this,
- items: [this.tree]
- });
-
- this.tree.on(BI.Controller.EVENT_CHANGE, function () {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
-
- this.tree.on(BI.LevelTree.EVENT_CHANGE, function () {
- self.fireEvent(BI.SelectTreePopup.EVENT_CHANGE);
- });
-
- this.check();
- },
-
- getValue: function () {
- return this.tree.getValue();
- },
-
- setValue: function (v) {
- v = BI.isArray(v) ? v : [v];
- this.tree.setValue(v);
- },
-
- populate: function (items) {
- BI.SelectTreePopup.superclass.populate.apply(this, arguments);
- this.tree.populate(items);
- }
-});
-
-BI.SelectTreePopup.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut("bi.select_level_tree", BI.SelectTreePopup);/**
- *
- * Created by GUY on 2016/8/10.
- * @class BI.SequenceTableDynamicNumber
- * @extends BI.SequenceTableTreeNumber
- */
-BI.SequenceTableDynamicNumber = BI.inherit(BI.SequenceTableTreeNumber, {
-
- _defaultConfig: function () {
- return BI.extend(BI.SequenceTableDynamicNumber.superclass._defaultConfig.apply(this, arguments), {
- extraCls: "bi-sequence-table-dynamic-number"
- });
- },
-
- _init: function () {
- BI.SequenceTableDynamicNumber.superclass._init.apply(this, arguments);
- },
-
- _formatNumber: function (nodes) {
- var self = this, o = this.options;
- var result = [];
- var count = this._getStart(nodes);
-
- function getLeafCount(node) {
- var cnt = 0;
- if (BI.isNotEmptyArray(node.children)) {
- BI.each(node.children, function (index, child) {
- cnt += getLeafCount(child);
- });
- if (node.children.length > 1 && BI.isNotEmptyArray(node.values)) {
- cnt++;
- }
- } else {
- cnt++;
- }
- return cnt;
- }
-
- var start = 0, top = 0;
- BI.each(nodes, function (i, node) {
- if (BI.isArray(node.children)) {
- BI.each(node.children, function (index, child) {
- var cnt = getLeafCount(child);
- result.push({
- text: count++,
- start: start,
- top: top,
- cnt: cnt,
- index: index,
- height: cnt * o.rowSize
- });
- start += cnt;
- top += cnt * o.rowSize;
- });
- if (BI.isNotEmptyArray(node.values)) {
- result.push({
- text: BI.i18nText("BI-Summary_Values"),
- start: start++,
- top: top,
- cnt: 1,
- isSummary: true,
- height: o.rowSize
- });
- top += o.rowSize;
- }
- }
- });
- return result;
- }
-});
-BI.shortcut('bi.sequence_table_dynamic_number', BI.SequenceTableDynamicNumber);/**
- *
- * Created by GUY on 2016/5/26.
- * @class BI.SequenceTableListNumber
- * @extends BI.Widget
- */
-BI.SequenceTableListNumber = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.SequenceTableListNumber.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-sequence-table-list-number",
- isNeedFreeze: false,
- scrollTop: 0,
- startSequence: 1,//开始的序号
- headerRowSize: 25,
- rowSize: 25,
-
- sequenceHeaderCreator: null,
-
- header: [],
- items: [], //二维数组
-
- //交叉表头
- crossHeader: [],
- crossItems: [],
-
- pageSize: 20
- });
- },
-
- _init: function () {
- BI.SequenceTableListNumber.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.start = o.startSequence;
- this.renderedCells = [];
- this.renderedKeys = [];
-
- this.container = BI.createWidget({
- type: "bi.absolute",
- width: 60,
- scrollable: false
- });
-
- this.scrollContainer = BI.createWidget({
- type: "bi.vertical",
- scrollable: false,
- scrolly: false,
- items: [this.container]
- });
-
- this.headerContainer = BI.createWidget({
- type: "bi.absolute",
- cls: "bi-border",
- width: 58,
- scrollable: false
- });
-
- this.layout = BI.createWidget({
- type: "bi.vtape",
- element: this,
- items: [{
- el: this.headerContainer,
- height: o.headerRowSize * o.header.length - 2
- }, {
- el: {type: "bi.layout"},
- height: 2
- }, {
- el: this.scrollContainer
- }]
- });
- this._populate();
- },
-
- _layout: function () {
- var self = this, o = this.options;
- var headerHeight = o.headerRowSize * o.header.length - 2;
- var items = this.layout.attr("items");
- if (o.isNeedFreeze === false) {
- items[0].height = 0;
- items[1].height = 0;
- } else if (o.isNeedFreeze === true) {
- items[0].height = headerHeight;
- items[1].height = 2;
- }
- this.layout.attr("items", items);
- this.layout.resize();
- this.container.setHeight(o.items.length * o.rowSize);
- try {
- this.scrollContainer.element.scrollTop(o.scrollTop);
- } catch (e) {
-
- }
- },
-
- _createHeader: function () {
- var o = this.options;
- BI.createWidget({
- type: "bi.absolute",
- element: this.headerContainer,
- items: [{
- el: o.sequenceHeaderCreator || {
- type: "bi.table_style_cell",
- cls: "sequence-table-title-cell",
- styleGetter: o.headerCellStyleGetter,
- text: BI.i18nText("BI-Number_Index")
- },
- left: 0,
- top: 0,
- right: 0,
- bottom: 0
- }]
- });
- },
-
- _calculateChildrenToRender: function () {
- var self = this, o = this.options;
- var scrollTop = BI.clamp(o.scrollTop, 0, o.rowSize * o.items.length - (o.height - o.header.length * o.headerRowSize) + BI.DOM.getScrollWidth());
- var start = Math.floor(scrollTop / o.rowSize);
- var end = start + Math.floor((o.height - o.header.length * o.headerRowSize) / o.rowSize);
- var renderedCells = [], renderedKeys = [];
- for (var i = start, cnt = 0; i <= end && i < o.items.length; i++, cnt++) {
- var index = BI.deepIndexOf(this.renderedKeys, this.start + i);
- var top = i * o.rowSize;
- if (index > -1) {
- if (o.rowSize !== this.renderedCells[index]._height) {
- this.renderedCells[index]._height = o.rowSize;
- this.renderedCells[index].el.setHeight(o.rowSize);
- }
- if (this.renderedCells[index].top !== top) {
- this.renderedCells[index].top = top;
- this.renderedCells[index].el.element.css("top", top + "px");
- }
- renderedCells.push(this.renderedCells[index]);
- } else {
- var child = BI.createWidget(BI.extend({
- type: "bi.table_style_cell",
- cls: "sequence-table-number-cell bi-border-left bi-border-right bi-border-bottom",
- width: 60,
- height: o.rowSize,
- text: this.start + i,
- styleGetter: function (index) {
- return function () {
- return o.sequenceCellStyleGetter(self.start + i - 1);
- }
- }(cnt)
- }));
- renderedCells.push({
- el: child,
- left: 0,
- top: top,
- _height: o.rowSize
- });
- }
- renderedKeys.push(this.start + i);
- }
-
- //已存在的, 需要添加的和需要删除的
- var existSet = {}, addSet = {}, deleteArray = [];
- BI.each(renderedKeys, function (i, key) {
- if (BI.deepContains(self.renderedKeys, key)) {
- existSet[i] = key;
- } else {
- addSet[i] = key;
- }
- });
- BI.each(this.renderedKeys, function (i, key) {
- if (BI.deepContains(existSet, key)) {
- return;
- }
- if (BI.deepContains(addSet, key)) {
- return;
- }
- deleteArray.push(i);
- });
- BI.each(deleteArray, function (i, index) {
- self.renderedCells[index].el.destroy();
- });
- var addedItems = [];
- BI.each(addSet, function (index) {
- addedItems.push(renderedCells[index])
- });
- BI.createWidget({
- type: "bi.absolute",
- element: this.container,
- items: addedItems
- });
- this.renderedCells = renderedCells;
- this.renderedKeys = renderedKeys;
- },
-
- _populate: function () {
- this.headerContainer.empty();
- this._createHeader();
- this._layout();
- this._calculateChildrenToRender();
- },
-
- setVerticalScroll: function (scrollTop) {
- if (this.options.scrollTop !== scrollTop) {
- this.options.scrollTop = scrollTop;
- try {
- this.scrollContainer.element.scrollTop(scrollTop);
- } catch (e) {
-
- }
- }
- },
-
- getVerticalScroll: function () {
- return this.options.scrollTop;
- },
-
- setVPage: function (v) {
- v = v < 1 ? 1 : v;
- var o = this.options;
- this.start = (v - 1) * o.pageSize + 1;
- },
-
- _restore: function () {
- var o = this.options;
- BI.each(this.renderedCells, function (i, cell) {
- cell.el.destroy();
- });
- this.renderedCells = [];
- this.renderedKeys = [];
- },
-
- restore: function () {
- this._restore();
- },
-
- populate: function (items, header) {
- var o = this.options;
- if (items && items !== this.options.items) {
- o.items = items;
- this._restore();
- }
- if (header && header !== this.options.header) {
- o.header = header;
- }
- this._populate();
- }
-});
-BI.shortcut('bi.sequence_table_list_number', BI.SequenceTableListNumber);/**
- * 带有序号的表格
- *
- * Created by GUY on 2016/5/26.
- * @class BI.SequenceTable
- * @extends BI.Widget
- */
-BI.SequenceTable = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.SequenceTable.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-sequence-table",
- el: {
- type: "bi.adaptive_table"
- },
-
- sequence: {},
-
- isNeedResize: true,
- isResizeAdapt: false,
-
- isNeedFreeze: false,//是否需要冻结单元格
- freezeCols: [], //冻结的列号,从0开始,isNeedFreeze为true时生效
-
- isNeedMerge: false,//是否需要合并单元格
- mergeCols: [], //合并的单元格列号
- mergeRule: BI.emptyFn,
-
- columnSize: [],
- minColumnSize: [],
- maxColumnSize: [],
- headerRowSize: 25,
- rowSize: 25,
-
- regionColumnSize: [],
-
- headerCellStyleGetter: BI.emptyFn,
- summaryCellStyleGetter: BI.emptyFn,
- sequenceCellStyleGetter: BI.emptyFn,
-
- header: [],
- items: [], //二维数组
-
- //交叉表头
- crossHeader: [],
- crossItems: [],
-
- showSequence: false,
- startSequence: 1//开始的序号
- });
- },
-
- _init: function () {
- BI.SequenceTable.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
-
- this.sequence = BI.createWidget(o.sequence, {
- type: "bi.sequence_table_list_number",
- invisible: o.showSequence === false,
- startSequence: o.startSequence,
- isNeedFreeze: o.isNeedFreeze,
- header: o.header,
- items: o.items,
- crossHeader: o.crossHeader,
- crossItems: o.crossItems,
- headerRowSize: o.headerRowSize,
- rowSize: o.rowSize,
- width: 60,
- height: o.height && o.height - BI.GridTableScrollbar.SIZE,
-
- headerCellStyleGetter: o.headerCellStyleGetter,
- summaryCellStyleGetter: o.summaryCellStyleGetter,
- sequenceCellStyleGetter: o.sequenceCellStyleGetter
- });
- this.table = BI.createWidget(o.el, {
- type: "bi.adaptive_table",
- width: o.showSequence === true ? o.width - 60 : o.width,
- height: o.height,
- isNeedResize: o.isNeedResize,
- isResizeAdapt: o.isResizeAdapt,
-
- isNeedFreeze: o.isNeedFreeze,
- freezeCols: o.freezeCols,
-
- isNeedMerge: o.isNeedMerge,
- mergeCols: o.mergeCols,
- mergeRule: o.mergeRule,
-
- columnSize: o.columnSize,
- minColumnSize: o.minColumnSize,
- maxColumnSize: o.maxColumnSize,
- headerRowSize: o.headerRowSize,
- rowSize: o.rowSize,
-
- regionColumnSize: o.regionColumnSize,
-
- headerCellStyleGetter: o.headerCellStyleGetter,
- summaryCellStyleGetter: o.summaryCellStyleGetter,
- sequenceCellStyleGetter: o.sequenceCellStyleGetter,
-
- header: o.header,
- items: o.items,
- //交叉表头
- crossHeader: o.crossHeader,
- crossItems: o.crossItems
- });
-
- this.table.on(BI.Table.EVENT_TABLE_SCROLL, function (scroll) {
- if (self.sequence.getVerticalScroll() !== this.getVerticalScroll()) {
- self.sequence.setVerticalScroll(this.getVerticalScroll());
- self.sequence.populate();
- }
- self.fireEvent(BI.Table.EVENT_TABLE_SCROLL, arguments);
- });
- this.table.on(BI.Table.EVENT_TABLE_AFTER_REGION_RESIZE, function () {
- o.regionColumnSize = this.getRegionColumnSize();
- o.columnSize = this.getColumnSize();
- self.fireEvent(BI.Table.EVENT_TABLE_AFTER_REGION_RESIZE, arguments);
- });
- this.table.on(BI.Table.EVENT_TABLE_AFTER_COLUMN_RESIZE, function () {
- o.regionColumnSize = this.getRegionColumnSize();
- o.columnSize = this.getColumnSize();
- self.fireEvent(BI.Table.EVENT_TABLE_AFTER_COLUMN_RESIZE, arguments);
- });
-
- this.htape = BI.createWidget({
- type: "bi.absolute",
- element: this,
- items: [{
- el: this.sequence,
- left: 0,
- top: 0
- }, {
- el: this.table,
- top: 0,
- left: o.showSequence === true ? 60 : 0
- }]
- });
- this._populate();
- },
-
- _populate: function () {
- var o = this.options;
- if (o.showSequence === true) {
- this.sequence.setVisible(true);
- this.table.element.css("left", "60px");
- this.table.setWidth(o.width - 60);
- } else {
- this.sequence.setVisible(false);
- this.table.element.css("left", "0px");
- this.table.setWidth(o.width);
- }
- },
-
- setWidth: function (width) {
- BI.PageTable.superclass.setWidth.apply(this, arguments);
- this.table.setWidth(this.options.showSequence ? width - 60 : width);
- },
-
- setHeight: function (height) {
- BI.PageTable.superclass.setHeight.apply(this, arguments);
- this.table.setHeight(height);
- this.sequence.setHeight(height - BI.GridTableScrollbar.SIZE);
- },
-
- setColumnSize: function (columnSize) {
- this.options.columnSize = columnSize;
- this.table.setColumnSize(columnSize);
- },
-
- getColumnSize: function () {
- return this.table.getColumnSize();
- },
-
- setRegionColumnSize: function (columnSize) {
- this.options.columnSize = columnSize;
- this.table.setRegionColumnSize(columnSize);
- },
-
- getRegionColumnSize: function () {
- return this.table.getRegionColumnSize();
- },
-
- hasLeftHorizontalScroll: function () {
- return this.table.hasLeftHorizontalScroll();
- },
-
- hasRightHorizontalScroll: function () {
- return this.table.hasRightHorizontalScroll();
- },
-
- setLeftHorizontalScroll: function (scrollLeft) {
- this.table.setLeftHorizontalScroll(scrollLeft);
- },
-
- setRightHorizontalScroll: function (scrollLeft) {
- this.table.setRightHorizontalScroll(scrollLeft);
- },
-
- setVerticalScroll: function (scrollTop) {
- this.table.setVerticalScroll(scrollTop);
- this.sequence.setVerticalScroll(scrollTop);
- },
-
- getVerticalScroll: function () {
- return this.table.getVerticalScroll();
- },
-
- setVPage: function (page) {
- this.sequence.setVPage && this.sequence.setVPage(page);
- },
-
- setHPage: function (page) {
- this.sequence.setHPage && this.sequence.setHPage(page);
- },
-
- attr: function () {
- BI.SequenceTable.superclass.attr.apply(this, arguments);
- this.table.attr.apply(this.table, arguments);
- this.sequence.attr.apply(this.sequence, arguments);
- },
-
- restore: function () {
- this.table.restore();
- this.sequence.restore();
- },
-
- populate: function (items, header, crossItems, crossHeader) {
- var o = this.options;
- if (items) {
- o.items = items;
- }
- if (header) {
- o.header = header;
- }
- if (crossItems) {
- o.crossItems = crossItems;
- }
- if (crossHeader) {
- o.crossHeader = crossHeader;
- }
- this._populate();
- this.table.populate.apply(this.table, arguments);
- this.sequence.populate.apply(this.sequence, arguments);
- this.sequence.setVerticalScroll(this.table.getVerticalScroll());
- },
-
- destroy: function () {
- this.table.destroy();
- BI.SequenceTable.superclass.destroy.apply(this, arguments);
- }
-});
-BI.shortcut('bi.sequence_table', BI.SequenceTable);/**
- * 单选加载数据搜索loader面板
- * Created by guy on 15/11/4.
- * @class BI.SingleSelectSearchLoader
- * @extends Widget
- */
-BI.SingleSelectSearchLoader = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.SingleSelectSearchLoader.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-single-select-search-loader',
- itemsCreator: BI.emptyFn,
- keywordGetter: BI.emptyFn,
- valueFormatter: BI.emptyFn
- });
- },
-
- _init: function () {
- BI.SingleSelectSearchLoader.superclass._init.apply(this, arguments);
-
- var self = this, opts = this.options;
- var hasNext = false;
-
- this.button_group = BI.createWidget({
- type: "bi.single_select_list",
- element: this,
- logic: {
- dynamic: false
- },
- el: {
- tipText: BI.i18nText("BI-No_Select"),
- el: {
- type: "bi.loader",
- isDefaultInit: false,
- logic: {
- dynamic: true,
- scrolly: true
- },
- el: {
- chooseType: BI.ButtonGroup.CHOOSE_TYPE_SINGLE,
- behaviors: {
- redmark: function () {
- return true;
- }
- },
- layouts: [{
- type: "bi.vertical"
- }]
- }
- }
- },
- itemsCreator: function (op, callback) {
- self.storeValue && (op = BI.extend(op || {}, {
- selectedValues: [self.storeValue]
- }));
- opts.itemsCreator(op, function (ob) {
- var keyword = ob.keyword = opts.keywordGetter();
- hasNext = ob.hasNext;
- var firstItems = [];
- if (op.times === 1 && self.storeValue) {
- var json = BI.map([self.storeValue], function (i, v) {
- var txt = opts.valueFormatter(v) || v;
- return {
- text: txt,
- value: v,
- title: txt,
- selected: false
- }
- });
- firstItems = self._createItems(json);
- }
- callback(firstItems.concat(self._createItems(ob.items)), keyword);
- if (op.times === 1 && self.storeValue) {
- self.setValue(self.storeValue);
- }
- });
- },
- hasNext: function () {
- return hasNext;
- }
- });
- this.button_group.on(BI.Controller.EVENT_CHANGE, function () {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
- this.button_group.on(BI.SingleSelectList.EVENT_CHANGE, function () {
- self.fireEvent(BI.SingleSelectSearchLoader.EVENT_CHANGE, arguments);
- });
- },
-
- _createItems: function (items) {
- return BI.createItems(items, {
- type: "bi.single_select_radio_item",
- logic: {
- dynamic: false
- },
- height: 25,
- selected: false
- })
- },
-
- _filterValues: function (src) {
- var o = this.options;
- var keyword = o.keywordGetter();
- var values = BI.deepClone(src.value) || [];
- var newValues = BI.map(values, function (i, v) {
- return {
- text: o.valueFormatter(v) || v,
- value: v
- };
- });
- if (BI.isKey(keyword)) {
- var search = BI.Func.getSearchResult(newValues, keyword);
- values = search.matched.concat(search.finded);
- }
- return BI.map(values, function (i, v) {
- return {
- text: v.text,
- title: v.text,
- value: v.value,
- selected: false
- }
- })
- },
-
- setValue: function (v) {
- //暂存的值一定是新的值,不然v改掉后,storeValue也跟着改了
- this.storeValue = v;
- this.button_group.setValue(v);
- },
-
- getValue: function () {
- return this.button_group.getValue();
- },
-
- getAllButtons: function () {
- return this.button_group.getAllButtons();
- },
-
- empty: function () {
- this.button_group.empty();
- },
-
- populate: function (items) {
- this.button_group.populate.apply(this.button_group, arguments);
- },
-
- resetHeight: function (h) {
- this.button_group.resetHeight(h);
- },
-
- resetWidth: function (w) {
- this.button_group.resetWidth(w);
- }
-});
-
-BI.SingleSelectSearchLoader.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut('bi.single_select_search_loader', BI.SingleSelectSearchLoader);/**
- *
- * 在搜索框中输入文本弹出的面板
- * @class BI.SingleSelectSearchPane
- * @extends Widget
- */
-
-BI.SingleSelectSearchPane = BI.inherit(BI.Widget, {
-
- constants: {
- height: 25,
- lgap: 10,
- tgap: 5
- },
-
- _defaultConfig: function () {
- return BI.extend(BI.SingleSelectSearchPane.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-single-select-search-pane bi-card",
- itemsCreator: BI.emptyFn,
- valueFormatter: BI.emptyFn,
- keywordGetter: BI.emptyFn
- });
- },
-
- _init: function () {
- BI.SingleSelectSearchPane.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
-
- this.tooltipClick = BI.createWidget({
- type: "bi.label",
- invisible: true,
- text: BI.i18nText('BI-Click_Blank_To_Select'),
- cls: 'single-select-toolbar',
- height: this.constants.height
- });
-
- this.loader = BI.createWidget({
- type: "bi.single_select_search_loader",
- keywordGetter: o.keywordGetter,
- valueFormatter: o.valueFormatter,
- itemsCreator: function (op, callback) {
- o.itemsCreator.apply(self, [op, function (res) {
- callback(res);
- self.setKeyword(o.keywordGetter());
- }]);
- }
- });
- this.loader.on(BI.Controller.EVENT_CHANGE, function () {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
-
- this.resizer = BI.createWidget({
- type: "bi.vtape",
- element: this,
- items: [{
- el: this.tooltipClick,
- height: 0
- }, {
- el: this.loader
- }]
- });
- this.tooltipClick.setVisible(false);
- },
-
- setKeyword: function (keyword) {
- var btn;
- var isVisible = this.loader.getAllButtons().length > 0 && (btn = this.loader.getAllButtons()[0]) && (keyword === btn.getValue());
- if (isVisible !== this.tooltipClick.isVisible()) {
- this.tooltipClick.setVisible(isVisible);
- this.resizer.attr("items")[0].height = (isVisible ? this.constants.height : 0);
- this.resizer.resize();
- }
- },
-
- hasMatched: function () {
- return this.tooltipClick.isVisible();
- },
-
- setValue: function (v) {
- this.loader.setValue(v);
- },
-
- getValue: function () {
- return this.loader.getValue();
- },
-
- empty: function () {
- this.loader.empty();
- },
-
- populate: function (items) {
- this.loader.populate.apply(this.loader, arguments);
- }
-});
-
-BI.SingleSelectSearchPane.EVENT_CHANGE = "EVENT_CHANGE";
-
-BI.shortcut("bi.single_select_search_pane", BI.SingleSelectSearchPane);/**
- *
- * @class BI.SingleSelectCombo
- * @extends BI.Single
- */
-BI.SingleSelectCombo = BI.inherit(BI.Single, {
-
- _defaultConfig: function () {
- return BI.extend(BI.SingleSelectCombo.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-single-select-combo',
- itemsCreator: BI.emptyFn,
- valueFormatter: BI.emptyFn,
- height: 28
- });
- },
-
- _init: function () {
- BI.SingleSelectCombo.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
-
- var assertShowValue = function () {
- BI.isKey(self._startValue) && (self.storeValue = self._startValue);
- self.trigger.getSearcher().setState(self.storeValue);
- };
- this.storeValue = '';
- //标记正在请求数据
- this.requesting = false;
-
- this.trigger = BI.createWidget({
- type: "bi.single_select_trigger",
- height: o.height,
- // adapter: this.popup,
- masker: {
- offset: {
- left: 1,
- top: 1,
- right: 2,
- bottom: 33
- }
- },
- valueFormatter: o.valueFormatter,
- itemsCreator: function (op, callback) {
- o.itemsCreator(op, function (res) {
- if (op.times === 1 && BI.isNotNull(op.keywords)) {
- //预防trigger内部把当前的storeValue改掉
- self.trigger.setValue(self.getValue());
- }
- callback.apply(self, arguments);
- });
- }
- });
-
- this.trigger.on(BI.SingleSelectTrigger.EVENT_START, function () {
- self._setStartValue("");
- this.getSearcher().setValue(self.storeValue);
- });
- this.trigger.on(BI.SingleSelectTrigger.EVENT_STOP, function () {
- self._setStartValue("");
- });
- this.trigger.on(BI.SingleSelectTrigger.EVENT_PAUSE, function () {
- if (this.getSearcher().hasMatched()) {
- var keyword = this.getSearcher().getKeyword();
- self._join({
- type: BI.Selection.Multi,
- value: [keyword]
- }, function () {
- self.combo.setValue(self.storeValue);
- self._setStartValue(keyword);
- assertShowValue();
- self.populate();
- self._setStartValue("");
- })
- }
- });
- this.trigger.on(BI.SingleSelectTrigger.EVENT_SEARCHING, function (keywords) {
- var last = BI.last(keywords);
- keywords = BI.initial(keywords || []);
- if (keywords.length > 0) {
- self._joinKeywords(keywords, function () {
- if (BI.isEndWithBlank(last)) {
- self.combo.setValue(self.storeValue);
- assertShowValue();
- self.combo.populate();
- self._setStartValue("");
- } else {
- self.combo.setValue(self.storeValue);
- assertShowValue();
- }
- });
- }
- });
-
- this.trigger.on(BI.SingleSelectTrigger.EVENT_CHANGE, function (value, obj) {
- self.storeValue = this.getValue();
- assertShowValue();
- });
- this.trigger.on(BI.SingleSelectTrigger.EVENT_COUNTER_CLICK, function () {
- if (!self.combo.isViewVisible()) {
- self.combo.showView();
- }
- });
-
- this.combo = BI.createWidget({
- type: "bi.combo",
- toggle: false,
- el: this.trigger,
- adjustLength: 1,
- popup: {
- type: 'bi.single_select_popup_view',
- ref: function () {
- self.popup = this;
- self.trigger.setAdapter(this);
- },
- listeners: [{
- eventName: BI.SingleSelectPopupView.EVENT_CHANGE,
- action: function () {
- self.storeValue = this.getValue();
- self._adjust(function () {
- assertShowValue();
- });
- }
- }, {
- eventName: BI.SingleSelectPopupView.EVENT_CLICK_CONFIRM,
- action: function () {
- self._defaultState();
- }
- }, {
- eventName: BI.SingleSelectPopupView.EVENT_CLICK_CLEAR,
- action: function () {
- self.setValue();
- self._defaultState();
- }
- }],
- itemsCreator: o.itemsCreator,
- valueFormatter: o.valueFormatter,
- onLoaded: function () {
- BI.nextTick(function () {
- self.combo.adjustWidth();
- self.combo.adjustHeight();
- self.trigger.getSearcher().adjustView();
- });
- }
- },
- hideChecker: function (e) {
- return triggerBtn.element.find(e.target).length === 0;
- }
- });
-
- this.combo.on(BI.Combo.EVENT_BEFORE_POPUPVIEW, function () {
- this.setValue(self.storeValue);
- BI.nextTick(function () {
- self.populate();
- });
- });
- //当退出的时候如果还在处理请求,则等请求结束后再对外发确定事件
- this.wants2Quit = false;
- this.combo.on(BI.Combo.EVENT_AFTER_HIDEVIEW, function () {
- //important:关闭弹出时又可能没有退出编辑状态
- self.trigger.stopEditing();
- if (self.requesting === true) {
- self.wants2Quit = true;
- } else {
- self.fireEvent(BI.SingleSelectCombo.EVENT_CONFIRM);
- }
- });
-
- var triggerBtn = BI.createWidget({
- type: "bi.trigger_icon_button",
- width: o.height,
- height: o.height,
- cls: "single-select-trigger-icon-button bi-border-left"
- });
- triggerBtn.on(BI.TriggerIconButton.EVENT_CHANGE, function () {
- if (self.combo.isViewVisible()) {
- self.combo.hideView();
- } else {
- self.combo.showView();
- }
- });
- BI.createWidget({
- type: "bi.absolute",
- element: this,
- items: [{
- el: this.combo,
- left: 0,
- right: 0,
- top: 0,
- bottom: 0
- }, {
- el: triggerBtn,
- right: 0,
- top: 0,
- bottom: 0
- }]
- })
- },
-
- _defaultState: function () {
- this.trigger.stopEditing();
- this.combo.hideView();
- },
-
- _assertValue: function (val) {
- val || (val = '');
- },
-
- _makeMap: function (values) {
- return BI.makeObject(values || []);
- },
-
- _joinKeywords: function (keywords, callback) {
- var self = this, o = this.options;
- this._assertValue(this.storeValue);
- this.requesting = true;
- o.itemsCreator({
- type: BI.SingleSelectCombo.REQ_GET_ALL_DATA,
- keywords: keywords
- }, function (ob) {
- var values = BI.pluck(ob.items, "value");
- digest(values);
- });
-
- function digest(items) {
- var selectedMap = self._makeMap(items);
- BI.each(keywords, function (i, val) {
- if (BI.isNotNull(selectedMap[val])) {
- self.storeValue.value["remove"](val);
- }
- });
- self._adjust(callback);
- }
- },
-
- _joinAll: function (res, callback) {
- var self = this, o = this.options;
- this._assertValue(res);
- this.requesting = true;
- o.itemsCreator({
- type: BI.SingleSelectCombo.REQ_GET_ALL_DATA,
- keywords: [this.trigger.getKey()]
- }, function (ob) {
- var items = BI.pluck(ob.items, "value");
- if (self.storeValue.type === res.type) {
- var change = false;
- var map = self._makeMap(self.storeValue.value);
- BI.each(items, function (i, v) {
- if (BI.isNotNull(map[v])) {
- change = true;
- delete map[v];
- }
- });
- change && (self.storeValue.value = BI.values(map));
- self._adjust(callback);
- return;
- }
- var selectedMap = self._makeMap(self.storeValue.value);
- var notSelectedMap = self._makeMap(res.value);
- var newItems = [];
- BI.each(items, function (i, item) {
- if (BI.isNotNull(selectedMap[items[i]])) {
- delete selectedMap[items[i]];
- }
- if (BI.isNull(notSelectedMap[items[i]])) {
- newItems.push(item);
- }
- });
- self.storeValue.value = newItems.concat(BI.values(selectedMap));
- self._adjust(callback);
- })
- },
-
- _adjust: function (callback) {
- var self = this, o = this.options;
- if (!this._count) {
- o.itemsCreator({
- type: BI.SingleSelectCombo.REQ_GET_DATA_LENGTH
- }, function (res) {
- self._count = res.count;
- adjust();
- callback();
- });
- } else {
- adjust();
- callback();
-
- }
-
- function adjust() {
- if (self.wants2Quit === true) {
- self.fireEvent(BI.SingleSelectCombo.EVENT_CONFIRM);
- self.wants2Quit = false;
- }
- self.requesting = false;
- }
- },
-
- _join: function (res, callback) {
- var self = this, o = this.options;
- this._assertValue(res);
- this._assertValue(this.storeValue);
- if (this.storeValue.type === res.type) {
- var map = this._makeMap(this.storeValue.value);
- BI.each(res.value, function (i, v) {
- if (!map[v]) {
- self.storeValue.value.push(v);
- map[v] = v;
- }
- });
- var change = false;
- BI.each(res.assist, function (i, v) {
- if (BI.isNotNull(map[v])) {
- change = true;
- delete map[v];
- }
- });
- change && (this.storeValue.value = BI.values(map));
- self._adjust(callback);
- return;
- }
- this._joinAll(res, callback);
- },
-
- _setStartValue: function (value) {
- this._startValue = value;
- this.popup.setStartValue(value);
- },
-
- setValue: function (v) {
- this.storeValue = v || '';
- this._assertValue(this.storeValue);
- this.combo.setValue(this.storeValue);
- },
-
- getValue: function () {
- return this.storeValue;
- },
-
- populate: function () {
- this._count = null;
- this.combo.populate.apply(this.combo, arguments);
- }
-});
-
-BI.extend(BI.SingleSelectCombo, {
- REQ_GET_DATA_LENGTH: 0,
- REQ_GET_ALL_DATA: -1
-});
-
-BI.SingleSelectCombo.EVENT_CONFIRM = "EVENT_CONFIRM";
-
-BI.shortcut('bi.single_select_combo', BI.SingleSelectCombo);/**
- * 选择列表
- *
- * Created by GUY on 2015/11/1.
- * @class BI.SingleSelectList
- * @extends BI.Widget
- */
-BI.SingleSelectList = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.SingleSelectList.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-select-list",
- direction: BI.Direction.Top,//toolbar的位置
- logic: {
- dynamic: true
- },
- items: [],
- itemsCreator: BI.emptyFn,
- hasNext: BI.emptyFn,
- onLoaded: BI.emptyFn,
- el: {
- type: "bi.list_pane"
- }
- })
- },
- _init: function () {
- BI.SingleSelectList.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
-
- this.list = BI.createWidget(o.el, {
- type: "bi.list_pane",
- items: o.items,
- itemsCreator: function (op, callback) {
- o.itemsCreator(op, function (items) {
- callback.apply(self, arguments);
- });
- },
- onLoaded: o.onLoaded,
- hasNext: o.hasNext
- });
-
- this.list.on(BI.Controller.EVENT_CHANGE, function (type, value, obj) {
- if (type === BI.Events.CLICK) {
- self.fireEvent(BI.SingleSelectList.EVENT_CHANGE, value, obj);
- }
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
-
- BI.createWidget(BI.extend({
- element: this
- }, BI.LogicFactory.createLogic(BI.LogicFactory.createLogicTypeByDirection(o.direction), BI.extend({
- scrolly: true
- }, o.logic, {
- items: BI.LogicFactory.createLogicItemsByDirection(o.direction, this.list)
- }))));
-
- },
-
- hasPrev: function () {
- return this.list.hasPrev();
- },
-
- hasNext: function () {
- return this.list.hasNext();
- },
-
- prependItems: function (items) {
- this.list.prependItems.apply(this.list, arguments);
- },
-
- addItems: function (items) {
- this.list.addItems.apply(this.list, arguments);
- },
-
- setValue: function (v) {
- this.list.setValue([v]);
- },
-
- getValue: function () {
- return this.list.getValue()[0];
- },
-
- empty: function () {
- this.list.empty();
- },
-
- populate: function (items) {
- this.list.populate.apply(this.list, arguments);
- },
-
- resetHeight: function (h) {
- this.list.resetHeight ? this.list.resetHeight(h) :
- this.list.element.css({"max-height": h + "px"})
- },
-
- setNotSelectedValue: function () {
- this.list.setNotSelectedValue.apply(this.list, arguments);
- },
-
- getNotSelectedValue: function () {
- return this.list.getNotSelectedValue();
- },
-
- getAllButtons: function () {
- return this.list.getAllButtons();
- },
-
- getAllLeaves: function () {
- return this.list.getAllLeaves();
- },
-
- getSelectedButtons: function () {
- return this.list.getSelectedButtons();
- },
-
- getNotSelectedButtons: function () {
- return this.list.getNotSelectedButtons();
- },
-
- getIndexByValue: function (value) {
- return this.list.getIndexByValue(value);
- },
-
- getNodeById: function (id) {
- return this.list.getNodeById(id);
- },
-
- getNodeByValue: function (value) {
- return this.list.getNodeByValue(value);
- }
- });
- BI.SingleSelectList.EVENT_CHANGE = "EVENT_CHANGE";
- BI.shortcut("bi.single_select_list", BI.SingleSelectList);/**
- * 单选加载数据面板
- * Created by guy on 15/11/2.
- * @class BI.SingleSelectLoader
- * @extends Widget
- */
-BI.SingleSelectLoader = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.SingleSelectLoader.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-single-select-loader',
- logic: {
- dynamic: true
- },
- el: {
- height: 400
- },
- valueFormatter: BI.emptyFn,
- itemsCreator: BI.emptyFn,
- onLoaded: BI.emptyFn
- });
- },
-
- _init: function () {
- BI.SingleSelectLoader.superclass._init.apply(this, arguments);
-
- var self = this, opts = this.options;
- var hasNext = false;
-
- this.button_group = BI.createWidget({
- type: "bi.single_select_list",
- element: this,
- logic: opts.logic,
- el: BI.extend({
- onLoaded: opts.onLoaded,
- el: {
- type: "bi.loader",
- isDefaultInit: false,
- logic: {
- dynamic: true,
- scrolly: true
- },
- el: {
- chooseType: BI.ButtonGroup.CHOOSE_TYPE_SINGLE,
- behaviors: {
- redmark: function () {
- return true;
- }
- },
- layouts: [{
- type: "bi.vertical"
- }]
- }
- }
- }, opts.el),
- itemsCreator: function (op, callback) {
- var startValue = self._startValue;
- self.storeValue && (op = BI.extend(op || {}, {
- selectedValues: [self.storeValue]
- }));
- opts.itemsCreator(op, function (ob) {
- hasNext = ob.hasNext;
- var firstItems = [];
- if (op.times === 1 && self.storeValue) {
- var json = BI.map([self.storeValue], function (i, v) {
- var txt = opts.valueFormatter(v) || v;
- return {
- text: txt,
- value: v,
- title: txt,
- selected: false
- }
- });
- firstItems = self._createItems(json);
- }
- callback(firstItems.concat(self._createItems(ob.items)), ob.keyword || "");
- if (op.times === 1 && self.storeValue) {
- BI.isKey(startValue) && (self.storeValue = startValue);
- self.setValue(self.storeValue);
- }
- (op.times === 1) && self._scrollToTop();
- });
- },
- hasNext: function () {
- return hasNext;
- }
- });
- this.button_group.on(BI.Controller.EVENT_CHANGE, function () {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
- this.button_group.on(BI.SingleSelectList.EVENT_CHANGE, function () {
- self.fireEvent(BI.SingleSelectLoader.EVENT_CHANGE, arguments);
- });
- },
-
- _createItems: function (items) {
- return BI.createItems(items, {
- type: "bi.single_select_radio_item",
- logic: this.options.logic,
- height: 25,
- selected: false
- })
- },
-
- _scrollToTop: function () {
- var self = this;
- BI.delay(function () {
- self.button_group.element.scrollTop(0);
- }, 30);
- },
-
- _assertValue: function (val) {
- val || (val = '');
- },
-
- setStartValue: function (v) {
- this._startValue = v;
- },
-
- setValue: function (v) {
- this.storeValue = v || '';
- this._assertValue(this.storeValue);
- this.button_group.setValue(this.storeValue);
- },
-
- getValue: function () {
- return this.button_group.getValue();
- },
-
- getAllButtons: function () {
- return this.button_group.getAllButtons();
- },
-
- empty: function () {
- this.button_group.empty();
- },
-
- populate: function (items) {
- this.button_group.populate.apply(this.button_group, arguments);
- },
-
- resetHeight: function (h) {
- this.button_group.resetHeight(h);
- },
-
- resetWidth: function (w) {
- this.button_group.resetWidth(w);
- }
-});
-
-BI.SingleSelectLoader.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut('bi.single_select_loader', BI.SingleSelectLoader);/**
- * 带加载的单选下拉面板
- * @class BI.SingleSelectPopupView
- * @extends Widget
- */
-BI.SingleSelectPopupView = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.SingleSelectPopupView.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-single-select-popup-view',
- maxWidth: 'auto',
- minWidth: 135,
- maxHeight: 400,
- valueFormatter: BI.emptyFn,
- itemsCreator: BI.emptyFn,
- onLoaded: BI.emptyFn
- });
- },
-
- _init: function () {
- BI.SingleSelectPopupView.superclass._init.apply(this, arguments);
- var self = this, opts = this.options;
-
- this.loader = BI.createWidget({
- type: "bi.single_select_loader",
- itemsCreator: opts.itemsCreator,
- valueFormatter: opts.valueFormatter,
- onLoaded: opts.onLoaded
- });
-
- this.popupView = BI.createWidget({
- type: "bi.multi_popup_view",
- stopPropagation: false,
- maxWidth: opts.maxWidth,
- minWidth: opts.minWidth,
- maxHeight: opts.maxHeight,
- element: this,
- buttons: [BI.i18nText('BI-Basic_Clears'), BI.i18nText('BI-Basic_Sure')],
- el: this.loader
- });
-
- this.popupView.on(BI.MultiPopupView.EVENT_CHANGE, function () {
- self.fireEvent(BI.SingleSelectPopupView.EVENT_CHANGE);
- });
- this.popupView.on(BI.MultiPopupView.EVENT_CLICK_TOOLBAR_BUTTON, function (index) {
- switch (index) {
- case 0:
- self.fireEvent(BI.SingleSelectPopupView.EVENT_CLICK_CLEAR);
- break;
- case 1:
- self.fireEvent(BI.SingleSelectPopupView.EVENT_CLICK_CONFIRM);
- break;
- }
- });
- },
-
- setStartValue: function (v) {
- this.loader.setStartValue(v);
- },
-
- setValue: function (v) {
- this.popupView.setValue(v);
- },
-
- getValue: function () {
- return this.popupView.getValue();
- },
-
- populate: function (items) {
- this.popupView.populate.apply(this.popupView, arguments);
- },
-
- resetHeight: function (h) {
- this.popupView.resetHeight(h);
- },
-
- resetWidth: function (w) {
- this.popupView.resetWidth(w);
- }
-});
-
-BI.SingleSelectPopupView.EVENT_CHANGE = "EVENT_CHANGE";
-BI.SingleSelectPopupView.EVENT_CLICK_CONFIRM = "EVENT_CLICK_CONFIRM";
-BI.SingleSelectPopupView.EVENT_CLICK_CLEAR = "EVENT_CLICK_CLEAR";
-
-
-BI.shortcut('bi.single_select_popup_view', BI.SingleSelectPopupView);/**
- *
- * 单选下拉框
- * @class BI.SingleSelectTrigger
- * @extends BI.Trigger
- */
-
-BI.SingleSelectTrigger = BI.inherit(BI.Trigger, {
-
- constants: {
- height: 14,
- rgap: 4,
- lgap: 4
- },
-
- _defaultConfig: function () {
- return BI.extend(BI.SingleSelectTrigger.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-single-select-trigger bi-border",
- itemsCreator: BI.emptyFn,
- valueFormatter: BI.emptyFn,
- searcher: {},
- switcher: {},
-
- adapter: null,
- masker: {}
- });
- },
-
- _init: function () {
- BI.SingleSelectTrigger.superclass._init.apply(this, arguments);
-
- var self = this, o = this.options;
- if (o.height) {
- this.setHeight(o.height - 2);
- }
-
- this.searcher = BI.createWidget(o.searcher, {
- type: "bi.single_select_searcher",
- height: o.height,
- itemsCreator: o.itemsCreator,
- valueFormatter: o.valueFormatter,
- popup: {},
- adapter: o.adapter,
- masker: o.masker
- });
- this.searcher.on(BI.SingleSelectSearcher.EVENT_START, function () {
- self.fireEvent(BI.SingleSelectTrigger.EVENT_START);
- });
- this.searcher.on(BI.SingleSelectSearcher.EVENT_PAUSE, function () {
- self.fireEvent(BI.SingleSelectTrigger.EVENT_PAUSE);
- });
- this.searcher.on(BI.SingleSelectSearcher.EVENT_SEARCHING, function () {
- self.fireEvent(BI.SingleSelectTrigger.EVENT_SEARCHING, arguments);
- });
- this.searcher.on(BI.SingleSelectSearcher.EVENT_STOP, function () {
- self.fireEvent(BI.SingleSelectTrigger.EVENT_STOP);
- });
- this.searcher.on(BI.SingleSelectSearcher.EVENT_CHANGE, function () {
- self.fireEvent(BI.SingleSelectTrigger.EVENT_CHANGE, arguments);
- });
-
- var wrapper = BI.createWidget({
- type: 'bi.htape',
- element: this,
- items: [
- {
- el: this.searcher,
- width: 'fill'
- }, {
- el: BI.createWidget(),
- width: 30
- }]
- });
- },
-
- getSearcher: function () {
- return this.searcher;
- },
-
- stopEditing: function () {
- this.searcher.stopSearch();
- },
-
- setAdapter: function (adapter) {
- this.searcher.setAdapter(adapter);
- },
-
- setValue: function (v) {
- this.searcher.setValue(v);
- },
-
- getKey: function () {
- return this.searcher.getKey();
- },
-
- getValue: function () {
- return this.searcher.getValue();
- }
-});
-
-BI.SingleSelectTrigger.EVENT_TRIGGER_CLICK = "EVENT_TRIGGER_CLICK";
-BI.SingleSelectTrigger.EVENT_COUNTER_CLICK = "EVENT_COUNTER_CLICK";
-BI.SingleSelectTrigger.EVENT_CHANGE = "EVENT_CHANGE";
-BI.SingleSelectTrigger.EVENT_START = "EVENT_START";
-BI.SingleSelectTrigger.EVENT_STOP = "EVENT_STOP";
-BI.SingleSelectTrigger.EVENT_PAUSE = "EVENT_PAUSE";
-BI.SingleSelectTrigger.EVENT_SEARCHING = "EVENT_SEARCHING";
-BI.SingleSelectTrigger.EVENT_BEFORE_COUNTER_POPUPVIEW = "EVENT_BEFORE_COUNTER_POPUPVIEW";
-
-BI.shortcut('bi.single_select_trigger', BI.SingleSelectTrigger);/**
- * 单选输入框
- * Created by guy on 15/11/3.
- * @class BI.SingleSelectEditor
- * @extends Widget
- */
-BI.SingleSelectEditor = BI.inherit(BI.Widget, {
-
- _const: {
- checkSelected: BI.i18nText('BI-Check_Selected')
- },
-
- _defaultConfig: function () {
- return BI.extend(BI.SingleSelectEditor.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-single-select-editor',
- el: {}
- });
- },
-
- _init: function () {
- BI.SingleSelectEditor.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.editor = BI.createWidget(o.el, {
- type: 'bi.state_editor',
- element: this,
- height: o.height,
- watermark: BI.i18nText('BI-Basic_Search'),
- allowBlank: true
- });
-
- this.editor.on(BI.Controller.EVENT_CHANGE, function () {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
-
- this.editor.on(BI.StateEditor.EVENT_PAUSE, function () {
- self.fireEvent(BI.SingleSelectEditor.EVENT_PAUSE);
- });
- this.editor.on(BI.StateEditor.EVENT_CLICK_LABEL, function () {
-
- });
- },
-
- focus: function () {
- this.editor.focus();
- },
-
- blur: function () {
- this.editor.blur();
- },
-
- setState: function (state) {
- this.editor.setState(state);
- },
-
- setValue: function (v) {
- this.editor.setValue(v);
- },
-
- getValue: function () {
- var v = this.editor.getState();
- if (BI.isArray(v) && v.length > 0) {
- return v[v.length - 1];
- } else {
- return "";
- }
- },
-
- getKeywords: function () {
- var val = this.editor.getLastValidValue();
- var keywords = val.match(/[\S]+/g);
- if (BI.isEndWithBlank(val)) {
- return keywords.concat([' ']);
- }
- return keywords;
- },
-
- populate: function (items) {
-
- }
-});
-BI.SingleSelectEditor.EVENT_PAUSE = "SingleSelectEditor.EVENT_PAUSE";
-BI.shortcut('bi.single_select_editor', BI.SingleSelectEditor);/**
- * searcher
- * Created by guy on 15/11/3.
- * @class BI.SingleSelectSearcher
- * @extends Widget
- */
-BI.SingleSelectSearcher = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.SingleSelectSearcher.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-single-select-searcher',
- itemsCreator: BI.emptyFn,
- el: {},
- popup: {},
- valueFormatter: BI.emptyFn,
- adapter: null,
- masker: {}
- });
- },
-
- _init: function () {
- BI.SingleSelectSearcher.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.editor = BI.createWidget(o.el, {
- type: 'bi.single_select_editor',
- height: o.height
- });
-
- this.searcher = BI.createWidget({
- type: "bi.searcher",
- element: this,
- height: o.height,
- isAutoSearch: false,
- isAutoSync: false,
- onSearch: function (op, callback) {
- callback();
- },
- el: this.editor,
-
- popup: BI.extend({
- type: "bi.single_select_search_pane",
- valueFormatter: o.valueFormatter,
- keywordGetter: function () {
- return self.editor.getValue();
- },
- itemsCreator: function (op, callback) {
- op.keyword = self.editor.getValue();
- this.setKeyword(op.keyword);
- o.itemsCreator(op, callback);
- }
- }, o.popup),
-
- adapter: o.adapter,
- masker: o.masker
- });
- this.searcher.on(BI.Searcher.EVENT_START, function () {
- self.fireEvent(BI.SingleSelectSearcher.EVENT_START);
- });
- this.searcher.on(BI.Searcher.EVENT_PAUSE, function () {
- if (this.hasMatched()) {
-
- }
- self.fireEvent(BI.SingleSelectSearcher.EVENT_PAUSE);
- });
- this.searcher.on(BI.Searcher.EVENT_STOP, function () {
- self.fireEvent(BI.SingleSelectSearcher.EVENT_STOP);
- });
- this.searcher.on(BI.Searcher.EVENT_CHANGE, function () {
- self.fireEvent(BI.SingleSelectSearcher.EVENT_CHANGE, arguments);
- });
- this.searcher.on(BI.Searcher.EVENT_SEARCHING, function () {
- var keywords = this.getKeywords();
- self.fireEvent(BI.SingleSelectSearcher.EVENT_SEARCHING, keywords);
- });
- },
-
- adjustView: function () {
- this.searcher.adjustView();
- },
-
- isSearching: function () {
- return this.searcher.isSearching();
- },
-
- stopSearch: function () {
- this.searcher.stopSearch();
- },
-
- getKeyword: function () {
- return this.editor.getValue();
- },
-
- hasMatched: function () {
- return this.searcher.hasMatched();
- },
-
- hasChecked: function () {
- return this.searcher.getView() && this.searcher.getView().hasChecked();
- },
-
- setAdapter: function (adapter) {
- this.searcher.setAdapter(adapter);
- },
-
- setState: function (v) {
- var o = this.options;
- v || (v = '');
- if (v === '') {
- this.editor.setState(BI.Selection.None);
- } else {
- this.editor.setState(o.valueFormatter(v + "") || (v + ''));
- }
- },
-
- setValue: function (ob) {
- this.setState(ob);
- this.searcher.setValue(ob);
- },
-
- getKey: function () {
- return this.editor.getValue();
- },
-
- getValue: function () {
- return this.searcher.getValue();
- },
-
- populate: function (items) {
- this.searcher.populate.apply(this.searcher, arguments);
- }
-});
-
-BI.SingleSelectSearcher.EVENT_BEFORE_POPUPVIEW = "EVENT_BEFORE_POPUPVIEW";
-BI.SingleSelectSearcher.EVENT_CHANGE = "EVENT_CHANGE";
-BI.SingleSelectSearcher.EVENT_START = "EVENT_START";
-BI.SingleSelectSearcher.EVENT_STOP = "EVENT_STOP";
-BI.SingleSelectSearcher.EVENT_PAUSE = "EVENT_PAUSE";
-BI.SingleSelectSearcher.EVENT_SEARCHING = "EVENT_SEARCHING";
-BI.shortcut('bi.single_select_searcher', BI.SingleSelectSearcher);/**
- * 单选加载数据搜索loader面板
- * Created by guy on 15/11/4.
- * @class BI.SingleSelectSearchLoader
- * @extends Widget
- */
-BI.SingleSelectSearchLoader = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.SingleSelectSearchLoader.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-single-select-search-loader',
- itemsCreator: BI.emptyFn,
- keywordGetter: BI.emptyFn,
- valueFormatter: BI.emptyFn
- });
- },
-
- _init: function () {
- BI.SingleSelectSearchLoader.superclass._init.apply(this, arguments);
-
- var self = this, opts = this.options;
- var hasNext = false;
-
- this.button_group = BI.createWidget({
- type: "bi.single_select_list",
- element: this,
- logic: {
- dynamic: false
- },
- el: {
- tipText: BI.i18nText("BI-No_Select"),
- el: {
- type: "bi.loader",
- isDefaultInit: false,
- logic: {
- dynamic: true,
- scrolly: true
- },
- el: {
- chooseType: BI.ButtonGroup.CHOOSE_TYPE_SINGLE,
- behaviors: {
- redmark: function () {
- return true;
- }
- },
- layouts: [{
- type: "bi.vertical"
- }]
- }
- }
- },
- itemsCreator: function (op, callback) {
- self.storeValue && (op = BI.extend(op || {}, {
- selectedValues: [self.storeValue]
- }));
- opts.itemsCreator(op, function (ob) {
- var keyword = ob.keyword = opts.keywordGetter();
- hasNext = ob.hasNext;
- var firstItems = [];
- if (op.times === 1 && self.storeValue) {
- var json = BI.map([self.storeValue], function (i, v) {
- var txt = opts.valueFormatter(v) || v;
- return {
- text: txt,
- value: v,
- title: txt,
- selected: false
- }
- });
- firstItems = self._createItems(json);
- }
- if(keyword) {
- var flag = false;
- for(var i = 0; i < ob.items.length; i++) {
- if(BI.contains(ob.items[i], keyword)) {
- flag = true;
- }
- }
- if(!flag) {
- var preItems = self._createItems([{
- text: keyword,
- value: keyword,
- title: keyword,
- selected: false
- }]);
- firstItems = firstItems.concat(preItems);
- }
- }
- callback(firstItems.concat(self._createItems(ob.items)), keyword);
- if (op.times === 1 && self.storeValue) {
- self.setValue(self.storeValue);
- }
- });
- },
- hasNext: function () {
- return hasNext;
- }
- });
- this.button_group.on(BI.Controller.EVENT_CHANGE, function () {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
- this.button_group.on(BI.SingleSelectList.EVENT_CHANGE, function () {
- self.fireEvent(BI.SingleSelectSearchLoader.EVENT_CHANGE, arguments);
- });
- },
-
- _createItems: function (items) {
- return BI.createItems(items, {
- type: "bi.single_select_radio_item",
- logic: {
- dynamic: false
- },
- height: 25,
- selected: false
- })
- },
-
- _filterValues: function (src) {
- var o = this.options;
- var keyword = o.keywordGetter();
- var values = BI.deepClone(src.value) || [];
- var newValues = BI.map(values, function (i, v) {
- return {
- text: o.valueFormatter(v) || v,
- value: v
- };
- });
- if (BI.isKey(keyword)) {
- var search = BI.Func.getSearchResult(newValues, keyword);
- values = search.matched.concat(search.finded);
- }
- return BI.map(values, function (i, v) {
- return {
- text: v.text,
- title: v.text,
- value: v.value,
- selected: false
- }
- })
- },
-
- setValue: function (v) {
- //暂存的值一定是新的值,不然v改掉后,storeValue也跟着改了
- this.storeValue = v;
- this.button_group.setValue(v);
- },
-
- getValue: function () {
- return this.button_group.getValue();
- },
-
- getAllButtons: function () {
- return this.button_group.getAllButtons();
- },
-
- empty: function () {
- this.button_group.empty();
- },
-
- populate: function (items) {
- this.button_group.populate.apply(this.button_group, arguments);
- },
-
- resetHeight: function (h) {
- this.button_group.resetHeight(h);
- },
-
- resetWidth: function (w) {
- this.button_group.resetWidth(w);
- }
-});
-
-BI.SingleSelectSearchLoader.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut('bi.single_select_search_add_loader', BI.SingleSelectSearchLoader);/**
- *
- * 在搜索框中输入文本弹出的面板
- * @class BI.SingleSelectSearchPane
- * @extends Widget
- */
-
-BI.SingleSelectSearchPane = BI.inherit(BI.Widget, {
-
- constants: {
- height: 25,
- lgap: 10,
- tgap: 5
- },
-
- _defaultConfig: function () {
- return BI.extend(BI.SingleSelectSearchPane.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-single-select-search-pane bi-card",
- itemsCreator: BI.emptyFn,
- valueFormatter: BI.emptyFn,
- keywordGetter: BI.emptyFn
- });
- },
-
- _init: function () {
- BI.SingleSelectSearchPane.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
-
- this.tooltipClick = BI.createWidget({
- type: "bi.label",
- invisible: true,
- text: BI.i18nText('BI-Click_Blank_To_Select'),
- cls: 'single-select-toolbar',
- height: this.constants.height
- });
-
- this.loader = BI.createWidget({
- type: "bi.single_select_search_add_loader",
- keywordGetter: o.keywordGetter,
- valueFormatter: o.valueFormatter,
- itemsCreator: function (op, callback) {
- o.itemsCreator.apply(self, [op, function (res) {
- callback(res);
- self.setKeyword(o.keywordGetter());
- }]);
- }
- });
- this.loader.on(BI.Controller.EVENT_CHANGE, function () {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
-
- this.resizer = BI.createWidget({
- type: "bi.vtape",
- element: this,
- items: [{
- el: this.tooltipClick,
- height: 0
- }, {
- el: this.loader
- }]
- });
- this.tooltipClick.setVisible(false);
- },
-
- setKeyword: function (keyword) {
- var btn;
- var isVisible = this.loader.getAllButtons().length > 0 && (btn = this.loader.getAllButtons()[0]) && (keyword === btn.getValue());
- if (isVisible !== this.tooltipClick.isVisible()) {
- this.tooltipClick.setVisible(isVisible);
- this.resizer.attr("items")[0].height = (isVisible ? this.constants.height : 0);
- this.resizer.resize();
- }
- },
-
- hasMatched: function () {
- return this.tooltipClick.isVisible();
- },
-
- setValue: function (v) {
- this.loader.setValue(v);
- },
-
- getValue: function () {
- return this.loader.getValue();
- },
-
- empty: function () {
- this.loader.empty();
- },
-
- populate: function (items) {
- this.loader.populate.apply(this.loader, arguments);
- }
-});
-
-BI.SingleSelectSearchPane.EVENT_CHANGE = "EVENT_CHANGE";
-
-BI.shortcut("bi.single_select_search_add_pane", BI.SingleSelectSearchPane);/**
- *
- * @class BI.SingleSelectCombo
- * @extends BI.Single
- */
-BI.SingleSelectCombo = BI.inherit(BI.Single, {
-
- _defaultConfig: function () {
- return BI.extend(BI.SingleSelectCombo.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-single-select-combo',
- itemsCreator: BI.emptyFn,
- valueFormatter: BI.emptyFn,
- height: 28
- });
- },
-
- _init: function () {
- BI.SingleSelectCombo.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
-
- var assertShowValue = function () {
- BI.isKey(self._startValue) && (self.storeValue = self._startValue);
- self.trigger.getSearcher().setState(self.storeValue);
- };
- this.storeValue = '';
- //标记正在请求数据
- this.requesting = false;
-
- this.trigger = BI.createWidget({
- type: "bi.single_select_add_trigger",
- height: o.height,
- // adapter: this.popup,
- masker: {
- offset: {
- left: 1,
- top: 1,
- right: 2,
- bottom: 33
- }
- },
- valueFormatter: o.valueFormatter,
- itemsCreator: function (op, callback) {
- o.itemsCreator(op, function (res) {
- if (op.times === 1 && BI.isNotNull(op.keywords)) {
- //预防trigger内部把当前的storeValue改掉
- self.trigger.setValue(self.getValue());
- }
- callback.apply(self, arguments);
- });
- }
- });
-
- this.trigger.on(BI.SingleSelectTrigger.EVENT_START, function () {
- self._setStartValue("");
- this.getSearcher().setValue(self.storeValue);
- });
- this.trigger.on(BI.SingleSelectTrigger.EVENT_STOP, function () {
- self._setStartValue("");
- });
- this.trigger.on(BI.SingleSelectTrigger.EVENT_PAUSE, function () {
- if (this.getSearcher().hasMatched()) {
- var keyword = this.getSearcher().getKeyword();
- self._join({
- type: BI.Selection.Multi,
- value: [keyword]
- }, function () {
- self.combo.setValue(self.storeValue);
- self._setStartValue(keyword);
- assertShowValue();
- self.populate();
- self._setStartValue("");
- })
- }
- });
- this.trigger.on(BI.SingleSelectTrigger.EVENT_SEARCHING, function (keywords) {
- var last = BI.last(keywords);
- keywords = BI.initial(keywords || []);
- if (keywords.length > 0) {
- self._joinKeywords(keywords, function () {
- if (BI.isEndWithBlank(last)) {
- self.combo.setValue(self.storeValue);
- assertShowValue();
- self.combo.populate();
- self._setStartValue("");
- } else {
- self.combo.setValue(self.storeValue);
- assertShowValue();
- }
- });
- }
- });
-
- this.trigger.on(BI.SingleSelectTrigger.EVENT_CHANGE, function (value, obj) {
- self.storeValue = this.getValue();
- assertShowValue();
- });
- this.trigger.on(BI.SingleSelectTrigger.EVENT_COUNTER_CLICK, function () {
- if (!self.combo.isViewVisible()) {
- self.combo.showView();
- }
- });
-
- this.combo = BI.createWidget({
- type: "bi.combo",
- toggle: false,
- el: this.trigger,
- adjustLength: 1,
- popup: {
- type: 'bi.single_select_popup_view',
- ref: function () {
- self.popup = this;
- self.trigger.setAdapter(this);
- },
- listeners: [{
- eventName: BI.SingleSelectPopupView.EVENT_CHANGE,
- action: function () {
- self.storeValue = this.getValue();
- self._adjust(function () {
- assertShowValue();
- });
- }
- }, {
- eventName: BI.SingleSelectPopupView.EVENT_CLICK_CONFIRM,
- action: function () {
- self._defaultState();
- }
- }, {
- eventName: BI.SingleSelectPopupView.EVENT_CLICK_CLEAR,
- action: function () {
- self.setValue();
- self._defaultState();
- }
- }],
- itemsCreator: o.itemsCreator,
- valueFormatter: o.valueFormatter,
- onLoaded: function () {
- BI.nextTick(function () {
- self.combo.adjustWidth();
- self.combo.adjustHeight();
- self.trigger.getSearcher().adjustView();
- });
- }
- },
- hideChecker: function (e) {
- return triggerBtn.element.find(e.target).length === 0;
- }
- });
-
- this.combo.on(BI.Combo.EVENT_BEFORE_POPUPVIEW, function () {
- this.setValue(self.storeValue);
- BI.nextTick(function () {
- self.populate();
- });
- });
- //当退出的时候如果还在处理请求,则等请求结束后再对外发确定事件
- this.wants2Quit = false;
- this.combo.on(BI.Combo.EVENT_AFTER_HIDEVIEW, function () {
- //important:关闭弹出时又可能没有退出编辑状态
- self.trigger.stopEditing();
- if (self.requesting === true) {
- self.wants2Quit = true;
- } else {
- self.fireEvent(BI.SingleSelectCombo.EVENT_CONFIRM);
- }
- });
-
- var triggerBtn = BI.createWidget({
- type: "bi.trigger_icon_button",
- width: o.height,
- height: o.height,
- cls: "single-select-trigger-icon-button bi-border-left"
- });
- triggerBtn.on(BI.TriggerIconButton.EVENT_CHANGE, function () {
- if (self.combo.isViewVisible()) {
- self.combo.hideView();
- } else {
- self.combo.showView();
- }
- });
- BI.createWidget({
- type: "bi.absolute",
- element: this,
- items: [{
- el: this.combo,
- left: 0,
- right: 0,
- top: 0,
- bottom: 0
- }, {
- el: triggerBtn,
- right: 0,
- top: 0,
- bottom: 0
- }]
- })
- },
-
- _defaultState: function () {
- this.trigger.stopEditing();
- this.combo.hideView();
- },
-
- _assertValue: function (val) {
- val || (val = '');
- },
-
- _makeMap: function (values) {
- return BI.makeObject(values || []);
- },
-
- _joinKeywords: function (keywords, callback) {
- var self = this, o = this.options;
- this._assertValue(this.storeValue);
- this.requesting = true;
- o.itemsCreator({
- type: BI.SingleSelectCombo.REQ_GET_ALL_DATA,
- keywords: keywords
- }, function (ob) {
- var values = BI.pluck(ob.items, "value");
- digest(values);
- });
-
- function digest(items) {
- var selectedMap = self._makeMap(items);
- BI.each(keywords, function (i, val) {
- if (BI.isNotNull(selectedMap[val])) {
- self.storeValue.value["remove"](val);
- }
- });
- self._adjust(callback);
- }
- },
-
- _joinAll: function (res, callback) {
- var self = this, o = this.options;
- this._assertValue(res);
- this.requesting = true;
- o.itemsCreator({
- type: BI.SingleSelectCombo.REQ_GET_ALL_DATA,
- keywords: [this.trigger.getKey()]
- }, function (ob) {
- var items = BI.pluck(ob.items, "value");
- if (self.storeValue.type === res.type) {
- var change = false;
- var map = self._makeMap(self.storeValue.value);
- BI.each(items, function (i, v) {
- if (BI.isNotNull(map[v])) {
- change = true;
- delete map[v];
- }
- });
- change && (self.storeValue.value = BI.values(map));
- self._adjust(callback);
- return;
- }
- var selectedMap = self._makeMap(self.storeValue.value);
- var notSelectedMap = self._makeMap(res.value);
- var newItems = [];
- BI.each(items, function (i, item) {
- if (BI.isNotNull(selectedMap[items[i]])) {
- delete selectedMap[items[i]];
- }
- if (BI.isNull(notSelectedMap[items[i]])) {
- newItems.push(item);
- }
- });
- self.storeValue.value = newItems.concat(BI.values(selectedMap));
- self._adjust(callback);
- })
- },
-
- _adjust: function (callback) {
- var self = this, o = this.options;
- if (!this._count) {
- o.itemsCreator({
- type: BI.SingleSelectCombo.REQ_GET_DATA_LENGTH
- }, function (res) {
- self._count = res.count;
- adjust();
- callback();
- });
- } else {
- adjust();
- callback();
-
- }
-
- function adjust() {
- if (self.wants2Quit === true) {
- self.fireEvent(BI.SingleSelectCombo.EVENT_CONFIRM);
- self.wants2Quit = false;
- }
- self.requesting = false;
- }
- },
-
- _join: function (res, callback) {
- var self = this, o = this.options;
- this._assertValue(res);
- this._assertValue(this.storeValue);
- if (this.storeValue.type === res.type) {
- var map = this._makeMap(this.storeValue.value);
- BI.each(res.value, function (i, v) {
- if (!map[v]) {
- self.storeValue.value.push(v);
- map[v] = v;
- }
- });
- var change = false;
- BI.each(res.assist, function (i, v) {
- if (BI.isNotNull(map[v])) {
- change = true;
- delete map[v];
- }
- });
- change && (this.storeValue.value = BI.values(map));
- self._adjust(callback);
- return;
- }
- this._joinAll(res, callback);
- },
-
- _setStartValue: function (value) {
- this._startValue = value;
- this.popup.setStartValue(value);
- },
-
- setValue: function (v) {
- this.storeValue = v || '';
- this._assertValue(this.storeValue);
- this.combo.setValue(this.storeValue);
- },
-
- getValue: function () {
- return this.storeValue;
- },
-
- populate: function () {
- this._count = null;
- this.combo.populate.apply(this.combo, arguments);
- }
-});
-
-BI.extend(BI.SingleSelectCombo, {
- REQ_GET_DATA_LENGTH: 0,
- REQ_GET_ALL_DATA: -1
-});
-
-BI.SingleSelectCombo.EVENT_CONFIRM = "EVENT_CONFIRM";
-
-BI.shortcut('bi.single_select_add_combo', BI.SingleSelectCombo);/**
- *
- * 单选下拉框
- * @class BI.SingleSelectTrigger
- * @extends BI.Trigger
- */
-
-BI.SingleSelectTrigger = BI.inherit(BI.Trigger, {
-
- constants: {
- height: 14,
- rgap: 4,
- lgap: 4
- },
-
- _defaultConfig: function () {
- return BI.extend(BI.SingleSelectTrigger.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-single-select-trigger bi-border",
- itemsCreator: BI.emptyFn,
- valueFormatter: BI.emptyFn,
- searcher: {},
- switcher: {},
-
- adapter: null,
- masker: {}
- });
- },
-
- _init: function () {
- BI.SingleSelectTrigger.superclass._init.apply(this, arguments);
-
- var self = this, o = this.options;
- if (o.height) {
- this.setHeight(o.height - 2);
- }
-
- this.searcher = BI.createWidget(o.searcher, {
- type: "bi.single_select_add_searcher",
- height: o.height,
- itemsCreator: o.itemsCreator,
- valueFormatter: o.valueFormatter,
- popup: {},
- adapter: o.adapter,
- masker: o.masker
- });
- this.searcher.on(BI.SingleSelectSearcher.EVENT_START, function () {
- self.fireEvent(BI.SingleSelectTrigger.EVENT_START);
- });
- this.searcher.on(BI.SingleSelectSearcher.EVENT_PAUSE, function () {
- self.fireEvent(BI.SingleSelectTrigger.EVENT_PAUSE);
- });
- this.searcher.on(BI.SingleSelectSearcher.EVENT_SEARCHING, function () {
- self.fireEvent(BI.SingleSelectTrigger.EVENT_SEARCHING, arguments);
- });
- this.searcher.on(BI.SingleSelectSearcher.EVENT_STOP, function () {
- self.fireEvent(BI.SingleSelectTrigger.EVENT_STOP);
- });
- this.searcher.on(BI.SingleSelectSearcher.EVENT_CHANGE, function () {
- self.fireEvent(BI.SingleSelectTrigger.EVENT_CHANGE, arguments);
- });
-
- var wrapper = BI.createWidget({
- type: 'bi.htape',
- element: this,
- items: [
- {
- el: this.searcher,
- width: 'fill'
- }, {
- el: BI.createWidget(),
- width: 30
- }]
- });
- },
-
- getSearcher: function () {
- return this.searcher;
- },
-
- stopEditing: function () {
- this.searcher.stopSearch();
- },
-
- setAdapter: function (adapter) {
- this.searcher.setAdapter(adapter);
- },
-
- setValue: function (v) {
- this.searcher.setValue(v);
- },
-
- getKey: function () {
- return this.searcher.getKey();
- },
-
- getValue: function () {
- return this.searcher.getValue();
- }
-});
-
-BI.SingleSelectTrigger.EVENT_TRIGGER_CLICK = "EVENT_TRIGGER_CLICK";
-BI.SingleSelectTrigger.EVENT_COUNTER_CLICK = "EVENT_COUNTER_CLICK";
-BI.SingleSelectTrigger.EVENT_CHANGE = "EVENT_CHANGE";
-BI.SingleSelectTrigger.EVENT_START = "EVENT_START";
-BI.SingleSelectTrigger.EVENT_STOP = "EVENT_STOP";
-BI.SingleSelectTrigger.EVENT_PAUSE = "EVENT_PAUSE";
-BI.SingleSelectTrigger.EVENT_SEARCHING = "EVENT_SEARCHING";
-BI.SingleSelectTrigger.EVENT_BEFORE_COUNTER_POPUPVIEW = "EVENT_BEFORE_COUNTER_POPUPVIEW";
-
-BI.shortcut('bi.single_select_add_trigger', BI.SingleSelectTrigger);/**
- * searcher
- * Created by guy on 15/11/3.
- * @class BI.SingleSelectSearcher
- * @extends Widget
- */
-BI.SingleSelectSearcher = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.SingleSelectSearcher.superclass._defaultConfig.apply(this, arguments), {
- baseCls: 'bi-single-select-searcher',
- itemsCreator: BI.emptyFn,
- el: {},
- popup: {},
- valueFormatter: BI.emptyFn,
- adapter: null,
- masker: {}
- });
- },
-
- _init: function () {
- BI.SingleSelectSearcher.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.editor = BI.createWidget(o.el, {
- type: 'bi.single_select_editor',
- height: o.height
- });
-
- this.searcher = BI.createWidget({
- type: "bi.searcher",
- element: this,
- height: o.height,
- isAutoSearch: false,
- isAutoSync: false,
- onSearch: function (op, callback) {
- callback();
- },
- el: this.editor,
-
- popup: BI.extend({
- type: "bi.single_select_search_add_pane",
- valueFormatter: o.valueFormatter,
- keywordGetter: function () {
- return self.editor.getValue();
- },
- itemsCreator: function (op, callback) {
- op.keyword = self.editor.getValue();
- this.setKeyword(op.keyword);
- o.itemsCreator(op, callback);
- }
- }, o.popup),
-
- adapter: o.adapter,
- masker: o.masker
- });
- this.searcher.on(BI.Searcher.EVENT_START, function () {
- self.fireEvent(BI.SingleSelectSearcher.EVENT_START);
- });
- this.searcher.on(BI.Searcher.EVENT_PAUSE, function () {
- if (this.hasMatched()) {
-
- }
- self.fireEvent(BI.SingleSelectSearcher.EVENT_PAUSE);
- });
- this.searcher.on(BI.Searcher.EVENT_STOP, function () {
- self.fireEvent(BI.SingleSelectSearcher.EVENT_STOP);
- });
- this.searcher.on(BI.Searcher.EVENT_CHANGE, function () {
- self.fireEvent(BI.SingleSelectSearcher.EVENT_CHANGE, arguments);
- });
- this.searcher.on(BI.Searcher.EVENT_SEARCHING, function () {
- var keywords = this.getKeywords();
- self.fireEvent(BI.SingleSelectSearcher.EVENT_SEARCHING, keywords);
- });
- },
-
- adjustView: function () {
- this.searcher.adjustView();
- },
-
- isSearching: function () {
- return this.searcher.isSearching();
- },
-
- stopSearch: function () {
- this.searcher.stopSearch();
- },
-
- getKeyword: function () {
- return this.editor.getValue();
- },
-
- hasMatched: function () {
- return this.searcher.hasMatched();
- },
-
- hasChecked: function () {
- return this.searcher.getView() && this.searcher.getView().hasChecked();
- },
-
- setAdapter: function (adapter) {
- this.searcher.setAdapter(adapter);
- },
-
- setState: function (v) {
- var o = this.options;
- v || (v = '');
- if (v === '') {
- this.editor.setState(BI.Selection.None);
- } else {
- this.editor.setState(o.valueFormatter(v + "") || (v + ''));
- }
- },
-
- setValue: function (ob) {
- this.setState(ob);
- this.searcher.setValue(ob);
- },
-
- getKey: function () {
- return this.editor.getValue();
- },
-
- getValue: function () {
- return this.searcher.getValue();
- },
-
- populate: function (items) {
- this.searcher.populate.apply(this.searcher, arguments);
- }
-});
-
-BI.SingleSelectSearcher.EVENT_BEFORE_POPUPVIEW = "EVENT_BEFORE_POPUPVIEW";
-BI.SingleSelectSearcher.EVENT_CHANGE = "EVENT_CHANGE";
-BI.SingleSelectSearcher.EVENT_START = "EVENT_START";
-BI.SingleSelectSearcher.EVENT_STOP = "EVENT_STOP";
-BI.SingleSelectSearcher.EVENT_PAUSE = "EVENT_PAUSE";
-BI.SingleSelectSearcher.EVENT_SEARCHING = "EVENT_SEARCHING";
-BI.shortcut('bi.single_select_add_searcher', BI.SingleSelectSearcher);/**
- * Created by User on 2017/11/16.
- */
-BI.SignTextEditor = BI.inherit(BI.Widget, {
- _defaultConfig: function () {
- var conf = BI.SignTextEditor.superclass._defaultConfig.apply(this, arguments);
- return BI.extend(conf, {
- baseCls: (conf.baseCls || "") + " bi-sign-initial-editor",
- hgap: 4,
- vgap: 2,
- lgap: 0,
- rgap: 0,
- tgap: 0,
- bgap: 0,
- validationChecker: BI.emptyFn,
- quitChecker: BI.emptyFn,
- allowBlank: true,
- watermark: "",
- errorText: "",
- text: "",
- height: 24
- })
- },
-
- _init: function () {
- BI.SignTextEditor.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.editor = BI.createWidget({
- type: "bi.editor",
- height: o.height,
- hgap: o.hgap,
- vgap: o.vgap,
- lgap: o.lgap,
- rgap: o.rgap,
- tgap: o.tgap,
- bgap: o.bgap,
- value: o.value,
- validationChecker: o.validationChecker,
- quitChecker: o.quitChecker,
- allowBlank: o.allowBlank,
- watermark: o.watermark,
- errorText: o.errorText
- });
- this.text = BI.createWidget({
- type: "bi.text_button",
- cls: "sign-editor-text",
- title: o.title,
- warningTitle: o.warningTitle,
- tipType: o.tipType,
- textAlign: "left",
- height: o.height,
- hgap: 4,
- handler: function () {
- self._showInput();
- self.editor.focus();
- self.editor.selectAll();
- }
- });
- this.text.on(BI.TextButton.EVENT_CHANGE, function () {
- BI.nextTick(function () {
- self.fireEvent(BI.SignTextEditor.EVENT_CLICK_LABEL)
- });
- });
- BI.createWidget({
- type: "bi.absolute",
- element: this,
- items: [{
- el: this.text,
- left: 0,
- right: 0,
- top: 0,
- bottom: 0
- }]
- });
- this.editor.on(BI.Controller.EVENT_CHANGE, function () {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
- this.editor.on(BI.Editor.EVENT_CONFIRM, function () {
- self._showHint();
- self._checkText();
- self.fireEvent(BI.SignTextEditor.EVENT_CONFIRM, arguments);
- });
- this.editor.on(BI.Editor.EVENT_ERROR, function () {
- self._checkText();
- });
- BI.createWidget({
- type: "bi.vertical",
- scrolly: false,
- element: this,
- items: [this.editor]
- });
- this._showHint();
- self._checkText();
- },
-
- _checkText: function () {
- var o = this.options;
- BI.nextTick(BI.bind(function () {
- if (this.editor.getValue() === "") {
- this.text.setValue(o.watermark || "");
- this.text.element.addClass("bi-water-mark");
- } else {
- var v = this.editor.getValue();
- v = (BI.isEmpty(v) || v == o.text) ? o.text : v + o.text;
- this.text.setValue(v);
- this.text.element.removeClass("bi-water-mark");
- }
- }, this));
- },
-
- _showInput: function () {
- this.editor.visible();
- this.text.invisible();
- },
-
- _showHint: function () {
- this.editor.invisible();
- this.text.visible();
- },
-
- setTitle: function (title) {
- this.text.setTitle(title);
- },
-
- setWarningTitle: function (title) {
- this.text.setWarningTitle(title);
- },
-
- focus: function () {
- this._showInput();
- this.editor.focus();
- },
-
- blur: function () {
- this.editor.blur();
- this._showHint();
- this._checkText();
- },
-
- doRedMark: function () {
- if (this.editor.getValue() === "" && BI.isKey(this.options.watermark)) {
- return;
- }
- this.text.doRedMark.apply(this.text, arguments);
- },
-
- unRedMark: function () {
- this.text.unRedMark.apply(this.text, arguments);
- },
-
- doHighLight: function () {
- if (this.editor.getValue() === "" && BI.isKey(this.options.watermark)) {
- return;
- }
- this.text.doHighLight.apply(this.text, arguments);
- },
-
- unHighLight: function () {
- this.text.unHighLight.apply(this.text, arguments);
- },
-
- isValid: function () {
- return this.editor.isValid();
- },
-
- setErrorText: function (text) {
- this.editor.setErrorText(text);
- },
-
- getErrorText: function () {
- return this.editor.getErrorText();
- },
-
- isEditing: function () {
- return this.editor.isEditing();
- },
-
- getLastValidValue: function () {
- return this.editor.getLastValidValue();
- },
-
- setValue: function (v) {
- this.editor.setValue(v);
- this._checkText();
- },
-
- getValue: function () {
- return this.editor.getValue();
- },
-
- getState: function () {
- return this.text.getValue();
- },
-
- setState: function (v) {
- var o = this.options;
- this._showHint();
- v = (BI.isEmpty(v) || v == o.text) ? o.text : v + o.text;
- this.text.setValue(v);
- }
-});
-BI.SignTextEditor.EVENT_CONFIRM = "EVENT_CONFIRM";
-BI.SignTextEditor.EVENT_CLICK_LABEL = "EVENT_CLICK_LABEL";
-
-BI.shortcut("bi.sign_text_editor", BI.SignTextEditor);/**
- * Created by zcf on 2016/9/22.
- */
-BI.SliderIconButton = BI.inherit(BI.Widget, {
- _defaultConfig: function () {
- return BI.extend(BI.SliderIconButton.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-single-slider-button"
- });
- },
- _init: function () {
- BI.extend(BI.SliderIconButton.superclass._init.apply(this, arguments));
- this.slider = BI.createWidget({
- type: "bi.icon_button",
- cls: "slider-icon slider-button",
- iconWidth: 14,
- iconHeight: 14,
- height: 14,
- width: 14
- });
- BI.createWidget({
- type: "bi.absolute",
- element: this,
- items: [{
- el: this.slider,
- top: 7,
- left: -7
- }],
- width: 0,
- height: 14
- });
- }
-});
-BI.shortcut("bi.single_slider_button", BI.SliderIconButton);/**
- * Created by zcf on 2016/9/22.
- */
-BI.SingleSlider = BI.inherit(BI.Widget, {
- _constant: {
- EDITOR_WIDTH: 90,
- EDITOR_HEIGHT: 30,
- SLIDER_WIDTH_HALF: 15,
- SLIDER_WIDTH: 30,
- SLIDER_HEIGHT: 30,
- TRACK_HEIGHT: 24
- },
- _defaultConfig: function () {
- return BI.extend(BI.SingleSlider.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-single-slider bi-slider-track",
- digit: false,
- unit: ""
- });
- },
- _init: function () {
- BI.SingleSlider.superclass._init.apply(this, arguments);
-
- var self = this, o = this.options;
- var c = this._constant;
- this.enable = false;
- this.value = "";
-
- this.grayTrack = BI.createWidget({
- type: "bi.layout",
- cls: "gray-track",
- height: 6
- });
- this.blueTrack = BI.createWidget({
- type: "bi.layout",
- cls: "blue-track bi-high-light-background",
- height: 6
- });
- this.track = this._createTrackWrapper();
-
- this.slider = BI.createWidget({
- type: "bi.single_slider_button"
- });
- this._draggable(this.slider);
- var sliderVertical = BI.createWidget({
- type: "bi.vertical",
- items: [{
- type: "bi.absolute",
- items: [this.slider]
- }],
- hgap: c.SLIDER_WIDTH_HALF,
- height: c.SLIDER_HEIGHT
- });
- sliderVertical.element.click(function (e) {
- if (self.enable) {
- var offset = e.clientX - self.element.offset().left - c.SLIDER_WIDTH_HALF;
- var trackLength = self.track.element[0].scrollWidth;
- var percent = 0;
- if (offset < 0) {
- percent = 0
- }
- if (offset > 0 && offset < (trackLength - c.SLIDER_WIDTH)) {
- percent = offset * 100 / self._getGrayTrackLength();
- }
- if (offset > (trackLength - c.SLIDER_WIDTH)) {
- percent = 100
- }
- var significantPercent = BI.parseFloat(percent.toFixed(1));
- self._setAllPosition(significantPercent);
- var v = self._getValueByPercent(significantPercent);
- v = o.digit === false ? v : v.toFixed(o.digit);
- self.label.setValue(v);
- self.value = v;
- self.fireEvent(BI.SingleSlider.EVENT_CHANGE);
- }
- });
- this.label = BI.createWidget({
- type: "bi.sign_text_editor",
- cls: "slider-editor-button",
- errorText: "",
- text: o.unit,
- width: c.EDITOR_WIDTH - 2,
- allowBlank: false,
- validationChecker: function (v) {
- return self._checkValidation(v);
- }
- });
- this.label.element.hover(function () {
- self.label.element.removeClass("bi-border").addClass("bi-border");
- }, function () {
- self.label.element.removeClass("bi-border");
- });
- this.label.on(BI.SignEditor.EVENT_CONFIRM, function () {
- var v = BI.parseFloat(this.getValue());
- var percent = self._getPercentByValue(v);
- var significantPercent = BI.parseFloat(percent.toFixed(1));
- self._setAllPosition(significantPercent);
- this.setValue(v);
- self.value = v;
- self.fireEvent(BI.SingleSlider.EVENT_CHANGE);
- });
- this._setVisible(false);
- BI.createWidget({
- type: "bi.absolute",
- element: this,
- items: [{
- el: {
- type: "bi.vertical",
- items: [{
- type: "bi.absolute",
- items: [{
- el: this.track,
- width: "100%",
- height: c.TRACK_HEIGHT
- }]
- }],
- hgap: 7,
- height: c.TRACK_HEIGHT
- },
- top: 23,
- left: 0,
- width: "100%"
- }, {
- el: sliderVertical,
- top: 20,
- left: 0,
- width: "100%"
- }, {
- el: {
- type: "bi.vertical",
- items: [{
- type: "bi.absolute",
- items: [this.label]
- }],
- rgap: c.EDITOR_WIDTH,
- height: c.EDITOR_HEIGHT
- },
- top: 0,
- left: 0,
- width: "100%"
- }]
- })
- },
-
- _draggable: function (widget) {
- var self = this, o = this.options;
- var startDrag = false;
- var size = 0, offset = 0, defaultSize = 0;
- var mouseMoveTracker = new BI.MouseMoveTracker(function (deltaX) {
- if (mouseMoveTracker.isDragging()) {
- startDrag = true;
- offset += deltaX;
- size = optimizeSize(defaultSize + offset);
- widget.element.addClass("dragging");
- var percent = size * 100 / (self._getGrayTrackLength());
- var significantPercent = BI.parseFloat(percent.toFixed(1));//直接对计算出来的百分数保留到小数点后一位,相当于分成了1000份。
- self._setBlueTrack(significantPercent);
- self._setLabelPosition(significantPercent);
- self._setSliderPosition(significantPercent);
- var v = self._getValueByPercent(significantPercent);
- v = o.digit === false ? v : v.toFixed(o.digit);
- self.label.setValue(v);
- self.value = v;
- self.fireEvent(BI.SingleSlider.EVENT_CHANGE);
- }
- }, function () {
- if (startDrag === true) {
- size = optimizeSize(size);
- var percent = size * 100 / (self._getGrayTrackLength());
- var significantPercent = BI.parseFloat(percent.toFixed(1));
- self._setSliderPosition(significantPercent);
- size = 0;
- offset = 0;
- defaultSize = size;
- startDrag = false;
- }
- widget.element.removeClass("dragging");
- mouseMoveTracker.releaseMouseMoves();
- self.fireEvent(BI.SingleSlider.EVENT_CHANGE);
- }, document);
- widget.element.on("mousedown", function (event) {
- if(!widget.isEnabled()){
- return;
- }
- defaultSize = this.offsetLeft;
- optimizeSize(defaultSize);
- mouseMoveTracker.captureMouseMoves(event);
- });
-
- function optimizeSize(s) {
- return BI.clamp(s, 0, self._getGrayTrackLength());
- }
- },
-
- _createTrackWrapper: function () {
- return BI.createWidget({
- type: "bi.absolute",
- items: [{
- el: {
- type: "bi.vertical",
- items: [{
- type: "bi.absolute",
- items: [{
- el: this.grayTrack,
- top: 0,
- left: 0,
- width: "100%"
- }, {
- el: this.blueTrack,
- top: 0,
- left: 0,
- width: "0%"
- }]
- }],
- hgap: 8,
- height: 8
- },
- top: 8,
- left: 0,
- width: "100%"
- }]
- })
- },
-
- _checkValidation: function (v) {
- var o = this.options;
- var valid = false;
- if (BI.isNumeric(v) && !(BI.isNull(v) || v < this.min || v > this.max)) {
- if(o.digit === false){
- valid = true;
- }else{
- var dotText = (v + "").split(".")[1] || "";
- valid = (dotText.length === o.digit);
- }
- }
- return valid;
- },
-
- _setBlueTrack: function (percent) {
- this.blueTrack.element.css({"width": percent + "%"});
- },
-
- _setLabelPosition: function (percent) {
- this.label.element.css({"left": percent + "%"});
- },
-
- _setSliderPosition: function (percent) {
- this.slider.element.css({"left": percent + "%"});
- },
-
- _setAllPosition: function (percent) {
- this._setSliderPosition(percent);
- this._setLabelPosition(percent);
- this._setBlueTrack(percent);
- },
-
- _setVisible: function (visible) {
- this.slider.setVisible(visible);
- this.label.setVisible(visible);
- },
-
- _getGrayTrackLength: function () {
- return this.grayTrack.element[0].scrollWidth
- },
-
- _getValueByPercent: function (percent) {
- var thousandth = BI.parseInt(percent * 10);
- return (((this.max - this.min) * thousandth) / 1000 + this.min);
- },
-
- _getPercentByValue: function (v) {
- return (v - this.min) * 100 / (this.max - this.min);
- },
-
- getValue: function () {
- return this.value;
- },
-
- setValue: function (v) {
- var o = this.options;
- v = BI.parseFloat(v);
- v = o.digit === false ? v : v.toFixed(o.digit);
- if ((!isNaN(v))) {
- if (this._checkValidation(v)) {
- this.value = v;
- }
- if (v > this.max) {
- this.value = this.max;
- }
- if (v < this.min) {
- this.value = this.min;
- }
- }
- },
-
- setMinAndMax: function (v) {
- var minNumber = BI.parseFloat(v.min);
- var maxNumber = BI.parseFloat(v.max);
- if ((!isNaN(minNumber)) && (!isNaN(maxNumber)) && (maxNumber > minNumber )) {
- this.min = minNumber;
- this.max = maxNumber;
- }
- },
-
- reset: function () {
- this._setVisible(false);
- this.enable = false;
- this.value = "";
- this.min = 0;
- this.max = 0;
- this._setBlueTrack(0);
-
- },
-
- populate: function () {
- if (!isNaN(this.min) && !isNaN(this.max)) {
- this._setVisible(true);
- this.enable = true;
- this.label.setErrorText(BI.i18nText("BI-Please_Enter") + this.min + "-" + this.max + BI.i18nText("BI-Basic_De") + BI.i18nText("BI-Basic_Number"));
- if (BI.isNumeric(this.value) || BI.isNotEmptyString(this.value)) {
- this.label.setValue(this.value);
- this._setAllPosition(this._getPercentByValue(this.value));
- } else {
- this.label.setValue(this.max);
- this._setAllPosition(100);
- }
- }
- }
-});
-BI.SingleSlider.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut("bi.single_slider", BI.SingleSlider);/**
- * Created by Urthur on 2017/9/12.
- */
-BI.SingleSliderLabel = BI.inherit(BI.Widget, {
- _constant: {
- EDITOR_WIDTH: 90,
- EDITOR_HEIGHT: 20,
- HEIGHT: 20,
- SLIDER_WIDTH_HALF: 15,
- SLIDER_WIDTH: 30,
- SLIDER_HEIGHT: 30,
- TRACK_HEIGHT: 24
- },
- _defaultConfig: function () {
- return BI.extend(BI.SingleSliderLabel.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-single-slider-label bi-slider-track",
- digit: false,
- unit: ""
- });
- },
- _init: function () {
- BI.SingleSliderLabel.superclass._init.apply(this, arguments);
-
- var self = this, o = this.options;
- var c = this._constant;
- this.enable = false;
- this.value = "";
-
- this.grayTrack = BI.createWidget({
- type: "bi.layout",
- cls: "gray-track",
- height: 6
- });
- this.blueTrack = BI.createWidget({
- type: "bi.layout",
- cls: "blue-track bi-high-light-background",
- height: 6
- });
- this.track = this._createTrackWrapper();
-
- this.slider = BI.createWidget({
- type: "bi.single_slider_button"
- });
- this._draggable(this.slider);
- var sliderVertical = BI.createWidget({
- type: "bi.vertical",
- items: [{
- type: "bi.absolute",
- items: [this.slider]
- }],
- hgap: c.SLIDER_WIDTH_HALF,
- height: c.SLIDER_HEIGHT
- });
- sliderVertical.element.click(function (e) {
- if (self.enable) {
- var offset = e.clientX - self.element.offset().left - c.SLIDER_WIDTH_HALF;
- var trackLength = self.track.element[0].scrollWidth;
- var percent = 0;
- if (offset < 0) {
- percent = 0
- }
- if (offset > 0 && offset < (trackLength - c.SLIDER_WIDTH)) {
- percent = offset * 100 / self._getGrayTrackLength();
- }
- if (offset > (trackLength - c.SLIDER_WIDTH)) {
- percent = 100
- }
- var significantPercent = BI.parseFloat(percent.toFixed(1));
- self._setAllPosition(significantPercent);
- var v = self._getValueByPercent(significantPercent);
- v = o.digit === false ? v : v.toFixed(o.digit);
- self.label.setText(v + o.unit);
- self.value = v;
- self.fireEvent(BI.SingleSliderLabel.EVENT_CHANGE);
- }
- });
- this.label = BI.createWidget({
- type: "bi.label",
- height: c.HEIGHT,
- width: c.EDITOR_WIDTH - 2
- });
-
- this._setVisible(false);
- BI.createWidget({
- type: "bi.absolute",
- element: this,
- items: [{
- el: {
- type: "bi.vertical",
- items: [{
- type: "bi.absolute",
- items: [{
- el: this.track,
- width: "100%",
- height: c.TRACK_HEIGHT
- }]
- }],
- hgap: 7,
- height: c.TRACK_HEIGHT
- },
- top: 13,
- left: 0,
- width: "100%"
- }, {
- el: sliderVertical,
- top: 10,
- left: 0,
- width: "100%"
- }, {
- el: {
- type: "bi.vertical",
- items: [{
- type: "bi.absolute",
- items: [this.label]
- }],
- rgap: c.EDITOR_WIDTH,
- height: c.EDITOR_HEIGHT
- },
- top: 0,
- left: 0,
- width: "100%"
- }]
- })
- },
-
- _draggable: function (widget) {
- var self = this, o = this.options;
- var startDrag = false;
- var size = 0, offset = 0, defaultSize = 0;
- var mouseMoveTracker = new BI.MouseMoveTracker(function (deltaX) {
- if (mouseMoveTracker.isDragging()) {
- startDrag = true;
- offset += deltaX;
- size = optimizeSize(defaultSize + offset);
- widget.element.addClass("dragging");
- var percent = size * 100 / (self._getGrayTrackLength());
- var significantPercent = BI.parseFloat(percent.toFixed(1));//直接对计算出来的百分数保留到小数点后一位,相当于分成了1000份。
- self._setBlueTrack(significantPercent);
- self._setLabelPosition(significantPercent);
- self._setSliderPosition(significantPercent);
- var v = self._getValueByPercent(significantPercent);
- v = o.digit === false ? v : v.toFixed(o.digit);
- self.label.setValue(v);
- self.value = v;
- self.fireEvent(BI.SingleSliderLabel.EVENT_CHANGE);
- }
- }, function () {
- if (startDrag === true) {
- size = optimizeSize(size);
- var percent = size * 100 / (self._getGrayTrackLength());
- var significantPercent = BI.parseFloat(percent.toFixed(1));
- self._setSliderPosition(significantPercent);
- size = 0;
- offset = 0;
- defaultSize = size;
- startDrag = false;
- }
- widget.element.removeClass("dragging");
- mouseMoveTracker.releaseMouseMoves();
- self.fireEvent(BI.SingleSliderLabel.EVENT_CHANGE);
- }, document);
- widget.element.on("mousedown", function (event) {
- if(!widget.isEnabled()){
- return;
- }
- defaultSize = this.offsetLeft;
- optimizeSize(defaultSize);
- mouseMoveTracker.captureMouseMoves(event);
- });
-
- function optimizeSize(s) {
- return BI.clamp(s, 0, self._getGrayTrackLength());
- }
- },
-
- _createTrackWrapper: function () {
- return BI.createWidget({
- type: "bi.absolute",
- items: [{
- el: {
- type: "bi.vertical",
- items: [{
- type: "bi.absolute",
- items: [{
- el: this.grayTrack,
- top: 0,
- left: 0,
- width: "100%"
- }, {
- el: this.blueTrack,
- top: 0,
- left: 0,
- width: "0%"
- }]
- }],
- hgap: 8,
- height: 8
- },
- top: 8,
- left: 0,
- width: "100%"
- }]
- })
- },
-
- _checkValidation: function (v) {
- return BI.isNumeric(v) && !(BI.isNull(v) || v < this.min || v > this.max)
- },
-
- _setBlueTrack: function (percent) {
- this.blueTrack.element.css({"width": percent + "%"});
- },
-
- _setLabelPosition: function (percent) {
- this.label.element.css({"left": percent + "%"});
- },
-
- _setSliderPosition: function (percent) {
- this.slider.element.css({"left": percent + "%"});
- },
-
- _setAllPosition: function (percent) {
- this._setSliderPosition(percent);
- this._setLabelPosition(percent);
- this._setBlueTrack(percent);
- },
-
- _setVisible: function (visible) {
- this.slider.setVisible(visible);
- this.label.setVisible(visible);
- },
-
- _getGrayTrackLength: function () {
- return this.grayTrack.element[0].scrollWidth
- },
-
- _getValueByPercent: function (percent) {
- var thousandth = BI.parseInt(percent * 10);
- return (((this.max - this.min) * thousandth) / 1000 + this.min);
- },
-
- _getPercentByValue: function (v) {
- return (v - this.min) * 100 / (this.max - this.min);
- },
-
- getValue: function () {
- return this.value;
- },
-
- setValue: function (v) {
- var o = this.options;
- v = BI.parseFloat(v);
- v = o.digit === false ? v : v.toFixed(o.digit);
- if ((!isNaN(v))) {
- if (this._checkValidation(v)) {
- this.value = v;
- }
- if (v > this.max) {
- this.value = this.max;
- }
- if (v < this.min) {
- this.value = this.min;
- }
- }
- },
-
- setMinAndMax: function (v) {
- var minNumber = BI.parseFloat(v.min);
- var maxNumber = BI.parseFloat(v.max);
- if ((!isNaN(minNumber)) && (!isNaN(maxNumber)) && (maxNumber > minNumber )) {
- this.min = minNumber;
- this.max = maxNumber;
- }
- },
-
- reset: function () {
- this._setVisible(false);
- this.enable = false;
- this.value = "";
- this.min = 0;
- this.max = 0;
- this._setBlueTrack(0);
- },
-
- populate: function () {
- var o = this.options;
- if (!isNaN(this.min) && !isNaN(this.max)) {
- this._setVisible(true);
- this.enable = true;
- if (BI.isNumeric(this.value) || BI.isNotEmptyString(this.value)) {
- this.label.setValue(this.value + o.unit);
- this._setAllPosition(this._getPercentByValue(this.value));
- } else {
- this.label.setValue(this.max + o.unit);
- this._setAllPosition(100);
- }
- }
- }
-});
-BI.SingleSliderLabel.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut("bi.single_slider_label", BI.SingleSliderLabel);/**
- * normal single slider
- * Created by Young on 2017/6/21.
- */
-BI.SingleSliderNormal = BI.inherit(BI.Widget, {
-
- _constant: {
- HEIGHT: 28,
- SLIDER_WIDTH_HALF: 15,
- SLIDER_WIDTH: 30,
- SLIDER_HEIGHT: 30,
- TRACK_HEIGHT: 24
- },
-
- props: {
- baseCls: "bi-single-slider-normal bi-slider-track",
- minMax: {
- min: 0,
- max: 100
- }
- // color: "#3f8ce8"
- },
-
- render: function () {
- var self = this;
- var c = this._constant;
- var track = this._createTrack();
- this.slider = BI.createWidget({
- type: "bi.single_slider_button"
- });
- this._draggable(this.slider);
-
- var sliderVertical = BI.createWidget({
- type: "bi.vertical",
- items: [{
- type: "bi.absolute",
- items: [this.slider]
- }],
- hgap: c.SLIDER_WIDTH_HALF,
- height: c.SLIDER_HEIGHT
- });
- sliderVertical.element.click(function (e) {
- if (self.enable) {
- var offset = e.clientX - self.element.offset().left - c.SLIDER_WIDTH_HALF;
- var trackLength = self.track.element[0].scrollWidth;
- var percent = 0;
- if (offset < 0) {
- percent = 0
- }
- if (offset > 0 && offset < (trackLength - c.SLIDER_WIDTH)) {
- percent = offset * 100 / self._getGrayTrackLength();
- }
- if (offset > (trackLength - c.SLIDER_WIDTH)) {
- percent = 100
- }
- var significantPercent = BI.parseFloat(percent.toFixed(1));
- self._setAllPosition(significantPercent);
- var v = self._getValueByPercent(significantPercent);
- self.value = v;
- self.fireEvent(BI.SingleSlider.EVENT_CHANGE);
- }
- });
-
- return {
- type: "bi.absolute",
- element: this,
- items: [{
- el: {
- type: "bi.vertical",
- items: [{
- type: "bi.absolute",
- items: [{
- el: track,
- width: "100%",
- height: c.TRACK_HEIGHT
- }]
- }],
- hgap: 7,
- height: c.TRACK_HEIGHT
- },
- top: 3,
- left: 0,
- width: "100%"
- }, {
- el: sliderVertical,
- top: 0,
- left: 0,
- width: "100%"
- }]
- }
- },
-
- _draggable: function (widget) {
- var self = this, o = this.options;
- var startDrag = false;
- var size = 0, offset = 0, defaultSize = 0;
- var mouseMoveTracker = new BI.MouseMoveTracker(function (deltaX) {
- if (mouseMoveTracker.isDragging()) {
- startDrag = true;
- offset += deltaX;
- size = optimizeSize(defaultSize + offset);
- widget.element.addClass("dragging");
- var percent = size * 100 / (self._getGrayTrackLength());
- var significantPercent = BI.parseFloat(percent.toFixed(1));//直接对计算出来的百分数保留到小数点后一位,相当于分成了1000份。
- self._setBlueTrack(significantPercent);
- self._setSliderPosition(significantPercent);
- var v = self._getValueByPercent(significantPercent);
- v = o.digit === false ? v : v.toFixed(o.digit);
- self.value = v;
- self.fireEvent(BI.SingleSliderNormal.EVENT_DRAG, v);
- }
- }, function () {
- if (startDrag === true) {
- size = optimizeSize(size);
- var percent = size * 100 / (self._getGrayTrackLength());
- var significantPercent = BI.parseFloat(percent.toFixed(1));
- self._setSliderPosition(significantPercent);
- size = 0;
- offset = 0;
- defaultSize = size;
- startDrag = false;
- }
- widget.element.removeClass("dragging");
- mouseMoveTracker.releaseMouseMoves();
- self.fireEvent(BI.SingleSlider.EVENT_CHANGE);
- }, document);
- widget.element.on("mousedown", function (event) {
- if(!widget.isEnabled()){
- return;
- }
- defaultSize = this.offsetLeft;
- optimizeSize(defaultSize);
- mouseMoveTracker.captureMouseMoves(event);
- });
-
- function optimizeSize(s) {
- return BI.clamp(s, 0, self._getGrayTrackLength());
- }
- },
-
- _createTrack: function () {
- var self = this;
- var c = this._constant;
- this.grayTrack = BI.createWidget({
- type: "bi.layout",
- cls: "gray-track",
- height: 6
- });
- this.blueTrack = BI.createWidget({
- type: "bi.layout",
- cls: "blue-track bi-high-light-background",
- height: 6
- });
- if (this.options.color) {
- this.blueTrack.element.css({"background-color": this.options.color});
- }
-
- return {
- type: "bi.absolute",
- items: [{
- el: {
- type: "bi.vertical",
- items: [{
- type: "bi.absolute",
- items: [{
- el: this.grayTrack,
- top: 0,
- left: 0,
- width: "100%"
- }, {
- el: this.blueTrack,
- top: 0,
- left: 0,
- width: "0%"
- }]
- }],
- hgap: 8,
- height: 8
- },
- top: 8,
- left: 0,
- width: "100%"
- }],
- ref: function (ref) {
- self.track = ref;
- }
- }
- },
-
- _checkValidation: function (v) {
- return !(BI.isNull(v) || v < this.min || v > this.max)
- },
-
- _setBlueTrack: function (percent) {
- this.blueTrack.element.css({"width": percent + "%"});
- },
-
- _setSliderPosition: function (percent) {
- this.slider.element.css({"left": percent + "%"});
- },
-
- _setAllPosition: function (percent) {
- this._setSliderPosition(percent);
- this._setBlueTrack(percent);
- },
-
- _setVisible: function (visible) {
- this.slider.setVisible(visible);
- },
-
- _getGrayTrackLength: function () {
- return this.grayTrack.element[0].scrollWidth
- },
-
- _getValueByPercent: function (percent) {
- var thousandth = BI.parseInt(percent * 10);
- return (((this.max - this.min) * thousandth) / 1000 + this.min);
- },
-
- _getPercentByValue: function (v) {
- return (v - this.min) * 100 / (this.max - this.min);
- },
-
- getValue: function () {
- return this.value;
- },
-
- setValue: function (v) {
- var value = BI.parseFloat(v);
- if ((!isNaN(value))) {
- if (this._checkValidation(value)) {
- this.value = value;
- }
- if (value > this.max) {
- this.value = this.max;
- }
- if (value < this.min) {
- this.value = this.min;
- }
- }
- },
-
- setMinAndMax: function (v) {
- var minNumber = BI.parseFloat(v.min);
- var maxNumber = BI.parseFloat(v.max);
- if ((!isNaN(minNumber)) && (!isNaN(maxNumber)) && (maxNumber > minNumber )) {
- this.min = minNumber;
- this.max = maxNumber;
- }
- },
-
- reset: function () {
- this._setVisible(false);
- this.enable = false;
- this.value = "";
- this.min = 0;
- this.max = 0;
- this._setBlueTrack(0);
- },
-
- populate: function () {
- if (!isNaN(this.min) && !isNaN(this.max)) {
- this._setVisible(true);
- this.enable = true;
- if (BI.isNumeric(this.value) || BI.isNotEmptyString(this.value)) {
- this._setAllPosition(this._getPercentByValue(this.value));
- } else {
- this._setAllPosition(100);
- }
- }
- }
-});
-BI.SingleSliderNormal.EVENT_DRAG = "EVENT_DRAG";
-BI.shortcut("bi.single_slider_normal", BI.SingleSliderNormal);/**
- * @class BI.SingleTreeCombo
- * @extends BI.Widget
- */
-BI.SingleTreeCombo = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.SingleTreeCombo.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-single-tree-combo",
- trigger: {},
- height: 24,
- text: "",
- items: []
- });
- },
-
- _init: function () {
- BI.SingleTreeCombo.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
-
- this.trigger = BI.createWidget(BI.extend({
- type: "bi.single_tree_trigger",
- text: o.text,
- height: o.height,
- items: o.items
- }, o.trigger));
-
- this.popup = BI.createWidget({
- type: "bi.single_level_tree",
- items: o.items
- });
-
- this.combo = BI.createWidget({
- type: "bi.combo",
- element: this,
- adjustLength: 2,
- el: this.trigger,
- popup: {
- el: this.popup
- }
- });
-
- this.combo.on(BI.Controller.EVENT_CHANGE, function () {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
- this.combo.on(BI.Combo.EVENT_BEFORE_POPUPVIEW, function () {
- self.fireEvent(BI.SingleTreeCombo.EVENT_BEFORE_POPUPVIEW, arguments);
- });
-
- this.popup.on(BI.SingleTreePopup.EVENT_CHANGE, function () {
- self.setValue(self.popup.getValue());
- self.combo.hideView();
- self.fireEvent(BI.SingleTreeCombo.EVENT_CHANGE);
- });
- },
-
- populate: function (items) {
- this.combo.populate(items);
- },
-
- setValue: function (v) {
- v = BI.isArray(v) ? v : [v];
- this.trigger.setValue(v);
- this.popup.setValue(v);
- },
-
- getValue: function () {
- return this.popup.getValue();
- }
-});
-
-BI.SingleTreeCombo.EVENT_CHANGE = "SingleTreeCombo.EVENT_CHANGE";
-BI.SingleTreeCombo.EVENT_BEFORE_POPUPVIEW = "EVENT_BEFORE_POPUPVIEW";
-BI.shortcut("bi.single_tree_combo", BI.SingleTreeCombo);/**
- * @class BI.SingleTreePopup
- * @extends BI.Pane
- */
-
-BI.SingleTreePopup = BI.inherit(BI.Pane, {
-
- _defaultConfig: function () {
- return BI.extend(BI.SingleTreePopup.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-single-level-tree",
- tipText: BI.i18nText("BI-No_Selected_Item"),
- items: []
- });
- },
-
- _init: function () {
- BI.SingleTreePopup.superclass._init.apply(this, arguments);
-
- var self = this, o = this.options;
-
- this.tree = BI.createWidget({
- type: 'bi.level_tree',
- expander: {
- isDefaultInit: true
- },
- items: o.items,
- chooseType: BI.Selection.Single
- });
-
- BI.createWidget({
- type: "bi.vertical",
- element: this,
- items: [this.tree]
- });
-
- this.tree.on(BI.Controller.EVENT_CHANGE, function () {
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- });
-
- this.tree.on(BI.LevelTree.EVENT_CHANGE, function () {
- self.fireEvent(BI.SingleTreePopup.EVENT_CHANGE);
- });
-
- this.check();
- },
-
- getValue: function () {
- return this.tree.getValue();
- },
-
- setValue: function (v) {
- v = BI.isArray(v) ? v : [v];
- this.tree.setValue(v);
- },
-
- populate: function (items) {
- BI.SingleTreePopup.superclass.populate.apply(this, arguments);
- this.tree.populate(items);
- }
-});
-
-BI.SingleTreePopup.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut("bi.single_level_tree", BI.SingleTreePopup);/**
- * @class BI.SingleTreeTrigger
- * @extends BI.Trigger
- */
-
-BI.SingleTreeTrigger = BI.inherit(BI.Trigger, {
-
- _defaultConfig: function () {
- return BI.extend(BI.SingleTreeTrigger.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-single-tree-trigger",
- height: 24,
- text: "",
- items: []
- });
- },
-
- _init: function () {
- BI.SingleTreeTrigger.superclass._init.apply(this, arguments);
-
- var self = this, o = this.options;
-
- this.trigger = BI.createWidget({
- type: "bi.select_text_trigger",
- element: this,
- text: o.text,
- items: o.items,
- height: o.height
- });
- },
-
- _checkTitle: function () {
- var self = this, val = this.getValue();
- BI.any(this.options.items, function (i, item) {
- if (val.contains(item.value)) {
- self.trigger.setTitle(item.text || item.value);
- return true;
- }
- });
- },
-
- setValue: function (v) {
- v = BI.isArray(v) ? v : [v];
- this.options.value = v;
- this.trigger.setValue(v);
- this._checkTitle();
- },
-
- getValue: function () {
- return this.options.value || [];
- },
-
- populate: function (items) {
- BI.SingleTreeTrigger.superclass.populate.apply(this, arguments);
- this.trigger.populate(items);
- }
-
-});
-
-BI.shortcut("bi.single_tree_trigger", BI.SingleTreeTrigger);/**
- * 可以单选多选切换的树
- *
- * Created by GUY on 2015/12/21.
- * @class BI.SwitchTree
- * @extends BI.Widget
- */
-BI.SwitchTree = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.SwitchTree.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-switch-tree",
- items: []
- });
- },
-
- _init: function () {
- BI.SwitchTree.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.tab = BI.createWidget({
- type: "bi.tab",
- element: this,
- tab: null,
- defaultShowIndex: BI.SwitchTree.SelectType.SingleSelect,
- cardCreator: BI.bind(this._createTree, this)
- });
- },
-
- _createTree: function (type) {
- var self = this, o = this.options;
- switch (type) {
- case BI.SwitchTree.SelectType.SingleSelect:
- this.levelTree = BI.createWidget({
- type: "bi.multilayer_single_level_tree",
- isDefaultInit: true,
- items: BI.deepClone(o.items)
- });
- this.levelTree.on(BI.LevelTree.EVENT_CHANGE, function () {
- self.fireEvent(BI.SwitchTree.EVENT_CHANGE, arguments);
- });
- return this.levelTree;
- case BI.SwitchTree.SelectType.MultiSelect:
- this.tree = BI.createWidget({
- type: "bi.simple_tree",
- items: this._removeIsParent(BI.deepClone(o.items))
- });
- this.tree.on(BI.SimpleTreeView.EVENT_CHANGE, function () {
- self.fireEvent(BI.SwitchTree.EVENT_CHANGE, arguments);
- });
- return this.tree;
- }
- },
-
- _removeIsParent: function(items) {
- BI.each(items, function(i, item) {
- BI.isNotNull(item.isParent) && delete item.isParent;
- });
- return items;
- },
-
- switchSelect: function () {
- switch (this.getSelect()) {
- case BI.SwitchTree.SelectType.SingleSelect:
- this.setSelect(BI.SwitchTree.SelectType.MultiSelect);
- break;
- case BI.SwitchTree.SelectType.MultiSelect:
- this.setSelect(BI.SwitchTree.SelectType.SingleSelect);
- break;
- }
- },
-
- setSelect: function (v) {
- this.tab.setSelect(v);
- },
-
- getSelect: function () {
- return this.tab.getSelect();
- },
-
- setValue: function (v) {
- this.storeValue = v;
- switch (this.getSelect()) {
- case BI.SwitchTree.SelectType.SingleSelect:
- this.levelTree.setValue(v);
- break;
- case BI.SwitchTree.SelectType.MultiSelect:
- this.tree.setValue(v);
- break;
- }
- },
-
- getValue: function () {
- return this.tab.getValue();
- },
-
- populate: function (items) {
- this.options.items = items;
- if (BI.isNotNull(this.levelTree)) {
- this.levelTree.populate(BI.deepClone(items));
- }
- if (BI.isNotNull(this.tree)) {
- this.tree.populate(this._removeIsParent(BI.deepClone(items)));
- }
- }
-});
-BI.SwitchTree.EVENT_CHANGE = "SwitchTree.EVENT_CHANGE";
-BI.SwitchTree.SelectType = {
- SingleSelect: BI.Selection.Single,
- MultiSelect: BI.Selection.Multi
-};
-BI.shortcut('bi.switch_tree', BI.SwitchTree);
-/**
- * Created by Baron on 2015/10/19.
- */
-BI.TimeInterval = BI.inherit(BI.Single, {
- constants: {
- height: 25,
- width: 25,
- lgap: 15,
- offset: -15,
- timeErrorCls: "time-error",
- DATE_MIN_VALUE: "1900-01-01",
- DATE_MAX_VALUE: "2099-12-31"
- },
- _defaultConfig: function () {
- var conf = BI.TimeInterval.superclass._defaultConfig.apply(this, arguments);
- return BI.extend(conf, {
- extraCls: "bi-time-interval"
- })
- },
- _init: function () {
- var self = this;
- BI.TimeInterval.superclass._init.apply(this, arguments);
-
- this.left = this._createCombo();
- this.right = this._createCombo();
- this.label = BI.createWidget({
- type: 'bi.label',
- height: this.constants.height,
- width: this.constants.width,
- text: "-"
- });
- BI.createWidget({
- element: self,
- type: "bi.center",
- hgap: 15,
- height: this.constants.height,
- items: [{
- type: "bi.absolute",
- items: [{
- el: self.left,
- left: this.constants.offset,
- right: 0,
- top: 0,
- bottom: 0
- }]
- }, {
- type: "bi.absolute",
- items: [{
- el: self.right,
- left: 0,
- right: this.constants.offset,
- top: 0,
- bottom: 0
- }]
- }]
- });
- BI.createWidget({
- type: "bi.horizontal_auto",
- element: this,
- items: [
- self.label
- ]
- });
- },
-
- _createCombo: function () {
- var self = this;
- var combo = BI.createWidget({
- type: 'bi.multidate_combo'
- });
- combo.on(BI.MultiDateCombo.EVENT_ERROR, function () {
- self._clearTitle();
- self.element.removeClass(self.constants.timeErrorCls);
- self.fireEvent(BI.TimeInterval.EVENT_ERROR);
- });
-
- combo.on(BI.MultiDateCombo.EVENT_VALID, function(){
- BI.Bubbles.hide("error");
- var smallDate = self.left.getKey(), bigDate = self.right.getKey();
- if (self._check(smallDate, bigDate) && self._compare(smallDate, bigDate)) {
- self._setTitle(BI.i18nText("BI-Time_Interval_Error_Text"));
- self.element.addClass(self.constants.timeErrorCls);
- BI.Bubbles.show("error", BI.i18nText("BI-Time_Interval_Error_Text"), self, {
- offsetStyle: "center"
- });
- self.fireEvent(BI.TimeInterval.EVENT_ERROR);
- } else {
- self._clearTitle();
- self.element.removeClass(self.constants.timeErrorCls);
- }
- });
-
- combo.on(BI.MultiDateCombo.EVENT_FOCUS, function(){
- BI.Bubbles.hide("error");
- var smallDate = self.left.getKey(), bigDate = self.right.getKey();
- if (self._check(smallDate, bigDate) && self._compare(smallDate, bigDate)) {
- self._setTitle(BI.i18nText("BI-Time_Interval_Error_Text"));
- self.element.addClass(self.constants.timeErrorCls);
- BI.Bubbles.show("error", BI.i18nText("BI-Time_Interval_Error_Text"), self, {
- offsetStyle: "center"
- });
- self.fireEvent(BI.TimeInterval.EVENT_ERROR);
- } else {
- self._clearTitle();
- self.element.removeClass(self.constants.timeErrorCls);
- }
- });
-
- combo.on(BI.MultiDateCombo.EVENT_BEFORE_POPUPVIEW, function () {
- self.left.hidePopupView();
- self.right.hidePopupView();
- });
- //combo.on(BI.MultiDateCombo.EVENT_CHANGE, function () {
- // BI.Bubbles.hide("error");
- // var smallDate = self.left.getKey(), bigDate = self.right.getKey();
- // if (self._check(smallDate, bigDate) && self._compare(smallDate, bigDate)) {
- // self._setTitle(BI.i18nText("BI-Time_Interval_Error_Text"));
- // self.element.addClass(self.constants.timeErrorCls);
- // BI.Bubbles.show("error", BI.i18nText("BI-Time_Interval_Error_Text"), self, {
- // offsetStyle: "center"
- // });
- // self.fireEvent(BI.TimeInterval.EVENT_ERROR);
- // } else {
- // self._clearTitle();
- // self.element.removeClass(self.constants.timeErrorCls);
- // }
- //});
-
- combo.on(BI.MultiDateCombo.EVENT_CONFIRM, function(){
- BI.Bubbles.hide("error");
- var smallDate = self.left.getKey(), bigDate = self.right.getKey();
- if (self._check(smallDate, bigDate) && self._compare(smallDate, bigDate)) {
- self._setTitle(BI.i18nText("BI-Time_Interval_Error_Text"));
- self.element.addClass(self.constants.timeErrorCls);
- self.fireEvent(BI.TimeInterval.EVENT_ERROR);
- }else{
- self._clearTitle();
- self.element.removeClass(self.constants.timeErrorCls);
- self.fireEvent(BI.TimeInterval.EVENT_CHANGE);
- }
- });
- return combo;
- },
- _dateCheck: function (date) {
- return Date.parseDateTime(date, "%Y-%x-%d").print("%Y-%x-%d") == date || Date.parseDateTime(date, "%Y-%X-%d").print("%Y-%X-%d") == date || Date.parseDateTime(date, "%Y-%x-%e").print("%Y-%x-%e") == date || Date.parseDateTime(date, "%Y-%X-%e").print("%Y-%X-%e") == date;
- },
- _checkVoid: function (obj) {
- return !Date.checkVoid(obj.year, obj.month, obj.day, this.constants.DATE_MIN_VALUE, this.constants.DATE_MAX_VALUE)[0];
- },
- _check: function (smallDate, bigDate) {
- var smallObj = smallDate.match(/\d+/g), bigObj = bigDate.match(/\d+/g);
- return this._dateCheck(smallDate) && Date.checkLegal(smallDate) && this._checkVoid({
- year: smallObj[0],
- month: smallObj[1],
- day: smallObj[2]
- }) && this._dateCheck(bigDate) && Date.checkLegal(bigDate) && this._checkVoid({
- year: bigObj[0],
- month: bigObj[1],
- day: bigObj[2]
- });
- },
- _compare: function (smallDate, bigDate) {
- smallDate = Date.parseDateTime(smallDate, "%Y-%X-%d").print("%Y-%X-%d");
- bigDate = Date.parseDateTime(bigDate, "%Y-%X-%d").print("%Y-%X-%d");
- return BI.isNotNull(smallDate) && BI.isNotNull(bigDate) && smallDate > bigDate;
- },
- _setTitle: function (v) {
- this.left.setTitle(v);
- this.right.setTitle(v);
- this.label.setTitle(v);
- },
- _clearTitle: function () {
- this.left.setTitle("");
- this.right.setTitle("");
- this.label.setTitle("");
- },
- setValue: function (date) {
- date = date || {};
- this.left.setValue(date.start);
- this.right.setValue(date.end);
- },
- getValue: function () {
- return {start: this.left.getValue(), end: this.right.getValue()};
- }
-});
-BI.TimeInterval.EVENT_VALID = "EVENT_VALID";
-BI.TimeInterval.EVENT_ERROR = "EVENT_ERROR";
-BI.TimeInterval.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut("bi.time_interval", BI.TimeInterval);/**
- * 年份下拉框
- *
- * Created by GUY on 2015/8/28.
- * @class BI.YearCombo
- * @extends BI.Widget
- */
-BI.YearCombo = BI.inherit(BI.Widget, {
- _defaultConfig: function () {
- return BI.extend(BI.YearCombo.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-year-combo",
- behaviors: {},
- min: '1900-01-01', //最小日期
- max: '2099-12-31', //最大日期
- height: 25
- });
- },
- _init: function () {
- BI.YearCombo.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.storeValue = "";
- this.trigger = BI.createWidget({
- type: "bi.year_trigger",
- min: o.min,
- max: o.max
- });
- this.trigger.on(BI.YearTrigger.EVENT_FOCUS, function () {
- self.storeValue = this.getKey();
- });
- this.trigger.on(BI.YearTrigger.EVENT_START, function () {
- self.combo.isViewVisible() && self.combo.hideView();
- });
- this.trigger.on(BI.YearTrigger.EVENT_STOP, function () {
- self.combo.showView();
- });
- this.trigger.on(BI.YearTrigger.EVENT_ERROR, function () {
- self.combo.isViewVisible() && self.combo.hideView();
- });
- this.trigger.on(BI.YearTrigger.EVENT_CONFIRM, function () {
- if (self.combo.isViewVisible()) {
- return;
- }
- if (this.getKey() && this.getKey() !== self.storeValue) {
- self.setValue(this.getKey());
- } else if (!this.getKey()) {
- self.setValue();
- }
- self.fireEvent(BI.YearCombo.EVENT_CONFIRM);
- });
-
- this.combo = BI.createWidget({
- type: "bi.combo",
- element: this,
- destroyWhenHide: true,
- isNeedAdjustHeight: false,
- isNeedAdjustWidth: false,
- el: this.trigger,
- popup: {
- minWidth: 85,
- stopPropagation: false,
- el: {
- type: "bi.year_popup",
- ref: function () {
- self.popup = this;
- },
- listeners: [{
- eventName: BI.YearPopup.EVENT_CHANGE,
- action: function () {
- self.setValue(self.popup.getValue());
- self.combo.hideView();
- self.fireEvent(BI.YearCombo.EVENT_CONFIRM);
- }
- }],
- behaviors: o.behaviors,
- min: o.min,
- max: o.max
- }
- }
- });
- this.combo.on(BI.Combo.EVENT_BEFORE_POPUPVIEW, function () {
- var value = self.trigger.getKey();
- if (BI.isNotNull(value)) {
- self.popup.setValue(value);
- } else if (!value && value !== self.storeValue) {
- self.popup.setValue(self.storeValue);
- } else {
- self.setValue();
- }
- self.fireEvent(BI.YearCombo.EVENT_BEFORE_POPUPVIEW);
- });
- },
-
- setValue: function (v) {
- this.combo.setValue(v || "");
- },
-
- getValue: function () {
- return this.popup.getValue();
- }
-});
-BI.YearCombo.EVENT_CONFIRM = "EVENT_CONFIRM";
-BI.YearCombo.EVENT_BEFORE_POPUPVIEW = "EVENT_BEFORE_POPUPVIEW";
-BI.shortcut('bi.year_combo', BI.YearCombo);/**
- * 年份展示面板
- *
- * Created by GUY on 2015/9/2.
- * @class BI.YearPopup
- * @extends BI.Trigger
- */
-BI.YearPopup = BI.inherit(BI.Widget, {
-
- _defaultConfig: function () {
- return BI.extend(BI.YearPopup.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-year-popup",
- behaviors: {},
- min: '1900-01-01', //最小日期
- max: '2099-12-31' //最大日期
- });
- },
-
- _createYearCalendar: function (v) {
- var o = this.options, y = this._year;
-
- var calendar = BI.createWidget({
- type: "bi.year_calendar",
- behaviors: o.behaviors,
- min: o.min,
- max: o.max,
- logic: {
- dynamic: true
- },
- year: y + v * 12
- });
- calendar.setValue(this._year);
- return calendar;
- },
-
- _init: function () {
- BI.YearPopup.superclass._init.apply(this, arguments);
- var self = this;
-
- this.selectedYear = this._year = Date.getDate().getFullYear();
-
- var backBtn = BI.createWidget({
- type: "bi.icon_button",
- cls: "pre-page-h-font",
- width: 25,
- height: 25,
- value: -1
- });
-
- var preBtn = BI.createWidget({
- type: "bi.icon_button",
- cls: "next-page-h-font",
- width: 25,
- height: 25,
- value: 1
- });
-
- this.navigation = BI.createWidget({
- type: "bi.navigation",
- element: this,
- single: true,
- logic: {
- dynamic: true
- },
- tab: {
- cls: "year-popup-navigation bi-high-light bi-border-top",
- height: 25,
- items: [backBtn, preBtn]
- },
- cardCreator: BI.bind(this._createYearCalendar, this),
-
- afterCardShow: function () {
- this.setValue(self.selectedYear);
- var calendar = this.getSelectedCard();
- backBtn.setEnable(!calendar.isFrontYear());
- preBtn.setEnable(!calendar.isFinalYear());
- }
- });
-
- this.navigation.on(BI.Navigation.EVENT_CHANGE, function () {
- self.selectedYear = this.getValue();
- self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
- self.fireEvent(BI.YearPopup.EVENT_CHANGE, self.selectedYear);
- });
- },
-
- getValue: function () {
- return this.selectedYear;
- },
-
- setValue: function (v) {
- var o = this.options;
- if (Date.checkVoid(v, 1, 1, o.min, o.max)[0]) {
- v = Date.getDate().getFullYear();
- this.selectedYear = "";
- this.navigation.setSelect(BI.YearCalendar.getPageByYear(v));
- this.navigation.setValue("");
- } else {
- this.selectedYear = v;
- this.navigation.setSelect(BI.YearCalendar.getPageByYear(v));
- this.navigation.setValue(v);
- }
- }
-});
-BI.YearPopup.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut("bi.year_popup", BI.YearPopup);/**
- * 年份trigger
- *
- * Created by GUY on 2015/8/21.
- * @class BI.YearTrigger
- * @extends BI.Trigger
- */
-BI.YearTrigger = BI.inherit(BI.Trigger, {
- _const: {
- hgap: 4,
- vgap: 2,
- errorText: BI.i18nText("BI-Please_Input_Positive_Integer"),
- errorTextInvalid: BI.i18nText("BI-Year_Trigger_Invalid_Text")
- },
-
- _defaultConfig: function () {
- return BI.extend(BI.YearTrigger.superclass._defaultConfig.apply(this, arguments), {
- extraCls: "bi-year-trigger bi-border",
- min: '1900-01-01', //最小日期
- max: '2099-12-31', //最大日期
- height: 24
- });
- },
- _init: function () {
- BI.YearTrigger.superclass._init.apply(this, arguments);
- var self = this, o = this.options, c = this._const;
- this.editor = BI.createWidget({
- type: "bi.sign_editor",
- height: o.height,
- validationChecker: function (v) {
- self.editor.setErrorText(!BI.isPositiveInteger(v) ? c.errorText : c.errorTextInvalid);
- return v === "" || (BI.isPositiveInteger(v) && !Date.checkVoid(v, 1, 1, o.min, o.max)[0]);
- },
- quitChecker: function (v) {
- return false;
- },
- hgap: c.hgap,
- vgap: c.vgap,
- allowBlank: true,
- errorText: c.errorText
- })
- this.editor.on(BI.SignEditor.EVENT_FOCUS, function () {
- self.fireEvent(BI.YearTrigger.EVENT_FOCUS);
- });
- this.editor.on(BI.SignEditor.EVENT_STOP, function () {
- self.fireEvent(BI.YearTrigger.EVENT_STOP);
- });
- this.editor.on(BI.SignEditor.EVENT_CONFIRM, function () {
- var value = self.editor.getValue();
- if (BI.isNotNull(value)) {
- self.editor.setValue(value);
- self.editor.setTitle(value);
- }
- self.fireEvent(BI.YearTrigger.EVENT_CONFIRM);
- });
- this.editor.on(BI.SignEditor.EVENT_SPACE, function () {
- if (self.editor.isValid()) {
- self.editor.blur();
- }
- });
- this.editor.on(BI.SignEditor.EVENT_START, function () {
- self.fireEvent(BI.YearTrigger.EVENT_START);
- });
- this.editor.on(BI.SignEditor.EVENT_ERROR, function () {
- self.fireEvent(BI.YearTrigger.EVENT_ERROR);
- });
- BI.createWidget({
- element: this,
- type: 'bi.htape',
- items: [
- {
- el: this.editor
- }, {
- el: {
- type: "bi.text_button",
- baseCls: "bi-trigger-year-text",
- text: BI.i18nText("BI-Multi_Date_Year"),
- width: o.height
- },
- width: o.height
- }, {
- el: {
- type: "bi.trigger_icon_button",
- width: o.height
- },
- width: o.height
- }
- ]
- });
- },
- setValue: function (v) {
- this.editor.setState(v);
- this.editor.setValue(v);
- this.editor.setTitle(v);
- },
- getKey: function () {
- return this.editor.getValue() | 0;
- }
-});
-BI.YearTrigger.EVENT_FOCUS = "EVENT_FOCUS";
-BI.YearTrigger.EVENT_ERROR = "EVENT_ERROR";
-BI.YearTrigger.EVENT_START = "EVENT_START";
-BI.YearTrigger.EVENT_CONFIRM = "EVENT_CONFIRM";
-BI.YearTrigger.EVENT_STOP = "EVENT_STOP";
-BI.shortcut("bi.year_trigger", BI.YearTrigger);/**
- * 年份 + 月份下拉框
- *
- * @class BI.YearMonthCombo
- * @extends BI.Widget
- */
-BI.YearMonthCombo = BI.inherit(BI.Widget, {
- _defaultConfig: function () {
- return BI.extend(BI.YearMonthCombo.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-year-month-combo",
- yearBehaviors: {},
- monthBehaviors: {},
- height: 25
- });
- },
- _init: function () {
- BI.YearMonthCombo.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
-
- this.year = BI.createWidget({
- type: "bi.year_combo",
- behaviors: o.yearBehaviors
- });
-
- this.month = BI.createWidget({
- type: "bi.month_combo",
- behaviors: o.monthBehaviors
- });
-
- this.year.on(BI.YearCombo.EVENT_CONFIRM, function () {
- self.fireEvent(BI.YearMonthCombo.EVENT_CONFIRM);
- });
- this.year.on(BI.YearCombo.EVENT_BEFORE_POPUPVIEW, function () {
- self.fireEvent(BI.YearMonthCombo.EVENT_BEFORE_POPUPVIEW);
- });
-
- this.month.on(BI.MonthCombo.EVENT_CONFIRM, function () {
- self.fireEvent(BI.YearMonthCombo.EVENT_CONFIRM);
- });
- this.month.on(BI.MonthCombo.EVENT_BEFORE_POPUPVIEW, function () {
- self.fireEvent(BI.YearMonthCombo.EVENT_BEFORE_POPUPVIEW);
- });
-
- BI.createWidget({
- type: "bi.center",
- element: this,
- hgap: 5,
- items: [this.year, this.month]
- });
-
- },
-
- setValue: function (v) {
- v = v || {};
- this.month.setValue(v.month);
- this.year.setValue(v.year);
- },
-
- getValue: function () {
- return {
- year: this.year.getValue(),
- month: this.month.getValue()
- };
- }
-});
-BI.YearMonthCombo.EVENT_CONFIRM = "EVENT_CONFIRM";
-BI.YearMonthCombo.EVENT_BEFORE_POPUPVIEW = "EVENT_BEFORE_POPUPVIEW";
-BI.shortcut('bi.year_month_combo', BI.YearMonthCombo);/**
- * 年份 + 月份下拉框
- *
- * @class BI.YearQuarterCombo
- * @extends BI.Widget
- */
-BI.YearQuarterCombo = BI.inherit(BI.Widget, {
- _defaultConfig: function () {
- return BI.extend(BI.YearQuarterCombo.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-year-quarter-combo",
- yearBehaviors: {},
- quarterBehaviors: {},
- height: 25
- });
- },
- _init: function () {
- BI.YearQuarterCombo.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
-
- this.year = BI.createWidget({
- type: "bi.year_combo",
- behaviors: o.yearBehaviors
- });
-
- this.quarter = BI.createWidget({
- type: "bi.quarter_combo",
- behaviors: o.quarterBehaviors
- });
-
- this.year.on(BI.YearCombo.EVENT_CONFIRM, function () {
- self.fireEvent(BI.YearQuarterCombo.EVENT_CONFIRM);
- });
- this.year.on(BI.YearCombo.EVENT_BEFORE_POPUPVIEW, function () {
- self.fireEvent(BI.YearQuarterCombo.EVENT_BEFORE_POPUPVIEW);
- });
-
- this.quarter.on(BI.QuarterCombo.EVENT_CONFIRM, function () {
- self.fireEvent(BI.YearQuarterCombo.EVENT_CONFIRM);
- });
- this.quarter.on(BI.QuarterCombo.EVENT_BEFORE_POPUPVIEW, function () {
- self.fireEvent(BI.YearQuarterCombo.EVENT_BEFORE_POPUPVIEW);
- });
-
- BI.createWidget({
- type: "bi.center",
- element: this,
- hgap: 5,
- items: [this.year, this.quarter]
- });
-
- },
-
- setValue: function (v) {
- v = v || {};
- this.quarter.setValue(v.quarter);
- this.year.setValue(v.year);
- },
-
- getValue: function () {
- return {
- year: this.year.getValue(),
- quarter: this.quarter.getValue()
- };
- }
-});
-BI.YearQuarterCombo.EVENT_CONFIRM = "EVENT_CONFIRM";
-BI.YearQuarterCombo.EVENT_BEFORE_POPUPVIEW = "EVENT_BEFORE_POPUPVIEW";
-BI.shortcut('bi.year_quarter_combo', BI.YearQuarterCombo);/**
- * 简单的复选下拉框控件, 适用于数据量少的情况, 与valuechooser的区别是allvaluechooser setValue和getValue返回的是所有值
- * 封装了字段处理逻辑
- *
- * Created by GUY on 2015/10/29.
- * @class BI.AbstractAllValueChooser
- * @extends BI.Widget
- */
-BI.AbstractAllValueChooser = BI.inherit(BI.Widget, {
-
- _const: {
- perPage: 100
- },
-
- _defaultConfig: function () {
- return BI.extend(BI.AbstractAllValueChooser.superclass._defaultConfig.apply(this, arguments), {
- width: 200,
- height: 30,
- items: null,
- itemsCreator: BI.emptyFn,
- cache: true
- });
- },
-
- _valueFormatter: function (v) {
- var text = v;
- if (BI.isNotNull(this.items)) {
- BI.some(this.items, function (i, item) {
- if (item.value === v) {
- text = item.text;
- return true;
- }
- });
- }
- return text;
- },
-
- _itemsCreator: function (options, callback) {
- var self = this, o = this.options;
- if (!o.cache || !this.items) {
- o.itemsCreator({}, function (items) {
- self.items = items;
- call(items);
- });
- } else {
- call(this.items);
- }
- function call(items) {
- var keywords = (options.keywords || []).slice();
- if (options.keyword) {
- keywords.push(options.keyword);
- }
- BI.each(keywords, function (i, kw) {
- var search = BI.Func.getSearchResult(items, kw);
- items = search.matched.concat(search.finded);
- });
- if (options.selectedValues) {//过滤
- var filter = BI.makeObject(options.selectedValues, true);
- items = BI.filter(items, function (i, ob) {
- return !filter[ob.value];
- });
- }
- if (options.type === BI.MultiSelectCombo.REQ_GET_ALL_DATA) {
- callback({
- items: items
- });
- return;
- }
- if (options.type === BI.MultiSelectCombo.REQ_GET_DATA_LENGTH) {
- callback({count: items.length});
- return;
- }
- callback({
- items: items,
- hasNext: false
- });
- }
- }
-});/**
- * 简单的复选下拉框控件, 适用于数据量少的情况, 与valuechooser的区别是allvaluechooser setValue和getValue返回的是所有值
- * 封装了字段处理逻辑
- *
- * Created by GUY on 2015/10/29.
- * @class BI.AllValueChooserCombo
- * @extends BI.AbstractAllValueChooser
- */
-BI.AllValueChooserCombo = BI.inherit(BI.AbstractAllValueChooser, {
-
- _defaultConfig: function () {
- return BI.extend(BI.AllValueChooserCombo.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-all-value-chooser-combo",
- width: 200,
- height: 30,
- items: null,
- itemsCreator: BI.emptyFn,
- cache: true
- });
- },
-
- _init: function () {
- BI.AllValueChooserCombo.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- if (BI.isNotNull(o.items)) {
- this.items = o.items;
- }
- this.combo = BI.createWidget({
- type: 'bi.multi_select_combo',
- element: this,
- itemsCreator: BI.bind(this._itemsCreator, this),
- valueFormatter: BI.bind(this._valueFormatter, this),
- width: o.width,
- height: o.height
- });
-
- this.combo.on(BI.MultiSelectCombo.EVENT_CONFIRM, function () {
- self.fireEvent(BI.AllValueChooserCombo.EVENT_CONFIRM);
- });
- },
-
- setValue: function (v) {
- this.combo.setValue({
- type: BI.Selection.Multi,
- value: v || []
- });
- },
-
- getValue: function () {
- var val = this.combo.getValue() || {};
- if (val.type === BI.Selection.All) {
- return val.assist;
- }
- return val.value || [];
- },
-
- populate: function () {
- this.combo.populate.apply(this, arguments);
- }
-});
-BI.AllValueChooserCombo.EVENT_CONFIRM = "AllValueChooserCombo.EVENT_CONFIRM";
-BI.shortcut('bi.all_value_chooser_combo', BI.AllValueChooserCombo);/**
- * 简单的复选下拉框控件, 适用于数据量少的情况, 与valuechooser的区别是allvaluechooser setValue和getValue返回的是所有值
- * 封装了字段处理逻辑
- *
- * Created by GUY on 2015/10/29.
- * @class BI.AllValueChooserPane
- * @extends BI.AbstractAllValueChooser
- */
-BI.AllValueChooserPane = BI.inherit(BI.AbstractAllValueChooser, {
-
- _defaultConfig: function () {
- return BI.extend(BI.AllValueChooserPane.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-all-value-chooser-pane",
- width: 200,
- height: 30,
- items: null,
- itemsCreator: BI.emptyFn,
- cache: true
- });
- },
-
- _init: function () {
- BI.AllValueChooserPane.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- if (BI.isNotNull(o.items)) {
- this.items = o.items;
- }
- this.list = BI.createWidget({
- type: 'bi.multi_select_list',
- element: this,
- itemsCreator: BI.bind(this._itemsCreator, this),
- valueFormatter: BI.bind(this._valueFormatter, this),
- width: o.width,
- height: o.height
- });
-
- this.list.on(BI.MultiSelectList.EVENT_CHANGE, function () {
- self.fireEvent(BI.AllValueChooserPane.EVENT_CHANGE);
- });
- },
-
- setValue: function (v) {
- this.list.setValue({
- type: BI.Selection.Multi,
- value: v || []
- });
- },
-
- getValue: function () {
- var val = this.list.getValue() || {};
- if (val.type === BI.Selection.All) {
- return val.assist;
- }
- return val.value || [];
- },
-
- populate: function () {
- this.list.populate.apply(this.list, arguments);
- }
-});
-BI.AllValueChooserPane.EVENT_CHANGE = "AllValueChooserPane.EVENT_CHANGE";
-BI.shortcut('bi.all_value_chooser_pane', BI.AllValueChooserPane);BI.AbstractTreeValueChooser = BI.inherit(BI.Widget, {
-
- _const: {
- perPage: 100
- },
-
- _defaultConfig: function () {
- return BI.extend(BI.AbstractTreeValueChooser.superclass._defaultConfig.apply(this, arguments), {
- items: null,
- itemsCreator: BI.emptyFn
- });
- },
-
- _initData: function (items) {
- this.items = items;
- var nodes = BI.Tree.treeFormat(items);
- this.tree = new BI.Tree();
- this.tree.initTree(nodes);
- },
-
- _itemsCreator: function (options, callback) {
- var self = this, o = this.options;
- if (!this.items) {
- o.itemsCreator({}, function (items) {
- self._initData(items);
- call();
- });
- } else {
- call();
- }
- function call() {
- switch (options.type) {
- case BI.TreeView.REQ_TYPE_INIT_DATA:
- self._reqInitTreeNode(options, callback);
- break;
- case BI.TreeView.REQ_TYPE_ADJUST_DATA:
- self._reqAdjustTreeNode(options, callback);
- break;
- case BI.TreeView.REQ_TYPE_SELECT_DATA:
- self._reqSelectedTreeNode(options, callback);
- break;
- case BI.TreeView.REQ_TYPE_GET_SELECTED_DATA:
- self._reqDisplayTreeNode(options, callback);
- break;
- default :
- self._reqTreeNode(options, callback);
- break;
- }
- }
- },
-
- _reqDisplayTreeNode: function (op, callback) {
- var self = this;
- var result = [];
- var selectedValues = op.selectedValues;
-
- if (selectedValues == null || BI.isEmpty(selectedValues)) {
- callback({});
- return;
- }
-
- doCheck([], this.tree.getRoot(), selectedValues);
-
- callback({
- items: result
- });
-
- function doCheck(parentValues, node, selected) {
- if (selected == null || BI.isEmpty(selected)) {
- BI.each(node.getChildren(), function (i, child) {
- var newParents = BI.clone(parentValues);
- newParents.push(child.value);
- var llen = self._getChildCount(newParents);
- createOneJson(child, node.id, llen);
- doCheck(newParents, child, {});
- });
- return;
- }
- BI.each(selected, function (k) {
- var node = self._getTreeNode(parentValues, k);
- var newParents = BI.clone(parentValues);
- newParents.push(node.value);
- createOneJson(node, node.parent && node.parent.id, getCount(selected[k], newParents));
- doCheck(newParents, node, selected[k]);
- })
- }
-
- function getCount(jo, parentValues) {
- if (jo == null) {
- return 0;
- }
- if (BI.isEmpty(jo)) {
- return self._getChildCount(parentValues);
- }
-
- return BI.size(jo);
- }
-
- function createOneJson(node, pId, llen) {
- result.push({
- id: node.id,
- pId: pId,
- text: node.text + (llen > 0 ? ("(" + BI.i18nText("BI-Basic_Altogether") + llen + BI.i18nText("BI-Basic_Count") + ")") : ""),
- value: node.value,
- open: true
- });
- }
- },
-
- _reqSelectedTreeNode: function (op, callback) {
- var self = this;
- var selectedValues = BI.deepClone(op.selectedValues);
- var notSelectedValue = op.notSelectedValue || {};
- var keyword = op.keyword || "";
- var parentValues = op.parentValues || [];
-
- if (selectedValues == null || BI.isEmpty(selectedValues)) {
- callback({});
- return;
- }
-
- dealWithSelectedValues(selectedValues);
- callback(selectedValues);
-
-
- function dealWithSelectedValues(selectedValues) {
- var p = parentValues.concat(notSelectedValue);
- //存储的值中存在这个值就把它删掉
- //例如选中了中国-江苏-南京, 取消中国或江苏或南京
- if (canFindKey(selectedValues, p)) {
- //如果搜索的值在父亲链中
- if (isSearchValueInParent(p)) {
- //例如选中了 中国-江苏, 搜索江苏, 取消江苏
- //例如选中了 中国-江苏, 搜索江苏, 取消中国
- self._deleteNode(selectedValues, p);
- } else {
- var searched = [];
- var finded = search(parentValues, notSelectedValue, [], searched);
- if (finded && BI.isNotEmptyArray(searched)) {
- BI.each(searched, function (i, arr) {
- var node = self._getNode(selectedValues, arr);
- if (node) {
- //例如选中了 中国-江苏-南京,搜索南京,取消中国
- self._deleteNode(selectedValues, arr);
- } else {
- //例如选中了 中国-江苏,搜索南京,取消中国
- expandSelectedValue(selectedValues, arr, BI.last(arr));
- }
- })
- }
- }
- }
-
- //存储的值中不存在这个值,但父亲节点是全选的情况
- //例如选中了中国-江苏,取消南京
- //important 选中了中国-江苏,取消了江苏,但是搜索的是南京
- if (isChild(selectedValues, p)) {
- var result = [], finded = false;
- //如果parentValues中有匹配的值,说明搜索结果不在当前值下
- if (isSearchValueInParent(p)) {
- finded = true;
- } else {
- //从当前值开始搜
- finded = search(parentValues, notSelectedValue, result);
- p = parentValues;
- }
-
- if (finded === true) {
- //去掉点击的节点之后的结果集
- expandSelectedValue(selectedValues, p, notSelectedValue);
- //添加去掉搜索的结果集
- if (result.length > 0) {
- BI.each(result, function (i, strs) {
- self._buildTree(selectedValues, strs);
- })
- }
- }
- }
-
- }
-
- function expandSelectedValue(selectedValues, parents, notSelectedValue) {
- var next = selectedValues;
- var childrenCount = [];
- var path = [];
- //去掉点击的节点之后的结果集
- BI.some(parents, function (i, v) {
- var t = next[v];
- if (t == null) {
- if (i === 0) {
- return true;
- }
- if (BI.isEmpty(next)) {
- var split = parents.slice(0, i);
- var expanded = self._getChildren(split);
- path.push(split);
- childrenCount.push(expanded.length);
- //如果只有一个值且取消的就是这个值
- if (i === parents.length - 1 && expanded.length === 1 && expanded[0] === notSelectedValue) {
- for (var j = childrenCount.length - 1; j >= 0; j--) {
- if (childrenCount[j] === 1) {
- self._deleteNode(selectedValues, path[j]);
- } else {
- break;
- }
- }
- } else {
- BI.each(expanded, function (m, child) {
- if (i === parents.length - 1 && child.value === notSelectedValue) {
- return true;
- }
- next[child.value] = {};
- });
- }
- next = next[v];
- } else {
- return true;
- // next = {};
- // next[v] = {};
- }
- } else {
- next = t;
- }
- });
- }
-
- function search(parents, current, result, searched) {
- var newParents = BI.clone(parents);
- newParents.push(current);
- if (self._isMatch(parents, current, keyword)) {
- searched && searched.push(newParents);
- return true;
- }
-
- var children = self._getChildren(newParents);
-
- var notSearch = [];
- var can = false;
-
- BI.each(children, function (i, child) {
- if (search(newParents, child.value, result, searched)) {
- can = true;
- } else {
- notSearch.push(child.value);
- }
- });
- if (can === true) {
- BI.each(notSearch, function (i, v) {
- var next = BI.clone(newParents);
- next.push(v);
- result.push(next);
- });
- }
- return can;
- }
-
- function isSearchValueInParent(parentValues) {
- for (var i = 0, len = parentValues.length; i < len; i++) {
- if (self._isMatch(parentValues.slice(0, parentValues.length - 1), parentValues[i], keyword)) {
- return true;
- }
- }
- return false;
- }
-
- function canFindKey(selectedValues, parents) {
- var t = selectedValues;
- for (var i = 0; i < parents.length; i++) {
- var v = parents[i];
- t = t[v];
- if (t == null) {
- return false;
- }
- }
- return true;
- }
-
- function isChild(selectedValues, parents) {
- var t = selectedValues;
- for (var i = 0; i < parents.length; i++) {
- var v = parents[i];
- if (!BI.has(t, v)) {
- return false;
- }
- t = t[v];
- if (BI.isEmpty(t)) {
- return true;
- }
- }
- return false;
- }
- },
-
- _reqAdjustTreeNode: function (op, callback) {
- var self = this;
- var result = [];
- var selectedValues = op.selectedValues;
- if (selectedValues == null || BI.isEmpty(selectedValues)) {
- callback({});
- return;
- }
- BI.each(selectedValues, function (k, v) {
- result.push([k]);
- });
-
- dealWithSelectedValues(selectedValues, []);
-
- var jo = {};
- BI.each(result, function (i, strs) {
- self._buildTree(jo, strs);
- });
- callback(jo);
-
- function dealWithSelectedValues(selected, parents) {
- if (selected == null || BI.isEmpty(selected)) {
- return true;
- }
- var can = true;
- BI.each(selected, function (k, v) {
- var p = BI.clone(parents);
- p.push(k);
- if (!dealWithSelectedValues(selected[k], p)) {
- BI.each(selected[k], function (nk, nv) {
- var t = BI.clone(p);
- t.push(nk);
- result.push(t);
- });
- can = false;
- }
- });
- return can && isAllSelected(selected, parents);
- }
-
- function isAllSelected(selected, parents) {
- return BI.isEmpty(selected) || self._getChildCount(parents) === BI.size(selected);
- }
- },
-
- _reqInitTreeNode: function (op, callback) {
- var self = this;
- var result = [];
- var keyword = op.keyword || "";
- var selectedValues = op.selectedValues;
- var lastSearchValue = op.lastSearchValue || "";
- var output = search();
- BI.nextTick(function () {
- callback({
- hasNext: output.length > self._const.perPage,
- items: result,
- lastSearchValue: BI.last(output)
- })
- });
-
- function search() {
- var children = self._getChildren([]);
- var start = children.length;
- if (lastSearchValue !== "") {
- for (var j = 0, len = start; j < len; j++) {
- if (children[j].value === lastSearchValue) {
- start = j + 1;
- break;
- }
- }
- } else {
- start = 0;
- }
- var output = [];
- for (var i = start, len = children.length; i < len; i++) {
- if (output.length < self._const.perPage) {
- var find = nodeSearch(1, [], children[i].value, false, result);
- } else if (output.length === self._const.perPage) {
- var find = nodeSearch(1, [], children[i].value, false, []);
- }
- if (find[0] === true) {
- output.push(children[i].value);
- }
- if (output.length > self._const.perPage) {
- break;
- }
- }
- return output;
- }
-
- function nodeSearch(deep, parentValues, current, isAllSelect, result) {
- if (self._isMatch(parentValues, current, keyword)) {
- var checked = isAllSelect || isSelected(parentValues, current);
- createOneJson(parentValues, current, false, checked, !isAllSelect && isHalf(parentValues, current), true, result);
- return [true, checked];
- }
- var newParents = BI.clone(parentValues);
- newParents.push(current);
- var children = self._getChildren(newParents);
-
- var can = false, checked = false;
-
- var isCurAllSelected = isAllSelect || isAllSelected(parentValues, current);
- BI.each(children, function (i, child) {
- var state = nodeSearch(deep + 1, newParents, child.value, isCurAllSelected, result);
- if (state[1] === true) {
- checked = true;
- }
- if (state[0] === true) {
- can = true;
- }
- });
- if (can === true) {
- checked = isCurAllSelected || (isSelected(parentValues, current) && checked);
- createOneJson(parentValues, current, true, checked, false, false, result);
- }
- return [can, checked];
- }
-
- function createOneJson(parentValues, value, isOpen, checked, half, flag, result) {
- var node = self._getTreeNode(parentValues, value)
- result.push({
- id: node.id,
- pId: node.pId,
- text: node.text,
- value: node.value,
- title: node.title,
- isParent: node.getChildrenLength() > 0,
- open: isOpen,
- checked: checked,
- halfCheck: half,
- flag: flag
- });
- }
-
- function isHalf(parentValues, value) {
- var find = findSelectedObj(parentValues);
- if (find == null) {
- return null;
- }
- return BI.any(find, function (v, ob) {
- if (v === value) {
- if (ob != null && !BI.isEmpty(ob)) {
- return true;
- }
- }
- });
- }
-
- function isAllSelected(parentValues, value) {
- var find = findSelectedObj(parentValues);
- if (find == null) {
- return null;
- }
- return BI.any(find, function (v, ob) {
- if (v === value) {
- if (ob != null && BI.isEmpty(ob)) {
- return true;
- }
- }
- });
- }
-
- function isSelected(parentValues, value) {
- var find = findSelectedObj(parentValues);
- if (find == null) {
- return false;
- }
- return BI.any(find, function (v) {
- if (v === value) {
- return true;
- }
- });
- }
-
- function findSelectedObj(parentValues) {
- var find = selectedValues;
- if (find == null) {
- return null;
- }
- BI.every(parentValues, function (i, v) {
- find = find[v];
- if (find == null) {
- return false;
- }
- return true;
- });
- return find;
- }
- },
-
- _reqTreeNode: function (op, callback) {
- var self = this;
- var result = [];
- var times = op.times;
- var checkState = op.checkState || {};
- var parentValues = op.parentValues || [];
- var selectedValues = op.selectedValues || {};
- var valueMap = {};
- // if (judgeState(parentValues, selectedValues, checkState)) {
- valueMap = dealWidthSelectedValue(parentValues, selectedValues);
- // }
- var nodes = this._getChildren(parentValues);
- for (var i = (times - 1) * this._const.perPage; nodes[i] && i < times * this._const.perPage; i++) {
- var state = getCheckState(nodes[i].value, parentValues, valueMap, checkState);
- result.push({
- id: nodes[i].id,
- pId: nodes[i].pId,
- value: nodes[i].value,
- text: nodes[i].text,
- times: 1,
- isParent: nodes[i].getChildrenLength() > 0,
- checked: state[0],
- halfCheck: state[1]
- })
- }
- BI.nextTick(function () {
- callback({
- items: result,
- hasNext: nodes.length > times * self._const.perPage
- });
- });
-
- function judgeState(parentValues, selected_value, checkState) {
- var checked = checkState.checked, half = checkState.half;
- if (parentValues.length > 0 && !checked) {
- return false;
- }
- return (parentValues.length === 0 || (checked && half) && !BI.isEmpty(selected_value));
- }
-
- function dealWidthSelectedValue(parentValues, selectedValues) {
- var valueMap = {};
- BI.each(parentValues, function (i, v) {
- selectedValues = selectedValues[v] || {};
- });
- BI.each(selectedValues, function (value, obj) {
- if (BI.isNull(obj)) {
- valueMap[value] = [0, 0];
- return;
- }
- if (BI.isEmpty(obj)) {
- valueMap[value] = [2, 0];
- return;
- }
- var nextNames = {};
- BI.each(obj, function (t, o) {
- if (BI.isNull(o) || BI.isEmpty(o)) {
- nextNames[t] = true;
- }
- });
- valueMap[value] = [1, BI.size(nextNames)];
- });
- return valueMap;
- }
-
- function getCheckState(current, parentValues, valueMap, checkState) {
- var checked = checkState.checked, half = checkState.half;
- var tempCheck = false, halfCheck = false;
- if (BI.has(valueMap, current)) {
- //可能是半选
- if (valueMap[current][0] === 1) {
- var values = BI.clone(parentValues);
- values.push(current);
- var childCount = self._getChildCount(values);
- if (childCount > 0 && childCount !== valueMap[current][1]) {
- halfCheck = true;
- }
- } else if (valueMap[current][0] === 2) {
- tempCheck = true;
- }
- }
- var check;
- if (!checked && !halfCheck && !tempCheck) {
- check = BI.has(valueMap, current);
- } else {
- check = ((tempCheck || checked) && !half) || BI.has(valueMap, current);
- }
- return [check, halfCheck];
- }
- },
-
- _getNode: function (selectedValues, parentValues) {
- var pNode = selectedValues;
- for (var i = 0, len = parentValues.length; i < len; i++) {
- if (pNode == null) {
- return null;
- }
- pNode = pNode[parentValues[i]];
- }
- return pNode;
- },
-
- _deleteNode: function (selectedValues, values) {
- var name = values[values.length - 1];
- var p = values.slice(0, values.length - 1);
- var pNode = this._getNode(selectedValues, p);
- if (pNode != null && pNode[name]) {
- delete pNode[name];
- //递归删掉空父节点
- while (p.length > 0 && BI.isEmpty(pNode)) {
- name = p[p.length - 1];
- p = p.slice(0, p.length - 1);
- pNode = this._getNode(selectedValues, p);
- if (pNode != null) {
- delete pNode[name];
- }
- }
- }
- },
-
- _buildTree: function (jo, values) {
- var t = jo;
- BI.each(values, function (i, v) {
- if (!BI.has(t, v)) {
- t[v] = {};
- }
- t = t[v];
- });
- },
-
- _isMatch: function (parentValues, value, keyword) {
- var node = this._getTreeNode(parentValues, value);
- var finded = BI.Func.getSearchResult([node.text || node.value], keyword);
- return finded.finded.length > 0 || finded.matched.length > 0;
- },
-
- _getTreeNode: function (parentValues, v) {
- var self = this;
- var findedParentNode;
- var index = 0;
- this.tree.traverse(function (node) {
- if (self.tree.isRoot(node)) {
- return;
- }
- if (index > parentValues.length) {
- return false;
- }
- if (index === parentValues.length && node.value === v) {
- findedParentNode = node;
- return false;
- }
- if (node.value === parentValues[index]) {
- index++;
- return;
- }
- return true;
- });
- return findedParentNode;
- },
-
- _getChildren: function (parentValues) {
- if (parentValues.length > 0) {
- var value = BI.last(parentValues);
- var parent = this._getTreeNode(parentValues.slice(0, parentValues.length - 1), value);
- } else {
- var parent = this.tree.getRoot();
- }
- return parent.getChildren();
- },
-
- _getChildCount: function (parentValues) {
- return this._getChildren(parentValues).length;
- }
-});/**
- * 简单的复选下拉树控件, 适用于数据量少的情况
- *
- * Created by GUY on 2015/10/29.
- * @class BI.TreeValueChooserCombo
- * @extends BI.Widget
- */
-BI.TreeValueChooserCombo = BI.inherit(BI.AbstractTreeValueChooser, {
-
- _defaultConfig: function () {
- return BI.extend(BI.TreeValueChooserCombo.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-tree-value-chooser-combo",
- width: 200,
- height: 30,
- items: null,
- itemsCreator: BI.emptyFn
- });
- },
-
- _init: function () {
- BI.TreeValueChooserCombo.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- if (BI.isNotNull(o.items)) {
- this._initData(o.items);
- }
- this.combo = BI.createWidget({
- type: 'bi.multi_tree_combo',
- element: this,
- itemsCreator: BI.bind(this._itemsCreator, this),
- width: o.width,
- height: o.height
- });
-
- this.combo.on(BI.MultiTreeCombo.EVENT_CONFIRM, function () {
- self.fireEvent(BI.TreeValueChooserCombo.EVENT_CONFIRM);
- });
- },
-
- setValue: function (v) {
- this.combo.setValue(v);
- },
-
- getValue: function () {
- return this.combo.getValue();
- },
-
- populate: function () {
- this.combo.populate.apply(this.combo, arguments);
- }
-});
-BI.TreeValueChooserCombo.EVENT_CONFIRM = "TreeValueChooserCombo.EVENT_CONFIRM";
-BI.shortcut('bi.tree_value_chooser_combo', BI.TreeValueChooserCombo);/**
- * 简单的复选下拉树控件, 适用于数据量少的情况
- *
- * Created by GUY on 2015/10/29.
- * @class BI.TreeValueChooserPane
- * @extends BI.AbstractTreeValueChooser
- */
-BI.TreeValueChooserPane = BI.inherit(BI.AbstractTreeValueChooser, {
-
- _defaultConfig: function () {
- return BI.extend(BI.TreeValueChooserPane.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-tree-value-chooser-pane",
- items: null,
- itemsCreator: BI.emptyFn
- });
- },
-
- _init: function () {
- BI.TreeValueChooserPane.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.pane = BI.createWidget({
- type: 'bi.multi_select_tree',
- element: this,
- itemsCreator: BI.bind(this._itemsCreator, this)
- });
-
- this.pane.on(BI.MultiSelectTree.EVENT_CHANGE, function () {
- self.fireEvent(BI.TreeValueChooserPane.EVENT_CHANGE);
- });
- if (BI.isNotNull(o.items)) {
- this._initData(o.items);
- this.populate();
- }
- },
-
- setSelectedValue: function (v) {
- this.pane.setSelectedValue(v);
- },
-
- setValue: function (v) {
- this.pane.setValue(v);
- },
-
- getValue: function () {
- return this.pane.getValue();
- },
-
- populate: function () {
- this.pane.populate.apply(this.pane, arguments);
- }
-});
-BI.TreeValueChooserPane.EVENT_CHANGE = "TreeValueChooserPane.EVENT_CHANGE";
-BI.shortcut('bi.tree_value_chooser_pane', BI.TreeValueChooserPane);/**
- * 简单的复选下拉框控件, 适用于数据量少的情况
- * 封装了字段处理逻辑
- *
- * Created by GUY on 2015/10/29.
- * @class BI.AbstractValueChooser
- * @extends BI.Widget
- */
-BI.AbstractValueChooser = BI.inherit(BI.Widget, {
-
- _const: {
- perPage: 100
- },
-
- _defaultConfig: function () {
- return BI.extend(BI.AbstractValueChooser.superclass._defaultConfig.apply(this, arguments), {
- items: null,
- itemsCreator: BI.emptyFn,
- cache: true
- });
- },
-
- _valueFormatter: function (v) {
- var text = v;
- if (BI.isNotNull(this.items)) {
- BI.some(this.items, function (i, item) {
- if (item.value === v) {
- text = item.text;
- return true;
- }
- });
- }
- return text;
- },
-
- _getItemsByTimes: function (items, times) {
- var res = [];
- for (var i = (times - 1) * this._const.perPage; items[i] && i < times * this._const.perPage; i++) {
- res.push(items[i]);
- }
- return res;
- },
-
- _hasNextByTimes: function (items, times) {
- return times * this._const.perPage < items.length;
- },
-
- _itemsCreator: function (options, callback) {
- var self = this, o = this.options;
- if (!o.cache || !this.items) {
- o.itemsCreator({}, function (items) {
- self.items = items;
- call(items);
- });
- } else {
- call(this.items);
- }
- function call(items) {
- var keywords = (options.keywords || []).slice();
- if (options.keyword) {
- keywords.push(options.keyword);
- }
- BI.each(keywords, function (i, kw) {
- var search = BI.Func.getSearchResult(items, kw);
- items = search.matched.concat(search.finded);
- });
- if (options.selectedValues) {//过滤
- var filter = BI.makeObject(options.selectedValues, true);
- items = BI.filter(items, function (i, ob) {
- return !filter[ob.value];
- });
- }
- if (options.type === BI.MultiSelectCombo.REQ_GET_ALL_DATA) {
- callback({
- items: items
- });
- return;
- }
- if (options.type === BI.MultiSelectCombo.REQ_GET_DATA_LENGTH) {
- callback({count: items.length});
- return;
- }
- callback({
- items: self._getItemsByTimes(items, options.times),
- hasNext: self._hasNextByTimes(items, options.times)
- });
- }
- }
-});/**
- * 简单的复选下拉框控件, 适用于数据量少的情况
- * 封装了字段处理逻辑
- *
- * Created by GUY on 2015/10/29.
- * @class BI.ValueChooserCombo
- * @extends BI.Widget
- */
-BI.ValueChooserCombo = BI.inherit(BI.AbstractValueChooser, {
-
- _defaultConfig: function () {
- return BI.extend(BI.ValueChooserCombo.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-value-chooser-combo",
- width: 200,
- height: 30,
- items: null,
- itemsCreator: BI.emptyFn,
- cache: true
- });
- },
-
- _init: function () {
- BI.ValueChooserCombo.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- if (BI.isNotNull(o.items)) {
- this.items = o.items;
- }
- this.combo = BI.createWidget({
- type: 'bi.multi_select_combo',
- element: this,
- itemsCreator: BI.bind(this._itemsCreator, this),
- valueFormatter: BI.bind(this._valueFormatter, this),
- width: o.width,
- height: o.height
- });
-
- this.combo.on(BI.MultiSelectCombo.EVENT_CONFIRM, function () {
- self.fireEvent(BI.ValueChooserCombo.EVENT_CONFIRM);
- });
- },
-
- setValue: function (v) {
- this.combo.setValue(v);
- },
-
- getValue: function () {
- var val = this.combo.getValue() || {};
- return {
- type: val.type,
- value: val.value
- }
- },
-
- populate: function () {
- this.combo.populate.apply(this, arguments);
- }
-});
-BI.ValueChooserCombo.EVENT_CONFIRM = "ValueChooserCombo.EVENT_CONFIRM";
-BI.shortcut('bi.value_chooser_combo', BI.ValueChooserCombo);/**
- * 简单的复选下拉框控件, 适用于数据量少的情况
- * 封装了字段处理逻辑
- *
- * Created by GUY on 2015/10/29.
- * @class BI.ValueChooserPane
- * @extends BI.Widget
- */
-BI.ValueChooserPane = BI.inherit(BI.AbstractValueChooser, {
-
- _defaultConfig: function () {
- return BI.extend(BI.ValueChooserPane.superclass._defaultConfig.apply(this, arguments), {
- baseCls: "bi-value-chooser-pane",
- items: null,
- itemsCreator: BI.emptyFn,
- cache: true
- });
- },
-
- _init: function () {
- BI.ValueChooserPane.superclass._init.apply(this, arguments);
- var self = this, o = this.options;
- this.list = BI.createWidget({
- type: 'bi.multi_select_list',
- element: this,
- itemsCreator: BI.bind(this._itemsCreator, this),
- valueFormatter: BI.bind(this._valueFormatter, this)
- });
-
- this.list.on(BI.MultiSelectList.EVENT_CHANGE, function () {
- self.fireEvent(BI.ValueChooserPane.EVENT_CHANGE);
- });
- if (BI.isNotNull(o.items)) {
- this.items = o.items;
- this.populate();
- }
- },
-
- setValue: function (v) {
- this.list.setValue(v);
- },
-
- getValue: function () {
- var val = this.list.getValue() || {};
- return {
- type: val.type,
- value: val.value
- }
- },
-
- populate: function () {
- this.list.populate.apply(this.list, arguments);
- }
-});
-BI.ValueChooserPane.EVENT_CHANGE = "ValueChooserPane.EVENT_CHANGE";
-BI.shortcut('bi.value_chooser_pane', BI.ValueChooserPane);
\ No newline at end of file
diff --git a/dist/base.css b/dist/base.css
index 3f80316b0..d79a47e84 100644
--- a/dist/base.css
+++ b/dist/base.css
@@ -85,9 +85,7 @@
border-bottom: 6px solid #3f8ce8;
}
.bi-bubble-popup-view {
- -webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
- -moz-box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
- box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
+
}
.bi-adapt-editor .adapt-editor-text {
font-size: 14px;
diff --git a/dist/bundle.css b/dist/bundle.css
index e1145c6d7..36a2e7b59 100644
--- a/dist/bundle.css
+++ b/dist/bundle.css
@@ -1680,9 +1680,7 @@ i {
border-bottom: 6px solid #3f8ce8;
}
.bi-bubble-popup-view {
- -webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
- -moz-box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
- box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
+
}
.bi-adapt-editor .adapt-editor-text {
font-size: 14px;
diff --git a/src/css/base/combo/popup.bubble.css b/src/css/base/combo/popup.bubble.css
index ffb39a2c8..1dea27986 100644
--- a/src/css/base/combo/popup.bubble.css
+++ b/src/css/base/combo/popup.bubble.css
@@ -1,5 +1,3 @@
.bi-bubble-popup-view {
- -webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
- -moz-box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
- box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
+
}