DateTimePromptView.js 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. 'use strict';
  2. /**
  3. * Licensed Materials - Property of IBM
  4. * IBM Cognos Products: Dashboard
  5. * (C) Copyright IBM Corp. 2019, 2020
  6. * US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  7. */
  8. define(['../../../../lib/@waca/core-client/js/core-client/ui/AccessibleView', 'underscore', 'app/nls/StringResources', 'text!./templates/BasePromptView.html', 'text!./templates/DateTimePromptContent.html', '../../../../lib/@waca/core-client/js/core-client/ui/widgets/DatePicker', '../../../../lib/@waca/core-client/js/core-client/ui/widgets/TimePicker', '../../../../lib/@waca/core-client/js/core-client/utils/DateTimeUtils', 'moment-timezone', 'doT'], function (View, _, stringResources, BasePromptViewTemplate, DateTimePromptContentTemplate, DatePicker, TimePicker, DateTimeUtils, moment, dot) {
  9. 'use strict';
  10. var DateTimePromptView = View.extend({
  11. DATE_TIME_FORMAT: 'YYYY-MM-DDTHH:mm:ss',
  12. _iHeight: '212',
  13. startDate: null,
  14. endDate: null,
  15. startTime: null,
  16. endTime: null,
  17. timezone: null,
  18. /**
  19. * @classdesc Date, Time, DateTime prompt view class.
  20. * @public
  21. *
  22. * @param {String} options.columnId - The prompt item column ID.
  23. * @param {String} options.name - The parameter name.
  24. * @param {String} options.dataType -The parameter data type.
  25. * @param {Object} options.capabilities -The capabilities of the prompt.
  26. * @param {String} options.timezone -The timezone in user preferences.
  27. */
  28. init: function init(options) {
  29. DateTimePromptView.inherited('init', this, arguments);
  30. _.extend(this, options);
  31. this._isRangePrompt = options.capabilities.multivalued && !options.capabilities.discreteValue;
  32. if (options.timezone) {
  33. this.timezone = options.timezone;
  34. } else {
  35. this.timezone = 'America/New_York';
  36. }
  37. this.locale = options.locale || 'en';
  38. this.is24HrFormat = DateTimeUtils.is24HrFormat(this.locale);
  39. },
  40. render: function render() {
  41. var sBasePromptViewHtml = dot.template(BasePromptViewTemplate)({
  42. promptModuleName: this.promptModuleName
  43. });
  44. this.$el.addClass('popoverDialogContainer promptViewDialog').height(this._iHeight + 'px').width(this._iWidth + 'px').append(sBasePromptViewHtml);
  45. this.$el.attr('role', 'region');
  46. this.$el.attr('aria-label', this.viewTitle);
  47. var dateTitle = stringResources.get('dateTitle');
  48. var timeTitle = stringResources.get('timeTitle');
  49. var sPromptContentHtml = dot.template(DateTimePromptContentTemplate)({
  50. dataType: this.dataType,
  51. //title: stringResources.get('dateTimeFilterMessage'), //stringResourecs.get('promptControlTitle');
  52. isRangePrompt: this._isRangePrompt
  53. });
  54. this.$('.content').append(sPromptContentHtml);
  55. return new Promise(function (resolve) {
  56. switch (this.dataType) {
  57. case 'xsdDate':
  58. this._renderDate().then(function () {
  59. this.$el.find('.dateTitle').text(dateTitle);
  60. resolve(this);
  61. }.bind(this));
  62. break;
  63. case 'xsdDateTime':
  64. this._renderDateTime().then(function () {
  65. this.$el.find('.dateTitle').text(dateTitle);
  66. this.$el.find('.timeTitle').text(timeTitle);
  67. resolve(this);
  68. }.bind(this));
  69. break;
  70. case 'xsdTime':
  71. this._renderTime().then(function () {
  72. this.$el.find('.timeTitle').text(timeTitle);
  73. resolve(this);
  74. }.bind(this));
  75. break;
  76. default:
  77. resolve(this);
  78. break;
  79. }
  80. }.bind(this));
  81. },
  82. _getDateTimes: function _getDateTimes() {
  83. var dates = [];
  84. if (this.defaultValues) {
  85. var momentTime = moment.tz(this.defaultValues[0].label || this.defaultValues[0].d, this.DATE_TIME_FORMAT, this.timezone);
  86. dates.push(momentTime.toDate());
  87. if (this.defaultValues.length > 1) {
  88. var momentTime1 = moment.tz(this.defaultValues[1].label || this.defaultValues[1].d, this.DATE_TIME_FORMAT, this.timezone);
  89. dates.push(momentTime1.toDate());
  90. }
  91. } else {
  92. // initialize the locale for moment objects.
  93. var localMoment = moment();
  94. localMoment.locale(this.locale);
  95. //Get current date in format of YYYY-MM-DDTHH:mm:ss
  96. var _now = new Date().toISOString().replace(/\..*/, '');
  97. var currentDate = localMoment.tz(_now, this.timezone).toDate();
  98. dates = [currentDate, currentDate];
  99. }
  100. return dates;
  101. },
  102. _renderDate: function _renderDate() {
  103. var dates = this._getDateTimes();
  104. this.$el.find('.dateContainer').css('display', 'inline-flex');
  105. this.startDate = new DatePicker({
  106. '$el': this.$el.find('.dateRowStart'),
  107. 'labelText': '',
  108. 'ariaLabelText': stringResources.get('dateTitle'),
  109. 'timezone': this.timezone,
  110. 'locale': this.locale,
  111. 'attributes': {
  112. 'firstDay': 1,
  113. 'defaultDate': dates[0],
  114. 'inputFieldDate': dates[0]
  115. },
  116. 'setOnSelect': true,
  117. 'setDiv': this.$el
  118. });
  119. var datePickers = [];
  120. datePickers.push(this.startDate.render());
  121. if (this._isRangePrompt) {
  122. this.endDate = new DatePicker({
  123. '$el': this.$el.find('.dateRowEnd'),
  124. 'labelText': '',
  125. 'ariaLabelText': stringResources.get('dateTitle'),
  126. 'timezone': this.timezone,
  127. 'locale': this.locale,
  128. 'attributes': {
  129. 'firstDay': 1,
  130. 'defaultDate': dates[1],
  131. 'inputFieldDate': dates[1]
  132. },
  133. 'setOnSelect': false,
  134. 'setDiv': this.$el
  135. });
  136. datePickers.push(this.endDate.render());
  137. }
  138. return Promise.all(datePickers);
  139. },
  140. _renderTime: function _renderTime() {
  141. this.$el.find('.timeContainer').css('display', 'inline-flex');
  142. var times = this._getDateTimes();
  143. var timepickers = [];
  144. this.startTime = new TimePicker({
  145. '$el': this.$el.find('.timeRowStart'),
  146. 'timezone': this.timezone,
  147. 'ariaLabel': stringResources.get('timeTitle'),
  148. 'setDiv': this.$el,
  149. 'attributes': {
  150. 'minuteStep': 1,
  151. 'showMeridian': !this.is24HrFormat,
  152. 'defaultTime': times[0]
  153. }
  154. });
  155. timepickers.push(this.startTime.render());
  156. if (this._isRangePrompt) {
  157. this.endTime = new TimePicker({
  158. '$el': this.$el.find('.timeRowEnd'),
  159. 'timezone': this.timezone,
  160. 'ariaLabel': stringResources.get('timeTitle'),
  161. 'setDiv': this.$el,
  162. 'attributes': {
  163. 'minuteStep': 1,
  164. 'showMeridian': !this.is24HrFormat,
  165. 'defaultTime': times[1]
  166. }
  167. });
  168. timepickers.push(this.endTime.render());
  169. }
  170. return Promise.all(timepickers);
  171. },
  172. _renderDateTime: function _renderDateTime() {
  173. return this._renderDate().then(this._renderTime.bind(this)).then(function () {
  174. this.$el.find('.timeContainer').css('display', 'inline-flex');
  175. this.$el.find('.dateContainer').css('display', 'inline-flex');
  176. this._iWidth = 500;
  177. this.$el.width(this._iWidth + 'px');
  178. this.$el.find('.flexFifty').css('flex', '2 33%');
  179. }.bind(this));
  180. },
  181. setFocus: function setFocus() {
  182. var element = this.startDate ? this.startDate.$el.find('input') : this.startTime.$el.find('input');
  183. element.focus();
  184. },
  185. /**
  186. * @public
  187. * Get prompt values from dialog.
  188. *
  189. */
  190. getPromptValues: function getPromptValues() {
  191. var values;
  192. switch (this.dataType) {
  193. case 'xsdDate':
  194. values = this._getDateValues();
  195. break;
  196. case 'xsdDateTime':
  197. values = [];
  198. var timeValues = this._getTimeValues();
  199. var dateValues = this._getDateValues();
  200. for (var i = 0; i < dateValues.length; i++) {
  201. values.push(dateValues[i] + 'T' + timeValues[i]);
  202. }
  203. break;
  204. case 'xsdTime':
  205. values = this._getTimeValues();
  206. break;
  207. default:
  208. break;
  209. }
  210. return values;
  211. },
  212. _getDateValues: function _getDateValues() {
  213. var values = [];
  214. if (this.startDate.isValidDate()) {
  215. values.push(this.startDate.getDateVal());
  216. }
  217. if (this._isRangePrompt && this.endDate.isValidDate()) {
  218. values.push(this.endDate.getDateVal());
  219. }
  220. return values;
  221. },
  222. _getTimeValues: function _getTimeValues() {
  223. var values = [];
  224. if (this.startTime.isValidTime()) {
  225. values.push(this.startTime.getTime24HShort());
  226. }
  227. if (this._isRangePrompt && this.endTime.isValidTime()) {
  228. values.push(this.endTime.getTime24HShort());
  229. }
  230. return values;
  231. }
  232. });
  233. return DateTimePromptView;
  234. });
  235. //# sourceMappingURL=DateTimePromptView.js.map