APIs

Show:
  1. /**
  2. * BlockCollection block resides inside a scene or timeline and manages internal playback of scenes and resoucres
  3. * @class BlockCollection
  4. * @extends Block
  5. * @constructor
  6. * @param {string} i_placement location where objects resides which can be scene or timeline
  7. * @param {string} i_campaign_timeline_chanel_player_id required and set as block id when block is inserted onto timeline_channel
  8. * @return {Object} Block instance
  9. */
  10. define(['jquery', 'backbone', 'Block', 'bootstrap-table-editable', 'bootstrap-table-sort-rows'], function ($, Backbone, Block, bootstraptableeditable, bootstraptablesortrows) {
  11.  
  12. var BlockCollection = Block.extend({
  13.  
  14. /**
  15. Constructor
  16. @method initialize
  17. **/
  18. constructor: function (options) {
  19. var self = this;
  20. self.m_blockType = 4100;
  21. _.extend(options, {blockType: self.m_blockType});
  22. Block.prototype.constructor.call(this, options);
  23.  
  24. self.m_collectionTable = $(Elements.COLLECTION_TABLE);
  25. self.m_collectionEventTable = $(Elements.COLLECTION_EVENTS_TABLE);
  26. self.m_selectRowIndex = -1;
  27. self._initSubPanel(Elements.BLOCK_COLLECTION_COMMON_PROPERTIES);
  28. self._listenCollectionRowDragged();
  29. self._listenCollectionRowDropped();
  30. self._listenAddResource();
  31. self._listenAddEvent();
  32. self._listenRemoveEvent();
  33. self._listenRemoveResource();
  34. self._listenModeChange();
  35. self._listenCollectionRowChanged();
  36. self._listenCollectionRowEventChanged();
  37.  
  38.  
  39. self.m_blockProperty.collectionDatatableInit();
  40.  
  41. /* can set global mode if we wish */
  42. //$.fn.editable.defaults.mode = 'inline';
  43.  
  44. self.m_actions = {
  45. firstPage: 'beginning',
  46. nextPage: 'next',
  47. prevPage: 'previous',
  48. lastPage: 'last',
  49. selectPage: 'selected'
  50. }
  51. },
  52.  
  53. /**
  54. Listen to changes in volume control
  55. @method _listenVolumeChange
  56. **/
  57. _listenCollectionRowDragged: function () {
  58. var self = this;
  59. self.m_collectionRowDraggedHandler = function (e) {
  60. if (!self.m_selected)
  61. return;
  62. self.m_selectRowIndex = e.edata;
  63. };
  64. BB.comBroker.listen(BB.EVENTS.COLLECTION_ROW_DRAG, self.m_collectionRowDraggedHandler);
  65. },
  66.  
  67. /**
  68. Listen to when collection row was edited
  69. @method _listenCollectionRowChanged
  70. **/
  71. _listenCollectionRowChanged: function () {
  72. var self = this;
  73. self.m_collectionRowChangedHandler = function (e) {
  74. if (!self.m_selected)
  75. return;
  76. var domPlayerData = self._getBlockPlayerData();
  77. var rowIndex = e.edata.rowIndex;
  78. var newName = e.edata.name;
  79. var newDuration = parseInt(e.edata.duration);
  80. if (_.isNaN(newDuration)) {
  81. bootbox.alert($(Elements.MSG_BOOTBOX_ENTRY_IS_INVALID).text());
  82. self._populateTableCollection(domPlayerData);
  83. return;
  84. }
  85. var item = $(domPlayerData).find('Collection').children().get(rowIndex);
  86. $(item).attr('page', newName).attr('duration', newDuration);
  87. self._setBlockPlayerData(domPlayerData, BB.CONSTS.NO_NOTIFICATION);
  88. self._populateTableCollection(domPlayerData);
  89. self._populateTableEvents();
  90. };
  91. BB.comBroker.listen(BB.EVENTS.COLLECTION_ROW_CHANGED, self.m_collectionRowChangedHandler);
  92. },
  93.  
  94. /**
  95. Listen to when collection row was edited
  96. @method _listenCollectionRowEventChanged
  97. **/
  98. _listenCollectionRowEventChanged: function () {
  99. var self = this;
  100. self.m_collectionRowEventChangedHandler = function (e) {
  101. if (!self.m_selected)
  102. return;
  103. var domPlayerData = self._getBlockPlayerData();
  104. var rowIndex = e.edata.rowIndex;
  105. var event = e.edata.event;
  106. var action = e.edata.action;
  107. var item = $(domPlayerData).find('EventCommands').children().get(rowIndex);
  108. $(item).attr('from', event);
  109. self._setBlockPlayerData(domPlayerData, BB.CONSTS.NO_NOTIFICATION);
  110. self._populateTableCollection(domPlayerData);
  111. };
  112. BB.comBroker.listen(BB.EVENTS.COLLECTION_EVENT_ROW_CHANGED, self.m_collectionRowEventChangedHandler);
  113. },
  114.  
  115. /**
  116. Listen in Event Action dropdown selections
  117. @method _listenDropdownEvenActionSelection
  118. **/
  119. _listenDropdownEvenActionSelection: function () {
  120. var self = this;
  121. if (self.m_onDropDownEventActionHandler)
  122. $(Elements.CLASS_COLLECTION_EVENT_ACTION).off('change', self.m_onDropDownEventActionHandler);
  123. self.m_onDropDownEventActionHandler = function (e) {
  124. if (!self.m_selected)
  125. return;
  126. var selected = $("option:selected", this).val();
  127. var actions = _.invert(self.m_actions);
  128. var action = actions[selected];
  129. var index = $(this).closest('[data-index]').attr('data-index');
  130. var domPlayerData = self._getBlockPlayerData();
  131. var target = $(domPlayerData).find('EventCommands').children().get(parseInt(index));
  132. $(target).attr('command',action);
  133. self._setBlockPlayerData(domPlayerData, BB.CONSTS.NO_NOTIFICATION);
  134. self._populateTableEvents();
  135. };
  136. $(Elements.CLASS_COLLECTION_EVENT_ACTION).on('change', self.m_onDropDownEventActionHandler);
  137. },
  138.  
  139. /**
  140. Listen in Event Action go to dropdown selections
  141. @method _listenDropdownEvenActionGoToSelection
  142. **/
  143. _listenDropdownEvenActionGoToSelection: function () {
  144. var self = this;
  145. if (self.m_onDropDownEventActionGoToHandler)
  146. $(Elements.CLASS_COLLECTION_EVENT_ACTION_GOTO).off('change', self.m_onDropDownEventActionGoToHandler);
  147. self.m_onDropDownEventActionGoToHandler = function (e) {
  148. if (!self.m_selected)
  149. return;
  150. var selected = $("option:selected", this).val();
  151. var index = $(this).closest('[data-index]').attr('data-index');
  152. var domPlayerData = self._getBlockPlayerData();
  153. var target = $(domPlayerData).find('EventCommands').children().get(parseInt(index));
  154. $(target).find('Params').remove();
  155. $(target).append('<Params><Page name="' + selected + '"/></Params>');
  156. self._setBlockPlayerData(pepper.xmlToStringIEfix(domPlayerData), BB.CONSTS.NO_NOTIFICATION, true);
  157. self._populateTableEvents();
  158. };
  159. $(Elements.CLASS_COLLECTION_EVENT_ACTION_GOTO).on('change', self.m_onDropDownEventActionGoToHandler);
  160. },
  161.  
  162.  
  163. /**
  164. Listen to changes in volume control
  165. @method _listenVolumeChange
  166. **/
  167. _listenCollectionRowDropped: function () {
  168. var self = this;
  169. self.m_collectionRowDroppedHandler = function (e) {
  170. if (!self.m_selected)
  171. return;
  172. var droppedRowIndex = e.edata;
  173. var domPlayerData = self._getBlockPlayerData();
  174. var target = $(domPlayerData).find('Collection').children().get(parseInt(droppedRowIndex));
  175. var source = $(domPlayerData).find('Collection').children().get(self.m_selectRowIndex);
  176. droppedRowIndex > self.m_selectRowIndex ? $(target).after(source) : $(target).before(source);
  177. self._setBlockPlayerData(domPlayerData, BB.CONSTS.NO_NOTIFICATION);
  178. self._populateTableCollection(domPlayerData);
  179. };
  180. BB.comBroker.listen(BB.EVENTS.COLLECTION_ROW_DROP, self.m_collectionRowDroppedHandler);
  181. },
  182.  
  183. /**
  184. Load up property values in the common panel
  185. @method _populate
  186. @return none
  187. **/
  188. _populate: function () {
  189. var self = this;
  190. self._setCollectionBlockGlobalValidationOwner(self);
  191. var domPlayerData = self._getBlockPlayerData();
  192. var xSnippetCollection = $(domPlayerData).find('Collection');
  193. var mode = $(xSnippetCollection).attr('mode');
  194. self._populateTableCollection(domPlayerData);
  195.  
  196. if (mode == "kiosk") {
  197. self._populateModeSliderUI(true);
  198. self._populateTableEvents();
  199. } else {
  200. self._populateModeSliderUI(false);
  201. }
  202. },
  203.  
  204. /**
  205. Load event list to the UI
  206. @method _populateTableCollection
  207. @param {Object} i_domPlayerData
  208. **/
  209. _populateTableCollection: function (i_domPlayerData) {
  210. var self = this;
  211. self.m_collectionTable.bootstrapTable('removeAll');
  212. var data = [], rowIndex = 0;
  213. $(i_domPlayerData).find('Collection').children().each(function (k, page) {
  214. var resource_hResource, scene_hDataSrc;
  215. var type = $(page).attr('type');
  216. if (type == 'resource') {
  217. resource_hResource = $(page).find('Resource').attr('hResource');
  218. } else {
  219. scene_hDataSrc = $(page).find('Player').attr('hDataSrc');
  220. }
  221. log('populating ' + resource_hResource);
  222. data.push({
  223. rowIndex: rowIndex,
  224. checkbox: true,
  225. name: $(page).attr('page'),
  226. duration: $(page).attr('duration'),
  227. type: type,
  228. resource_hResource: resource_hResource,
  229. scene_hDataSrc: scene_hDataSrc
  230. });
  231. rowIndex++;
  232. });
  233. self.m_collectionTable.bootstrapTable('load', data);
  234. },
  235.  
  236. /**
  237. Load event list to block props UI
  238. @method _populateTableEvents
  239. **/
  240. _populateTableEvents: function () {
  241. var self = this;
  242. var data = [], rowIndex = 0;
  243. var domPlayerData = self._getBlockPlayerData();
  244. self.m_collectionEventTable.bootstrapTable('removeAll');
  245. $(domPlayerData).find('EventCommands').children().each(function (k, eventCommand) {
  246. var pageName = '';
  247. if ($(eventCommand).attr('command') == 'selectPage')
  248. pageName = $(eventCommand).find('Page').attr('name');
  249. data.push({
  250. rowIndex: rowIndex,
  251. checkbox: true,
  252. event: $(eventCommand).attr('from'),
  253. pageName: pageName,
  254. action: self.m_actions[$(eventCommand).attr('command')]
  255. });
  256. rowIndex++;
  257. });
  258. self.m_collectionEventTable.bootstrapTable('load', data);
  259. self._listenDropdownEvenActionSelection();
  260. self._listenDropdownEvenActionGoToSelection();
  261.  
  262. // disable drag cursor due to bug in bootstrap-table lib (can't disable dragging, yach...)
  263. setTimeout(function () {
  264. $('tr', Elements.KIOSK_EVENTS_CONTAINER).css({
  265. cursor: 'pointer'
  266. });
  267. }, 500);
  268. },
  269.  
  270. /**
  271. Listen to mode change between Kiosk and Slideshow modes
  272. @method _listenModeChange
  273. **/
  274. _listenModeChange: function () {
  275. var self = this;
  276. self.sliderInput = function () {
  277. if (!self.m_selected)
  278. return;
  279. var mode = $(Elements.COLLECTION_KIOSK_MODE).prop('checked');
  280. self._populateModeSliderUI(mode);
  281. var domPlayerData = self._getBlockPlayerData();
  282. $(domPlayerData).find('Collection').attr('mode', mode ? 'kiosk' : 'slideshow');
  283. self._setBlockPlayerData(domPlayerData, BB.CONSTS.NO_NOTIFICATION);
  284. self._populateTableEvents();
  285. };
  286. $(Elements.COLLECTION_KIOSK_MODE).on('change', self.sliderInput);
  287. },
  288.  
  289. /**
  290. Render the checkbox slider according to current Kiosk mode for block
  291. @method _populateModeSliderUI
  292. @param {Boolean} i_status
  293. **/
  294. _populateModeSliderUI: function (i_status) {
  295. var self = this;
  296. if (i_status) {
  297. $(Elements.COLLECTION_KIOSK_MODE).prop('checked', true);
  298. $(Elements.KIOSK_EVENTS_CONTAINER).show();
  299. $(Elements.COLLECTION_SLIDESHOW_DURATION_CONTAINER).hide();
  300. } else {
  301. $(Elements.COLLECTION_KIOSK_MODE).prop('checked', false);
  302. $(Elements.KIOSK_EVENTS_CONTAINER).hide();
  303. $(Elements.COLLECTION_SLIDESHOW_DURATION_CONTAINER).show();
  304. }
  305. },
  306.  
  307. /**
  308. Listen to when AddBlockListView announced that a new resource or scene needs to be added
  309. and if this collection block is selected, go ahead and create one in Bootstrap-table and msdb
  310. @method _listenAddResource
  311. **/
  312. _listenAddResource: function () {
  313. var self = this;
  314. self.m_addNewCollectionListItem = function () {
  315. BB.comBroker.stopListenWithNamespace(BB.EVENTS.ADD_NEW_BLOCK_LIST, self);
  316. if (!self.m_selected)
  317. return;
  318. var addBlockView;
  319. if (self.m_placement == BB.CONSTS.PLACEMENT_CHANNEL) {
  320. addBlockView = BB.comBroker.getService(BB.SERVICES.ADD_BLOCK_VIEW);
  321. } else if (self.m_placement = BB.CONSTS.PLACEMENT_SCENE) {
  322. addBlockView = BB.comBroker.getService(BB.SERVICES.ADD_SCENE_BLOCK_VIEW);
  323. }
  324. addBlockView.setPlacement(BB.CONSTS.PLACEMENT_LISTS);
  325. addBlockView.selectView();
  326.  
  327. BB.comBroker.listenWithNamespace(BB.EVENTS.ADD_NEW_BLOCK_LIST, self, function (e) {
  328. if (!self.m_selected)
  329. return;
  330. e.stopImmediatePropagation();
  331. e.preventDefault();
  332. self._addCollectionNewListItem(e);
  333. BB.comBroker.fire(BB.EVENTS.BLOCK_SELECTED, this, null, self.m_block_id);
  334. });
  335. };
  336. $(Elements.ADD_RESOURCE_TO_COLLECTION).on('click', self.m_addNewCollectionListItem);
  337. },
  338.  
  339. /**
  340. Listen to when user wants to add new events (i.e. when in Kiosk mode)
  341. @method _listenAddEvent
  342. **/
  343. _listenAddEvent: function () {
  344. var self = this;
  345. self.m_addNewCollectionEvent = function () {
  346. if (!self.m_selected)
  347. return;
  348. var domPlayerData = self._getBlockPlayerData();
  349. var buff = '<EventCommand from="event" condition="" command="firstPage" />';
  350. $(domPlayerData).find('EventCommands').append($(buff));
  351. self._setBlockPlayerData(pepper.xmlToStringIEfix(domPlayerData), BB.CONSTS.NO_NOTIFICATION, true);
  352. self._populateTableEvents();
  353. };
  354. $(Elements.ADD_COLLECTION_EVENTS).on('click', self.m_addNewCollectionEvent);
  355. },
  356.  
  357. /**
  358. Listen to when removing a resource from collection list
  359. The algorithm will uses our bootstrap-table own inject rowIndex value
  360. and counts up to match with the order of <Pages/> in msdb collection, once matched against same value
  361. we delete the proper ordered collection item from msdb and refresh the entire table
  362. @method _listenRemoveResource
  363. **/
  364. _listenRemoveEvent: function () {
  365. var self = this;
  366. self.m_removeCollectionEvent = function () {
  367. if (!self.m_selected)
  368. return;
  369. if (self.m_collectionEventTable.bootstrapTable('getSelections').length == 0) {
  370. bootbox.alert($(Elements.MSG_BOOTBOX_NO_ITEM_SELECTED).text());
  371. return;
  372. }
  373. var rowIndex = $('input[name=btSelectItem]:checked', Elements.COLLECTION_EVENTS_TABLE).closest('tr').attr('data-index');
  374. var domPlayerData = self._getBlockPlayerData();
  375. $(domPlayerData).find('EventCommands').children().eq(rowIndex).remove();
  376. self._setBlockPlayerData(domPlayerData, BB.CONSTS.NO_NOTIFICATION);
  377. self._populateTableEvents();
  378. };
  379. $(Elements.REMOVE_COLLECTION_EVENTS).on('click', self.m_removeCollectionEvent);
  380. },
  381.  
  382. /**
  383. Listen to when removing a resource from collection list
  384. The algorithm will uses our bootstrap-table own inject rowIndex value
  385. and counts up to match with the order of <Pages/> in msdb collection, once matched against same value
  386. we delete the proper ordered collection item from msdb and refresh the entire table
  387. @method _listenRemoveResource
  388. **/
  389. _listenRemoveResource: function () {
  390. var self = this;
  391. self.m_removeCollectionListItem = function () {
  392. if (!self.m_selected)
  393. return;
  394. if (self.m_collectionTable.bootstrapTable('getSelections').length == 0) {
  395. bootbox.alert($(Elements.MSG_BOOTBOX_NO_ITEM_SELECTED).text());
  396. return;
  397. }
  398. var rowIndex = $('input[name=btSelectItem]:checked', Elements.COLLECTION_TABLE).closest('tr').attr('data-index');
  399. var domPlayerData = self._getBlockPlayerData();
  400. $(domPlayerData).find('Collection').children().eq(rowIndex).remove();
  401. self._setBlockPlayerData(domPlayerData, BB.CONSTS.NO_NOTIFICATION);
  402. self._populateTableCollection(domPlayerData);
  403. self._populateTableEvents();
  404. };
  405. $(Elements.REMOVE_RESOURCE_FOR_COLLECTION).on('click', self.m_removeCollectionListItem);
  406. },
  407.  
  408. /**
  409. Add a new collection item which can include a Scene or a resource (not a component)
  410. @method _addCollectionNewListItem
  411. @param {Event} e
  412. **/
  413. _addCollectionNewListItem: function (e) {
  414. var self = this;
  415. var domPlayerData = self._getBlockPlayerData();
  416. var xSnippetCollection = $(domPlayerData).find('Collection');
  417. var buff = '';
  418. // log(e.edata.blockCode, e.edata.resourceID, e.edata.sceneID);
  419. if (e.edata.blockCode == BB.CONSTS.BLOCKCODE_SCENE) {
  420. // add scene to collection
  421. // if block resides in scene don't allow cyclic reference to collection scene inside current scene
  422. if (self.m_placement == BB.CONSTS.PLACEMENT_SCENE) {
  423. var sceneEditView = BB.comBroker.getService(BB.SERVICES['SCENE_EDIT_VIEW']);
  424. if (!_.isUndefined(sceneEditView)) {
  425. var selectedSceneID = sceneEditView.getSelectedSceneID();
  426. selectedSceneID = pepper.getSceneIdFromPseudoId(selectedSceneID);
  427. if (selectedSceneID == e.edata.sceneID) {
  428. bootbox.alert($(Elements.MSG_BOOTBOX_SCENE_REFER_ITSELF).text());
  429. return;
  430. }
  431. }
  432. }
  433. var sceneRecord = pepper.getScenePlayerRecord(e.edata.sceneID);
  434. var sceneName = $(sceneRecord.player_data_value).attr('label');
  435. var nativeID = sceneRecord['native_id'];
  436. buff = '<Page page="' + sceneName + '" type="scene" duration="5">' +
  437. '<Player src="' + nativeID + '" hDataSrc="' + e.edata.sceneID + '" />' +
  438. '</page>';
  439. } else {
  440. // Add resources to collection
  441. var resourceName = pepper.getResourceRecord(e.edata.resourceID).resource_name;
  442. log('updating hResource ' + e.edata.resourceID);
  443. buff = '<Page page="' + resourceName + '" type="resource" duration="5">' +
  444. '<Player player="' + e.edata.blockCode + '">' +
  445. '<Data>' +
  446. '<Resource hResource="' + e.edata.resourceID + '" />' +
  447. '</Data>' +
  448. '</Player>' +
  449. '</page>';
  450. }
  451. $(xSnippetCollection).append($(buff));
  452. self._setBlockPlayerData(pepper.xmlToStringIEfix(domPlayerData), BB.CONSTS.NO_NOTIFICATION, true);
  453. self._populateTableEvents();
  454. },
  455.  
  456. /**
  457. Populate the common block properties panel, called from base class if exists
  458. @method _loadBlockSpecificProps
  459. @return none
  460. **/
  461. _loadBlockSpecificProps: function () {
  462. var self = this;
  463. self._populate();
  464. this._viewSubPanel(Elements.BLOCK_COLLECTION_COMMON_PROPERTIES);
  465. },
  466.  
  467. /**
  468. re-take ownership for a caller block instance and register global Validators for bootstrap-table to format data
  469. This function has to run everytime we populate the UI since it is a shared global function
  470. and we have to override it so 'this' refers to correct BlockCollection instance
  471. @method _setCollectionBlockGlobalValidationOwner
  472. **/
  473. _setCollectionBlockGlobalValidationOwner: function (i_this) {
  474. // add draggable icons
  475. BB.lib.collectionDragIcons = function () {
  476. return '<div class="dragIconTable"><i class="fa fa-arrows-v"></i></div>';
  477. };
  478.  
  479. // register a global shared function to validate checkbox state
  480. BB.lib.collectionChecks = function (value, row, index) {
  481. return {
  482. checked: false,
  483. disabled: false
  484. }
  485. };
  486.  
  487. // build selection dropdown for even "action", if row.action == name, set it as selected in dropdown
  488. BB.lib.collectionEventAction = function (value, row, index) {
  489. var buffer = '<select class="' + BB.lib.unclass(Elements.CLASS_COLLECTION_EVENT_ACTION) + ' btn">';
  490. _.forEach(i_this.m_actions, function (name, value) {
  491. if (row.action == name) {
  492. buffer += '<option selected>' + name + '</option>';
  493. } else {
  494. buffer += '<option>' + name + '</option>';
  495. }
  496. });
  497. return buffer + '</select>';
  498. };
  499.  
  500. // build selection dropdown for event "to item" and if row.action is selected un-hide the dropdown in "to item" events and select the proper <option>
  501. BB.lib.collectionEventActionGoToItem = function (value, row, index) {
  502. var buffer = '';
  503. var collectionPageNames = i_this._getCollectionPageNames();
  504. var visibilityClass = row.action == 'selected' ? '' : 'hidden';
  505. buffer = '<select class="' + visibilityClass + ' ' + BB.lib.unclass(Elements.CLASS_COLLECTION_EVENT_ACTION_GOTO) + ' btn">';
  506. collectionPageNames.forEach(function (k, v) {
  507. var selected = row.pageName == k ? 'selected' : '';
  508. buffer += '<option ' + selected + '>' + k + '</option>';
  509. });
  510. return buffer;
  511. };
  512. },
  513.  
  514. /**
  515. Get all the collection pages names for current collection block
  516. this is called against the last block instance that registered the global function of
  517. setCollectionBlockGlobalValidationOwner
  518. @method _getCollectionPageNames
  519. **/
  520. _getCollectionPageNames: function () {
  521. var self = this;
  522. var data = [];
  523. var domPlayerData = self._getBlockPlayerData();
  524. $(domPlayerData).find('Collection').children().each(function (k, page) {
  525. data.push($(page).attr('page'));
  526. });
  527. return data;
  528. },
  529.  
  530. /**
  531. Delete this block
  532. @method deleteBlock
  533. @params {Boolean} i_memoryOnly if true only remove from existance but not from msdb
  534. **/
  535. deleteBlock: function (i_memoryOnly) {
  536. var self = this;
  537. $(Elements.ADD_RESOURCE_TO_COLLECTION).off('click', self.m_addNewCollectionListItem);
  538. $(Elements.ADD_COLLECTION_EVENTS).off('click', self.m_addNewCollectionEvent);
  539. $(Elements.COLLECTION_KIOSK_MODE).off('change', self.sliderInput);
  540. $(Elements.REMOVE_COLLECTION_EVENTS).off('click', self.m_removeCollectionEvent);
  541. $(Elements.CLASS_COLLECTION_EVENT_ACTION).off('change', self.m_onDropDownEventActionHandler);
  542. $(Elements.CLASS_COLLECTION_EVENT_ACTION_GOTO).off('change', self.m_onDropDownEventActionGoToHandler);
  543. $(Elements.REMOVE_RESOURCE_FOR_COLLECTION).off('click', self.m_removeCollectionListItem);
  544. BB.comBroker.stopListen(BB.EVENTS.ADD_NEW_BLOCK_LIST); // removing for everyone which is ok, since gets added in real time
  545. BB.comBroker.stopListen(BB.EVENTS.COLLECTION_ROW_DROP, self.m_collectionRowDroppedHandler);
  546. BB.comBroker.stopListen(BB.EVENTS.COLLECTION_ROW_DRAG, self.m_collectionRowDraggedHandler);
  547. BB.comBroker.stopListen(BB.EVENTS.COLLECTION_ROW_CHANGED, self.m_collectionRowChangedHandler);
  548. BB.comBroker.stopListen(BB.EVENTS.COLLECTION_EVENT_ROW_CHANGED, self.m_collectionRowEventChangedHandler);
  549. self._deleteBlock(i_memoryOnly);
  550. }
  551. });
  552. return BlockCollection;
  553. }
  554. );
  555.