UNPKG

13.9 kBJavaScriptView Raw
1/**
2 * ag-grid - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components
3 * @version v18.1.2
4 * @link http://www.ag-grid.com/
5 * @license MIT
6 */
7"use strict";
8var __extends = (this && this.__extends) || (function () {
9 var extendStatics = Object.setPrototypeOf ||
10 ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
11 function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
12 return function (d, b) {
13 extendStatics(d, b);
14 function __() { this.constructor = d; }
15 d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
16 };
17})();
18var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19 var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20 if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21 else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22 return c > 3 && r && Object.defineProperty(target, key, r), r;
23};
24var __metadata = (this && this.__metadata) || function (k, v) {
25 if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
26};
27Object.defineProperty(exports, "__esModule", { value: true });
28var component_1 = require("../../widgets/component");
29var column_1 = require("../../entities/column");
30var utils_1 = require("../../utils");
31var context_1 = require("../../context/context");
32var gridOptionsWrapper_1 = require("../../gridOptionsWrapper");
33var sortController_1 = require("../../sortController");
34var touchListener_1 = require("../../widgets/touchListener");
35var eventService_1 = require("../../eventService");
36var componentAnnotations_1 = require("../../widgets/componentAnnotations");
37var events_1 = require("../../events");
38var HeaderComp = (function (_super) {
39 __extends(HeaderComp, _super);
40 function HeaderComp() {
41 var _this = _super !== null && _super.apply(this, arguments) || this;
42 _this.lastMovingChanged = 0;
43 return _this;
44 }
45 HeaderComp.prototype.init = function (params) {
46 var template = utils_1.Utils.firstExistingValue(params.template, HeaderComp.TEMPLATE);
47 this.setTemplate(template);
48 this.params = params;
49 this.setupTap();
50 this.setupIcons(params.column);
51 this.setupMenu();
52 this.setupSort();
53 this.setupFilterIcon();
54 this.setupText(params.displayName);
55 };
56 HeaderComp.prototype.setupText = function (displayName) {
57 if (this.eText) {
58 this.eText.innerHTML = displayName;
59 }
60 };
61 HeaderComp.prototype.setupIcons = function (column) {
62 this.addInIcon('sortAscending', this.eSortAsc, column);
63 this.addInIcon('sortDescending', this.eSortDesc, column);
64 this.addInIcon('sortUnSort', this.eSortNone, column);
65 this.addInIcon('menu', this.eMenu, column);
66 this.addInIcon('filter', this.eFilter, column);
67 };
68 HeaderComp.prototype.addInIcon = function (iconName, eParent, column) {
69 if (eParent == null)
70 return;
71 var eIcon = utils_1.Utils.createIconNoSpan(iconName, this.gridOptionsWrapper, column);
72 eParent.appendChild(eIcon);
73 };
74 HeaderComp.prototype.setupTap = function () {
75 var _this = this;
76 if (this.gridOptionsWrapper.isSuppressTouch()) {
77 return;
78 }
79 var touchListener = new touchListener_1.TouchListener(this.getGui());
80 if (this.params.enableMenu) {
81 var longTapListener = function (event) {
82 _this.gridOptionsWrapper.getApi().showColumnMenuAfterMouseClick(_this.params.column, event.touchStart);
83 };
84 this.addDestroyableEventListener(touchListener, touchListener_1.TouchListener.EVENT_LONG_TAP, longTapListener);
85 }
86 if (this.params.enableSorting) {
87 var tapListener = function () {
88 _this.sortController.progressSort(_this.params.column, false, "uiColumnSorted");
89 };
90 this.addDestroyableEventListener(touchListener, touchListener_1.TouchListener.EVENT_TAP, tapListener);
91 }
92 this.addDestroyFunc(function () { return touchListener.destroy(); });
93 };
94 HeaderComp.prototype.setupMenu = function () {
95 var _this = this;
96 // if no menu provided in template, do nothing
97 if (!this.eMenu) {
98 return;
99 }
100 // we don't show the menu if on an ipad, as the user cannot have a mouse on the ipad, so
101 // makes no sense. instead the user must long-tap if on an ipad.
102 var dontShowMenu = !this.params.enableMenu || utils_1.Utils.isUserAgentIPad();
103 if (dontShowMenu) {
104 utils_1.Utils.removeFromParent(this.eMenu);
105 return;
106 }
107 this.eMenu.addEventListener('click', function () { return _this.showMenu(_this.eMenu); });
108 if (!this.gridOptionsWrapper.isSuppressMenuHide()) {
109 this.eMenu.style.opacity = '0';
110 this.addGuiEventListener('mouseover', function () {
111 _this.eMenu.style.opacity = '1';
112 });
113 this.addGuiEventListener('mouseout', function () {
114 _this.eMenu.style.opacity = '0';
115 });
116 }
117 var style = this.eMenu.style;
118 style['transition'] = 'opacity 0.2s, border 0.2s';
119 style['-webkit-transition'] = 'opacity 0.2s, border 0.2s';
120 };
121 HeaderComp.prototype.showMenu = function (eventSource) {
122 this.menuFactory.showMenuAfterButtonClick(this.params.column, eventSource);
123 };
124 HeaderComp.prototype.removeSortIcons = function () {
125 utils_1.Utils.removeFromParent(this.eSortAsc);
126 utils_1.Utils.removeFromParent(this.eSortDesc);
127 utils_1.Utils.removeFromParent(this.eSortNone);
128 utils_1.Utils.removeFromParent(this.eSortOrder);
129 };
130 HeaderComp.prototype.setupSort = function () {
131 var _this = this;
132 var enableSorting = this.params.enableSorting;
133 if (!enableSorting) {
134 this.removeSortIcons();
135 return;
136 }
137 var sortUsingCtrl = this.gridOptionsWrapper.isMultiSortKeyCtrl();
138 // keep track of last time the moving changed flag was set
139 this.addDestroyableEventListener(this.params.column, column_1.Column.EVENT_MOVING_CHANGED, function () {
140 _this.lastMovingChanged = new Date().getTime();
141 });
142 // add the event on the header, so when clicked, we do sorting
143 if (this.eLabel) {
144 this.addDestroyableEventListener(this.eLabel, 'click', function (event) {
145 // sometimes when moving a column via dragging, this was also firing a clicked event.
146 // here is issue raised by user: https://ag-grid.zendesk.com/agent/tickets/1076
147 // this check stops sort if a) column is moving or b) column moved less than 200ms ago (so caters for race condition)
148 var moving = _this.params.column.isMoving();
149 var nowTime = new Date().getTime();
150 // typically there is <2ms if moving flag was set recently, as it would be done in same VM turn
151 var movedRecently = (nowTime - _this.lastMovingChanged) < 50;
152 var columnMoving = moving || movedRecently;
153 if (!columnMoving) {
154 var multiSort = sortUsingCtrl ? (event.ctrlKey || event.metaKey) : event.shiftKey;
155 _this.params.progressSort(multiSort);
156 }
157 else {
158 console.log("kipping sort cos of moving " + _this.lastMovingChanged);
159 }
160 });
161 }
162 this.addDestroyableEventListener(this.params.column, column_1.Column.EVENT_SORT_CHANGED, this.onSortChanged.bind(this));
163 this.onSortChanged();
164 this.addDestroyableEventListener(this.eventService, events_1.Events.EVENT_SORT_CHANGED, this.setMultiSortOrder.bind(this));
165 this.setMultiSortOrder();
166 };
167 HeaderComp.prototype.onSortChanged = function () {
168 utils_1.Utils.addOrRemoveCssClass(this.getGui(), 'ag-header-cell-sorted-asc', this.params.column.isSortAscending());
169 utils_1.Utils.addOrRemoveCssClass(this.getGui(), 'ag-header-cell-sorted-desc', this.params.column.isSortDescending());
170 utils_1.Utils.addOrRemoveCssClass(this.getGui(), 'ag-header-cell-sorted-none', this.params.column.isSortNone());
171 if (this.eSortAsc) {
172 utils_1.Utils.addOrRemoveCssClass(this.eSortAsc, 'ag-hidden', !this.params.column.isSortAscending());
173 }
174 if (this.eSortDesc) {
175 utils_1.Utils.addOrRemoveCssClass(this.eSortDesc, 'ag-hidden', !this.params.column.isSortDescending());
176 }
177 if (this.eSortNone) {
178 var alwaysHideNoSort = !this.params.column.getColDef().unSortIcon && !this.gridOptionsWrapper.isUnSortIcon();
179 utils_1.Utils.addOrRemoveCssClass(this.eSortNone, 'ag-hidden', alwaysHideNoSort || !this.params.column.isSortNone());
180 }
181 };
182 // we listen here for global sort events, NOT column sort events, as we want to do this
183 // when sorting has been set on all column (if we listened just for our col (where we
184 // set the asc / desc icons) then it's possible other cols are yet to get their sorting state.
185 HeaderComp.prototype.setMultiSortOrder = function () {
186 if (!this.eSortOrder) {
187 return;
188 }
189 var col = this.params.column;
190 var allColumnsWithSorting = this.sortController.getColumnsWithSortingOrdered();
191 var indexThisCol = allColumnsWithSorting.indexOf(col);
192 var moreThanOneColSorting = allColumnsWithSorting.length > 1;
193 var showIndex = col.isSorting() && moreThanOneColSorting;
194 utils_1.Utils.setVisible(this.eSortOrder, showIndex);
195 if (indexThisCol >= 0) {
196 this.eSortOrder.innerHTML = (indexThisCol + 1).toString();
197 }
198 else {
199 this.eSortOrder.innerHTML = '';
200 }
201 };
202 HeaderComp.prototype.setupFilterIcon = function () {
203 if (!this.eFilter) {
204 return;
205 }
206 this.addDestroyableEventListener(this.params.column, column_1.Column.EVENT_FILTER_CHANGED, this.onFilterChanged.bind(this));
207 this.onFilterChanged();
208 };
209 HeaderComp.prototype.onFilterChanged = function () {
210 var filterPresent = this.params.column.isFilterActive();
211 utils_1.Utils.addOrRemoveCssClass(this.eFilter, 'ag-hidden', !filterPresent);
212 };
213 HeaderComp.TEMPLATE = '<div class="ag-cell-label-container" role="presentation">' +
214 ' <span ref="eMenu" class="ag-header-icon ag-header-cell-menu-button" aria-hidden="true"></span>' +
215 ' <div ref="eLabel" class="ag-header-cell-label" role="presentation">' +
216 ' <span ref="eText" class="ag-header-cell-text" role="columnheader"></span>' +
217 ' <span ref="eFilter" class="ag-header-icon ag-filter-icon" aria-hidden="true"></span>' +
218 ' <span ref="eSortOrder" class="ag-header-icon ag-sort-order" aria-hidden="true"></span>' +
219 ' <span ref="eSortAsc" class="ag-header-icon ag-sort-ascending-icon" aria-hidden="true"></span>' +
220 ' <span ref="eSortDesc" class="ag-header-icon ag-sort-descending-icon" aria-hidden="true"></span>' +
221 ' <span ref="eSortNone" class="ag-header-icon ag-sort-none-icon" aria-hidden="true"></span>' +
222 ' </div>' +
223 '</div>';
224 __decorate([
225 context_1.Autowired('gridOptionsWrapper'),
226 __metadata("design:type", gridOptionsWrapper_1.GridOptionsWrapper)
227 ], HeaderComp.prototype, "gridOptionsWrapper", void 0);
228 __decorate([
229 context_1.Autowired('sortController'),
230 __metadata("design:type", sortController_1.SortController)
231 ], HeaderComp.prototype, "sortController", void 0);
232 __decorate([
233 context_1.Autowired('menuFactory'),
234 __metadata("design:type", Object)
235 ], HeaderComp.prototype, "menuFactory", void 0);
236 __decorate([
237 context_1.Autowired('eventService'),
238 __metadata("design:type", eventService_1.EventService)
239 ], HeaderComp.prototype, "eventService", void 0);
240 __decorate([
241 componentAnnotations_1.RefSelector('eFilter'),
242 __metadata("design:type", HTMLElement)
243 ], HeaderComp.prototype, "eFilter", void 0);
244 __decorate([
245 componentAnnotations_1.RefSelector('eSortAsc'),
246 __metadata("design:type", HTMLElement)
247 ], HeaderComp.prototype, "eSortAsc", void 0);
248 __decorate([
249 componentAnnotations_1.RefSelector('eSortDesc'),
250 __metadata("design:type", HTMLElement)
251 ], HeaderComp.prototype, "eSortDesc", void 0);
252 __decorate([
253 componentAnnotations_1.RefSelector('eSortNone'),
254 __metadata("design:type", HTMLElement)
255 ], HeaderComp.prototype, "eSortNone", void 0);
256 __decorate([
257 componentAnnotations_1.RefSelector('eSortOrder'),
258 __metadata("design:type", HTMLElement)
259 ], HeaderComp.prototype, "eSortOrder", void 0);
260 __decorate([
261 componentAnnotations_1.RefSelector('eMenu'),
262 __metadata("design:type", HTMLElement)
263 ], HeaderComp.prototype, "eMenu", void 0);
264 __decorate([
265 componentAnnotations_1.RefSelector('eLabel'),
266 __metadata("design:type", HTMLElement)
267 ], HeaderComp.prototype, "eLabel", void 0);
268 __decorate([
269 componentAnnotations_1.RefSelector('eText'),
270 __metadata("design:type", HTMLElement)
271 ], HeaderComp.prototype, "eText", void 0);
272 return HeaderComp;
273}(component_1.Component));
274exports.HeaderComp = HeaderComp;