diff --git a/app/controllers/contacts_controller.rb b/app/controllers/contacts_controller.rb
index 5ade327..002c5dc 100755
--- a/app/controllers/contacts_controller.rb
+++ b/app/controllers/contacts_controller.rb
@@ -1,10 +1,12 @@
+require 'tempfile'
+
class ContactsController < ApplicationController
before_filter :check_current_user,:selected_folder, :get_current_folders
before_filter :get_contacts, :only => [:index]
- before_filter :prepare_ops_buttons, :only => [:index]
+ before_filter :prepare_ops_buttons, :prepare_export_import_buttons,:only => [:index]
theme :theme_resolver
@@ -67,6 +69,40 @@ class ContactsController < ApplicationController
end
end
+ def external
+ if params["export"]
+ redirect_to :action => 'export'
+ return
+ elsif params["import"]
+ begin
+ raise t(:no_file_chosen,:scope=>:common) if not params[:upload]
+ raise t(:no_tmp_dir,:scope=>:common) if not File.exists?($defaults["msg_upload_dir"])
+ tmp_file = Tempfile.new($defaults["contact_tmp_filename"],$defaults["msg_upload_dir"])
+ tmp_file.write(params[:upload][:datafile].read)
+ tmp_file.flush
+ tmp_file.rewind
+ tmp_file.readlines.each do |line|
+ Contact.import(@current_user,line)
+ end
+ rescue Exception => e
+ flash[:error] = e.to_s
+ end
+ end
+ flash[:notice] = t(:were_imported,:scope=>:contact) if not flash[:error]
+ redirect_to :action => 'index'
+ end
+
+ def export
+ contacts = @current_user.contacts
+ s = ""
+ contacts.each do |c|
+ s += c.export + "\r\n"
+ end
+ headers['Content-type'] = "text/csv"
+ headers['Content-Disposition'] = %(attachment; filename="contacts.csv")
+ render :text => s
+ end
+
####################################### protected section ################################
protected
@@ -78,6 +114,12 @@ class ContactsController < ApplicationController
@buttons << {:text => 'delete_selected',:scope=>'contact',:image => 'minus.png'}
end
+ def prepare_export_import_buttons
+ @ei_buttons = []
+ @ei_buttons << {:text => 'import',:scope=>'contact',:image => 'right.png'}
+ @ei_buttons << {:text => 'export',:scope=>'contact',:image => 'left.png'}
+ end
+
####################################### private section ##################################
private
diff --git a/app/controllers/events_controller.rb b/app/controllers/events_controller.rb
deleted file mode 100755
index 5175242..0000000
--- a/app/controllers/events_controller.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-class EventsController < ApplicationController
-end
diff --git a/app/controllers/folders_controller.rb b/app/controllers/folders_controller.rb
index 17984ab..f661d77 100755
--- a/app/controllers/folders_controller.rb
+++ b/app/controllers/folders_controller.rb
@@ -144,7 +144,7 @@ class FoldersController < ApplicationController
trash_folder.messages.destroy_all
trash_folder.update_attributes(:unseen => 0, :total => 0)
rescue Exception => e
- flash[:error] = "#{t(:imap_error)} (#{e.to_s})"
+ flash[:error] = "#{t(:imap_error,:scope=>:common)} (#{e.to_s})"
end
redirect_to :controller => 'messages', :action => 'index'
end
diff --git a/app/controllers/internal_controller.rb b/app/controllers/internal_controller.rb
index c90dc45..c22b586 100755
--- a/app/controllers/internal_controller.rb
+++ b/app/controllers/internal_controller.rb
@@ -1,8 +1,11 @@
class InternalController < ApplicationController
+ before_filter :check_current_user ,:selected_folder, :get_current_folders, :only => [:about]
+
theme :theme_resolver
layout "simple"
+
ERRORS = [
:internal_server_error,
:not_found,
@@ -43,4 +46,8 @@ class InternalController < ApplicationController
redirect_to :controller=>'user', :action => 'login'
end
+ def about
+ render 'internal/about', :layout => 'application'
+ end
+
end
diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb
index d50c72b..a7da6d9 100755
--- a/app/controllers/messages_controller.rb
+++ b/app/controllers/messages_controller.rb
@@ -65,9 +65,23 @@ class MessagesController < ApplicationController
end
def compose
- #before filter
+ #before filter :prepare_compose_buttons, :create_message_with_params
@operation = :new
- logger.custom('m',@message.inspect)
+ if params["cid"].present?
+ contact = @current_user.contacts.find_by_id(params["cid"])
+ if not contact.nil?
+ @message.to_addr = contact.email
+ end
+ elsif params["cids"].present?
+ contacts = []
+ params["cids"].each do |c|
+ contact = @current_user.contacts.find_by_id(c)
+ if not contact.nil?
+ contacts << contact.email
+ end
+ end
+ @message.to_addr = contacts.join(';')
+ end
end
def show
diff --git a/app/controllers/messages_ops_controller.rb b/app/controllers/messages_ops_controller.rb
index 3548eee..b675bc9 100755
--- a/app/controllers/messages_ops_controller.rb
+++ b/app/controllers/messages_ops_controller.rb
@@ -2,6 +2,7 @@ require 'imap_session'
require 'imap_mailbox'
require 'imap_message'
require 'mail'
+require 'mail_plugin_extension'
class MessagesOpsController < ApplicationController
@@ -128,7 +129,7 @@ class MessagesOpsController < ApplicationController
@operation = :upload
create_message_with_params
if not params[:upload]
- flash[:error] = t(:no_attach,:scope=>:compose)
+ flash[:error] = t(:no_file_chosen,:scope=>:common)
else
name = params[:upload][:datafile].original_filename
upload_dir = $defaults["msg_upload_dir"]
@@ -188,11 +189,12 @@ class MessagesOpsController < ApplicationController
mail = Mail.new
mail.subject = params[:message][:subject]
mail.from = @current_user.full_address
+ #TODO check if email address is valid if not get address from contacts
mail.to = params[:message][:to_addr]
mail.body = params[:message][:body]
attachments = Dir.glob(File.join($defaults["msg_upload_dir"],@current_user.username + "*"))
- logger.custom('attach',attachments.inspect)
+ #logger.custom('attach',attachments.inspect)
attachments.each do |a|
mail.add_file :filename => File.basename(a.gsub(/#{@current_user.username}_/,"")), :content => File.read(a)
end
@@ -221,7 +223,7 @@ class MessagesOpsController < ApplicationController
@mailbox.append(@sent_folder.full_name,mail.to_s,[:Seen])
rescue Exception => e
- flash[:error] = "#{t(:imap_error)} (#{e.to_s})"
+ flash[:error] = "#{t(:imap_err,:scope=>:internal)} (#{e.to_s})"
redirect_to :controller => 'messages', :action => 'index'
return
end
@@ -238,10 +240,13 @@ class MessagesOpsController < ApplicationController
if @drafts_folder.nil?
raise t(:not_configured_drafts,:scope=>:compose)
end
- # TODO delete old one if was edit
@mailbox.append(@drafts_folder.full_name,mail.to_s,[:Seen])
+ if params[:olduid].present?
+ @mailbox.move_message(params[:olduid],@trash_folder.full_name)
+ @mailbox.expunge
+ end
rescue Exception => e
- flash[:error] = "#{t(:imap_error)} (#{e.to_s})"
+ flash[:error] = "#{t(:imap_error,:scope=>:internal)} (#{e.to_s})"
redirect_to :controller => 'messages', :action => 'index'
return
end
@@ -250,24 +255,24 @@ class MessagesOpsController < ApplicationController
end
end
- ###################################### protected section #######################################
-
- protected
+ #FIXME edit does not support attachments
def edit
- old_message = @current_user.messages.find(params[:id].first)
+ old_message = @current_user.messages.find(params[:id])
@message = Message.new
@message.to_addr = old_message.to_addr
@message.subject = old_message.subject
+
imap_message = @mailbox.fetch_body(old_message.uid)
mail = Mail.new(imap_message)
if mail.multipart?
- @message.body = mail.text_part.decoded_and_charseted
+ @message.body = mail.text_part.decoded_and_charseted.gsub(/<\/?[^>]*>/, "")
else
- @message.body = mail.decoded_and_charseted
+ @message.body = mail.decoded_and_charseted.gsub(/<\/?[^>]*>/, "")
end
@attachments = []
@operation = :edit
+ @olduid = old_message.uid
render 'messages/compose'
end
@@ -280,7 +285,7 @@ class MessagesOpsController < ApplicationController
imap_message = @mailbox.fetch_body(old_message.uid)
mail = Mail.new(imap_message)
if mail.multipart?
- @message.body = mail.text_part.decoded_and_charseted
+ @message.body = mail.text_part.decoded_and_charseted.gsub(/<\/?[^>]*>/, "")
else
@message.body = mail.decoded_and_charseted.gsub(/<\/?[^>]*>/, "")
end
@@ -288,6 +293,11 @@ class MessagesOpsController < ApplicationController
@operation = :reply
render 'messages/compose'
end
+ ###################################### protected section #######################################
+
+ protected
+
+
############################################ set_mail_defaults ####################################
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index c6ccba4..6dbc0f6 100755
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -252,6 +252,14 @@ end
# link_to( t(:prefs,:scope=>:prefs), prefs_look_path )
#end
+def single_navigation(label,scope)
+ s = ""
+ s += "
"
+ s += "#{link_to(t(label,:scope=>scope),'#')} "
+ s += " "
+ s += " "
+end
+
def main_navigation(active)
instance_variable_set("@#{active}", "active")
s = ""
@@ -310,8 +318,9 @@ def force_charset(text)
end
def content_for_sidebar
- s = render :partial => 'folders/list'
- s += render :partial => 'events/calendar'
+ s = render :partial => 'sidebar/logo'
+ s += render :partial => 'folders/list'
+ s += render :partial => 'sidebar/calendar_view'
s += render :partial => 'internal/version'
s
end
diff --git a/app/models/contact.rb b/app/models/contact.rb
index 6f5c693..4291ba8 100755
--- a/app/models/contact.rb
+++ b/app/models/contact.rb
@@ -5,7 +5,7 @@ class Contact < ActiveRecord::Base
validates_length_of :email, :within => 5..50
validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i
validates_length_of :info, :maximum => 50
- validate_on_create :check_unique_nick
+ validate :check_unique_nick, :on => :create
belongs_to :user
@@ -32,4 +32,23 @@ class Contact < ActiveRecord::Base
end
end
+ def export
+ fields = []
+ fields << nick.presence || ""
+ fields << first_name || ""
+ fields << last_name || ""
+ fields << email || ""
+ fields << info || ""
+ fields.join(';')
+ end
+
+ def self.import(user,line)
+ fields = line.split(/;/)
+ contact = user.contacts.build( :nick => fields[0],
+ :first_name => fields[1],
+ :last_name => fields[2],
+ :email => fields[3],
+ :info => fields[4])
+ contact.save!
+ end
end
diff --git a/app/models/user.rb b/app/models/user.rb
index 1374cf0..a184b16 100755
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -2,6 +2,8 @@ require 'ezcrypto'
class User < ActiveRecord::Base
+ #acts_as_notes_owner
+
validates_presence_of :first_name,:last_name
validates_uniqueness_of :email
has_many :servers, :dependent => :destroy
diff --git a/config/application.rb b/config/application.rb
index 2619d4b..ff7faab 100755
--- a/config/application.rb
+++ b/config/application.rb
@@ -17,7 +17,7 @@ module Mailr
# Only load the plugins named here, in the order given (default is alphabetical).
# :all can be used as a placeholder for all plugins not explicitly named.
- # config.plugins = [ :exception_notification, :ssl_requirement, :all ]
+ #config.plugins = [ :acts_as_notes_owner, :all ]
config.action_view.javascript_expansions[:defaults] = %w(jquery rails)
diff --git a/config/defaults.yml b/config/defaults.yml
index cc6a0e8..93ff98a 100755
--- a/config/defaults.yml
+++ b/config/defaults.yml
@@ -1,4 +1,4 @@
-version: Build 2011-09-10
+version: 0.8.3
theme: olive
locale: pl
@@ -25,10 +25,12 @@ msg_address_length: 35
msg_search_fields: [subject, from, to]
msg_upload_dir: "tmp/uploads"
+contact_tmp_filename: contact_import
+
# if encoding can not be get from data
msg_unknown_charset: ISO-8859-2
-imap_debug: false
+imap_debug: true
imap_use_ssl: 'false'
imap_port: 143
imap_ssl_port: 993
@@ -43,4 +45,4 @@ session_password: asDD3s2@sAdc983#
mailbox_max_parent_folder_depth: 3
# array of logins which only can login to application, comment it to allow everyone to login
-only_can_logins: [some_login]
+only_can_logins: [wtodryk]
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index 615a01a..999e71c 100755
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -14,6 +14,7 @@ pl:
invalid: "ma niepoprawny format "
not_unique: "musi być unikalny "
taken: "musi być unikalny"
+ record_invalid: Nieprawidłowy format danych
models:
contact: Kontakt
attributes:
@@ -60,6 +61,10 @@ pl:
no_entries: Brak kontaktów
was_created: Kontakt został utworzony
are_you_sure_to_delete_contact: Czy na pewno chcesz usunąć kontakt?
+ export: Export
+ import: Import
+ were_imported: Kontakty zostały zaimportowane
+ format_error: Nieprawidłowy format kontaktu
prefs:
prefs: Ustawienia
@@ -138,7 +143,6 @@ pl:
send_file: Wyślij plik
send: Wyślij
save_as_draft: Zapisz w katalogu roboczym
- no_attach: Nie wybrano żadnego pliku
show:
reply: Odpowiedz
@@ -166,15 +170,17 @@ pl:
not_found: Nie znaleziono żądanej strony
internal_server_error: Błąd aplikacji
unprocessable_entity: Błąd procesowania
+ about: Informacje o programie
+ current_version: Aktualna wersja
common:
+ file_format_error: Błędny format pliku
+ no_tmp_dir: Brak katalogu tymczasowego
must_be_unique: musi być unikalny
some_add_info: jakieś dodatkowe informacje
example: przykład
-
create: Utwórz
delete: Usuń
-
mailr: MailR
save: Zapisz
copy: Skopiuj
@@ -186,11 +192,10 @@ pl:
kbytes: kB
mbytes: MB
site_link: https://github.com/lmanolov/mailr
-
no_data: Brak danych
download: Pobierz
view: Pokaż
version: Wersja
-
set: Ustaw
logout: Wyloguj
+ no_file_chosen: Nie wybrano żadnego pliku
diff --git a/config/routes.rb b/config/routes.rb
index c22d4fd..6f6d2f6 100755
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -10,9 +10,10 @@ Mailr::Application.routes.draw do
match "prefs/identity" => "prefs#identity", :as => :prefs_identity
match "prefs/servers" => "prefs#servers", :as => :prefs_servers
- resources :contacts
post "contacts/ops"
-
+ get "contacts/export"
+ match "contacts/external" => "contacts#external", :as => :contacts_external
+ resources :contacts
#resources :folders
match "folders/index" => 'folders#index', :as => :folders
@@ -30,15 +31,18 @@ Mailr::Application.routes.draw do
get "internal/imaperror"
get "internal/loginfailure"
get "internal/onlycanlogins"
+ match "internal/about" => 'internal#about' ,:as => :about
match "messages_ops/single" => 'messages_ops#single'
match "messages_ops/multi" => 'messages_ops#multi'
match "messages_ops/sendout_or_save" => 'messages_ops#sendout_or_save' ,:as =>:sendout_or_save
match "messages_ops/upload" => 'messages_ops#upload',:as => :upload
+ match "messages_ops/edit/:id" => 'messages_ops#edit', :as => :messages_ops_edit
root :to => "messages#index"
match "messages/index" => 'messages#index', :as => :messages
match "messages/compose" => 'messages#compose', :as => :compose
+ match "messages/compose/:cid" => 'messages#compose', :as => :compose_contact
#get "messages/refresh_status"
#get "messages/emptybin"
#match "messages/select/:id" => 'messages#select', :as => :messages_select
@@ -64,8 +68,9 @@ Mailr::Application.routes.draw do
get "user/unknown"
themes_for_rails
+ #acts_as_notes_owner
- match '*a', :to => 'internal#not_found'
+ #match '*a', :to => 'internal#not_found'
# The priority is based upon order of creation:
# first created -> highest priority.
diff --git a/db/migrate/20110906094129_create_events.rb b/db/migrate/20110906094129_create_events.rb
deleted file mode 100755
index 864a22e..0000000
--- a/db/migrate/20110906094129_create_events.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-class CreateEvents < ActiveRecord::Migration
- def self.up
- create_table :events do |t|
- t.integer :user_id
- t.integer :priority
- t.text :description
- t.string :category
- t.datetime :start
- t.datetime :stop
- t.boolean :allday
-
- t.timestamps
- end
- end
-
- def self.down
- drop_table :events
- end
-end
diff --git a/db/schema.rb b/db/schema.rb
index a821e49..8dfce34 100755
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
#
# It's strongly recommended to check this file into your version control system.
-ActiveRecord::Schema.define(:version => 20110908094506) do
+ActiveRecord::Schema.define(:version => 20110913114841) do
create_table "contacts", :force => true do |t|
t.string "nick"
@@ -23,18 +23,6 @@ ActiveRecord::Schema.define(:version => 20110908094506) do
t.datetime "updated_at"
end
- create_table "events", :force => true do |t|
- t.integer "user_id"
- t.integer "priority"
- t.text "description"
- t.string "category"
- t.datetime "start"
- t.datetime "stop"
- t.boolean "allday"
- t.datetime "created_at"
- t.datetime "updated_at"
- end
-
create_table "folders", :force => true do |t|
t.string "name"
t.string "delim"
@@ -66,6 +54,17 @@ ActiveRecord::Schema.define(:version => 20110908094506) do
t.datetime "updated_at"
end
+ create_table "notes", :force => true do |t|
+ t.integer "owner_id"
+ t.string "owner_type"
+ t.string "title"
+ t.text "content"
+ t.datetime "created_at"
+ t.datetime "updated_at"
+ end
+
+ add_index "notes", ["owner_id", "owner_type"], :name => "index_notes_on_owner_id_and_owner_type"
+
create_table "prefs", :force => true do |t|
t.string "theme"
t.string "locale"
diff --git a/lib/mail_plugin_extension.rb b/lib/mail_plugin_extension.rb
index 3a464fd..3f71520 100755
--- a/lib/mail_plugin_extension.rb
+++ b/lib/mail_plugin_extension.rb
@@ -40,6 +40,21 @@ module Mail
body.raw_source.size
end
+ def decoded_and_charseted
+ begin
+ if not charset.upcase == 'UTF-8'
+ charset.nil? ? source_charset = $defaults["msg_unknown_charset"] : source_charset = charset
+ charseted = Iconv.iconv("UTF-8",source_charset,decoded).first
+ else
+ charseted = decoded
+ end
+ rescue
+ decoded
+ end
+
+ end
+
+
end
class Field
diff --git a/test/fixtures/events.yml b/test/fixtures/events.yml
deleted file mode 100755
index 2364e8b..0000000
--- a/test/fixtures/events.yml
+++ /dev/null
@@ -1,19 +0,0 @@
-# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
-
-one:
- user_id: 1
- priority: 1
- description: MyText
- category: MyString
- start: 2011-09-06 11:41:29
- stop: 2011-09-06 11:41:29
- allday: false
-
-two:
- user_id: 1
- priority: 1
- description: MyText
- category: MyString
- start: 2011-09-06 11:41:29
- stop: 2011-09-06 11:41:29
- allday: false
diff --git a/test/unit/helpers/events_helper_test.rb b/test/unit/helpers/events_helper_test.rb
deleted file mode 100755
index 2e7567e..0000000
--- a/test/unit/helpers/events_helper_test.rb
+++ /dev/null
@@ -1,4 +0,0 @@
-require 'test_helper'
-
-class EventsHelperTest < ActionView::TestCase
-end
diff --git a/themes/olive/images/left.png b/themes/olive/images/left.png
new file mode 100755
index 0000000..7a2be54
Binary files /dev/null and b/themes/olive/images/left.png differ
diff --git a/themes/olive/images/right.png b/themes/olive/images/right.png
new file mode 100755
index 0000000..cc12a96
Binary files /dev/null and b/themes/olive/images/right.png differ
diff --git a/themes/olive/stylesheets/style.css b/themes/olive/stylesheets/style.css
index 1a6d24c..6e8a6a8 100755
--- a/themes/olive/stylesheets/style.css
+++ b/themes/olive/stylesheets/style.css
@@ -342,11 +342,6 @@ ul.list li .item .avatar {
-webkit-border-bottom-right-radius: 4px;
}
-.block #logo {
- height: 65;
- background-color: #EFF3E4;
-}
-
div.block div.actions-bar {
margin: 5px;
}
@@ -580,3 +575,11 @@ div.actiongroup {
margin: 5px 0;
padding: 2px 0;
}
+
+div.logo {
+ text-align: center;
+}
+
+div#logo {
+ background-color: #EFF3E4;
+}
diff --git a/themes/olive/views/contacts/_contact.html.erb b/themes/olive/views/contacts/_contact.html.erb
new file mode 100755
index 0000000..1a85802
--- /dev/null
+++ b/themes/olive/views/contacts/_contact.html.erb
@@ -0,0 +1,7 @@
+<%= check_box_tag "cids[]", contact.id %>
+<%= link_to contact.nick,edit_contact_path(contact) %>
+<%= contact.first_name %>
+<%= contact.last_name %>
+<%= link_to contact.email, compose_contact_path(contact.id) %>
+<%= contact.info %>
+
diff --git a/themes/olive/views/contacts/_external.html.erb b/themes/olive/views/contacts/_external.html.erb
new file mode 100755
index 0000000..0145a2a
--- /dev/null
+++ b/themes/olive/views/contacts/_external.html.erb
@@ -0,0 +1,7 @@
+
+<%= form_tag(contacts_external_path, :multipart => true) %>
+<%= t(:select_file,:scope=>:compose) %> :
+<%= file_field 'upload', 'datafile' %>
+<%= raw group_action(@ei_buttons) %>
+
+
diff --git a/themes/olive/views/contacts/_left.html.erb b/themes/olive/views/contacts/_left.html.erb
index 9b9fa45..bfe4c88 100755
--- a/themes/olive/views/contacts/_left.html.erb
+++ b/themes/olive/views/contacts/_left.html.erb
@@ -1,9 +1,9 @@
-<%= raw form_field(@contact,"nick",nil,"joe"+', '+t(:must_be_unique),@contact.nick) %>
+<%= raw form_field(@contact,"nick",nil,"joe"+', '+t(:must_be_unique,:scope=>:common),@contact.nick) %>
<%= raw form_field(@contact,"first_name",nil,"Joe",@contact.first_name) %>
<%= raw form_field(@contact,"last_name",nil,"Doe",@contact.last_name) %>
<%= raw form_field(@contact,"email",nil,"joe.doe@domain.com",@contact.email) %>
-<%= raw form_field(@contact,"info",nil,t(:some_add_info),@contact.info) %>
+<%= raw form_field(@contact,"info",nil,t(:some_add_info,:scope=>:common),@contact.info) %>
<%= raw single_action('save','common','save.png') %>
diff --git a/themes/olive/views/contacts/_list.html.erb b/themes/olive/views/contacts/_list.html.erb
index 2ffd494..55d192d 100755
--- a/themes/olive/views/contacts/_list.html.erb
+++ b/themes/olive/views/contacts/_list.html.erb
@@ -1,31 +1,25 @@
-
-
- <%= t(:total_entries,:scope=>:contact) %>: <%= @contacts.total_entries %>
-
- <%= will_paginate @contacts %>
+
<%= t(:total_entries,:scope=>:contact) %>: <%= @contacts.total_entries %>
+<%= will_paginate @contacts %>
-
-
+
+
+
+<%= raw contacts_table_header %>
+
+
+<% trclass = :even %>
+<% @contacts.each do |c| %>
+
+<%= render :partial => 'contacts/contact', :object => c %>
+
+<% trclass == :even ? trclass = :odd : trclass = :even %>
+<% end %>
+
+
- <%= will_paginate @contacts %>
+<%= will_paginate @contacts %>
-
diff --git a/themes/olive/views/contacts/_ops.html.erb b/themes/olive/views/contacts/_ops.html.erb
index af7f154..eba864f 100755
--- a/themes/olive/views/contacts/_ops.html.erb
+++ b/themes/olive/views/contacts/_ops.html.erb
@@ -1,5 +1,3 @@
-
- <%= raw group_action(@buttons) %>
-
+<%= raw group_action(@buttons) %>
diff --git a/themes/olive/views/contacts/_row.html.erb b/themes/olive/views/contacts/_row.html.erb
deleted file mode 100755
index 706229f..0000000
--- a/themes/olive/views/contacts/_row.html.erb
+++ /dev/null
@@ -1,7 +0,0 @@
-<%= check_box_tag "cids[]", row.id %>
-<%= link_to row.nick,edit_contact_path(row) %>
-<%= row.first_name %>
-<%= row.last_name %>
-<%= link_to row.email, {:controller => 'messages',:action => 'compose' , :cids => row.id} %>
-<%= row.info %>
-
diff --git a/themes/olive/views/contacts/index.html.erb b/themes/olive/views/contacts/index.html.erb
index 61be703..86b8e62 100755
--- a/themes/olive/views/contacts/index.html.erb
+++ b/themes/olive/views/contacts/index.html.erb
@@ -7,21 +7,21 @@
<% end %>
-
- <%= raw main_navigation(:contacts_tab) %>
-
-
- <%= form_tag(contacts_ops_path,{:name=>'contacts'})%>
-
- <% if @contacts.size.zero? %>
-
<%= t(:no_entries,:scope=>:contact) %>
- <%= raw single_action('create_new','contact','plus.png') %>
- <% else %>
- <%= render :partial => 'ops' %>
- <%= render :partial => 'list' %>
- <% end %>
-
-
-
+
+<%= raw main_navigation(:contacts_tab) %>
+
+
+<%= form_tag(contacts_ops_path,{:name=>'contacts'})%>
+<% if @contacts.size.zero? %>
+
<%= t(:no_entries,:scope=>:contact) %>
+<%= raw single_action('create_new','contact','plus.png') %>
+
+<% else %>
+<%= render :partial => 'ops' %>
+<%= render :partial => 'list' %>
+
+<% end %>
+<%= render :partial => 'external' %>
+
diff --git a/themes/olive/views/events/_calendar.html.erb b/themes/olive/views/events/_calendar.html.erb
deleted file mode 100755
index 2d2417f..0000000
--- a/themes/olive/views/events/_calendar.html.erb
+++ /dev/null
@@ -1,3 +0,0 @@
-
-<%= raw calendar(1,2,3) %>
-
diff --git a/themes/olive/views/internal/_version.html.erb b/themes/olive/views/internal/_version.html.erb
index b32cad9..881c09d 100755
--- a/themes/olive/views/internal/_version.html.erb
+++ b/themes/olive/views/internal/_version.html.erb
@@ -1,4 +1,4 @@
-<%= t(:version) %>: <%= $defaults["version"] %>
+<%= link_to (t(:version,:scope=>:common) + " " + $defaults["version"]),about_path %>
diff --git a/themes/olive/views/internal/about.html.erb b/themes/olive/views/internal/about.html.erb
new file mode 100755
index 0000000..19336c1
--- /dev/null
+++ b/themes/olive/views/internal/about.html.erb
@@ -0,0 +1,27 @@
+<% content_for :title do %>
+- <%= t(:about,:scope=>:internal) %>
+<% end %>
+
+<% content_for :sidebar do %>
+<%= content_for_sidebar %>
+<% end %>
+
+
+
+ <%= raw single_navigation(:about,:internal) %>
+
+
+
+
+
+
+<%= render :file => 'config/about.txt' %>
+<%= render :text => "To do:\n" %>
+<%= render :file => 'config/todo.txt' %>
+
+
+
+
+
diff --git a/themes/olive/views/layouts/application.html.erb b/themes/olive/views/layouts/application.html.erb
index 2f83eaa..9951d00 100755
--- a/themes/olive/views/layouts/application.html.erb
+++ b/themes/olive/views/layouts/application.html.erb
@@ -25,8 +25,7 @@ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
diff --git a/themes/olive/views/layouts/simple.html.erb b/themes/olive/views/layouts/simple.html.erb
index 6d06595..a4bd2a8 100755
--- a/themes/olive/views/layouts/simple.html.erb
+++ b/themes/olive/views/layouts/simple.html.erb
@@ -11,6 +11,6 @@ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
<%= yield %>
-
+