From f5dea49c4ae060fdab375327a7119bcee43a1a7e Mon Sep 17 00:00:00 2001 From: Andrew Nacin Date: Mon, 15 Nov 2010 23:48:24 +0000 Subject: [PATCH] Next pass on internal linking. Functional, but needs styling. props koopersmith, see #11420. git-svn-id: https://develop.svn.wordpress.org/trunk@16393 602fd350-edb4-49c9-b593-d223f7449a82 --- .../plugins/wplink/editor_plugin.dev.js | 4 +- .../tinymce/plugins/wplink/editor_plugin.js | 2 +- .../tinymce/plugins/wplink/js/wplink.dev.js | 223 +++++------------ .../js/tinymce/wp-mce-link-includes.php | 227 ++++-------------- wp-includes/js/tinymce/wp-mce-link.php | 184 +++++++------- wp-includes/js/tinymce/wp-tinymce.js.gz | Bin 87614 -> 87611 bytes 6 files changed, 217 insertions(+), 423 deletions(-) diff --git a/wp-includes/js/tinymce/plugins/wplink/editor_plugin.dev.js b/wp-includes/js/tinymce/plugins/wplink/editor_plugin.dev.js index c420eb3ffd..77c5117e7a 100644 --- a/wp-includes/js/tinymce/plugins/wplink/editor_plugin.dev.js +++ b/wp-includes/js/tinymce/plugins/wplink/editor_plugin.dev.js @@ -13,8 +13,8 @@ ed.addCommand('WP_Link', function() { ed.windowManager.open({ file : tinymce.baseURL + '/wp-mce-link.php', - width : 320, - height : 340, + width : 480, + height : 400, inline : 1 }, { plugin_url : url // Plugin absolute URL diff --git a/wp-includes/js/tinymce/plugins/wplink/editor_plugin.js b/wp-includes/js/tinymce/plugins/wplink/editor_plugin.js index 96291e75c4..f329c78c00 100644 --- a/wp-includes/js/tinymce/plugins/wplink/editor_plugin.js +++ b/wp-includes/js/tinymce/plugins/wplink/editor_plugin.js @@ -1 +1 @@ -(function(){tinymce.create("tinymce.plugins.wpLink",{init:function(a,b){a.addCommand("WP_Link",function(){a.windowManager.open({file:tinymce.baseURL+"/wp-mce-link.php",width:320,height:340,inline:1},{plugin_url:b})});a.addButton("link",{title:a.getLang("advanced.link_desc"),cmd:"WP_Link"});a.addShortcut("alt+shift+a",a.getLang("advanced.link_desc"),"WP_Link");a.onNodeChange.add(function(d,c,e){c.setActive("wplink",e.nodeName=="A")})},getInfo:function(){return{longname:"WordPress Link Dialog",author:"WordPress",authorurl:"http://wordpress.org",infourl:"",version:"1.0"}}});tinymce.PluginManager.add("wplink",tinymce.plugins.wpLink)})(); \ No newline at end of file +(function(){tinymce.create("tinymce.plugins.wpLink",{init:function(a,b){a.addCommand("WP_Link",function(){a.windowManager.open({file:tinymce.baseURL+"/wp-mce-link.php",width:480,height:400,inline:1},{plugin_url:b})});a.addButton("link",{title:a.getLang("advanced.link_desc"),cmd:"WP_Link"});a.addShortcut("alt+shift+a",a.getLang("advanced.link_desc"),"WP_Link");a.onNodeChange.add(function(d,c,e){c.setActive("wplink",e.nodeName=="A")})},getInfo:function(){return{longname:"WordPress Link Dialog",author:"WordPress",authorurl:"http://wordpress.org",infourl:"",version:"1.0"}}});tinymce.PluginManager.add("wplink",tinymce.plugins.wpLink)})(); \ No newline at end of file diff --git a/wp-includes/js/tinymce/plugins/wplink/js/wplink.dev.js b/wp-includes/js/tinymce/plugins/wplink/js/wplink.dev.js index adec3cb19c..0e6b0b5015 100644 --- a/wp-includes/js/tinymce/plugins/wplink/js/wplink.dev.js +++ b/wp-includes/js/tinymce/plugins/wplink/js/wplink.dev.js @@ -1,137 +1,50 @@ -(function($){ - $.widget('wp.wpTabs', { - options: {}, - _create: function() { - var self = this, - ul = this.element, - lis = ul.children(); - - this.active = lis.filter('.wp-tab-active'); - // Calculate panel IDs - lis.each(function() { - var panel = self._getPanel( $(this) ); - if ( self.active[0] == this ) - panel.show(); - else - panel.hide(); - }); - - ul.delegate('li', 'click.wpTabs', function(e) { - var li = $(this); - - // Prevent any child link from redirecting the page. - e.preventDefault(); - // Deactivate previous tab. - self._getPanel( self.active ).hide(); - self.active.removeClass('wp-tab-active'); - self._trigger("hide", e, self.widget() ); - - // Activate current tab. - self.active = li.addClass('wp-tab-active'); - self._getPanel( self.active ).show(); - self._trigger("show", e, self.widget() ); - }); - }, - widget: function() { - return { - ul: this.element, - tab: this.active, - panel: this._getPanel( this.active ) - }; - }, - _setPanel: function( $el ) { - var panel = $( '#' + $el.children('.wp-tab-for-id').val() ); - $el.data( 'wp-tab-panel', panel ); - return panel; - }, - _getPanel: function( $el ) { - var panel = $el.data('wp-tab-panel'); - return ( !panel || !panel.length ) ? this._setPanel( $el ) : panel; - } - }); - // Create tab bars by default. - $(function(){ - $('.wp-tab-bar').wpTabs(); - }); -})(jQuery); - (function($){ - var inputs = {}, panels, active, ed, + var inputs = {}, results = {}, ed, wpLink = { init : function() { var e, etarget, eclass; // Init shared vars ed = tinyMCEPopup.editor; + + + // URL + inputs.url = $('#url-field'); // Secondary options inputs.title = $('#link-title-field'); // Advanced Options inputs.openInNewTab = $('#link-target-checkbox'); - - panels = $('.link-panel'); - active = $('.link-panel-active'); - $('#link-panel-tab-bar').wpTabs({ - show: function(e, widget) { - active = widget.panel; - active.addClass('link-panel-active'); - wpLink.maybeLoadPanel(); - }, - hide: function(e, widget) { - active.removeClass('link-panel-active'); - } - }) - - panels.each( function(){ - var linkType = this.id.replace(/^link-panel-id-/,''), - parts = linkType.split('-'); - $(this).data( 'link-type', { - full : linkType, - type : parts[0], - name : parts[1] || '' - }); - }); + inputs.search = $('#search-field'); + // Result lists + results.search = $('#search-results'); + results.recent = $('#most-recent-results'); // Bind event handlers $('#wp-update').click( wpLink.update ); $('#wp-cancel').click( function() { tinyMCEPopup.close(); } ); - $('.link-panel .wp-tab-bar').wpTabs('option', 'show', wpLink.maybeLoadPanel ); - $('.link-panel .wp-tab-panel').delegate('li', 'click', wpLink.selectInternalLink ); - $('.wp-tab-panel-pagelinks').delegate('a', 'click', wpLink.selectPageLink ); - $('.link-panel .link-search-field').keyup( wpLink.searchInternalLinks ); - - active.find('input.url-field').focus(); + $('.query-results').delegate('li', 'click', wpLink.selectInternalLink ); + $('.wp-results-pagelinks').delegate('a', 'click', wpLink.selectPageLink ); + inputs.search.keyup( wpLink.searchInternalLinks ); // If link exists, select proper values. - e = ed.dom.getParent(ed.selection.getNode(), 'A'); - if ( ! e ) - return; - - active.find('input.url-field').val( e.href ); - inputs.title.val( ed.dom.getAttrib(e, 'title') ); - // Advanced Options - - if ( "_blank" == ed.dom.getAttrib(e, 'target') ) - inputs.openInNewTab.attr('checked','checked'); + if ( e = ed.dom.getParent(ed.selection.getNode(), 'A') ) { + // Set URL and description. + inputs.url.val( e.href ); + inputs.title.val( ed.dom.getAttrib(e, 'title') ); + // Set open in new tab. + if ( "_blank" == ed.dom.getAttrib(e, 'target') ) + inputs.openInNewTab.attr('checked','checked'); + } }, update : function() { var el, ed = tinyMCEPopup.editor, attrs = { + href : inputs.url.val(), title : inputs.title.val(), target : inputs.openInNewTab.attr('checked') ? '_blank' : '' - }, defaultContent, e, b; - - if ( active.hasClass('link-panel-custom') ) { - attrs.href = active.find('input.url-field').val(); - defaultContent = attrs.href; - } else { - el = active.find('li.selected:visible'); - if ( !el.length ) - return; - - attrs.href = el.children('input').val(); - defaultContent = el.text(); - } + }, e, b, + defaultContent = attrs.title ? attrs.title : attrs.href; tinyMCEPopup.restoreSelection(); e = ed.dom.getParent(ed.selection.getNode(), 'A'); @@ -190,47 +103,14 @@ tinyMCEPopup.close(); }, - maybeLoadPanel : function() { - var panel = active.find('.wp-tab-panel:visible'); - if ( panel.length && panel.find('.wp-tab-panel-loading').length ) - wpLink.linkPanelAJAX( panel ); - }, - - linkPanelAJAX : function( $panel, params, callback ) { - if ( ! $panel.hasClass('wp-tab-panel') ) - $panel = $panel.parents('.wp-tab-panel'); - - if ( ! $panel.length ) - return; - - var query = $panel.children('.wp-tab-panel-query').val(); - - wpLink.linkAJAX( $panel, $.extend({ - preset : query, - page : 'all' == query ? 1 : 0 - }, params), function(r, lt) { - var pagelinks = $panel.children('.wp-tab-panel-pagelinks'); - - // Set results - $panel.children('ul').html( wpLink.generateListMarkup( r['results'], lt ) ); - - // Handle page links - if ( r['page_links'] ) - pagelinks.html( r['page_links'] ).show(); - else - pagelinks.hide(); - // Run callback - if ( callback ) - callback(r, lt); - }) - }, - selectInternalLink : function() { var t = $(this); if ( t.hasClass('unselectable') ) return; t.siblings('.selected').removeClass('selected'); t.addClass('selected'); + inputs.url.val( t.children('.item-permalink').val() ); + inputs.title.val( t.children('.item-title').text() ); }, selectPageLink : function(e) { @@ -239,37 +119,62 @@ page = page ? page[1] : 1; // If there's no match, it's the first page. e.preventDefault(); // Prevent the link from redirecting. - wpLink.linkPanelAJAX( $(this), { page : page }); + wpLink.linkAJAX( $(this), { page : page }); }, searchInternalLinks : function() { - var t = $(this), + var t = $(this), waiting, + title = t.val(); + + if ( title ) { + results.recent.hide(); + results.search.show(); waiting = t.siblings('img.waiting').show(); - - wpLink.linkPanelAJAX( t, { title : t.val() }, function(){ waiting.hide(); }); + wpLink.linkAJAX( results.search, { title : title }, function(){ waiting.hide(); }); + } else { + results.search.hide(); + results.recent.show(); + } }, - linkAJAX : function( el, params, callback ) { - var linkType = el.parents('.link-panel').data('link-type'); + linkAJAX : function( $panel, params, callback ) { + if ( ! $panel.hasClass('query-results') ) + $panel = $panel.parents('.query-results'); + + if ( ! $panel.length ) + return; + $.post( ajaxurl, $.extend({ - action : 'wp-link-ajax', - type : linkType.type, - name : linkType.name + action : 'wp-link-ajax' }, params ), function(r) { - return callback(r, linkType); + var pagelinks = $panel.children('.wp-results-pagelinks'); + + // Set results + $panel.children('ul').html( wpLink.generateListMarkup( r['results'] ) ); + + // Handle page links + if ( r['page_links'] ) + pagelinks.html( r['page_links'] ).show(); + else + pagelinks.hide(); + + // Run callback + if ( callback ) + callback( r['results'] ); }, "json" ); }, - generateListMarkup : function( results, linkType ) { + generateListMarkup : function( results ) { var s = ''; if ( ! results ) - return '
  • ' + wpLinkL10n.noMatchesFound + '
  • '; + return '
  • ' + wpLinkL10n.noMatchesFound + '
  • '; $.each( results, function() { - s+= '
  • '; + s+= '' s+= this['title'] ? this['title'] : ''+ wpLinkL10n.untitled + ''; + s+= '' + this['info'] + ''; s+= '
  • '; }); return s; diff --git a/wp-includes/js/tinymce/wp-mce-link-includes.php b/wp-includes/js/tinymce/wp-mce-link-includes.php index 87a81fb142..b484603753 100644 --- a/wp-includes/js/tinymce/wp-mce-link-includes.php +++ b/wp-includes/js/tinymce/wp-mce-link-includes.php @@ -1,151 +1,35 @@ true ), 'objects' ); + $pt_names = array_keys( $pts ); -class WP_Tab_Bar { - var $tabs = array(); - - var $id = ''; - var $classes = array(); - - var $selected = ''; - - function add( $id, $label, $url='' ) { - array_push( $this->tabs, array( - 'label' => $label, - 'for' => $id, - 'url' => $url - )); - } - - function select( $id ) { - $this->selected = $id; - } - - function render( $echo=true ) { - if ( empty( $this->selected ) ) - $this->selected = $this->tabs[0]['for']; - - array_unshift( $this->classes, 'wp-tab-bar' ); - - $out = "