Author: SvenDowideit Date: 2007-02-11 20:56:49 -0600 (Sun, 11 Feb 2007) New Revision: 12839 Added: twiki/branches/MAIN/twikiplugins/JSPopupPlugin/templates/twiki.popup.tmpl Modified: twiki/branches/MAIN/twikiplugins/JSPopupPlugin/data/TWiki/JSPopupPlugin.txt twiki/branches/MAIN/twikiplugins/JSPopupPlugin/lib/TWiki/Plugins/JSPopupPlugin.pm twiki/branches/MAIN/twikiplugins/JSPopupPlugin/lib/TWiki/Plugins/JSPopupPlugin/MANIFEST twiki/branches/MAIN/twikiplugins/JSPopupPlugin/pub/TWiki/JSPopupPlugin/JSPopupPlugin.js Log: Item3613: JSPopupPlugin - add POPUPLINK tag Modified: twiki/branches/MAIN/twikiplugins/JSPopupPlugin/data/TWiki/JSPopupPlugin.txt =================================================================== --- twiki/branches/MAIN/twikiplugins/JSPopupPlugin/data/TWiki/JSPopupPlugin.txt 2007-02-11 22:45:02 UTC (rev 12838) +++ twiki/branches/MAIN/twikiplugins/JSPopupPlugin/data/TWiki/JSPopupPlugin.txt 2007-02-12 02:56:49 UTC (rev 12839) @@ -11,9 +11,13 @@ It uses javascript to create a popup window containing either a hidden pre-rendered part of a topic, or a TWiki request that is dynamically requested and served. Popups are activated either on a mouse click, when the mouse passes over the anchor, or when the page is loaded. -This will allow you to create a popup Comment Edit box: +This will allow you to create a popup Comment Edit box (don't forget to create the #<nop>Comments anchor): <verbatim> -%POPUP{anchor="<button class='twikiButton'>add comment</button>" popuptext="%COMMENT%" popuptexttype="tml"}% +%POPUP{ +anchor="<button class='twikiButton'>add comment</button>" +popuptext="$percntCOMMENT{target=\"#Comments\"}$percnt" +popuptexttype="tml" +}% </verbatim> or a popup menu of webs @@ -38,16 +42,28 @@ }% </verbatim> +or a popup that can quickly show you the last change made to the topic. +<verbatim> +%POPUPLINK{ +"Last edit" +url="%SCRIPTURL{rdiff}%/%WEB%/%TOPIC%?type=last" +}% +</verbatim> + there is only one popup window at a time, so if the clicks on an anchor while another popup is up, it will be replaced by the new one. ---++ Syntax Rules -!%POPUP{}% +---+++ !%POPUP{}% parameters are * anchor="" - the text that is the click target that causes the POPUP to come up * (if this is not set, or an empty string, then the popup is shown on page load *REMEMBER*, only one popup open at a time) - * anchortype="" - action done to trigger the popup - onclick,onmouseover ('onclick' is default) + * anchortype="" - type of anchor trigger - [onclick,onmouseover,popuplink] ('onclick' is default) + * onclick - surrounds anchor with a html span, with an onclick action + * onmouseover - surrounds anchor with a html span, with an onmouseover action + * popuplink - makes an ajax popup with non-javascript fallback eg: <a href="fallbackurl" onclick="return twiki.jspopupOpen("popuptext")" > anchor < /a > + * fallbackurl="" - the href url to use for non-javascript browsers (defaults to popuptext * popuptitle="" - what will be displayed in the popup title (not shown if border="off") * popuptext="" - what will be displayed in the popup * popuptexttype ="" - tml, rest @@ -55,7 +71,16 @@ * border="" - show the border & close button (defaults to 'on') - if you select not to show the border and close button then there is an onmouseleave that closes the window * delay=200 - used as the delay in mS if the anchortype='mouseover' +---+++ !%POPUPLINK% +=POPUPLINK= is useful for creating popup alternatives (with fallback) to enquiry or action pages, such as Raw topic view. Instead of leaving the twiki topic to see what the markup is +the user is able to _quickly_ see the TWikiMarkup, and then cancel back to the normal topic view. +!%POPUPLINK{"Attach" url="" }% + * DEFAULT - the text the user sees on the page as a link + * url - the url the link goes to. + * if the browser has javascript, and the YahooUserInterface components work, this will a popup dialog will contain the output of that url (using TWiki's =?cover=popup=) + * if the popup does not work, the clicking the link will goto that page in the browser + ---++ Plugin Settings Plugin settings are stored as preferences variables. To reference @@ -75,8 +100,13 @@ * Unzip ==%TOPIC%.zip== in your twiki installation directory. Content: <table cellspacing="1" cellpadding="0" border="1"> *File:* *Description:* ==data/TWiki/%TOPIC%.txt== Plugin topic ==data/TWiki/%TOPIC%.txt,v== Plugin topic repository ==lib/TWiki/Plugins/%TOPIC%.pm== Plugin Perl module </table> * use the configure script to enable * Test if the installation was successful: -%POPUP{anchor="<button class='twikiButton'>Clicking here should popup</button>" popuptitle="testing" popuptext="This is a popup text" popuptexttype="tml"}% +%POPUP{anchor="<button class='twikiButton'>Clicking here should popup some text</button>" popuptitle="testing" popuptext="This is a popup text" popuptexttype="tml"}% + %POPUPLINK{ +"View Raw" +url="%SCRIPTURL{view}%/%WEB%/%TOPIC%?raw=on" +}% + ---++ Plugin Info | Plugin Author: | TWiki:Main.SvenDowideit - Sve...@wi... - <img src="%ATTACHURLPATH%/wikiringlogo20x20.png" /> [[http://www.wikiring.com][WikiRing.com]] | Modified: twiki/branches/MAIN/twikiplugins/JSPopupPlugin/lib/TWiki/Plugins/JSPopupPlugin/MANIFEST =================================================================== --- twiki/branches/MAIN/twikiplugins/JSPopupPlugin/lib/TWiki/Plugins/JSPopupPlugin/MANIFEST 2007-02-11 22:45:02 UTC (rev 12838) +++ twiki/branches/MAIN/twikiplugins/JSPopupPlugin/lib/TWiki/Plugins/JSPopupPlugin/MANIFEST 2007-02-12 02:56:49 UTC (rev 12839) @@ -4,3 +4,4 @@ pub/TWiki/JSPopupPlugin/wikiringlogo20x20.png lib/TWiki/Plugins/JSPopupPlugin.pm Plugin Perl module templates/jspopupplugin.javascript.tmpl +templates/twiki.popup.tmpl Modified: twiki/branches/MAIN/twikiplugins/JSPopupPlugin/lib/TWiki/Plugins/JSPopupPlugin.pm =================================================================== --- twiki/branches/MAIN/twikiplugins/JSPopupPlugin/lib/TWiki/Plugins/JSPopupPlugin.pm 2007-02-11 22:45:02 UTC (rev 12838) +++ twiki/branches/MAIN/twikiplugins/JSPopupPlugin/lib/TWiki/Plugins/JSPopupPlugin.pm 2007-02-12 02:56:49 UTC (rev 12839) @@ -61,6 +61,7 @@ setupTWiki4Compatibility(); TWiki::Func::registerTagHandler( 'POPUP', \&handlePopup ); + TWiki::Func::registerTagHandler( 'POPUPLINK', \&handlePopupLink ); $WEB = $web; $TOPIC= $topic; @@ -111,11 +112,15 @@ sub handlePopup { my($session, $params, $theTopic, $theWeb) = @_; + my $query = TWiki::Func::getCgiQuery(); my $default = $params->{_DEFAULT} || ''; #TODO: not sure what thus should be :) my $anchor = $params->{anchor}; my $anchortype = $params->{anchortype} || 'onclick'; + $anchortype = 'anchorless' unless ((defined($anchor)) && ($anchor ne '')); my $popuptext = $params->{popuptext}; + my $fallbackurl = $params->{fallbackurl}; + $fallbackurl = $popuptext unless (defined($fallbackurl)); my $popuptitle = $params->{popuptitle} || ''; my $popuptexttype = $params->{popuptexttype} || 'tml'; my $popuplocation = $params->{popuplocation} || 'center'; @@ -128,14 +133,16 @@ my $event = ''; my $output = ''; - if ((defined($anchor)) && ($anchor ne '')) { - $event = 'onclick="TWiki.JSPopupPlugin.openPopupSectional(event, \'popupSection'.$popupSectionNumber.'\')"';#ASSUME onclick + if ($anchortype eq 'popuplink') { + $event = 'return twiki.JSPopupPlugin.openPopupSectional(event, \'popupSection'.$popupSectionNumber.'\');';#ASSUME onclick + $output = $query->a({href=>$fallbackurl, onclick=>$event}, $anchor); + } elsif ($anchortype eq 'anchorless') { + } else { + $event = 'onclick="return twiki.JSPopupPlugin.openPopupSectional(event, \'popupSection'.$popupSectionNumber.'\');"';#ASSUME onclick if ($anchortype eq 'onmouseover') { - $event = 'onmouseover="TWiki.JSPopupPlugin.DelayedOpenPopupSectional(event, \'popupSection'.$popupSectionNumber.'\')" onmouseout="TWiki.JSPopupPlugin.CancelOpenPopup()"'; + $event = 'onmouseover="return twiki.JSPopupPlugin.DelayedOpenPopupSectional(event, \'popupSection'.$popupSectionNumber.'\');return false;" onmouseout="return twiki.JSPopupPlugin.CancelOpenPopup();"'; } $output .= '<span '.$event.'>'."\n".$anchor."\n".'</span>'; - } else { - $anchortype = 'anchorless'; } #TODO: work out a way to mix tml mode in topic, and rest & delayedtml mode where it needs to be added in the postRenderingHandler (and can use JSON) @@ -143,7 +150,9 @@ #nasty way to stop the url from getting TWiki'd } else { $popuptext = "\n".$popuptext."\n"; + $popuptext =~ s/\$percnt/%/g; } + #TODO: this should really get added outside the topic like InlineEdit $output .= '<span class="JSPopupSpan"'. 'style="'.$display. @@ -160,6 +169,52 @@ return $output; } +sub handlePopupLink { + my($session, $params, $theTopic, $theWeb) = @_; + + my $query = TWiki::Func::getCgiQuery(); + my $anchor = $params->{_DEFAULT} || $params->{anchor} || 'Popup'; + my $url = $params->{url}; + + my $popupUrl = $url; + if ($popupUrl =~ /\?/ ) { + $popupUrl .= ';'; + } else { + $popupUrl .= '?'; + } + $popupUrl .= 'skin=popup,default'; + + my $popuptitle = $params->{popuptitle} || ''; + my $popuplocation = $params->{popuplocation} || 'center'; + my $border = $params->{border} || 'on'; + my $buttons = $params->{buttons}; + my $evaluate = $params->{eval}; + my $delay = $params->{delay} || '200'; + + + my $display = 'display:none;'; + my $event = 'return twiki.JSPopupPlugin.openPopupSectional(event, \'popupSection'.$popupSectionNumber.'\');';#ASSUME onclick + my $output = $query->a( + { + id => 'popupSection'.$popupSectionNumber, + href => $url, + popupurl => $popupUrl, + type => 'rest', + location => $popuplocation, + delay => $delay, + border => $border, + title => $popuptitle, + + onclick=> $event + }, + $anchor); + + + $popupSectionNumber++; + return $output; +} + + sub postRenderingHandler { # do not uncomment, use $_[0], $_[1]... instead #my $text = shift; Modified: twiki/branches/MAIN/twikiplugins/JSPopupPlugin/pub/TWiki/JSPopupPlugin/JSPopupPlugin.js =================================================================== --- twiki/branches/MAIN/twikiplugins/JSPopupPlugin/pub/TWiki/JSPopupPlugin/JSPopupPlugin.js 2007-02-11 22:45:02 UTC (rev 12838) +++ twiki/branches/MAIN/twikiplugins/JSPopupPlugin/pub/TWiki/JSPopupPlugin/JSPopupPlugin.js 2007-02-12 02:56:49 UTC (rev 12839) @@ -1,7 +1,7 @@ /* # Plugin for TWiki Collaboration Platform, http://TWiki.org/ # -# Copyright (C) 2005 Sven Dowideit Sve...@wi... +# Copyright (C) 2005-2007 Sven Dowideit - Sve...@wi... # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -24,57 +24,76 @@ if ((elements[i].className == 'JSPopupSpan')) { var anchor = elements[i].getAttribute('anchortype'); if (anchor == 'anchorless') { - TWiki.JSPopupPlugin.openPopupSectional(null, elements[i].id) + return twiki.JSPopupPlugin.openPopupSectional(null, elements[i].id) } } } } + + //create the TWiki namespace if needed -if ( typeof( TWiki ) == "undefined" ) { - TWiki = {}; +if ( typeof( twiki ) == "undefined" ) { + twiki = {}; } /**********************************************************************************/ -//create the TWiki.JSPopupPlugin namespace if needed -if ( typeof( TWiki.JSPopupPlugin ) == "undefined" ) { - TWiki.JSPopupPlugin = {}; +//create the twiki.JSPopupPlugin namespace if needed +if ( typeof( twiki.JSPopupPlugin ) == "undefined" ) { + twiki.JSPopupPlugin = {}; } -TWiki.JSPopupPlugin.DelayedOpenPopupSectional = function (event, sectionName) { +twiki.JSPopupPlugin.DelayedOpenPopupSectional = function (event, sectionName) { var sectionElem = document.getElementById(sectionName); var delay = sectionElem.getAttribute('delay'); //TODO: consider making this an array, indexed by sectionName - delayedPopup = window.setTimeout("TWiki.JSPopupPlugin.openPopupSectional(null, '"+sectionName+"')", delay); + delayedPopup = window.setTimeout("twiki.JSPopupPlugin.openPopupSectional(null, '"+sectionName+"')", delay); } -TWiki.JSPopupPlugin.CancelOpenPopup = function() { +twiki.JSPopupPlugin.CancelOpenPopup = function() { window.clearTimeout(delayedPopup); } - -TWiki.JSPopupPlugin.openPopupSectional = function (event, sectionName) { +//returns false to prevent the default action of the anchor.. +twiki.JSPopupPlugin.openPopupSectional = function (event, sectionName) { + var ret = true; if ((sectionName) && (sectionName != '')) { var sectionElem = document.getElementById(sectionName); if (sectionElem.getAttribute('type') == 'rest') { + + // use popupurl paramin preference to href in preference to innerHTML + var url = sectionElem.getAttribute('popupurl'); + if (!url) { url = sectionElem.getAttribute('popupurl'); } + if (!url) { url = sectionElem.innerHTML; } //reset the text to a simple default - TWiki.JSPopupPlugin.openPopup(event, 'Please wait, requesting data from server', sectionElem.getAttribute('location'), sectionElem.getAttribute('border'), sectionElem.getAttribute('title')); - TWiki.JSPopupPlugin.ajaxCall(event, sectionElem.innerHTML); + ret = twiki.JSPopupPlugin.openPopup(event, 'Please wait, requesting data from server', sectionElem.getAttribute('location'), sectionElem.getAttribute('border'), sectionElem.getAttribute('title')); + twiki.JSPopupPlugin.ajaxCall(event, url); } else { - TWiki.JSPopupPlugin.openPopup(event, sectionElem.innerHTML, sectionElem.getAttribute('location'), sectionElem.getAttribute('border'), sectionElem.getAttribute('title')); + ret = twiki.JSPopupPlugin.openPopup(event, sectionElem.innerHTML, sectionElem.getAttribute('location'), sectionElem.getAttribute('border'), sectionElem.getAttribute('title')); } } else { - TWiki.JSPopupPlugin.closePopup(event); + ret = twiki.JSPopupPlugin.closePopup(event); } + return ret; } -TWiki.JSPopupPlugin.closePopup = function (event) { +twiki.JSPopupPlugin.closePopup = function (event) { //var showControl = document.getElementById('popupwindow'); //showControl.style.display = 'none'; + return false; } -TWiki.JSPopupPlugin.openPopup = function (event, text, popuplocation, border, title) { +// Define various event handlers for Dialog +var handleSubmit = function() { + this.submit(); +}; +var handleCancel = function() { + this.cancel(); +}; + +twiki.JSPopupPlugin.openPopup = function (event, text, popuplocation, border, title) { +alert(popuplocation); if ( typeof( popuplocation ) == "undefined" ) { popuplocation = 'center'; } @@ -85,22 +104,59 @@ title = ''; } + //use popuplocation = 'center' as default + var fixedcenter = true; + var context = null; + if (popuplocation == 'below') { + if (!event) event = window.event; + alert(event); + if (event) { + var targ; + if (event.target) targ = event.target; + else if (event.srcElement) targ = event.srcElement; + if (targ.nodeType == 3) // defeat Safari bug + targ = targ.parentNode; + context = [targ, 'tl', 'bl']; + fixedcenter = false; + alert(context); + } + } + + //TODO: not sure we _want_ to allow millions of dialogs +// var myDate = new Date(); +// var dialogDiv = document.createElement('div'); +// dialogDiv.id = 'JSPopup_'+myDate.getTime(); +// document.body.appendChild(dialogDiv); +//ONE dialog only + var dialogDiv = 'win'; + //The second argument passed to the //constructor is a configuration object: - myPanel = new YAHOO.widget.Panel("win", { - width:"75%", - fixedcenter: true, + myPanel = new YAHOO.widget.Dialog(dialogDiv, { +// width:"75%", +// height:"75%", +// width:"600px", + fixedcenter: fixedcenter, + context: context, constraintoviewport: true, underlay:"none", close:true, - visible:false, - draggable:true} + visible:false, + draggable:true + } ); +// var myButtons = [ { text:"Submit", handler:handleSubmit, isDefault:true }, +// { text:"Cancel", handler:handleCancel } ]; +// myPanel.cfg.queueProperty("buttons", myButtons); +// postIt.cfg.queueProperty("postmethod", "form"); +// postIt.callback.success = onSuccess; +// postIt.callback.failure = onFailure; + if (title.length > 0) { myPanel.setHeader(title); } - myPanel.setBody(text); + myPanel.setBody('<div style="text-align:left;">'+text+'</div>'); myPanel.render(document.body); if (border != 'on') { @@ -126,10 +182,14 @@ } myPanel.show(); - return myPanel; +// if (!event) var event = window.event; +// event.cancelBubble = true; +// if (event.stopPropagation) event.stopPropagation(); + + return false; } -TWiki.JSPopupPlugin.ajaxCall = function(event, popupUrl, popupParams) { +twiki.JSPopupPlugin.ajaxCall = function(event, popupUrl, popupParams) { //TODO: redo these as params in the Args //make sure there's no popup div in the reply if (popupUrl.indexOf('?') != -1) { @@ -162,7 +222,7 @@ } } data = '<div>' + data + '</div>'; - TWiki.JSPopupPlugin.openPopup(event, data); + twiki.JSPopupPlugin.openPopup(event, data); }, failure: function(o) {alert('Error!\nStatusText='+o.statusText+'\nContents='+o.responseText);} @@ -199,7 +259,6 @@ } - //from http://weblogs.asp.net/asmith/archive/2003/10/06/30744.aspx //add an event handler so they chain, and cross browser function XBrowserAddHandler(target,eventName,handlerName) { Added: twiki/branches/MAIN/twikiplugins/JSPopupPlugin/templates/twiki.popup.tmpl =================================================================== --- twiki/branches/MAIN/twikiplugins/JSPopupPlugin/templates/twiki.popup.tmpl (rev 0) +++ twiki/branches/MAIN/twikiplugins/JSPopupPlugin/templates/twiki.popup.tmpl 2007-02-12 02:56:49 UTC (rev 12839) @@ -0,0 +1,8 @@ +%TMPL:INCLUDE{"twiki"}% +%{ popup skin - no headers or footers, just content }% +%TMPL:DEF{"htmldoctype"}%%TMPL:END% +%TMPL:DEF{"head"}%%TMPL:END% +%TMPL:DEF{"bodystart"}%%TMPL:END% +%TMPL:DEF{"main"}%<div style="text-align:left;"> +%TMPL:P{"content"}%</div>%TMPL:END% +%TMPL:DEF{"bodyend"}%%TMPL:END% Property changes on: twiki/branches/MAIN/twikiplugins/JSPopupPlugin/templates/twiki.popup.tmpl ___________________________________________________________________ Name: svn:executable + * |