radio_button.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. /**
  2. * DevExtreme (ui/radio_group/radio_button.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 registerComponent = require("../../core/component_registrator");
  16. var Editor = require("../editor/editor");
  17. var eventUtils = require("../../events/utils");
  18. var clickEvent = require("../../events/click");
  19. var RADIO_BUTTON_CLASS = "dx-radiobutton";
  20. var RADIO_BUTTON_ICON_CLASS = "dx-radiobutton-icon";
  21. var RADIO_BUTTON_ICON_DOT_CLASS = "dx-radiobutton-icon-dot";
  22. var RADIO_BUTTON_CHECKED_CLASS = "dx-radiobutton-checked";
  23. var RADIO_BUTTON_ICON_CHECKED_CLASS = "dx-radiobutton-icon-checked";
  24. var RadioButton = Editor.inherit({
  25. _supportedKeys: function() {
  26. var click = function(e) {
  27. e.preventDefault();
  28. this._clickAction({
  29. event: e
  30. })
  31. };
  32. return extend(this.callBase(), {
  33. space: click
  34. })
  35. },
  36. _getDefaultOptions: function() {
  37. return extend(this.callBase(), {
  38. hoverStateEnabled: true,
  39. activeStateEnabled: true,
  40. value: false,
  41. useInkRipple: false
  42. })
  43. },
  44. _canValueBeChangedByClick: function() {
  45. return true
  46. },
  47. _defaultOptionsRules: function() {
  48. return this.callBase().concat([{
  49. device: function() {
  50. return "desktop" === devices.real().deviceType && !devices.isSimulator()
  51. },
  52. options: {
  53. focusStateEnabled: true
  54. }
  55. }])
  56. },
  57. _init: function() {
  58. this.callBase();
  59. this.$element().addClass(RADIO_BUTTON_CLASS)
  60. },
  61. _initMarkup: function() {
  62. this.callBase();
  63. this._renderIcon();
  64. this.option("useInkRipple") && this._renderInkRipple();
  65. this._renderCheckedState(this.option("value"));
  66. this._renderClick();
  67. this.setAria("role", "radio")
  68. },
  69. _renderInkRipple: function() {
  70. this._inkRipple = inkRipple.render({
  71. waveSizeCoefficient: 3.3,
  72. useHoldAnimation: false,
  73. wavesNumber: 2,
  74. isCentered: true
  75. })
  76. },
  77. _renderInkWave: function(element, dxEvent, doRender, waveIndex) {
  78. if (!this._inkRipple) {
  79. return
  80. }
  81. var config = {
  82. element: element,
  83. event: dxEvent,
  84. wave: waveIndex
  85. };
  86. if (doRender) {
  87. this._inkRipple.showWave(config)
  88. } else {
  89. this._inkRipple.hideWave(config)
  90. }
  91. },
  92. _updateFocusState: function(e, value) {
  93. this.callBase.apply(this, arguments);
  94. this._renderInkWave(this._$icon, e, value, 0)
  95. },
  96. _toggleActiveState: function($element, value, e) {
  97. this.callBase.apply(this, arguments);
  98. this._renderInkWave(this._$icon, e, value, 1)
  99. },
  100. _renderIcon: function() {
  101. this._$icon = $("<div>").addClass(RADIO_BUTTON_ICON_CLASS);
  102. $("<div>").addClass(RADIO_BUTTON_ICON_DOT_CLASS).appendTo(this._$icon);
  103. this.$element().append(this._$icon)
  104. },
  105. _renderCheckedState: function(checked) {
  106. this.$element().toggleClass(RADIO_BUTTON_CHECKED_CLASS, checked).find("." + RADIO_BUTTON_ICON_CLASS).toggleClass(RADIO_BUTTON_ICON_CHECKED_CLASS, checked);
  107. this.setAria("checked", checked)
  108. },
  109. _renderClick: function() {
  110. var eventName = eventUtils.addNamespace(clickEvent.name, this.NAME);
  111. this._clickAction = this._createAction(function(args) {
  112. this._clickHandler(args.event)
  113. }.bind(this));
  114. eventsEngine.off(this.$element(), eventName);
  115. eventsEngine.on(this.$element(), eventName, function(e) {
  116. this._clickAction({
  117. event: e
  118. })
  119. }.bind(this))
  120. },
  121. _clickHandler: function(e) {
  122. this._saveValueChangeEvent(e);
  123. this.option("value", true)
  124. },
  125. _optionChanged: function(args) {
  126. switch (args.name) {
  127. case "useInkRipple":
  128. this._invalidate();
  129. break;
  130. case "value":
  131. this._renderCheckedState(args.value);
  132. this.callBase(args);
  133. break;
  134. default:
  135. this.callBase(args)
  136. }
  137. },
  138. _clean: function() {
  139. delete this._inkRipple;
  140. this.callBase()
  141. }
  142. });
  143. registerComponent("dxRadioButton", RadioButton);
  144. module.exports = RadioButton;