diff options
| -rw-r--r-- | app/controllers/admin_controller.rb | 2 | ||||
| -rw-r--r-- | app/controllers/nodes_controller.rb | 8 | ||||
| -rw-r--r-- | app/views/layouts/admin.html.erb | 29 | ||||
| -rw-r--r-- | app/views/nodes/edit.html.erb | 7 | ||||
| -rw-r--r-- | app/views/nodes/show.html.erb | 40 | ||||
| -rw-r--r-- | doc/cccms_model.graffle | bin | 723967 -> 412161 bytes | |||
| -rw-r--r-- | public/javascripts/admin_interface.js | 7 | ||||
| -rw-r--r-- | public/javascripts/admin_search.js | 62 | ||||
| -rwxr-xr-x | public/javascripts/jquery.hotkeys.js | 244 | ||||
| -rw-r--r-- | public/stylesheets/admin.css | 64 |
10 files changed, 394 insertions, 69 deletions
diff --git a/app/controllers/admin_controller.rb b/app/controllers/admin_controller.rb index 8d7d2ea..517506f 100644 --- a/app/controllers/admin_controller.rb +++ b/app/controllers/admin_controller.rb | |||
| @@ -19,7 +19,7 @@ class AdminController < ApplicationController | |||
| 19 | format.html | 19 | format.html |
| 20 | format.js do | 20 | format.js do |
| 21 | render( :json => @results.map do |node| | 21 | render( :json => @results.map do |node| |
| 22 | {:id => node.id, :title => node.title} | 22 | {:id => node.id, :title => node.title, :edit_path => node_path(node)} |
| 23 | end | 23 | end |
| 24 | ) | 24 | ) |
| 25 | 25 | ||
diff --git a/app/controllers/nodes_controller.rb b/app/controllers/nodes_controller.rb index 1c7278c..09d0c52 100644 --- a/app/controllers/nodes_controller.rb +++ b/app/controllers/nodes_controller.rb | |||
| @@ -40,14 +40,6 @@ class NodesController < ApplicationController | |||
| 40 | 40 | ||
| 41 | def show | 41 | def show |
| 42 | @page = Node.find(params[:id]).pages.last | 42 | @page = Node.find(params[:id]).pages.last |
| 43 | |||
| 44 | if @page | ||
| 45 | template = @page.valid_template | ||
| 46 | render( | ||
| 47 | :file => template, | ||
| 48 | :layout => "application" | ||
| 49 | ) | ||
| 50 | end | ||
| 51 | end | 43 | end |
| 52 | 44 | ||
| 53 | def edit | 45 | def edit |
diff --git a/app/views/layouts/admin.html.erb b/app/views/layouts/admin.html.erb index fea6b5a..1c985d9 100644 --- a/app/views/layouts/admin.html.erb +++ b/app/views/layouts/admin.html.erb | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | <%= javascript_include_tag 'tiny_mce/tiny_mce.js' %> | 11 | <%= javascript_include_tag 'tiny_mce/tiny_mce.js' %> |
| 12 | <%= javascript_include_tag 'admin_search.js' %> | 12 | <%= javascript_include_tag 'admin_search.js' %> |
| 13 | <%= javascript_include_tag 'admin_interface.js' %> | 13 | <%= javascript_include_tag 'admin_interface.js' %> |
| 14 | <%= javascript_include_tag 'jquery.hotkeys' %> | ||
| 14 | 15 | ||
| 15 | <script type="text/javascript"> | 16 | <script type="text/javascript"> |
| 16 | tinyMCE.init({ | 17 | tinyMCE.init({ |
| @@ -34,17 +35,14 @@ | |||
| 34 | <body> | 35 | <body> |
| 35 | <div id="wrapper"> | 36 | <div id="wrapper"> |
| 36 | <div id="navigation"> | 37 | <div id="navigation"> |
| 37 | <%= render :partial => 'admin/menu' if current_user %> | 38 | <div id="main_navigation"> |
| 39 | <%= render :partial => 'admin/menu' if current_user %> | ||
| 40 | </div> | ||
| 41 | <div id="sub_navigation"> | ||
| 42 | <%= yield :subnavigation %> | ||
| 43 | </div> | ||
| 38 | </div> | 44 | </div> |
| 39 | <div id="subnavigation"> | 45 | <div style="clear: both;"></div> |
| 40 | <%= yield :subnavigation %> | ||
| 41 | </div> | ||
| 42 | <div id="admin_search"> | ||
| 43 | <% form_tag admin_search_path do %> | ||
| 44 | <%= text_field_tag :search_term %> | ||
| 45 | <% end %> | ||
| 46 | </div> | ||
| 47 | <div style="clear: both"></div> | ||
| 48 | <div id="flash"> | 46 | <div id="flash"> |
| 49 | <%= flash[:notice] %> | 47 | <%= flash[:notice] %> |
| 50 | </div> | 48 | </div> |
| @@ -54,5 +52,16 @@ | |||
| 54 | 52 | ||
| 55 | <div id="results"></div> | 53 | <div id="results"></div> |
| 56 | </div> | 54 | </div> |
| 55 | |||
| 56 | <div id="search_widget"> | ||
| 57 | <div> | ||
| 58 | <% form_tag admin_search_path do %> | ||
| 59 | <span>Search: </span><%= text_field_tag :search_term %> | ||
| 60 | <% end %> | ||
| 61 | </div> | ||
| 62 | <div id="search_results" style="display: none"> | ||
| 63 | |||
| 64 | </div> | ||
| 65 | </div> | ||
| 57 | </body> | 66 | </body> |
| 58 | </html> | 67 | </html> |
diff --git a/app/views/nodes/edit.html.erb b/app/views/nodes/edit.html.erb index e957b5d..f37a24b 100644 --- a/app/views/nodes/edit.html.erb +++ b/app/views/nodes/edit.html.erb | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | <% content_for :subnavigation do %> | 1 | <% content_for :subnavigation do %> |
| 2 | <%= link_to 'metadata', '#', :id => 'button', :class => "unselected" %> | 2 | <%= link_to 'metadata', '#', :id => 'button', :class => "unselected" %> |
| 3 | <%= link_to 'Preview', @node %> | 3 | <%= link_to 'Show', @node %> |
| 4 | <%= link_to 'Preview', preview_page_path(@draft) %> | ||
| 4 | <%= link_to 'Publish', publish_node_path, :method => :put, :confirm => "Publish this draft?" %> | 5 | <%= link_to 'Publish', publish_node_path, :method => :put, :confirm => "Publish this draft?" %> |
| 5 | <%= link_to 'Revisions', revision_path(params[:id]) %> | 6 | <%= link_to 'Revisions', revision_path(params[:id]) %> |
| 6 | <% end %> | 7 | <% end %> |
| @@ -36,6 +37,10 @@ | |||
| 36 | 37 | ||
| 37 | <table id="content"> | 38 | <table id="content"> |
| 38 | <tr> | 39 | <tr> |
| 40 | <th class="description"></th> | ||
| 41 | <th class="content"></th> | ||
| 42 | </tr> | ||
| 43 | <tr> | ||
| 39 | <td class="description">Title</td> | 44 | <td class="description">Title</td> |
| 40 | <td><%= d.text_field :title %></td> | 45 | <td><%= d.text_field :title %></td> |
| 41 | </tr> | 46 | </tr> |
diff --git a/app/views/nodes/show.html.erb b/app/views/nodes/show.html.erb index bbbefe9..8aaedc5 100644 --- a/app/views/nodes/show.html.erb +++ b/app/views/nodes/show.html.erb | |||
| @@ -1,9 +1,31 @@ | |||
| 1 | <h1>Node</h1> | 1 | <% content_for :subnavigation do %> |
| 2 | <p> | 2 | <%= link_to 'Edit', edit_node_path(@node), :id => 'button', :class => "unselected" %> |
| 3 | There is no draft to preview. Click <%= link_to 'edit', edit_node_path %> to | 3 | <%= link_to 'Preview', preview_page_path(@page) %> |
| 4 | create one or view the currently | 4 | <%= link_to 'Revisions', revision_path(params[:id]) %> |
| 5 | <%= link_to_path 'published version', @node.unique_path %>. | 5 | <% end %> |
| 6 | </p> | 6 | |
| 7 | <p> | 7 | |
| 8 | View the revisions of this node | 8 | <div id="page_editor" class="show_node"> |
| 9 | </p> \ No newline at end of file | 9 | <table id="content"> |
| 10 | <tr> | ||
| 11 | <th class="description"></th> | ||
| 12 | <th class="content"></th> | ||
| 13 | </tr> | ||
| 14 | <tr> | ||
| 15 | <td class="description">Title</td> | ||
| 16 | <td><%= @page.title %></td> | ||
| 17 | </tr> | ||
| 18 | <tr> | ||
| 19 | <td class="description">Abstract</td> | ||
| 20 | <td><%= @page.abstract %></td> | ||
| 21 | </tr> | ||
| 22 | <tr> | ||
| 23 | <td class="description">Body</td> | ||
| 24 | <td><%= @page.body %></td> | ||
| 25 | </tr> | ||
| 26 | <tr> | ||
| 27 | <td></td> | ||
| 28 | <td class="right"></td> | ||
| 29 | </tr> | ||
| 30 | </table> | ||
| 31 | </div> \ No newline at end of file | ||
diff --git a/doc/cccms_model.graffle b/doc/cccms_model.graffle index 86d3ab2..dd7b325 100644 --- a/doc/cccms_model.graffle +++ b/doc/cccms_model.graffle | |||
| Binary files differ | |||
diff --git a/public/javascripts/admin_interface.js b/public/javascripts/admin_interface.js index 5fe91a2..f890afb 100644 --- a/public/javascripts/admin_interface.js +++ b/public/javascripts/admin_interface.js | |||
| @@ -1,5 +1,10 @@ | |||
| 1 | $(document).ready(function () { | 1 | $(document).ready(function () { |
| 2 | admin_search.initialize(); | 2 | $("#search_widget").hide(); |
| 3 | |||
| 4 | $(document).bind("keydown", 'Alt+f', function(){ | ||
| 5 | admin_search.display_toggle(); | ||
| 6 | return false; | ||
| 7 | }); | ||
| 3 | 8 | ||
| 4 | $("#metadata").attr("style", "display: none;"); | 9 | $("#metadata").attr("style", "display: none;"); |
| 5 | 10 | ||
diff --git a/public/javascripts/admin_search.js b/public/javascripts/admin_search.js index d645cca..ba52bb5 100644 --- a/public/javascripts/admin_search.js +++ b/public/javascripts/admin_search.js | |||
| @@ -1,28 +1,40 @@ | |||
| 1 | admin_search = { | 1 | admin_search = { |
| 2 | 2 | ||
| 3 | initialize : function() { | 3 | display_toggle : function() { |
| 4 | $("#search_term").bind("keyup", function() { | 4 | if ($('#search_widget').css("display") != "none") { |
| 5 | if ($(this).attr("value")) { | 5 | $('#search_widget').fadeOut(); |
| 6 | $.ajax({ | ||
| 7 | type: "GET", | ||
| 8 | url: "/admin/search", | ||
| 9 | data: "search_term=" + $(this).attr("value"), | ||
| 10 | dataType: "json", | ||
| 11 | success : function(results) { | ||
| 12 | admin_search.show_results(results); | ||
| 13 | } | ||
| 14 | }); | ||
| 15 | } | ||
| 16 | else { | ||
| 17 | $('#results').empty(); | ||
| 18 | } | ||
| 19 | }); | ||
| 20 | }, | ||
| 21 | |||
| 22 | show_results : function(results) { | ||
| 23 | $('#results').empty(); | ||
| 24 | for (result in results) { | ||
| 25 | $('#results').append("<p>" + results[result].title + "</p>"); | ||
| 26 | } | 6 | } |
| 27 | } | 7 | else { |
| 28 | } \ No newline at end of file | 8 | $('#search_widget').fadeIn(); |
| 9 | $('#search_term').attr("value", ""); | ||
| 10 | $('#search_term').focus(); | ||
| 11 | } | ||
| 12 | |||
| 13 | $("#search_term").bind("keyup", function() { | ||
| 14 | if ($(this).attr("value")) { | ||
| 15 | $.ajax({ | ||
| 16 | type: "GET", | ||
| 17 | url: "/admin/search", | ||
| 18 | data: "search_term=" + $(this).attr("value"), | ||
| 19 | dataType: "json", | ||
| 20 | success : function(results) { | ||
| 21 | admin_search.show_results(results); | ||
| 22 | } | ||
| 23 | }); | ||
| 24 | } | ||
| 25 | else { | ||
| 26 | $('#search_results').slideUp(); | ||
| 27 | $('#search_results').empty(); | ||
| 28 | } | ||
| 29 | }); | ||
| 30 | }, | ||
| 31 | |||
| 32 | show_results : function(results) { | ||
| 33 | $('#search_results').empty(); | ||
| 34 | for (result in results) { | ||
| 35 | $('#search_results').append("<p><a href='"+ results[result].edit_path + "'>" + results[result].title + "</a></p>"); | ||
| 36 | } | ||
| 37 | $('#search_results').slideDown(); | ||
| 38 | } | ||
| 39 | |||
| 40 | } \ No newline at end of file | ||
diff --git a/public/javascripts/jquery.hotkeys.js b/public/javascripts/jquery.hotkeys.js new file mode 100755 index 0000000..9a8f2de --- /dev/null +++ b/public/javascripts/jquery.hotkeys.js | |||
| @@ -0,0 +1,244 @@ | |||
| 1 | /* | ||
| 2 | (c) Copyrights 2007 - 2008 | ||
| 3 | |||
| 4 | Original idea by by Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/ | ||
| 5 | |||
| 6 | jQuery Plugin by Tzury Bar Yochay | ||
| 7 | tzury.by@gmail.com | ||
| 8 | http://evalinux.wordpress.com | ||
| 9 | http://facebook.com/profile.php?id=513676303 | ||
| 10 | |||
| 11 | Project's sites: | ||
| 12 | http://code.google.com/p/js-hotkeys/ | ||
| 13 | http://github.com/tzuryby/hotkeys/tree/master | ||
| 14 | |||
| 15 | License: same as jQuery license. | ||
| 16 | |||
| 17 | USAGE: | ||
| 18 | // simple usage | ||
| 19 | $(document).bind('keydown', 'Ctrl+c', function(){ alert('copy anyone?');}); | ||
| 20 | |||
| 21 | // special options such as disableInIput | ||
| 22 | $(document).bind('keydown', {combi:'Ctrl+x', disableInInput: true} , function() {}); | ||
| 23 | |||
| 24 | Note: | ||
| 25 | This plugin wraps the following jQuery methods: $.fn.find, $.fn.bind and $.fn.unbind | ||
| 26 | */ | ||
| 27 | |||
| 28 | (function (jQuery){ | ||
| 29 | // keep reference to the original $.fn.bind, $.fn.unbind and $.fn.find | ||
| 30 | jQuery.fn.__bind__ = jQuery.fn.bind; | ||
| 31 | jQuery.fn.__unbind__ = jQuery.fn.unbind; | ||
| 32 | jQuery.fn.__find__ = jQuery.fn.find; | ||
| 33 | |||
| 34 | var hotkeys = { | ||
| 35 | version: '0.7.9', | ||
| 36 | override: /keypress|keydown|keyup/g, | ||
| 37 | triggersMap: {}, | ||
| 38 | |||
| 39 | specialKeys: { 27: 'esc', 9: 'tab', 32:'space', 13: 'return', 8:'backspace', 145: 'scroll', | ||
| 40 | 20: 'capslock', 144: 'numlock', 19:'pause', 45:'insert', 36:'home', 46:'del', | ||
| 41 | 35:'end', 33: 'pageup', 34:'pagedown', 37:'left', 38:'up', 39:'right',40:'down', | ||
| 42 | 109: '-', | ||
| 43 | 112:'f1',113:'f2', 114:'f3', 115:'f4', 116:'f5', 117:'f6', 118:'f7', 119:'f8', | ||
| 44 | 120:'f9', 121:'f10', 122:'f11', 123:'f12', 191: '/'}, | ||
| 45 | |||
| 46 | shiftNums: { "`":"~", "1":"!", "2":"@", "3":"#", "4":"$", "5":"%", "6":"^", "7":"&", | ||
| 47 | "8":"*", "9":"(", "0":")", "-":"_", "=":"+", ";":":", "'":"\"", ",":"<", | ||
| 48 | ".":">", "/":"?", "\\":"|" }, | ||
| 49 | |||
| 50 | newTrigger: function (type, combi, callback) { | ||
| 51 | // i.e. {'keyup': {'ctrl': {cb: callback, disableInInput: false}}} | ||
| 52 | var result = {}; | ||
| 53 | result[type] = {}; | ||
| 54 | result[type][combi] = {cb: callback, disableInInput: false}; | ||
| 55 | return result; | ||
| 56 | } | ||
| 57 | }; | ||
| 58 | // add firefox num pad char codes | ||
| 59 | //if (jQuery.browser.mozilla){ | ||
| 60 | // add num pad char codes | ||
| 61 | hotkeys.specialKeys = jQuery.extend(hotkeys.specialKeys, { 96: '0', 97:'1', 98: '2', 99: | ||
| 62 | '3', 100: '4', 101: '5', 102: '6', 103: '7', 104: '8', 105: '9', 106: '*', | ||
| 63 | 107: '+', 109: '-', 110: '.', 111 : '/' | ||
| 64 | }); | ||
| 65 | //} | ||
| 66 | |||
| 67 | // a wrapper around of $.fn.find | ||
| 68 | // see more at: http://groups.google.com/group/jquery-en/browse_thread/thread/18f9825e8d22f18d | ||
| 69 | jQuery.fn.find = function( selector ) { | ||
| 70 | this.query = selector; | ||
| 71 | return jQuery.fn.__find__.apply(this, arguments); | ||
| 72 | }; | ||
| 73 | |||
| 74 | jQuery.fn.unbind = function (type, combi, fn){ | ||
| 75 | if (jQuery.isFunction(combi)){ | ||
| 76 | fn = combi; | ||
| 77 | combi = null; | ||
| 78 | } | ||
| 79 | if (combi && typeof combi === 'string'){ | ||
| 80 | var selectorId = ((this.prevObject && this.prevObject.query) || (this[0].id && this[0].id) || this[0]).toString(); | ||
| 81 | var hkTypes = type.split(' '); | ||
| 82 | for (var x=0; x<hkTypes.length; x++){ | ||
| 83 | delete hotkeys.triggersMap[selectorId][hkTypes[x]][combi]; | ||
| 84 | } | ||
| 85 | } | ||
| 86 | // call jQuery original unbind | ||
| 87 | return this.__unbind__(type, fn); | ||
| 88 | }; | ||
| 89 | |||
| 90 | jQuery.fn.bind = function(type, data, fn){ | ||
| 91 | // grab keyup,keydown,keypress | ||
| 92 | var handle = type.match(hotkeys.override); | ||
| 93 | |||
| 94 | if (jQuery.isFunction(data) || !handle){ | ||
| 95 | // call jQuery.bind only | ||
| 96 | return this.__bind__(type, data, fn); | ||
| 97 | } | ||
| 98 | else{ | ||
| 99 | // split the job | ||
| 100 | var result = null, | ||
| 101 | // pass the rest to the original $.fn.bind | ||
| 102 | pass2jq = jQuery.trim(type.replace(hotkeys.override, '')); | ||
| 103 | |||
| 104 | // see if there are other types, pass them to the original $.fn.bind | ||
| 105 | if (pass2jq){ | ||
| 106 | result = this.__bind__(pass2jq, data, fn); | ||
| 107 | } | ||
| 108 | |||
| 109 | if (typeof data === "string"){ | ||
| 110 | data = {'combi': data}; | ||
| 111 | } | ||
| 112 | if(data.combi){ | ||
| 113 | for (var x=0; x < handle.length; x++){ | ||
| 114 | var eventType = handle[x]; | ||
| 115 | var combi = data.combi.toLowerCase(), | ||
| 116 | trigger = hotkeys.newTrigger(eventType, combi, fn), | ||
| 117 | selectorId = ((this.prevObject && this.prevObject.query) || (this[0].id && this[0].id) || this[0]).toString(); | ||
| 118 | |||
| 119 | //trigger[eventType][combi].propagate = data.propagate; | ||
| 120 | trigger[eventType][combi].disableInInput = data.disableInInput; | ||
| 121 | |||
| 122 | // first time selector is bounded | ||
| 123 | if (!hotkeys.triggersMap[selectorId]) { | ||
| 124 | hotkeys.triggersMap[selectorId] = trigger; | ||
| 125 | } | ||
| 126 | // first time selector is bounded with this type | ||
| 127 | else if (!hotkeys.triggersMap[selectorId][eventType]) { | ||
| 128 | hotkeys.triggersMap[selectorId][eventType] = trigger[eventType]; | ||
| 129 | } | ||
| 130 | // make trigger point as array so more than one handler can be bound | ||
| 131 | var mapPoint = hotkeys.triggersMap[selectorId][eventType][combi]; | ||
| 132 | if (!mapPoint){ | ||
| 133 | hotkeys.triggersMap[selectorId][eventType][combi] = [trigger[eventType][combi]]; | ||
| 134 | } | ||
| 135 | else if (mapPoint.constructor !== Array){ | ||
| 136 | hotkeys.triggersMap[selectorId][eventType][combi] = [mapPoint]; | ||
| 137 | } | ||
| 138 | else { | ||
| 139 | hotkeys.triggersMap[selectorId][eventType][combi][mapPoint.length] = trigger[eventType][combi]; | ||
| 140 | } | ||
| 141 | |||
| 142 | // add attribute and call $.event.add per matched element | ||
| 143 | this.each(function(){ | ||
| 144 | // jQuery wrapper for the current element | ||
| 145 | var jqElem = jQuery(this); | ||
| 146 | |||
| 147 | // element already associated with another collection | ||
| 148 | if (jqElem.attr('hkId') && jqElem.attr('hkId') !== selectorId){ | ||
| 149 | selectorId = jqElem.attr('hkId') + ";" + selectorId; | ||
| 150 | } | ||
| 151 | jqElem.attr('hkId', selectorId); | ||
| 152 | }); | ||
| 153 | result = this.__bind__(handle.join(' '), data, hotkeys.handler) | ||
| 154 | } | ||
| 155 | } | ||
| 156 | return result; | ||
| 157 | } | ||
| 158 | }; | ||
| 159 | // work-around for opera and safari where (sometimes) the target is the element which was last | ||
| 160 | // clicked with the mouse and not the document event it would make sense to get the document | ||
| 161 | hotkeys.findElement = function (elem){ | ||
| 162 | if (!jQuery(elem).attr('hkId')){ | ||
| 163 | if (jQuery.browser.opera || jQuery.browser.safari){ | ||
| 164 | while (!jQuery(elem).attr('hkId') && elem.parentNode){ | ||
| 165 | elem = elem.parentNode; | ||
| 166 | } | ||
| 167 | } | ||
| 168 | } | ||
| 169 | return elem; | ||
| 170 | }; | ||
| 171 | // the event handler | ||
| 172 | hotkeys.handler = function(event) { | ||
| 173 | var target = hotkeys.findElement(event.currentTarget), | ||
| 174 | jTarget = jQuery(target), | ||
| 175 | ids = jTarget.attr('hkId'); | ||
| 176 | |||
| 177 | if(ids){ | ||
| 178 | ids = ids.split(';'); | ||
| 179 | var code = event.which, | ||
| 180 | type = event.type, | ||
| 181 | special = hotkeys.specialKeys[code], | ||
| 182 | // prevent f5 overlapping with 't' (or f4 with 's', etc.) | ||
| 183 | character = !special && String.fromCharCode(code).toLowerCase(), | ||
| 184 | shift = event.shiftKey, | ||
| 185 | ctrl = event.ctrlKey, | ||
| 186 | // patch for jquery 1.2.5 && 1.2.6 see more at: | ||
| 187 | // http://groups.google.com/group/jquery-en/browse_thread/thread/83e10b3bb1f1c32b | ||
| 188 | alt = event.altKey || event.originalEvent.altKey, | ||
| 189 | mapPoint = null; | ||
| 190 | |||
| 191 | for (var x=0; x < ids.length; x++){ | ||
| 192 | if (hotkeys.triggersMap[ids[x]][type]){ | ||
| 193 | mapPoint = hotkeys.triggersMap[ids[x]][type]; | ||
| 194 | break; | ||
| 195 | } | ||
| 196 | } | ||
| 197 | |||
| 198 | //find by: id.type.combi.options | ||
| 199 | if (mapPoint){ | ||
| 200 | var trigger; | ||
| 201 | // event type is associated with the hkId | ||
| 202 | if(!shift && !ctrl && !alt) { // No Modifiers | ||
| 203 | trigger = mapPoint[special] || (character && mapPoint[character]); | ||
| 204 | } | ||
| 205 | else{ | ||
| 206 | // check combinations (alt|ctrl|shift+anything) | ||
| 207 | var modif = ''; | ||
| 208 | if(alt) modif +='alt+'; | ||
| 209 | if(ctrl) modif+= 'ctrl+'; | ||
| 210 | if(shift) modif += 'shift+'; | ||
| 211 | // modifiers + special keys or modifiers + character or modifiers + shift character or just shift character | ||
| 212 | trigger = mapPoint[modif+special]; | ||
| 213 | if (!trigger){ | ||
| 214 | if (character){ | ||
| 215 | trigger = mapPoint[modif+character] | ||
| 216 | || mapPoint[modif+hotkeys.shiftNums[character]] | ||
| 217 | // '$' can be triggered as 'Shift+4' or 'Shift+$' or just '$' | ||
| 218 | || (modif === 'shift+' && mapPoint[hotkeys.shiftNums[character]]); | ||
| 219 | } | ||
| 220 | } | ||
| 221 | } | ||
| 222 | if (trigger){ | ||
| 223 | var result = false; | ||
| 224 | for (var x=0; x < trigger.length; x++){ | ||
| 225 | if(trigger[x].disableInInput){ | ||
| 226 | // double check event.currentTarget and event.target | ||
| 227 | var elem = jQuery(event.target); | ||
| 228 | if (jTarget.is("input") || jTarget.is("textarea") || jTarget.is("select") | ||
| 229 | || elem.is("input") || elem.is("textarea") || elem.is("select")) { | ||
| 230 | return true; | ||
| 231 | } | ||
| 232 | } | ||
| 233 | // call the registered callback function | ||
| 234 | result = result || trigger[x].cb.apply(this, [event]); | ||
| 235 | } | ||
| 236 | return result; | ||
| 237 | } | ||
| 238 | } | ||
| 239 | } | ||
| 240 | }; | ||
| 241 | // place it under window so it can be extended and overridden by others | ||
| 242 | window.hotkeys = hotkeys; | ||
| 243 | return jQuery; | ||
| 244 | })(jQuery); | ||
diff --git a/public/stylesheets/admin.css b/public/stylesheets/admin.css index e077918..faebbea 100644 --- a/public/stylesheets/admin.css +++ b/public/stylesheets/admin.css | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | body { | 3 | body { |
| 4 | font-family: Helvetica, Arial, sans-serif; | 4 | font-family: Helvetica, Arial, sans-serif; |
| 5 | font-size: 12px; | 5 | font-size: 12px; |
| 6 | margin: 0px; | ||
| 6 | } | 7 | } |
| 7 | 8 | ||
| 8 | a { | 9 | a { |
| @@ -64,33 +65,38 @@ div.pagination span.current, div.pagination a:hover { | |||
| 64 | text-align: right; | 65 | text-align: right; |
| 65 | } | 66 | } |
| 66 | 67 | ||
| 67 | #navigation, #subnavigation { | 68 | #navigation { |
| 68 | margin-left: 0px; | 69 | position: relative; |
| 70 | margin-top: 10px; | ||
| 71 | } | ||
| 72 | |||
| 73 | #navigation div { | ||
| 69 | float: left; | 74 | float: left; |
| 70 | } | 75 | } |
| 71 | 76 | ||
| 77 | |||
| 72 | #navigation a:hover { | 78 | #navigation a:hover { |
| 73 | color: #ffffff; | 79 | color: #ffffff; |
| 74 | background-color: #000000; | 80 | background-color: #000000; |
| 75 | } | 81 | } |
| 76 | 82 | ||
| 77 | #navigation a, #subnavigation a { | 83 | #main_navigation a, #sub_navigation a { |
| 78 | letter-spacing: 1px; | 84 | letter-spacing: 1px; |
| 79 | padding-left: 5px; | 85 | padding-left: 5px; |
| 80 | padding-right: 5px; | 86 | padding-right: 5px; |
| 81 | text-transform: lowercase; | 87 | text-transform: lowercase; |
| 82 | } | 88 | } |
| 83 | 89 | ||
| 84 | #subnavigation a { | 90 | #sub_navigation a { |
| 85 | color: #969696; | 91 | color: #969696; |
| 86 | } | 92 | } |
| 87 | 93 | ||
| 88 | #subnavigation a:hover { | 94 | #sub_navigation a:hover { |
| 89 | color: #ffffff; | 95 | color: #ffffff; |
| 90 | background-color: #ff9600; | 96 | background-color: #ff9600; |
| 91 | } | 97 | } |
| 92 | 98 | ||
| 93 | #subnavigation a.selected { | 99 | #sub_navigation a.selected { |
| 94 | color: #ffffff; | 100 | color: #ffffff; |
| 95 | background-color: #ff9600; | 101 | background-color: #ff9600; |
| 96 | } | 102 | } |
| @@ -100,9 +106,6 @@ div.pagination span.current, div.pagination a:hover { | |||
| 100 | background-color: #000000; | 106 | background-color: #000000; |
| 101 | } | 107 | } |
| 102 | 108 | ||
| 103 | #admin_search { | ||
| 104 | } | ||
| 105 | |||
| 106 | /* Nodes */ | 109 | /* Nodes */ |
| 107 | 110 | ||
| 108 | table#node_table { | 111 | table#node_table { |
| @@ -211,12 +214,10 @@ input[type=text]#page_title { | |||
| 211 | } | 214 | } |
| 212 | 215 | ||
| 213 | input[type=text]#tag_list { | 216 | input[type=text]#tag_list { |
| 214 | width: 690px; | ||
| 215 | padding: 5px; | 217 | padding: 5px; |
| 216 | } | 218 | } |
| 217 | 219 | ||
| 218 | input[type=text]#node_slug { | 220 | input[type=text]#node_slug { |
| 219 | width: 690px; | ||
| 220 | padding: 5px; | 221 | padding: 5px; |
| 221 | } | 222 | } |
| 222 | 223 | ||
| @@ -235,14 +236,14 @@ input[type=radio] { | |||
| 235 | } | 236 | } |
| 236 | 237 | ||
| 237 | textarea#page_abstract { | 238 | textarea#page_abstract { |
| 238 | height: 150px; | ||
| 239 | width: 690px; | 239 | width: 690px; |
| 240 | height: 150px; | ||
| 240 | padding: 5px; | 241 | padding: 5px; |
| 241 | } | 242 | } |
| 242 | 243 | ||
| 243 | #page_editor textarea#page_body { | 244 | #page_editor textarea#page_body { |
| 244 | height: 600px; | ||
| 245 | width: 700px; | 245 | width: 700px; |
| 246 | height: 600px; | ||
| 246 | } | 247 | } |
| 247 | 248 | ||
| 248 | #page_editor #metadata, #page_editor #content { | 249 | #page_editor #metadata, #page_editor #content { |
| @@ -303,4 +304,39 @@ div#draft_list table tr:hover { | |||
| 303 | table tr.header { | 304 | table tr.header { |
| 304 | height: 20px; | 305 | height: 20px; |
| 305 | text-align: left; | 306 | text-align: left; |
| 306 | } \ No newline at end of file | 307 | } |
| 308 | |||
| 309 | #search_widget { | ||
| 310 | position: absolute; | ||
| 311 | top: 20px; | ||
| 312 | left: 400px; | ||
| 313 | width: 300px; | ||
| 314 | border: 1px solid #000000; | ||
| 315 | -webkit-box-shadow: 3px 3px 5px #b1b1b1; | ||
| 316 | -moz-box-shadow: 10px 10px 5px #888, 10px 10px 30px rgba(0,0,0,0.4); | ||
| 317 | background-color: #ffffff; | ||
| 318 | padding: 3px; | ||
| 319 | text-align: center; | ||
| 320 | } | ||
| 321 | |||
| 322 | #search_widget span { | ||
| 323 | font-size: 18px; | ||
| 324 | } | ||
| 325 | |||
| 326 | #search_widget input { | ||
| 327 | width: 210px; | ||
| 328 | font-size: 18px; | ||
| 329 | } | ||
| 330 | |||
| 331 | #search_widget #search_results { | ||
| 332 | padding: 4px; | ||
| 333 | text-align: left; | ||
| 334 | } | ||
| 335 | |||
| 336 | table#content th.description { | ||
| 337 | width: 100px; | ||
| 338 | } | ||
| 339 | |||
| 340 | table#content th.content { | ||
| 341 | width: 690px; | ||
| 342 | } | ||
