##// END OF EJS Templates
Changed the notifications to use a hierarchy UI...
Eric Davis -
r4108:26ef9da02b7e
parent child
Show More
@@ -1,74 +1,84
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2009 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 module SettingsHelper
19 19 def administration_settings_tabs
20 20 tabs = [{:name => 'general', :partial => 'settings/general', :label => :label_general},
21 21 {:name => 'display', :partial => 'settings/display', :label => :label_display},
22 22 {:name => 'authentication', :partial => 'settings/authentication', :label => :label_authentication},
23 23 {:name => 'projects', :partial => 'settings/projects', :label => :label_project_plural},
24 24 {:name => 'issues', :partial => 'settings/issues', :label => :label_issue_tracking},
25 25 {:name => 'notifications', :partial => 'settings/notifications', :label => :field_mail_notification},
26 26 {:name => 'mail_handler', :partial => 'settings/mail_handler', :label => :label_incoming_emails},
27 27 {:name => 'repositories', :partial => 'settings/repositories', :label => :label_repository_plural}
28 28 ]
29 29 end
30 30
31 31 def setting_select(setting, choices, options={})
32 32 if blank_text = options.delete(:blank)
33 33 choices = [[blank_text.is_a?(Symbol) ? l(blank_text) : blank_text, '']] + choices
34 34 end
35 35 setting_label(setting, options) +
36 36 select_tag("settings[#{setting}]", options_for_select(choices, Setting.send(setting).to_s), options)
37 37 end
38 38
39 39 def setting_multiselect(setting, choices, options={})
40 40 setting_values = Setting.send(setting)
41 41 setting_values = [] unless setting_values.is_a?(Array)
42 42
43 43 setting_label(setting, options) +
44 44 hidden_field_tag("settings[#{setting}][]", '') +
45 45 choices.collect do |choice|
46 46 text, value = (choice.is_a?(Array) ? choice : [choice, choice])
47 47 content_tag('label',
48 48 check_box_tag("settings[#{setting}][]", value, Setting.send(setting).include?(value)) + text.to_s,
49 49 :class => 'block'
50 50 )
51 51 end.join
52 52 end
53 53
54 54 def setting_text_field(setting, options={})
55 55 setting_label(setting, options) +
56 56 text_field_tag("settings[#{setting}]", Setting.send(setting), options)
57 57 end
58 58
59 59 def setting_text_area(setting, options={})
60 60 setting_label(setting, options) +
61 61 text_area_tag("settings[#{setting}]", Setting.send(setting), options)
62 62 end
63 63
64 64 def setting_check_box(setting, options={})
65 65 setting_label(setting, options) +
66 66 hidden_field_tag("settings[#{setting}]", 0) +
67 67 check_box_tag("settings[#{setting}]", 1, Setting.send("#{setting}?"), options)
68 68 end
69 69
70 70 def setting_label(setting, options={})
71 71 label = options.delete(:label)
72 72 label != false ? content_tag("label", l(label || "setting_#{setting}")) : ''
73 73 end
74
75 # Renders a notification field for a Redmine::Notifiable option
76 def notification_field(notifiable)
77 return content_tag(:label,
78 check_box_tag('settings[notified_events][]',
79 notifiable.name,
80 Setting.notified_events.include?(notifiable.name)) +
81 l_or_humanize(notifiable.name, :prefix => 'label_'),
82 :class => notifiable.parent.present? ? "parent" : '')
83 end
74 84 end
@@ -1,36 +1,38
1 1 <% if @deliveries %>
2 2 <% form_tag({:action => 'edit', :tab => 'notifications'}) do %>
3 3
4 4 <div class="box tabular settings">
5 5 <p><%= setting_text_field :mail_from, :size => 60 %></p>
6 6
7 7 <p><%= setting_check_box :bcc_recipients %></p>
8 8
9 9 <p><%= setting_check_box :plain_text_mail %></p>
10 10
11 11 <p><%= setting_select(:default_notification_option, User::MAIL_NOTIFICATION_OPTIONS.collect {|o| [l(o.last), o.first.to_s]}) %></p>
12 12
13 13 </div>
14 14
15 <fieldset class="box settings" id="notified_events"><legend><%=l(:text_select_mail_notifications)%></legend>
16 <%= setting_multiselect(:notified_events,
17 @notifiables.collect {|notifiable| [l_or_humanize(notifiable, :prefix => 'label_'), notifiable]}, :label => false) %>
18
19 <p><%= check_all_links('notified_events') %></p>
15 <fieldset class="box" id="notified_events"><legend><%=l(:text_select_mail_notifications)%></legend>
16 <%= hidden_field_tag 'settings[notified_events][]', '' %>
17 <% @notifiables.each do |notifiable| %>
18 <%= notification_field notifiable %>
19 <br />
20 <% end %>
21 <p><%= check_all_links('notified_events') %></p>
20 22 </fieldset>
21 23
22 24 <fieldset class="box"><legend><%= l(:setting_emails_footer) %></legend>
23 25 <%= setting_text_area :emails_footer, :label => false, :class => 'wiki-edit', :rows => 5 %>
24 26 </fieldset>
25 27
26 28 <div style="float:right;">
27 29 <%= link_to l(:label_send_test_email), :controller => 'admin', :action => 'test_email' %>
28 30 </div>
29 31
30 32 <%= submit_tag l(:button_save) %>
31 33 <% end %>
32 34 <% else %>
33 35 <div class="nodata">
34 36 <%= simple_format(l(:text_email_delivery_not_configured)) %>
35 37 </div>
36 38 <% end %>
@@ -1,22 +1,25
1 1 module Redmine
2 class Notifiable
3 CoreNotifications = [
4 'issue_added',
5 'issue_updated',
6 'issue_note_added',
7 'issue_status_updated',
8 'issue_priority_updated',
9 'news_added',
10 'document_added',
11 'file_added',
12 'message_posted',
13 'wiki_content_added',
14 'wiki_content_updated'
15 ]
2 class Notifiable < Struct.new(:name, :parent)
16 3
4 def to_s
5 name
6 end
7
17 8 # TODO: Plugin API for adding a new notification?
18 9 def self.all
19 CoreNotifications
10 notifications = []
11 notifications << Notifiable.new('issue_added')
12 notifications << Notifiable.new('issue_updated')
13 notifications << Notifiable.new('issue_note_added', 'issue_updated')
14 notifications << Notifiable.new('issue_status_updated', 'issue_updated')
15 notifications << Notifiable.new('issue_priority_updated', 'issue_updated')
16 notifications << Notifiable.new('news_added')
17 notifications << Notifiable.new('document_added')
18 notifications << Notifiable.new('file_added')
19 notifications << Notifiable.new('message_posted')
20 notifications << Notifiable.new('wiki_content_added')
21 notifications << Notifiable.new('wiki_content_updated')
22 notifications
20 23 end
21 24 end
22 25 end
@@ -1,235 +1,241
1 1 /* redMine - project management software
2 2 Copyright (C) 2006-2008 Jean-Philippe Lang */
3 3
4 4 function checkAll (id, checked) {
5 5 var els = Element.descendants(id);
6 6 for (var i = 0; i < els.length; i++) {
7 7 if (els[i].disabled==false) {
8 8 els[i].checked = checked;
9 9 }
10 10 }
11 11 }
12 12
13 13 function toggleCheckboxesBySelector(selector) {
14 14 boxes = $$(selector);
15 15 var all_checked = true;
16 16 for (i = 0; i < boxes.length; i++) { if (boxes[i].checked == false) { all_checked = false; } }
17 17 for (i = 0; i < boxes.length; i++) { boxes[i].checked = !all_checked; }
18 18 }
19 19
20 function setCheckboxesBySelector(checked, selector) {
21 var boxes = $$(selector);
22 boxes.each(function(ele) {
23 ele.checked = checked;
24 });
25 }
26
20 27 function showAndScrollTo(id, focus) {
21 28 Element.show(id);
22 29 if (focus!=null) { Form.Element.focus(focus); }
23 30 Element.scrollTo(id);
24 31 }
25 32
26 33 function toggleRowGroup(el) {
27 34 var tr = Element.up(el, 'tr');
28 35 var n = Element.next(tr);
29 36 tr.toggleClassName('open');
30 37 while (n != undefined && !n.hasClassName('group')) {
31 38 Element.toggle(n);
32 39 n = Element.next(n);
33 40 }
34 41 }
35 42
36 43 function toggleFieldset(el) {
37 44 var fieldset = Element.up(el, 'fieldset');
38 45 fieldset.toggleClassName('collapsed');
39 46 Effect.toggle(fieldset.down('div'), 'slide', {duration:0.2});
40 47 }
41 48
42 49 var fileFieldCount = 1;
43 50
44 51 function addFileField() {
45 52 if (fileFieldCount >= 10) return false
46 53 fileFieldCount++;
47 54 var f = document.createElement("input");
48 55 f.type = "file";
49 56 f.name = "attachments[" + fileFieldCount + "][file]";
50 57 f.size = 30;
51 58 var d = document.createElement("input");
52 59 d.type = "text";
53 60 d.name = "attachments[" + fileFieldCount + "][description]";
54 61 d.size = 60;
55 62 var dLabel = new Element('label');
56 63 dLabel.addClassName('inline');
57 64 // Pulls the languge value used for Optional Description
58 65 dLabel.update($('attachment_description_label_content').innerHTML)
59
60 66 p = document.getElementById("attachments_fields");
61 67 p.appendChild(document.createElement("br"));
62 68 p.appendChild(f);
63 69 p.appendChild(dLabel);
64 70 dLabel.appendChild(d);
65 71
66 72 }
67 73
68 74 function showTab(name) {
69 75 var f = $$('div#content .tab-content');
70 76 for(var i=0; i<f.length; i++){
71 77 Element.hide(f[i]);
72 78 }
73 79 var f = $$('div.tabs a');
74 80 for(var i=0; i<f.length; i++){
75 81 Element.removeClassName(f[i], "selected");
76 82 }
77 83 Element.show('tab-content-' + name);
78 84 Element.addClassName('tab-' + name, "selected");
79 85 return false;
80 86 }
81 87
82 88 function moveTabRight(el) {
83 89 var lis = Element.up(el, 'div.tabs').down('ul').childElements();
84 90 var tabsWidth = 0;
85 91 var i;
86 92 for (i=0; i<lis.length; i++) {
87 93 if (lis[i].visible()) {
88 94 tabsWidth += lis[i].getWidth() + 6;
89 95 }
90 96 }
91 97 if (tabsWidth < Element.up(el, 'div.tabs').getWidth() - 60) {
92 98 return;
93 99 }
94 100 i=0;
95 101 while (i<lis.length && !lis[i].visible()) {
96 102 i++;
97 103 }
98 104 lis[i].hide();
99 105 }
100 106
101 107 function moveTabLeft(el) {
102 108 var lis = Element.up(el, 'div.tabs').down('ul').childElements();
103 109 var i = 0;
104 110 while (i<lis.length && !lis[i].visible()) {
105 111 i++;
106 112 }
107 113 if (i>0) {
108 114 lis[i-1].show();
109 115 }
110 116 }
111 117
112 118 function displayTabsButtons() {
113 119 var lis;
114 120 var tabsWidth = 0;
115 121 var i;
116 122 $$('div.tabs').each(function(el) {
117 123 lis = el.down('ul').childElements();
118 124 for (i=0; i<lis.length; i++) {
119 125 if (lis[i].visible()) {
120 126 tabsWidth += lis[i].getWidth() + 6;
121 127 }
122 128 }
123 129 if ((tabsWidth < el.getWidth() - 60) && (lis[0].visible())) {
124 130 el.down('div.tabs-buttons').hide();
125 131 } else {
126 132 el.down('div.tabs-buttons').show();
127 133 }
128 134 });
129 135 }
130 136
131 137 function setPredecessorFieldsVisibility() {
132 138 relationType = $('relation_relation_type');
133 139 if (relationType && (relationType.value == "precedes" || relationType.value == "follows")) {
134 140 Element.show('predecessor_fields');
135 141 } else {
136 142 Element.hide('predecessor_fields');
137 143 }
138 144 }
139 145
140 146 function promptToRemote(text, param, url) {
141 147 value = prompt(text + ':');
142 148 if (value) {
143 149 new Ajax.Request(url + '?' + param + '=' + encodeURIComponent(value), {asynchronous:true, evalScripts:true});
144 150 return false;
145 151 }
146 152 }
147 153
148 154 function collapseScmEntry(id) {
149 155 var els = document.getElementsByClassName(id, 'browser');
150 156 for (var i = 0; i < els.length; i++) {
151 157 if (els[i].hasClassName('open')) {
152 158 collapseScmEntry(els[i].id);
153 159 }
154 160 Element.hide(els[i]);
155 161 }
156 162 $(id).removeClassName('open');
157 163 }
158 164
159 165 function expandScmEntry(id) {
160 166 var els = document.getElementsByClassName(id, 'browser');
161 167 for (var i = 0; i < els.length; i++) {
162 168 Element.show(els[i]);
163 169 if (els[i].hasClassName('loaded') && !els[i].hasClassName('collapsed')) {
164 170 expandScmEntry(els[i].id);
165 171 }
166 172 }
167 173 $(id).addClassName('open');
168 174 }
169 175
170 176 function scmEntryClick(id) {
171 177 el = $(id);
172 178 if (el.hasClassName('open')) {
173 179 collapseScmEntry(id);
174 180 el.addClassName('collapsed');
175 181 return false;
176 182 } else if (el.hasClassName('loaded')) {
177 183 expandScmEntry(id);
178 184 el.removeClassName('collapsed');
179 185 return false;
180 186 }
181 187 if (el.hasClassName('loading')) {
182 188 return false;
183 189 }
184 190 el.addClassName('loading');
185 191 return true;
186 192 }
187 193
188 194 function scmEntryLoaded(id) {
189 195 Element.addClassName(id, 'open');
190 196 Element.addClassName(id, 'loaded');
191 197 Element.removeClassName(id, 'loading');
192 198 }
193 199
194 200 function randomKey(size) {
195 201 var chars = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
196 202 var key = '';
197 203 for (i = 0; i < size; i++) {
198 204 key += chars[Math.floor(Math.random() * chars.length)];
199 205 }
200 206 return key;
201 207 }
202 208
203 209 function observeParentIssueField(url) {
204 210 new Ajax.Autocompleter('issue_parent_issue_id',
205 211 'parent_issue_candidates',
206 212 url,
207 213 { minChars: 3,
208 214 frequency: 0.5,
209 215 paramName: 'q',
210 216 updateElement: function(value) {
211 217 document.getElementById('issue_parent_issue_id').value = value.id;
212 218 }});
213 219 }
214 220
215 221 /* shows and hides ajax indicator */
216 222 Ajax.Responders.register({
217 223 onCreate: function(){
218 224 if ($('ajax-indicator') && Ajax.activeRequestCount > 0) {
219 225 Element.show('ajax-indicator');
220 226 }
221 227 },
222 228 onComplete: function(){
223 229 if ($('ajax-indicator') && Ajax.activeRequestCount == 0) {
224 230 Element.hide('ajax-indicator');
225 231 }
226 232 }
227 233 });
228 234
229 235 function hideOnLoad() {
230 236 $$('.hol').each(function(el) {
231 237 el.hide();
232 238 });
233 239 }
234 240
235 241 Event.observe(window, 'load', hideOnLoad);
@@ -1,940 +1,941
1 1 body { font-family: Verdana, sans-serif; font-size: 12px; color:#484848; margin: 0; padding: 0; min-width: 900px; }
2 2
3 3 h1, h2, h3, h4 { font-family: "Trebuchet MS", Verdana, sans-serif;}
4 4 h1 {margin:0; padding:0; font-size: 24px;}
5 5 h2, .wiki h1 {font-size: 20px;padding: 2px 10px 1px 0px;margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #444;}
6 6 h3, .wiki h2 {font-size: 16px;padding: 2px 10px 1px 0px;margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #444;}
7 7 h4, .wiki h3 {font-size: 13px;padding: 2px 10px 1px 0px;margin-bottom: 5px; border-bottom: 1px dotted #bbbbbb; color: #444;}
8 8
9 9 /***** Layout *****/
10 10 #wrapper {background: white;}
11 11
12 12 #top-menu {background: #2C4056; color: #fff; height:1.8em; font-size: 0.8em; padding: 2px 2px 0px 6px;}
13 13 #top-menu ul {margin: 0; padding: 0;}
14 14 #top-menu li {
15 15 float:left;
16 16 list-style-type:none;
17 17 margin: 0px 0px 0px 0px;
18 18 padding: 0px 0px 0px 0px;
19 19 white-space:nowrap;
20 20 }
21 21 #top-menu a {color: #fff; margin-right: 8px; font-weight: bold;}
22 22 #top-menu #loggedas { float: right; margin-right: 0.5em; color: #fff; }
23 23
24 24 #account {float:right;}
25 25
26 26 #header {height:5.3em;margin:0;background-color:#507AAA;color:#f8f8f8; padding: 4px 8px 0px 6px; position:relative;}
27 27 #header a {color:#f8f8f8;}
28 28 #header h1 a.ancestor { font-size: 80%; }
29 29 #quick-search {float:right;}
30 30
31 31 #main-menu {position: absolute; bottom: 0px; left:6px; margin-right: -500px;}
32 32 #main-menu ul {margin: 0; padding: 0;}
33 33 #main-menu li {
34 34 float:left;
35 35 list-style-type:none;
36 36 margin: 0px 2px 0px 0px;
37 37 padding: 0px 0px 0px 0px;
38 38 white-space:nowrap;
39 39 }
40 40 #main-menu li a {
41 41 display: block;
42 42 color: #fff;
43 43 text-decoration: none;
44 44 font-weight: bold;
45 45 margin: 0;
46 46 padding: 4px 10px 4px 10px;
47 47 }
48 48 #main-menu li a:hover {background:#759FCF; color:#fff;}
49 49 #main-menu li a.selected, #main-menu li a.selected:hover {background:#fff; color:#555;}
50 50
51 51 #admin-menu ul {margin: 0; padding: 0;}
52 52 #admin-menu li {margin: 0; padding: 0 0 12px 0; list-style-type:none;}
53 53
54 54 #admin-menu a { background-position: 0% 40%; background-repeat: no-repeat; padding-left: 20px; padding-top: 2px; padding-bottom: 3px;}
55 55 #admin-menu a.projects { background-image: url(../images/projects.png); }
56 56 #admin-menu a.users { background-image: url(../images/user.png); }
57 57 #admin-menu a.groups { background-image: url(../images/group.png); }
58 58 #admin-menu a.roles { background-image: url(../images/database_key.png); }
59 59 #admin-menu a.trackers { background-image: url(../images/ticket.png); }
60 60 #admin-menu a.issue_statuses { background-image: url(../images/ticket_edit.png); }
61 61 #admin-menu a.workflows { background-image: url(../images/ticket_go.png); }
62 62 #admin-menu a.custom_fields { background-image: url(../images/textfield.png); }
63 63 #admin-menu a.enumerations { background-image: url(../images/text_list_bullets.png); }
64 64 #admin-menu a.settings { background-image: url(../images/changeset.png); }
65 65 #admin-menu a.plugins { background-image: url(../images/plugin.png); }
66 66 #admin-menu a.info { background-image: url(../images/help.png); }
67 67 #admin-menu a.server_authentication { background-image: url(../images/server_key.png); }
68 68
69 69 #main {background-color:#EEEEEE;}
70 70
71 71 #sidebar{ float: right; width: 22%; position: relative; z-index: 9; padding: 0; margin: 0;}
72 72 * html #sidebar{ width: 22%; }
73 73 #sidebar h3{ font-size: 14px; margin-top:14px; color: #666; }
74 74 #sidebar hr{ width: 100%; margin: 0 auto; height: 1px; background: #ccc; border: 0; }
75 75 * html #sidebar hr{ width: 95%; position: relative; left: -6px; color: #ccc; }
76 76 #sidebar .contextual { margin-right: 1em; }
77 77
78 78 #content { width: 75%; background-color: #fff; margin: 0px; border-right: 1px solid #ddd; padding: 6px 10px 10px 10px; z-index: 10; }
79 79 * html #content{ width: 75%; padding-left: 0; margin-top: 0px; padding: 6px 10px 10px 10px;}
80 80 html>body #content { min-height: 600px; }
81 81 * html body #content { height: 600px; } /* IE */
82 82
83 83 #main.nosidebar #sidebar{ display: none; }
84 84 #main.nosidebar #content{ width: auto; border-right: 0; }
85 85
86 86 #footer {clear: both; border-top: 1px solid #bbb; font-size: 0.9em; color: #aaa; padding: 5px; text-align:center; background:#fff;}
87 87
88 88 #login-form table {margin-top:5em; padding:1em; margin-left: auto; margin-right: auto; border: 2px solid #FDBF3B; background-color:#FFEBC1; }
89 89 #login-form table td {padding: 6px;}
90 90 #login-form label {font-weight: bold;}
91 91 #login-form input#username, #login-form input#password { width: 300px; }
92 92
93 93 input#openid_url { background: url(../images/openid-bg.gif) no-repeat; background-color: #fff; background-position: 0 50%; padding-left: 18px; }
94 94
95 95 .clear:after{ content: "."; display: block; height: 0; clear: both; visibility: hidden; }
96 96
97 97 /***** Links *****/
98 98 a, a:link, a:visited{ color: #2A5685; text-decoration: none; }
99 99 a:hover, a:active{ color: #c61a1a; text-decoration: underline;}
100 100 a img{ border: 0; }
101 101
102 102 a.issue.closed, a.issue.closed:link, a.issue.closed:visited { color: #999; text-decoration: line-through; }
103 103
104 104 /***** Tables *****/
105 105 table.list { border: 1px solid #e4e4e4; border-collapse: collapse; width: 100%; margin-bottom: 4px; }
106 106 table.list th { background-color:#EEEEEE; padding: 4px; white-space:nowrap; }
107 107 table.list td { vertical-align: top; }
108 108 table.list td.id { width: 2%; text-align: center;}
109 109 table.list td.checkbox { width: 15px; padding: 0px;}
110 110 table.list td.buttons { width: 15%; white-space:nowrap; text-align: right; }
111 111 table.list td.buttons a { padding-right: 0.6em; }
112 112 table.list caption { text-align: left; padding: 0.5em 0.5em 0.5em 0; }
113 113
114 114 tr.project td.name a { white-space:nowrap; }
115 115
116 116 tr.project.idnt td.name a {background: url(../images/bullet_arrow_right.png) no-repeat 0 50%; padding-left: 16px;}
117 117 tr.project.idnt-1 td.name {padding-left: 0.5em;}
118 118 tr.project.idnt-2 td.name {padding-left: 2em;}
119 119 tr.project.idnt-3 td.name {padding-left: 3.5em;}
120 120 tr.project.idnt-4 td.name {padding-left: 5em;}
121 121 tr.project.idnt-5 td.name {padding-left: 6.5em;}
122 122 tr.project.idnt-6 td.name {padding-left: 8em;}
123 123 tr.project.idnt-7 td.name {padding-left: 9.5em;}
124 124 tr.project.idnt-8 td.name {padding-left: 11em;}
125 125 tr.project.idnt-9 td.name {padding-left: 12.5em;}
126 126
127 127 tr.issue { text-align: center; white-space: nowrap; }
128 128 tr.issue td.subject, tr.issue td.category, td.assigned_to { white-space: normal; }
129 129 tr.issue td.subject { text-align: left; }
130 130 tr.issue td.done_ratio table.progress { margin-left:auto; margin-right: auto;}
131 131
132 132 tr.issue.idnt td.subject a {background: url(../images/bullet_arrow_right.png) no-repeat 0 50%; padding-left: 16px;}
133 133 tr.issue.idnt-1 td.subject {padding-left: 0.5em;}
134 134 tr.issue.idnt-2 td.subject {padding-left: 2em;}
135 135 tr.issue.idnt-3 td.subject {padding-left: 3.5em;}
136 136 tr.issue.idnt-4 td.subject {padding-left: 5em;}
137 137 tr.issue.idnt-5 td.subject {padding-left: 6.5em;}
138 138 tr.issue.idnt-6 td.subject {padding-left: 8em;}
139 139 tr.issue.idnt-7 td.subject {padding-left: 9.5em;}
140 140 tr.issue.idnt-8 td.subject {padding-left: 11em;}
141 141 tr.issue.idnt-9 td.subject {padding-left: 12.5em;}
142 142
143 143 tr.entry { border: 1px solid #f8f8f8; }
144 144 tr.entry td { white-space: nowrap; }
145 145 tr.entry td.filename { width: 30%; }
146 146 tr.entry td.size { text-align: right; font-size: 90%; }
147 147 tr.entry td.revision, tr.entry td.author { text-align: center; }
148 148 tr.entry td.age { text-align: right; }
149 149 tr.entry.file td.filename a { margin-left: 16px; }
150 150
151 151 tr span.expander {background-image: url(../images/bullet_toggle_plus.png); padding-left: 8px; margin-left: 0; cursor: pointer;}
152 152 tr.open span.expander {background-image: url(../images/bullet_toggle_minus.png);}
153 153
154 154 tr.changeset td.author { text-align: center; width: 15%; }
155 155 tr.changeset td.committed_on { text-align: center; width: 15%; }
156 156
157 157 table.files tr.file td { text-align: center; }
158 158 table.files tr.file td.filename { text-align: left; padding-left: 24px; }
159 159 table.files tr.file td.digest { font-size: 80%; }
160 160
161 161 table.members td.roles, table.memberships td.roles { width: 45%; }
162 162
163 163 tr.message { height: 2.6em; }
164 164 tr.message td.subject { padding-left: 20px; }
165 165 tr.message td.created_on { white-space: nowrap; }
166 166 tr.message td.last_message { font-size: 80%; white-space: nowrap; }
167 167 tr.message.locked td.subject { background: url(../images/locked.png) no-repeat 0 1px; }
168 168 tr.message.sticky td.subject { background: url(../images/bullet_go.png) no-repeat 0 1px; font-weight: bold; }
169 169
170 170 tr.version.closed, tr.version.closed a { color: #999; }
171 171 tr.version td.name { padding-left: 20px; }
172 172 tr.version.shared td.name { background: url(../images/link.png) no-repeat 0% 70%; }
173 173 tr.version td.date, tr.version td.status, tr.version td.sharing { text-align: center; }
174 174
175 175 tr.user td { width:13%; }
176 176 tr.user td.email { width:18%; }
177 177 tr.user td { white-space: nowrap; }
178 178 tr.user.locked, tr.user.registered { color: #aaa; }
179 179 tr.user.locked a, tr.user.registered a { color: #aaa; }
180 180
181 181 tr.time-entry { text-align: center; white-space: nowrap; }
182 182 tr.time-entry td.subject, tr.time-entry td.comments { text-align: left; white-space: normal; }
183 183 td.hours { text-align: right; font-weight: bold; padding-right: 0.5em; }
184 184 td.hours .hours-dec { font-size: 0.9em; }
185 185
186 186 table.plugins td { vertical-align: middle; }
187 187 table.plugins td.configure { text-align: right; padding-right: 1em; }
188 188 table.plugins span.name { font-weight: bold; display: block; margin-bottom: 6px; }
189 189 table.plugins span.description { display: block; font-size: 0.9em; }
190 190 table.plugins span.url { display: block; font-size: 0.9em; }
191 191
192 192 table.list tbody tr.group td { padding: 0.8em 0 0.5em 0.3em; font-weight: bold; border-bottom: 1px solid #ccc; }
193 193 table.list tbody tr.group span.count { color: #aaa; font-size: 80%; }
194 194
195 195 table.list tbody tr:hover { background-color:#ffffdd; }
196 196 table.list tbody tr.group:hover { background-color:inherit; }
197 197 table td {padding:2px;}
198 198 table p {margin:0;}
199 199 .odd {background-color:#f6f7f8;}
200 200 .even {background-color: #fff;}
201 201
202 202 a.sort { padding-right: 16px; background-position: 100% 50%; background-repeat: no-repeat; }
203 203 a.sort.asc { background-image: url(../images/sort_asc.png); }
204 204 a.sort.desc { background-image: url(../images/sort_desc.png); }
205 205
206 206 table.attributes { width: 100% }
207 207 table.attributes th { vertical-align: top; text-align: left; }
208 208 table.attributes td { vertical-align: top; }
209 209
210 210 table.boards a.board, h3.comments { background: url(../images/comment.png) no-repeat 0% 50%; padding-left: 20px; }
211 211
212 212 td.center {text-align:center;}
213 213
214 214 h3.version { background: url(../images/package.png) no-repeat 0% 50%; padding-left: 20px; }
215 215
216 216 div.issues h3 { background: url(../images/ticket.png) no-repeat 0% 50%; padding-left: 20px; }
217 217 div.members h3 { background: url(../images/group.png) no-repeat 0% 50%; padding-left: 20px; }
218 218 div.news h3 { background: url(../images/news.png) no-repeat 0% 50%; padding-left: 20px; }
219 219 div.projects h3 { background: url(../images/projects.png) no-repeat 0% 50%; padding-left: 20px; }
220 220
221 221 #watchers ul {margin: 0; padding: 0;}
222 222 #watchers li {list-style-type:none;margin: 0px 2px 0px 0px; padding: 0px 0px 0px 0px;}
223 223 #watchers select {width: 95%; display: block;}
224 224 #watchers a.delete {opacity: 0.4;}
225 225 #watchers a.delete:hover {opacity: 1;}
226 226 #watchers img.gravatar {vertical-align: middle;margin: 0 4px 2px 0;}
227 227
228 228 .highlight { background-color: #FCFD8D;}
229 229 .highlight.token-1 { background-color: #faa;}
230 230 .highlight.token-2 { background-color: #afa;}
231 231 .highlight.token-3 { background-color: #aaf;}
232 232
233 233 .box{
234 234 padding:6px;
235 235 margin-bottom: 10px;
236 236 background-color:#f6f6f6;
237 237 color:#505050;
238 238 line-height:1.5em;
239 239 border: 1px solid #e4e4e4;
240 240 }
241 241
242 242 div.square {
243 243 border: 1px solid #999;
244 244 float: left;
245 245 margin: .3em .4em 0 .4em;
246 246 overflow: hidden;
247 247 width: .6em; height: .6em;
248 248 }
249 249 .contextual {float:right; white-space: nowrap; line-height:1.4em;margin-top:5px; padding-left: 10px; font-size:0.9em;}
250 250 .contextual input, .contextual select {font-size:0.9em;}
251 251 .message .contextual { margin-top: 0; }
252 252
253 253 .splitcontentleft{float:left; width:49%;}
254 254 .splitcontentright{float:right; width:49%;}
255 255 form {display: inline;}
256 256 input, select {vertical-align: middle; margin-top: 1px; margin-bottom: 1px;}
257 257 fieldset {border: 1px solid #e4e4e4; margin:0;}
258 258 legend {color: #484848;}
259 259 hr { width: 100%; height: 1px; background: #ccc; border: 0;}
260 260 blockquote { font-style: italic; border-left: 3px solid #e0e0e0; padding-left: 0.6em; margin-left: 2.4em;}
261 261 blockquote blockquote { margin-left: 0;}
262 262 acronym { border-bottom: 1px dotted; cursor: help; }
263 263 textarea.wiki-edit { width: 99%; }
264 264 li p {margin-top: 0;}
265 265 div.issue {background:#ffffdd; padding:6px; margin-bottom:6px;border: 1px solid #d7d7d7;}
266 266 p.breadcrumb { font-size: 0.9em; margin: 4px 0 4px 0;}
267 267 p.subtitle { font-size: 0.9em; margin: -6px 0 12px 0; font-style: italic; }
268 268 p.footnote { font-size: 0.9em; margin-top: 0px; margin-bottom: 0px; }
269 269
270 270 div.issue div.subject div div { padding-left: 16px; }
271 271 div.issue div.subject p {margin: 0; margin-bottom: 0.1em; font-size: 90%; color: #999;}
272 272 div.issue div.subject>div>p { margin-top: 0.5em; }
273 273 div.issue div.subject h3 {margin: 0; margin-bottom: 0.1em;}
274 274
275 275 #issue_tree table.issues { border: 0; }
276 276 #issue_tree td.checkbox {display:none;}
277 277
278 278 fieldset.collapsible { border-width: 1px 0 0 0; font-size: 0.9em; }
279 279 fieldset.collapsible legend { padding-left: 16px; background: url(../images/arrow_expanded.png) no-repeat 0% 40%; cursor:pointer; }
280 280 fieldset.collapsible.collapsed legend { background-image: url(../images/arrow_collapsed.png); }
281 281
282 282 fieldset#date-range p { margin: 2px 0 2px 0; }
283 283 fieldset#filters table { border-collapse: collapse; }
284 284 fieldset#filters table td { padding: 0; vertical-align: middle; }
285 285 fieldset#filters tr.filter { height: 2em; }
286 286 fieldset#filters td.add-filter { text-align: right; vertical-align: top; }
287 287 .buttons { font-size: 0.9em; margin-bottom: 1.4em; margin-top: 1em; }
288 288
289 289 div#issue-changesets {float:right; width:45%; margin-left: 1em; margin-bottom: 1em; background: #fff; padding-left: 1em; font-size: 90%;}
290 290 div#issue-changesets div.changeset { padding: 4px;}
291 291 div#issue-changesets div.changeset { border-bottom: 1px solid #ddd; }
292 292 div#issue-changesets p { margin-top: 0; margin-bottom: 1em;}
293 293
294 294 div#activity dl, #search-results { margin-left: 2em; }
295 295 div#activity dd, #search-results dd { margin-bottom: 1em; padding-left: 18px; font-size: 0.9em; }
296 296 div#activity dt, #search-results dt { margin-bottom: 0px; padding-left: 20px; line-height: 18px; background-position: 0 50%; background-repeat: no-repeat; }
297 297 div#activity dt.me .time { border-bottom: 1px solid #999; }
298 298 div#activity dt .time { color: #777; font-size: 80%; }
299 299 div#activity dd .description, #search-results dd .description { font-style: italic; }
300 300 div#activity span.project:after, #search-results span.project:after { content: " -"; }
301 301 div#activity dd span.description, #search-results dd span.description { display:block; color: #808080; }
302 302
303 303 #search-results dd { margin-bottom: 1em; padding-left: 20px; margin-left:0px; }
304 304
305 305 div#search-results-counts {float:right;}
306 306 div#search-results-counts ul { margin-top: 0.5em; }
307 307 div#search-results-counts li { list-style-type:none; float: left; margin-left: 1em; }
308 308
309 309 dt.issue { background-image: url(../images/ticket.png); }
310 310 dt.issue-edit { background-image: url(../images/ticket_edit.png); }
311 311 dt.issue-closed { background-image: url(../images/ticket_checked.png); }
312 312 dt.issue-note { background-image: url(../images/ticket_note.png); }
313 313 dt.changeset { background-image: url(../images/changeset.png); }
314 314 dt.news { background-image: url(../images/news.png); }
315 315 dt.message { background-image: url(../images/message.png); }
316 316 dt.reply { background-image: url(../images/comments.png); }
317 317 dt.wiki-page { background-image: url(../images/wiki_edit.png); }
318 318 dt.attachment { background-image: url(../images/attachment.png); }
319 319 dt.document { background-image: url(../images/document.png); }
320 320 dt.project { background-image: url(../images/projects.png); }
321 321 dt.time-entry { background-image: url(../images/time.png); }
322 322
323 323 #search-results dt.issue.closed { background-image: url(../images/ticket_checked.png); }
324 324
325 325 div#roadmap .related-issues { margin-bottom: 1em; }
326 326 div#roadmap .related-issues td.checkbox { display: none; }
327 327 div#roadmap .wiki h1:first-child { display: none; }
328 328 div#roadmap .wiki h1 { font-size: 120%; }
329 329 div#roadmap .wiki h2 { font-size: 110%; }
330 330
331 331 div#version-summary { float:right; width:380px; margin-left: 16px; margin-bottom: 16px; background-color: #fff; }
332 332 div#version-summary fieldset { margin-bottom: 1em; }
333 333 div#version-summary .total-hours { text-align: right; }
334 334
335 335 table#time-report td.hours, table#time-report th.period, table#time-report th.total { text-align: right; padding-right: 0.5em; }
336 336 table#time-report tbody tr { font-style: italic; color: #777; }
337 337 table#time-report tbody tr.last-level { font-style: normal; color: #555; }
338 338 table#time-report tbody tr.total { font-style: normal; font-weight: bold; color: #555; background-color:#EEEEEE; }
339 339 table#time-report .hours-dec { font-size: 0.9em; }
340 340
341 341 form .attributes { margin-bottom: 8px; }
342 342 form .attributes p { padding-top: 1px; padding-bottom: 2px; }
343 343 form .attributes select { min-width: 50%; }
344 344
345 345 ul.projects { margin: 0; padding-left: 1em; }
346 346 ul.projects.root { margin: 0; padding: 0; }
347 347 ul.projects ul.projects { border-left: 3px solid #e0e0e0; }
348 348 ul.projects li.root { list-style-type:none; margin-bottom: 1em; }
349 349 ul.projects li.child { list-style-type:none; margin-top: 1em;}
350 350 ul.projects div.root a.project { font-family: "Trebuchet MS", Verdana, sans-serif; font-weight: bold; font-size: 16px; margin: 0 0 10px 0; }
351 351 .my-project { padding-left: 18px; background: url(../images/fav.png) no-repeat 0 50%; }
352 352
353 353 #tracker_project_ids ul { margin: 0; padding-left: 1em; }
354 354 #tracker_project_ids li { list-style-type:none; }
355 355
356 356 ul.properties {padding:0; font-size: 0.9em; color: #777;}
357 357 ul.properties li {list-style-type:none;}
358 358 ul.properties li span {font-style:italic;}
359 359
360 360 .total-hours { font-size: 110%; font-weight: bold; }
361 361 .total-hours span.hours-int { font-size: 120%; }
362 362
363 363 .autoscroll {overflow-x: auto; padding:1px; margin-bottom: 1.2em;}
364 364 #user_firstname, #user_lastname, #user_mail, #my_account_form select { width: 90%; }
365 365
366 366 #workflow_copy_form select { width: 200px; }
367 367
368 368 .pagination {font-size: 90%}
369 369 p.pagination {margin-top:8px;}
370 370
371 371 /***** Tabular forms ******/
372 372 .tabular p{
373 373 margin: 0;
374 374 padding: 5px 0 8px 0;
375 375 padding-left: 180px; /*width of left column containing the label elements*/
376 376 height: 1%;
377 377 clear:left;
378 378 }
379 379
380 380 html>body .tabular p {overflow:hidden;}
381 381
382 382 .tabular label{
383 383 font-weight: bold;
384 384 float: left;
385 385 text-align: right;
386 386 margin-left: -180px; /*width of left column*/
387 387 width: 175px; /*width of labels. Should be smaller than left column to create some right
388 388 margin*/
389 389 }
390 390
391 391 .tabular label.floating{
392 392 font-weight: normal;
393 393 margin-left: 0px;
394 394 text-align: left;
395 395 width: 270px;
396 396 }
397 397
398 398 .tabular label.block{
399 399 font-weight: normal;
400 400 margin-left: 0px !important;
401 401 text-align: left;
402 402 float: none;
403 403 display: block;
404 404 width: auto;
405 405 }
406 406
407 407 .tabular label.inline{
408 408 float:none;
409 409 margin-left: 5px !important;
410 410 width: auto;
411 411 }
412 412
413 413 input#time_entry_comments { width: 90%;}
414 414
415 415 #preview fieldset {margin-top: 1em; background: url(../images/draft.png)}
416 416
417 417 .tabular.settings p{ padding-left: 300px; }
418 418 .tabular.settings label{ margin-left: -300px; width: 295px; }
419 419 .tabular.settings textarea { width: 99%; }
420 420
421 421 fieldset.settings label { display: block; }
422 .parent { padding-left: 20px; }
422 423
423 424 .required {color: #bb0000;}
424 425 .summary {font-style: italic;}
425 426
426 427 #attachments_fields input[type=text] {margin-left: 8px; }
427 428
428 429 div.attachments { margin-top: 12px; }
429 430 div.attachments p { margin:4px 0 2px 0; }
430 431 div.attachments img { vertical-align: middle; }
431 432 div.attachments span.author { font-size: 0.9em; color: #888; }
432 433
433 434 p.other-formats { text-align: right; font-size:0.9em; color: #666; }
434 435 .other-formats span + span:before { content: "| "; }
435 436
436 437 a.atom { background: url(../images/feed.png) no-repeat 1px 50%; padding: 2px 0px 3px 16px; }
437 438
438 439 /* Project members tab */
439 440 div#tab-content-members .splitcontentleft, div#tab-content-memberships .splitcontentleft, div#tab-content-users .splitcontentleft { width: 64% }
440 441 div#tab-content-members .splitcontentright, div#tab-content-memberships .splitcontentright, div#tab-content-users .splitcontentright { width: 34% }
441 442 div#tab-content-members fieldset, div#tab-content-memberships fieldset, div#tab-content-users fieldset { padding:1em; margin-bottom: 1em; }
442 443 div#tab-content-members fieldset legend, div#tab-content-memberships fieldset legend, div#tab-content-users fieldset legend { font-weight: bold; }
443 444 div#tab-content-members fieldset label, div#tab-content-memberships fieldset label, div#tab-content-users fieldset label { display: block; }
444 445 div#tab-content-members fieldset div, div#tab-content-users fieldset div { max-height: 400px; overflow:auto; }
445 446
446 447 table.members td.group { padding-left: 20px; background: url(../images/group.png) no-repeat 0% 50%; }
447 448
448 449 input#principal_search, input#user_search {width:100%}
449 450
450 451 * html div#tab-content-members fieldset div { height: 450px; }
451 452
452 453 /***** Flash & error messages ****/
453 454 #errorExplanation, div.flash, .nodata, .warning {
454 455 padding: 4px 4px 4px 30px;
455 456 margin-bottom: 12px;
456 457 font-size: 1.1em;
457 458 border: 2px solid;
458 459 }
459 460
460 461 div.flash {margin-top: 8px;}
461 462
462 463 div.flash.error, #errorExplanation {
463 464 background: url(../images/exclamation.png) 8px 50% no-repeat;
464 465 background-color: #ffe3e3;
465 466 border-color: #dd0000;
466 467 color: #880000;
467 468 }
468 469
469 470 div.flash.notice {
470 471 background: url(../images/true.png) 8px 5px no-repeat;
471 472 background-color: #dfffdf;
472 473 border-color: #9fcf9f;
473 474 color: #005f00;
474 475 }
475 476
476 477 div.flash.warning {
477 478 background: url(../images/warning.png) 8px 5px no-repeat;
478 479 background-color: #FFEBC1;
479 480 border-color: #FDBF3B;
480 481 color: #A6750C;
481 482 text-align: left;
482 483 }
483 484
484 485 .nodata, .warning {
485 486 text-align: center;
486 487 background-color: #FFEBC1;
487 488 border-color: #FDBF3B;
488 489 color: #A6750C;
489 490 }
490 491
491 492 #errorExplanation ul { font-size: 0.9em;}
492 493 #errorExplanation h2, #errorExplanation p { display: none; }
493 494
494 495 /***** Ajax indicator ******/
495 496 #ajax-indicator {
496 497 position: absolute; /* fixed not supported by IE */
497 498 background-color:#eee;
498 499 border: 1px solid #bbb;
499 500 top:35%;
500 501 left:40%;
501 502 width:20%;
502 503 font-weight:bold;
503 504 text-align:center;
504 505 padding:0.6em;
505 506 z-index:100;
506 507 filter:alpha(opacity=50);
507 508 opacity: 0.5;
508 509 }
509 510
510 511 html>body #ajax-indicator { position: fixed; }
511 512
512 513 #ajax-indicator span {
513 514 background-position: 0% 40%;
514 515 background-repeat: no-repeat;
515 516 background-image: url(../images/loading.gif);
516 517 padding-left: 26px;
517 518 vertical-align: bottom;
518 519 }
519 520
520 521 /***** Calendar *****/
521 522 table.cal {border-collapse: collapse; width: 100%; margin: 0px 0 6px 0;border: 1px solid #d7d7d7;}
522 523 table.cal thead th {width: 14%; background-color:#EEEEEE; padding: 4px; }
523 524 table.cal thead th.week-number {width: auto;}
524 525 table.cal tbody tr {height: 100px;}
525 526 table.cal td {border: 1px solid #d7d7d7; vertical-align: top; font-size: 0.9em;}
526 527 table.cal td.week-number { background-color:#EEEEEE; padding: 4px; border:none; font-size: 1em;}
527 528 table.cal td p.day-num {font-size: 1.1em; text-align:right;}
528 529 table.cal td.odd p.day-num {color: #bbb;}
529 530 table.cal td.today {background:#ffffdd;}
530 531 table.cal td.today p.day-num {font-weight: bold;}
531 532 table.cal .starting a, p.cal.legend .starting {background: url(../images/bullet_go.png) no-repeat -1px -2px; padding-left:16px;}
532 533 table.cal .ending a, p.cal.legend .ending {background: url(../images/bullet_end.png) no-repeat -1px -2px; padding-left:16px;}
533 534 table.cal .starting.ending a, p.cal.legend .starting.ending {background: url(../images/bullet_diamond.png) no-repeat -1px -2px; padding-left:16px;}
534 535 p.cal.legend span {display:block;}
535 536
536 537 /***** Tooltips ******/
537 538 .tooltip{position:relative;z-index:24;}
538 539 .tooltip:hover{z-index:25;color:#000;}
539 540 .tooltip span.tip{display: none; text-align:left;}
540 541
541 542 div.tooltip:hover span.tip{
542 543 display:block;
543 544 position:absolute;
544 545 top:12px; left:24px; width:270px;
545 546 border:1px solid #555;
546 547 background-color:#fff;
547 548 padding: 4px;
548 549 font-size: 0.8em;
549 550 color:#505050;
550 551 }
551 552
552 553 /***** Progress bar *****/
553 554 table.progress {
554 555 border: 1px solid #D7D7D7;
555 556 border-collapse: collapse;
556 557 border-spacing: 0pt;
557 558 empty-cells: show;
558 559 text-align: center;
559 560 float:left;
560 561 margin: 1px 6px 1px 0px;
561 562 }
562 563
563 564 table.progress td { height: 0.9em; }
564 565 table.progress td.closed { background: #BAE0BA none repeat scroll 0%; }
565 566 table.progress td.done { background: #DEF0DE none repeat scroll 0%; }
566 567 table.progress td.open { background: #FFF none repeat scroll 0%; }
567 568 p.pourcent {font-size: 80%;}
568 569 p.progress-info {clear: left; font-style: italic; font-size: 80%;}
569 570
570 571 /***** Tabs *****/
571 572 #content .tabs {height: 2.6em; margin-bottom:1.2em; position:relative; overflow:hidden;}
572 573 #content .tabs ul {margin:0; position:absolute; bottom:0; padding-left:1em; width: 2000px; border-bottom: 1px solid #bbbbbb;}
573 574 #content .tabs ul li {
574 575 float:left;
575 576 list-style-type:none;
576 577 white-space:nowrap;
577 578 margin-right:8px;
578 579 background:#fff;
579 580 position:relative;
580 581 margin-bottom:-1px;
581 582 }
582 583 #content .tabs ul li a{
583 584 display:block;
584 585 font-size: 0.9em;
585 586 text-decoration:none;
586 587 line-height:1.3em;
587 588 padding:4px 6px 4px 6px;
588 589 border: 1px solid #ccc;
589 590 border-bottom: 1px solid #bbbbbb;
590 591 background-color: #eeeeee;
591 592 color:#777;
592 593 font-weight:bold;
593 594 }
594 595
595 596 #content .tabs ul li a:hover {
596 597 background-color: #ffffdd;
597 598 text-decoration:none;
598 599 }
599 600
600 601 #content .tabs ul li a.selected {
601 602 background-color: #fff;
602 603 border: 1px solid #bbbbbb;
603 604 border-bottom: 1px solid #fff;
604 605 }
605 606
606 607 #content .tabs ul li a.selected:hover {
607 608 background-color: #fff;
608 609 }
609 610
610 611 div.tabs-buttons { position:absolute; right: 0; width: 48px; height: 24px; background: white; bottom: 0; border-bottom: 1px solid #bbbbbb; }
611 612
612 613 button.tab-left, button.tab-right {
613 614 font-size: 0.9em;
614 615 cursor: pointer;
615 616 height:24px;
616 617 border: 1px solid #ccc;
617 618 border-bottom: 1px solid #bbbbbb;
618 619 position:absolute;
619 620 padding:4px;
620 621 width: 20px;
621 622 bottom: -1px;
622 623 }
623 624
624 625 button.tab-left {
625 626 right: 20px;
626 627 background: #eeeeee url(../images/bullet_arrow_left.png) no-repeat 50% 50%;
627 628 }
628 629
629 630 button.tab-right {
630 631 right: 0;
631 632 background: #eeeeee url(../images/bullet_arrow_right.png) no-repeat 50% 50%;
632 633 }
633 634
634 635 /***** Auto-complete *****/
635 636 div.autocomplete {
636 637 position:absolute;
637 638 width:400px;
638 639 margin:0;
639 640 padding:0;
640 641 }
641 642 div.autocomplete ul {
642 643 list-style-type:none;
643 644 margin:0;
644 645 padding:0;
645 646 }
646 647 div.autocomplete ul li {
647 648 list-style-type:none;
648 649 display:block;
649 650 margin:-1px 0 0 0;
650 651 padding:2px;
651 652 cursor:pointer;
652 653 font-size: 90%;
653 654 border: 1px solid #ccc;
654 655 border-left: 1px solid #ccc;
655 656 border-right: 1px solid #ccc;
656 657 background-color:white;
657 658 }
658 659 div.autocomplete ul li.selected { background-color: #ffb;}
659 660 div.autocomplete ul li span.informal {
660 661 font-size: 80%;
661 662 color: #aaa;
662 663 }
663 664
664 665 #parent_issue_candidates ul li {width: 500px;}
665 666
666 667 /***** Diff *****/
667 668 .diff_out { background: #fcc; }
668 669 .diff_in { background: #cfc; }
669 670
670 671 /***** Wiki *****/
671 672 div.wiki table {
672 673 border: 1px solid #505050;
673 674 border-collapse: collapse;
674 675 margin-bottom: 1em;
675 676 }
676 677
677 678 div.wiki table, div.wiki td, div.wiki th {
678 679 border: 1px solid #bbb;
679 680 padding: 4px;
680 681 }
681 682
682 683 div.wiki .external {
683 684 background-position: 0% 60%;
684 685 background-repeat: no-repeat;
685 686 padding-left: 12px;
686 687 background-image: url(../images/external.png);
687 688 }
688 689
689 690 div.wiki a.new {
690 691 color: #b73535;
691 692 }
692 693
693 694 div.wiki pre {
694 695 margin: 1em 1em 1em 1.6em;
695 696 padding: 2px 2px 2px 0;
696 697 background-color: #fafafa;
697 698 border: 1px solid #dadada;
698 699 width:auto;
699 700 overflow-x: auto;
700 701 overflow-y: hidden;
701 702 }
702 703
703 704 div.wiki ul.toc {
704 705 background-color: #ffffdd;
705 706 border: 1px solid #e4e4e4;
706 707 padding: 4px;
707 708 line-height: 1.2em;
708 709 margin-bottom: 12px;
709 710 margin-right: 12px;
710 711 margin-left: 0;
711 712 display: table
712 713 }
713 714 * html div.wiki ul.toc { width: 50%; } /* IE6 doesn't autosize div */
714 715
715 716 div.wiki ul.toc.right { float: right; margin-left: 12px; margin-right: 0; width: auto; }
716 717 div.wiki ul.toc.left { float: left; margin-right: 12px; margin-left: 0; width: auto; }
717 718 div.wiki ul.toc li { list-style-type:none;}
718 719 div.wiki ul.toc li.heading2 { margin-left: 6px; }
719 720 div.wiki ul.toc li.heading3 { margin-left: 12px; font-size: 0.8em; }
720 721
721 722 div.wiki ul.toc a {
722 723 font-size: 0.9em;
723 724 font-weight: normal;
724 725 text-decoration: none;
725 726 color: #606060;
726 727 }
727 728 div.wiki ul.toc a:hover { color: #c61a1a; text-decoration: underline;}
728 729
729 730 a.wiki-anchor { display: none; margin-left: 6px; text-decoration: none; }
730 731 a.wiki-anchor:hover { color: #aaa !important; text-decoration: none; }
731 732 h1:hover a.wiki-anchor, h2:hover a.wiki-anchor, h3:hover a.wiki-anchor { display: inline; color: #ddd; }
732 733
733 734 div.wiki img { vertical-align: middle; }
734 735
735 736 /***** My page layout *****/
736 737 .block-receiver {
737 738 border:1px dashed #c0c0c0;
738 739 margin-bottom: 20px;
739 740 padding: 15px 0 15px 0;
740 741 }
741 742
742 743 .mypage-box {
743 744 margin:0 0 20px 0;
744 745 color:#505050;
745 746 line-height:1.5em;
746 747 }
747 748
748 749 .handle {
749 750 cursor: move;
750 751 }
751 752
752 753 a.close-icon {
753 754 display:block;
754 755 margin-top:3px;
755 756 overflow:hidden;
756 757 width:12px;
757 758 height:12px;
758 759 background-repeat: no-repeat;
759 760 cursor:pointer;
760 761 background-image:url('../images/close.png');
761 762 }
762 763
763 764 a.close-icon:hover {
764 765 background-image:url('../images/close_hl.png');
765 766 }
766 767
767 768 /***** Gantt chart *****/
768 769 .gantt_hdr {
769 770 position:absolute;
770 771 top:0;
771 772 height:16px;
772 773 border-top: 1px solid #c0c0c0;
773 774 border-bottom: 1px solid #c0c0c0;
774 775 border-right: 1px solid #c0c0c0;
775 776 text-align: center;
776 777 overflow: hidden;
777 778 }
778 779
779 780 .task {
780 781 position: absolute;
781 782 height:8px;
782 783 font-size:0.8em;
783 784 color:#888;
784 785 padding:0;
785 786 margin:0;
786 787 line-height:0.8em;
787 788 white-space:nowrap;
788 789 }
789 790
790 791 .task.label {width:100%;}
791 792
792 793 .task_late { background:#f66 url(../images/task_late.png); border: 1px solid #f66; }
793 794 .task_done { background:#00c600 url(../images/task_done.png); border: 1px solid #00c600; }
794 795 .task_todo { background:#aaa url(../images/task_todo.png); border: 1px solid #aaa; }
795 796
796 797 .task_todo.parent { background: #888; border: 1px solid #888; height: 6px;}
797 798 .task_late.parent, .task_done.parent { height: 3px;}
798 799 .task_todo.parent .left { position: absolute; background: url(../images/task_parent_end.png) no-repeat 0 0; width: 8px; height: 16px; margin-left: -5px; left: 0px; top: -1px;}
799 800 .task_todo.parent .right { position: absolute; background: url(../images/task_parent_end.png) no-repeat 0 0; width: 8px; height: 16px; margin-right: -5px; right: 0px; top: -1px;}
800 801
801 802 .milestone { background-image:url(../images/version_marker.png); background-repeat: no-repeat; border: 0; }
802 803 .milestone_late { background:#f66 url(../images/milestone_late.png); border: 1px solid #f66; height: 2px; margin-top: 3px;}
803 804 .milestone_done { background:#00c600 url(../images/milestone_done.png); border: 1px solid #00c600; height: 2px; margin-top: 3px;}
804 805 .milestone_todo { background:#fff url(../images/milestone_todo.png); border: 1px solid #fff; height: 2px; margin-top: 3px;}
805 806 .project-line { background-image:url(../images/project_marker.png); background-repeat: no-repeat; border: 0; }
806 807 .project_late { background:#f66 url(../images/milestone_late.png); border: 1px solid #f66; height: 2px; margin-top: 3px;}
807 808 .project_done { background:#00c600 url(../images/milestone_done.png); border: 1px solid #00c600; height: 2px; margin-top: 3px;}
808 809 .project_todo { background:#fff url(../images/milestone_todo.png); border: 1px solid #fff; height: 2px; margin-top: 3px;}
809 810
810 811 .version-behind-schedule a, .issue-behind-schedule a {color: #f66914;}
811 812 .version-overdue a, .issue-overdue a, .project-overdue a {color: #f00;}
812 813
813 814 /***** Icons *****/
814 815 .icon {
815 816 background-position: 0% 50%;
816 817 background-repeat: no-repeat;
817 818 padding-left: 20px;
818 819 padding-top: 2px;
819 820 padding-bottom: 3px;
820 821 }
821 822
822 823 .icon-add { background-image: url(../images/add.png); }
823 824 .icon-edit { background-image: url(../images/edit.png); }
824 825 .icon-copy { background-image: url(../images/copy.png); }
825 826 .icon-duplicate { background-image: url(../images/duplicate.png); }
826 827 .icon-del { background-image: url(../images/delete.png); }
827 828 .icon-move { background-image: url(../images/move.png); }
828 829 .icon-save { background-image: url(../images/save.png); }
829 830 .icon-cancel { background-image: url(../images/cancel.png); }
830 831 .icon-multiple { background-image: url(../images/table_multiple.png); }
831 832 .icon-folder { background-image: url(../images/folder.png); }
832 833 .open .icon-folder { background-image: url(../images/folder_open.png); }
833 834 .icon-package { background-image: url(../images/package.png); }
834 835 .icon-home { background-image: url(../images/home.png); }
835 836 .icon-user { background-image: url(../images/user.png); }
836 837 .icon-projects { background-image: url(../images/projects.png); }
837 838 .icon-help { background-image: url(../images/help.png); }
838 839 .icon-attachment { background-image: url(../images/attachment.png); }
839 840 .icon-history { background-image: url(../images/history.png); }
840 841 .icon-time { background-image: url(../images/time.png); }
841 842 .icon-time-add { background-image: url(../images/time_add.png); }
842 843 .icon-stats { background-image: url(../images/stats.png); }
843 844 .icon-warning { background-image: url(../images/warning.png); }
844 845 .icon-fav { background-image: url(../images/fav.png); }
845 846 .icon-fav-off { background-image: url(../images/fav_off.png); }
846 847 .icon-reload { background-image: url(../images/reload.png); }
847 848 .icon-lock { background-image: url(../images/locked.png); }
848 849 .icon-unlock { background-image: url(../images/unlock.png); }
849 850 .icon-checked { background-image: url(../images/true.png); }
850 851 .icon-details { background-image: url(../images/zoom_in.png); }
851 852 .icon-report { background-image: url(../images/report.png); }
852 853 .icon-comment { background-image: url(../images/comment.png); }
853 854 .icon-summary { background-image: url(../images/lightning.png); }
854 855 .icon-server-authentication { background-image: url(../images/server_key.png); }
855 856 .icon-issue { background-image: url(../images/ticket.png); }
856 857
857 858 .icon-file { background-image: url(../images/files/default.png); }
858 859 .icon-file.text-plain { background-image: url(../images/files/text.png); }
859 860 .icon-file.text-x-c { background-image: url(../images/files/c.png); }
860 861 .icon-file.text-x-csharp { background-image: url(../images/files/csharp.png); }
861 862 .icon-file.text-x-php { background-image: url(../images/files/php.png); }
862 863 .icon-file.text-x-ruby { background-image: url(../images/files/ruby.png); }
863 864 .icon-file.text-xml { background-image: url(../images/files/xml.png); }
864 865 .icon-file.image-gif { background-image: url(../images/files/image.png); }
865 866 .icon-file.image-jpeg { background-image: url(../images/files/image.png); }
866 867 .icon-file.image-png { background-image: url(../images/files/image.png); }
867 868 .icon-file.image-tiff { background-image: url(../images/files/image.png); }
868 869 .icon-file.application-pdf { background-image: url(../images/files/pdf.png); }
869 870 .icon-file.application-zip { background-image: url(../images/files/zip.png); }
870 871 .icon-file.application-x-gzip { background-image: url(../images/files/zip.png); }
871 872
872 873 img.gravatar {
873 874 padding: 2px;
874 875 border: solid 1px #d5d5d5;
875 876 background: #fff;
876 877 }
877 878
878 879 div.issue img.gravatar {
879 880 float: right;
880 881 margin: 0 0 0 1em;
881 882 padding: 5px;
882 883 }
883 884
884 885 div.issue table img.gravatar {
885 886 height: 14px;
886 887 width: 14px;
887 888 padding: 2px;
888 889 float: left;
889 890 margin: 0 0.5em 0 0;
890 891 }
891 892
892 893 h2 img.gravatar {
893 894 padding: 3px;
894 895 margin: -2px 4px -4px 0;
895 896 vertical-align: top;
896 897 }
897 898
898 899 h4 img.gravatar {
899 900 padding: 3px;
900 901 margin: -6px 0 -4px 0;
901 902 vertical-align: top;
902 903 }
903 904
904 905 td.username img.gravatar {
905 906 float: left;
906 907 margin: 0 1em 0 0;
907 908 }
908 909
909 910 #activity dt img.gravatar {
910 911 float: left;
911 912 margin: 0 1em 1em 0;
912 913 }
913 914
914 915 /* Used on 12px Gravatar img tags without the icon background */
915 916 .icon-gravatar {
916 917 float: left;
917 918 margin-right: 4px;
918 919 }
919 920
920 921 #activity dt,
921 922 .journal {
922 923 clear: left;
923 924 }
924 925
925 926 .journal-link {
926 927 float: right;
927 928 }
928 929
929 930 h2 img { vertical-align:middle; }
930 931
931 932 .hascontextmenu { cursor: context-menu; }
932 933
933 934 /***** Media print specific styles *****/
934 935 @media print {
935 936 #top-menu, #header, #main-menu, #sidebar, #footer, .contextual, .other-formats { display:none; }
936 937 #main { background: #fff; }
937 938 #content { width: 99%; margin: 0; padding: 0; border: 0; background: #fff; overflow: visible !important;}
938 939 #wiki_add_attachment { display:none; }
939 940 .hide-when-print { display: none; }
940 941 }
@@ -1,38 +1,31
1 1 # redMine - project management software
2 2 # Copyright (C) 2006-2008 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 require File.dirname(__FILE__) + '/../../../test_helper'
19 19
20 20 class Redmine::NotifiableTest < ActiveSupport::TestCase
21 21 def setup
22 22 end
23 23
24 def test_included_core_notifications
25 assert_equal 11, Redmine::Notifiable::CoreNotifications.length
26 Redmine::Notifiable::CoreNotifications.length
24 def test_all
25 assert_equal 11, Redmine::Notifiable.all.length
27 26
28 27 %w(issue_added issue_updated issue_note_added issue_status_updated issue_priority_updated news_added document_added file_added message_posted wiki_content_added wiki_content_updated).each do |notifiable|
29 assert Redmine::Notifiable::CoreNotifications.include?(notifiable), "missing #{notifiable}"
30 end
31 end
32
33 def test_all_should_include_all_of_the_core_notifications
34 Redmine::Notifiable::CoreNotifications.each do |notifiable|
35 assert Redmine::Notifiable.all.include?(notifiable), "missing #{notifiable} in #all"
28 assert Redmine::Notifiable.all.collect(&:name).include?(notifiable), "missing #{notifiable}"
36 29 end
37 30 end
38 31 end
General Comments 0
You need to be logged in to leave comments. Login now