From fc2e407ad07b4bbdeef44441583ce488cdc54162 Mon Sep 17 00:00:00 2001 From: naomiaro Date: Thu, 30 Dec 2010 13:32:59 -0500 Subject: [PATCH] still old context menus for schedule, wondering why they aren't popping up. --- application/controllers/LibraryController.php | 25 ++- .../controllers/PlaylistController.php | 43 +++- application/controllers/SearchController.php | 2 + .../scripts/library/contextMenuPartial.phtml | 1 + public/css/jquery.contextMenu.css | 62 +++++ public/js/campcaster/library/library.js | 78 ++++--- public/js/campcaster/library/spl.js | 11 +- public/js/contextmenu/jjmenu.js | 3 +- public/js/contextmenu/jquery.contextMenu.js | 211 ++++++++++++++++++ 9 files changed, 387 insertions(+), 49 deletions(-) create mode 100644 application/views/scripts/library/contextMenuPartial.phtml create mode 100644 public/css/jquery.contextMenu.css create mode 100644 public/js/contextmenu/jquery.contextMenu.js diff --git a/application/controllers/LibraryController.php b/application/controllers/LibraryController.php index 1d8755f1e..452999acf 100644 --- a/application/controllers/LibraryController.php +++ b/application/controllers/LibraryController.php @@ -29,7 +29,6 @@ class LibraryController extends Zend_Controller_Action { $this->view->headScript()->appendFile('/js/campcaster/onready/library.js','text/javascript'); $this->view->headScript()->appendFile('/js/contextmenu/jjmenu.js','text/javascript'); - $this->view->headScript()->appendFile('/js/campcaster/library/context-menu.js','text/javascript'); $this->view->headLink()->appendStylesheet('/css/contextmenu.css'); $this->_helper->layout->setLayout('library'); @@ -46,22 +45,33 @@ class LibraryController extends Zend_Controller_Action $id = $this->_getParam('id'); $type = $this->_getParam('type'); - $callback = 'window["contextMenu"]'; $params = '/format/json/id/#id#/type/#type#'; $pl_sess = $this->pl_sess; if($type === "au") { - $menu[] = array('action' => '/Library/delete'.$params, 'title' => 'Delete'); + $menu[] = array('action' => array('type' => 'ajax', 'url' => '/Library/delete'.$params, 'callback' => 'window["deleteAudioClip"]'), + 'title' => 'Delete'); - if(isset($pl_sess->id)) - $menu[] = array('action' => '/Playlist/add-item'.$params, 'title' => 'Add To Playlist'); + if(isset($pl_sess->id)) { + $menu[] = array('action' => array('type' => 'ajax', 'url' => '/Playlist/add-item'.$params, 'callback' => 'window["setSPLContent"]'), + 'title' => 'Add to Playlist'); + } } else if($type === "pl") { - $menu[] = array('action' => array('type' => 'ajax', 'url' => '/Playlist/delete'.$params, 'callback' => $callback), 'title' => 'Delete'); + $menu[] = array('action' => array('type' => 'ajax', 'url' => '/Playlist/delete'.$params, 'callback' => 'window["deletePlaylist"]'), + 'title' => 'Delete'); + + if(!isset($pl_sess->id) || $pl_sess->id !== $id) { + $menu[] = array('action' => + array('type' => 'ajax', + 'url' => '/Playlist/edit/view/spl'.$params, + 'callback' => 'window["openDiffSPL"]'), + 'title' => 'Edit'); + } } @@ -93,7 +103,8 @@ class LibraryController extends Zend_Controller_Action return; } } - + + $this->view->id = $id; } public function contentsAction() diff --git a/application/controllers/PlaylistController.php b/application/controllers/PlaylistController.php index 2fca21295..e0d7136cd 100644 --- a/application/controllers/PlaylistController.php +++ b/application/controllers/PlaylistController.php @@ -19,6 +19,7 @@ class PlaylistController extends Zend_Controller_Action ->addActionContext('set-cue', 'json') ->addActionContext('move-item', 'json') ->addActionContext('close', 'json') + ->addActionContext('edit', 'json') ->addActionContext('delete-active', 'json') ->addActionContext('delete', 'json') ->initContext(); @@ -44,6 +45,28 @@ class PlaylistController extends Zend_Controller_Action $this->_helper->redirector('index'); } + private function changePlaylist($pl_id){ + + $pl_sess = $this->pl_sess; + + if(isset($pl_sess->id)) { + + $pl = Playlist::Recall($pl_sess->id); + if($pl !== FALSE) { + $this->closePlaylist($pl); + } + } + + $userInfo = Zend_Auth::getInstance()->getStorage()->read(); + + $pl = Playlist::Recall($pl_id); + if($pl === FALSE) { + return FALSE; + } + $pl->lock($userInfo->id); + $pl_sess->id = $pl_id; + } + private function closePlaylist($pl) { $userInfo = Zend_Auth::getInstance()->getStorage()->read(); @@ -68,10 +91,9 @@ class PlaylistController extends Zend_Controller_Action $pl = new Playlist(); $pl_id = $pl->create("Test Zend Auth"); $pl->setPLMetaData('dc:creator', $userInfo->login); - $pl->lock($userInfo->id); //set this playlist as active id. - $pl_sess->id = $pl_id; + $this->changePlaylist($pl_id); $this->_helper->redirector('metadata'); } @@ -102,12 +124,22 @@ class PlaylistController extends Zend_Controller_Action public function editAction() { - $this->view->headScript()->appendFile('/js/campcaster/playlist/playlist.js','text/javascript'); + $this->view->headScript()->appendFile('/js/campcaster/playlist/playlist.js','text/javascript'); + $pl_id = $this->_getParam('id', null); + $display = $this->_getParam('view', null); + if(!is_null($pl_id)) { + $this->changePlaylist($pl_id); + } + $pl = $this->getPlaylist(); $this->view->pl = $pl; - $this->view->playlistcontents = $pl->getContents(); + + if($display === 'spl') { + $this->view->html = $this->view->render('sideplaylist/index.phtml'); + unset($this->view->pl); + } } public function addItemAction() @@ -138,6 +170,7 @@ class PlaylistController extends Zend_Controller_Action { $oldPos = $this->_getParam('oldPos'); $newPos = $this->_getParam('newPos'); + $display = $this->_getParam('view'); $pl = $this->getPlaylist(); @@ -229,6 +262,8 @@ class PlaylistController extends Zend_Controller_Action unset($pl_sess->id); } } + + $this->view->id = $id; } public function deleteActiveAction() diff --git a/application/controllers/SearchController.php b/application/controllers/SearchController.php index 79ae0ea62..a96248964 100644 --- a/application/controllers/SearchController.php +++ b/application/controllers/SearchController.php @@ -27,6 +27,8 @@ class SearchController extends Zend_Controller_Action $this->_helper->layout->setLayout('search'); $this->view->headScript()->appendFile('/js/campcaster/onready/search.js','text/javascript'); + $this->view->headScript()->appendFile('/js/contextmenu/jjmenu.js','text/javascript'); + $this->view->headLink()->appendStylesheet('/css/contextmenu.css'); $this->_helper->actionStack('display', 'search'); $this->_helper->actionStack('contents', 'library'); diff --git a/application/views/scripts/library/contextMenuPartial.phtml b/application/views/scripts/library/contextMenuPartial.phtml new file mode 100644 index 000000000..31b484496 --- /dev/null +++ b/application/views/scripts/library/contextMenuPartial.phtml @@ -0,0 +1 @@ +
  • text ?>
  • diff --git a/public/css/jquery.contextMenu.css b/public/css/jquery.contextMenu.css new file mode 100644 index 000000000..5b2dd9069 --- /dev/null +++ b/public/css/jquery.contextMenu.css @@ -0,0 +1,62 @@ +/* Generic context menu styles */ +.contextMenu { + position: absolute; + width: 120px; + z-index: 99999; + border: solid 1px #CCC; + background: #EEE; + padding: 0px; + margin: 0px; + display: none; +} + +.contextMenu LI { + list-style: none; + padding: 0px; + margin: 0px; +} + +.contextMenu A { + color: #333; + text-decoration: none; + display: block; + line-height: 20px; + height: 20px; + background-position: 6px center; + background-repeat: no-repeat; + outline: none; + padding: 1px 5px; + padding-left: 28px; +} + +.contextMenu LI.hover A { + color: #FFF; + background-color: #3399FF; +} + +.contextMenu LI.disabled A { + color: #AAA; + cursor: default; +} + +.contextMenu LI.hover.disabled A { + background-color: transparent; +} + +.contextMenu LI.separator { + border-top: solid 1px #CCC; +} + +/* + Adding Icons + + You can add icons to the context menu by adding + classes to the respective LI element(s) +*/ + +.contextMenu LI.edit A { background-image: url(images/page_white_edit.png); } +.contextMenu LI.cut A { background-image: url(images/cut.png); } +.contextMenu LI.copy A { background-image: url(images/page_white_copy.png); } +.contextMenu LI.paste A { background-image: url(images/page_white_paste.png); } +.contextMenu LI.delete A { background-image: url(images/page_white_delete.png); } +.contextMenu LI.quit A { background-image: url(images/door.png); } diff --git a/public/js/campcaster/library/library.js b/public/js/campcaster/library/library.js index 773a29641..258278022 100644 --- a/public/js/campcaster/library/library.js +++ b/public/js/campcaster/library/library.js @@ -12,23 +12,51 @@ function getType() { return tr_id[0]; } +function deleteItem(type, id) { + var tr_id; + + tr_id = type+"_"+id; + + $("#library_display tr#" +tr_id).remove(); +} + +function deleteAudioClip(json) { + if(json.message) { + alert(json.message); + return; + } + + deleteItem("au", json.id); +} + +function deletePlaylist(json) { + if(json.message) { + alert(json.message); + return; + } + + deleteItem("pl", json.id); +} + +function addLibraryItemEvents() { + $('#library_display tr[id ^= "au"]') + .draggable({ + helper: 'clone' + }); + + $('#library_display tr:not(:first-child)') + .jjmenu("rightClick", + [{get:"/Library/context-menu/format/json/id/#id#/type/#type#"}], + {id: getId, type: getType}, + {xposition: "mouse", yposition: "mouse"}); + +} + function setLibraryContents(data){ $("#library_display tr:not(:first-child)").remove(); $("#library_display").append(data); - /* - $('#library_display tr[id ^= "au"]') - .contextMenu({menu: 'audioMenu'}, contextMenu) - .draggable({ - helper: 'clone' - }); - - $('#library_display tr[id ^= "pl"]') - .contextMenu({menu: 'plMenu'}, contextMenu) - .draggable({ - helper: 'clone' - }); - */ + addLibraryItemEvents() } function setUpLibrary() { @@ -55,27 +83,5 @@ function setUpLibrary() { $.post(url, {ob: ob, order: order}, setLibraryContents); }); - /* - $('#library_display tr[id ^= "au"]') - .contextMenu({menu: 'audioMenu'}, contextMenu) - .draggable({ - helper: 'clone' - }); - - $('#library_display tr[id ^= "pl"]') - .contextMenu({menu: 'plMenu'}, contextMenu) - - */ - - $('#library_display tr:not(:first-child)') - .draggable({ - helper: 'clone' - }); - - $('#library_display tr:not(:first-child)') - .jjmenu("rightClick", - [{get:"/Library/context-menu/format/json/id/#id#/type/#type#"}], - {id: getId, type: getType}, - {xposition: "mouse", yposition: "mouse"}); - + addLibraryItemEvents() } diff --git a/public/js/campcaster/library/spl.js b/public/js/campcaster/library/spl.js index f57da75db..e307afc63 100644 --- a/public/js/campcaster/library/spl.js +++ b/public/js/campcaster/library/spl.js @@ -28,7 +28,7 @@ function addSPLItem(event, ui){ if(tr.get(0).tagName === 'LI') return; - id = tr.attr('id'); + id = tr.attr('id').split("_").pop(); url = '/Playlist/add-item/format/json'; url = url + '/id/'+id; @@ -90,6 +90,15 @@ function deleteSPL() { $.post(url, noOpenPL); } +function openDiffSPL(json) { + + $("#side_playlist") + .empty() + .append(json.html); + + setUpSPL(); +} + function setUpSPL() { $("#spl_sortable").sortable(); diff --git a/public/js/contextmenu/jjmenu.js b/public/js/contextmenu/jjmenu.js index 41dd33534..48f75ea4b 100644 --- a/public/js/contextmenu/jjmenu.js +++ b/public/js/contextmenu/jjmenu.js @@ -285,6 +285,8 @@ /* do action on menu item */ function doAction(act) { + $("#jjmenu_main").hide(); + if (act) { switch (act.type) { @@ -302,7 +304,6 @@ case "ajax": $.getJSON(uReplace(act.url), function(data) { - var cb = eval(act.callback); if (typeof(cb) == "function") { diff --git a/public/js/contextmenu/jquery.contextMenu.js b/public/js/contextmenu/jquery.contextMenu.js new file mode 100644 index 000000000..c884d8ced --- /dev/null +++ b/public/js/contextmenu/jquery.contextMenu.js @@ -0,0 +1,211 @@ +// jQuery Context Menu Plugin +// +// Version 1.01 +// +// Cory S.N. LaViska +// A Beautiful Site (http://abeautifulsite.net/) +// +// More info: http://abeautifulsite.net/2008/09/jquery-context-menu-plugin/ +// +// Terms of Use +// +// This plugin is dual-licensed under the GNU General Public License +// and the MIT License and is copyright A Beautiful Site, LLC. +// +if(jQuery)( function() { + $.extend($.fn, { + + contextMenu: function(o, callback) { + // Defaults + if( o.menu == undefined ) return false; + if( o.inSpeed == undefined ) o.inSpeed = 150; + if( o.outSpeed == undefined ) o.outSpeed = 75; + // 0 needs to be -1 for expected results (no fade) + if( o.inSpeed == 0 ) o.inSpeed = -1; + if( o.outSpeed == 0 ) o.outSpeed = -1; + // Loop each context menu + $(this).each( function() { + var el = $(this); + var offset = $(el).offset(); + // Add contextMenu class + $('#' + o.menu).addClass('contextMenu'); + // Simulate a true right click + $(this).mousedown( function(e) { + var evt = e; + evt.stopPropagation(); + $(this).mouseup( function(e) { + e.stopPropagation(); + var srcElement = $(this); + $(this).unbind('mouseup'); + if( evt.button == 1 ) { + // Hide context menus that may be showing + $(".contextMenu").hide(); + // Get this context menu + var menu = $('#' + o.menu); + + if( $(el).hasClass('disabled') ) return false; + + // Detect mouse position + var d = {}, x, y; + if( self.innerHeight ) { + d.pageYOffset = self.pageYOffset; + d.pageXOffset = self.pageXOffset; + d.innerHeight = self.innerHeight; + d.innerWidth = self.innerWidth; + } else if( document.documentElement && + document.documentElement.clientHeight ) { + d.pageYOffset = document.documentElement.scrollTop; + d.pageXOffset = document.documentElement.scrollLeft; + d.innerHeight = document.documentElement.clientHeight; + d.innerWidth = document.documentElement.clientWidth; + } else if( document.body ) { + d.pageYOffset = document.body.scrollTop; + d.pageXOffset = document.body.scrollLeft; + d.innerHeight = document.body.clientHeight; + d.innerWidth = document.body.clientWidth; + } + (e.pageX) ? x = e.pageX : x = e.clientX + d.scrollLeft; + (e.pageY) ? y = e.pageY : y = e.clientY + d.scrollTop; + + // Show the menu + $(document).unbind('click'); + $(menu).css({ top: y, left: x }).fadeIn(o.inSpeed); + // Hover events + $(menu).find('A').mouseover( function() { + $(menu).find('LI.hover').removeClass('hover'); + $(this).parent().addClass('hover'); + }).mouseout( function() { + $(menu).find('LI.hover').removeClass('hover'); + }); + + // Keyboard + $(document).keypress( function(e) { + switch( e.keyCode ) { + case 38: // up + if( $(menu).find('LI.hover').size() == 0 ) { + $(menu).find('LI:last').addClass('hover'); + } else { + $(menu).find('LI.hover').removeClass('hover').prevAll('LI:not(.disabled)').eq(0).addClass('hover'); + if( $(menu).find('LI.hover').size() == 0 ) $(menu).find('LI:last').addClass('hover'); + } + break; + case 40: // down + if( $(menu).find('LI.hover').size() == 0 ) { + $(menu).find('LI:first').addClass('hover'); + } else { + $(menu).find('LI.hover').removeClass('hover').nextAll('LI:not(.disabled)').eq(0).addClass('hover'); + if( $(menu).find('LI.hover').size() == 0 ) $(menu).find('LI:first').addClass('hover'); + } + break; + case 13: // enter + $(menu).find('LI.hover A').trigger('click'); + break; + case 27: // esc + $(document).trigger('click'); + break + } + }); + + // When items are selected + $('#' + o.menu).find('A').unbind('click'); + $('#' + o.menu).find('LI:not(.disabled) A').click( function() { + $(document).unbind('click').unbind('keypress'); + $(".contextMenu").hide(); + // Callback + if( callback ) callback( $(this).attr('href').substr(1), $(srcElement), {x: x - offset.left, y: y - offset.top, docX: x, docY: y} ); + return false; + }); + + // Hide bindings + setTimeout( function() { // Delay for Mozilla + $(document).click( function() { + $(document).unbind('click').unbind('keypress'); + $(menu).fadeOut(o.outSpeed); + return false; + }); + }, 0); + } + }); + }); + + // Disable text selection + if( $.browser.mozilla ) { + $('#' + o.menu).each( function() { $(this).css({ 'MozUserSelect' : 'none' }); }); + } else if( $.browser.msie ) { + $('#' + o.menu).each( function() { $(this).bind('selectstart.disableTextSelect', function() { return false; }); }); + } else { + $('#' + o.menu).each(function() { $(this).bind('mousedown.disableTextSelect', function() { return false; }); }); + } + // Disable browser context menu (requires both selectors to work in IE/Safari + FF/Chrome) + $(el).add($('UL.contextMenu')).bind('contextmenu', function() { return false; }); + + }); + return $(this); + }, + + // Disable context menu items on the fly + disableContextMenuItems: function(o) { + if( o == undefined ) { + // Disable all + $(this).find('LI').addClass('disabled'); + return( $(this) ); + } + $(this).each( function() { + if( o != undefined ) { + var d = o.split(','); + for( var i = 0; i < d.length; i++ ) { + $(this).find('A[href="' + d[i] + '"]').parent().addClass('disabled'); + + } + } + }); + return( $(this) ); + }, + + // Enable context menu items on the fly + enableContextMenuItems: function(o) { + if( o == undefined ) { + // Enable all + $(this).find('LI.disabled').removeClass('disabled'); + return( $(this) ); + } + $(this).each( function() { + if( o != undefined ) { + var d = o.split(','); + for( var i = 0; i < d.length; i++ ) { + $(this).find('A[href="' + d[i] + '"]').parent().removeClass('disabled'); + + } + } + }); + return( $(this) ); + }, + + // Disable context menu(s) + disableContextMenu: function() { + $(this).each( function() { + $(this).addClass('disabled'); + }); + return( $(this) ); + }, + + // Enable context menu(s) + enableContextMenu: function() { + $(this).each( function() { + $(this).removeClass('disabled'); + }); + return( $(this) ); + }, + + // Destroy context menu(s) + destroyContextMenu: function() { + // Destroy specified context menus + $(this).each( function() { + // Disable action + $(this).unbind('mousedown').unbind('mouseup'); + }); + return( $(this) ); + } + + }); +})(jQuery);