APIs

Show:
  1. ///<reference path="../../typings/lite/app_references.d.ts" />
  2. var __extends = (this && this.__extends) || function (d, b) {
  3. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  4. function __() { this.constructor = d; }
  5. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  6. };
  7. //GULP_ABSTRACT_END
  8. define(['jquery', 'BlockJsonBase', 'moment'], function ($, BlockJsonBase, moment) {
  9. TSLiteModules.BlockJsonBase = BlockJsonBase;
  10. /**
  11. BlockGoogleCalendar is based on JSON base class component
  12. @class BlockGoogleCalendar
  13. @constructor
  14. @return {Object} instantiated BlockGoogleCalendar
  15. 6e2919a1-47f0-4a4f-bd94-de7ecfbe604d
  16. **/
  17. var BlockGoogleCalendar = (function (_super) {
  18. __extends(BlockGoogleCalendar, _super);
  19. function BlockGoogleCalendar(options) {
  20. this.m_options = options;
  21. this.m_blockType = BB.CONSTS.BLOCKCODE_CALENDAR;
  22. _.extend(this.m_options, { blockType: this.m_blockType });
  23. _super.call(this);
  24. }
  25. /**
  26. Init sub class and super on base
  27. @method initialize
  28. **/
  29. BlockGoogleCalendar.prototype.initialize = function () {
  30. var self = this;
  31. self.m_minTokenLength = 15;
  32. _super.prototype.initialize.call(this, this.m_options);
  33. self.m_mimeType = 'Json.calendar';
  34. self.m_moment = moment;
  35. self._initSettingsPanel();
  36. self._listenCalChanged();
  37. self._listenTokenChanged();
  38. self._listenRefreshSheetList();
  39. self._listenRelativeFixedMode();
  40. self._loadSheetList();
  41. self._listenDaysOffsetChange();
  42. self._listenSchedStartTimeChange();
  43. self._listenSchedEndTimeChange();
  44. };
  45. /**
  46. Listen to changes in start date selection for calendar
  47. @method _listenSchedEndTimeChange
  48. **/
  49. BlockGoogleCalendar.prototype._listenSchedStartTimeChange = function () {
  50. var self = this;
  51. self.m_schedChangeStartTimeHandler = function (e) {
  52. if (!self.m_selected)
  53. return;
  54. var startDate = Date.parse(e.date) / 1000;
  55. var domPlayerData = self._getBlockPlayerData();
  56. var xSnippet = $(domPlayerData).find('Json').find('Data');
  57. $(xSnippet).attr('startDate', startDate + '000');
  58. self._setBlockPlayerData(domPlayerData, BB.CONSTS.NO_NOTIFICATION);
  59. };
  60. $(Elements.GOOGLE_CALENDAR_START).on('hide.timepicker', self.m_schedChangeStartTimeHandler);
  61. };
  62. /**
  63. Listen to changes in end date selection for calendar
  64. @method _listenSchedEndTimeChange
  65. **/
  66. BlockGoogleCalendar.prototype._listenSchedEndTimeChange = function () {
  67. var self = this;
  68. self.m_schedChangeEndTimeHandler = function (e) {
  69. if (!self.m_selected)
  70. return;
  71. var endDate = Date.parse(e.date) / 1000;
  72. var domPlayerData = self._getBlockPlayerData();
  73. var xSnippet = $(domPlayerData).find('Json').find('Data');
  74. $(xSnippet).attr('endDate', endDate + '000');
  75. self._setBlockPlayerData(domPlayerData, BB.CONSTS.NO_NOTIFICATION);
  76. };
  77. $(Elements.GOOGLE_CALENDAR_END).on('hide.timepicker', self.m_schedChangeEndTimeHandler);
  78. };
  79. /**
  80. Populate the fixed / offset mode in switch slider
  81. @method _populateMode
  82. **/
  83. BlockGoogleCalendar.prototype._populateMode = function () {
  84. var self = this;
  85. var domPlayerData = self._getBlockPlayerData();
  86. var item = $(domPlayerData).find('Json').find('Data');
  87. var mode = $(item).attr('mode');
  88. var daysAfter = $(item).attr('after');
  89. var daysBefore = $(item).attr('before');
  90. self._populateModeDateSelection(mode);
  91. self._populateDaysAfter(daysAfter);
  92. self._populateDaysBefore(daysBefore);
  93. mode = (mode == 'fixed') ? false : true;
  94. $(Elements.GOOGLE_CALENDAR_MODE).prop('checked', mode);
  95. };
  96. /**
  97. Populate the start and end dates for Google calendar date range selection
  98. If first time date component is used, set startDate and endDate where
  99. startDate is relative to today and endDate for a week from now
  100. @method _populateStartEndDates
  101. **/
  102. BlockGoogleCalendar.prototype._populateStartEndDates = function () {
  103. var self = this;
  104. var domPlayerData = self._getBlockPlayerData();
  105. var item = $(domPlayerData).find('Json').find('Data');
  106. // if first time date component used, set startDate relative to today
  107. var startDate = $(item).attr('startDate');
  108. if (startDate == '') {
  109. var date = new Date();
  110. var startDateUnix = self.m_moment(date).unix();
  111. var startDate = self.m_moment(date).format("MM/DD/YYYY");
  112. var domPlayerData = self._getBlockPlayerData();
  113. var xSnippet = $(domPlayerData).find('Json').find('Data');
  114. $(xSnippet).attr('startDate', startDateUnix + '000');
  115. self._setBlockPlayerData(domPlayerData, BB.CONSTS.NO_NOTIFICATION);
  116. }
  117. else {
  118. startDate = startDate.substr(0, 10);
  119. startDate = self.m_moment.unix(startDate).format("MM/DD/YYYY");
  120. }
  121. $(Elements.GOOGLE_CALENDAR_START).datepicker('setDate', startDate);
  122. // if first time date component used, set endDate relative a week from now
  123. var endDate = $(item).attr('endDate');
  124. if (endDate == '') {
  125. var inWeek = date.setDate(new Date().getDate() + 7);
  126. var endDateUnix = self.m_moment(inWeek).unix();
  127. var endDate = self.m_moment(inWeek).format("MM/DD/YYYY");
  128. var domPlayerData = self._getBlockPlayerData();
  129. var xSnippet = $(domPlayerData).find('Json').find('Data');
  130. $(xSnippet).attr('endDate', endDateUnix + '000');
  131. self._setBlockPlayerData(domPlayerData, BB.CONSTS.NO_NOTIFICATION);
  132. }
  133. else {
  134. endDate = endDate.substr(0, 10);
  135. endDate = self.m_moment.unix(endDate).format("MM/DD/YYYY");
  136. }
  137. $(Elements.GOOGLE_CALENDAR_END).datepicker('setDate', endDate);
  138. };
  139. /**
  140. Populate the fixed / offset mode in the UX date controls
  141. @method _populateModeDateSelection
  142. @param {String} i_mode
  143. **/
  144. BlockGoogleCalendar.prototype._populateModeDateSelection = function (i_mode) {
  145. var self = this;
  146. if (i_mode == 'offset') {
  147. $(Elements.CALENDAR_OFFSET_MODE).slideDown();
  148. $(Elements.CALENDAR_FIXED_MODE).slideUp();
  149. }
  150. else {
  151. $(Elements.CALENDAR_OFFSET_MODE).slideUp();
  152. $(Elements.CALENDAR_FIXED_MODE).slideDown();
  153. }
  154. };
  155. /**
  156. Listen to relative or fixed mode states for the component
  157. @method _listenRelativeFixedMode
  158. @param {Number} _listenRelativeFixedMode
  159. **/
  160. BlockGoogleCalendar.prototype._listenRelativeFixedMode = function () {
  161. var self = this;
  162. self.m_relativeFixedModeHandler = function (e) {
  163. if (!self.m_selected)
  164. return;
  165. var mode = $(e.target).prop('checked') == true ? 'offset' : 'fixed';
  166. self._populateModeDateSelection(mode);
  167. var domPlayerData = self._getBlockPlayerData();
  168. var xSnippet = $(domPlayerData).find('Json').find('Data');
  169. $(xSnippet).attr('mode', mode);
  170. self._setBlockPlayerData(domPlayerData, BB.CONSTS.NO_NOTIFICATION);
  171. };
  172. $(Elements.GOOGLE_CALENDAR_MODE).on("change", self.m_relativeFixedModeHandler);
  173. };
  174. /**
  175. Get current token from msdb
  176. @method _getToken
  177. @return {string} token
  178. **/
  179. BlockGoogleCalendar.prototype._getToken = function () {
  180. var self = this;
  181. var domPlayerData = self._getBlockPlayerData();
  182. var item = $(domPlayerData).find('Json').find('Data');
  183. return $(item).attr('token');
  184. };
  185. /**
  186. Listen days offset change as in days before and days after respectively
  187. @method _listenDaysOffsetChange
  188. **/
  189. BlockGoogleCalendar.prototype._listenDaysOffsetChange = function () {
  190. var self = this;
  191. $('.spinner', Elements.DAYS_BEFORE_TODAY_INPUT).spinner({ value: 4, min: 1, max: 9999, step: 1 });
  192. $('.spinner', Elements.DAYS_AFTER_TODAY_INPUT).spinner({ value: 4, min: 1, max: 9999, step: 1 });
  193. $(Elements.DAYS_BEFORE_TODAY_INPUT).prop('disabled', true).css({ backgroundColor: 'transparent' });
  194. $(Elements.DAYS_AFTER_TODAY_INPUT).prop('disabled', true).css({ backgroundColor: 'transparent' });
  195. self.m_daysHandler = _.debounce(function (e) {
  196. if (!self.m_selected)
  197. return;
  198. if ($(e.target).prop("tagName") == 'INPUT')
  199. return;
  200. var value = $(e.target).closest('.spinner').spinner('value');
  201. var name = $(e.target).closest('.spinner').attr('name');
  202. var domPlayerData = self._getBlockPlayerData();
  203. var xSnippet = $(domPlayerData).find('Json').find('Data');
  204. $(xSnippet).attr(name, value);
  205. self._setBlockPlayerData(domPlayerData, BB.CONSTS.NO_NOTIFICATION);
  206. }, 250, false);
  207. $('.spinner', Elements.CALENDAR_OFFSET_MODE).on('mouseup', self.m_daysHandler);
  208. };
  209. /**
  210. Populate the UI of the days after
  211. @method _populateDaysAfter
  212. @param {Number} i_interval
  213. **/
  214. BlockGoogleCalendar.prototype._populateDaysAfter = function (i_value) {
  215. var self = this;
  216. $('.spinner', Elements.CALENDAR_OFFSET_MODE).filter(function (v, el) {
  217. return $(el).attr('name') == 'after';
  218. }).spinner('value', Number(i_value));
  219. };
  220. /**
  221. Populate the UI of the days before
  222. @method _populateDaysBefore
  223. @param {Number} i_interval
  224. **/
  225. BlockGoogleCalendar.prototype._populateDaysBefore = function (i_value) {
  226. var self = this;
  227. $('.spinner', Elements.CALENDAR_OFFSET_MODE).filter(function (v, el) {
  228. return $(el).attr('name') == 'before';
  229. }).spinner('value', Number(i_value));
  230. };
  231. /**
  232. Get current fileID from msdb
  233. @method _getFileId
  234. @return {string} id
  235. **/
  236. BlockGoogleCalendar.prototype._getFileId = function () {
  237. var self = this;
  238. var domPlayerData = self._getBlockPlayerData();
  239. var item = $(domPlayerData).find('Json').find('Data');
  240. return $(item).attr('id');
  241. };
  242. /**
  243. Load list of latest data from server
  244. @method _listenRefreshSheetList
  245. @param {Number} i_playerData
  246. @return {Number} Unique clientId.
  247. **/
  248. BlockGoogleCalendar.prototype._listenRefreshSheetList = function () {
  249. var self = this;
  250. self.m_RefreshHandler = function (e) {
  251. if (!self.m_selected)
  252. return;
  253. var token = self._getToken();
  254. if (token.length < self.m_minTokenLength) {
  255. bootbox.alert($(Elements.MSG_BOOTBOX_TOKEN_TOO_SHORT).text());
  256. return;
  257. }
  258. self._loadSheetList();
  259. };
  260. $(Elements.GOOGLE_CALENDAR_REFRESH).on('click', self.m_RefreshHandler);
  261. };
  262. /**
  263. Listen dropdown selected / changed
  264. @method _listenCalChanged
  265. **/
  266. BlockGoogleCalendar.prototype._listenCalChanged = function () {
  267. var self = this;
  268. self.m_inputChangedHandler = function (e) {
  269. if (!self.m_selected)
  270. return;
  271. var value = $(Elements.GOOGLE_CALENDAR + ' option:selected').val();
  272. var domPlayerData = self._getBlockPlayerData();
  273. var item = $(domPlayerData).find('Json').find('Data');
  274. $(item).attr('id', value);
  275. self._setBlockPlayerData(domPlayerData, BB.CONSTS.NO_NOTIFICATION);
  276. };
  277. $(Elements.GOOGLE_CALENDAR).on('change', self.m_inputChangedHandler);
  278. };
  279. /**
  280. Listen token updated
  281. @method _listenTokenChanged
  282. **/
  283. BlockGoogleCalendar.prototype._listenTokenChanged = function () {
  284. var self = this;
  285. self.m_tokenChangedHandler = function (e) {
  286. if (!self.m_selected)
  287. return;
  288. var value = $(Elements.GOOGLE_CALENDAR_TOKEN).val();
  289. var domPlayerData = self._getBlockPlayerData();
  290. var item = $(domPlayerData).find('Json').find('Data');
  291. $(item).attr('token', value);
  292. self._setBlockPlayerData(domPlayerData, BB.CONSTS.NO_NOTIFICATION);
  293. self._loadSheetList();
  294. };
  295. $(Elements.GOOGLE_CALENDAR_TOKEN).on('change', self.m_tokenChangedHandler);
  296. };
  297. /**
  298. Clear the list of docs
  299. @method _clearList
  300. **/
  301. BlockGoogleCalendar.prototype._clearList = function () {
  302. var self = this;
  303. $(Elements.GOOGLE_CALENDAR).empty();
  304. $(Elements.GOOGLE_CALENDAR).selectpicker('refresh');
  305. };
  306. /**
  307. Load latest docs from Google services
  308. @method _loadSheetList
  309. **/
  310. BlockGoogleCalendar.prototype._loadSheetList = function () {
  311. var self = this;
  312. self._clearList();
  313. var token = self._getToken();
  314. if (token.length < self.m_minTokenLength)
  315. return;
  316. try {
  317. $.ajax({
  318. url: "https://secure.digitalsignage.com/GoogleCalendarList/" + token + "/100",
  319. dataType: "json",
  320. type: "post",
  321. complete: function (response, status) {
  322. if (!self.m_selected)
  323. return;
  324. self._clearList();
  325. if (_.isUndefined(response.responseText) || response.responseText.length == 0)
  326. return;
  327. var jData = JSON.parse(response.responseText);
  328. var snippet = "<option value=\"\">Nothing selected</option>";
  329. _.forEach(jData, function (k) {
  330. snippet += "<option value=\"" + k.id + "\">" + k.summary + "</option>";
  331. });
  332. $(Elements.GOOGLE_CALENDAR).append(snippet);
  333. var id = self._getFileId();
  334. if (id.length > self.m_minTokenLength)
  335. $(Elements.GOOGLE_CALENDAR).val(id);
  336. $(Elements.GOOGLE_CALENDAR).selectpicker('refresh');
  337. },
  338. error: function (jqXHR, exception) {
  339. BB.lib.log(jqXHR, exception);
  340. }
  341. });
  342. }
  343. catch (e) {
  344. BB.lib.log('error on ajax' + e);
  345. }
  346. };
  347. /**
  348. Init the settings panel that's used by Block common props for JSON based components
  349. @method _initSettingsPanel
  350. **/
  351. BlockGoogleCalendar.prototype._initSettingsPanel = function () {
  352. var self = this;
  353. self.m_blockProperty.initSettingsPanel(Elements.BLOCK_COMMON_SETTINGS_GOOGLE_CALENDAR);
  354. };
  355. /**
  356. Load block specific properties
  357. @override
  358. @method _loadBlockSpecificProps
  359. **/
  360. BlockGoogleCalendar.prototype._loadBlockSpecificProps = function () {
  361. var self = this;
  362. self.m_blockProperty.viewSettingsPanel(Elements.BLOCK_COMMON_SETTINGS_GOOGLE_CALENDAR);
  363. _super.prototype._loadBlockSpecificProps.call(this);
  364. };
  365. /**
  366. Populate UI
  367. @method _populate
  368. **/
  369. BlockGoogleCalendar.prototype._populate = function () {
  370. var self = this;
  371. _super.prototype._populate.call(this);
  372. var domPlayerData = self._getBlockPlayerData();
  373. var $data = $(domPlayerData).find('Json').find('Data');
  374. var style = $data.attr('id');
  375. var token = $data.attr('token');
  376. $(Elements.GOOGLE_CALENDAR).selectpicker('val', style);
  377. $(Elements.GOOGLE_CALENDAR_TOKEN).val(token);
  378. self._loadSheetList();
  379. self._populateMode();
  380. self._populateStartEndDates();
  381. };
  382. /**
  383. Delete this block
  384. @method deleteBlock
  385. @params {Boolean} i_memoryOnly if true only remove from existance but not from msdb
  386. **/
  387. BlockGoogleCalendar.prototype.deleteBlock = function (i_memoryOnly) {
  388. var self = this;
  389. $(Elements.GOOGLE_CALENDAR).off('change', self.m_inputChangedHandler);
  390. $(Elements.GOOGLE_CALENDAR_TOKEN).off('change', self.m_tokenChangedHandler);
  391. $(Elements.GOOGLE_CALENDAR_REFRESH).off('click', self.m_RefreshHandler);
  392. $(Elements.GOOGLE_CALENDAR_MODE).off("change", self.m_relativeFixedModeHandler);
  393. $(Elements.GOOGLE_CALENDAR_START).off('hide.timepicker', self.m_schedChangeStartTimeHandler);
  394. $(Elements.GOOGLE_CALENDAR_END).off('hide.timepicker', self.m_schedChangeEndTimeHandler);
  395. $('.spinner', Elements.CALENDAR_OFFSET_MODE).off('mouseup', self.m_daysHandler);
  396. _super.prototype.deleteBlock.call(this, i_memoryOnly);
  397. };
  398. return BlockGoogleCalendar;
  399. })(TSLiteModules.BlockJsonBase);
  400. return BlockGoogleCalendar;
  401. });
  402. //# sourceMappingURL=BlockGoogleCalendar.js.map