ui.data_expression.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. /**
  2. * DevExtreme (ui/editor/ui.data_expression.js)
  3. * Version: 19.1.16
  4. * Build date: Tue Oct 18 2022
  5. *
  6. * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
  7. * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
  8. */
  9. "use strict";
  10. function _typeof(obj) {
  11. "@babel/helpers - typeof";
  12. return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj) {
  13. return typeof obj
  14. } : function(obj) {
  15. return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj
  16. }, _typeof(obj)
  17. }
  18. var variableWrapper = require("../../core/utils/variable_wrapper");
  19. var dataCoreUtils = require("../../core/utils/data");
  20. var commonUtils = require("../../core/utils/common");
  21. var typeUtils = require("../../core/utils/type");
  22. var extend = require("../../core/utils/extend").extend;
  23. var DataHelperMixin = require("../../data_helper");
  24. var DataSourceModule = require("../../data/data_source/data_source");
  25. var ArrayStore = require("../../data/array_store");
  26. var Deferred = require("../../core/utils/deferred").Deferred;
  27. var DataExpressionMixin = extend({}, DataHelperMixin, {
  28. _dataExpressionDefaultOptions: function() {
  29. return {
  30. items: [],
  31. dataSource: null,
  32. itemTemplate: "item",
  33. value: null,
  34. valueExpr: "this",
  35. displayExpr: void 0
  36. }
  37. },
  38. _initDataExpressions: function() {
  39. this._compileValueGetter();
  40. this._compileDisplayGetter();
  41. this._initDynamicTemplates();
  42. this._initDataSource();
  43. this._itemsToDataSource()
  44. },
  45. _itemsToDataSource: function() {
  46. if (!this.option("dataSource")) {
  47. this._dataSource = new DataSourceModule.DataSource({
  48. store: new ArrayStore(this.option("items")),
  49. pageSize: 0
  50. })
  51. }
  52. },
  53. _compileDisplayGetter: function() {
  54. this._displayGetter = dataCoreUtils.compileGetter(this._displayGetterExpr())
  55. },
  56. _displayGetterExpr: function() {
  57. return this.option("displayExpr")
  58. },
  59. _compileValueGetter: function() {
  60. this._valueGetter = dataCoreUtils.compileGetter(this._valueGetterExpr())
  61. },
  62. _valueGetterExpr: function() {
  63. return this.option("valueExpr") || "this"
  64. },
  65. _loadValue: function(value) {
  66. var deferred = new Deferred;
  67. value = this._unwrappedValue(value);
  68. if (!typeUtils.isDefined(value)) {
  69. return deferred.reject().promise()
  70. }
  71. this._loadSingle(this._valueGetterExpr(), value).done(function(item) {
  72. this._isValueEquals(this._valueGetter(item), value) ? deferred.resolve(item) : deferred.reject()
  73. }.bind(this)).fail(function() {
  74. deferred.reject()
  75. });
  76. return deferred.promise()
  77. },
  78. _getCurrentValue: function() {
  79. return this.option("value")
  80. },
  81. _unwrappedValue: function(value) {
  82. value = typeUtils.isDefined(value) ? value : this._getCurrentValue();
  83. if (value && this._dataSource && "this" === this._valueGetterExpr()) {
  84. value = this._getItemKey(value)
  85. }
  86. return variableWrapper.unwrap(value)
  87. },
  88. _getItemKey: function(value) {
  89. var key = this._dataSource.key();
  90. if (Array.isArray(key)) {
  91. var result = {};
  92. for (var i = 0, n = key.length; i < n; i++) {
  93. result[key[i]] = value[key[i]]
  94. }
  95. return result
  96. }
  97. if (key && "object" === _typeof(value)) {
  98. value = value[key]
  99. }
  100. return value
  101. },
  102. _isValueEquals: function(value1, value2) {
  103. var dataSourceKey = this._dataSource && this._dataSource.key();
  104. var isDefined = typeUtils.isDefined;
  105. var result = this._compareValues(value1, value2);
  106. if (!result && dataSourceKey && isDefined(value1) && isDefined(value2)) {
  107. if (Array.isArray(dataSourceKey)) {
  108. result = this._compareByCompositeKey(value1, value2, dataSourceKey)
  109. } else {
  110. result = this._compareByKey(value1, value2, dataSourceKey)
  111. }
  112. }
  113. return result
  114. },
  115. _compareByCompositeKey: function(value1, value2, key) {
  116. var isObject = typeUtils.isObject;
  117. if (!isObject(value1) || !isObject(value2)) {
  118. return false
  119. }
  120. for (var i = 0, n = key.length; i < n; i++) {
  121. if (value1[key[i]] !== value2[key[i]]) {
  122. return false
  123. }
  124. }
  125. return true
  126. },
  127. _compareByKey: function(value1, value2, key) {
  128. var ensureDefined = commonUtils.ensureDefined;
  129. var unwrapObservable = variableWrapper.unwrap;
  130. var valueKey1 = ensureDefined(unwrapObservable(value1[key]), value1);
  131. var valueKey2 = ensureDefined(unwrapObservable(value2[key]), value2);
  132. return this._compareValues(valueKey1, valueKey2)
  133. },
  134. _compareValues: function(value1, value2) {
  135. return dataCoreUtils.toComparable(value1, true) === dataCoreUtils.toComparable(value2, true)
  136. },
  137. _initDynamicTemplates: commonUtils.noop,
  138. _setCollectionWidgetItemTemplate: function() {
  139. this._initDynamicTemplates();
  140. this._setCollectionWidgetOption("itemTemplate", this.option("itemTemplate"))
  141. },
  142. _getCollectionKeyExpr: function() {
  143. var valueExpr = this.option("valueExpr");
  144. var isValueExprField = typeUtils.isString(valueExpr) && "this" !== valueExpr || typeUtils.isFunction(valueExpr);
  145. return isValueExprField ? valueExpr : null
  146. },
  147. _dataExpressionOptionChanged: function(args) {
  148. switch (args.name) {
  149. case "items":
  150. this._itemsToDataSource();
  151. this._setCollectionWidgetOption("items");
  152. break;
  153. case "dataSource":
  154. this._initDataSource();
  155. break;
  156. case "itemTemplate":
  157. this._setCollectionWidgetItemTemplate();
  158. break;
  159. case "valueExpr":
  160. this._compileValueGetter();
  161. break;
  162. case "displayExpr":
  163. this._compileDisplayGetter();
  164. this._initDynamicTemplates();
  165. this._setCollectionWidgetOption("displayExpr")
  166. }
  167. }
  168. });
  169. module.exports = DataExpressionMixin;