diff --git a/airtime_mvc/application/controllers/LibraryController.php b/airtime_mvc/application/controllers/LibraryController.php index b7e15bd95..3ab1cbe8b 100644 --- a/airtime_mvc/application/controllers/LibraryController.php +++ b/airtime_mvc/application/controllers/LibraryController.php @@ -31,9 +31,9 @@ class LibraryController extends Zend_Controller_Action $this->view->headScript()->appendFile($baseUrl.'/js/airtime/library/library.js','text/javascript'); $this->view->headScript()->appendFile($baseUrl.'/js/airtime/library/advancedsearch.js','text/javascript'); - $this->view->headLink()->appendStylesheet($baseUrl.'/css/media_library.css'); + $this->view->headLink()->appendStylesheet($baseUrl.'/css/media_library.css'); $this->view->headLink()->appendStylesheet($baseUrl.'/css/contextmenu.css'); - + $this->_helper->layout->setLayout('library'); $this->_helper->viewRenderer->setResponseSegment('library'); @@ -44,14 +44,14 @@ class LibraryController extends Zend_Controller_Action $this->search_sess->next_row[1] = 2; $this->view->form = $form; $this->view->md = $this->search_sess->md; - + $this->_helper->actionStack('index', 'playlist'); } public function contextMenuAction() { global $CC_CONFIG; - + $id = $this->_getParam('id'); $type = $this->_getParam('type'); @@ -63,54 +63,50 @@ class LibraryController extends Zend_Controller_Action $pl_sess = $this->pl_sess; if($type === "au") { - + if(isset($pl_sess->id)) { - $menu[] = array('action' => array('type' => 'ajax', 'url' => '/Playlist/add-item'.$params, 'callback' => 'window["setSPLContent"]'), + $menu[] = array('action' => array('type' => 'ajax', 'url' => '/Playlist/add-item'.$params, 'callback' => 'window["setSPLContent"]'), 'title' => 'Add to Playlist'); } - $menu[] = array('action' => array('type' => 'gourl', 'url' => '/Library/edit-file-md/id/#id#'), + $menu[] = array('action' => array('type' => 'gourl', 'url' => '/Library/edit-file-md/id/#id#'), 'title' => 'Edit Metadata'); // added for downlaod $id = $this->_getParam('id'); - + $file_id = $this->_getParam('id', null); $file = StoredFile::Recall($file_id); - + $url = $file->getFileURL().'/api_key/'.$CC_CONFIG["apiKey"][0].'/download/true'; $menu[] = array('action' => array('type' => 'gourl', 'url' => $url), 'title' => 'Download'); $menu[] = array('action' => array('type' => 'fn', - 'callback' => "window['confirmDeleteAudioClip']('$paramsPop')"), + 'callback' => "window['confirmDeleteAudioClip']('$paramsPop')"), 'title' => 'Delete'); } else if($type === "pl") { if(!isset($pl_sess->id) || $pl_sess->id !== $id) { - $menu[] = array('action' => - array('type' => 'ajax', - 'url' => '/Playlist/edit'.$params, - 'callback' => 'window["openDiffSPL"]'), + $menu[] = array('action' => + array('type' => 'ajax', + 'url' => '/Playlist/edit'.$params, + 'callback' => 'window["openDiffSPL"]'), 'title' => 'Edit'); } else if(isset($pl_sess->id) && $pl_sess->id === $id) { - $menu[] = array('action' => - array('type' => 'ajax', - 'url' => '/Playlist/close'.$params, - 'callback' => 'window["noOpenPL"]'), + $menu[] = array('action' => + array('type' => 'ajax', + 'url' => '/Playlist/close'.$params, + 'callback' => 'window["noOpenPL"]'), 'title' => 'Close'); } - $menu[] = array('action' => array('type' => 'ajax', 'url' => '/Playlist/metadata/format/json/id/#id#', 'callback' => 'window["createPlaylistMetaForm"]'), - 'title' => 'Edit Metadata'); - - //$menu[] = array('action' => array('type' => 'ajax', 'url' => '/Playlist/delete'.$params, 'callback' => 'window["deletePlaylist"]'), - // 'title' => 'Delete'); + //$menu[] = array('action' => array('type' => 'ajax', 'url' => '/Playlist/metadata/format/json/id/#id#', 'callback' => 'window["createPlaylistMetaForm"]'), 'title' => 'Edit Metadata'); $menu[] = array('action' => array('type' => 'fn', - 'callback' => "window['confirmDeletePlaylist']('$paramsPop')"), + 'callback' => "window['confirmDeletePlaylist']('$paramsPop')"), 'title' => 'Delete'); } @@ -122,10 +118,10 @@ class LibraryController extends Zend_Controller_Action public function deleteAction() { $id = $this->_getParam('id'); - + if (!is_null($id)) { $file = StoredFile::Recall($id); - + if (PEAR::isError($file)) { $this->view->message = $file->getMessage(); return; @@ -133,22 +129,22 @@ class LibraryController extends Zend_Controller_Action else if(is_null($file)) { $this->view->message = "file doesn't exist"; return; - } + } $res = $file->delete(); - + if (PEAR::isError($res)) { $this->view->message = $res->getMessage(); return; } } - + $this->view->id = $id; } public function contentsAction() { - $post = $this->getRequest()->getPost(); + $post = $this->getRequest()->getPost(); $datatables = StoredFile::searchFilesForPlaylistBuilder($post); die(json_encode($datatables)); @@ -157,14 +153,14 @@ class LibraryController extends Zend_Controller_Action public function editFileMdAction() { $request = $this->getRequest(); - $form = new Application_Form_EditAudioMD(); + $form = new Application_Form_EditAudioMD(); $file_id = $this->_getParam('id', null); $file = StoredFile::Recall($file_id); - + if ($request->isPost()) { - if ($form->isValid($request->getPost())) { - + if ($form->isValid($request->getPost())) { + $formdata = $form->getValues(); $file->replaceDbMetadata($formdata); @@ -176,7 +172,7 @@ class LibraryController extends Zend_Controller_Action } } - $form->populate($file->md); + $form->populate($file->md); $this->view->form = $form; } @@ -196,7 +192,7 @@ class LibraryController extends Zend_Controller_Action $this->view->md = $file->getAllPLMetaData(); $this->view->contents = $file->getContents(); } - + } diff --git a/airtime_mvc/application/controllers/PlaylistController.php b/airtime_mvc/application/controllers/PlaylistController.php index 89871f14f..a3ece83ab 100644 --- a/airtime_mvc/application/controllers/PlaylistController.php +++ b/airtime_mvc/application/controllers/PlaylistController.php @@ -20,6 +20,8 @@ class PlaylistController extends Zend_Controller_Action ->addActionContext('delete-active', 'json') ->addActionContext('delete', 'json') ->addActionContext('set-playlist-fades', 'json') + ->addActionContext('set-playlist-name', 'json') + ->addActionContext('set-playlist-description', 'json') ->initContext(); $this->pl_sess = new Zend_Session_Namespace(UI_PLAYLIST_SESSNAME); @@ -175,6 +177,7 @@ class PlaylistController extends Zend_Controller_Action $this->view->html = $this->view->render('playlist/update.phtml'); $this->view->name = $pl->getName(); $this->view->length = $pl->getLength(); + $this->view->description = $pl->getDescription(); unset($this->view->pl); return; @@ -195,6 +198,7 @@ class PlaylistController extends Zend_Controller_Action $this->view->html = $this->view->render('playlist/update.phtml'); $this->view->name = $pl->getName(); $this->view->length = $pl->getLength(); + $this->view->description = $pl->getDescription(); unset($this->view->pl); } @@ -220,9 +224,10 @@ class PlaylistController extends Zend_Controller_Action $this->view->html = $this->view->render('playlist/update.phtml'); $this->view->name = $pl->getName(); $this->view->length = $pl->getLength(); + $this->view->description = $pl->getDescription(); unset($this->view->pl); - + return; } @@ -341,6 +346,31 @@ class PlaylistController extends Zend_Controller_Action $this->view->fadeOut = $fades[1]; } + public function setPlaylistNameAction() + { + $name = $this->_getParam('name', 'Unknown Playlist'); + + $pl = $this->getPlaylist(); + $pl->setName($name); + + $this->view->playlistName = $name; + } + + public function setPlaylistDescriptionAction() + { + $description = $this->_getParam('description', false); + $pl = $this->getPlaylist(); + + if($description != false) { + $pl->setDescription($description); + } + else { + $description = $pl->getDescription(); + } + + $this->view->playlistDescription = $description; + } + } diff --git a/airtime_mvc/application/models/Playlist.php b/airtime_mvc/application/models/Playlist.php index ea81a13da..c71958ab4 100644 --- a/airtime_mvc/application/models/Playlist.php +++ b/airtime_mvc/application/models/Playlist.php @@ -201,6 +201,30 @@ class Playlist { return $pl->getDbName(); } + public function setDescription($p_description) + { + $pl = CcPlaylistQuery::create()->findPK($this->id); + + if($pl === NULL) + return FALSE; + + $pl->setDbDescription($p_description); + $pl->setDbMtime(new DateTime("now")); + $pl->save(); + + //$this->name = $p_newname; + return TRUE; + } + + public function getDescription() + { + $pl = CcPlaylistQuery::create()->findPK($this->id); + if ($pl === NULL) + return FALSE; + + return $pl->getDbDescription(); + } + /** * Set state of virtual playlist * diff --git a/airtime_mvc/application/views/scripts/playlist/index.phtml b/airtime_mvc/application/views/scripts/playlist/index.phtml index 194636a8c..7987202c1 100644 --- a/airtime_mvc/application/views/scripts/playlist/index.phtml +++ b/airtime_mvc/application/views/scripts/playlist/index.phtml @@ -1,35 +1,55 @@ pl)) : ?> - - - Playlist crossfade - - + + + Playlist crossfade + + pl)) : ?> -

pl->getName(); ?>

-

pl->getLength(); ?>

+
+

+ pl->getName(); ?> + +

+

pl->getLength(); ?>

+
- +
+ View / edit description +
+
+
+ +
+ +
+ + +
+
+
-
-
- -
+ + +
+
+ +
-
No open playlist
+
No open playlist
diff --git a/airtime_mvc/public/css/images/icon_edit_l.png b/airtime_mvc/public/css/images/icon_edit_l.png new file mode 100644 index 000000000..ac6b8d477 Binary files /dev/null and b/airtime_mvc/public/css/images/icon_edit_l.png differ diff --git a/airtime_mvc/public/css/playlist_builder.css b/airtime_mvc/public/css/playlist_builder.css index 4724055e9..d05a0a0d3 100644 --- a/airtime_mvc/public/css/playlist_builder.css +++ b/airtime_mvc/public/css/playlist_builder.css @@ -121,7 +121,7 @@ font-size:15px; margin:8px 0 10px 0; padding:0; - color:#6e6e6e; + color:#4f4f4f; font-weight:normal; clear:both; float:left; @@ -314,4 +314,124 @@ #spl_sortable li .spl_cue.ui-state-active, #spl_sortable li .spl_cue.ui-state-active:hover { background: transparent url(images/cue_playlist.png) no-repeat 0 -30px; border:none; -} \ No newline at end of file +} + +/*--/////////////// Changes 16.05.2011 ////////////--*/ + +.playlist_title { + margin: 16px 0 10px 0; + height:26px; + clear:both; +} +#side_playlist .playlist_title h3, #side_playlist .playlist_title h4 { + margin: 0; + padding: 0; +} +#side_playlist .playlist_title h3 { + float:left; + width:84%; +} +#side_playlist .playlist_title h4 { + float:right; + clear:none; + font-size: 16px; + padding-top:4px; +} + +#side_playlist .playlist_title h3 a { + padding: 0 22px 0 2px; + background:url(images/icon_edit_l.png) no-repeat right center; + text-decoration:none; + +} +#side_playlist .playlist_title h3 a:hover { + background-color:#D8D8D8; +} +.element_hidden { + display: none; +} +#side_playlist .playlist_title h3 input[type="text"] { + background-color: #dddddd; + border: 1px solid #8F8F8F; + font-family: Arial,Helvetica,sans-serif; + font-size: 12px; + height: 23px; + margin: 0; + padding: 0; + text-indent: 3px; + -moz-box-shadow: inset 0px 2px 2px rgba(0, 0, 0, 0.1); + -webkit-box-shadow: inset 0px 2px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0px 2px 2px rgba(0, 0, 0, 0.1); + width:95%; +} + +#side_playlist .zend_form { + margin: 0; + padding: 0; +} +#side_playlist .zend_form dt, #side_playlist .zend_form dd { + display: block; + float: none; + margin: 4px 0 0; + padding: 0; + width:100%; +} +#side_playlist .zend_form dd.buttons { + margin-top: 8px; + text-align:right; +} +#side_playlist .zend_form dd.buttons .ui-button { + margin: 0 0 0 10px; +} + +#side_playlist .zend_form dt { + color:#5B5B5B; + font-weight: bold; + margin: 9px 0 0; + padding: 0 2px; +} + +#side_playlist .zend_form dt:first-child { + margin-top: 0; +} + +#side_playlist .zend_form dd textarea { + background-color: #dddddd; + border: 1px solid #5B5B5B; + font-family: Arial,Helvetica,sans-serif; + font-size: 12px; + margin: 0; + padding: 2px 0 0 0; + text-indent: 3px; + -moz-box-shadow: inset 0px 2px 2px rgba(0, 0, 0, 0.1); + -webkit-box-shadow: inset 0px 2px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0px 2px 2px rgba(0, 0, 0, 0.1); + width:99.7%; +} + +#side_playlist fieldset { + border: 1px solid #9a9a9a; + margin: 0 0 8px 0; + padding: 8px; +} +#side_playlist fieldset.closed .zend_form{ + display:none; +} +#side_playlist fieldset.closed { + border-width: 1px 0 0; + margin-bottom: -6px; + margin-left:1px; +} +fieldset > legend { + color: #4f4f4f; + font-size: 12px; + line-height: 140%; +} +.ui-widget-content fieldset legend .ui-icon { + float: left; + background-image:url(redmond/images/ui-icons_454545_256x240.png); +} +#side_playlist .zend_form input, #side_playlist .zend_form textarea { + width: auto; +} + \ No newline at end of file diff --git a/airtime_mvc/public/js/airtime/library/spl.js b/airtime_mvc/public/js/airtime/library/spl.js index 44bde2327..10c8fa43b 100644 --- a/airtime_mvc/public/js/airtime/library/spl.js +++ b/airtime_mvc/public/js/airtime/library/spl.js @@ -133,7 +133,7 @@ function changeFadeOut(event) { if(json.response.error) { return; } - + hideError(span); }); } @@ -147,7 +147,7 @@ function submitOnEnter(event) { } function setCueEvents(el) { - + $(el).find(".spl_cue_in span:last").blur(changeCueIn); $(el).find(".spl_cue_out span:last").blur(changeCueOut); @@ -173,7 +173,7 @@ function openFadeEditor(event) { event.stopPropagation(); var pos, url, li; - + li = $(this).parent().parent(); pos = parseInt(li.attr("id").split("_").pop()); @@ -228,40 +228,47 @@ function openCueEditor(event) { highlightActive(li); $.get(url, {format: "json", pos: pos}, function(json){ - + $("#cues_"+pos) .empty() .append(json.html) .show(); setCueEvents(li); - }); + }); +} + +function redrawDataTablePage() { + var dt; + dt = $("#library_display").dataTable(); + dt.fnStandingRedraw(); } function setSPLContent(json) { - - if(json.message) { + + if(json.message) { alert(json.message); - return; + return; } - $('#spl_name').empty() + $('#spl_name > a').empty() .append(json.name); $('#spl_length').empty() - .append(json.length); + .append(json.length); + $('#fieldset-metadate_change textarea') + .empty() + .val(json.description); $('#spl_sortable').empty() - .append(json.html); + .append(json.html); $("#spl_editor") .empty(); $("#spl_sortable .ui-icon-closethick").click(deleteSPLItem); $(".spl_fade_control").click(openFadeEditor); - //$(".spl_playlength").click(openCueEditor); $(".spl_cue").click(openCueEditor); - + //redraw the library list - dt = $("#library_display").dataTable(); - dt.fnStandingRedraw(); + redrawDataTablePage(); return false; } @@ -269,8 +276,8 @@ function setSPLContent(json) { function addSPLItem(event, ui){ var url, tr, id, items, draggableOffset, elOffset, pos; - tr = ui.helper; - + tr = ui.helper; + if(tr.get(0).tagName === 'LI') return; @@ -286,7 +293,7 @@ function addSPLItem(event, ui){ return false; } }); - + id = tr.attr('id').split("_").pop(); url = '/Playlist/add-item'; @@ -305,13 +312,13 @@ function deleteSPLItem(event){ $.post(url, {format: "json", pos: pos}, setSPLContent); } -function moveSPLItem(event, ui) { +function moveSPLItem(event, ui) { var li, newPos, oldPos, url; li = ui.item; - + newPos = li.index(); - oldPos = li.attr('id').split("_").pop(); + oldPos = li.attr('id').split("_").pop(); url = '/Playlist/move-item'; @@ -359,21 +366,20 @@ function createPlaylistMetaForm(json) { var url, data; url = '/Playlist/metadata/format/json'; - data = $("#side_playlist form").serialize(); + data = $("#side_playlist form").serialize(); $.post(url, data, function(json){ openDiffSPL(json); //redraw the library list - dt = $("#library_display").dataTable(); - dt.fnStandingRedraw(); + redrawDataTablePage(); }) - + }); $("#side_playlist") .empty() .append(form); - + currentlyOpenedSplId = json.pl_id; } @@ -393,24 +399,44 @@ function deleteSPL() { $.post(url, function(){ noOpenPL; //redraw the library list - dt = $("#library_display").dataTable(); - dt.fnStandingRedraw(); + redrawDataTablePage(); }); } function openDiffSPL(json) { - + $("#side_playlist") .empty() .append(json.html); - + currentlyOpenedSplId = json.pl_id; setUpSPL(); } +function editName() { + var nameElement = $(this); + var playlistName = nameElement.text(); + + $("#playlist_name_input") + .removeClass('element_hidden') + .val(playlistName) + .blur(function(){ + var input = $(this); + var url; + url = '/Playlist/set-playlist-name'; + + $.post(url, {format: "json", name: input.val()}, function(json){ + input.addClass('element_hidden'); + nameElement.text(json.playlistName); + redrawDataTablePage(); + }); + }) + .keydown(submitOnEnter); +} + function setUpSPL() { - + $("#spl_sortable").sortable({ handle: 'div.list-item-container' }); @@ -448,6 +474,39 @@ function setUpSPL() { } }); + $("#playlist_name_display").click(editName); + $("#fieldset-metadate_change > legend").click(function(){ + var descriptionElement = $(this).parent(); + + if(descriptionElement.hasClass("closed")) { + descriptionElement.removeClass("closed"); + } + else { + descriptionElement.addClass("closed"); + } + }); + + $("#description_save").click(function(){ + var textarea = $("#fieldset-metadate_change textarea"); + var description = textarea.val(); + var url; + url = '/Playlist/set-playlist-description'; + + $.post(url, {format: "json", description: description}, function(json){ + textarea.val(json.playlistDescription); + }); + }); + + $("#description_cancel").click(function(){ + var textarea = $("#fieldset-metadate_change textarea"); + var url; + url = '/Playlist/set-playlist-description'; + + $.post(url, {format: "json"}, function(json){ + textarea.val(json.playlistDescription); + }); + }); + $("#spl_fade_in_main span:first").blur(function(event){ event.stopPropagation(); @@ -508,7 +567,6 @@ function setUpSPL() { $("#spl_sortable .ui-icon-closethick").click(deleteSPLItem); $(".spl_fade_control").click(openFadeEditor); - //$(".spl_playlength").click(openCueEditor); $(".spl_cue").click(openCueEditor); $("#spl_sortable").droppable();