APIs

Show:
  1. /**
  2. Campaign selector, class extends Backbone > View and used to select a campaign or create a new one
  3. @class CampaignSelectorView
  4. @constructor
  5. @return {Object} instantiated CampaignSelectorView
  6. **/
  7. define(['jquery', 'backbone', 'simplestorage', 'ResourcesListView'], function ($, Backbone, simplestorage, ResourcesListView) {
  8.  
  9. BB.CONSTS.SEQUENCER_MODE = '0';
  10. BB.CONSTS.SCHEDULER_MODE = '1';
  11. /**
  12. Custom event fired when we need to refresh the campaign list
  13. @event LOAD_CAMPAIGN_LIST
  14. @param {This} caller
  15. @param {Self} context caller
  16. @param {Event} rss link
  17. @static
  18. @final
  19. **/
  20. BB.EVENTS.LOAD_CAMPAIGN_LIST = 'LOAD_CAMPAIGN_LIST';
  21.  
  22. /**
  23. Custom event fired when a going back to campaign is selected
  24. @event CAMPAIGN_SELECTED
  25. @param {This} caller
  26. @param {Self} context caller
  27. @param {Event}
  28. @static
  29. @final
  30. **/
  31. BB.EVENTS.CAMPAIGN_SELECTED = 'CAMPAIGN_SELECTED';
  32.  
  33. BB.SERVICES.CAMPAIGN_SELECTOR = 'CampaignSelector';
  34.  
  35. var CampaignSelectorView = BB.View.extend({
  36.  
  37. /**
  38. Constructor
  39. @method initialize
  40. **/
  41. initialize: function () {
  42. var self = this;
  43. self.m_selectedCampaignID = -1;
  44. self.m_disabled = true;
  45. self.m_campainProperties = new BB.View({
  46. el: Elements.CAMPAIGN_PROPERTIES
  47. });
  48. self.m_propertiesPanel = BB.comBroker.getService(BB.SERVICES.PROPERTIES_VIEW);
  49. self.m_propertiesPanel.addView(this.m_campainProperties);
  50. self.MIN_WIDTH_WIZARD = 1200;
  51. self.MIN_HIGHT_WIZARD = 700;
  52. self._loadCampaignList();
  53. self._listenAddRemoveCampaign();
  54. self._listenCampaignModeSelect();
  55. self._listenWizardStart();
  56. self._checkFirstTimeUser();
  57. },
  58.  
  59. /**
  60. Enable this component, i.e.: allow clicking of campaign list selection and set
  61. the storage firstwizard so it no longer auto pops up
  62. @method _enableComponent
  63. **/
  64. _enableComponent: function () {
  65. var self = this;
  66. simplestorage.set('firstwizard', 2);
  67. $(Elements.CAMPAIGN_SELECTOR).animate({opacity: 1});
  68. $('button', self.$el).attr('disabled', false);
  69. self.m_disabled = false;
  70. },
  71.  
  72. /**
  73. Listen to kick off of wizard button
  74. @method _listenWizardStart
  75. **/
  76. _listenWizardStart: function () {
  77. var self = this;
  78. $(Elements.GET_WIZARD_HELP).on('click', function () {
  79. $(Elements.GET_WIZARD_HELP).fadeOut('slow');
  80. var w = BB.comBroker.getService(BB.SERVICES.LAYOUT_ROUTER).getAppWidth();
  81. var h = BB.comBroker.getService(BB.SERVICES.LAYOUT_ROUTER).getAppHeight();
  82. if (w < self.MIN_WIDTH_WIZARD || h < self.MIN_HIGHT_WIZARD) {
  83. bootbox.alert($(Elements.MSG_BOOTBOX_BROWSER_TOO_SMALL).text());
  84. return;
  85. }
  86. $(Elements.LIVE_TUTORIAL).trigger('click');
  87. });
  88. },
  89.  
  90. /**
  91. For first time users launch wizard
  92. @method _checkFirstTimeUser
  93. **/
  94. _checkFirstTimeUser: function () {
  95. var self = this;
  96.  
  97. // disable wizard
  98. //self._enableComponent();
  99. //return;
  100.  
  101. var firstwizard = simplestorage.get('firstwizard');
  102. firstwizard = _.isUndefined(firstwizard) ? 1 : firstwizard;
  103. if (firstwizard > 1) {
  104. self._enableComponent();
  105. } else {
  106. self._autoStartWizard();
  107. }
  108. },
  109.  
  110. /**
  111. Auto kick start the Wizard, but only if app WxH is sufficient
  112. @method _autoStartWizard
  113. **/
  114. _autoStartWizard: function () {
  115. var self = this;
  116. var w = BB.comBroker.getService(BB.SERVICES.LAYOUT_ROUTER).getAppWidth();
  117. var h = BB.comBroker.getService(BB.SERVICES.LAYOUT_ROUTER).getAppHeight();
  118. if (w < self.MIN_WIDTH_WIZARD || h < self.MIN_HIGHT_WIZARD) {
  119. self._enableComponent();
  120. return;
  121. }
  122. $(Elements.GET_WIZARD_HELP).fadeOut('slow');
  123. setTimeout(function () {
  124. BB.comBroker.fire(BB.EVENTS.CAMPAIGN_LIST_LOADING, this, this);
  125. }, 1000);
  126. setTimeout(function () {
  127. self._enableComponent();
  128. }, 3000);
  129. },
  130.  
  131. /**
  132. Listen to changes in campaign playback mode
  133. @method _listenCampaignModeSelect
  134. **/
  135. _listenCampaignModeSelect: function () {
  136. var self = this;
  137. $(Elements.CLASS_CAMPAIGN_PLAY_MODE).on('click', function (e) {
  138. if ($(e.target).is('span'))
  139. e.target = $(e.target).closest('button');
  140.  
  141. switch ($(e.target).attr('name')) {
  142. case 'campaignModeSequencer':
  143. {
  144. self._populateCampaignMode(0);
  145. pepper.setCampaignRecord(self.m_selectedCampaignID, 'campaign_playlist_mode', '0');
  146. break;
  147. }
  148. case 'campaignModeScheduler':
  149. {
  150. self._populateCampaignMode(1);
  151. pepper.setCampaignRecord(self.m_selectedCampaignID, 'campaign_playlist_mode', '1');
  152. pepper.checkAndCreateCampaignTimelineScheduler(self.m_selectedCampaignID);
  153. break;
  154. }
  155. }
  156. });
  157. },
  158.  
  159. /**
  160. Load the campaign's play mode (scheduler /sequencer)
  161. @method _populateCampaignMode();
  162. **/
  163. _populateCampaignMode: function (i_mode) {
  164. var self = this;
  165. var mode = String(i_mode);
  166. switch (mode) {
  167. case BB.CONSTS.SEQUENCER_MODE:
  168. {
  169. $(Elements.CAMPAIGN_MODE_SCHEDULER).fadeTo('fast', 0.4);
  170. $(Elements.CAMPAIGN_MODE_SEQUENCER).fadeTo('fast', 1);
  171. $(Elements.CAMPAIGN_MODE_HEADER).text($(Elements.CAMPAIGN_MODE_HEADER_SEQ).text());
  172. $(Elements.CAMPAIGN_MODE_DESCRIPTION).text($(Elements.CAMPAIGN_MODE_SEQ).text());
  173. break;
  174. }
  175. case BB.CONSTS.SCHEDULER_MODE:
  176. {
  177. $(Elements.CAMPAIGN_MODE_SCHEDULER).fadeTo('fast', 1);
  178. $(Elements.CAMPAIGN_MODE_SEQUENCER).fadeTo('fast', 0.4);
  179. $(Elements.CAMPAIGN_MODE_HEADER).text($(Elements.CAMPAIGN_MODE_HEADER_SCHED).text());
  180. $(Elements.CAMPAIGN_MODE_DESCRIPTION).text($(Elements.CAMPAIGN_MODE_SCHED).text());
  181. break;
  182. }
  183. }
  184. },
  185.  
  186. /**
  187. Wire the UI including new campaign creation and delete existing campaign
  188. @method _listenAddRemoveCampaign
  189. **/
  190. _listenAddRemoveCampaign: function () {
  191. var self = this;
  192.  
  193. $(Elements.NEW_CAMPAIGN).on('click', function (e) {
  194. if (self.m_disabled)
  195. return;
  196. self.m_selectedCampaignID = -1;
  197. BB.comBroker.fire(BB.EVENTS.CAMPAIGN_SELECTED, this, this, self.m_selectedCampaignID);
  198. self.options.stackView.slideToPage(self.options.to, 'right');
  199. return false;
  200. });
  201.  
  202. $(Elements.REMOVE_CAMPAIGN).on('click', function (e) {
  203. if (self.m_disabled)
  204. return;
  205. if (self.m_selectedCampaignID != -1) {
  206. var selectedElement = self.$el.find('[data-campaignid="' + self.m_selectedCampaignID + '"]');
  207. var allCampaignIDs = pepper.getStationCampaignIDs();
  208. if (_.indexOf(allCampaignIDs, self.m_selectedCampaignID) == -1) {
  209. bootbox.confirm($(Elements.MSG_BOOTBOX_SURE_DELETE_CAMPAIGN).text(), function (result) {
  210. if (result == true) {
  211. selectedElement.remove();
  212. self._removeCampaignFromMSDB(self.m_selectedCampaignID);
  213. }
  214. });
  215. } else {
  216. bootbox.alert($(Elements.MSG_BOOTBOX_CANT_DELETE_COMP).text());
  217. return false;
  218. }
  219. } else {
  220. bootbox.alert($(Elements.MSG_BOOTBOX_SELECT_COMP_FIRST).text());
  221. return false;
  222. }
  223. });
  224. },
  225.  
  226. /**
  227. Listen for when to refresh the campaign list (new campaign was created)
  228. @method _listenLoadCampaignList
  229. @return none
  230. **/
  231. _listenLoadCampaignList: function () {
  232. var self = this;
  233. BB.comBroker.listen(BB.EVENTS.LOAD_CAMPAIGN_LIST, function (e) {
  234. self._loadCampaignList();
  235. });
  236. },
  237.  
  238. /**
  239. Populate the LI with all available campaigns from msdb
  240. @method _loadCampaignList
  241. @return none
  242. **/
  243. _loadCampaignList: function () {
  244. var self = this;
  245. self.m_selected_resource_id = undefined;
  246. $(Elements.CAMPAIGN_SELECTOR_LIST).empty();
  247. var campaignIDs = pepper.getCampaignIDs();
  248. for (var i = 0; i < campaignIDs.length; i++) {
  249. var campaignID = campaignIDs[i];
  250. var recCampaign = pepper.getCampaignRecord(campaignID);
  251. var playListMode = recCampaign['campaign_playlist_mode'] == 0 ? 'sequencer' : 'scheduler';
  252.  
  253. var snippet = '<a href="#" class="' + BB.lib.unclass(Elements.CLASS_CAMPIGN_LIST_ITEM) + ' list-group-item" data-campaignid="' + campaignID + '">' +
  254. '<h4>' + recCampaign['campaign_name'] + '</h4>' +
  255. '<p class="list-group-item-text">play list mode:' + playListMode + '</p>' +
  256. '<div class="openProps">' +
  257. '<button type="button" class="' + BB.lib.unclass(Elements.CLASS_OPEN_PROPS_BUTTON) + ' btn btn-default btn-sm"><i style="font-size: 1.5em" class="fa fa-gear"></i></button>' +
  258. '</div>' +
  259. '</a>';
  260. $(Elements.CAMPAIGN_SELECTOR_LIST).append($(snippet));
  261. }
  262.  
  263. this._listenOpenProps();
  264. this._listenSelectCampaign();
  265. this._listenInputChange();
  266. this._listenLoadCampaignList();
  267. },
  268.  
  269. /**
  270. Listen select campaign
  271. @method _listenSelectCampaign
  272. @return none
  273. **/
  274. _listenSelectCampaign: function () {
  275. var self = this;
  276. $(Elements.CLASS_CAMPIGN_LIST_ITEM, self.el).on('click', function (e) {
  277. if (self.m_disabled)
  278. return;
  279. $(Elements.CLASS_CAMPIGN_LIST_ITEM, self.el).removeClass('active');
  280. $(this).addClass('active');
  281. self.m_selectedCampaignID = $(this).data('campaignid');
  282. BB.comBroker.fire(BB.EVENTS.CAMPAIGN_SELECTED, this, this, self.m_selectedCampaignID);
  283. self.options.stackView.slideToPage(Elements.CAMPAIGN, 'right');
  284. return false;
  285. });
  286. },
  287.  
  288. /**
  289. Listen for user trigger on campaign selection and populate the properties panel
  290. @method _listenOpenProps
  291. @return none
  292. **/
  293. _listenOpenProps: function () {
  294. var self = this;
  295. $(Elements.CLASS_OPEN_PROPS_BUTTON, self.el).on('click', function (e) {
  296. if (self.m_disabled)
  297. return;
  298. $(Elements.CLASS_CAMPIGN_LIST_ITEM, self.el).removeClass('active');
  299. var elem = $(e.target).closest('a').addClass('active');
  300. self.m_selectedCampaignID = $(elem).data('campaignid');
  301. var recCampaign = pepper.getCampaignRecord(self.m_selectedCampaignID);
  302. self._populateCampaignMode(recCampaign.campaign_playlist_mode);
  303. $(Elements.FORM_CAMPAIGN_NAME).val(recCampaign['campaign_name']);
  304. self.m_propertiesPanel.selectView(self.m_campainProperties);
  305. self.m_propertiesPanel.openPropertiesPanel();
  306. return false;
  307. });
  308. },
  309.  
  310. /**
  311. Remove an entire campaign including its timelines, channels, blocks, template, board etc
  312. @method removeCampaign
  313. @return none
  314. **/
  315. _removeCampaignFromMSDB: function (i_campaign_id) {
  316. var self = this;
  317.  
  318. var timelineIDs = pepper.getCampaignTimelines(i_campaign_id);
  319.  
  320. for (var i = 0; i < timelineIDs.length; i++) {
  321. var timelineID = timelineIDs[i];
  322. var boardTemplateID = pepper.getGlobalTemplateIdOfTimeline(timelineID);
  323. pepper.removeTimelineFromCampaign(timelineID);
  324. var campaignTimelineBoardTemplateID = pepper.removeBoardTemplateFromTimeline(timelineID);
  325. pepper.removeTimelineBoardViewerChannels(campaignTimelineBoardTemplateID);
  326. pepper.removeBoardTemplate(boardTemplateID);
  327. pepper.removeBoardTemplateViewers(boardTemplateID);
  328. pepper.removeTimelineFromSequences(timelineID);
  329. pepper.removeSchedulerFromTime(timelineID);
  330.  
  331. var channelsIDs = pepper.getChannelsOfTimeline(timelineID);
  332. for (var n = 0; n < channelsIDs.length; n++) {
  333. var channelID = channelsIDs[n];
  334. pepper.removeChannelFromTimeline(channelID);
  335.  
  336. var blockIDs = pepper.getChannelBlocks(channelID);
  337. for (var x = 0; x < blockIDs.length; x++) {
  338. var blockID = blockIDs[x];
  339. pepper.removeBlockFromTimelineChannel(blockID);
  340. }
  341. }
  342. }
  343. pepper.removeCampaign(i_campaign_id);
  344. pepper.removeCampaignBoard(i_campaign_id);
  345.  
  346. // check to see if any other campaigns are left, do some clean house and remove all campaign > boards
  347. var campaignIDs = pepper.getCampaignIDs();
  348. if (campaignIDs.length == 0)
  349. pepper.removeAllBoards();
  350. self.m_selectedCampaignID = -1;
  351. self.m_propertiesPanel.selectView(Elements.DASHBOARD_PROPERTIES);
  352. },
  353.  
  354. /**
  355. Wire changing of campaign name through campaign properties
  356. @method _listenInputChange
  357. @return none
  358. **/
  359. _listenInputChange: function () {
  360. var self = this;
  361. var onChange = _.debounce(function (e) {
  362. if (self.m_selectedCampaignID == -1)
  363. return;
  364. var text = $(e.target).val();
  365. if (BB.lib.isEmpty(text))
  366. return;
  367. text = BB.lib.cleanProbCharacters(text, 1);
  368. pepper.setCampaignRecord(self.m_selectedCampaignID, 'campaign_name', text);
  369. self.$el.find('[data-campaignid="' + self.m_selectedCampaignID + '"]').find('h4').text(text);
  370. }, 333, false);
  371. $(Elements.FORM_CAMPAIGN_NAME).on("input", onChange);
  372. },
  373.  
  374. /**
  375. Get selected campaign id
  376. @method getSelectedCampaign
  377. @return {Number} campaign_id
  378. **/
  379. getSelectedCampaign: function () {
  380. return this.m_selectedCampaignID;
  381. },
  382.  
  383. /**
  384. Set selected campaign id
  385. @method setSelectedCampaign
  386. **/
  387. setSelectedCampaign: function (i_campaign_id) {
  388. var self = this;
  389. self.m_selectedCampaignID = i_campaign_id;
  390. self._loadCampaignList();
  391. }
  392. });
  393.  
  394. return CampaignSelectorView;
  395.  
  396. });
  397.  
  398.