123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508 |
- if (!dojo._hasResource["dojox.data.HtmlTableStore"]) { // _hasResource checks
- // added by build. Do
- // not use _hasResource
- // directly in your
- // code.
- dojo._hasResource["dojox.data.HtmlTableStore"] = true;
- dojo.provide("dojox.data.HtmlTableStore");
- dojo.require("dojox.data.dom");
- dojo.require("dojo.data.util.simpleFetch");
- dojo.require("dojo.data.util.filter");
- dojo.declare("dojox.data.HtmlTableStore", null, {
- constructor : function(/* Object */args) {
- // summary:
- // Initializer for the HTML table store.
- // description:
- // The HtmlTableStore can be created in one of two ways: a) by
- // parsing an existing
- // table DOM node on the current page or b) by referencing an
- // external url and giving
- // the id of the table in that page. The remote url will be parsed
- // as an html page.
- //
- // The HTML table should be of the following form:
- // <table id="myTable">
- // <thead>
- // <tr>
- // <th>Attribute1</th>
- // <th>Attribute2</th>
- // </tr>
- // </thead>
- // <tbody>
- // <tr>
- // <td>Value1.1</td>
- // <td>Value1.2</td>
- // </tr>
- // <tr>
- // <td>Value2.1</td>
- // <td>Value2.2</td>
- // </tr>
- // </tbody>
- // </table>
- //
- // args:
- // An anonymous object to initialize properties. It expects the
- // following values:
- // tableId: The id of the HTML table to use.
- // OR
- // url: The url of the remote page to load
- // tableId: The id of the table element in the remote page
- if (args.url) {
- if (!args.tableId)
- throw new Error("dojo.data.HtmlTableStore: Cannot instantiate using url without an id!");
- this.url = args.url;
- this.tableId = args.tableId;
- } else {
- if (args.tableId) {
- this._rootNode = dojo.byId(args.tableId);
- this.tableId = this._rootNode.id;
- } else {
- this._rootNode = dojo.byId(this.tableId);
- }
- this._getHeadings();
- for (var i = 0; i < this._rootNode.rows.length; i++) {
- this._rootNode.rows[i].store = this;
- }
- }
- },
- url : "", // So the parser can instantiate the store via markup.
- tableId : "", // So the parser can instantiate the store via markup.
- _getHeadings : function() {
- // summary:
- // Function to load the attribute names from the table header so
- // that the
- // attributes (cells in a row), can have a reasonable name.
- this._headings = [];
- dojo.forEach(this._rootNode.tHead.rows[0].cells, dojo.hitch(this,
- function(th) {
- this._headings.push(dojox.data.dom
- .textContent(th));
- }));
- },
- _getAllItems : function() {
- // summary:
- // Function to return all rows in the table as an array of items.
- var items = [];
- for (var i = 1; i < this._rootNode.rows.length; i++) {
- items.push(this._rootNode.rows[i]);
- }
- return items; // array
- },
- _assertIsItem : function(/* item */item) {
- // summary:
- // This function tests whether the item passed in is indeed an item
- // in the store.
- // item:
- // The item to test for being contained by the store.
- if (!this.isItem(item)) {
- throw new Error("dojo.data.HtmlTableStore: a function was passed an item argument that was not an item");
- }
- },
- _assertIsAttribute : function(/* String */attribute) {
- // summary:
- // This function tests whether the item passed in is indeed a valid
- // 'attribute' like type for the store.
- // attribute:
- // The attribute to test for being contained by the store.
- //
- // returns:
- // Returns the index (column) that the attribute resides in the row.
- if (typeof attribute !== "string") {
- throw new Error("dojo.data.HtmlTableStore: a function was passed an attribute argument that was not an attribute name string");
- return;
- }
- return dojo.indexOf(this._headings, attribute); // int
- },
- /***********************************************************************
- * dojo.data.api.Read API
- **********************************************************************/
- getValue : function( /* item */item,
- /* attribute-name-string */attribute,
- /* value? */defaultValue) {
- // summary:
- // See dojo.data.api.Read.getValue()
- var values = this.getValues(item, attribute);
- return (values.length > 0) ? values[0] : defaultValue; // Object ||
- // int ||
- // Boolean
- },
- getValues : function(/* item */item,
- /* attribute-name-string */attribute) {
- // summary:
- // See dojo.data.api.Read.getValues()
- this._assertIsItem(item);
- var index = this._assertIsAttribute(attribute);
- if (index > -1) {
- return [dojox.data.dom.textContent(item.cells[index])];
- }
- return []; // Array
- },
- getAttributes : function(/* item */item) {
- // summary:
- // See dojo.data.api.Read.getAttributes()
- this._assertIsItem(item);
- var attributes = [];
- for (var i = 0; i < this._headings.length; i++) {
- if (this.hasAttribute(item, this._headings[i]))
- attributes.push(this._headings[i]);
- }
- return attributes; // Array
- },
- hasAttribute : function( /* item */item,
- /* attribute-name-string */attribute) {
- // summary:
- // See dojo.data.api.Read.hasAttribute()
- return this.getValues(item, attribute).length > 0;
- },
- containsValue : function(/* item */item,
- /* attribute-name-string */attribute,
- /* anything */value) {
- // summary:
- // See dojo.data.api.Read.containsValue()
- var regexp = undefined;
- if (typeof value === "string") {
- regexp = dojo.data.util.filter.patternToRegExp(value, false);
- }
- return this._containsValue(item, attribute, value, regexp); // boolean.
- },
- _containsValue : function( /* item */item,
- /* attribute-name-string */attribute,
- /* anything */value,
- /* RegExp? */regexp) {
- // summary:
- // Internal function for looking at the values contained by the
- // item.
- // description:
- // Internal function for looking at the values contained by the
- // item. This
- // function allows for denoting if the comparison should be case
- // sensitive for
- // strings or not (for handling filtering cases where string case
- // should not matter)
- //
- // item:
- // The data item to examine for attribute values.
- // attribute:
- // The attribute to inspect.
- // value:
- // The value to match.
- // regexp:
- // Optional regular expression generated off value if value was of
- // string type to handle wildcarding.
- // If present and attribute values are string, then it can be used
- // for comparison instead of 'value'
- var values = this.getValues(item, attribute);
- for (var i = 0; i < values.length; ++i) {
- var possibleValue = values[i];
- if (typeof possibleValue === "string" && regexp) {
- return (possibleValue.match(regexp) !== null);
- } else {
- // Non-string matching.
- if (value === possibleValue) {
- return true; // Boolean
- }
- }
- }
- return false; // Boolean
- },
- isItem : function(/* anything */something) {
- // summary:
- // See dojo.data.api.Read.isItem()
- if (something && something.store && something.store === this) {
- return true; // boolean
- }
- return false; // boolean
- },
- isItemLoaded : function(/* anything */something) {
- // summary:
- // See dojo.data.api.Read.isItemLoaded()
- return this.isItem(something);
- },
- loadItem : function(/* Object */keywordArgs) {
- // summary:
- // See dojo.data.api.Read.loadItem()
- this._assertIsItem(keywordArgs.item);
- },
- _fetchItems : function(request, fetchHandler, errorHandler) {
- // summary:
- // Fetch items (XML elements) that match to a query
- // description:
- // If '_fetchUrl' is specified, it is used to load an XML document
- // with a query string.
- // Otherwise and if 'url' is specified, the XML document is
- // loaded and list XML elements that match to a query (set of
- // element
- // names and their text attribute values that the items to contain).
- // A wildcard, "*" can be used to query values to match all
- // occurrences.
- // If '_rootItem' is specified, it is used to fetch items.
- // request:
- // A request object
- // fetchHandler:
- // A function to call for fetched items
- // errorHandler:
- // A function to call on error
- if (this._rootNode) {
- this._finishFetchItems(request, fetchHandler, errorHandler);
- } else {
- if (!this.url) {
- this._rootNode = dojo.byId(this.tableId);
- this._getHeadings();
- for (var i = 0; i < this._rootNode.rows.length; i++) {
- this._rootNode.rows[i].store = this;
- }
- } else {
- var getArgs = {
- url : this.url,
- handleAs : "text"
- };
- var self = this;
- var getHandler = dojo.xhrGet(getArgs);
- getHandler.addCallback(function(data) {
- var findNode = function(node, id) {
- if (node.id == id) {
- return node; // object
- }
- if (node.childNodes) {
- for (var i = 0; i < node.childNodes.length; i++) {
- var returnNode = findNode(
- node.childNodes[i], id);
- if (returnNode) {
- return returnNode; // object
- }
- }
- }
- return null; // null
- }
- var d = document.createElement("div");
- d.innerHTML = data;
- self._rootNode = findNode(d, self.tableId);
- self._getHeadings.call(self);
- for (var i = 0; i < self._rootNode.rows.length; i++) {
- self._rootNode.rows[i].store = self;
- }
- self._finishFetchItems(request, fetchHandler,
- errorHandler);
- });
- getHandler.addErrback(function(error) {
- errorHandler(error, request);
- });
- }
- }
- },
- _finishFetchItems : function(request, fetchHandler, errorHandler) {
- // summary:
- // Internal function for processing the passed in request and
- // locating the requested items.
- var items = null;
- var arrayOfAllItems = this._getAllItems();
- if (request.query) {
- var ignoreCase = request.queryOptions
- ? request.queryOptions.ignoreCase
- : false;
- items = [];
- // See if there are any string values that can be regexp parsed
- // first to avoid multiple regexp gens on the
- // same value for each item examined. Much more efficient.
- var regexpList = {};
- for (var key in request.query) {
- var value = request.query[key] + '';
- if (typeof value === "string") {
- regexpList[key] = dojo.data.util.filter
- .patternToRegExp(value, ignoreCase);
- }
- }
- for (var i = 0; i < arrayOfAllItems.length; ++i) {
- var match = true;
- var candidateItem = arrayOfAllItems[i];
- for (var key in request.query) {
- var value = request.query[key] + '';
- if (!this._containsValue(candidateItem, key, value,
- regexpList[key])) {
- match = false;
- }
- }
- if (match) {
- items.push(candidateItem);
- }
- }
- fetchHandler(items, request);
- } else {
- // We want a copy to pass back in case the parent wishes to sort
- // the array. We shouldn't allow resort
- // of the internal list so that multiple callers can get
- // listsand sort without affecting each other.
- if (arrayOfAllItems.length > 0) {
- items = arrayOfAllItems.slice(0, arrayOfAllItems.length);
- }
- fetchHandler(items, request);
- }
- },
- getFeatures : function() {
- // summary:
- // See dojo.data.api.Read.getFeatures()
- return {
- 'dojo.data.api.Read' : true,
- 'dojo.data.api.Identity' : true
- };
- },
- close : function(
- /* dojo.data.api.Request || keywordArgs || null */request) {
- // summary:
- // See dojo.data.api.Read.close()
- // nothing to do here!
- },
- getLabel : function(/* item */item) {
- // summary:
- // See dojo.data.api.Read.getLabel()
- if (this.isItem(item))
- return "Table Row #" + this.getIdentity(item);
- return undefined;
- },
- getLabelAttributes : function(/* item */item) {
- // summary:
- // See dojo.data.api.Read.getLabelAttributes()
- return null;
- },
- /***********************************************************************
- * dojo.data.api.Identity API
- **********************************************************************/
- getIdentity : function(/* item */item) {
- // summary:
- // See dojo.data.api.Identity.getIdentity()
- this._assertIsItem(item);
- // Opera doesn't support the sectionRowIndex,
- // So, have to call the indexOf to locate it.
- // Blah.
- if (!dojo.isOpera) {
- return item.sectionRowIndex; // int
- } else {
- return (dojo.indexOf(this._rootNode.rows, item) - 1) // int
- }
- },
- getIdentityAttributes : function(/* item */item) {
- // summary:
- // See dojo.data.api.Identity.getIdentityAttributes()
- // Identity isn't taken from a public attribute.
- return null;
- },
- fetchItemByIdentity : function(keywordArgs) {
- // summary:
- // See dojo.data.api.Identity.fetchItemByIdentity()
- var identity = keywordArgs.identity;
- var self = this;
- var item = null
- if (!this._rootNode) {
- if (!this.url) {
- this._rootNode = dojo.byId(this.tableId);
- this._getHeadings();
- for (var i = 0; i < this._rootNode.rows.length; i++) {
- this._rootNode.rows[i].store = this;
- }
- item = this._rootNode.rows[identity + 1];
- if (keywordArgs.onItem) {
- var scope = keywordArgs.scope
- ? keywordArgs.scope
- : dojo.global;
- keywordArgs.onItem.call(scope, item);
- }
- } else {
- var getArgs = {
- url : this.url,
- handleAs : "text"
- };
- var self = this;
- var getHandler = dojo.xhrGet(getArgs);
- getHandler.addCallback(function(data) {
- var findNode = function(node, id) {
- if (node.id == id) {
- return node; // object
- }
- if (node.childNodes) {
- for (var i = 0; i < node.childNodes.length; i++) {
- var returnNode = findNode(
- node.childNodes[i], id);
- if (returnNode) {
- return returnNode; // object
- }
- }
- }
- return null; // null
- }
- var d = document.createElement("div");
- d.innerHTML = data;
- self._rootNode = findNode(d, self.tableId);
- self._getHeadings.call(self);
- for (var i = 0; i < self._rootNode.rows.length; i++) {
- self._rootNode.rows[i].store = self;
- }
- item = self._rootNode.rows[identity + 1];
- if (keywordArgs.onItem) {
- var scope = keywordArgs.scope
- ? keywordArgs.scope
- : dojo.global;
- keywordArgs.onItem.call(scope, item);
- }
- });
- getHandler.addErrback(function(error) {
- if (keywordArgs.onError) {
- var scope = keywordArgs.scope
- ? keywordArgs.scope
- : dojo.global;
- keywordArgs.onError.call(scope, error);
- }
- });
- }
- } else {
- if (this._rootNode.rows[identity + 1]) {
- item = this._rootNode.rows[identity + 1];
- if (keywordArgs.onItem) {
- var scope = keywordArgs.scope
- ? keywordArgs.scope
- : dojo.global;
- keywordArgs.onItem.call(scope, item);
- }
- }
- }
- }
- });
- dojo.extend(dojox.data.HtmlTableStore, dojo.data.util.simpleFetch);
- }
|