Converted asset context menus to YUI menus

This commit is contained in:
Graham Knop 2008-07-22 17:44:17 +00:00
parent 8ef9e3e39e
commit cb21f13d9f
5 changed files with 160 additions and 226 deletions

View file

@ -21,6 +21,9 @@
- fixed: Cash available as a payment option to everyone
- fixed: Web::Form::Asset can now accept assets with '|" in their names.
- fixed: Shop: remove an item and Apache segfaults
- Converted asset context menus to YUI menus
- fixed: asset context menu is positioned incorrectly on RTL pages
- fixed: asset context menu broken if the only asset is a navigation included by AssetProxy
7.5.17
- fixed: Payment Methods Hover Help Incomplete

View file

@ -1271,76 +1271,107 @@ Returns a toolbar with a set of icons that hyperlink to functions that delete, e
=cut
sub getToolbar {
my $self = shift;
return undef unless $self->canEdit;
return $self->{_toolbar} if (exists $self->{_toolbar});
my $userUiLevel = $self->session->user->profileField("uiLevel");
my $uiLevels = $self->session->config->get("assetToolbarUiLevel");
my $i18n = WebGUI::International->new($self->session, "Asset");
my $toolbar = "";
my $commit;
if ($self->canEditIfLocked) {
$toolbar .= $self->session->icon->delete('func=delete',$self->get("url"),$i18n->get(43)) if ($userUiLevel >= $uiLevels->{"delete"});
$toolbar .= $self->session->icon->edit('func=edit',$self->get("url")) if ($userUiLevel >= $uiLevels->{"edit"});
} else {
$toolbar .= $self->session->icon->locked('func=manageRevisions',$self->get("url")) if ($userUiLevel >= $uiLevels->{"revisions"});
}
$toolbar .= $self->session->icon->cut('func=cut',$self->get("url")) if ($userUiLevel >= $uiLevels->{"cut"});
my $self = shift;
return undef unless $self->canEdit;
return $self->{_toolbar}
if (exists $self->{_toolbar});
my $userUiLevel = $self->session->user->profileField("uiLevel");
my $uiLevels = $self->session->config->get("assetToolbarUiLevel");
my $i18n = WebGUI::International->new($self->session, "Asset");
my $toolbar = "";
my $commit;
if ($self->canEditIfLocked) {
$toolbar .= $self->session->icon->delete('func=delete',$self->get("url"),$i18n->get(43))
if ($userUiLevel >= $uiLevels->{"delete"});
$toolbar .= $self->session->icon->edit('func=edit',$self->get("url"))
if ($userUiLevel >= $uiLevels->{"edit"});
}
else {
$toolbar .= $self->session->icon->locked('func=manageRevisions',$self->get("url"))
if ($userUiLevel >= $uiLevels->{"revisions"});
}
$toolbar .= $self->session->icon->cut('func=cut',$self->get("url"))
if ($userUiLevel >= $uiLevels->{"cut"});
if ($userUiLevel >= $uiLevels->{"copy"}) {
$toolbar .= $self->session->icon->copy('func=copy',$self->get("url"));
# if this asset has children, create a more full-featured menu for copying
if ($self->getChildCount) {
my $copy = '<script type="text/javascript">
//<![CDATA[
var contextMenu = new contextMenu_createWithImage("'.$self->session->icon->getBaseURL().'copy.gif","'.$self->getId.'_2","'.$i18n->get('copy').'",true);';
$copy .= 'contextMenu.addLink("'.$self->getUrl("func=copy").'","'.$i18n->get("this asset only").'");';
$copy .= 'contextMenu.addLink("'.$self->getUrl("func=copy;with=children").'","'.$i18n->get("with children").'");';
$copy .= 'contextMenu.addLink("'.$self->getUrl("func=copy;with=descendants").'","'.$i18n->get("with descendants").'");';
$copy .= 'contextMenu.print();
//]]>
</script>';
$toolbar .= $copy;
$toolbar
.= '<div class="yuimenu wg-contextmenu">'
. '<div class="bd">'
. '<ul class="first-of-type">'
. '<li class="yuimenuitem"><a class="yuimenuitemlabel" href="'
. $self->getUrl("func=copy") . '">' . $i18n->get("this asset only") . '</a></li>'
. '<li class="yuimenuitem"><a class="yuimenuitemlabel" href="'
. $self->getUrl("func=copy;with=children") . '">' . $i18n->get("with children") . '</a></li>'
. '<li class="yuimenuitem"><a class="yuimenuitemlabel" href="'
. $self->getUrl("func=copy;with=descendants") . '">' . $i18n->get("with descendants") . '</a></li>'
. '</ul></div></div>';
}
else {
$toolbar .= $self->session->icon->copy('func=copy',$self->get("url")) if ($userUiLevel >= $uiLevels->{"copy"});
}
$toolbar .= $self->session->icon->shortcut('func=createShortcut',$self->get("url")) if ($userUiLevel >= $uiLevels->{"shortcut"} && !($self->get("className") =~ /Shortcut/));
$self->session->style->setLink($self->session->url->extras('contextMenu/contextMenu.css'), {rel=>"stylesheet",type=>"text/css"});
$self->session->style->setScript($self->session->url->extras('contextMenu/contextMenu.js'), {type=>"text/javascript"});
my $output = '<script type="text/javascript">
//<![CDATA[
var contextMenu = new contextMenu_createWithImage("'.$self->getIcon(1).'","'.$self->getId.'","'.$self->getName.'");';
if ($userUiLevel >= $uiLevels->{"changeUrl"}) {
$output .= 'contextMenu.addLink("'.$self->getUrl("func=changeUrl").'","'.$i18n->get("change url").'");';
}
if ($userUiLevel >= $uiLevels->{"editBranch"}) {
$output .= 'contextMenu.addLink("'.$self->getUrl("func=editBranch").'","'.$i18n->get("edit branch").'");';
}
if ($userUiLevel >= $uiLevels->{"revisions"}) {
$output .= 'contextMenu.addLink("'.$self->getUrl("func=manageRevisions").'","'.$i18n->get("revisions").'");';
}
if ($userUiLevel >= $uiLevels->{"view"}) {
$output .= 'contextMenu.addLink("'.$self->getUrl.'","'.$i18n->get("view").'");';
}
if ($userUiLevel >= $uiLevels->{"lock"} && !$self->isLocked) {
$output .= 'contextMenu.addLink("'.$self->getUrl("func=lock").'","'.$i18n->get("lock").'");';
}
if ($userUiLevel >= $uiLevels->{"export"} && defined $self->session->config->get("exportPath")) {
$output .= 'contextMenu.addLink("'.$self->getUrl("func=export").'","'.$i18n->get("Export","Icon").'");';
}
if ($userUiLevel >= $uiLevels->{"promote"}) {
$output .= 'contextMenu.addLink("'.$self->getUrl("func=promote").'","'.$i18n->get("promote").'");';
}
if ($userUiLevel >= $uiLevels->{"demote"}) {
$output .= 'contextMenu.addLink("'.$self->getUrl("func=demote").'","'.$i18n->get("demote").'");';
}
if ($userUiLevel >= $uiLevels->{"manage"}) {
$output .= 'contextMenu.addLink("'.$self->getUrl("op=assetManager").'","'.$i18n->get("manage").'");';
}
$output .= 'contextMenu.print();
//]]>
</script>'.$toolbar;
return $output;
}
$toolbar .= $self->session->icon->shortcut('func=createShortcut',$self->get("url"))
if ($userUiLevel >= $uiLevels->{"shortcut"} && !$self->isa('WebGUI::Asset::Shortcut'));
$self->session->style->setLink($self->session->url->extras('contextMenu/contextMenu.css'), {rel=>"stylesheet",type=>"text/css"});
$self->session->style->setLink($self->session->url->extras('yui/build/menu/assets/skins/sam/menu.css'), {rel=>"stylesheet",type=>"text/css"});
$self->session->style->setScript($self->session->url->extras('yui/build/yahoo-dom-event/yahoo-dom-event.js'), {type=>"text/javascript"});
$self->session->style->setScript($self->session->url->extras('yui/build/container/container_core-min.js'), {type=>"text/javascript"});
$self->session->style->setScript($self->session->url->extras('yui/build/menu/menu-min.js'), {type=>"text/javascript"});
$self->session->style->setScript($self->session->url->extras('contextMenu/contextMenu.js'), {type=>"text/javascript"});
my $output
= '<div class="yui-skin-sam">'
. '<img src="' . $self->getIcon(1) . '" title="' . $self->getName . '" alt="' . $self->getName . '" style="vertical-align: middle" />'
. '<div class="yuimenu wg-contextmenu">'
. '<div class="bd">'
. '<ul class="first-of-type">';
if ($userUiLevel >= $uiLevels->{"changeUrl"}) {
$output
.= '<li class="yuimenuitem"><a class="yuimenuitemlabel" href="'
. $self->getUrl("func=changeUrl") . '">' . $i18n->get("change url") . '</a></li>';
}
if ($userUiLevel >= $uiLevels->{"editBranch"}) {
$output
.= '<li class="yuimenuitem"><a class="yuimenuitemlabel" href="'
. $self->getUrl("func=editBranch") . '">' . $i18n->get("edit branch") . '</a></li>';
}
if ($userUiLevel >= $uiLevels->{"revisions"}) {
$output
.= '<li class="yuimenuitem"><a class="yuimenuitemlabel" href="'
. $self->getUrl("func=manageRevisions") . '">' . $i18n->get("revisions") . '</a></li>';
}
if ($userUiLevel >= $uiLevels->{"view"}) {
$output
.= '<li class="yuimenuitem"><a class="yuimenuitemlabel" href="'
. $self->getUrl . '">' . $i18n->get("view") . '</a></li>';
}
if ($userUiLevel >= $uiLevels->{"lock"} && !$self->isLocked) {
$output
.= '<li class="yuimenuitem"><a class="yuimenuitemlabel" href="'
. $self->getUrl('func=lock') . '">' . $i18n->get("lock") . '</a></li>';
}
if ($userUiLevel >= $uiLevels->{"export"} && $self->session->config->get("exportPath")) {
$output
.= '<li class="yuimenuitem"><a class="yuimenuitemlabel" href="'
. $self->getUrl('func=export') . '">' . $i18n->get("export") . '</a></li>';
}
if ($userUiLevel >= $uiLevels->{"promote"}) {
$output
.= '<li class="yuimenuitem"><a class="yuimenuitemlabel" href="'
. $self->getUrl("func=promote") . '">' . $i18n->get("promote") . '</a></li>';
}
if ($userUiLevel >= $uiLevels->{"demote"}) {
$output
.= '<li class="yuimenuitem"><a class="yuimenuitemlabel" href="'
. $self->getUrl("func=promote") . '">' . $i18n->get("demote") . '</a></li>';
}
if ($userUiLevel >= $uiLevels->{"manage"}) {
$output
.= '<li class="yuimenuitem"><a class="yuimenuitemlabel" href="'
. $self->getUrl("op=assetManager") . '">' . $i18n->get("manage") . '</a></li>';
}
$output .= '</ul></div></div>' . $toolbar . '</div>';
return $output;
}
#-------------------------------------------------------------------

View file

@ -300,24 +300,38 @@ sub getToolbar {
return
unless $self->canEdit;
if ($self->getToolbarState) {
my $returnUrl;
if ($self->session->asset) {
$returnUrl = ";proceed=goBackToPage;returnUrl=".$self->session->url->escape($self->session->asset->getUrl);
}
my $toolbar;
if (!$self->isLocked || $self->get("isLockedBy") eq $self->session->user->userId) {
$toolbar = $self->session->icon->edit('func=edit'.$returnUrl,$self->get("url"));
}
my $i18n = WebGUI::International->new($self->session, "Asset");
return '<script type="text/javascript">
var contextMenu = new contextMenu_createWithImage("'.$self->getIcon(1).'","'.$self->getId.'","'.$self->getName.'");
contextMenu.addLink("'.$self->getUrl("func=copy").'","'.$i18n->get("copy").'");
contextMenu.addLink("'.$self->getUrl("op=assetManager").'","'.$i18n->get("manage").'");
contextMenu.addLink("'.$self->getUrl.'","'.$i18n->get("view").'");
contextMenu.print();
</script>'.$toolbar;
}
return $self->SUPER::getToolbar();
my $toolbar = '';
if ($self->canEditIfLocked) {
my $userUiLevel = $self->session->user->profileField("uiLevel");
my $uiLevels = $self->session->config->get("assetToolbarUiLevel");
my $returnUrl = '';
if ($self->session->asset) {
$returnUrl = ";proceed=goBackToPage;returnUrl=".$self->session->url->escape($self->session->asset->getUrl);
}
$toolbar = $self->session->icon->edit('func=edit'.$returnUrl,$self->get("url"))
if ($userUiLevel >= $uiLevels->{"edit"});
}
$self->session->style->setLink($self->session->url->extras('contextMenu/contextMenu.css'), {rel=>"stylesheet",type=>"text/css"});
$self->session->style->setLink($self->session->url->extras('yui/build/menu/assets/skins/sam/menu.css'), {rel=>"stylesheet",type=>"text/css"});
$self->session->style->setScript($self->session->url->extras('yui/build/yahoo-dom-event/yahoo-dom-event.js'), {type=>"text/javascript"});
$self->session->style->setScript($self->session->url->extras('yui/build/container/container_core-min.js'), {type=>"text/javascript"});
$self->session->style->setScript($self->session->url->extras('yui/build/menu/menu-min.js'), {type=>"text/javascript"});
$self->session->style->setScript($self->session->url->extras('contextMenu/contextMenu.js'), {type=>"text/javascript"});
my $i18n = WebGUI::International->new($self->session, "Asset");
return '<div class="yui-skin-sam">'
. '<img src="' . $self->getIcon(1) . '" title="' . $self->getName . '" alt="' . $self->getName . '" style="vertical-align: middle" />'
. '<div class="yuimenu wg-contextmenu">'
. '<div class="bd">'
. '<ul class="first-of-type">'
. '<li class="yuimenuitem"><a class="yuimenuitemlabel" href="'
. $self->getUrl("func=copy") . '">' . $i18n->get("copy") . '</a></li>'
. '<li class="yuimenuitem"><a class="yuimenuitemlabel" href="'
. $self->getUrl("op=assetManager") . '">' . $i18n->get("manage") . '</a></li>'
. '<li class="yuimenuitem"><a class="yuimenuitemlabel" href="'
. $self->getUrl . '">' . $i18n->get("view") . '</a></li>'
. "</ul></div></div>$toolbar</div>";
}
return $self->SUPER::getToolbar;
}

View file

@ -1,37 +1,9 @@
.contextMenu_skin {
position:absolute;
border:2px outset #eeeeee;
font-family: helvetica, arial, sans-serif;
line-height:18px;
width: 100px;
cursor: default;
font-size:10px;
z-index:100;
visibility:hidden;
padding: 4px;
font-weight: normal;
text-align: left;
background-color:#F0F0F0;
border-bottom: 3px groove #999999;
border-top: 0px groove #999999;
border-right: 3px groove #999999;
border-left: 0px groove #999999;
}
.contextMenu_skin A, .contextMenu_skin A:link, .contextMenu_skin A:visited {
font-weight: normal;
width: 100%;
color: black;
text-decoration: none;
margin: 1px;
font-size: 10px;
}
.contextMenu_skin A:hover {
text-decoration: none;
font-weight: normal;
color: #154c66;
margin: 0px;
background-color: #c3cfd4;
border: 1px solid #F0F0F0;
width: 100%;
.wg-contextmenu {
position: absolute;
visibility: hidden;
font-family: helvetica, arial, sans-serif;
}
.wg-contextmenu .yuimenuitemlabel {
font-size: 10px
}

View file

@ -1,107 +1,21 @@
var ie5=document.all&&document.getElementById
var contextMenu_items = new Array();
if (contextMenu_old == undefined)
{
var contextMenu_old = (document.onclick) ? document.onclick : function () {};
document.onclick= function () {contextMenu_old();contextMenu_hide();};
}
function contextMenu_renderLeftClick(menuId,e) {
contextMenu_hide(e);
contextMenu_show(menuId,e);
e.cancelBubble=true;
e.returnValue=false;
return false;
}
function contextMenu_show(menuId,e){
var menuobj=document.getElementById(menuId)
var posx = 0;
var posy = 0;
var yoffset = 0;
var xoffset = 0;
var firedobj = ie5?e.srcElement:e.target;
while (firedobj!=null && firedobj.tagName!="HTML"){
//this is a hack, need to revisit
if (firedobj.tagName == "DIV") {
xoffset+=firedobj.offsetLeft;
yoffset+=firedobj.offsetTop;}
firedobj=firedobj.offsetParent;
}
var el = (document.documentElement && document.documentElement.scrollTop)
? document.documentElement : document.body;
posx = e.clientX - xoffset + (ie5? el.scrollLeft : window.pageXOffset);
posy = e.clientY - yoffset + (ie5? el.scrollTop : window.pageYOffset);
menuobj.style.left=posx + "px";
menuobj.style.top=posy + "px";
menuobj.style.visibility="visible"
return false
}
function contextMenu_hide(){
for (i=0;i<contextMenu_items.length;i++) {
document.getElementById("contextMenu_"+contextMenu_items[i]+"_menu").style.visibility="hidden"
}
return false;
}
function contextMenu_createWithImage(imagePath, id, name, addContext){
contextMenu_items.push(id);
this.id = id;
this.name = name;
this.addContext = addContext;
this.type = "image";
this.imagePath=imagePath;
this.linkLabels = new Array();
this.linkUrls = new Array();
this.draw = contextMenu_draw;
this.print = contextMenu_print;
this.addLink = contextMenu_addLink;
}
function contextMenu_createWithLink(id, name){
contextMenu_items.push(id);
this.id = id;
this.name = name;
this.type = "link";
this.linkLabels = new Array();
this.linkUrls = new Array();
this.draw = contextMenu_draw;
this.print = contextMenu_print;
this.addLink = contextMenu_addLink;
}
function contextMenu_draw(){
var output = "";
output += '<div id="contextMenu_' + this.id + '_menu" class="contextMenu_skin">';
for (i=0;i<this.linkUrls.length;i++) {
output += "<a style=\"color: black;\" href=\"" + this.linkUrls[i] + "\">" + this.linkLabels[i] + "</a><br />";
}
output += '</div>';
if (this.type == "image") {
if (this.addContext)
output += '<p class="toolbarIcon" style="display: inline; vertical-align: middle;"><a href="javascript:void(0)">';
output += '<img src="' + this.imagePath + '" id="contextMenu_' + this.id + '_2" onclick="return contextMenu_renderLeftClick(\'contextMenu_' + this.id + '_menu\',event)" alt="' + this.name + '" title="' + this.name + '" align="absmiddle" ';
if (this.addContext)
output += 'style="border: 0px none; vertical-align: middle;"';
output += ' />';
if (this.addContext)
output += '</a></p>';
} else {
output += '<a href="#" id="contextMenu_' + this.id + '" onclick="return contextMenu_renderLeftClick(\'contextMenu_' + this.id + '_menu\',event)">' + this.name + '</a>';
}
return output;
}
function contextMenu_print(){
document.write(this.draw());
}
function contextMenu_addLink(linkUrl,linkLabel){
this.linkUrls.push(linkUrl);
this.linkLabels.push(linkLabel);
}
function initWGContextMenus() {
var menus = YAHOO.util.Dom.getElementsByClassName('wg-contextmenu');
for (var i = menus.length; i--; ) {
var menu = menus[i];
if (menu.initialized) {
continue;
}
var ctx = menu.previousSibling;
var myMenu = new YAHOO.widget.Menu(menu, {
context : [ctx, "tl", "bl"]
});
myMenu.render();
YAHOO.util.Event.addListener(ctx, "click", function (e, menu) {
YAHOO.util.Event.preventDefault(e);
menu.align("tl", "bl");
menu.show();
}, myMenu);
}
}
YAHOO.util.Event.onDOMReady(initWGContextMenus);