hedera-web/js/htk/grid.js

354 lines
7.7 KiB
JavaScript
Raw Normal View History

2022-05-21 21:31:56 +00:00
var Widget = require('./widget');
2016-09-26 09:28:47 +00:00
2022-05-21 21:31:56 +00:00
module.exports = new Class({
2016-09-26 09:28:47 +00:00
Extends: Widget
,Tag: 'htk-grid'
,Child: 'model'
,Properties:
{
2015-11-19 13:57:23 +00:00
/**
* The source data model.
2022-05-26 06:08:31 +00:00
*/
model:
{
type: Db.Model
2022-05-21 21:31:56 +00:00
,set: function(x) {
this.link({_model: x},
{
'status-changed': this.onModelChange
,'row-deleted': this.onRowDelete
,'row-updated': this.onRowUpdate
,'row-inserted': this.onRowInsert
,'updatable-changed': this.onUpdatableChange
});
2022-05-21 21:31:56 +00:00
var set = new Db.SimpleIterator({model: x});
this.link({_set: set});
2022-05-21 21:31:56 +00:00
this.onUpdatableChange();
this.onModelChange();
}
2022-05-21 21:31:56 +00:00
,get: function() {
2015-09-28 09:46:24 +00:00
return this._model;
}
},
2015-11-19 13:57:23 +00:00
/**
* Message that should be displayed when source model is not ready.
2022-05-26 06:08:31 +00:00
*/
emptyMessage:
{
type: String
,value: null
2015-07-03 05:49:45 +00:00
},
2015-11-19 13:57:23 +00:00
/**
* Wether to display the header with column titles.
2022-05-26 06:08:31 +00:00
*/
2015-07-03 05:49:45 +00:00
showHeader:
{
type: Boolean
2022-05-21 21:31:56 +00:00
,set: function(x) {
2015-07-03 05:49:45 +00:00
this._showHeader = x;
this.thead.style.display = x ? 'table-header-group' : 'none';
}
2022-05-21 21:31:56 +00:00
,get: function() {
2015-07-03 05:49:45 +00:00
return this._showHeader;
}
}
}
,_model: null
,_set: null
2022-05-21 21:31:56 +00:00
,columns: new Array()
,internalColumn: null
,internalColumns: 0
2015-04-01 08:24:15 +00:00
,sortColumn: -1
,sortWay: null
2015-07-03 05:49:45 +00:00
,_showHeader: true
2022-05-21 21:31:56 +00:00
,render: function() {
var table = this.createRoot('table');
2016-10-16 14:16:08 +00:00
table.className = 'htk-grid';
2022-05-21 21:31:56 +00:00
var thead = this.createElement('thead');
table.appendChild(thead);
2022-05-21 21:31:56 +00:00
this.thead = this.createElement('tr')
thead.appendChild(this.thead);
2022-05-21 21:31:56 +00:00
this.tbody = this.createElement('tbody');
table.appendChild(this.tbody);
2015-11-09 08:14:33 +00:00
}
2022-05-21 21:31:56 +00:00
,appendChild: function(child) {
this.appendColumn(child);
}
2022-05-21 21:31:56 +00:00
,removeClicked: function(column, value, row) {
if (confirm(_('ReallyDelete')))
this._model.deleteRow(row);
}
2022-05-21 21:31:56 +00:00
,onRowDelete: function(model, row) {
var tableRows = this.tbody.childNodes;
2022-05-21 21:31:56 +00:00
this.tbody.removeChild(tableRows[row]);
for (var i = row; i < tableRows.length; i++)
tableRows[i].className = (i % 2) ? 'pair-row' : '';
2022-05-21 21:31:56 +00:00
this.showNoRecordsFound();
}
2022-05-21 21:31:56 +00:00
,onRowInsert: function() {
this.buildRow(1);
}
2022-05-21 21:31:56 +00:00
,renderCell: function(row, column, tr) {
if (column.columnIndex != -1)
column.value = this._model.data[row][column.columnIndex];
2022-05-21 21:31:56 +00:00
if (column.renderer) {
this._set.row = row;
2022-05-21 21:31:56 +00:00
column.renderer(column, this._set);
}
2022-05-21 21:31:56 +00:00
return column.render(tr);
}
2022-05-21 21:31:56 +00:00
,refreshRow: function(row, columns) {
var x = this.columns;
var tr = this.tbody.childNodes[row];
for (var i = 0; i < x.length; i++)
2022-05-21 21:31:56 +00:00
if (x[i].renderer || columns.indexOf(x[i].columnIndex) != -1) {
var cell = this.renderCell(row, x[i], tr);
tr.replaceChild(cell, tr.childNodes[i]);
}
}
2022-05-21 21:31:56 +00:00
,onRowUpdate: function(model, row, columns) {
this.refreshRow(row, columns);
}
2022-05-21 21:31:56 +00:00
,buildRow: function(count) {
for (var i = 0; i < count; i++) {
var tr = this.createElement('tr');
if (i % 2)
tr.className = 'pair-row';
2022-05-21 21:31:56 +00:00
for (var j = 0; j < this.columns.length; j++) {
var cell = this.renderCell(i, this.columns[j], tr);
tr.appendChild(cell);
}
2022-05-21 21:31:56 +00:00
this.tbody.appendChild(tr);
}
}
2022-05-21 21:31:56 +00:00
,onUpdatableChange: function() {
if (this._model && this._model.updatable) {
if (!this.internalColumn) {
this.internalColumn = new Htk.ColumnButton({
2016-09-26 09:28:47 +00:00
icon: 'delete'
,tip: _('Remove')
});
2022-05-21 21:31:56 +00:00
this.internalColumn.on('clicked', this.removeClicked, this);
this.insertInternalColumn(0, this.internalColumn);
}
2022-05-21 21:31:56 +00:00
} else if (this.internalColumn) {
this.internalColumn = null;
2022-05-21 21:31:56 +00:00
this.removeInternalColumn(0);
}
}
2022-05-21 21:31:56 +00:00
,onModelChange: function() {
var emptyMessage = this.emptyMessage ?
this.emptyMessage : _('NoData');
2022-05-21 21:31:56 +00:00
if (!this._model) {
this.showMessage(emptyMessage, 'refresh');
return;
}
2022-05-21 21:31:56 +00:00
this._node.removeChild(this.tbody);
this.tbody = this.createElement('tbody');
2022-05-21 21:31:56 +00:00
switch (this._model.status) {
case Db.Model.Status.READY:
{
for (var i = 0; i < this.columns.length; i++)
2022-05-21 21:31:56 +00:00
this.columns[i].updateColumnIndex(this._model);
2022-05-21 21:31:56 +00:00
this.buildRow(this._model.numRows);
this.showNoRecordsFound();
break;
}
case Db.Model.Status.LOADING:
2022-05-21 21:31:56 +00:00
this.showMessage(_('Loading'), null);
break;
case Db.Model.Status.CLEAN:
2022-05-21 21:31:56 +00:00
this.showMessage(emptyMessage, 'refresh');
break;
case Db.Model.Status.ERROR:
2022-05-21 21:31:56 +00:00
this.showMessage(_('ErrorLoadingData'), 'error');
break;
}
2022-05-21 21:31:56 +00:00
this._node.appendChild(this.tbody);
}
2022-05-21 21:31:56 +00:00
,showNoRecordsFound: function() {
if (this._model.numRows == 0)
2022-05-21 21:31:56 +00:00
this.showMessage(_('EmptyList'), 'block');
}
2022-05-21 21:31:56 +00:00
,showMessage: function(message, src) {
if (this.columns.length == 0)
return;
2022-05-21 21:31:56 +00:00
var tr = this.createElement('tr');
this.tbody.appendChild(tr);
2022-05-21 21:31:56 +00:00
var td = this.createElement('td');
2015-07-03 05:49:45 +00:00
td.className = 'message';
td.colSpan = this.columns.length;
2022-05-21 21:31:56 +00:00
tr.appendChild(td);
2022-05-21 21:31:56 +00:00
if (src) {
const icon = new Htk.Icon({
name: src
});
td.appendChild(icon.node);
} else {
var spinner = new Htk.Spinner();
spinner.start();
td.appendChild(spinner.node);
2015-11-19 13:57:23 +00:00
}
2022-05-21 21:31:56 +00:00
var message = this.createTextNode(message);
td.appendChild(message);
}
2022-05-21 21:31:56 +00:00
,scrollToRow: function(row) {
if (row >= 0) {
var height = parseInt(this.tr.style.height);
this.node.scrollTop = (row - 2) * height;
if (this.selectedRow)
this.selectedRow.style.backgroundColor = null;
this.selectedRow = this.tbody.childNodes[row]
this.selectedRow.style.backgroundColor = '#AAD';
}
}
2022-05-21 21:31:56 +00:00
,sortModel: function(column) {
var columnIndex = column.columnIndex;
2022-05-21 21:31:56 +00:00
if (this._model && columnIndex != -1) {
2015-04-01 08:24:15 +00:00
if (this.sortColumn === columnIndex
&& this.sortWay === Db.Model.SortWay.ASC)
this.sortWay = Db.Model.SortWay.DESC;
else
this.sortWay = Db.Model.SortWay.ASC;
this.sortColumn = columnIndex;
2022-05-21 21:31:56 +00:00
this._model.sort(columnIndex, this.sortWay);
2015-04-01 08:24:15 +00:00
}
}
2022-05-21 21:31:56 +00:00
,columnChanged: function(column, row, newValue) {
var columnIndex = column.columnIndex;
if (columnIndex != -1)
2022-05-21 21:31:56 +00:00
this._model.setByIndex(row, columnIndex, newValue);
}
2022-05-21 21:31:56 +00:00
,addColumn: function(pos, column) {
var header = column.renderHeader();
if (pos == -1 || pos >= this.columns.length) {
pos = this.columns.push(column) - 1;
this.thead.appendChild(header);
} else {
this.columns.splice(pos, 0, column);
this.thead.insertBefore(header, this.thead.childNodes[pos]);
}
2022-05-21 21:31:56 +00:00
header.addEventListener('click',
this.sortModel.bind(this, column));
header.title = _('Sort');
2022-05-21 21:31:56 +00:00
column.on('changed', this.columnChanged, this);
var rows = this.tbody.childNodes;
if (this._model && this._model.numRows > 0)
2022-05-21 21:31:56 +00:00
for (var i = 0; i < rows.length; i++) {
var cell = this.renderCell(i, column, rows[i]);
rows[i].insertBefore(cell, rows[i].childNodes[pos+1]);
}
return pos;
}
2022-05-21 21:31:56 +00:00
,insertInternalColumn: function(pos, column) {
if (pos < 0 || pos > this.internalColumns)
pos = this.internalColumns;
this.internalColumns++;
2022-05-21 21:31:56 +00:00
return this.addColumn(pos, column);
}
2022-05-21 21:31:56 +00:00
,insertColumn: function(pos, column) {
if (pos > 0)
pos += this.internalColumns;
2022-05-21 21:31:56 +00:00
return this.addColumn(pos, column) - this.internalColumns;
}
2022-05-21 21:31:56 +00:00
,appendColumn: function(column) {
return this.insertColumn(-1, column);
}
2022-05-21 21:31:56 +00:00
,deleteColumn: function(pos) {
if (pos < 0 || pos >= this.columns.length)
return;
2022-05-21 21:31:56 +00:00
this.columns.splice(pos, 1);
this.thead.removeChild(this.thead.childNodes[pos]);
var rows = this.tbody.childNodes;
if (this._model && this._model.numRows > 0)
for (var i = 0; i < rows.length; i++)
2022-05-21 21:31:56 +00:00
rows[i].removeChild(rows[i].childNodes[pos]);
}
2022-05-21 21:31:56 +00:00
,removeInternalColumn: function(pos) {
if (this.internalColumns == 0)
return;
if (pos < 0 || pos > this.internalColumns)
pos = this.internalColumns;
2022-05-21 21:31:56 +00:00
this.deleteColumn(pos);
this.internalColumns--;
}
2022-05-21 21:31:56 +00:00
,removeColumn: function(pos) {
if (pos > 0)
pos += this.internalColumns;
2022-05-21 21:31:56 +00:00
this.deleteColumn(pos);
}
2022-05-21 21:31:56 +00:00
,reloadModel: function() {
if (this._model != null)
2022-05-21 21:31:56 +00:00
this.onModelChange();
}
});