all files / grid/actions/ sort.js

93.43% Statements 256/274
90.21% Branches 129/143
94.29% Functions 33/35
93.36% Lines 253/271
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399   86× 86× 86× 86× 86× 86× 86× 86×   49× 49× 49× 49× 49× 36× 30×                     13× 13×   13× 13×   49× 49×   52×     52× 52×   51× 51×     51×   51×         49× 49× 49× 49× 49× 49× 49× 49×   81× 81×               49× 36× 19×         17×     49× 41×     209× 160×   49× 45×     45×   49× 49× 49×   49× 49× 49× 69×     67× 67×   64× 43×     150×   46× 46× 46× 14×   32×       32× 32× 32× 43× 32×   25× 25× 25× 25×       25×     32×   22× 22× 20×     14×   8175×   83× 83× 15× 15×         86×     86× 86× 86× 86× 86× 86× 86×   59× 57×     59× 59×   59× 59× 59×               65× 65× 65×             21× 21× 21×   21× 21× 21×       65× 21×     46× 46×             22× 22× 22×   22×       21×         65× 65×   32×             33×     248× 248× 248× 248× 1319× 248× 191×     191× 191× 191× 87×   191× 191× 149×     42×       464× 464× 464× 2463× 464× 362× 362×       362×     362× 362× 362× 39×       74× 106× 67×       886× 167× 66× 66×     66× 66×     167× 167× 167× 167× 167× 167×        
define(["require", "exports", "@syncfusion/ej2-base", "@syncfusion/ej2-base", "@syncfusion/ej2-base", "../base/util", "../base/constant", "../services/aria-service"], function (require, exports, ej2_base_1, ej2_base_2, ej2_base_3, util_1, events, aria_service_1) {
    "use strict";
    Object.defineProperty(exports, "__esModule", { value: true });
    var Sort = (function () {
        function Sort(parent, sortSettings, sortedColumns, locator) {
            this.contentRefresh = true;
            this.isModelChanged = true;
            this.aria = new aria_service_1.AriaService();
            this.parent = parent;
            this.sortSettings = sortSettings;
            this.sortedColumns = sortedColumns;
            this.focus = locator.getService('focus');
            this.addEventListener();
        }
        Sort.prototype.updateModel = function () {
            var sortedColumn = { field: this.columnName, direction: this.direction };
            var index;
            var gCols = this.parent.groupSettings.columns;
            var flag = false;
            if (!this.isMultiSort) {
                if (!gCols.length) {
                    this.sortSettings.columns = [sortedColumn];
                }
                else {
                    var sortedCols = [];
                    for (var i = 0, len = gCols.length; i < len; i++) {
                        index = this.getSortedColsIndexByField(gCols[i], sortedCols);
                        if (this.columnName === gCols[i]) {
                            flag = true;
                            sortedCols.push(sortedColumn);
                        }
                        else {
                            var sCol = this.getSortColumnFromField(gCols[i]);
                            sortedCols.push({ field: sCol.field, direction: sCol.direction });
                        }
                    }
                    if (!flag) {
                        sortedCols.push(sortedColumn);
                    }
                    this.sortSettings.columns = sortedCols;
                }
            }
            else {
                index = this.getSortedColsIndexByField(this.columnName);
                if (index > -1) {
                    this.sortSettings.columns.splice(index, 1);
                }
                this.sortSettings.columns.push(sortedColumn);
                this.sortSettings.columns = this.sortSettings.columns;
            }
            this.parent.dataBind();
            this.lastSortedCol = this.columnName;
        };
        Sort.prototype.onActionComplete = function (e) {
            var args = !this.isRemove ? {
                columnName: this.columnName, direction: this.direction, requestType: 'sorting', type: events.actionComplete
            } : { requestType: 'sorting', type: events.actionComplete };
            this.isRemove = false;
            this.parent.trigger(events.actionComplete, ej2_base_2.extend(e, args));
        };
        Sort.prototype.sortColumn = function (columnName, direction, isMultiSort) {
            var gObj = this.parent;
            Iif (this.parent.getColumnByField(columnName).allowSorting === false || this.parent.isContextMenuOpen()) {
                return;
            }
            if (!gObj.allowMultiSorting) {
                isMultiSort = gObj.allowMultiSorting;
            }
            if (this.isActionPrevent()) {
                gObj.notify(events.preventBatch, {
                    instance: this, handler: this.sortColumn,
                    arg1: columnName, arg2: direction, arg3: isMultiSort
                });
                return;
            }
            this.backupSettings();
            this.columnName = columnName;
            this.direction = direction;
            this.isMultiSort = isMultiSort;
            this.removeSortIcons();
            var column = gObj.getColumnHeaderByField(columnName);
            this.updateSortedCols(columnName, isMultiSort);
            this.updateModel();
        };
        Sort.prototype.backupSettings = function () {
            this.lastSortedCols = util_1.iterateExtend(this.sortSettings.columns);
            this.lastCols = this.sortedColumns;
        };
        Sort.prototype.restoreSettings = function () {
            this.isModelChanged = false;
            this.isMultiSort = true;
            this.parent.setProperties({ sortSettings: { columns: this.lastSortedCols } }, true);
            this.sortedColumns = this.lastCols;
            this.isModelChanged = true;
        };
        Sort.prototype.updateSortedCols = function (columnName, isMultiSort) {
            if (!isMultiSort) {
                if (this.parent.allowGrouping) {
                    for (var i = 0, len = this.sortedColumns.length; i < len; i++) {
                        if (this.parent.groupSettings.columns.indexOf(this.sortedColumns[i]) < 0) {
                            this.sortedColumns.splice(i, 1);
                            len--;
                            i--;
                        }
                    }
                }
                else {
                    this.sortedColumns.splice(0, this.sortedColumns.length);
                }
            }
            if (this.sortedColumns.indexOf(columnName) < 0) {
                this.sortedColumns.push(columnName);
            }
        };
        Sort.prototype.onPropertyChanged = function (e) {
            if (e.module !== this.getModuleName()) {
                return;
            }
            if (this.contentRefresh) {
                var args = this.sortSettings.columns.length ? {
                    columnName: this.columnName, direction: this.direction, requestType: 'sorting', type: events.actionBegin
                } : { requestType: 'sorting', type: events.actionBegin, cancel: false };
                this.parent.notify(events.modelChanged, args);
            }
            this.refreshSortSettings();
            this.removeSortIcons();
            this.addSortIcons();
        };
        Sort.prototype.refreshSortSettings = function () {
            var _this = this;
            this.sortedColumns = [];
            this.sortSettings.columns.forEach(function (e) {
                _this.sortedColumns.push(e.field);
            });
        };
        Sort.prototype.clearSorting = function () {
            var cols = util_1.getActualPropFromColl(this.sortSettings.columns);
            if (this.isActionPrevent()) {
                this.parent.notify(events.preventBatch, { instance: this, handler: this.clearSorting });
                return;
            }
            for (var i = 0, len = cols.length; i < len; i++) {
                this.removeSortColumn(cols[i].field);
            }
        };
        Sort.prototype.isActionPrevent = function () {
            return util_1.isActionPrevent(this.parent);
        };
        Sort.prototype.removeSortColumn = function (field) {
            var gObj = this.parent;
            var cols = this.sortSettings.columns;
            if (this.sortedColumns.indexOf(field) < 0) {
                return;
            }
            Iif (this.isActionPrevent()) {
                this.parent.notify(events.preventBatch, { instance: this, handler: this.removeSortColumn, arg1: field });
                return;
            }
            this.backupSettings();
            this.removeSortIcons();
            for (var i = 0, len = cols.length; i < len; i++) {
                if (cols[i].field === field) {
                    if (gObj.allowGrouping && gObj.groupSettings.columns.indexOf(cols[i].field) > -1) {
                        continue;
                    }
                    this.sortedColumns.splice(this.sortedColumns.indexOf(cols[i].field), 1);
                    cols.splice(i, 1);
                    this.isRemove = true;
                    if (this.isModelChanged) {
                        this.parent.notify(events.modelChanged, {
                            requestType: 'sorting', type: events.actionBegin
                        });
                    }
                    break;
                }
            }
            this.addSortIcons();
        };
        Sort.prototype.getSortedColsIndexByField = function (field, sortedColumns) {
            var cols = sortedColumns ? sortedColumns : this.sortSettings.columns;
            for (var i = 0, len = cols.length; i < len; i++) {
                if (cols[i].field === field) {
                    return i;
                }
            }
            return -1;
        };
        Sort.prototype.getModuleName = function () {
            return 'sort';
        };
        Sort.prototype.initialEnd = function () {
            this.parent.off(events.contentReady, this.initialEnd);
            if (this.parent.getColumns().length && this.sortSettings.columns.length) {
                var gObj = this.parent;
                this.contentRefresh = false;
                this.isMultiSort = this.sortSettings.columns.length > 1;
                for (var _i = 0, _a = gObj.sortSettings.columns; _i < _a.length; _i++) {
                    var col = _a[_i];
                    if (this.sortedColumns.indexOf(col.field) > -1) {
                        this.sortColumn(col.field, col.direction, true);
                    }
                }
                this.isMultiSort = false;
                this.contentRefresh = true;
            }
        };
        Sort.prototype.addEventListener = function () {
            Iif (this.parent.isDestroyed) {
                return;
            }
            this.parent.on(events.contentReady, this.initialEnd, this);
            this.parent.on(events.sortComplete, this.onActionComplete, this);
            this.parent.on(events.inBoundModelChanged, this.onPropertyChanged, this);
            this.parent.on(events.click, this.clickHandler, this);
            this.parent.on(events.headerRefreshed, this.refreshSortIcons, this);
            this.parent.on(events.keyPressed, this.keyPressed, this);
            this.parent.on(events.cancelBegin, this.cancelBeginEvent, this);
        };
        Sort.prototype.removeEventListener = function () {
            if (this.parent.isDestroyed) {
                return;
            }
            this.parent.off(events.sortComplete, this.onActionComplete);
            this.parent.off(events.inBoundModelChanged, this.onPropertyChanged);
            this.parent.off(events.click, this.clickHandler);
            this.parent.off(events.headerRefreshed, this.refreshSortIcons);
            this.parent.off(events.keyPressed, this.keyPressed);
            this.parent.off(events.cancelBegin, this.cancelBeginEvent);
        };
        Sort.prototype.destroy = function () {
            this.isModelChanged = false;
            if (this.parent.element.querySelector('.e-gridpopup').querySelectorAll('.e-sortdirect').length) {
                this.parent.element.querySelector('.e-gridpopup').style.display = 'none';
            }
            this.clearSorting();
            this.isModelChanged = true;
            this.removeEventListener();
        };
        Sort.prototype.cancelBeginEvent = function (e) {
            if (e.requestType === 'sorting') {
                this.restoreSettings();
                this.refreshSortIcons();
                this.isMultiSort = true;
            }
        };
        Sort.prototype.clickHandler = function (e) {
            this.popUpClickHandler(e);
            var target = ej2_base_3.closest(e.target, '.e-headercell');
            if (target && !e.target.classList.contains('e-grptogglebtn') &&
                !e.target.classList.contains('e-stackedheadercell') &&
                !e.target.classList.contains('e-stackedheadercelldiv') &&
                !(target.classList.contains('e-resized')) &&
                !e.target.classList.contains('e-rhandler') &&
                !e.target.classList.contains('e-columnmenu') &&
                !e.target.classList.contains('e-filtermenudiv')) {
                var gObj = this.parent;
                var colObj = gObj.getColumnByUid(target.querySelector('.e-headercelldiv').getAttribute('e-mappinguid'));
                var direction = !target.querySelectorAll('.e-ascending').length ? 'Ascending' :
                    'Descending';
                Eif (colObj.type !== 'checkbox') {
                    this.initiateSort(target, e, colObj);
                    if (ej2_base_1.Browser.isDevice) {
                        this.showPopUp(e);
                    }
                }
            }
            if (target) {
                target.classList.remove('e-resized');
            }
        };
        Sort.prototype.keyPressed = function (e) {
            var ele = e.target;
            if (!this.parent.isEdit && (e.action === 'enter' || e.action === 'ctrlEnter' || e.action === 'shiftEnter')
                && ej2_base_3.closest(ele, '.e-headercell')) {
                var target = this.focus.getFocusedElement();
                Iif (ej2_base_2.isNullOrUndefined(target) || !target.classList.contains('e-headercell')
                    || !target.querySelector('.e-headercelldiv')) {
                    return;
                }
                var col = this.parent.getColumnByUid(target.querySelector('.e-headercelldiv').getAttribute('e-mappinguid'));
                this.initiateSort(target, e, col);
            }
        };
        Sort.prototype.initiateSort = function (target, e, column) {
            var gObj = this.parent;
            var field = column.field;
            var direction = !target.querySelectorAll('.e-ascending').length ? 'Ascending' :
                'Descending';
            if (e.shiftKey || (this.sortSettings.allowUnsort && target.querySelectorAll('.e-descending').length)
                && !(gObj.groupSettings.columns.indexOf(field) > -1)) {
                this.removeSortColumn(field);
            }
            else {
                this.sortColumn(field, direction, e.ctrlKey || this.enableSortMultiTouch);
            }
        };
        Sort.prototype.showPopUp = function (e) {
            var target = ej2_base_3.closest(e.target, '.e-headercell');
            Eif (!ej2_base_2.isNullOrUndefined(target) || this.parent.isContextMenuOpen()) {
                util_1.setCssInGridPopUp(this.parent.element.querySelector('.e-gridpopup'), e, 'e-sortdirect e-icons e-icon-sortdirect' + (this.sortedColumns.length > 1 ? ' e-spanclicked' : ''));
            }
        };
        Sort.prototype.popUpClickHandler = function (e) {
            var target = e.target;
            if (ej2_base_3.closest(target, '.e-headercell') || e.target.classList.contains('e-rowcell') ||
                ej2_base_3.closest(target, '.e-gridpopup')) {
                if (target.classList.contains('e-sortdirect')) {
                    if (!target.classList.contains('e-spanclicked')) {
                        target.classList.add('e-spanclicked');
                        this.enableSortMultiTouch = true;
                    }
                    else {
                        target.classList.remove('e-spanclicked');
                        this.enableSortMultiTouch = false;
                        this.parent.element.querySelector('.e-gridpopup').style.display = 'none';
                    }
                }
            }
            else {
                this.parent.element.querySelector('.e-gridpopup').style.display = 'none';
            }
        };
        Sort.prototype.addSortIcons = function () {
            var gObj = this.parent;
            var header;
            var filterElement;
            var cols = this.sortSettings.columns;
            var fieldNames = this.parent.getColumns().map(function (c) { return c.field; });
            for (var i = 0, len = cols.length; i < len; i++) {
                Iif (fieldNames.indexOf(cols[i].field) === -1) {
                    continue;
                }
                header = gObj.getColumnHeaderByField(cols[i].field);
                this.aria.setSort(header, cols[i].direction);
                if (this.isMultiSort && cols.length > 1) {
                    header.querySelector('.e-headercelldiv').insertBefore(ej2_base_3.createElement('span', { className: 'e-sortnumber', innerHTML: (i + 1).toString() }), header.querySelector('.e-headertext'));
                }
                filterElement = header.querySelector('.e-sortfilterdiv');
                if (cols[i].direction === 'Ascending') {
                    ej2_base_3.classList(filterElement, ['e-ascending', 'e-icon-ascending'], []);
                }
                else {
                    ej2_base_3.classList(filterElement, ['e-descending', 'e-icon-descending'], []);
                }
            }
        };
        Sort.prototype.removeSortIcons = function (position) {
            var gObj = this.parent;
            var header;
            var cols = this.sortSettings.columns;
            var fieldNames = this.parent.getColumns().map(function (c) { return c.field; });
            for (var i = position ? position : 0, len = !ej2_base_2.isNullOrUndefined(position) ? position + 1 : cols.length; i < len; i++) {
                header = gObj.getColumnHeaderByField(cols[i].field);
                Iif (gObj.allowGrouping && gObj.groupSettings.columns.indexOf(cols[i].field) > -1 &&
                    (ej2_base_2.isNullOrUndefined(header) || !header.querySelector('.e-sortfilterdiv'))) {
                    continue;
                }
                Iif (fieldNames.indexOf(cols[i].field) === -1) {
                    continue;
                }
                this.aria.setSort(header, 'none');
                ej2_base_3.classList(header.querySelector('.e-sortfilterdiv'), [], ['e-descending', 'e-icon-descending', 'e-ascending', 'e-icon-ascending']);
                if (header.querySelector('.e-sortnumber')) {
                    header.querySelector('.e-headercelldiv').removeChild(header.querySelector('.e-sortnumber'));
                }
            }
        };
        Sort.prototype.getSortColumnFromField = function (field) {
            for (var i = 0, len = this.sortSettings.columns.length; i < len; i++) {
                if (this.sortSettings.columns[i].field === field) {
                    return this.sortSettings.columns[i];
                }
            }
            return false;
        };
        Sort.prototype.updateAriaAttr = function () {
            var fieldNames = this.parent.getColumns().map(function (c) { return c.field; });
            for (var _i = 0, _a = this.sortedColumns; _i < _a.length; _i++) {
                var col = _a[_i];
                Iif (fieldNames.indexOf(col) === -1) {
                    continue;
                }
                var header = this.parent.getColumnHeaderByField(col);
                this.aria.setSort(header, this.getSortColumnFromField(col).direction);
            }
        };
        Sort.prototype.refreshSortIcons = function () {
            this.removeSortIcons();
            this.isMultiSort = true;
            this.removeSortIcons();
            this.addSortIcons();
            this.isMultiSort = false;
            this.updateAriaAttr();
        };
        return Sort;
    }());
    exports.Sort = Sort;
});