Minor gems update. Apply search design and controller. Add and refactor search scopes. Fix relations. Separate and refactor search translations. Refactor search form. Refs #255

This commit is contained in:
Pavel Chipiga 2012-03-06 17:53:04 +02:00
parent 9d8eb8a3f2
commit d6f9b2c3e9
39 changed files with 801 additions and 103 deletions

View File

@ -8,7 +8,7 @@ gem 'redhillonrails_core', :git => 'git://github.com/chipiga/redhillonrails_core
# gem 'schema_plus', '~> 0.2.1' # buggy shit!
gem 'devise', '~> 2.0.4'
gem 'omniauth', '~> 1.0.2'
gem 'omniauth', '~> 1.0.3'
gem 'omniauth-openid', '~> 1.0.1'
gem 'cancan', '~> 1.6.7'
@ -36,7 +36,7 @@ gem 'newrelic_rpm', '~> 3.3.2'
gem 'rails3-jquery-autocomplete', '~> 1.0.6'
gem 'will_paginate', '~> 3.0.3'
gem 'meta-tags', '~> 1.2.4', :require => 'meta_tags'
gem 'meta-tags', '~> 1.2.5', :require => 'meta_tags'
gem "haml-rails", '~> 0.3.4'
gem 'jquery-rails', '~> 2.0.1'
@ -50,7 +50,7 @@ end
group :production do
gem "airbrake", '~> 3.0.9'
gem 'bluepill', '~> 0.0.59', :require => false
gem 'bluepill', '~> 0.0.60', :require => false
gem 'daemons', '1.1.6' # for DJ
end

View File

@ -62,7 +62,7 @@ GEM
activerecord (>= 2.2.2)
arel (3.0.2)
bcrypt-ruby (3.0.1)
bluepill (0.0.59)
bluepill (0.0.60)
activesupport (>= 3.0.0)
daemons (~> 1.1.4, <= 1.1.6)
i18n (>= 0.5.0)
@ -145,7 +145,7 @@ GEM
json (1.6.5)
kgio (2.7.2)
libv8 (3.3.10.4)
mail (2.4.1)
mail (2.4.3)
i18n (>= 0.4.0)
mime-types (~> 1.16)
treetop (~> 1.4.8)
@ -158,7 +158,7 @@ GEM
skinny (~> 0.2)
sqlite3 (~> 1.3)
thin (~> 1.2)
meta-tags (1.2.4)
meta-tags (1.2.6)
actionpack
mime-types (1.17.2)
multi_json (1.1.0)
@ -172,7 +172,7 @@ GEM
net-ssh (>= 1.99.1)
newrelic_rpm (3.3.2)
nokogiri (1.5.0)
omniauth (1.0.2)
omniauth (1.0.3)
hashie (~> 1.2)
rack
omniauth-openid (1.0.1)
@ -188,7 +188,7 @@ GEM
polyglot (0.3.3)
posix-spawn (0.3.6)
rack (1.4.1)
rack-cache (1.1)
rack-cache (1.2)
rack (>= 0.4)
rack-openid (1.3.1)
rack (>= 1.1.0)
@ -275,7 +275,7 @@ GEM
treetop (1.4.10)
polyglot
polyglot (>= 0.3.1)
tzinfo (0.3.31)
tzinfo (0.3.32)
uglifier (1.2.3)
execjs (>= 0.3.0)
multi_json (>= 1.0.2)
@ -300,7 +300,7 @@ DEPENDENCIES
RedCloth
airbrake (~> 3.0.9)
ancestry (~> 1.2.4)
bluepill (~> 0.0.59)
bluepill (~> 0.0.60)
cancan (~> 1.6.7)
cape
capistrano
@ -320,9 +320,9 @@ DEPENDENCIES
hirb
jquery-rails (~> 2.0.1)
mailcatcher
meta-tags (~> 1.2.4)
meta-tags (~> 1.2.5)
newrelic_rpm (~> 3.3.2)
omniauth (~> 1.0.2)
omniauth (~> 1.0.3)
omniauth-openid (~> 1.0.1)
paperclip (~> 2.7.0)
pg (~> 0.13.2)

View File

@ -1,11 +1,11 @@
jQuery(document).ready(function(){
//var params = {
// changedEl: ".lineForm select",
// visRows: 999999,
// scrollArrows: false
// }
//
// cuSel(params);
var params = {
changedEl: ".lineForm select",
visRows: 999999,
scrollArrows: false
}
cuSel(params);
});
});

View File

@ -372,3 +372,10 @@ div.blame_data tr td.code pre {
padding: 0;
margin: 0;
}
// Search
p.block { margin-bottom: 10px; clear: both; }
table.tablesorter.bmargin5 {
th { padding: 5px; }
td p.block {margin-bottom: 0px;}
}

View File

@ -83,7 +83,7 @@ class RepositoriesController < ApplicationController
@projects = Project.joins(owner_subquery).addable_to_repository(@repository.id)
@projects = @projects.paginate(:page => (params[:iDisplayStart].to_i/params[:iDisplayLength].to_i).to_i + 1, :per_page => params[:iDisplayLength])
@projects = @projects.by_visibilities(['open']) if @repository.platform.platform_type == 'main'
@projects = @projects.by_visibilities('open') if @repository.platform.platform_type == 'main'
@total_projects = @projects.count
@projects = @projects.where(['projects.name LIKE ?', "#{params[:sSearch]}%"]) if params[:sSearch] and !params[:sSearch].empty?

View File

@ -0,0 +1,25 @@
# -*- encoding : utf-8 -*-
class SearchController < ApplicationController
before_filter :authenticate_user!
# load_and_authorize_resource
def index
params[:type] ||= 'all'
case params[:type]
when 'all'
find_collection('projects')
find_collection('users')
find_collection('groups')
find_collection('platforms')
when 'projects', 'users', 'groups', 'platforms'
find_collection(params[:type])
end
end
protected
def find_collection(type)
var = :"@#{type}"
instance_variable_set var, type.classify.constantize.search(params[:query]).paginate(:page => params[:page]) unless instance_variable_defined?(var)
end
end

View File

@ -17,8 +17,9 @@ class Group < ActiveRecord::Base
validates :uname, :presence => true, :uniqueness => {:case_sensitive => false}, :format => { :with => /^[a-z0-9_]+$/ }
validate { errors.add(:uname, :taken) if User.where('uname LIKE ?', uname).present? }
scope :by_owner, lambda { |owner| where(:owner_id => owner.id) }
scope :by_admin, lambda { |admin| joins(:relations).where(:'relations.role' => 'admin', :'relations.target_id' => admin.id, :'relations.target_type' => 'User') }
scope :search, lambda {|q| where("uname ILIKE ?", "%#{q}%")}
scope :by_owner, lambda {|owner| where(:owner_id => owner.id)}
scope :by_admin, lambda {|admin| joins(:relations).where(:'relations.role' => 'admin', :'relations.target_id' => admin.id, :'relations.target_type' => 'User')}
attr_readonly :own_projects_count

View File

@ -26,7 +26,8 @@ class Platform < ActiveRecord::Base
after_destroy lambda { umount_directory_for_rsync unless hidden? }
after_update :update_owner_relation
scope :by_visibilities, lambda {|v| {:conditions => ['visibility in (?)', v.join(',')]}}
scope :search, lambda {|q| where("name ILIKE ?", "%#{q}%").open}
scope :by_visibilities, lambda {|v| where(:visibility => v)}
scope :open, where(:visibility => 'open')
scope :hidden, where(:visibility => 'hidden')
scope :main, where(:platform_type => 'main')

View File

@ -30,8 +30,10 @@ class Project < ActiveRecord::Base
attr_readonly :name
scope :recent, order("name ASC")
scope :search, lambda {|q| by_name("%#{q}%").open}
scope :by_name, lambda {|name| where('projects.name ILIKE ?', name)}
scope :by_visibilities, lambda {|v| {:conditions => ['visibility in (?)', v.join(',')]}}
scope :by_visibilities, lambda {|v| where(:visibility => v)}
scope :open, where(:visibility => 'open')
scope :addable_to_repository, lambda { |repository_id| where("projects.id NOT IN (SELECT project_to_repositories.project_id FROM project_to_repositories WHERE (project_to_repositories.repository_id = #{ repository_id }))") }
scope :automateable, where("projects.id NOT IN (SELECT auto_build_lists.project_id FROM auto_build_lists)")

View File

@ -7,9 +7,9 @@ class User < ActiveRecord::Base
devise :database_authenticatable, :registerable, #:omniauthable, # :token_authenticatable, :encryptable, :timeoutable
:recoverable, :rememberable, :validatable #, :trackable, :confirmable, :lockable
has_one :notifier, :class_name => 'Settings::Notifier' #:notifier
has_one :notifier, :class_name => 'Settings::Notifier', :dependent => :destroy #:notifier
has_many :activity_feeds
has_many :activity_feeds, :dependent => :destroy
has_many :authentications, :dependent => :destroy
has_many :build_lists, :dependent => :destroy
@ -17,7 +17,7 @@ class User < ActiveRecord::Base
has_many :comments, :dependent => :destroy
has_many :relations, :as => :object, :dependent => :destroy
has_many :targets, :as => :object, :class_name => 'Relation'
has_many :targets, :as => :object, :class_name => 'Relation', :dependent => :destroy
has_many :projects, :through => :targets, :source => :target, :source_type => 'Project', :autosave => true
has_many :groups, :through => :targets, :source => :target, :source_type => 'Group', :autosave => true
@ -40,7 +40,9 @@ class User < ActiveRecord::Base
attr_readonly :uname
attr_accessor :login
after_create :create_settings_notifier
scope :search, lambda {|q| where("uname ILIKE ?", "%#{q}%")}
after_create lambda { self.create_notifier }
def admin?
role == 'admin'
@ -57,6 +59,7 @@ class User < ActiveRecord::Base
def fullname
return "#{uname} (#{name})"
end
class << self
def find_for_database_authentication(warden_conditions)
conditions = warden_conditions.dup
@ -102,11 +105,4 @@ class User < ActiveRecord::Base
def avatar(size)
"https://secure.gravatar.com/avatar/#{Digest::MD5.hexdigest(email.downcase)}?s=#{size}&r=pg"
end
private
def create_settings_notifier
self.create_notifier
end
end

View File

@ -30,7 +30,7 @@
.lefter= t("layout.build_lists.ownership.index")
.both
%br
= f.submit t("layout.search")
= f.submit t("layout.search.header")
.block
%h3.small= t("activerecord.attributes.build_list.status")
.lineForm.aside= f.select :status, BuildList::STATUSES.collect{|status| [BuildList.human_status(status), status]}, {:include_blank => true, :selected => @filter.status}, {:class => 'sel80 aside', :id => 'status', :tabindex => 2}
@ -52,4 +52,4 @@
= f.text_field :bs_id
%br
%br
= f.submit t("layout.search")
= f.submit t("layout.search.header")

View File

@ -17,10 +17,7 @@
= render 'layouts/menu/top'
.logo= image_tag 'logo-mini.png', :alt => 'logo'
.information
.search
.pic
.field
%input.gray{:onclick => "if(this.value=='#{t "layout.search"}'){this.value='';this.className='black';}", :onblur => "if(this.value==''){this.value='#{t "layout.search"}';this.className='gray';}", :type => "text", :value => "#{t "layout.search"}"}
= render 'search/form'
.user
.avatar= image_tag gravatar_url(current_user.email, 30), :alt => 'avatar', :height => "30"
.profile

View File

@ -0,0 +1,4 @@
.search
= form_tag search_index_path, :method => 'get' do
.pic
.field= text_field_tag 'query', params[:query], :placeholder => t("layout.search.header")

View File

@ -0,0 +1,5 @@
= form_tag search_index_path, :method => 'get' do
.leftside= text_field_tag 'query', params[:query], :placeholder => t("layout.search.header"), :class => 'exsearch'
.lineForm.leftside.rmargin10= select_tag 'type', options_for_select(t('layout.search.types').invert, params[:type]), :class => 'sel80', :id => 'selSearch'
.leftside= submit_tag t("layout.search.header"), :class => 'button width100'
.both

View File

@ -0,0 +1,3 @@
%p.block
.img= image_tag 'ava-admin.png'
.forimg= link_to group.uname, group

View File

@ -0,0 +1 @@
%p.block= link_to platform.name, platform

View File

@ -0,0 +1,4 @@
%p.block
= link_to "#{project.owner.uname} / #{project.name}", project
%br
= project.description

View File

@ -0,0 +1,10 @@
- collection = instance_variable_get("@#{type}")
%table.tablesorter.bmargin5{:cellpadding => "0", :cellspacing => "0"}
%thead
%tr
%th #{t "layout.#{type}.list_header"} (#{collection.count})
%tbody
- collection.each do |c|
%tr
%td= render type.singularize, type.singularize.to_sym => c
= link_to t('layout.search.all'), search_index_path(:query => params[:query], :type => type) if collection.present?

View File

@ -0,0 +1,3 @@
%p.block
.img= image_tag user.avatar(25)
.forimg= link_to user.fullname, user

View File

@ -0,0 +1,17 @@
%h3= t 'layout.search.advanced'
= render 'form_advanced'
- if params[:type] == 'all'
#all
= render 'table', :type => 'projects'
.both
.left.width400.rmargin55
= render 'table', :type => 'users'
= render 'table', :type => 'groups'
.left.width400
= render 'table', :type => 'platforms'
- else
- collection = instance_variable_get("@#{params[:type]}")
.tmargin10{:id => params[:type]}= render :collection => collection, :partial => params[:type].to_s.underscore.singularize
%br
= will_paginate collection
.both

View File

@ -2,5 +2,4 @@
.group
= label_tag :query, t("layout.search_by_name"), :class => :label
= text_field_tag :query
%button.search{:type => "submit"}
= t("layout.search")
%button.search{:type => "submit"}= t("layout.search.header")

View File

@ -10,5 +10,5 @@
.group.navform.wat-cf
%button.button{ :type => "submit" }
= image_tag("choose.png", :alt => "Save")
= t("layout.search")
= t("layout.search.header")

View File

@ -15,7 +15,6 @@ en:
filtered_label: (filtered from _MAX_)
layout:
search: Search
logged_in_as: You logged as
logout: Logout
user_list: User list
@ -26,7 +25,6 @@ en:
update: Update
delete: Erase
save: Save
search: Search
clone: Clone
search_by_name: Filter by name
are_you_sure: "Sure?"

View File

@ -0,0 +1,12 @@
en:
layout:
search:
header: Search
advanced: Advanced search
all: Show All
types:
all: All
projects: Projects
users: Users
groups: Groups
platforms: Platforms

View File

@ -0,0 +1,12 @@
ru:
layout:
search:
header: Поиск
advanced: Расширенный поиск
all: Показать все
types:
all: Все
projects: Проекты
users: Пользователи
groups: Группы
platforms: Платформы

View File

@ -15,7 +15,6 @@ ru:
filtered_label: (отфильтровано из _MAX_)
layout:
search: Поиск
logged_in_as: Вы вошли как
logout: Выйти
user_list: Список пользователей
@ -26,7 +25,6 @@ ru:
update: Обновить
delete: Удалить
save: Сохранить
search: Искать
clone: Клонировать
search_by_name: Фильтр по имени
are_you_sure: "Вы уверены?"

View File

@ -184,8 +184,6 @@ Rosa::Application.routes.draw do
end
end
resources :activity_feeds, :only => [:index]
resources :users, :groups do
resources :platforms, :only => [:new, :create]
@ -194,6 +192,10 @@ Rosa::Application.routes.draw do
# resources :repositories, :only => [:new, :create]
end
resources :activity_feeds, :only => [:index]
resources :search, :only => [:index]
match '/catalogs', :to => 'categories#platforms', :as => :catalogs
match 'product_status', :to => 'product_build_lists#status_build'

View File

@ -40,7 +40,7 @@
</div>
<div class="in">
<a class="button disabled" id ="btnLogin" href="#" onClick="logIn();">Войти</a>
<input type="submit" id="btnLogin" onClick="logIn();" class="button disabled" value="Войти"></input>
</div>
</div>
@ -68,7 +68,10 @@
</div>
</article>
<div class="error" id="hint">
<p>Неверная пара логин/пароль.</p>
<div class="img"></div>
<div class="msg">Неверная пара логин/пароль.</div>
<div class="both">
</div>
</div>
<div class="forgot">
<div class="password">

View File

@ -323,22 +323,23 @@
<a href="#">raw</a> | <a href="#">blame</a> | <a href="#">history</a>
</div>
</div>
<div class="gutter">
<span>1</span><br />
<span>2</span><br />
<span>3</span><br />
<span>4</span><br />
<span>5</span><br />
<span>6</span><br />
<span>7</span><br />
</div>
<pre class='brush: ruby'>source 'https//rubygems.org'
<div class="data">
<div class="gutter">
<span>1</span><br />
<span>2</span><br />
<span>3</span><br />
<span>4</span><br />
<span>5</span><br />
<span>6</span><br />
<span>7</span><br />
</div>
<pre class='brush: ruby'>source 'https//rubygems.org'
gemspec
if ENV[ 'AREL']
gem 'arel', :path => ENV['AREL']
else
gem 'arel'</pre>
</div>
<div class="both"></div>
</div>
</div>

View File

@ -7,19 +7,7 @@
<script type="text/javascript" src="js/jquery-1.7.1.min.js"></script>
<link rel="stylesheet" type="text/css" href="styles/registration.css" />
<script type='text/javascript' src='js/checkbox.js'></script>
<script type='text/javascript'>
function disError(elem) {
buttonCheck();
}
function buttonCheck() {
if ((document.getElementById("login").value!="")&&(document.getElementById("name").value!="")&&(document.getElementById("pass").value!="")&&(document.getElementById("pass2").value!="")&&(document.getElementById("email").value!="")) {
document.getElementById("btnLogin").className = "button";
} else {
document.getElementById("btnLogin").className = "button disabled";
}
}
</script>
<script type='text/javascript' src='js/registration.js'></script>
</head>
<body>
<div class="wrap">
@ -73,7 +61,7 @@
<div class="both"></div>
<div class="in">
<a id="btnLogin" class="button disabled" href="#">Регистрация</a>
<input type="submit" id="btnLogin" class="button disabled" value="Регистрация"></input>
</div>
@ -81,6 +69,28 @@
</article>
<div class="error login" id="hintLogin">
<div class="img"></div>
<div class="msg">Содержит только латинские буквы.</div>
<div class="both"></div>
</div>
<div class="error name" id="hintName">
<div class="img"></div>
<div class="msg">Использование спецзнаков запрещено.</div>
<div class="both"></div>
</div>
<div class="error email" id="hintEmail">
<div class="img"></div>
<div class="msg">Введенный текст не является адресом почты.<br />Или такой адрес уже зарегистирован.</div>
<div class="both"></div>
</div>
<div class="error password" id="hintPassword">
<div class="img"></div>
<div class="msg">Пароль должен содержать от 5 до 20 символов.<br />Допустимы только латинские символы, спецзнаки и цифры.<br />Или пароли не совпадают.</div>
<div class="both"></div>
</div>
</div>
<!--Footer-->
<footer>

341
doc/design/abf-search.html Normal file
View File

@ -0,0 +1,341 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Сборочная среда</title>
<script type="text/javascript" src="js/html5shiv.js"></script>
<link rel="stylesheet" type="text/css" href="styles/main.css" />
<script type="text/javascript" src="js/jquery-1.7.1.min.js"></script>
<link href="styles/cusel.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="js/cusel-2.5.js"></script>
<script type="text/javascript" src="js/cusel-init.js"></script>
<script type="text/javascript" src="js/all.js"></script>
<script type="text/javascript" src="js/exsearch.js"></script>
<link rel="stylesheet" href="styles/blue/style.css" type="text/css" id="" media="print, projection, screen" />
</head>
<body>
<div class="wrap">
<!--Top block-->
<header>
<div class="left">
</div>
<div class="middle">
<!--Main menu-->
<menu>
<ul>
<li>
<a href="#" class="first">Главная</a>
</li>
<li>
<a href="#">Проекты</a>
</li>
<li>
<a href="#">Группы</a>
</li>
<li>
<a href="#">Мониторинг</a>
</li>
<li>
<a href="#" class="active">Платформа</a>
</li>
<li>
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->
<div class="search">
<div class="pic">
</div>
<div class="field">
<input type="text" value="Поиск" class="gray" onClick="if(this.value=='Поиск'){this.value='';this.className='black';}" onblur="if(this.value==''){this.value='Поиск';this.className='gray';}" />
</div>
</div>
<div class="user">
<div class="avatar" onclick="droplist();">
<img src="pics/ava.png" alt="avatar" height="30" />
</div>
<div class="profile" onclick="droplist();">
<a href="#" onclick="droplist();">mikimaus <img src="pics/expand-white.png" alt="ex" /></a>
</div>
</div>
<div class="both">
</div>
<div class="droplist-wrap">
<div class="droplist" id="droplist">
<div class="a"><a href="#">Публичный профиль</a></div>
<div class="a"><a href="#">Настройки</a></div>
<div class="a"><a href="#">Выйти</a></div>
</div>
</div>
</div>
</div>
<div class="right">
</div>
<div class="both">
</div>
</header>
<div class="both">
</div>
<!--Page-->
<article>
<div class="all">
<h3>Расширенный поиск</h3>
<div class="leftside">
<input type="text" class="exsearch gray" value="Найти..." onClick="if(this.value=='Найти...'){this.value='';this.className='exsearch black';}" onblur="if(this.value==''){this.value='Найти...';this.className='exsearch gray';}" />
</div>
<div class="lineForm leftside rmargin10">
<select class="sel80" id="selSearch" name="selSearch" tabindex="2">
<option selected="selected" value="all">Все</option>
<option value="projects">Проекты</option>
<option value="users">Пользователи и группы</option>
<option value="platforms">Платформы</option>
</select>
</div>
<div class="leftside">
<input type="submit" class="button width100" value="Найти" />
</div>
<div class="both"></div>
<div id="all" style="display: block;">
<table id="myTable" class="tablesorter bmargin5" cellpadding="0" cellspacing="0">
<thead>
<tr>
<th>Проекты (10909349843874)</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<p>
<a href="#">santaux / WacomDrivers</a><br />
Данный проект создан с целью улучшения поддержки продукции компании Wacom под Linux. В настоящее время ощущается острая проблема с
функциональными клавишами как на пере, так и на самом дигитайзере. Особое внимание уделяется профессиональной линейке продукции,
серии Intiuos4.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a href="#">santaux / WacomDrivers</a><br />
Данный проект создан с целью улучшения поддержки продукции компании Wacom под Linux. В настоящее время ощущается острая проблема с
функциональными клавишами как на пере, так и на самом дигитайзере. Особое внимание уделяется профессиональной линейке продукции,
серии Intiuos4.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a href="#">santaux / WacomDrivers</a><br />
Данный проект создан с целью улучшения поддержки продукции компании Wacom под Linux. В настоящее время ощущается острая проблема с
функциональными клавишами как на пере, так и на самом дигитайзере. Особое внимание уделяется профессиональной линейке продукции,
серии Intiuos4.
</p>
</td>
</tr>
<tr style="display: none;" id="row1-1">
<td>
<p>
<a href="#">santaux / WacomDrivers</a><br />
Данный проект создан с целью улучшения поддержки продукции компании Wacom под Linux. В настоящее время ощущается острая проблема с
функциональными клавишами как на пере, так и на самом дигитайзере. Особое внимание уделяется профессиональной линейке продукции,
серии Intiuos4.
</p>
</td>
</tr>
<tr style="display: none;" id="row1-2">
<td>
<p>
<a href="#">santaux / WacomDrivers</a><br />
Данный проект создан с целью улучшения поддержки продукции компании Wacom под Linux. В настоящее время ощущается острая проблема с
функциональными клавишами как на пере, так и на самом дигитайзере. Особое внимание уделяется профессиональной линейке продукции,
серии Intiuos4.
</p>
</td>
</tr>
</tbody>
</table>
<a href="#" id="projects-more" class="lmargin7">Показать все</a>
<div class="both"></div>
<div class="left width400 rmargin55">
<table id="myTable2" class="tablesorter bmargin5" cellpadding="0" cellspacing="0">
<thead>
<tr>
<th>Пользователи / группы (1096)</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<div class="img"><img src="pics/ava-admin.png" /></div><div class="forimg">jeni (Jane Conzi)</div>
</td>
</tr>
<tr>
<td>
<div class="img"><img src="pics/ava-admin.png" /></div><div class="forimg">miki (Mike Shane)</div>
</td>
</tr>
<tr>
<td>
<div class="img"><img src="pics/ava-admin.png" /></div><div class="forimg">vitko (Виталий Усупов)</div>
</td>
</tr>
<tr>
<td>
<div class="img"><img src="pics/ava-admin.png" /></div><div class="forimg">miha (Михаил Буданов)</div>
</td>
</tr>
<tr style="display: none;" id="row2-1">
<td>
<div class="img"><img src="pics/ava-admin.png" /></div><div class="forimg">miha (Михаил Буданов)</div>
</td>
</tr>
<tr style="display: none;" id="row2-2">
<td>
<div class="img"><img src="pics/ava-admin.png" /></div><div class="forimg">miha (Михаил Буданов)</div>
</td>
</tr>
</tbody>
</table>
<a href="#" id="users-more" class="lmargin5">Показать все</a>
</div>
<div class="left width400">
<table id="myTable3" class="tablesorter bmargin5" cellpadding="0" cellspacing="0">
<thead>
<tr>
<th>Платформы (96)</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<a href="#">rosa2011</a>
</td>
</tr>
<tr>
<td>
<a href="#">rosa_lts1</a>
</td>
</tr>
<tr>
<td>
<a href="#">mandriva_2010.1</a>
</td>
</tr>
<tr>
<td>
<a href="#">rosa_tech_preview_2012</a>
</td>
</tr>
<tr style="display: none;" id="row3-1">
<td>
<a href="#">rosa_tech_preview_2012</a>
</td>
</tr>
<tr style="display: none;" id="row3-2">
<td>
<a href="#">rosa_tech_preview_2012</a>
</td>
</tr>
</tbody>
</table>
<a href="#" id="platforms-more" class="lmargin5">Показать все</a>
</div>
</div>
<div class="both"></div>
<div id="projects" style="display: none;" class="tmargin10">
<a href="#">santaux / WacomDrivers</a><br />
Данный проект создан с целью улучшения поддержки продукции компании Wacom под Linux. В настоящее время ощущается острая проблема с
функциональными клавишами как на пере, так и на самом дигитайзере. Особое внимание уделяется профессиональной линейке продукции,
серии Intiuos4. <br />
<br />
<a href="#">santaux / WacomDrivers</a><br />
Данный проект создан с целью улучшения поддержки продукции компании Wacom под Linux. В настоящее время ощущается острая проблема с
функциональными клавишами как на пере, так и на самом дигитайзере. Особое внимание уделяется профессиональной линейке продукции,
серии Intiuos4. <br />
<br />
<a href="#">santaux / WacomDrivers</a><br />
Данный проект создан с целью улучшения поддержки продукции компании Wacom под Linux. В настоящее время ощущается острая проблема с
функциональными клавишами как на пере, так и на самом дигитайзере. Особое внимание уделяется профессиональной линейке продукции,
серии Intiuos4. <br />
<br />
</div>
<div id="users" style="display: none;" class="tmargin10">
<div class="img"><img src="pics/ava-admin.png" /></div><div class="forimg">jeni (Jane Conzi)</div>
<div class="both"></div>
<div class="img"><img src="pics/ava-admin.png" /></div><div class="forimg">miki (Mike Shane)</div>
<div class="both"></div>
<div class="img"><img src="pics/ava-admin.png" /></div><div class="forimg">vitko (Виталий Усупов)</div>
<div class="both"></div>
<div class="img"><img src="pics/ava-admin.png" /></div><div class="forimg">miha (Михаил Буданов)</div>
<div class="both"></div>
</div>
<div id="platforms" style="display: none;" class="tmargin10">
<a href="#">rosa2011</a><br />
<a href="#">rosa_lts1</a><br />
<a href="#">mandriva_2010.1</a><br />
<a href="#">rosa_tech_preview_2012</a>
</div>
<div class="both"></div>
</div>
</article>
</div>
<!--Footer-->
<footer>
<ul>
<li>
ROSA Лаб. © 2012 <img src="pics/square.png" alt="_" />
</li>
<li>
<img src="pics/flag.png" alt="rosa" /> <img src="pics/square.png" alt="_" />
</li>
<li>
<a href="#">О компании</a> <img src="pics/square.png" alt="_" />
</li>
<li>
<a href="#">Контакты</a> <img src="pics/square.png" alt="_" />
</li>
<li>
<a href="#">Условия использования</a> <img src="pics/square.png" alt="_" />
</li>
<li>
<a href="#">Конфиденциальность</a> <img src="pics/square.png" alt="_" />
</li>
<li>
<a href="#">Безопасность</a>
</li>
</ul>
</footer>
<script>
var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
lineNumbers: true
});
</script>
</body>
</html>

45
doc/design/js/exsearch.js Normal file
View File

@ -0,0 +1,45 @@
$(document).ready(function() {
$("#selSearch").change(function() {
var selection = document.getElementById("selSearch").value;
if (selection == "all") {
$("#projects").fadeOut(0);
$("#platforms").fadeOut(0);
$("#users").fadeOut(0);
$("#all").fadeIn("fast");
}
if (selection == "projects") {
$("#all").fadeOut(0);
$("#platforms").fadeOut(0);
$("#users").fadeOut(0);
$("#projects").fadeIn("fast");
}
if (selection == "users") {
$("#all").fadeOut(0);
$("#projects").fadeOut(0);
$("#platforms").fadeOut(0);
$("#users").fadeIn("fast");
}
if (selection == "platforms") {
$("#all").fadeOut(0);
$("#projects").fadeOut(0);
$("#users").fadeOut(0);
$("#platforms").fadeIn("fast");
}
});
$("#projects-more").click(function() {
$("#row1-1").fadeIn("fast");
$("#row1-2").fadeIn("fast");
});
$("#users-more").click(function() {
$("#row2-1").fadeIn("fast");
$("#row2-2").fadeIn("fast");
});
$("#platforms-more").click(function() {
$("#row3-1").fadeIn("fast");
$("#row3-2").fadeIn("fast");
});
});

View File

@ -0,0 +1,72 @@
function logIn() {
$("#hintLogin").fadeIn("slow");
document.getElementById("login").className="registartion-input-error";
$("#hintName").fadeIn("slow");
document.getElementById("name").className="registartion-input-error";
$("#hintEmail").fadeIn("slow");
document.getElementById("email").className="registartion-input-error";
$("#hintPassword").fadeIn("slow");
document.getElementById("pass").className="registartion-input-error";
document.getElementById("pass2").className="registartion-input-error";
}
function disError(elem) {
$("#hintLogin").fadeOut("fast");
$("#hintName").fadeOut("fast");
$("#hintEmail").fadeOut("fast");
$("#hintPassword").fadeOut("fast");
if (document.getElementById("login").className=="registartion-input-error") {
if (this.id=="login") {
document.getElementById("login").className="registartion-input-focus";
} else {
document.getElementById("login").className="registartion-input-no-focus";
}
}
if (document.getElementById("name").className=="registartion-input-error") {
if (this.id=="name") {
document.getElementById("name").className="registartion-input-focus";
} else {
document.getElementById("name").className="registartion-input-no-focus";
}
}
if (document.getElementById("email").className=="registartion-input-error") {
if (this.id=="email") {
document.getElementById("email").className="registartion-input-focus";
} else {
document.getElementById("email").className="registartion-input-no-focus";
}
}
if (document.getElementById("pass").className=="registartion-input-error") {
if (this.id=="pass") {
document.getElementById("pass").className="registartion-input-focus";
} else {
document.getElementById("pass").className="registartion-input-no-focus";
}
}
if (document.getElementById("pass2").className=="registartion-input-error") {
if (this.id=="pass2") {
document.getElementById("pass2").className="registartion-input-focus";
} else {
document.getElementById("pass2").className="registartion-input-no-focus";
}
}
buttonCheck();
}
/*function disError(elem) {
buttonCheck();
}*/
function buttonCheck() {
if ((document.getElementById("login").value!="")&&(document.getElementById("name").value!="")&&(document.getElementById("pass").value!="")&&(document.getElementById("pass2").value!="")&&(document.getElementById("email").value!="")) {
document.getElementById("btnLogin").className = "button";
} else {
document.getElementById("btnLogin").className = "button disabled";
}
}
$(document).ready(function() {
$("#btnLogin").click(function() {
logIn();
});
});

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -105,9 +105,9 @@ a.button, input.button {
}
input.button {
padding: 5px 27px 8px 27px;
height: 28px;
width: 110px;
padding: 3px 27px 8px 27px;
height: 25px;
width: auto;
}
a.button:hover, input.button:hover {
@ -120,7 +120,7 @@ a.button:active, input.button:active{
background: url("../pics/button-green-press.png");
}
a.button:disabled, a.button.disabled, input.button:disabled {
a.button:disabled, a.button.disabled, input.button:disabled, input.button.disabled {
background: #125687;
background: url("../pics/button-green-disabled.png");
cursor: default;
@ -252,9 +252,8 @@ nav p {
}
div.error {
background: url("../pics/error-message.png");
width: 237px;
height: 35px;
width: auto;
height: auto;
font-size: 12px;
position: absolute;
margin-top: -159px;
@ -262,10 +261,33 @@ div.error {
display: none;
}
div.error div.img {
background: url("../pics/error-arrow.png") 0% 5px no-repeat;
width: 19px;
height: 35px;
float: left;
}
div.error div.msg {
background: #ededed;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
width: auto;
height: auto;
float: left;
-webkit-box-shadow: 0px 6px 3px -3px rgba(0, 0, 0, 0.2);
-moz-box-shadow: 0px 6px 3px -3px rgba(0, 0, 0, 0.2);
box-shadow: 0px 6px 3px -3px rgba(0, 0, 0, 0.2);
padding: 5px 20px 5px;
}
div.error p{
margin:0;
padding: 0;
padding-top: 7px;
text-align: center;
}

View File

@ -207,6 +207,8 @@ header div.profile a:hover {
header div.droplist-wrap {
margin: -4px 0px 0px 0px;
width: 151px;
float: right;
}
header div.droplist {
@ -218,7 +220,6 @@ header div.droplist {
box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.5);
position: absolute;
margin-top: 0px;
margin-left: 138px;
border-radius: 0px 0px 4px 4px;
display: none;
text-align: right;
@ -508,7 +509,7 @@ article input[type="submit"] {
background-image: linear-gradient(top, #68a3d8, #125687);
filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#68a3d8', EndColorStr='#125687');
border: 1px solid #5084b4;
padding: 4px 20px;
padding: 0px 20px 0px;
margin: 0;
font-size: 12px;
text-decoration: none;
@ -518,8 +519,9 @@ article input[type="submit"] {
border-radius: 5px;
text-align: center;
height: auto;
height: 28px;
width: auto;
font-family: Tahoma;
}
article input[type="submit"]:hover{
@ -838,7 +840,7 @@ div.rightlist textarea {
}
div.rightlist input[type="text"], div.rightlist input[type="password"] {
height: 15px;
height: 16px;
width: 350px;
border: 1px solid #dedede;
border-radius: 4px;
@ -849,30 +851,30 @@ div.rightlist input[type="text"], div.rightlist input[type="password"] {
/* Admin-members page */
.right table div.img {
div.img {
float: left;
}
.right table div.radio {
table div.radio {
float: left;
margin: 5px 0px 0px 0px;
}
.right table div.forimg {
div.forimg {
float: left;
margin: 5px 0px 0px 5px;
}
.right table div.forradio {
table div.forradio {
float: left;
margin: 5px 0px 0px 5px;
}
.right table span.niceCheck-main {
table span.niceCheck-main {
margin-top: 3px;
}
.right div.admin-search {
div.admin-search {
float: left;
}
@ -2159,4 +2161,50 @@ article div.all.error404 p.pages {
article div.all.error404 p.search {
margin-top: 80px;
width: 230px;
}
/*search*/
input.button.width100 {
width: 100px;
}
input[type="text"].exsearch {
height: 16px;
border: 1px solid #dedede;
border-radius: 4px;
padding: 5px;
font-family: Tahoma, Geneva, Helvetica, sans-serif;
font-size: 12px;
width: 520px;
margin-right: 10px;
}
div.lineForm.leftside.rmargin10 {
margin-right: 10px;
}
table.tablesorter.bmargin5 {
margin-bottom: 1px;
}
div.width400 {
width: 400px;
float: left;
}
div.width400.rmargin55 {
margin-right: 55px;
}
div.tmargin10 {
margin-top: 10px;
}
a.lmargin7 {
margin-left: 7px;
}
a.lmargin5 {
margin-left: 5px;
}

View File

@ -123,9 +123,9 @@ article div.right {
}
input.button {
padding: 5px 27px 8px 27px;
height: 28px;
width: 110px;
padding: 3px 27px 8px 27px;
height: 25px;
width: auto;
}
a.button:hover, input.button:hover {
@ -138,7 +138,7 @@ a.button:active, input.button:active{
background: url("../pics/button-green-press.png");
}
a.button:disabled, a.button.disabled, input.button:disabled {
a.button:disabled, a.button.disabled, input.button:disabled, input.button.disabled{
background: #125687;
background: url("../pics/button-green-disabled.png");
cursor: default;
@ -221,4 +221,65 @@ footer ul li a {
footer ul li a:hover {
text-decoration: underline;
}
div.error {
width: auto;
height: auto;
font-size: 12px;
position: absolute;
margin-top: -159px;
margin-left: 582px;
display: none;
text-align: left;
}
div.error div.img {
background: url("../pics/error-arrow.png") 0% 5px no-repeat;
width: 19px;
height: 35px;
float: left;
}
div.error div.msg {
background: #ededed;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
width: auto;
height: auto;
float: left;
-webkit-box-shadow: 0px 6px 3px -3px rgba(0, 0, 0, 0.2);
-moz-box-shadow: 0px 6px 3px -3px rgba(0, 0, 0, 0.2);
box-shadow: 0px 6px 3px -3px rgba(0, 0, 0, 0.2);
padding: 5px 20px 5px;
}
div.error p{
margin:0;
padding: 0;
text-align: center;
}
div.error.login {
margin-top: -242px;
margin-left: 650px;
}
div.error.name {
margin-top: -202px;
margin-left: 650px;
}
div.error.email {
margin-top: -161px;
margin-left: 650px;
}
div.error.password {
margin-top: -101px;
margin-left: 650px;
}

View File

@ -2,10 +2,8 @@
//= require gollum/gollum.dialog
//= require gollum/gollum.placeholder
//= require gollum/editor/gollum.editor
// require hl/shCore
//= require codemirror
//= require codemirror/runmode
//= require_tree ./codemirror/modes
//= require cusel
// require_tree .