ui.scheduler.header.js 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. /**
  2. * DevExtreme (ui/scheduler/ui.scheduler.header.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 typeUtils = require("../../core/utils/type");
  12. var noop = require("../../core/utils/common").noop;
  13. var isDefined = require("../../core/utils/type").isDefined;
  14. var extend = require("../../core/utils/extend").extend;
  15. var each = require("../../core/utils/iterator").each;
  16. var inArray = require("../../core/utils/array").inArray;
  17. var camelize = require("../../core/utils/inflector").camelize;
  18. var registerComponent = require("../../core/component_registrator");
  19. var Widget = require("../widget/ui.widget");
  20. var publisherMixin = require("./ui.scheduler.publisher_mixin");
  21. var SchedulerNavigator = require("./ui.scheduler.navigator");
  22. var DropDownMenu = require("../drop_down_menu");
  23. var Tabs = require("../tabs");
  24. var errors = require("../../core/errors");
  25. var messageLocalization = require("../../localization/message");
  26. var COMPONENT_CLASS = "dx-scheduler-header";
  27. var VIEW_SWITCHER_CLASS = "dx-scheduler-view-switcher";
  28. var VIEW_SWITCHER_LABEL_CLASS = "dx-scheduler-view-switcher-label";
  29. var STEP_MAP = {
  30. day: "day",
  31. week: "week",
  32. workWeek: "workWeek",
  33. month: "month",
  34. timelineDay: "day",
  35. timelineWeek: "week",
  36. timelineWorkWeek: "workWeek",
  37. timelineMonth: "month",
  38. agenda: "agenda"
  39. };
  40. var VIEWS = ["day", "week", "workWeek", "month", "timelineDay", "timelineWeek", "timelineWorkWeek", "timelineMonth", "agenda"];
  41. var SchedulerHeader = Widget.inherit({
  42. _getDefaultOptions: function() {
  43. return extend(this.callBase(), {
  44. views: [],
  45. intervalCount: 1,
  46. currentView: "day",
  47. firstDayOfWeek: void 0,
  48. currentDate: new Date,
  49. min: void 0,
  50. max: void 0,
  51. useDropDownViewSwitcher: false,
  52. _dropDownButtonIcon: "overlay"
  53. })
  54. },
  55. _setOptionsByReference: function() {
  56. this.callBase();
  57. extend(this._optionsByReference, {
  58. currentView: true
  59. })
  60. },
  61. _optionChanged: function(args) {
  62. var value = args.value;
  63. switch (args.name) {
  64. case "views":
  65. this._validateViews();
  66. this._viewSwitcher.option({
  67. items: value,
  68. selectedItem: this.option("currentView")
  69. });
  70. break;
  71. case "customizeDateNavigatorText":
  72. this._navigator.option(args.name, value);
  73. break;
  74. case "currentView":
  75. this._viewSwitcher.option("selectedItem", value);
  76. this._navigator.option("step", STEP_MAP[this._getCurrentViewType()]);
  77. this._changeViewSwitcherLabelText();
  78. break;
  79. case "currentDate":
  80. this._navigator.option("date", value);
  81. break;
  82. case "displayedDate":
  83. this._navigator.option("displayedDate", value);
  84. break;
  85. case "min":
  86. case "max":
  87. case "firstDayOfWeek":
  88. case "intervalCount":
  89. this._navigator.option(args.name, value);
  90. break;
  91. case "tabIndex":
  92. case "focusStateEnabled":
  93. this._viewSwitcher.option(args.name, value);
  94. this._navigator.option(args.name, value);
  95. this.callBase(args);
  96. break;
  97. case "useDropDownViewSwitcher":
  98. this._refreshViewSwitcher();
  99. break;
  100. default:
  101. this.callBase(args)
  102. }
  103. },
  104. _init: function() {
  105. this.callBase();
  106. this.$element().addClass(COMPONENT_CLASS)
  107. },
  108. _initMarkup: function() {
  109. this.callBase();
  110. this._renderNavigator();
  111. this._renderViewSwitcher()
  112. },
  113. _renderNavigator: function() {
  114. this._navigator = this._createComponent("<div>", SchedulerNavigator, {
  115. min: this.option("min"),
  116. max: this.option("max"),
  117. intervalCount: this.option("intervalCount"),
  118. date: this.option("currentDate"),
  119. step: STEP_MAP[this._getCurrentViewType()],
  120. firstDayOfWeek: this.option("firstDayOfWeek"),
  121. tabIndex: this.option("tabIndex"),
  122. focusStateEnabled: this.option("focusStateEnabled"),
  123. observer: this.option("observer"),
  124. customizeDateNavigatorText: this.option("customizeDateNavigatorText")
  125. });
  126. this._navigator.$element().appendTo(this.$element())
  127. },
  128. _renderViewSwitcher: function() {
  129. this._validateViews();
  130. var $viewSwitcher = $("<div>").addClass(VIEW_SWITCHER_CLASS).appendTo(this.$element());
  131. if (!this.option("useDropDownViewSwitcher")) {
  132. this._renderViewSwitcherTabs($viewSwitcher)
  133. } else {
  134. this._renderViewSwitcherDropDownMenu($viewSwitcher)
  135. }
  136. },
  137. _validateViews: function() {
  138. var views = this.option("views");
  139. each(views, function(_, view) {
  140. var isViewIsObject = typeUtils.isObject(view);
  141. var viewType = isViewIsObject && view.type ? view.type : view;
  142. if (inArray(viewType, VIEWS) === -1) {
  143. errors.log("W0008", viewType)
  144. }
  145. })
  146. },
  147. _getCurrentViewType: function() {
  148. var currentView = this.option("currentView");
  149. return currentView.type || currentView
  150. },
  151. _renderViewSwitcherTabs: function($element) {
  152. var that = this;
  153. $element.addClass(Tabs.getTabsExpandedClass);
  154. this._viewSwitcher = this._createComponent($element, Tabs, {
  155. selectionRequired: true,
  156. scrollingEnabled: true,
  157. onSelectionChanged: this._updateCurrentView.bind(this),
  158. items: this.option("views"),
  159. itemTemplate: function(item) {
  160. return $("<span>").addClass("dx-tab-text").text(that._getItemText(item))
  161. },
  162. selectedItem: this.option("currentView"),
  163. tabIndex: this.option("tabIndex"),
  164. focusStateEnabled: this.option("focusStateEnabled")
  165. })
  166. },
  167. _getItemText: function(item) {
  168. return item.name || messageLocalization.format("dxScheduler-switcher" + camelize(item.type || item, true))
  169. },
  170. _refreshViewSwitcher: function() {
  171. this._viewSwitcher._dispose();
  172. this._viewSwitcher.$element().remove();
  173. delete this._viewSwitcher;
  174. this._removeViewSwitcherLabel();
  175. this._renderViewSwitcher()
  176. },
  177. _removeViewSwitcherLabel: function() {
  178. if (isDefined(this._$viewSwitcherLabel)) {
  179. this._$viewSwitcherLabel.detach();
  180. this._$viewSwitcherLabel.remove();
  181. delete this._$viewSwitcherLabel
  182. }
  183. },
  184. _renderViewSwitcherDropDownMenu: function($element) {
  185. var that = this;
  186. this._$viewSwitcherLabel = $("<div>").addClass(VIEW_SWITCHER_LABEL_CLASS).appendTo(this.$element());
  187. this._changeViewSwitcherLabelText();
  188. this._viewSwitcher = this._createComponent($element, DropDownMenu, {
  189. onItemClick: this._updateCurrentView.bind(this),
  190. buttonIcon: this.option("_dropDownButtonIcon"),
  191. items: this.option("views"),
  192. itemTemplate: function(item) {
  193. return $("<span>").addClass("dx-dropdownmenu-item-text").text(that._getItemText(item))
  194. }
  195. })
  196. },
  197. _changeViewSwitcherLabelText: function() {
  198. if (!isDefined(this._$viewSwitcherLabel)) {
  199. return
  200. }
  201. var currentView = this.option("currentView");
  202. var currentViewText = this._getItemText(currentView);
  203. this._$viewSwitcherLabel.text(currentViewText)
  204. },
  205. _getCurrentViewName: function(currentView) {
  206. return typeUtils.isObject(currentView) ? currentView.name || currentView.type : currentView
  207. },
  208. _updateCurrentView: function(e) {
  209. var selectedItem = e.itemData || e.component.option("selectedItem");
  210. var viewName = this._getCurrentViewName(selectedItem);
  211. this.notifyObserver("currentViewUpdated", viewName)
  212. },
  213. _renderFocusTarget: noop
  214. }).include(publisherMixin);
  215. registerComponent("dxSchedulerHeader", SchedulerHeader);
  216. module.exports = SchedulerHeader;