@true-directive/base
Version:
The set of base classes for the TrueDirective Grid
366 lines (365 loc) • 15.2 kB
JavaScript
import { ColumnType, GridPart } from './enums';
import { FilterOperator, Filter } from './filter.class';
import { Summary } from './summary.class';
/**
* Grid column. Contains:
* - data field,
* - caption,
* - data type,
* - column width,
* - width calc params for the columnAutoWidth option,
* - calculated column width (when columnAutoWidth option is turned on),
* - css-classes for column cells
* - column summaries,
* - column settings
*/
var Column = /** @class */ (function () {
/**
* Сonstructor
* @param fieldName Data field to display
* @param caption Text for the column header. Если не задано, будет отображено
* наименование поля.
* @param width Ширина (в заданных единицах измерения)
* @param {ColumnType} dataType Тип данных (see [[ColumnType]]).
* Если не задано, принимается равным ColumnType.STRING.
* @param band='' Заголовок группы колонок
* @param format='' Формат вывода значения
*/
function Column(fieldName, caption, width, type, band, format) {
if (caption === void 0) { caption = null; }
if (width === void 0) { width = 150; }
if (type === void 0) { type = ColumnType.STRING; }
if (band === void 0) { band = ''; }
if (format === void 0) { format = ''; }
this.fieldName = fieldName;
this.caption = caption;
this.width = width;
this.type = type;
this.band = band;
this.format = format;
// -- Параметры автоматического расчета ширины колонки -----------------------
/**
* Минимальная ширина в заданных единицах измерения. Ни при каких условиях
* ширина колонки не будет меньше заданного здесь значения
*/
this.autoWidthMin = undefined;
/**
* Приоритет отображения. Если ширины клиентской части грида не хватает,
* чтобы уместить колонку с её минимальным размером, то первыми перестанут
* отображаться колонки, приоритет которых минимален.
* Если приоритет не задан, то они никогда не перестают отображаться.
*/
this.autoWidthPriority = 0; // undefined;
/**
* Фиксированная ширина колонки. Не будет пересчитываться.
*/
this.autoWidthFixed = false;
// -- Settings -------------------------------------------------------
/**
* Разрешено ли пользователю изменять ширину колонки
*/
this.columnResize = true;
/**
* Разрешено ли пользователю перемещать эту колонку
*/
this.columnReorder = true;
/**
* Разрешена ли сортировка по колонке
*/
this.allowSorting = true;
/**
* Разрешен ли фильтр по колонке
*/
this.allowFilter = true;
/**
* Показывать колонку в таблице, если по ней произведена группировка
* (данная опция пока отклчючена)
*/
this.showIfGrouped = false;
/**
* Разрешено ли редактирование данных в этой колонке
*/
this.allowEdit = true;
/**
* Видимость колонки
*/
this.visible = true;
/**
* Список итогов колонки
*/
this.summaries = [];
/**
* Признак того, что колонка является временной при перемещении
*/
this.temp = false;
/**
* В какой части грида находится колонка. По умолчанию - в основной центральной
* части.
*/
this.fixed = GridPart.CENTER;
/**
* Ширина при отображении с единицей измерения
*/
this.displayedWidthU = '';
/**
* Ширина заголовка с единицей измерения
*/
this.displayedHeaderWidth = '';
/**
* Отображаемое поле.
* Если задано, то вместо заданного в свойстве [fieldName] поля отображается это.
* Например, чтобы сортировка и фильтры производились по значению,
* а отображалось отформатированное значение.
* Также используется, когда к какому-то идентификатору привязано текстовое значение.
* При редактировании отображается исходное значение.
*/
this.displayField = '';
/**
* Поле, содержащее ссылку для полей с dataType = ColumnType.REFERENCE
*/
this.referenceField = '';
/**
* Target of the
*/
this.referenceTarget = '';
/**
* Общий класс для всех ячеек колонки
*/
this.class = '';
/**
* Поле, из которого можно получить класс ячейки конкретной строки
*/
this.classField = '';
/**
* Тип компонента, который будет вставлен во все ячейки колонки вместо
* значения (см. Cell components)
*/
this.cellComponentType = null;
/**
* Тип компонента, который будет использован как редактор для ячеек этой колонки
*/
this.editorComponentType = null;
/**
* Тип компонента, который будет использован как фильтр
*/
this.filterComponentType = null;
/**
* Чекбокс, находящийся в заголовке отмечен
*/
this._checked = false;
/**
* Источник данных для выпадающего списка при редактировании.
* Ожидается массив или Observable
*/
this.optionsData = null;
/**
* Список колонок выпадающего списка при редактировании
* Если не задан, то будет создана одна колонка с полем name.
*/
this.optionsColumns = null;
if (this.caption === null) {
this.caption = fieldName;
}
if (!this.type) {
this.type = ColumnType.STRING;
}
// Default width of column
if (!this.width) {
this.width = 150;
}
}
Object.defineProperty(Column.prototype, "isChecked", {
/**
* Узначем, отмечен ли чекбокс в заголовке колонки
*/
get: function () {
return this._checked;
},
enumerable: true,
configurable: true
});
/**
* Устанавливаем, отмечен ли чекбокс в заголовке колонки
*/
Column.prototype.setChecked = function (v) {
this._checked = v;
};
Object.defineProperty(Column.prototype, "isCheckbox", {
/**
* Является ли колонка
*/
get: function () {
return this.type === ColumnType.CHECKBOX;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Column.prototype, "isNumeric", {
/**
* Содержит ли колонка числовые значения
*/
get: function () {
return this.type === ColumnType.NUMBER;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Column.prototype, "isBoolean", {
/**
* Содержит ли колонка boolean значения
*/
get: function () {
return this.type === ColumnType.BOOLEAN;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Column.prototype, "isText", {
/**
* Может ли в значении колонки находиться текстовое содержимое
* @return True, если может
*/
get: function () {
return this.type === ColumnType.STRING ||
this.type === ColumnType.REFERENCE ||
this.type === ColumnType.HTML ||
this.type === ColumnType.UNSAFE_HTML;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Column.prototype, "canReorder", {
/**
* Можно ли пользователю менять порядок этой колонки (перетаскивание мышью за
* заголовок колонки)
* @return True, если можно
*/
get: function () {
if (this.isCheckbox) {
return false;
}
return this.columnReorder;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Column.prototype, "canResize", {
/**
* Можно ли пользователю менять ширину колонки
* @return True, если можно
*/
get: function () {
if (this.isCheckbox) {
return false;
}
return this.columnResize;
},
enumerable: true,
configurable: true
});
/**
* Создание фильтра для колонки перед его редактированием.
* @param v Значение по умолчанию (берется из выделенной строки, если есть)
* @return Фильтр для колонки
*/
Column.prototype.createFilter = function (v, operator) {
if (operator === void 0) { operator = null; }
var res = null;
var items = [];
var value1 = null;
var value2 = null;
if (this.type === ColumnType.STRING
|| this.type === ColumnType.REFERENCE
|| this.type === ColumnType.HTML
|| this.type === ColumnType.UNSAFE_HTML) {
operator = operator !== null ? operator : FilterOperator.CONTAINS;
}
else {
if (this.type === ColumnType.BOOLEAN) {
operator = operator !== null ? operator : FilterOperator.SET;
}
else {
operator = operator !== null ? operator : FilterOperator.BETWEEN;
}
}
switch (operator) {
case FilterOperator.BETWEEN:
case FilterOperator.NOT_BETWEEN:
if (Array.isArray(v) && v.length === 2) {
value1 = v[0];
value2 = v[1];
}
else {
value1 = v;
value2 = v;
}
break;
case FilterOperator.SET:
if (Array.isArray(v)) {
items = v;
}
else {
items.push(v);
}
break;
default:
value1 = v;
value2 = v;
}
res = new Filter(this.fieldName, operator, value1, value2, items);
res.format = this.format;
res.caption = this.caption;
res.type = this.type;
return res;
};
/**
* Добавление итога по колонке
* @param t {SummaryType} Тип суммирования
* @return {Summary} Вся необходимая информация для подсчета итогов
*/
Column.prototype.addSummary = function (t) {
this.summaries.push(new Summary(t));
};
/**
* Изменение итога по колонке. Добавляет или удаляет или изменяет
* итог по колонке.
* @param t {SummaryType} Тип суммирования
* @param a {Summary} Текущее суммирование. Если не задан, то удаляются все имеющиеся
* итоги. Если задано, то это суммирование заменяется на новое, или удаляется в случае,
* если тип суммирования не задан
*/
Column.prototype.setSummary = function (t, a) {
if (a === void 0) { a = null; }
if (a === null) {
// Обнуляем список суммирований
this.clearSummaries();
if (t !== null) {
this.summaries.push(new Summary(t));
}
}
else {
if (t === null) {
// Удаляем
this.summaries.splice(this.summaries.indexOf(a), 1);
}
else {
// Меняем
a.type = t;
}
}
};
Column.prototype.clearSummaries = function () {
this.summaries.splice(0, this.summaries.length);
};
/**
* Клонирование колонки
* @return Возвращает новый instance класса Column с такими же свойствами, что и текущая колонка
*/
Column.prototype.clone = function () {
var res = new Column(this.fieldName, this.caption, this.width, this.type, this.band, this.format);
res.allowEdit = this.allowEdit;
return res;
};
return Column;
}());
export { Column };