dojo.provide("dojox.grid.DataGrid"); dojo.require("dojox.grid._Grid"); dojo.require("dojox.grid.DataSelection"); dojo.declare("dojox.grid.DataGrid", dojox.grid._Grid, { store: null, query: null, queryOptions: null, fetchText: '...', // You can specify items instead of a query, if you like. They do not need // to be loaded - but the must be items in the store items: null, _store_connects: null, _by_idty: null, _by_idx: null, _cache: null, _pages: null, _pending_requests: null, _bop: -1, _eop: -1, _requests: 0, rowCount: 0, _isLoaded: false, _isLoading: false, postCreate: function(){ this._pages = []; this._store_connects = []; this._by_idty = {}; this._by_idx = []; this._cache = []; this._pending_requests = {}; this._setStore(this.store); this.inherited(arguments); }, createSelection: function(){ this.selection = new dojox.grid.DataSelection(this); }, get: function(inRowIndex, inItem){ return (!inItem ? this.defaultValue : (!this.field ? this.value : this.grid.store.getValue(inItem, this.field))); }, _onSet: function(item, attribute, oldValue, newValue){ var idx = this.getItemIndex(item); if(idx>-1){ this.updateRow(idx); } }, _addItem: function(item, index, noUpdate){ var idty = this._hasIdentity ? this.store.getIdentity(item) : dojo.toJson(this.query) + ":idx:" + index + ":sort:" + dojo.toJson(this.getSortProps()); var o = { idty: idty, item: item }; this._by_idty[idty] = this._by_idx[index] = o; if(!noUpdate){ this.updateRow(index); } }, _onNew: function(item, parentInfo){ this.updateRowCount(this.rowCount+1); this._addItem(item, this.rowCount-1); this.showMessage(); }, _onDelete: function(item){ var idx = this._getItemIndex(item, true); if(idx >= 0){ var o = this._by_idx[idx]; this._by_idx.splice(idx, 1); delete this._by_idty[o.idty]; this.updateRowCount(this.rowCount-1); if(this.rowCount === 0){ this.showMessage(this.noDataMessage); } } }, _onRevert: function(){ this._refresh(); }, setStore: function(store, query, queryOptions){ this._setQuery(query, queryOptions); this._setStore(store); this._refresh(true); }, setQuery: function(query, queryOptions){ this._setQuery(query, queryOptions); this._refresh(true); }, setItems: function(items){ this.items = items; this._setStore(this.store); this._refresh(true); }, _setQuery: function(query, queryOptions){ this.query = query || this.query; this.queryOptions = queryOptions || this.queryOptions; }, _setStore: function(store){ if(this.store&&this._store_connects){ dojo.forEach(this._store_connects,function(arr){ dojo.forEach(arr, dojo.disconnect); }); } this.store = store; if(this.store){ var f = this.store.getFeatures(); var h = []; this._canEdit = !!f["dojo.data.api.Write"] && !!f["dojo.data.api.Identity"]; this._hasIdentity = !!f["dojo.data.api.Identity"]; if(!!f["dojo.data.api.Notification"] && !this.items){ h.push(this.connect(this.store, "onSet", "_onSet")); h.push(this.connect(this.store, "onNew", "_onNew")); h.push(this.connect(this.store, "onDelete", "_onDelete")); } if(this._canEdit){ h.push(this.connect(this.store, "revert", "_onRevert")); } this._store_connects = h; } }, _onFetchBegin: function(size, req){ if(this.rowCount != size){ if(req.isRender){ this.scroller.init(size, this.keepRows, this.rowsPerPage); this.prerender(); } this.updateRowCount(size); } }, _onFetchComplete: function(items, req){ if(items && items.length > 0){ //console.log(items); dojo.forEach(items, function(item, idx){ this._addItem(item, req.start+idx, true); }, this); this.updateRows(req.start, items.length); if(req.isRender){ this.setScrollTop(0); this.postrender(); }else if(this._lastScrollTop){ this.setScrollTop(this._lastScrollTop); } } delete this._lastScrollTop; if(!this._isLoaded){ this._isLoading = false; this._isLoaded = true; if(!items || !items.length){ this.showMessage(this.noDataMessage); }else{ this.showMessage(); } } this._pending_requests[req.start] = false; }, _onFetchError: function(err, req){ console.log(err); delete this._lastScrollTop; if(!this._isLoaded){ this._isLoading = false; this._isLoaded = true; this.showMessage(this.errorMessage); } this.onFetchError(err, req); }, onFetchError: function(err, req){ }, _fetch: function(start, isRender){ var start = start || 0; if(this.store && !this._pending_requests[start]){ if(!this._isLoaded && !this._isLoading){ this._isLoading = true; this.showMessage(this.loadingMessage); } this._pending_requests[start] = true; //console.log("fetch: ", start); try{ if(this.items){ var items = this.items; var store = this.store; this.rowsPerPage = items.length var req = { start: start, count: this.rowsPerPage, isRender: isRender }; this._onFetchBegin(items.length, req); // Load them if we need to var waitCount = 0; dojo.forEach(items, function(i){ if(!store.isItemLoaded(i)){ waitCount++; } }); if(waitCount === 0){ this._onFetchComplete(items, req); }else{ var onItem = function(item){ waitCount--; if(waitCount === 0){ this._onFetchComplete(items, req); } }; dojo.forEach(items, function(i){ if(!store.isItemLoaded(i)){ store.loadItem({item: i, onItem: onItem, scope: this}); } }, this); } }else{ this.store.fetch({ start: start, count: this.rowsPerPage, query: this.query, sort: this.getSortProps(), queryOptions: this.queryOptions, isRender: isRender, onBegin: dojo.hitch(this, "_onFetchBegin"), onComplete: dojo.hitch(this, "_onFetchComplete"), onError: dojo.hitch(this, "_onFetchError") }); } }catch(e){ this._onFetchError(e); } } }, _clearData: function(){ this.updateRowCount(0); this._by_idty = {}; this._by_idx = []; this._pages = []; this._bop = this._eop = -1; this._isLoaded = false; this._isLoading = false; }, getItem: function(idx){ var data = this._by_idx[idx]; if(!data||(data&&!data.item)){ this._preparePage(idx); return null; } return data.item; }, getItemIndex: function(item){ return this._getItemIndex(item, false); }, _getItemIndex: function(item, isDeleted){ if(!isDeleted && !this.store.isItem(item)){ return -1; } var idty = this._hasIdentity ? this.store.getIdentity(item) : null; for(var i=0, l=this._by_idx.length; i= this._eop){ var pageIndex = this._rowToPage(inRowIndex); this._needPage(pageIndex); this._bop = pageIndex * this.rowsPerPage; this._eop = this._bop + (this.rowsPerPage || this.rowCount); } }, _needPage: function(inPageIndex){ if(!this._pages[inPageIndex]){ this._pages[inPageIndex] = true; this._requestPage(inPageIndex); } }, _requestPage: function(inPageIndex){ var row = this._pageToRow(inPageIndex); var count = Math.min(this.rowsPerPage, this.rowCount - row); if(count > 0){ this._requests++; if(!this._requestsPending(row)){ setTimeout(dojo.hitch(this, "_fetch", row, false), 1); //this.requestRows(row, count); } } }, getCellName: function(inCell){ return inCell.field; //console.log(inCell); }, _refresh: function(isRender){ this._clearData(); this._fetch(0, isRender); }, sort: function(){ this._lastScrollTop = this.scrollTop; this._refresh(); }, canSort: function(){ return (!this._isLoading); }, getSortProps: function(){ var c = this.getCell(this.getSortIndex()); if(!c){ return null; }else{ var desc = c["sortDesc"]; var si = !(this.sortInfo>0); if(typeof desc == "undefined"){ desc = si; }else{ desc = si ? !desc : desc; } return [{ attribute: c.field, descending: desc }]; } }, styleRowState: function(inRow){ // summary: Perform row styling if(this.store && this.store.getState){ var states=this.store.getState(inRow.index), c=''; for(var i=0, ss=["inflight", "error", "inserting"], s; s=ss[i]; i++){ if(states[s]){ c = ' dojoxGridRow-' + s; break; } } inRow.customClasses += c; } }, onStyleRow: function(inRow){ this.styleRowState(inRow); this.inherited(arguments); }, // editing canEdit: function(inCell, inRowIndex){ return this._canEdit; }, _copyAttr: function(idx, attr){ var row = {}; var backstop = {}; var src = this.getItem(idx); return this.store.getValue(src, attr); }, doStartEdit: function(inCell, inRowIndex){ if(!this._cache[inRowIndex]){ this._cache[inRowIndex] = this._copyAttr(inRowIndex, inCell.field); } this.onStartEdit(inCell, inRowIndex); }, doApplyCellEdit: function(inValue, inRowIndex, inAttrName){ this.store.fetchItemByIdentity({ identity: this._by_idx[inRowIndex].idty, onItem: dojo.hitch(this, function(item){ this.store.setValue(item, inAttrName, inValue); this.onApplyCellEdit(inValue, inRowIndex, inAttrName); }) }); }, doCancelEdit: function(inRowIndex){ var cache = this._cache[inRowIndex]; if(cache){ this.updateRow(inRowIndex); delete this._cache[inRowIndex]; } this.onCancelEdit.apply(this, arguments); }, doApplyEdit: function(inRowIndex, inDataAttr){ var cache = this._cache[inRowIndex]; /*if(cache){ var data = this.getItem(inRowIndex); if(this.store.getValue(data, inDataAttr) != cache){ this.update(cache, data, inRowIndex); } delete this._cache[inRowIndex]; }*/ this.onApplyEdit(inRowIndex); }, removeSelectedRows: function(){ // summary: // Remove the selected rows from the grid. if(this._canEdit){ this.edit.apply(); var items = this.selection.getSelected(); if(items.length){ dojo.forEach(items, this.store.deleteItem, this.store); this.selection.clear(); } } } }); dojox.grid.DataGrid.markupFactory = function(props, node, ctor, cellFunc){ return dojox.grid._Grid.markupFactory(props, node, ctor, function(node, cellDef){ var field = dojo.trim(dojo.attr(node, "field")||""); if(field){ cellDef.field = field; } cellDef.field = cellDef.field||cellDef.name; if(cellFunc){ cellFunc(node, cellDef); } }); }