parlement 0.4 → 0.5

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES CHANGED
@@ -1,5 +1,13 @@
1
1
  - parlement changelog
2
2
 
3
+ == Version 0.5
4
+
5
+ Voting. Mails containing -1, 0 or +1 trigger a vote
6
+
7
+ * correct charset decoding when receiving a mail
8
+ * better ul li previews and proposals
9
+
10
+
3
11
  == Version 0.4
4
12
 
5
13
  Evolutions and corrections
@@ -16,6 +24,7 @@ Evolutions and corrections
16
24
  * simplifications for w3m display
17
25
  * yahoo and google footers now hidden
18
26
 
27
+
19
28
  == Version 0.3
20
29
 
21
30
  Major version, adding the possibility to use not only the web forums, but mails
data/README CHANGED
@@ -65,9 +65,15 @@ Parameters
65
65
  - votes
66
66
 
67
67
 
68
- Here is my console code to reset threads from their original mails:
69
-
68
+ # Here is my console code to reset threads from their original mails:
70
69
  >> elts=Mail.find_all.select{|m|m.file and mail=TMail::Mail.parse(m.file) and reply=mail.in_reply_to and mailObject=Mail.find_by_message(reply) and mailObject.elt.id!=m.elt.parent_id}.collect{|m| {:elt=>m.elt.id, :parent=>Mail.find_by_message(TMail::Mail.parse(m.file).in_reply_to).elt.id}}; puts elts.size
71
-
72
70
  >> elts.each{|e|print e[:elt], ' ', e[:parent], ' '; puts Elt.update_all("parent_id='#{e[:parent]}'", "id='#{e[:elt]}'")}; puts elts.size
73
71
 
72
+ # To get duplicate messages
73
+ >> messages=Mail.find_by_sql "select message from mails group by message having count(message) > 1"; puts messages.length
74
+ >> messages.each{ |m| mail=Mail.find_all_by_message m.message; mail.each{|m| print m.elt.id, ' ', m.elt.subject, ' ', m.elt.children.size; puts } }; puts messages.length
75
+
76
+ # To get all existing votes
77
+ elts=Elt.find(:all, :conditions => ["body LIKE '%%+1%%' OR body LIKE '%%0%%' OR body LIKE '%%-1%%'"]); puts elts.size
78
+ elts.each { |e| print '(', Regexp.last_match(1), ')' if e.body =~ /^\s*(-1|0|\+1)(\s*|$)/ }; puts; puts elts.size
79
+ elts.each { |e| e.vote(Regexp.last_match(1), e.person) if e.body =~ /^\s*(-1|0|\+1)(\s*|$)/ }; puts; puts elts.size
@@ -11,13 +11,13 @@ module EltHelper
11
11
  # 1. numbered list
12
12
  # short lines to which are added a break
13
13
  text = auto_link data \
14
- .gsub(/(wrote:.*)$(\n)^>\s/, '\\1<br/>\\2\\2> ') \
14
+ .gsub(/^\b(.*:)$(\n)^>\s/, '\\1<br/>\\2\\2> ') \
15
15
  .gsub(/^Yahoo! Groups Links$(\n{2}^<*.*$\s.*$)*/, '') \
16
16
  .gsub(/^[-~]*$\n^You.*$\n^To.*$\n^To.*$\n^For more.*$\n^[-~]*$/, '') \
17
17
  .gsub(/(\s+)\/([\w\s]*)\//, '\\1_\\2_') \
18
18
  .gsub(/^-\s/, '* ') \
19
19
  .gsub(/^\d+[\.-]\s+/, '# ') \
20
- .gsub(/^\s*\b(.{2,50})$(\n)\b/, '\\1<br/>\\2') \
20
+ .gsub(/^\b(.{2,50})$(\n)\b/, '\\1<br/>\\2') \
21
21
  if data != nil
22
22
 
23
23
  textiled = text.blank? ? "" : RedCloth.new(text)
@@ -1,13 +1,12 @@
1
1
  #
2
- # Receive an email from which an elt is created.
2
+ # Receive an email from which a model Mail is created.
3
3
  #
4
- # An associated mail is kept to make sure we don't lose any data. Attachments
5
- # are also created in an associated table
4
+ # An associated Elt is generated. Attachments are also created in an associated
5
+ # table
6
6
  #
7
7
  class Mailman < ActionMailer::Base
8
8
  def receive(email)
9
- elt = Elt.new
10
- elt.receive(email)
9
+ Mail.receive email
11
10
  end
12
11
  end
13
12
 
@@ -0,0 +1,4 @@
1
+ class Choice < ActiveRecord::Base
2
+ belongs_to :person
3
+ belongs_to :elt
4
+ end
data/app/models/elt.rb CHANGED
@@ -1,6 +1,9 @@
1
1
  #
2
2
  # This is, in fact, the main parlement class!
3
3
  #
4
+ # It holds all posts, that's mostly a subject and a body, plus their
5
+ # relationships in a tree of elements
6
+ #
4
7
  class Elt < ActiveRecord::Base
5
8
  usesguid
6
9
 
@@ -11,9 +14,10 @@ class Elt < ActiveRecord::Base
11
14
 
12
15
  belongs_to :person
13
16
 
14
- has_and_belongs_to_many :subscribers,
15
- :class_name => "Person",
16
- :join_table => "subscribers"
17
+ has_and_belongs_to_many :subscribers, :class_name => "Person", :join_table => "subscribers"
18
+
19
+ has_many :choices
20
+ has_many :voters, :through => :choices, :source => :person
17
21
 
18
22
  # for live_tree
19
23
  def name
@@ -22,59 +26,43 @@ class Elt < ActiveRecord::Base
22
26
 
23
27
  # Just a quick method to get all subscribers as a simple list
24
28
  def all_recipients
25
- result = Array.new
26
- eltRecipient = self
27
- while eltRecipient
28
- result.concat eltRecipient.subscribers
29
- eltRecipient = eltRecipient.parent
29
+ if parent
30
+ (subscribers + parent.all_recipients).uniq
31
+ else
32
+ subscribers
30
33
  end
31
- logger.debug "all_recipients result: #{result.to_s}"
32
- return result
33
34
  end
34
35
 
35
- #
36
- # Receive this new elt as an email, sent through app/helpers/mailman.rb
37
- #
38
- def receive(mail)
39
- logger.info "Receive \"#{mail.subject}\""
36
+ alias_method :simple_save, :save
40
37
 
41
- # TODO
42
- # Loop detection, will need more work
43
- mail1 = Mail.find_by_message(mail.message_id)
44
- # The to_s seems necessary
45
- mail2 = Mail.find_by_message(mail['X-Message-Id'].to_s) if mail['X-Message-Id']
38
+ # Save, publish and vote this elt
39
+ def save
40
+ publish
41
+ simple_save
42
+ vote
43
+ end
46
44
 
47
- if not mail1 and not mail2
48
- self.mail = Mail.new if not self.mail
49
- self.mail.elt = self
50
- self.mail.receive(mail)
51
- self.id = mail['X-Leparlement-Elt-Id'].to_s if mail['X-Leparlement-Elt-Id']
52
- save
53
- else
54
- logger.info "Already received (id: #{mail.message_id})...\n"
55
- end
45
+ def vote(value = 1, person = self.person)
46
+ logger.info "#{person.name if person} vote #{value} on #{subject} #{self.choices}"
47
+ choices.each{ |c| logger.info c if c.person == person; c.destroy if c.person == person }
48
+ choice = choices.build :value => value, :person => person
49
+ choice.save!
56
50
  end
57
51
 
58
- #
59
- # Save and publish this elt
60
- #
61
- def save
62
- super
63
- publish
64
- logger.info "\n"
52
+ # Get the vote results
53
+ def result(electoralList = nil)
54
+ (Choice.count("elt_id = '#{self.id}' AND value = 1") \
55
+ - \
56
+ Choice.count("elt_id = '#{self.id}' AND value = -1"))
65
57
  end
66
58
 
67
59
  private
68
60
 
69
- #
70
- # Mail the elt to all subscribers
71
- #
61
+ # Mail this elt to all subscribers
72
62
  def publish
73
63
  logger.info "Publish #{subject}"
74
- self.mail ||= Mail.new
75
- self.mail.elt = self
76
- self.mail.publish
77
- self.mail.save
64
+ build_mail(:elt => self) unless mail
65
+ mail.publish
78
66
  end
79
67
  end
80
68
 
data/app/models/mail.rb CHANGED
@@ -9,7 +9,26 @@ class Mail < ActiveRecord::Base
9
9
 
10
10
  belongs_to :elt
11
11
 
12
+ #
13
+ # Receive this new elt as an email, sent through app/helpers/mailman.rb
14
+ #
15
+ # TODO
16
+ # Loop detection, will need more work
17
+ #
18
+ def Mail.receive(mail)
19
+ logger.info "Receive \"#{mail.subject}\""
12
20
 
21
+ if Mail.find_by_message(mail.message_id) \
22
+ or (mail['X-Message-Id'] \
23
+ and Mail.find_by_message(mail['X-Message-Id'].to_s))
24
+ logger.info "Already received (id: #{mail.message_id})...\n"
25
+
26
+ else
27
+ m = Mail.new
28
+ m.receive mail
29
+ m
30
+ end
31
+ end
13
32
 
14
33
  """ _
15
34
  _ __ ___ ___ ___(_)_ _____
@@ -27,27 +46,34 @@ class Mail < ActiveRecord::Base
27
46
  #
28
47
  def receive(mail)
29
48
  logger.info "Receive mail #{mail.message_id}"
30
- elt.created_on = mail.date
31
- elt.subject = unquote(mail.subject)
32
-
33
- elt.body = ''
49
+ if mail['X-Leparlement-Elt-Id'] then
50
+ build_elt :id => mail['X-Leparlement-Elt-Id'].to_s,
51
+ :created_on => mail.date,
52
+ :subject => unquote(mail.subject),
53
+ :body => '',
54
+ :mail => self
55
+ else
56
+ build_elt :created_on => mail.date,
57
+ :subject => unquote(mail.subject),
58
+ :body => '',
59
+ :mail => self
60
+ end
34
61
 
35
- elt.person = Person.find_by_email(mail.from)
36
- elt.person = Person.find_by_name(unquote(mail.friendly_from)) if not elt.person
37
- elt.person = Person.new if not elt.person
38
- elt.person.name = unquote(mail.friendly_from)
62
+ elt.person = Person.find_by_email(mail.from) \
63
+ || Person.find_by_name(unquote(mail.friendly_from)) \
64
+ || elt.build_person
65
+ elt.person.name = unquote mail.friendly_from
39
66
  elt.person.email = mail.from.first
40
67
 
41
68
  # Try to find its mail parent in the db
42
- if mail.in_reply_to
43
- m = Mail.find_by_message(mail.in_reply_to)
44
- elt.parent = m.elt if m
69
+ if mail.in_reply_to and Mail.find_by_message mail.in_reply_to
70
+ elt.parent_id = mail.in_reply_to
45
71
  end
46
72
 
47
73
  # Try to find its mail parent in the db
48
74
  if not elt.parent and mail.references
49
75
  for parent in mail.references
50
- m = Mail.find_by_message(parent.to_s)
76
+ m = Mail.find_by_message parent.to_s
51
77
  elt.parent = m.elt if m
52
78
  end
53
79
  end
@@ -58,40 +84,40 @@ class Mail < ActiveRecord::Base
58
84
  if not elt.parent and elt.subject.match(/\[[\w-]*\]/)
59
85
  parentId = elt.subject.match(/\[[\w-]*\]/)
60
86
  parentId = parentId[0].gsub(/[\[\]]/, '') if parentId
61
-
62
- elt.parent = Elt.find(parentId)
87
+ elt.parent = Elt.find parentId
63
88
  end
64
89
 
65
90
  # No reference matching an existing parent, let's try the "to" field
66
91
  to = mail["Envelope-to"].to_s + ', ' + mail.to.to_s
67
- if not elt.parent and to.match(/\w*@#{ActionMailer::Base.server_settings[:domain]}/)
68
- parentId = to.match(/\w*@#{ActionMailer::Base.server_settings[:domain]}/)[0] \
92
+ if not elt.parent and to.match(/[\w-]*@#{ActionMailer::Base.server_settings[:domain]}/)
93
+ parentId = to.match(/[\w-]*@#{ActionMailer::Base.server_settings[:domain]}/)[0] \
69
94
  .gsub(/@#{ActionMailer::Base.server_settings[:domain]}/, '')
70
-
71
- elt.parent = Elt.find(parentId)
95
+ elt.parent = Elt.find parentId
72
96
  end
73
97
 
74
98
  if not elt.parent
75
99
  parentId = "lost+found"
76
-
77
- elt.parent = Elt.find(parentId)
100
+ elt.parent = Elt.find parentId
78
101
  end
79
102
 
80
103
  rescue ActiveRecord::RecordNotFound
81
- elt.parent = elt.build_parent
104
+ elt.build_parent :parent_id => 'mail', :subject => parentId, :body => ''
82
105
  elt.parent.id = parentId
83
- elt.parent.parent_id = 'mail'
84
- elt.parent.subject = parentId
85
- elt.parent.body = ''
86
- elt.parent.save
106
+ elt.parent.save!
87
107
  end
88
108
 
89
- #elt.parent = Elt.find('mail') if not elt.parent
90
109
  mngAttachment(mail) if mail
91
110
 
92
111
  self.message = mail.message_id
93
112
  self.mail_parents = mail.references
94
113
  self.file = mail.encoded
114
+ elt.save!
115
+
116
+ if elt.body =~ /^\s*(-1|0|\+1)(\s*|$)/ then
117
+ #print '(', $`, ': ', Regexp.last_match(1), ')'
118
+ #puts
119
+ elt.parent.vote Regexp.last_match(1)
120
+ end
95
121
  end
96
122
 
97
123
 
@@ -102,17 +128,15 @@ class Mail < ActiveRecord::Base
102
128
  | .__/ \__,_|_.__/|_|_|___/_| |_|
103
129
  |_| """
104
130
  #
105
- # An elt has just been saved, and needs to be published as a mail
131
+ # An elt needs to be published as a mail
106
132
  #
107
133
  def publish
108
134
  logger.info "Publish mail"
109
135
 
110
136
  if message and not message.blank? and file
111
- mail = TMail::Mail.parse(file)
137
+ mail = TMail::Mail.parse file
112
138
  else
113
- logger.info "there"
114
- mail = MailNotify.create_publish(elt)
115
- logger.info "tehre"
139
+ mail = MailNotify.create_publish elt
116
140
  self.mail_parents = mail.references
117
141
  self.file = mail.encoded
118
142
  end
@@ -152,10 +176,8 @@ class Mail < ActiveRecord::Base
152
176
 
153
177
  # Added to make sure it is not lost, but not modified if already existant
154
178
  mail['X-Message-Id'] = mail.message_id if not mail['X-Message-Id']
155
-
156
179
  mail['X-leparlement-elt-Id'] = elt.id
157
180
 
158
-
159
181
  MailNotify::deliver(mail) if mail.destinations and not mail.destinations.empty?
160
182
 
161
183
  # Do it after sending, to get the actual message id as generated by the MTA
@@ -169,33 +191,29 @@ class Mail < ActiveRecord::Base
169
191
 
170
192
  private
171
193
 
172
- #
173
194
  # This is to make sure we only have utf-8, no iso-8859
174
- #
175
195
  def unquote(text)
176
- text.gsub(/\=\?.*?\?\=/) do |m|
177
- TMail::Unquoter.unquote_and_convert_to(m, 'utf-8')
178
- end
196
+ text.gsub(/\=\?.*?\?\=/) { |m| TMail::Unquoter.unquote_and_convert_to m, 'utf-8' }
179
197
  end
180
198
 
181
- #
182
199
  # Get and store the attachments
183
- #
184
200
  def mngAttachment(attachment)
185
201
  if attachment.content_type == 'text/plain'
186
- elt.body += attachment.body
187
- #elt.body += Iconv.new(attachment.type_param('charset'), 'iso-8859-15').iconv(attachment.body)
202
+ charset = attachment.type_param 'charset'
203
+ if charset and !charset.empty?
204
+ elt.body += Iconv.new(charset, 'utf-8').iconv(attachment.body)
205
+ else
206
+ elt.body += attachment.body
207
+ end
188
208
 
189
209
  elsif attachment.multipart?
190
- attachment.parts.each { |part| mngAttachment(part) }
191
-
192
- elsif attachment.type_param('name')
193
- file = File.new('/tmp/'+attachment.type_param('name'), 'w')
194
- file << attachment.body
195
- file.flush
210
+ attachment.parts.each { |part| mngAttachment part }
196
211
 
197
- attach = elt.attachments.build
198
- attach.file = file
212
+ elsif attachment.type_param 'name'
213
+ File.open('/tmp/'+attachment.type_param('name'), 'w') { |file|
214
+ file << attachment.body
215
+ elt.attachments.build :file => file
216
+ }
199
217
  end
200
218
  end
201
219
  end
@@ -70,11 +70,11 @@ class MailNotify < ActionMailer::Base
70
70
  # generated ids
71
71
  #
72
72
  def mailing_list(elt)
73
- e = elt
74
- while e.id.size > 21 and e.parent_id != 'ROOT'
75
- e = e.parent
73
+ if (elt.id.size > 21 and elt.parent_id != 'ROOT') then
74
+ mailing_list elt.parent
75
+ else
76
+ elt
76
77
  end
77
- e
78
78
  end
79
79
  end
80
80
 
data/app/models/person.rb CHANGED
@@ -2,6 +2,8 @@ class Person < ActiveRecord::Base
2
2
  usesguid
3
3
 
4
4
  has_many :elts
5
+ has_many :choices
6
+ has_many :issues, :through => :choices, :source => :elt
5
7
 
6
8
  validates_presence_of :name, :on => :create
7
9
  validates_length_of :name, :within => 3..40, :on => :create
@@ -6,6 +6,13 @@
6
6
  <%= error_messages_for 'user' if @user %>
7
7
 
8
8
  <% if @session[:person] %>
9
+ <span class="logout">
10
+ <%= link_to_remote('[X]',
11
+ :update => divId,
12
+ :url => { :controller => 'account', :action => 'logout', :divId => divId },
13
+ :complete => visual_effect(:BlindDown, divId)) %>
14
+ </span>
15
+
9
16
  <% if @session[:person].name and @session[:person].name != '' %>
10
17
  <span class="author">
11
18
  <%= link_to(@session[:person].name,
@@ -14,13 +21,6 @@
14
21
  :id => @session[:person]) %>
15
22
  </span>
16
23
  <% end %>
17
-
18
- <span class="logout">
19
- <%= link_to_remote('[X]',
20
- :update => divId,
21
- :url => { :controller => 'account', :action => 'logout', :divId => divId },
22
- :complete => visual_effect(:BlindDown, divId)) %>
23
- </span>
24
24
  <% else %>
25
25
 
26
26
  <%= render :partial => '/account/login', :locals => { :divId => divId } %>
@@ -1,7 +1,15 @@
1
1
  <% eltSubsNb = elt.children.count if eltSubsNb == nil %>
2
2
 
3
- <li id="elt_<%= elt.id %>" class="elt <%= displayTitle?(elt) ? 'titled' : '' %>">
4
- <% if eltTop or displayTitle? elt %>
3
+ <li id="elt_<%= elt.id %>" result="<%= elt.result %>"
4
+ class="elt <%= displayTitle?(elt) ? 'titled' : '' %>">
5
+ <span class="result"><%= sprintf("%+d", elt.result) %></span>
6
+ <!--
7
+ <form class="vote">
8
+ <label>-1</span> <span class="vote">0</span> <span class="vote">+1</span>
9
+ </form>
10
+ -->
11
+
12
+ <% if (eltTop or displayTitle? elt) and elt.created_on %>
5
13
  <span class="created_on">
6
14
  <%= elt.created_on.strftime('%d/%m/%y %H:%M') %>
7
15
  </span>
@@ -17,26 +25,19 @@
17
25
 
18
26
  <% if eltTop or displayTitle? elt %>
19
27
  <<%= eltTop ? 'h1' : 'h2' %>>
20
- <% if elt.id %>
28
+ <% if elt.new_record? %>
29
+ <%= textilize_without_paragraph(elt.subject) %>
30
+ <% else %>
21
31
  <%= link_to(textilize_without_paragraph(elt.subject),
22
32
  :controller => 'elt', :action => 'show', :id => elt) %>
23
- <% else %>
24
- <%= textilize_without_paragraph(elt.subject) %>
25
33
  <% end %>
26
34
  </<%= eltTop ? 'h1' : 'h2' %>>
27
35
  <% end %>
28
36
 
29
37
  <%= format elt.body %>
30
38
 
31
- <% for att in elt.attachments %>
32
- <%= link_to image_tag('/attachment/file/'+att.file_relative_path),
33
- '/attachment/file/'+att.file_relative_path %>
34
- <% end %>
35
-
36
- <!-- For IE -->&#160;
37
-
38
39
  <span class="eltQuickAdd" id="eltQuickAdd_<%= elt.id %>" title="<%= elt.created_on %>">
39
- <% if elt.id and elt.children.count == 0 %>
40
+ <% if !elt.new_record? and elt.children.count == 0 %>
40
41
  <%= link_to_remote('<span class="icon">&gt;&gt;</span>',
41
42
  { :update => 'eltNew_'+elt.id.to_s,
42
43
  :url => { :controller => 'elt', :action => 'new', :id => elt },
@@ -47,60 +48,65 @@
47
48
  <% end %>
48
49
  </span>
49
50
 
50
- <span class="eltSub">
51
- <!-- Display automatically one element threads -->
52
- <span <%= (eltTop or eltSubsNb < 2) ? 'style="display: none"' : '' %>
53
- class="eltMore" id="eltMore_<%= elt.id %>">
54
- <%= link_to_remote(eltSubsNb.to_s+' more',
55
- { :update => 'eltSubs_'+elt.id.to_s,
56
- :url => { :controller => 'elt', :action => 'list', :id => elt },
57
- :loading => visual_effect(:SwitchOff, 'eltMore_'+elt.id.to_s),
58
- :loaded => visual_effect(:BlindDown, 'eltSubs_'+elt.id.to_s)+
59
- visual_effect(:BlindDown, 'eltSubsClose_'+elt.id.to_s)},
60
- { :href => url_for(:controller => 'elt', :action => 'show', :id => elt) }) %>
61
-
62
- <%= link_to_remote('Add <span class="icon">&gt;&gt;</span>',
63
- { :update => 'eltNew_'+elt.id.to_s,
64
- :url => { :controller => 'elt', :action => 'new', :id => elt },
65
- :loaded => visual_effect(:BlindDown, 'eltNew_'+elt.id.to_s)+
66
- visual_effect(:BlindDown, 'eltSubsClose_'+elt.id.to_s)},
67
- { :href => url_for(:controller => 'elt', :action => 'new', :id => elt)}) %>
68
- </span>
69
-
70
- <span <%= (eltTop or eltSubsNb == 1) ? '' : 'style="display: none"' %>
71
- id="eltSubs_<%= elt.id %>">
72
- <% if eltTop or eltSubsNb == 1 %>
73
- <%= render :partial => '/elt/list', :locals => { :elt => elt } %>
74
- <% end %>
75
- </span>
51
+ <% for att in elt.attachments %>
52
+ <%= link_to image_tag('/attachment/file/'+att.file_relative_path),
53
+ '/attachment/file/'+att.file_relative_path %>
54
+ <% end %>
76
55
 
77
- <span style="display: none" class="eltNew" id="eltNew_<%= elt.id %>">
78
- &nbsp;
79
- </span>
80
- </span>
56
+ <!-- For IE -->&#160;
81
57
 
82
- <span <%= ((eltTop and eltSubsNb > 0) or eltSubsNb == 1) ? '' : 'style="display: none"' %>
83
- id="eltSubsClose_<%= elt.id %>" title="<%= elt.created_on %>"
84
- class="eltSubsClose">
85
- <%= link_to_function('<span class="icon">&lt;&lt;</span> Close',
86
- visual_effect(:BlindUp, 'eltSubs_'+elt.id.to_s)+
87
- visual_effect(:BlindUp, 'eltNew_'+elt.id.to_s)+
88
- visual_effect(:BlindUp, 'eltSubsClose_'+elt.id.to_s)+
89
- visual_effect(:BlindDown, 'eltMore_'+elt.id.to_s)) %>
90
-
91
- <% if elt.person %>
92
- <%= link_to(elt.person.name,
93
- :controller => 'person', :action => 'show', :id => elt.person) %>
94
- <% elsif not displayTitle? elt %>
95
- <%= ANONYMOUS_POSTER %>
96
- <% end %>
58
+ <span <%= (eltTop or eltSubsNb < 2) ? 'style="display: none"' : '' %>
59
+ class="eltMore" id="eltMore_<%= elt.id %>">
60
+ <%= link_to_remote(eltSubsNb.to_s+' more',
61
+ { :update => 'eltSubs_'+elt.id.to_s,
62
+ :url => { :controller => 'elt', :action => 'list', :id => elt },
63
+ :loading => visual_effect(:SwitchOff, 'eltMore_'+elt.id.to_s),
64
+ :loaded => visual_effect(:BlindDown, 'eltSubs_'+elt.id.to_s)+
65
+ visual_effect(:BlindDown, 'eltSubsClose_'+elt.id.to_s)},
66
+ { :href => url_for(:controller => 'elt', :action => 'show', :id => elt) }) %>
97
67
 
98
68
  <%= link_to_remote('Add <span class="icon">&gt;&gt;</span>',
99
69
  { :update => 'eltNew_'+elt.id.to_s,
100
70
  :url => { :controller => 'elt', :action => 'new', :id => elt },
101
71
  :loaded => visual_effect(:BlindDown, 'eltNew_'+elt.id.to_s)+
102
- visual_effect(:BlindDown, 'eltSubsClose_'+elt.id.to_s)},
72
+ visual_effect(:BlindDown, 'eltSubsClose_'+elt.id.to_s)},
103
73
  { :href => url_for(:controller => 'elt', :action => 'new', :id => elt)}) %>
104
74
  </span>
75
+
76
+ <ul class="eltSubs">
77
+ <!-- Display automatically one element threads -->
78
+ <div <%= (eltTop or eltSubsNb == 1) ? '' : 'style="display: none"' %>
79
+ id="eltSubs_<%= elt.id %>" class="eltSub">
80
+ <% if eltTop or eltSubsNb == 1 %>
81
+ <%= render :partial => '/elt/list', :locals => { :elt => elt } %>
82
+ <% end %>
83
+ </div>
84
+
85
+ <span style="display:none" class="eltNew" id="eltNew_<%= elt.id %>"></span>
86
+
87
+ <span <%= ((eltTop and eltSubsNb > 0) or eltSubsNb == 1) ? '' : 'style="display: none"' %>
88
+ id="eltSubsClose_<%= elt.id %>" title="<%= elt.created_on %>"
89
+ class="eltSubsClose">
90
+ <%= link_to_function('<span class="icon">&lt;&lt;</span> Close',
91
+ visual_effect(:BlindUp, 'eltSubs_'+elt.id.to_s)+
92
+ visual_effect(:BlindUp, 'eltNew_'+elt.id.to_s)+
93
+ visual_effect(:BlindUp, 'eltSubsClose_'+elt.id.to_s)+
94
+ visual_effect(:BlindDown, 'eltMore_'+elt.id.to_s)) %>
95
+
96
+ <% if elt.person %>
97
+ <%= link_to(elt.person.name,
98
+ :controller => 'person', :action => 'show', :id => elt.person) %>
99
+ <% elsif not displayTitle? elt %>
100
+ <%= ANONYMOUS_POSTER %>
101
+ <% end %>
102
+
103
+ <%= link_to_remote('Add <span class="icon">&gt;&gt;</span>',
104
+ { :update => 'eltNew_'+elt.id.to_s,
105
+ :url => { :controller => 'elt', :action => 'new', :id => elt },
106
+ :loaded => visual_effect(:BlindDown, 'eltNew_'+elt.id.to_s)+
107
+ visual_effect(:BlindDown, 'eltSubsClose_'+elt.id.to_s)},
108
+ { :href => url_for(:controller => 'elt', :action => 'new', :id => elt)}) %>
109
+ </span>
110
+ </ul>
105
111
  </li>
106
112
 
@@ -6,10 +6,6 @@ e = Elt.find_all("parent_id = '#{elt.id}'",
6
6
  'created_on DESC', e_pages.current.to_sql)
7
7
  %>
8
8
 
9
- <%
10
- # TODO There seems to be a problem with firefox when trying to use a visual_effect
11
- %>
12
-
13
9
  <%= link_to_remote('< Previous page',
14
10
  { :update => 'eltSubs_'+elt.id.to_s,
15
11
  :url => { :action => 'list', :id => elt, :page => e_pages.current.next },
@@ -34,7 +30,29 @@ e = Elt.find_all("parent_id = '#{elt.id}'",
34
30
  { :href => url_for(:controller => 'elt', :action => 'show', :id => @elt,
35
31
  :page => (@params['page'] ? @params['page'].to_i-1 : e_pages.length-1))}) if e_pages.current.previous %>
36
32
 
37
- <ul class="eltSubs" style="padding: 0; margin: 0;">
38
- <%= render :partial => '/elt/elt', :collection => e.reverse, :locals => { :eltTop => false } %>
39
- </ul>
33
+ <%= render :partial => '/elt/elt', :collection => e.reverse, :locals => { :eltTop => false } %>
34
+
35
+ <%= link_to_remote('< Previous page',
36
+ { :update => 'eltSubs_'+elt.id.to_s,
37
+ :url => { :action => 'list', :id => elt, :page => e_pages.current.next },
38
+ :loading => visual_effect(:BlindUp, 'eltSubs_'+elt.id.to_s),
39
+ :complete => visual_effect(:BlindDown, 'eltSubs_'+elt.id.to_s)+
40
+ visual_effect(:BlindDown, 'eltSubsClose_'+elt.id.to_s) },
41
+ { :href => url_for(:controller => 'elt', :action => 'show', :id => @elt,
42
+ :page => (@params['page'] ? @params['page'].to_i+1 : 2))}) if e_pages.current.next %>
43
+
44
+ <% if e_pages.length > 1 %>
45
+ <span class="pageCount">
46
+ (<%= e_pages.length-e_pages.current.to_i+1 %>/<%= e_pages.length %>)
47
+ </span>
48
+ <% end %>
49
+
50
+ <%= link_to_remote('Next page >',
51
+ { :update => 'eltSubs_'+elt.id.to_s,
52
+ :url => { :action => 'list', :id => elt, :page => e_pages.current.previous },
53
+ :loading => visual_effect(:BlindUp, 'eltSubs_'+elt.id.to_s),
54
+ :complete => visual_effect(:BlindDown, 'eltSubs_'+elt.id.to_s)+
55
+ visual_effect(:BlindDown, 'eltSubsClose_'+elt.id.to_s) },
56
+ { :href => url_for(:controller => 'elt', :action => 'show', :id => @elt,
57
+ :page => (@params['page'] ? @params['page'].to_i-1 : e_pages.length-1))}) if e_pages.current.previous %>
40
58