action.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. /**
  2. * DevExtreme (core/action.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. var $ = require("./renderer");
  11. var config = require("./config");
  12. var window = require("./utils/window").getWindow();
  13. var typeUtils = require("./utils/type");
  14. var each = require("./utils/iterator").each;
  15. var Class = require("./class");
  16. var errors = require("./errors");
  17. var Action = Class.inherit({
  18. ctor: function(action, config) {
  19. config = config || {};
  20. this._action = action;
  21. this._context = config.context || window;
  22. this._beforeExecute = config.beforeExecute;
  23. this._afterExecute = config.afterExecute;
  24. this._component = config.component;
  25. this._validatingTargetName = config.validatingTargetName;
  26. var excludeValidators = this._excludeValidators = {};
  27. if (config.excludeValidators) {
  28. for (var i = 0; i < config.excludeValidators.length; i++) {
  29. excludeValidators[config.excludeValidators[i]] = true
  30. }
  31. }
  32. },
  33. execute: function() {
  34. var e = {
  35. action: this._action,
  36. args: Array.prototype.slice.call(arguments),
  37. context: this._context,
  38. component: this._component,
  39. validatingTargetName: this._validatingTargetName,
  40. cancel: false,
  41. handled: false
  42. };
  43. var beforeExecute = this._beforeExecute;
  44. var afterExecute = this._afterExecute;
  45. var argsBag = e.args[0] || {};
  46. if (!("jQueryEvent" in argsBag) && argsBag.event && config().useJQuery) {
  47. Object.defineProperty(argsBag, "jQueryEvent", {
  48. get: function() {
  49. errors.log("W0003", "Handler argument", "jQueryEvent", "17.2", "Use the 'event' field instead");
  50. return argsBag.event
  51. },
  52. set: function(value) {
  53. errors.log("W0003", "Handler argument", "jQueryEvent", "17.2", "Use the 'event' field instead");
  54. argsBag.event = value
  55. }
  56. })
  57. }
  58. if (!this._validateAction(e)) {
  59. return
  60. }
  61. beforeExecute && beforeExecute.call(this._context, e);
  62. if (e.cancel) {
  63. return
  64. }
  65. var result = this._executeAction(e);
  66. if (argsBag.cancel) {
  67. return
  68. }
  69. afterExecute && afterExecute.call(this._context, e);
  70. return result
  71. },
  72. _validateAction: function(e) {
  73. var excludeValidators = this._excludeValidators;
  74. var executors = Action.executors;
  75. for (var name in executors) {
  76. if (!excludeValidators[name]) {
  77. var executor = executors[name];
  78. if (executor.validate) {
  79. executor.validate(e)
  80. }
  81. if (e.cancel) {
  82. return false
  83. }
  84. }
  85. }
  86. return true
  87. },
  88. _executeAction: function(e) {
  89. var result;
  90. var executors = Action.executors;
  91. for (var name in executors) {
  92. var executor = executors[name];
  93. if (executor.execute) {
  94. executor.execute(e)
  95. }
  96. if (e.handled) {
  97. result = e.result;
  98. break
  99. }
  100. }
  101. return result
  102. }
  103. });
  104. Action.executors = {};
  105. Action.registerExecutor = function(name, executor) {
  106. if (typeUtils.isPlainObject(name)) {
  107. each(name, Action.registerExecutor);
  108. return
  109. }
  110. Action.executors[name] = executor
  111. };
  112. Action.unregisterExecutor = function() {
  113. var args = [].slice.call(arguments);
  114. each(args, function() {
  115. delete Action.executors[this]
  116. })
  117. };
  118. Action.registerExecutor({
  119. undefined: {
  120. execute: function(e) {
  121. if (!e.action) {
  122. e.result = void 0;
  123. e.handled = true
  124. }
  125. }
  126. },
  127. func: {
  128. execute: function(e) {
  129. if (typeUtils.isFunction(e.action)) {
  130. e.result = e.action.call(e.context, e.args[0]);
  131. e.handled = true
  132. }
  133. }
  134. }
  135. });
  136. var createValidatorByTargetElement = function(condition) {
  137. return function(e) {
  138. if (!e.args.length) {
  139. return
  140. }
  141. var args = e.args[0];
  142. var element = args[e.validatingTargetName] || args.element;
  143. if (element && condition($(element))) {
  144. e.cancel = true
  145. }
  146. }
  147. };
  148. Action.registerExecutor({
  149. disabled: {
  150. validate: createValidatorByTargetElement(function($target) {
  151. return $target.is(".dx-state-disabled, .dx-state-disabled *")
  152. })
  153. },
  154. readOnly: {
  155. validate: createValidatorByTargetElement(function($target) {
  156. return $target.is(".dx-state-readonly, .dx-state-readonly *")
  157. })
  158. }
  159. });
  160. module.exports = Action;