ui.scheduler.appointment.js 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. /**
  2. * DevExtreme (ui/scheduler/ui.scheduler.appointment.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 _renderer = require("../../core/renderer");
  11. var _renderer2 = _interopRequireDefault(_renderer);
  12. var _events_engine = require("../../events/core/events_engine");
  13. var _events_engine2 = _interopRequireDefault(_events_engine);
  14. var _translator = require("../../animation/translator");
  15. var _translator2 = _interopRequireDefault(_translator);
  16. var _utils = require("./utils.recurrence");
  17. var _utils2 = _interopRequireDefault(_utils);
  18. var _extend = require("../../core/utils/extend");
  19. var _component_registrator = require("../../core/component_registrator");
  20. var _component_registrator2 = _interopRequireDefault(_component_registrator);
  21. var _ui = require("../tooltip/ui.tooltip");
  22. var _ui2 = _interopRequireDefault(_ui);
  23. var _uiScheduler = require("./ui.scheduler.publisher_mixin");
  24. var _uiScheduler2 = _interopRequireDefault(_uiScheduler);
  25. var _utils3 = require("../../events/utils");
  26. var _utils4 = _interopRequireDefault(_utils3);
  27. var _pointer = require("../../events/pointer");
  28. var _pointer2 = _interopRequireDefault(_pointer);
  29. var _dom_component = require("../../core/dom_component");
  30. var _dom_component2 = _interopRequireDefault(_dom_component);
  31. var _resizable = require("../resizable");
  32. var _resizable2 = _interopRequireDefault(_resizable);
  33. var _message = require("../../localization/message");
  34. var _message2 = _interopRequireDefault(_message);
  35. var _date = require("../../localization/date");
  36. var _date2 = _interopRequireDefault(_date);
  37. function _interopRequireDefault(obj) {
  38. return obj && obj.__esModule ? obj : {
  39. "default": obj
  40. }
  41. }
  42. var DEFAULT_HORIZONTAL_HANDLES = "left right";
  43. var DEFAULT_VERTICAL_HANDLES = "top bottom";
  44. var REDUCED_APPOINTMENT_POINTERENTER_EVENT_NAME = _utils4.default.addNamespace(_pointer2.default.enter, "dxSchedulerAppointment");
  45. var REDUCED_APPOINTMENT_POINTERLEAVE_EVENT_NAME = _utils4.default.addNamespace(_pointer2.default.leave, "dxSchedulerAppointment");
  46. var EMPTY_APPOINTMENT_CLASS = "dx-scheduler-appointment-empty";
  47. var APPOINTMENT_ALL_DAY_ITEM_CLASS = "dx-scheduler-all-day-appointment";
  48. var DIRECTION_APPOINTMENT_CLASSES = {
  49. horizontal: "dx-scheduler-appointment-horizontal",
  50. vertical: "dx-scheduler-appointment-vertical"
  51. };
  52. var RECURRENCE_APPOINTMENT_CLASS = "dx-scheduler-appointment-recurrence";
  53. var COMPACT_APPOINTMENT_CLASS = "dx-scheduler-appointment-compact";
  54. var REDUCED_APPOINTMENT_CLASS = "dx-scheduler-appointment-reduced";
  55. var REDUCED_APPOINTMENT_ICON = "dx-scheduler-appointment-reduced-icon";
  56. var REDUCED_APPOINTMENT_PARTS_CLASSES = {
  57. head: "dx-scheduler-appointment-head",
  58. body: "dx-scheduler-appointment-body",
  59. tail: "dx-scheduler-appointment-tail"
  60. };
  61. var Appointment = _dom_component2.default.inherit({
  62. _getDefaultOptions: function() {
  63. return (0, _extend.extend)(this.callBase(), {
  64. data: {},
  65. geometry: {
  66. top: 0,
  67. left: 0,
  68. width: 0,
  69. height: 0
  70. },
  71. allowDrag: true,
  72. allowResize: true,
  73. reduced: null,
  74. isCompact: false,
  75. direction: "vertical",
  76. resizableConfig: {},
  77. cellHeight: 0,
  78. cellWidth: 0
  79. })
  80. },
  81. _optionChanged: function(args) {
  82. switch (args.name) {
  83. case "data":
  84. case "geometry":
  85. case "allowDrag":
  86. case "allowResize":
  87. case "reduced":
  88. case "sortedIndex":
  89. case "isCompact":
  90. case "direction":
  91. case "resizableConfig":
  92. case "cellHeight":
  93. case "cellWidth":
  94. this._invalidate();
  95. break;
  96. default:
  97. this.callBase(args)
  98. }
  99. },
  100. _getHorizontalResizingRule: function() {
  101. var reducedHandles = {
  102. head: this.option("rtlEnabled") ? "right" : "left",
  103. body: "",
  104. tail: this.option("rtlEnabled") ? "left" : "right"
  105. };
  106. return {
  107. handles: this.option("reduced") ? reducedHandles[this.option("reduced")] : DEFAULT_HORIZONTAL_HANDLES,
  108. minHeight: 0,
  109. minWidth: this.invoke("getCellWidth"),
  110. step: this.invoke("getResizableStep")
  111. }
  112. },
  113. _getVerticalResizingRule: function() {
  114. var height = this.invoke("getCellHeight");
  115. return {
  116. handles: DEFAULT_VERTICAL_HANDLES,
  117. minWidth: 0,
  118. minHeight: height,
  119. step: height
  120. }
  121. },
  122. _render: function() {
  123. this.callBase();
  124. this._renderAppointmentGeometry();
  125. this._renderEmptyClass();
  126. this._renderCompactClass();
  127. this._renderReducedAppointment();
  128. this._renderAllDayClass();
  129. this._renderDirection();
  130. this.$element().data("dxAppointmentStartDate", this.option("startDate"));
  131. this.$element().attr("title", this.invoke("getField", "text", this.option("data")));
  132. this.$element().attr("role", "button");
  133. this._renderRecurrenceClass();
  134. this._renderResizable()
  135. },
  136. _renderAppointmentGeometry: function() {
  137. var geometry = this.option("geometry");
  138. var $element = this.$element();
  139. _translator2.default.move($element, {
  140. top: geometry.top,
  141. left: geometry.left
  142. });
  143. $element.css({
  144. width: geometry.width < 0 ? 0 : geometry.width,
  145. height: geometry.height < 0 ? 0 : geometry.height
  146. })
  147. },
  148. _renderEmptyClass: function() {
  149. var geometry = this.option("geometry");
  150. if (geometry.empty || this.option("isCompact")) {
  151. this.$element().addClass(EMPTY_APPOINTMENT_CLASS)
  152. }
  153. },
  154. _renderReducedAppointment: function() {
  155. var reducedPart = this.option("reduced");
  156. if (!reducedPart) {
  157. return
  158. }
  159. this.$element().toggleClass(REDUCED_APPOINTMENT_CLASS, true).toggleClass(REDUCED_APPOINTMENT_PARTS_CLASSES[reducedPart], true);
  160. this._renderAppointmentReducedIcon()
  161. },
  162. _renderAppointmentReducedIcon: function() {
  163. var $icon = (0, _renderer2.default)("<div>").addClass(REDUCED_APPOINTMENT_ICON).appendTo(this.$element());
  164. var endDate = this._getEndDate();
  165. var tooltipLabel = _message2.default.format("dxScheduler-editorLabelEndDate");
  166. var tooltipText = [tooltipLabel, ": ", _date2.default.format(endDate, "monthAndDay"), ", ", _date2.default.format(endDate, "year")].join("");
  167. _events_engine2.default.off($icon, REDUCED_APPOINTMENT_POINTERENTER_EVENT_NAME);
  168. _events_engine2.default.on($icon, REDUCED_APPOINTMENT_POINTERENTER_EVENT_NAME, function() {
  169. _ui2.default.show({
  170. target: $icon,
  171. content: tooltipText
  172. })
  173. });
  174. _events_engine2.default.off($icon, REDUCED_APPOINTMENT_POINTERLEAVE_EVENT_NAME);
  175. _events_engine2.default.on($icon, REDUCED_APPOINTMENT_POINTERLEAVE_EVENT_NAME, function() {
  176. _ui2.default.hide()
  177. })
  178. },
  179. _getEndDate: function() {
  180. var result = this.invoke("getField", "endDate", this.option("data"));
  181. if (result) {
  182. return new Date(result)
  183. }
  184. return result
  185. },
  186. _renderAllDayClass: function() {
  187. this.$element().toggleClass(APPOINTMENT_ALL_DAY_ITEM_CLASS, !!this.option("allDay"))
  188. },
  189. _renderRecurrenceClass: function() {
  190. var rule = this.invoke("getField", "recurrenceRule", this.option("data"));
  191. if (_utils2.default.getRecurrenceRule(rule).isValid) {
  192. this.$element().addClass(RECURRENCE_APPOINTMENT_CLASS)
  193. }
  194. },
  195. _renderCompactClass: function() {
  196. this.$element().toggleClass(COMPACT_APPOINTMENT_CLASS, !!this.option("isCompact"))
  197. },
  198. _renderDirection: function() {
  199. this.$element().addClass(DIRECTION_APPOINTMENT_CLASSES[this.option("direction")])
  200. },
  201. _createResizingConfig: function() {
  202. var config = "vertical" === this.option("direction") ? this._getVerticalResizingRule() : this._getHorizontalResizingRule();
  203. config.roundStepValue = true;
  204. if (!this.invoke("isGroupedByDate")) {
  205. config.stepPrecision = "strict"
  206. }
  207. return config
  208. },
  209. _renderResizable: function() {
  210. if (this.option("allowResize") && !this.option("isCompact")) {
  211. this._createComponent(this.$element(), _resizable2.default, (0, _extend.extend)(this._createResizingConfig(), this.option("resizableConfig")))
  212. }
  213. }
  214. }).include(_uiScheduler2.default);
  215. (0, _component_registrator2.default)("dxSchedulerAppointment", Appointment);
  216. module.exports = Appointment;