@true-directive/base
Version:
The set of base classes for the TrueDirective Grid
1,263 lines (1,221 loc) • 360 kB
JavaScript
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define("TrueDirectiveBase", [], factory);
else if(typeof exports === 'object')
exports["TrueDirectiveBase"] = factory();
else
root["TrueDirectiveBase"] = factory();
})(window, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {
module.exports = __webpack_require__(1);
/***/ }),
/* 1 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
// ESM COMPAT FLAG
__webpack_require__.r(__webpack_exports__);
// EXPORTS
__webpack_require__.d(__webpack_exports__, "Dates", function() { return /* reexport */ Dates; });
__webpack_require__.d(__webpack_exports__, "Strings", function() { return /* reexport */ Strings; });
__webpack_require__.d(__webpack_exports__, "Keys", function() { return /* reexport */ Keys; });
__webpack_require__.d(__webpack_exports__, "KeyInfo", function() { return /* reexport */ KeyInfo; });
__webpack_require__.d(__webpack_exports__, "Utils", function() { return /* reexport */ Utils; });
__webpack_require__.d(__webpack_exports__, "FilterPipe", function() { return /* reexport */ filter_pipe_FilterPipe; });
__webpack_require__.d(__webpack_exports__, "PagePipe", function() { return /* reexport */ PagePipe; });
__webpack_require__.d(__webpack_exports__, "SortPipe", function() { return /* reexport */ sort_pipe_SortPipe; });
__webpack_require__.d(__webpack_exports__, "SummaryPipe", function() { return /* reexport */ summary_pipe_SummaryPipe; });
__webpack_require__.d(__webpack_exports__, "DateParserFormatter", function() { return /* reexport */ date_parser_formatter_class_DateParserFormatter; });
__webpack_require__.d(__webpack_exports__, "NumberFormat", function() { return /* reexport */ NumberFormat; });
__webpack_require__.d(__webpack_exports__, "NumberParserFormatter", function() { return /* reexport */ number_parser_formatter_class_NumberParserFormatter; });
__webpack_require__.d(__webpack_exports__, "Internationalization", function() { return /* reexport */ Internationalization; });
__webpack_require__.d(__webpack_exports__, "Locale", function() { return /* reexport */ Locale; });
__webpack_require__.d(__webpack_exports__, "Mask", function() { return /* reexport */ mask_class_Mask; });
__webpack_require__.d(__webpack_exports__, "MaskSection", function() { return /* reexport */ mask_section_class_MaskSection; });
__webpack_require__.d(__webpack_exports__, "MaskSectionAction", function() { return /* reexport */ MaskSectionAction; });
__webpack_require__.d(__webpack_exports__, "MaskResult", function() { return /* reexport */ MaskResult; });
__webpack_require__.d(__webpack_exports__, "MaskSectionType", function() { return /* reexport */ MaskSectionType; });
__webpack_require__.d(__webpack_exports__, "MaskSectionValue", function() { return /* reexport */ MaskSectionValue; });
__webpack_require__.d(__webpack_exports__, "MaskSettings", function() { return /* reexport */ MaskSettings; });
__webpack_require__.d(__webpack_exports__, "MaskState", function() { return /* reexport */ MaskState; });
__webpack_require__.d(__webpack_exports__, "MaskValue", function() { return /* reexport */ mask_value_class_MaskValue; });
__webpack_require__.d(__webpack_exports__, "MenuAction", function() { return /* reexport */ MenuAction; });
__webpack_require__.d(__webpack_exports__, "ColumnType", function() { return /* reexport */ ColumnType; });
__webpack_require__.d(__webpack_exports__, "DetectionMode", function() { return /* reexport */ DetectionMode; });
__webpack_require__.d(__webpack_exports__, "GridPart", function() { return /* reexport */ GridPart; });
__webpack_require__.d(__webpack_exports__, "LazyLoadingMode", function() { return /* reexport */ LazyLoadingMode; });
__webpack_require__.d(__webpack_exports__, "RenderMode", function() { return /* reexport */ RenderMode; });
__webpack_require__.d(__webpack_exports__, "EditorShowMode", function() { return /* reexport */ EditorShowMode; });
__webpack_require__.d(__webpack_exports__, "SelectionMode", function() { return /* reexport */ SelectionMode; });
__webpack_require__.d(__webpack_exports__, "PopupPosition", function() { return /* reexport */ PopupPosition; });
__webpack_require__.d(__webpack_exports__, "CancelableEvent", function() { return /* reexport */ CancelableEvent; });
__webpack_require__.d(__webpack_exports__, "CloseEvent", function() { return /* reexport */ CloseEvent; });
__webpack_require__.d(__webpack_exports__, "CheckedChangedEvent", function() { return /* reexport */ CheckedChangedEvent; });
__webpack_require__.d(__webpack_exports__, "ValueChangedEvent", function() { return /* reexport */ ValueChangedEvent; });
__webpack_require__.d(__webpack_exports__, "FilterShowEvent", function() { return /* reexport */ FilterShowEvent; });
__webpack_require__.d(__webpack_exports__, "RowDragEvent", function() { return /* reexport */ RowDragEvent; });
__webpack_require__.d(__webpack_exports__, "RowClickEvent", function() { return /* reexport */ RowClickEvent; });
__webpack_require__.d(__webpack_exports__, "CellClickEvent", function() { return /* reexport */ CellClickEvent; });
__webpack_require__.d(__webpack_exports__, "ContextMenuEvent", function() { return /* reexport */ ContextMenuEvent; });
__webpack_require__.d(__webpack_exports__, "CellPosition", function() { return /* reexport */ CellPosition; });
__webpack_require__.d(__webpack_exports__, "CellRange", function() { return /* reexport */ cell_range_class_CellRange; });
__webpack_require__.d(__webpack_exports__, "CellHighlighter", function() { return /* reexport */ cell_highlighter_class_CellHighlighter; });
__webpack_require__.d(__webpack_exports__, "Column", function() { return /* reexport */ column_class_Column; });
__webpack_require__.d(__webpack_exports__, "ColumnBand", function() { return /* reexport */ ColumnBand; });
__webpack_require__.d(__webpack_exports__, "DataQuery", function() { return /* reexport */ DataQuery; });
__webpack_require__.d(__webpack_exports__, "Filter", function() { return /* reexport */ filter_class_Filter; });
__webpack_require__.d(__webpack_exports__, "FilterOperator", function() { return /* reexport */ FilterOperator; });
__webpack_require__.d(__webpack_exports__, "GridLayoutRange", function() { return /* reexport */ GridLayoutRange; });
__webpack_require__.d(__webpack_exports__, "GridLayoutSelection", function() { return /* reexport */ GridLayoutSelection; });
__webpack_require__.d(__webpack_exports__, "GridLayout", function() { return /* reexport */ grid_layout_class_GridLayout; });
__webpack_require__.d(__webpack_exports__, "GridAppearance", function() { return /* reexport */ GridAppearance; });
__webpack_require__.d(__webpack_exports__, "PageInfo", function() { return /* reexport */ PageInfo; });
__webpack_require__.d(__webpack_exports__, "RowLayout", function() { return /* reexport */ RowLayout; });
__webpack_require__.d(__webpack_exports__, "RowPosition", function() { return /* reexport */ RowPosition; });
__webpack_require__.d(__webpack_exports__, "RowDragOverseer", function() { return /* reexport */ RowDragOverseer; });
__webpack_require__.d(__webpack_exports__, "SortInfo", function() { return /* reexport */ SortInfo; });
__webpack_require__.d(__webpack_exports__, "SortType", function() { return /* reexport */ SortType; });
__webpack_require__.d(__webpack_exports__, "Summary", function() { return /* reexport */ Summary; });
__webpack_require__.d(__webpack_exports__, "SummaryType", function() { return /* reexport */ SummaryType; });
__webpack_require__.d(__webpack_exports__, "UIAction", function() { return /* reexport */ UIAction; });
__webpack_require__.d(__webpack_exports__, "UIActionType", function() { return /* reexport */ UIActionType; });
__webpack_require__.d(__webpack_exports__, "ValueFormatter", function() { return /* reexport */ value_formatter_class_ValueFormatter; });
__webpack_require__.d(__webpack_exports__, "Selection", function() { return /* reexport */ selection_class_Selection; });
__webpack_require__.d(__webpack_exports__, "GridSettings", function() { return /* reexport */ grid_settings_class_GridSettings; });
__webpack_require__.d(__webpack_exports__, "AxInject", function() { return /* reexport */ AxInject; });
__webpack_require__.d(__webpack_exports__, "AxInjectConsumer", function() { return /* reexport */ AxInjectConsumer; });
__webpack_require__.d(__webpack_exports__, "ColumnCollection", function() { return /* reexport */ column_collection_class_ColumnCollection; });
__webpack_require__.d(__webpack_exports__, "DataSource", function() { return /* reexport */ data_source_class_DataSource; });
__webpack_require__.d(__webpack_exports__, "GridUIHandler", function() { return /* reexport */ grid_ui_handler_GridUIHandler; });
__webpack_require__.d(__webpack_exports__, "GridExporter", function() { return /* reexport */ grid_exporter_class_GridExporter; });
__webpack_require__.d(__webpack_exports__, "LayoutsHandler", function() { return /* reexport */ layouts_handler_LayoutsHandler; });
__webpack_require__.d(__webpack_exports__, "RowCalculator", function() { return /* reexport */ row_calculator_class_RowCalculator; });
__webpack_require__.d(__webpack_exports__, "GridState", function() { return /* reexport */ grid_state_class_GridState; });
// CONCATENATED MODULE: ./src/common/dates.class.ts
/**
* Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company.
* @link https://truedirective.com/
* @license MIT
*/
var Dates = /** @class */ (function () {
function Dates() {
}
Dates.isEmpty = function (d) {
return d === null || d === undefined || d.getTime === undefined || d.getTime() === NaN;
};
/**
* Returns timestamp of the given date or null
* @param d Date
* @return Timestamp or date's timestamp
*/
Dates.getTimeNull = function (d) {
if (d === null || d === undefined) {
return null;
}
return d.getTime();
};
/**
* Are two dates equal?
* @param d1 First date
* @param d2 Second date
* @return True if dates are equals.
*/
Dates.equals = function (d1, d2) {
if (!d1 && !d2) {
return true;
}
if (!d1 || !d2) {
return false;
}
return d1.getTime() === d2.getTime();
};
/**
* Comparing two dates.
* @param d1 First date.
* @param d2 Second date.
* @return True if both dates are equal.
*/
Dates.compare = function (d1, d2) {
if (!d1 && !d2) {
return 0;
}
if (!d1 && d2) {
return -1;
}
if (d1 && !d2) {
return 1;
}
if (d1.getTime() === d2.getTime()) {
return 0;
}
return d1.getTime() > d2.getTime() ? 1 : -1;
};
/**
* Returns today's date with no time.
* @return Today's date with no time.
*/
Dates.today = function () {
var now = new Date();
return new Date(now.getFullYear(), now.getMonth(), now.getDate());
};
/**
* Returns yesterday's date without time.
* @return Yesterday's date without time.
*/
Dates.yesterday = function () {
var now = new Date();
return new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1);
};
/**
* Returns the date following the specified date.
* @param d Date
* @return The date following the date.
*/
Dates.nextDate = function (d) {
return new Date(d.getFullYear(), d.getMonth(), d.getDate() + 1);
};
/**
* Returns a date that is more than the specified date for the specified number of days.
* @param d Date
* @param days Number of days
* @return
*/
Dates.addDays = function (d, days) {
return new Date(d.getFullYear(), d.getMonth(), d.getDate() + days);
};
// Первая дата недели, включающей заданную дату
Dates.firstDateOfWeek = function (d, firstDay) {
var day = d.getDay();
if (firstDay > day) {
day += 7;
}
day -= firstDay;
return new Date(d.getFullYear(), d.getMonth(), d.getDate() - day);
};
// Последняя дата недели, включающей заданную дату
Dates.lastDateOfWeek = function (d, firstDay) {
var firstDate = Dates.firstDateOfWeek(d, firstDay);
return new Date(firstDate.getFullYear(), firstDate.getMonth(), firstDate.getDate() + 6);
};
// Первая дата недели, которая следует за неделей, включающей заданную дату
Dates.lastDateOfPrevWeek = function (d, firstDay) {
var firstDate = Dates.firstDateOfWeek(d, firstDay);
return new Date(firstDate.getFullYear(), firstDate.getMonth(), firstDate.getDate() - 1);
};
// Первая дата недели, которая следует за неделей, включающей заданную дату
Dates.firstDateOfNextWeek = function (d, firstDay) {
var lastDate = Dates.lastDateOfWeek(d, firstDay);
return new Date(lastDate.getFullYear(), lastDate.getMonth(), lastDate.getDate() + 1);
};
// Первая дата месяца, включающего заданную дату
Dates.firstDateOfMonth = function (d) {
return new Date(d.getFullYear(), d.getMonth(), 1);
};
// Последная дата месяца, включающего заданную дату
Dates.lastDateOfMonth = function (d) {
return new Date(d.getFullYear(), d.getMonth() + 1, 0);
};
// Первая дата месяца, который следует за месяцем, включающим заданную дату
Dates.firstDateOfNextMonth = function (d) {
var last = Dates.lastDateOfMonth(d);
return new Date(last.getFullYear(), last.getMonth(), last.getDate() + 1);
};
// Последняя дата месяца, который следует за месяцем, включающим заданную дату
Dates.lastDateOfNextMonth = function (d) {
return Dates.lastDateOfMonth(Dates.firstDateOfNextMonth(d));
};
// Первая дата месяца, который предшествует месяцу, включающему заданную дату
Dates.firstDateOfPrevMonth = function (d) {
var last = Dates.lastDateOfPrevMonth(d);
return Dates.firstDateOfMonth(last);
};
// Последняя дата месяца, который предшествует месяцу, включающему заданную дату
Dates.lastDateOfPrevMonth = function (d) {
var first = Dates.firstDateOfMonth(d);
return new Date(first.getFullYear(), first.getMonth(), first.getDate() - 1);
};
// Дата находится в интервале между двумя заданными датами (включительно)
Dates.dateBetween = function (d, start, end) {
return d.getTime() >= start.getTime() && d.getTime() <= end.getTime();
};
// Дата находится в том же месяце, что и вторая дата
Dates.isSameMonth = function (d1, d2) {
if (d1 === null || d1 === undefined) {
return false;
}
if (d2 === null || d2 === undefined) {
return false;
}
return d1.getFullYear() === d2.getFullYear() && d1.getMonth() === d2.getMonth();
};
// Дата находится в том же году, что и вторая дата
Dates.isSameYear = function (d1, d2) {
if (d1 === null || d1 === undefined) {
return false;
}
if (d2 === null || d2 === undefined) {
return false;
}
return d1.getFullYear() === d2.getFullYear();
};
Dates.yearTwoDigits = function (d) {
var yy = d.getFullYear();
return (yy + '').substring((yy + '').length - 2);
};
return Dates;
}());
// CONCATENATED MODULE: ./src/common/strings.class.ts
/**
* Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company.
* @link https://truedirective.com/
* @license MIT
*/
var Strings = /** @class */ (function () {
function Strings() {
}
Strings.decorate = function (s, pattern, start, end) {
var i = s.toLowerCase().indexOf(pattern);
if (i >= 0) {
return s.substring(0, i) + start + s.substring(i, i + pattern.length) + end + s.substring(i + pattern.length);
}
return s;
};
return Strings;
}());
// CONCATENATED MODULE: ./src/common/keys.class.ts
/**
* Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company.
* @link https://truedirective.com/
* @license MIT
*/
var KeyInfo = /** @class */ (function () {
function KeyInfo(code, char) {
if (char === void 0) { char = ''; }
this.code = code;
this.char = char;
}
return KeyInfo;
}());
// @dynamic
var Keys = /** @class */ (function () {
function Keys() {
}
Keys.isFunctional = function (keyCode) {
return keyCode >= 112 && keyCode <= 123;
};
Keys.keyChar = function (e) {
if (e === null) {
return '';
}
// These chars are useless for us..
if (e.keyCode > 0 && e.keyCode < 32) {
return '';
}
var c = e.char;
if (c === undefined) {
c = e.key;
}
return c;
};
Keys.generateEvent = function (target, keyCode, keyChar, shift, ctrl) {
if (keyChar === void 0) { keyChar = ''; }
if (shift === void 0) { shift = false; }
if (ctrl === void 0) { ctrl = false; }
return {
keyCode: keyCode,
key: keyChar,
char: keyChar,
shiftKey: shift,
ctrlKey: ctrl,
target: target,
preventDefault: function (_) { }
};
};
// For Android
Keys.whichKeyHasBeenPressed = function (txt1, txt2, selStart1, selStart2, selLength) {
if (txt1 === txt2 && selStart1 === selStart2 - 1) {
return new KeyInfo(Keys.RIGHT);
}
if (txt1 === txt2 && selStart1 === selStart2 + 1) {
return new KeyInfo(Keys.LEFT);
}
if (selLength === 1) {
//
if (txt1.substring(0, selStart2) === txt2.substring(0, selStart2)) {
if (txt1.substring(selStart2 + 1, txt1.length) === txt2.substring(selStart2, txt2.length)) {
return new KeyInfo(Keys.BACKSPACE);
}
}
if (txt1.substring(0, selStart2) === txt2.substring(0, selStart2)) {
if (txt1.substring(selStart1 + 1, txt1.length) === txt2.substring(selStart2, txt2.length)) {
if (selStart1 === selStart2 + 1) {
return new KeyInfo(Keys.BACKSPACE);
}
}
}
return new KeyInfo(0, txt2.substring(selStart1, selStart1 + 1));
}
// Tes|t -> Te|t
if (txt1.substring(0, selStart1 - 1) === txt2.substring(0, selStart1 - 1)) {
if (txt1.substring(selStart1, txt1.length) === txt2.substring(selStart1 - 1, txt2.length)) {
return new KeyInfo(Keys.BACKSPACE);
}
}
// Te|st -> Te|t
if (txt1.substring(0, selStart1) === txt2.substring(0, selStart1)) {
if (txt1.substring(selStart1 + 1, txt1.length) === txt2.substring(selStart1, txt2.length)) {
return new KeyInfo(Keys.DELETE);
}
}
return new KeyInfo(0, txt2.substring(selStart1, selStart1 + 1));
};
Keys.BACKSPACE = 8;
Keys.TAB = 9;
Keys.ENTER = 13;
Keys.ESCAPE = 27;
Keys.SPACE = 32;
Keys.PAGE_UP = 33;
Keys.PAGE_DOWN = 34;
Keys.END = 35;
Keys.HOME = 36;
Keys.LEFT = 37;
Keys.UP = 38;
Keys.RIGHT = 39;
Keys.DOWN = 40;
Keys.INSERT = 45;
Keys.DELETE = 46;
Keys.A = 65;
Keys.C = 67;
Keys.V = 86;
Keys.X = 88;
Keys.Y = 89;
Keys.Z = 90;
return Keys;
}());
// CONCATENATED MODULE: ./src/common/utils.class.ts
/**
* Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company.
* @link https://truedirective.com/
* @license MIT
*/
var Utils = /** @class */ (function () {
function Utils() {
}
/**
* Is the element ancestor to the given element.
* @param ancestor Element to check.
* @param element An element that may be descendant
* @return True if the first element is an ancestor of the second element.
*/
Utils.isAncestor = function (ancestor, element) {
if (!element) {
return false;
}
var parent = element;
while (parent && parent !== ancestor) {
parent = parent.parentNode;
}
return parent === ancestor;
};
/**
* Is given element has ancestor with given css-class
* @param element Element to check
* @param ancestorClass class
* @return True if the first element has an ancestor with given class.
*/
Utils.isClassDescendant = function (element, ancestorClass) {
if (!element) {
return false;
}
var parent = element;
while (parent) {
if (parent && parent.classList && parent.classList.contains(ancestorClass)) {
return true;
}
parent = parent.parentNode;
}
return false;
};
/**
* Moving item inside the array.
* @param arr Array.
* @param oldIndex Old index.
* @param newIndex New index.
*/
Utils.moveArrayItem = function (arr, oldIndex, newIndex) {
if (newIndex >= arr.length) {
var k = newIndex - arr.length + 1;
while (k--) {
arr.push(undefined);
}
}
arr.splice(newIndex, 0, arr.splice(oldIndex, 1)[0]);
};
/**
* Removes html tags from the string.
* @param txt String to remove tags
* @return String without tags.
*/
Utils.htmlToPlaintext = function (txt) {
var re = new RegExp('<[^>]+>', 'gm');
return txt ? String(txt).replace(re, '') : '';
};
Object.defineProperty(Utils, "userAgent", {
get: function () {
return navigator.userAgent || navigator.vendor;
},
enumerable: true,
configurable: true
});
Utils.detectIOS = function () {
var re = new RegExp('iPad|iPhone|iPod');
return re.test(Utils.userAgent);
};
Utils.detectFirefox = function () {
return Utils.userAgent.toLowerCase().indexOf('firefox') > -1;
};
Utils.detectSafari = function () {
var safari = Utils.userAgent.toLowerCase().indexOf('safari');
var chrome = Utils.userAgent.toLowerCase().indexOf('chrome');
return safari > -1 && chrome <= -1;
};
Utils.detectAndroid = function () {
var re = new RegExp('android', 'i');
return re.test(Utils.userAgent);
};
Utils.detectMobile = function () {
return Utils.detectIOS() || Utils.detectAndroid();
};
Utils.detectIE = function () {
// Does not include EDGE
var re = new RegExp('MSIE|Trident', 'i');
return re.test(Utils.userAgent);
};
/**
* Returns date if it is valid or null if not.
*/
Utils.purifyDate = function (v) {
if (v === undefined || v === null || isNaN(v.getTime())) {
return null;
}
return v;
};
return Utils;
}());
// CONCATENATED MODULE: ./src/classes/enums.ts
/**
* Тип данных
*/
var ColumnType;
(function (ColumnType) {
ColumnType["STRING"] = "STRING";
ColumnType["NUMBER"] = "NUMBER";
ColumnType["DATETIME"] = "DATETIME";
ColumnType["BOOLEAN"] = "BOOLEAN";
ColumnType["REFERENCE"] = "REFERENCE";
ColumnType["IMAGE"] = "IMAGE";
ColumnType["CHECKBOX"] = "CHECKBOX";
ColumnType["HTML"] = "HTML";
ColumnType["UNSAFE_HTML"] = "UNSAFE_HTML";
ColumnType["CUSTOM"] = "CUSTOM";
})(ColumnType || (ColumnType = {}));
// Режим отслеживания изменений
var DetectionMode = /** @class */ (function () {
function DetectionMode(name) {
this.name = name;
}
// Стандартный режим Angular. Изменения автоматически влияют на представление.
// Работает медленно при большом количестве строк. Переключите в MANUAL, если
// ожидается более 100 строк в модели данных
DetectionMode.DEFAULT = new DetectionMode('Default');
// После внесения изменений в модель необходимо вручную вызвать метод
// TrueGrid.detectChanges();
DetectionMode.MANUAL = new DetectionMode('Manual');
return DetectionMode;
}());
/**
* Части грида
*/
var GridPart = /** @class */ (function () {
function GridPart(name) {
this.name = name;
}
// Левые зафиксированный колонки
GridPart.LEFT = new GridPart('left');
// Основная центральная часть
GridPart.CENTER = new GridPart('');
// Правые зафиксированные ячейки
GridPart.RIGHT = new GridPart('right');
// Перетаскиваемый заголовок колонки или строка
GridPart.DRAG_ITEM = new GridPart('dragItem');
// Колонка, по которой сгруппированы данные (содержатся в области группировок)
GridPart.GROUPED_COLUMN = new GridPart('groupedColumn');
return GridPart;
}());
var LazyLoadingMode = /** @class */ (function () {
function LazyLoadingMode(name) {
this.name = name;
}
LazyLoadingMode.NONE = new LazyLoadingMode('None');
LazyLoadingMode.INCREMENTAL = new LazyLoadingMode('Incremental');
LazyLoadingMode.FRAGMENTARY = new LazyLoadingMode('Fragmentary');
return LazyLoadingMode;
}());
/**
* Режим рендера строк
*/
var RenderMode = /** @class */ (function () {
function RenderMode(name) {
this.name = name;
}
/**
* Рендерятся все строки
*/
RenderMode.ALL = new RenderMode('All');
/**
* Рендерятся только видимые при текущей scroll position и несколько десятков
* строк вверх и вниз (см. параметр prerenderRowCount).
* Только ячейки, которые вписываются во вьюпорт по горизонтали
*/
RenderMode.VISIBLE = new RenderMode('Visible');
/**
* Рендерятся только видимые при текущей scroll position и несколько десятков
* строк вверх и вниз (см. параметр prerenderRowCount).
* Рендерятся все ячейки этих строк
*/
RenderMode.VISIBLE_ROWS = new RenderMode('VisibleRows');
return RenderMode;
}());
/**
* Способ перехода ячейки в режим редактирования
*/
var EditorShowMode = /** @class */ (function () {
function EditorShowMode(name) {
this.name = name;
}
// Редактирование отключено
EditorShowMode.NONE = new EditorShowMode('NONE');
// По нажатию кнопки мыши
EditorShowMode.ON_MOUSE_DOWN = new EditorShowMode('ON_MOUSE_DOWN');
// При фокусировке ячейки
EditorShowMode.ON_FOCUS = new EditorShowMode('ON_FOCUS');
// При клике по сфокусированной ячейки
EditorShowMode.ON_CLICK_FOCUSED = new EditorShowMode('ON_CLICK_FOCUSED');
// При двойном клике по ячейке
EditorShowMode.ON_DBL_CLICK = new EditorShowMode('ON_DBL_CLICK');
return EditorShowMode;
}());
/**
* Способ выделения ячеек
*/
var SelectionMode = /** @class */ (function () {
function SelectionMode(name, range) {
if (range === void 0) { range = false; }
this.name = name;
this.range = range;
}
/**
* Выделяются только отдельные ячейки
*/
SelectionMode.NONE = new SelectionMode('NONE');
/**
* Выделяются только отдельные ячейки
*/
SelectionMode.CELL = new SelectionMode('CELL');
/**
* Выделяются отдельные строки целиком
*/
SelectionMode.ROW = new SelectionMode('ROW');
/**
* Можно выбрать прямоугольные области
*/
SelectionMode.RANGE = new SelectionMode('RANGE', true);
/**
* Выделяются отдельные строки, но при движении мышью выделяется
* прямоугольная область
*/
SelectionMode.ROW_AND_RANGE = new SelectionMode('ROW_AND_RANGE', true);
return SelectionMode;
}());
/**
* Способ позиционирования всплывающих окон
*/
var PopupPosition = /** @class */ (function () {
function PopupPosition(name) {
this.name = name;
}
PopupPosition.RELATIVE = new PopupPosition('RELATIVE');
PopupPosition.ABSOLUTE = new PopupPosition('ABSOLUTE');
PopupPosition.MODAL = new PopupPosition('MODAL');
return PopupPosition;
}());
// CONCATENATED MODULE: ./src/classes/filter.class.ts
// Тип фильтра по колонке
var FilterOperator;
(function (FilterOperator) {
FilterOperator["NONE"] = "NONE";
FilterOperator["BETWEEN"] = "BETWEEN";
FilterOperator["NOT_BETWEEN"] = "NOT_BETWEEN";
FilterOperator["CONTAINS"] = "CONTAINS";
FilterOperator["NOT_CONTAINS"] = "NOT_CONTAINS";
FilterOperator["EQUALS"] = "EQUALS";
FilterOperator["NOT_EQUALS"] = "NOT_EQUALS";
FilterOperator["EMPTY"] = "EMPTY";
FilterOperator["NOT_EMPTY"] = "NOT_EMPTY";
FilterOperator["SET"] = "SET";
})(FilterOperator || (FilterOperator = {}));
// Фильтр по колонке
var filter_class_Filter = /** @class */ (function () {
function Filter(fieldName, operator, value, value2, // For between
items, // Selected items
active, // Фильтр применен в текущий момент
format, // Формат вывода
caption, // Заголово колонки
type) {
if (items === void 0) { items = []; }
if (active === void 0) { active = false; }
if (format === void 0) { format = ''; }
if (caption === void 0) { caption = ''; }
if (type === void 0) { type = ColumnType.STRING; }
this.fieldName = fieldName;
this.operator = operator;
this.value = value;
this.value2 = value2;
this.items = items;
this.active = active;
this.format = format;
this.caption = caption;
this.type = type;
this.orFilter = null;
}
Object.defineProperty(Filter.prototype, "txtValue", {
get: function () {
if (!this.value) {
return '';
}
return this.value + '';
},
enumerable: true,
configurable: true
});
Filter.prototype.clearItems = function () {
this.items.splice(0, this.items.length);
};
// Клонируем фильтр. Редактор фильра будет привязан к копии,
// чтобы не задеть текущие фильтры.
Filter.prototype.clone = function (active) {
var res = new Filter(this.fieldName, this.operator, this.value, this.value2, this.items.slice(), active, this.format, this.caption, this.type);
return res;
};
Filter.prototype.valueToString = function (value, intl, formatter) {
if (value === true) {
return intl.translate('True');
}
if (value === false) {
return intl.translate('False');
}
var v = formatter.format(this.type, this.format, value);
if (this.type === ColumnType.STRING) {
return "'" + v + "'";
}
return v;
};
Filter.prototype.toString = function (intl, formatter) {
var _this = this;
var field = "[" + this.caption + "]";
var op = '';
var values = '';
var v1 = '';
var v2 = '';
var items = '';
if (this.value !== null) {
v1 = this.valueToString(this.value, intl, formatter);
}
if (this.value2 !== null) {
v2 = this.valueToString(this.value2, intl, formatter);
}
if (this.items.length > 0) {
items = this.items.map(function (i) {
return _this.valueToString(i, intl, formatter);
}).join(', ');
}
switch (this.operator) {
case FilterOperator.EQUALS:
op = ' = ';
values = v1;
break;
case FilterOperator.NOT_EQUALS:
op = ' <> ';
values = v1;
break;
case FilterOperator.CONTAINS:
op = 'Contains';
values = v1;
break;
case FilterOperator.NOT_CONTAINS:
op = 'Not contains';
values = v1;
break;
case FilterOperator.BETWEEN:
op = 'Between';
values = v1 + " " + intl.translate('And').toUpperCase() + " " + v2;
break;
case FilterOperator.NOT_BETWEEN:
op = 'Not between';
values = v1 + " " + intl.translate('And').toUpperCase() + " " + v2;
break;
case FilterOperator.EMPTY:
op = 'Is empty';
break;
case FilterOperator.NOT_EMPTY:
op = 'Is not empty';
break;
case FilterOperator.SET:
op = 'In';
values = "(" + items + ")";
break;
}
op = intl.translate(op).toUpperCase();
return field + " " + op + " " + values;
};
return Filter;
}());
// CONCATENATED MODULE: ./src/data-transforms/filter.pipe.ts
/**
* Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company.
* @link https://truedirective.com/
* @license MIT
*/
var filter_pipe_FilterPipe = /** @class */ (function () {
function FilterPipe() {
this._searchStringApplicableForNumbers = false;
this._searchStringApplicableForDates = false;
}
FilterPipe.prototype.isEmpty = function (v) {
return v === null || v === undefined || v === '';
};
FilterPipe.prototype.match = function (row, columns, filters, searchString, valueFormatter) {
var _this = this;
if (valueFormatter === void 0) { valueFormatter = null; }
var res = true;
if (searchString) {
res = false;
columns.some(function (c) {
var v = row[c.fieldName];
if (c.type === ColumnType.STRING && v && v.toLowerCase().indexOf(searchString) >= 0) {
res = true;
return true;
}
if (c.type === ColumnType.REFERENCE && v && v.toLowerCase().indexOf(searchString) >= 0) {
res = true;
return true;
}
if (c.type === ColumnType.UNSAFE_HTML || c.type === ColumnType.HTML) {
if (c.displayField !== '') {
if (v && v.toLowerCase().indexOf(searchString) >= 0) {
res = true;
return true;
}
}
}
if (c.type === ColumnType.DATETIME && _this._searchStringApplicableForDates) {
if (valueFormatter !== null) {
var vs = valueFormatter.displayedValue(c, v, row) + '';
if (vs && vs.toLowerCase().indexOf(searchString) >= 0) {
res = true;
return true;
}
}
}
if (c.type === ColumnType.NUMBER && _this._searchStringApplicableForNumbers) {
if (valueFormatter !== null) {
var vs = valueFormatter.displayedValue(c, v, row) + '';
if (vs && vs.toLowerCase().indexOf(searchString) >= 0) {
res = true;
return true;
}
}
}
return false;
});
if (!res) {
return false;
}
}
for (var i = 0; i < filters.length; i++) {
// Фильтр
var f = filters[i];
// Значение поля
var v = row[f.fieldName];
var vv = v;
var v1 = f.value;
var v2 = f.value2;
var s = v ? (v + '').toLowerCase() : '';
if (f.operator === FilterOperator.EMPTY) {
res = this.isEmpty(v);
}
if (f.operator === FilterOperator.NOT_EMPTY) {
res = !this.isEmpty(v);
}
if (f.type === ColumnType.DATETIME) {
vv = vv !== null ? vv.getTime() : null;
v1 = v1 !== null ? v1.getTime() : null;
v2 = v2 !== null ? v2.getTime() : null;
}
if (f.type === ColumnType.BOOLEAN) {
v1 = f.value;
if (f.operator === FilterOperator.EQUALS) {
if (vv !== v1) {
res = false;
}
}
if (f.operator === FilterOperator.NOT_EQUALS) {
if (vv === v1) {
res = false;
}
}
}
// Задан набор значений
if (f.operator === FilterOperator.SET) {
if (f.items.indexOf(vv) < 0) {
res = false;
}
}
if (f.operator === FilterOperator.CONTAINS) {
// Содержит подстроку
if (s.indexOf(f.txtValue.toLowerCase()) < 0) {
res = false;
}
}
if (f.operator === FilterOperator.NOT_CONTAINS) {
// НЕ содержит подстроку
if (s.indexOf(f.txtValue.toLowerCase()) >= 0) {
res = false;
}
}
if (f.operator === FilterOperator.EQUALS) {
if (s !== f.txtValue.toLowerCase()) {
res = false;
}
}
if (f.operator === FilterOperator.NOT_EQUALS) {
if (s === f.txtValue.toLowerCase()) {
res = false;
}
}
if (f.operator === FilterOperator.BETWEEN) {
if (vv < v1 || vv > v2) {
res = false;
}
}
if (f.operator === FilterOperator.NOT_BETWEEN) {
if (vv >= v1 && vv <= v2) {
res = false;
}
}
}
return res;
};
FilterPipe.prototype.transform = function (rows, columns, filters, searchString, vf) {
var _this = this;
if (!rows) {
return rows;
}
searchString = searchString.toLowerCase();
if (/\d/.test(searchString)) {
this._searchStringApplicableForDates = true;
this._searchStringApplicableForNumbers = true;
}
return !searchString && (filters === undefined || filters.length === 0) ?
rows : rows.filter(function (row) {
return _this.match(row, columns, filters, searchString, vf);
});
};
return FilterPipe;
}());
// CONCATENATED MODULE: ./src/data-transforms/page.pipe.ts
var PagePipe = /** @class */ (function () {
function PagePipe() {
}
PagePipe.prototype.transform = function (rows, pageInfo) {
var res = [];
var i = pageInfo.offset;
while (i < (pageInfo.offset + pageInfo.limit)) {
if (!rows[i]) {
// Иначе при ленивой загрузке сходит с ума trackBy
rows[i] = { __ax: 'empty' };
}
res.push(rows[i]);
i++;
}
return res;
};
return PagePipe;
}());
// CONCATENATED MODULE: ./src/classes/sort-info.class.ts
/**
* Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company.
* @link https://truedirective.com/
* @license MIT
*/
// Тип сортировки
var SortType;
(function (SortType) {
SortType["NONE"] = "None";
SortType["ASC"] = "ASC";
SortType["DESC"] = "DESC";
})(SortType || (SortType = {}));
// Информация о сортировке грида
var SortInfo = /** @class */ (function () {
function SortInfo(fieldName, sortType) {
this.fieldName = fieldName;
this.sortType = sortType;
}
SortInfo.prototype.set = function (fieldName, sortType) {
this.fieldName = fieldName;
this.sortType = sortType;
};
SortInfo.prototype.invert = function () {
if (this.sortType === SortType.NONE) {
this.sortType = SortType.ASC;
}
else {
this.sortType = this.sortType === SortType.ASC ? SortType.DESC : SortType.NONE;
}
// Можно сделать так, чтобы клик по колонке, которая отсортирована в обратном порядке
// сортировалась в прямом порядке:
// this.sortType = this.sortType === SortType.ASC ? SortType.DESC : SortType.ASC;
};
SortInfo.prototype.sort = function (fieldName) {
if (this.sortType === SortType.ASC && this.fieldName === fieldName) {
this.sortType = SortType.DESC;
}
else {
this.fieldName = fieldName;
this.sortType = SortType.ASC;
}
};
SortInfo.prototype.toString = function () {
var st = this.sortType + '';
return this.fieldName + " " + st;
};
return SortInfo;
}());
// CONCATENATED MODULE: ./src/data-transforms/sort.pipe.ts
/**
* Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company.
* @link https://truedirective.com/
* @license MIT
*/
var sort_pipe_SortPipe = /** @class */ (function () {
function SortPipe() {
}
SortPipe.compare = function (v1, v2, sType) {
if ((v1 === null || v1 === undefined) && (v2 === null || v2 === undefined)) {
return 0;
}
if (v1 === null || v1 === undefined) {
return sType === SortType.ASC ? -1 : 1;
}
if (v2 === null || v2 === undefined) {
return sType === SortType.ASC ? 1 : -1;
}
if (v1 === v2) {
return 0;
}
if (sType === SortType.ASC) {
return v1 > v2 ? 1 : -1;
}
return v1 < v2 ? 1 : -1;
};
SortPipe.prototype.transform = function (rows, sortings, groupedColumns) {
if (groupedColumns === void 0) { groupedColumns = []; }
if (!rows) {
return [];
}
if (sortings === null || (sortings.length === 0 && groupedColumns.length === 0)) {
return rows;
}
// Копируем массив и копию сортируем
var rr = rows.concat().sort(function (a1, a2) {
var r = 0;
var _loop_1 = function (i) {
var k = 1;
var el = groupedColumns[i];
var sortInfo = sortings.find(function (s) { return s.fieldName === el.fieldName; });
if (sortInfo && sortInfo.sortType === SortType.DESC) {
k = -1;
}
var v1 = a1[el.fieldName];
var v2 = a2[el.fieldName];
if ((v2 === null && v1 !== null) || v1 > v2) {
r = 1 * k;
return "break";
}
else {
if ((v1 === null && v2 !== null) || v1 < v2) {
r = -1 * k;
return "break";
}
}
};
for (var i = 0; i < groupedColumns.length; i++) {
var state_1 = _loop_1(i);
if (state_1 === "break")
break;
}
if (r !== 0) {
return r;
}
if (sortings.length === 0) {
return 0;
}
for (var i = 0; i < sortings.length; i++) {
var sortInfo = sortings[i];
var res = SortPipe.compare(a1[sortInfo.fieldName], a2[sortInfo.fieldName], sortInfo.sortType);
if (res !== 0) {
return res;
}
}
return 0;
});
return rr;
};
return SortPipe;
}());
// CONCATENATED MODULE: ./src/classes/summary.class.ts
/**
* Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company.
* @link https://truedirective.com/
* @license MIT
*/
var SummaryType = /** @class */ (function () {
function SummaryType(name, shortName, footerText) {
this.name = name;
this.shortName = shortName;
this.footerText = footerText;
}
SummaryType.SUM = new SummaryType('Sum', 'Sum', 'SUM');
SummaryType.MIN = new SummaryType('Minimum', 'Min', 'MIN');
SummaryType.MAX = new SummaryType('Maximum', 'Max', 'MAX');
SummaryType.COUNT = new SummaryType('Count', 'Count', 'TOTAL');
SummaryType.AVERAGE = new SummaryType('Average', 'Avg', 'AVG');
return SummaryType;
}());
var Summary = /** @class */ (function () {
function Summary(type) {
this.type = type;
}
return Summary;
}());
// CONCATENATED MODULE: ./src/data-transforms/summary.pipe.ts
/**
* Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company.
* @link https://truedirective.com/
* @license MIT
*/
var summary_pipe_SummaryPipe = /** @class */ (function () {
function SummaryPipe() {
}
SummaryPipe.prototype.transform = function (rows, c, t) {
if (t === SummaryType.COUNT) {
return rows.length;
}
var res = null;
var rCount = 0;
if (t === SummaryType.SUM || t === SummaryType.AVERAGE) {
res = 0;
}
rows.forEach(function (r) {
if (t === SummaryType.SUM || t === SummaryType.AVERAGE) {
if (r[c.fieldName] !== null) {
res += r[c.fieldName];