check_box.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. /**
  2. * DevExtreme (ui/check_box.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("../core/renderer");
  11. var eventsEngine = require("../events/core/events_engine");
  12. var devices = require("../core/devices");
  13. var extend = require("../core/utils/extend").extend;
  14. var inkRipple = require("./widget/utils.ink_ripple");
  15. var Editor = require("./editor/editor");
  16. var registerComponent = require("../core/component_registrator");
  17. var eventUtils = require("../events/utils");
  18. var clickEvent = require("../events/click");
  19. var CHECKBOX_CLASS = "dx-checkbox";
  20. var CHECKBOX_ICON_CLASS = "dx-checkbox-icon";
  21. var CHECKBOX_CHECKED_CLASS = "dx-checkbox-checked";
  22. var CHECKBOX_CONTAINER_CLASS = "dx-checkbox-container";
  23. var CHECKBOX_TEXT_CLASS = "dx-checkbox-text";
  24. var CHECKBOX_HAS_TEXT_CLASS = "dx-checkbox-has-text";
  25. var CHECKBOX_INDETERMINATE_CLASS = "dx-checkbox-indeterminate";
  26. var CHECKBOX_FEEDBACK_HIDE_TIMEOUT = 100;
  27. var CheckBox = Editor.inherit({
  28. _supportedKeys: function() {
  29. var click = function(e) {
  30. e.preventDefault();
  31. this._clickAction({
  32. event: e
  33. })
  34. };
  35. return extend(this.callBase(), {
  36. space: click
  37. })
  38. },
  39. _getDefaultOptions: function() {
  40. return extend(this.callBase(), {
  41. hoverStateEnabled: true,
  42. activeStateEnabled: true,
  43. value: false,
  44. text: "",
  45. useInkRipple: false
  46. })
  47. },
  48. _defaultOptionsRules: function() {
  49. return this.callBase().concat([{
  50. device: function() {
  51. return "desktop" === devices.real().deviceType && !devices.isSimulator()
  52. },
  53. options: {
  54. focusStateEnabled: true
  55. }
  56. }])
  57. },
  58. _canValueBeChangedByClick: function() {
  59. return true
  60. },
  61. _feedbackHideTimeout: CHECKBOX_FEEDBACK_HIDE_TIMEOUT,
  62. _initMarkup: function() {
  63. this._renderSubmitElement();
  64. this._$container = $("<div>").addClass(CHECKBOX_CONTAINER_CLASS);
  65. this.setAria("role", "checkbox");
  66. this.$element().addClass(CHECKBOX_CLASS);
  67. this._renderValue();
  68. this._renderIcon();
  69. this._renderText();
  70. this.option("useInkRipple") && this._renderInkRipple();
  71. this.$element().append(this._$container);
  72. this.callBase()
  73. },
  74. _render: function() {
  75. this._renderClick();
  76. this.callBase()
  77. },
  78. _renderSubmitElement: function() {
  79. this._$submitElement = $("<input>").attr("type", "hidden").appendTo(this.$element())
  80. },
  81. _getSubmitElement: function() {
  82. return this._$submitElement
  83. },
  84. _renderInkRipple: function() {
  85. this._inkRipple = inkRipple.render({
  86. waveSizeCoefficient: 2.5,
  87. useHoldAnimation: false,
  88. wavesNumber: 2,
  89. isCentered: true
  90. })
  91. },
  92. _renderInkWave: function(element, dxEvent, doRender, waveIndex) {
  93. if (!this._inkRipple) {
  94. return
  95. }
  96. var config = {
  97. element: element,
  98. event: dxEvent,
  99. wave: waveIndex
  100. };
  101. if (doRender) {
  102. this._inkRipple.showWave(config)
  103. } else {
  104. this._inkRipple.hideWave(config)
  105. }
  106. },
  107. _updateFocusState: function(e, value) {
  108. this.callBase.apply(this, arguments);
  109. this._renderInkWave(this._$icon, e, value, 0)
  110. },
  111. _toggleActiveState: function($element, value, e) {
  112. this.callBase.apply(this, arguments);
  113. this._renderInkWave(this._$icon, e, value, 1)
  114. },
  115. _renderIcon: function() {
  116. this._$icon = $("<span>").addClass(CHECKBOX_ICON_CLASS).prependTo(this._$container)
  117. },
  118. _renderText: function() {
  119. var textValue = this.option("text");
  120. if (!textValue) {
  121. if (this._$text) {
  122. this._$text.remove();
  123. this.$element().removeClass(CHECKBOX_HAS_TEXT_CLASS)
  124. }
  125. return
  126. }
  127. if (!this._$text) {
  128. this._$text = $("<span>").addClass(CHECKBOX_TEXT_CLASS)
  129. }
  130. this._$text.text(textValue);
  131. this._$container.append(this._$text);
  132. this.$element().addClass(CHECKBOX_HAS_TEXT_CLASS)
  133. },
  134. _renderClick: function() {
  135. var that = this;
  136. var eventName = eventUtils.addNamespace(clickEvent.name, that.NAME);
  137. that._clickAction = that._createAction(that._clickHandler);
  138. eventsEngine.off(that.$element(), eventName);
  139. eventsEngine.on(that.$element(), eventName, function(e) {
  140. that._clickAction({
  141. event: e
  142. })
  143. })
  144. },
  145. _clickHandler: function(args) {
  146. var that = args.component;
  147. that._saveValueChangeEvent(args.event);
  148. that.option("value", !that.option("value"))
  149. },
  150. _renderValue: function() {
  151. var $element = this.$element();
  152. var checked = this.option("value");
  153. var indeterminate = void 0 === checked;
  154. $element.toggleClass(CHECKBOX_CHECKED_CLASS, Boolean(checked));
  155. $element.toggleClass(CHECKBOX_INDETERMINATE_CLASS, indeterminate);
  156. this._getSubmitElement().val(checked);
  157. this.setAria("checked", indeterminate ? "mixed" : checked || "false")
  158. },
  159. _optionChanged: function(args) {
  160. switch (args.name) {
  161. case "useInkRipple":
  162. this._invalidate();
  163. break;
  164. case "value":
  165. this._renderValue();
  166. this.callBase(args);
  167. break;
  168. case "text":
  169. this._renderText();
  170. this._renderDimensions();
  171. break;
  172. default:
  173. this.callBase(args)
  174. }
  175. },
  176. _clean: function() {
  177. delete this._inkRipple;
  178. this.callBase()
  179. }
  180. });
  181. registerComponent("dxCheckBox", CheckBox);
  182. module.exports = CheckBox;
  183. module.exports.default = module.exports;