UNPKG

12 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 __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
9 var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
10 if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
11 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;
12 return c > 3 && r && Object.defineProperty(target, key, r), r;
13};
14var __metadata = (this && this.__metadata) || function (k, v) {
15 if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
16};
17Object.defineProperty(exports, "__esModule", { value: true });
18var gridOptionsWrapper_1 = require("../gridOptionsWrapper");
19var expressionService_1 = require("./expressionService");
20var columnController_1 = require("../columnController/columnController");
21var context_1 = require("../context/context");
22var utils_1 = require("../utils");
23var events_1 = require("../events");
24var eventService_1 = require("../eventService");
25var valueCache_1 = require("./valueCache");
26var ValueService = (function () {
27 function ValueService() {
28 this.initialised = false;
29 }
30 ValueService.prototype.init = function () {
31 this.cellExpressions = this.gridOptionsWrapper.isEnableCellExpressions();
32 this.initialised = true;
33 };
34 ValueService.prototype.getValue = function (column, rowNode, forFilter, ignoreAggData) {
35 // console.log(`turnActive = ${this.turnActive}`);
36 if (forFilter === void 0) { forFilter = false; }
37 if (ignoreAggData === void 0) { ignoreAggData = false; }
38 // hack - the grid is getting refreshed before this bean gets initialised, race condition.
39 // really should have a way so they get initialised in the right order???
40 if (!this.initialised) {
41 this.init();
42 }
43 // pull these out to make code below easier to read
44 var colDef = column.getColDef();
45 var field = colDef.field;
46 var colId = column.getId();
47 var data = rowNode.data;
48 var result;
49 // if there is a value getter, this gets precedence over a field
50 var groupDataExists = rowNode.groupData && rowNode.groupData[colId] !== undefined;
51 var aggDataExists = !ignoreAggData && rowNode.aggData && rowNode.aggData[colId] !== undefined;
52 if (forFilter && colDef.filterValueGetter) {
53 result = this.executeValueGetter(colDef.filterValueGetter, data, column, rowNode);
54 }
55 else if (groupDataExists) {
56 result = rowNode.groupData[colId];
57 }
58 else if (aggDataExists) {
59 result = rowNode.aggData[colId];
60 }
61 else if (colDef.valueGetter) {
62 result = this.executeValueGetter(colDef.valueGetter, data, column, rowNode);
63 }
64 else if (field && data) {
65 result = utils_1._.getValueUsingField(data, field, column.isFieldContainsDots());
66 }
67 else {
68 result = undefined;
69 }
70 // the result could be an expression itself, if we are allowing cell values to be expressions
71 if (this.cellExpressions && (typeof result === 'string') && result.indexOf('=') === 0) {
72 var cellValueGetter = result.substring(1);
73 result = this.executeValueGetter(cellValueGetter, data, column, rowNode);
74 }
75 return result;
76 };
77 ValueService.prototype.setValue = function (rowNode, colKey, newValue) {
78 var column = this.columnController.getPrimaryColumn(colKey);
79 if (!rowNode || !column) {
80 return;
81 }
82 // this will only happen if user is trying to paste into a group row, which doesn't make sense
83 // the user should not be trying to paste into group rows
84 var data = rowNode.data;
85 if (utils_1._.missing(data)) {
86 rowNode.data = {};
87 }
88 // for backwards compatibility we are also retrieving the newValueHandler as well as the valueSetter
89 var _a = column.getColDef(), field = _a.field, newValueHandler = _a.newValueHandler, valueSetter = _a.valueSetter;
90 // need either a field or a newValueHandler for this to work
91 if (utils_1._.missing(field) && utils_1._.missing(newValueHandler) && utils_1._.missing(valueSetter)) {
92 // we don't tell user about newValueHandler, as that is deprecated
93 console.warn("ag-Grid: you need either field or valueSetter set on colDef for editing to work");
94 return;
95 }
96 var params = {
97 node: rowNode,
98 data: rowNode.data,
99 oldValue: this.getValue(column, rowNode),
100 newValue: newValue,
101 colDef: column.getColDef(),
102 column: column,
103 api: this.gridOptionsWrapper.getApi(),
104 columnApi: this.gridOptionsWrapper.getColumnApi(),
105 context: this.gridOptionsWrapper.getContext()
106 };
107 params.newValue = newValue;
108 var valueWasDifferent;
109 if (utils_1._.exists(newValueHandler)) {
110 valueWasDifferent = newValueHandler(params);
111 }
112 else if (utils_1._.exists(valueSetter)) {
113 valueWasDifferent = this.expressionService.evaluate(valueSetter, params);
114 }
115 else {
116 valueWasDifferent = this.setValueUsingField(data, field, newValue, column.isFieldContainsDots());
117 }
118 // in case user forgot to return something (possible if they are not using TypeScript
119 // and just forgot, or using an old newValueHandler we didn't always expect a return
120 // value here), we default the return value to true, so we always refresh.
121 if (valueWasDifferent === undefined) {
122 valueWasDifferent = true;
123 }
124 // if no change to the value, then no need to do the updating, or notifying via events.
125 // otherwise the user could be tabbing around the grid, and cellValueChange would get called
126 // all the time.
127 if (!valueWasDifferent) {
128 return;
129 }
130 // reset quick filter on this row
131 rowNode.resetQuickFilterAggregateText();
132 this.valueCache.onDataChanged();
133 params.newValue = this.getValue(column, rowNode);
134 if (typeof column.getColDef().onCellValueChanged === 'function') {
135 // to make callback async, do in a timeout
136 setTimeout(function () { return column.getColDef().onCellValueChanged(params); }, 0);
137 }
138 var event = {
139 type: events_1.Events.EVENT_CELL_VALUE_CHANGED,
140 event: null,
141 rowIndex: rowNode.rowIndex,
142 rowPinned: rowNode.rowPinned,
143 column: params.column,
144 api: params.api,
145 colDef: params.colDef,
146 columnApi: params.columnApi,
147 context: params.context,
148 data: rowNode.data,
149 node: rowNode,
150 oldValue: params.oldValue,
151 newValue: params.newValue,
152 value: params.newValue
153 };
154 this.eventService.dispatchEvent(event);
155 };
156 ValueService.prototype.setValueUsingField = function (data, field, newValue, isFieldContainsDots) {
157 // if no '.', then it's not a deep value
158 var valuesAreSame;
159 if (!isFieldContainsDots) {
160 data[field] = newValue;
161 }
162 else {
163 // otherwise it is a deep value, so need to dig for it
164 var fieldPieces = field.split('.');
165 var currentObject = data;
166 while (fieldPieces.length > 0 && currentObject) {
167 var fieldPiece = fieldPieces.shift();
168 if (fieldPieces.length === 0) {
169 currentObject[fieldPiece] = newValue;
170 }
171 else {
172 currentObject = currentObject[fieldPiece];
173 }
174 }
175 }
176 return !valuesAreSame;
177 };
178 ValueService.prototype.executeValueGetter = function (filterValueGetter, data, column, rowNode) {
179 var colId = column.getId();
180 // if inside the same turn, just return back the value we got last time
181 var valueFromCache = this.valueCache.getValue(rowNode, colId);
182 if (valueFromCache !== undefined) {
183 return valueFromCache;
184 }
185 var params = {
186 data: data,
187 node: rowNode,
188 column: column,
189 colDef: column.getColDef(),
190 api: this.gridOptionsWrapper.getApi(),
191 columnApi: this.gridOptionsWrapper.getColumnApi(),
192 context: this.gridOptionsWrapper.getContext(),
193 getValue: this.getValueCallback.bind(this, rowNode)
194 };
195 var result = this.expressionService.evaluate(filterValueGetter, params);
196 // if a turn is active, store the value in case the grid asks for it again
197 this.valueCache.setValue(rowNode, colId, result);
198 return result;
199 };
200 ValueService.prototype.getValueCallback = function (node, field) {
201 var otherColumn = this.columnController.getPrimaryColumn(field);
202 if (otherColumn) {
203 return this.getValue(otherColumn, node);
204 }
205 else {
206 return null;
207 }
208 };
209 // used by row grouping and pivot, to get key for a row. col can be a pivot col or a row grouping col
210 ValueService.prototype.getKeyForNode = function (col, rowNode) {
211 var value = this.getValue(col, rowNode);
212 var result;
213 var keyCreator = col.getColDef().keyCreator;
214 if (keyCreator) {
215 result = keyCreator({ value: value });
216 }
217 else {
218 result = value;
219 }
220 // if already a string, or missing, just return it
221 if (typeof result === 'string' || result === null || result === undefined) {
222 return result;
223 }
224 result = String(result);
225 if (result === '[object Object]') {
226 utils_1._.doOnce(function () {
227 console.warn('ag-Grid: a column you are grouping or pivoting by has objects as values. If you want to group by complex objects then either a) use a colDef.keyCreator (se ag-Grid docs) or b) to toString() on the object to return a key');
228 }, 'getKeyForNode - warn about [object,object]');
229 }
230 return result;
231 };
232 __decorate([
233 context_1.Autowired('gridOptionsWrapper'),
234 __metadata("design:type", gridOptionsWrapper_1.GridOptionsWrapper)
235 ], ValueService.prototype, "gridOptionsWrapper", void 0);
236 __decorate([
237 context_1.Autowired('expressionService'),
238 __metadata("design:type", expressionService_1.ExpressionService)
239 ], ValueService.prototype, "expressionService", void 0);
240 __decorate([
241 context_1.Autowired('columnController'),
242 __metadata("design:type", columnController_1.ColumnController)
243 ], ValueService.prototype, "columnController", void 0);
244 __decorate([
245 context_1.Autowired('eventService'),
246 __metadata("design:type", eventService_1.EventService)
247 ], ValueService.prototype, "eventService", void 0);
248 __decorate([
249 context_1.Autowired('valueCache'),
250 __metadata("design:type", valueCache_1.ValueCache)
251 ], ValueService.prototype, "valueCache", void 0);
252 __decorate([
253 context_1.PostConstruct,
254 __metadata("design:type", Function),
255 __metadata("design:paramtypes", []),
256 __metadata("design:returntype", void 0)
257 ], ValueService.prototype, "init", null);
258 ValueService = __decorate([
259 context_1.Bean('valueService')
260 ], ValueService);
261 return ValueService;
262}());
263exports.ValueService = ValueService;