mirror of
https://github.com/TracksApp/tracks.git
synced 2025-12-28 12:58:48 +01:00
Merge branch 'master' of git://github.com/bsag/tracks into bsag
This commit is contained in:
commit
10bdb8f7d8
438 changed files with 29571 additions and 1133 deletions
15
README
15
README
|
|
@ -9,19 +9,16 @@
|
|||
* Mailing list: http://lists.rousette.org.uk/mailman/listinfo/tracks-discuss
|
||||
* Original developer: bsag (http://www.rousette.org.uk/)
|
||||
* Contributors: http://getontracks.org/wiki/Contributors
|
||||
* Version: 2.0RC1
|
||||
* Version: 2.0devel
|
||||
* Copyright: (cc) 2004-2010 rousette.org.uk.
|
||||
* License: GNU GPL
|
||||
|
||||
All the documentation for Tracks can be found within the /doc directory. It contains a manual in HTML (manual.html) or PDF format (manual.pdf), and this includes full instructions for both new installations and upgrades from older installations of Tracks. The instructions might appear long and intimidatingly complex, but that is mostly because of the number of different platforms supported, and the different configurations which can be used (e.g. running Tracks on your local computer or on a remote server). If you choose the appropriate section for your situation (installation vs. upgrade), and use the easiest (recommended) method, you should find the instructions easy to follow. If you encounter problems, try searching the wiki, forum or mailing list (URLs above), and ask a question if you cannot find a solution to your problem.
|
||||
All the documentation for Tracks can be found within the /doc directory and at http://bsag.github.com/tracks/
|
||||
The latter includes full instructions for both new installations and upgrades from older installations of Tracks.
|
||||
The instructions might appear long and intimidatingly complex, but that is mostly because of the number of different platforms supported, and the different configurations which can be used (e.g. running Tracks on your local computer or on a remote server). If you choose the appropriate section for your situation (installation vs. upgrade), and use the easiest (recommended) method, you should find the instructions easy to follow. If you encounter problems, try searching the wiki, forum or mailing list (URLs above), and ask a question if you cannot find a solution to your problem.
|
||||
|
||||
If you checked out Tracks from the GitHub repository, the manual is not provided by default and is in its own git submodule. To checkout the manual's source files, type "git submodule init doc/manual & git submodule update doc/manual". From then on, you should be able to issue the command "git pull" in the doc/manual directory to update the manual with the latest changes.
|
||||
|
||||
The latest version of the manual can be found at http://bsag.github.com/tracks/
|
||||
|
||||
For those upgrading, change notes are available in /doc/CHANGELOG. If you are thinking about contributing towards the development of Tracks, please read /doc/README_DEVELOPERS for general information, or /doc/tracks_api_wrapper.rb for information on Tracks' API.
|
||||
If you are thinking about contributing towards the development of Tracks, please read /doc/README_DEVELOPERS for general information, or /doc/tracks_api_wrapper.rb for information on Tracks' API.
|
||||
|
||||
While fully usable for everyday use, Tracks is still a work in progress. Make sure that you take sensible precautions and back up all your data frequently, taking particular care when you are upgrading.
|
||||
|
||||
Enjoy being productive!
|
||||
|
||||
Enjoy being productive!
|
||||
|
|
@ -4,19 +4,6 @@
|
|||
|
||||
require_dependency "login_system"
|
||||
require_dependency "tracks/source_view"
|
||||
require "redcloth"
|
||||
|
||||
require 'date'
|
||||
require 'time'
|
||||
|
||||
# Commented the following line because of #744. It prevented rake db:migrate to
|
||||
# run because this tag went looking for the taggings table that did not exist
|
||||
# when you feshly create a new database Old comment: We need this in development
|
||||
# mode, or you get 'method missing' errors
|
||||
#
|
||||
# Tag
|
||||
|
||||
class CannotAccessContext < RuntimeError; end
|
||||
|
||||
class ApplicationController < ActionController::Base
|
||||
|
||||
|
|
@ -24,26 +11,19 @@ class ApplicationController < ActionController::Base
|
|||
|
||||
helper :application
|
||||
include LoginSystem
|
||||
helper_method :current_user, :prefs
|
||||
helper_method :current_user, :prefs, :format_date, :markdown
|
||||
|
||||
layout proc{ |controller| controller.mobile? ? "mobile" : "standard" }
|
||||
exempt_from_layout /\.js\.erb$/
|
||||
|
||||
|
||||
|
||||
before_filter :set_session_expiration
|
||||
before_filter :set_time_zone
|
||||
before_filter :set_zindex_counter
|
||||
before_filter :set_locale
|
||||
prepend_before_filter :login_required
|
||||
prepend_before_filter :enable_mobile_content_negotiation
|
||||
# after_filter :set_locale
|
||||
after_filter :set_charset
|
||||
|
||||
include ActionView::Helpers::TextHelper
|
||||
include ActionView::Helpers::SanitizeHelper
|
||||
extend ActionView::Helpers::SanitizeHelper::ClassMethods
|
||||
helper_method :format_date, :markdown
|
||||
|
||||
# By default, sets the charset to UTF-8 if it isn't already set
|
||||
def set_charset
|
||||
headers["Content-Type"] ||= "text/html; charset=UTF-8"
|
||||
|
|
@ -60,7 +40,7 @@ class ApplicationController < ActionController::Base
|
|||
def set_session_expiration
|
||||
# http://wiki.rubyonrails.com/rails/show/HowtoChangeSessionOptions
|
||||
unless session == nil
|
||||
return if @controller_name == 'feed' or session['noexpiry'] == "on"
|
||||
return if self.controller_name == 'feed' or session['noexpiry'] == "on"
|
||||
# If the method is called by the feed controller (which we don't have
|
||||
# under session control) or if we checked the box to keep logged in on
|
||||
# login don't set the session expiry time.
|
||||
|
|
@ -137,8 +117,8 @@ class ApplicationController < ActionController::Base
|
|||
end
|
||||
end
|
||||
|
||||
def auto_complete_result2(entries, phrase = nil)
|
||||
json_elems = "[{" + entries.map {|item| "\"id\" : \"#{item.id}\", \"value\" : \"#{item.specification()}\""}.join("},{") + "}]"
|
||||
def format_dependencies_as_json_for_auto_complete(entries)
|
||||
json_elems = "[{" + entries.map {|item| "\"value\" : \"#{item.id}\", \"label\" : \"#{item.specification()}\""}.join("},{") + "}]"
|
||||
return json_elems == "[{}]" ? "" : json_elems
|
||||
end
|
||||
|
||||
|
|
@ -150,7 +130,7 @@ class ApplicationController < ActionController::Base
|
|||
def markdown(text)
|
||||
RedCloth.new(text).to_html
|
||||
end
|
||||
|
||||
|
||||
# Here's the concept behind this "mobile content negotiation" hack: In
|
||||
# addition to the main, AJAXy Web UI, Tracks has a lightweight low-feature
|
||||
# 'mobile' version designed to be suitablef or use from a phone or PDA. It
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
class CannotAccessContext < RuntimeError; end
|
||||
|
||||
class BackendController < ApplicationController
|
||||
wsdl_service_name 'Backend'
|
||||
web_service_api TodoApi
|
||||
|
|
|
|||
|
|
@ -6,6 +6,9 @@ class LoginController < ApplicationController
|
|||
skip_before_filter :login_required
|
||||
before_filter :login_optional
|
||||
before_filter :get_current_user
|
||||
|
||||
protect_from_forgery :except => :check_expiry
|
||||
|
||||
if ( SITE_CONFIG['authentication_schemes'].include? 'cas')
|
||||
# This will allow the user to view the index page without authentication
|
||||
# but will process CAS authentication data if the user already
|
||||
|
|
|
|||
|
|
@ -47,10 +47,11 @@ class ProjectsController < ApplicationController
|
|||
init_data_for_sidebar unless mobile?
|
||||
@page_title = t('projects.page_title', :project => @project.name)
|
||||
|
||||
@not_done = @project.todos.active_or_hidden
|
||||
@deferred = @project.deferred_todos
|
||||
@pending = @project.pending_todos
|
||||
@done = @project.todos.find_in_state(:all, :completed, :order => "todos.completed_at DESC", :limit => current_user.prefs.show_number_completed, :include => [:context])
|
||||
@not_done = @project.todos.active_or_hidden(:include => [:tags, :context, :predecessors])
|
||||
@deferred = @project.deferred_todos(:include => [:tags, :context, :predecessors])
|
||||
@pending = @project.pending_todos(:include => [:tags, :context, :predecessors])
|
||||
@done = @project.todos.find_in_state(:all, :completed,
|
||||
:order => "todos.completed_at DESC", :limit => current_user.prefs.show_number_completed, :include => [:context, :tags, :predecessors])
|
||||
|
||||
@count = @not_done.size
|
||||
@down_count = @count + @deferred.size + @pending.size
|
||||
|
|
@ -59,6 +60,7 @@ class ProjectsController < ApplicationController
|
|||
@default_tags = @project.default_tags
|
||||
@new_note = current_user.notes.new
|
||||
@new_note.project_id = @project.id
|
||||
@contexts = current_user.contexts
|
||||
respond_to do |format|
|
||||
format.html
|
||||
format.m &render_project_mobile
|
||||
|
|
@ -237,9 +239,9 @@ class ProjectsController < ApplicationController
|
|||
|
||||
def render_projects_mobile
|
||||
lambda do
|
||||
@active_projects = @projects.active
|
||||
@hidden_projects = @projects.hidden
|
||||
@completed_projects = @projects.completed
|
||||
@active_projects = current_user.projects.active
|
||||
@hidden_projects = current_user.projects.hidden
|
||||
@completed_projects = current_user.projects.completed
|
||||
@down_count = @active_projects.size + @hidden_projects.size + @completed_projects.size
|
||||
cookies[:mobile_url]= {:value => request.request_uri, :secure => SITE_CONFIG['secure_cookies']}
|
||||
render :action => 'index_mobile'
|
||||
|
|
|
|||
|
|
@ -112,17 +112,17 @@ class RecurringTodosController < ApplicationController
|
|||
end
|
||||
|
||||
if @saved
|
||||
@status_message = "The recurring todo was saved"
|
||||
@status_message = t('todos.recurring_action_saved')
|
||||
@todo_saved = create_todo_from_recurring_todo(@recurring_todo).nil? == false
|
||||
if @todo_saved
|
||||
@status_message += " / created a new todo"
|
||||
@status_message += " / " + t('todos.new_related_todo_created_short')
|
||||
else
|
||||
@status_message += " / did not create todo"
|
||||
@status_message += " / " + t('todos.new_related_todo_not_created_short')
|
||||
end
|
||||
@down_count = current_user.recurring_todos.active.count
|
||||
@new_recurring_todo = RecurringTodo.new
|
||||
else
|
||||
@status_message = "Error saving recurring todo"
|
||||
@status_message = t('todos.error_saving_recurring')
|
||||
end
|
||||
|
||||
respond_to do |format|
|
||||
|
|
@ -151,10 +151,10 @@ class RecurringTodosController < ApplicationController
|
|||
|
||||
format.html do
|
||||
if @saved
|
||||
notify :notice, "Successfully deleted recurring action", 2.0
|
||||
notify :notice, t('todos.recurring_deleted_success'), 2.0
|
||||
redirect_to :action => 'index'
|
||||
else
|
||||
notify :error, "Failed to delete the recurring action", 2.0
|
||||
notify :error, t('todos.error_deleting_recurring', :description => @recurring_todo.description), 2.0
|
||||
redirect_to :action => 'index'
|
||||
end
|
||||
end
|
||||
|
|
@ -251,11 +251,17 @@ class RecurringTodosController < ApplicationController
|
|||
private
|
||||
|
||||
def init
|
||||
@days_of_week = [ ['Sunday',0], ['Monday',1], ['Tuesday', 2], ['Wednesday',3], ['Thursday',4], ['Friday',5], ['Saturday',6]]
|
||||
@months_of_year = [
|
||||
['January',1], ['Februari',2], ['March', 3], ['April',4], ['May',5], ['June',6],
|
||||
['July',7], ['August',8], ['September',9], ['October', 10], ['November', 11], ['December',12]]
|
||||
@xth_day = [['first',1],['second',2],['third',3],['fourth',4],['last',5]]
|
||||
@days_of_week = []
|
||||
0.upto 6 do |i|
|
||||
@days_of_week << [t('date.day_names')[i], i]
|
||||
end
|
||||
|
||||
@months_of_year = []
|
||||
1.upto 12 do |i|
|
||||
@months_of_year << [t('date.month_names')[i], i]
|
||||
end
|
||||
|
||||
@xth_day = [[t('common.first'),1],[t('common.second'),2],[t('common.third'),3],[t('common.fourth'),4],[t('common.last'),5]]
|
||||
@projects = current_user.projects.find(:all, :include => [:default_context])
|
||||
@contexts = current_user.contexts.find(:all)
|
||||
end
|
||||
|
|
|
|||
|
|
@ -11,6 +11,12 @@ class TodosController < ApplicationController
|
|||
:completed_archive, :check_deferred, :toggle_check, :toggle_star,
|
||||
:edit, :update, :defer, :create, :calendar, :auto_complete_for_predecessor, :remove_predecessor, :add_predecessor]
|
||||
|
||||
protect_from_forgery :except => :check_deferred
|
||||
|
||||
# these are needed for todo_feed_content. TODO: remove this view stuff from controller
|
||||
include ActionView::Helpers::SanitizeHelper
|
||||
extend ActionView::Helpers::SanitizeHelper::ClassMethods
|
||||
|
||||
def index
|
||||
@projects = current_user.projects.find(:all, :include => [:default_context])
|
||||
@contexts = current_user.contexts.find(:all)
|
||||
|
|
@ -49,7 +55,7 @@ class TodosController < ApplicationController
|
|||
def create
|
||||
@source_view = params['_source_view'] || 'todo'
|
||||
@default_context = current_user.contexts.find_by_name(params['default_context_name'])
|
||||
@default_project = current_user.projects.find_by_name(params['default_project_name'])
|
||||
@default_project = current_user.projects.find_by_name(params['default_project_name']) unless params['default_project_name'].blank?
|
||||
|
||||
@tag_name = params['_tag_name']
|
||||
|
||||
|
|
@ -248,6 +254,7 @@ class TodosController < ApplicationController
|
|||
end
|
||||
|
||||
def remove_predecessor
|
||||
puts "@@@ start remove_predecessor"
|
||||
@source_view = params['_source_view'] || 'todo'
|
||||
@todo = current_user.todos.find(params['id'])
|
||||
@predecessor = current_user.todos.find(params['predecessor'])
|
||||
|
|
@ -440,7 +447,7 @@ class TodosController < ApplicationController
|
|||
format.js do
|
||||
if @saved
|
||||
determine_down_count
|
||||
if source_view_is_one_of(:todo, :deferred)
|
||||
if source_view_is_one_of(:todo, :deferred, :project)
|
||||
determine_remaining_in_context_count(@context_id)
|
||||
elsif source_view_is :calendar
|
||||
@original_item_due_id = get_due_id_for_calendar(@original_item_due)
|
||||
|
|
@ -510,7 +517,7 @@ class TodosController < ApplicationController
|
|||
def tag
|
||||
init_data_for_sidebar unless mobile?
|
||||
@source_view = params['_source_view'] || 'tag'
|
||||
@tag_name = params[:name]
|
||||
@tag_name = sanitize(params[:name]) # sanitize to prevent XSS vunerability!
|
||||
@page_title = t('todos.tagged_page_title', :tag_name => @tag_name)
|
||||
|
||||
# mobile tags are routed with :name ending on .m. So we need to chomp it
|
||||
|
|
@ -648,7 +655,7 @@ class TodosController < ApplicationController
|
|||
get_todo_from_params
|
||||
# Begin matching todos in current project
|
||||
@items = current_user.todos.find(:all,
|
||||
:select => 'description, project_id, context_id, created_at',
|
||||
:include => [:context, :project],
|
||||
:conditions => [ '(todos.state = ? OR todos.state = ? OR todos.state = ?) AND ' +
|
||||
'NOT (id = ?) AND lower(description) LIKE ? AND project_id = ?',
|
||||
'active', 'pending', 'deferred',
|
||||
|
|
@ -660,7 +667,7 @@ class TodosController < ApplicationController
|
|||
)
|
||||
if @items.empty? # Match todos in other projects
|
||||
@items = current_user.todos.find(:all,
|
||||
:select => 'description, project_id, context_id, created_at',
|
||||
:include => [:context, :project],
|
||||
:conditions => [ '(todos.state = ? OR todos.state = ? OR todos.state = ?) AND ' +
|
||||
'NOT (id = ?) AND lower(description) LIKE ?',
|
||||
'active', 'pending', 'deferred',
|
||||
|
|
@ -672,7 +679,7 @@ class TodosController < ApplicationController
|
|||
else
|
||||
# New todo - TODO: Filter on project
|
||||
@items = current_user.todos.find(:all,
|
||||
:select => 'description, project_id, context_id, created_at',
|
||||
:include => [:context, :project],
|
||||
:conditions => [ '(todos.state = ? OR todos.state = ? OR todos.state = ?) AND lower(description) LIKE ?',
|
||||
'active', 'pending', 'deferred',
|
||||
'%' + params[:term].downcase + '%' ],
|
||||
|
|
@ -680,7 +687,7 @@ class TodosController < ApplicationController
|
|||
:limit => 10
|
||||
)
|
||||
end
|
||||
render :inline => auto_complete_result2(@items)
|
||||
render :inline => format_dependencies_as_json_for_auto_complete(@items)
|
||||
end
|
||||
|
||||
def convert_to_project
|
||||
|
|
@ -822,13 +829,13 @@ class TodosController < ApplicationController
|
|||
# current_users.todos.find but that broke with_scope for :limit
|
||||
|
||||
# Exclude hidden projects from count on home page
|
||||
@todos = current_user.todos.find(:all, :include => [ :project, :context, :tags ])
|
||||
@todos = current_user.todos.find(:all, :include => [ :project, :context, :tags, :pending_successors, :recurring_todo ])
|
||||
|
||||
# Exclude hidden projects from the home page
|
||||
@not_done_todos = current_user.todos.find(:all,
|
||||
:conditions => ['contexts.hide = ? AND (projects.state = ? OR todos.project_id IS NULL)', false, 'active'],
|
||||
:order => "todos.due IS NULL, todos.due ASC, todos.created_at ASC",
|
||||
:include => [ :project, :context, :tags ])
|
||||
:include => [ :project, :context, :tags, :pending_successors, :recurring_todo ])
|
||||
end
|
||||
|
||||
end
|
||||
|
|
@ -891,12 +898,13 @@ class TodosController < ApplicationController
|
|||
@remaining_hidden_count = current_user.todos.hidden.with_tag(tag).count
|
||||
}
|
||||
from.project {
|
||||
@remaining_deferred_or_pending_count = current_user.projects.find(@todo.project_id).todos.deferred_or_blocked.count
|
||||
@remaining_in_context = current_user.projects.find(@todo.project_id).todos.active.count
|
||||
@target_context_count = current_user.projects.find(@todo.project_id).todos.active.count
|
||||
project_id = @project_changed ? @original_item_project_id : @todo.project_id
|
||||
@remaining_deferred_or_pending_count = current_user.projects.find(project_id).todos.deferred_or_blocked.count
|
||||
@remaining_in_context = current_user.projects.find(project_id).todos.active.count
|
||||
@target_context_count = current_user.projects.find(project_id).todos.active.count
|
||||
}
|
||||
from.calendar {
|
||||
@target_context_count = count_old_due_empty(@new_due_id)
|
||||
@target_context_count = @new_due_id.blank? ? 0 : count_old_due_empty(@new_due_id)
|
||||
}
|
||||
end
|
||||
@remaining_in_context = current_user.contexts.find(context_id).todos(true).active.not_hidden.count if !@remaining_in_context
|
||||
|
|
@ -978,6 +986,7 @@ class TodosController < ApplicationController
|
|||
end
|
||||
|
||||
def todo_feed_content
|
||||
# TODO: move view stuff into view, also the includes at the top
|
||||
lambda do |i|
|
||||
item_notes = sanitize(markdown( i.notes )) if i.notes?
|
||||
due = "<div>#{t('todos.feeds.due', :date => format_date(i.due))}</div>\n" if i.due?
|
||||
|
|
@ -1325,4 +1334,4 @@ class TodosController < ApplicationController
|
|||
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -240,7 +240,7 @@ module ApplicationHelper
|
|||
end
|
||||
|
||||
def generate_i18n_strings
|
||||
js = ""
|
||||
js = "i18n_locale='#{I18n.locale}';\n"
|
||||
js << "i18n = new Array();\n"
|
||||
%w{
|
||||
shared.toggle_multi shared.toggle_multi_title
|
||||
|
|
@ -259,4 +259,12 @@ module ApplicationHelper
|
|||
return js
|
||||
end
|
||||
|
||||
def javascript_tag_for_i18n_datepicker
|
||||
locale = I18n.locale
|
||||
# do not include en as locale since this the available by default
|
||||
if locale and locale != :en
|
||||
javascript_include_tag("i18n/jquery.ui.datepicker-#{locale}.js")
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ module TodosHelper
|
|||
image_tag("blank.png", :alt => t('todos.edit'), :align => "absmiddle", :id => 'edit_icon_todo_'+todo.id.to_s, :class => 'edit_item'),
|
||||
{:controller => 'todos', :action => 'edit', :id => todo.id},
|
||||
:class => "icon edit_item",
|
||||
:id => "icon_edit_todo_#{todo.id}",
|
||||
:title => t('todos.edit_action_with_description', :description => todo.description))
|
||||
end
|
||||
|
||||
|
|
@ -29,11 +30,13 @@ module TodosHelper
|
|||
:_source_view => (@source_view.underscore.gsub(/\s+/,'_') rescue "")}
|
||||
url[:_tag_name] = @tag_name if @source_view == 'tag'
|
||||
|
||||
futuredate = (todo.show_from || todo.user.date) + days.days
|
||||
options = {:x_defer_alert => false, :class => "icon_defer_item" }
|
||||
if todo.due && futuredate > todo.due
|
||||
options[:x_defer_alert] = true
|
||||
options[:x_defer_date_after_due_date] = t('todos.defer_date_after_due_date')
|
||||
if todo.due
|
||||
futuredate = (todo.show_from || todo.user.date) + days.days
|
||||
if futuredate > todo.due
|
||||
options[:x_defer_alert] = true
|
||||
options[:x_defer_date_after_due_date] = t('todos.defer_date_after_due_date')
|
||||
end
|
||||
end
|
||||
|
||||
return link_to(image_tag_for_defer(days), url, options)
|
||||
|
|
@ -87,7 +90,7 @@ module TodosHelper
|
|||
end
|
||||
|
||||
def remote_toggle_checkbox(todo=@todo)
|
||||
check_box_tag('item_id', toggle_check_todo_path(todo), todo.completed?, :class => 'item-checkbox',
|
||||
check_box_tag("mark_complete_#{todo.id}", toggle_check_todo_path(todo), todo.completed?, :class => 'item-checkbox',
|
||||
:title => todo.pending? ? t('todos.blocked_by', :predecessors => todo.uncompleted_predecessors.map(&:description).join(', ')) : "", :readonly => todo.pending?)
|
||||
end
|
||||
|
||||
|
|
@ -139,10 +142,6 @@ module TodosHelper
|
|||
if tag_list.empty? then "" else "<span class=\"tags\">#{tag_list}</span>" end
|
||||
end
|
||||
|
||||
def predecessor_list_text(todo=@todo)
|
||||
todo.predecessors.map{|t| t.specification}.join(', ')
|
||||
end
|
||||
|
||||
def deferred_due_date(todo=@todo)
|
||||
if todo.deferred? && todo.due
|
||||
t('todos.action_due_on', :date => format_date(todo.due))
|
||||
|
|
@ -225,7 +224,6 @@ module TodosHelper
|
|||
page.todo { return !@todo.hidden? }
|
||||
page.deferred { return @todo.deferred? || @todo.pending? }
|
||||
page.context {
|
||||
logger.debug "ci=#{@todo.context_id} dci=#{@default_context.id} th=#{@todo.hidden?} tch=#{@todo.context.hidden?}"
|
||||
return @todo.context_id==@default_context.id && ( (@todo.hidden? && @todo.context.hidden?) || (!@todo.hidden?) )
|
||||
}
|
||||
page.tag {
|
||||
|
|
@ -266,7 +264,7 @@ module TodosHelper
|
|||
end
|
||||
|
||||
def default_contexts_for_autocomplete
|
||||
projects = current_user.projects.find(:all, :conditions => ['default_context_id is not null'])
|
||||
projects = current_user.projects.find(:all, :include => [:context], :conditions => ['default_context_id is not null'])
|
||||
Hash[*projects.map{ |p| [p.name, p.default_context.name] }.flatten].to_json
|
||||
end
|
||||
|
||||
|
|
@ -289,7 +287,7 @@ module TodosHelper
|
|||
end
|
||||
|
||||
def date_field_tag(name, id, value = nil, options = {})
|
||||
text_field_tag name, value, {"size" => 12, "id" => id, "class" => "Date", "onfocus" => "Calendar.setup", "autocomplete" => "off"}.update(options.stringify_keys)
|
||||
text_field_tag name, value, {"size" => 12, "id" => id, "class" => "Date", "autocomplete" => "off"}.update(options.stringify_keys)
|
||||
end
|
||||
|
||||
def update_needs_to_hide_context
|
||||
|
|
@ -297,7 +295,7 @@ module TodosHelper
|
|||
(@remaining_in_context == 0 && @todo_was_deferred_from_active_state) ||
|
||||
(@remaining_in_context == 0 && @todo.completed? && !(@original_item_was_deferred || @original_item_was_hidden)) if source_view_is(:tag)
|
||||
|
||||
return false if source_view_is(:project)
|
||||
return false if source_view_is_one_of(:project, :calendar)
|
||||
|
||||
return (@remaining_in_context == 0) && !source_view_is(:context)
|
||||
end
|
||||
|
|
@ -305,7 +303,7 @@ module TodosHelper
|
|||
def update_needs_to_remove_todo_from_container
|
||||
source_view do |page|
|
||||
page.context { return @context_changed || @todo.deferred? || @todo.pending? }
|
||||
page.project { return @todo_deferred_state_changed || @todo_pending_state_changed }
|
||||
page.project { return @todo_deferred_state_changed || @todo_pending_state_changed || @project_changed}
|
||||
page.deferred { return @context_changed || !(@todo.deferred? || @todo.pending?) }
|
||||
page.calendar { return @due_date_changed || !@todo.due }
|
||||
page.stats { return @todo.completed? }
|
||||
|
|
@ -379,8 +377,8 @@ module TodosHelper
|
|||
container_id = "p#{@original_item_project_id}empty-nd" if @remaining_in_context == 0
|
||||
container_id = "tickler-empty-nd" if (
|
||||
( (@todo_was_activated_from_deferred_state || @todo_was_activated_from_pending_state) && @remaining_deferred_or_pending_count == 0) ||
|
||||
(@original_item_was_deferred && @remaining_deferred_or_pending_count == 0 && @todo.completed?) )
|
||||
container_id = "empty-d" if @completed_count && @completed_count == 0 && !@todo.completed?
|
||||
(@original_item_was_deferred && @remaining_deferred_or_pending_count == 0 && @todo.completed?) )
|
||||
container_id = "empty-d" if @completed_count && @completed_count == 0 && !@todo.completed?
|
||||
}
|
||||
page.deferred { container_id = "c#{@original_item_context_id}empty-nd" if @remaining_in_context == 0 }
|
||||
page.calendar { container_id = "empty_#{@original_item_due_id}" if @old_due_empty }
|
||||
|
|
@ -405,7 +403,7 @@ module TodosHelper
|
|||
end
|
||||
end
|
||||
html += "}}) " * animation.count
|
||||
return html
|
||||
return html + ";"
|
||||
end
|
||||
|
||||
private
|
||||
|
|
|
|||
|
|
@ -108,84 +108,41 @@ class Todo < ActiveRecord::Base
|
|||
|
||||
# Returns a string with description <context, project>
|
||||
def specification
|
||||
project_name = project.is_a?(NullProject) ? "(none)" : project.name
|
||||
return "\'#{description}\' <\'#{context.title}\'; \'#{project_name}\'>"
|
||||
project_name = self.project.is_a?(NullProject) ? "(none)" : self.project.name
|
||||
return "\'#{self.description}\' <\'#{self.context.title}\'; \'#{project_name}\'>"
|
||||
end
|
||||
|
||||
def todo_from_specification(specification)
|
||||
# Split specification into parts: description <context, project>
|
||||
parts = specification.scan(RE_PARTS)
|
||||
return nil unless parts.length == 1
|
||||
return nil unless parts[0].length == 3
|
||||
todo_description = parts[0][0]
|
||||
context_name = parts[0][1]
|
||||
project_name = parts[0][2]
|
||||
|
||||
# find the project
|
||||
project_id = nil;
|
||||
unless project_name == "(none)"
|
||||
project = Project.first(:conditions => {
|
||||
:user_id => self.user.id,
|
||||
:name => project_name
|
||||
})
|
||||
project_id = project.id unless project.nil?
|
||||
end
|
||||
|
||||
todos = Todo.all(
|
||||
:joins => :context,
|
||||
:conditions => {
|
||||
:description => todo_description,
|
||||
:user_id => self.user.id,
|
||||
:contexts => {:name => context_name},
|
||||
:project_id => project_id
|
||||
}
|
||||
)
|
||||
|
||||
return nil if todos.empty?
|
||||
|
||||
# TODO: what todo if there are more than one todo that fit the specification
|
||||
return todos[0]
|
||||
end
|
||||
|
||||
|
||||
def validate
|
||||
if !show_from.blank? && show_from < user.date
|
||||
errors.add("show_from", I18n.t('models.todo.error_date_must_be_future'))
|
||||
end
|
||||
errors.add(:description, "may not contain \" characters") if /\"/.match(description)
|
||||
errors.add(:description, "may not contain \" characters") if /\"/.match(self.description)
|
||||
unless @predecessor_array.nil? # Only validate predecessors if they changed
|
||||
@predecessor_array.each do |specification|
|
||||
t = todo_from_specification(specification)
|
||||
if t.nil?
|
||||
errors.add("Depends on:", "Could not find action '#{h(specification)}'")
|
||||
else
|
||||
errors.add("Depends on:", "Adding '#{h(specification)}' would create a circular dependency") if is_successor?(t)
|
||||
end
|
||||
@predecessor_array.each do |todo|
|
||||
errors.add("Depends on:", "Adding '#{h(todo.specification)}' would create a circular dependency") if is_successor?(todo)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def save_predecessors
|
||||
unless @predecessor_array.nil? # Only save predecessors if they changed
|
||||
current_array = predecessors.map{|p| p.specification}
|
||||
current_array = self.predecessors
|
||||
remove_array = current_array - @predecessor_array
|
||||
add_array = @predecessor_array - current_array
|
||||
|
||||
@removed_predecessors = []
|
||||
# This is probably a bit naive code...
|
||||
remove_array.each do |specification|
|
||||
t = todo_from_specification(specification)
|
||||
unless t.nil?
|
||||
@removed_predecessors << t
|
||||
self.predecessors.delete(t)
|
||||
remove_array.each do |todo|
|
||||
unless todo.nil?
|
||||
@removed_predecessors << todo
|
||||
self.predecessors.delete(todo)
|
||||
end
|
||||
end
|
||||
# ... as is this?
|
||||
add_array.each do |specification|
|
||||
t = todo_from_specification(specification)
|
||||
unless t.nil?
|
||||
self.predecessors << t unless self.predecessors.include?(t)
|
||||
|
||||
add_array.each do |todo|
|
||||
unless todo.nil?
|
||||
self.predecessors << todo unless self.predecessors.include?(todo)
|
||||
else
|
||||
logger.error "Could not find #{specification}" # Unexpected since validation passed
|
||||
logger.error "Could not find #{todo.description}" # Unexpected since validation passed
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -196,20 +153,22 @@ class Todo < ActiveRecord::Base
|
|||
end
|
||||
|
||||
def remove_predecessor(predecessor)
|
||||
puts "@@@ before delete"
|
||||
# remove predecessor and activate myself
|
||||
predecessors.delete(predecessor)
|
||||
self.predecessors.delete(predecessor)
|
||||
puts "@@@ before activate"
|
||||
self.activate!
|
||||
end
|
||||
|
||||
# Returns true if t is equal to self or a successor of self
|
||||
def is_successor?(t)
|
||||
if self == t
|
||||
def is_successor?(todo)
|
||||
if self == todo
|
||||
return true
|
||||
elsif self.successors.empty?
|
||||
return false
|
||||
else
|
||||
self.successors.each do |item|
|
||||
if item.is_successor?(t)
|
||||
if item.is_successor?(todo)
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
|
@ -314,13 +273,21 @@ class Todo < ActiveRecord::Base
|
|||
|
||||
def add_predecessor_list(predecessor_list)
|
||||
return unless predecessor_list.kind_of? String
|
||||
@predecessor_array = predecessor_list.scan(RE_SPEC)
|
||||
|
||||
@predecessor_array=[]
|
||||
|
||||
predecessor_ids_array = predecessor_list.split(",")
|
||||
predecessor_ids_array.each do |todo_id|
|
||||
predecessor = self.user.todos.find_by_id( todo_id.to_i ) unless todo_id.blank?
|
||||
@predecessor_array << predecessor unless predecessor.nil?
|
||||
end
|
||||
|
||||
return @predecessor_array
|
||||
end
|
||||
|
||||
def add_predecessor(t)
|
||||
@predecessor_array = predecessors.map{|p| p.specification}
|
||||
@predecessor_array << t.specification
|
||||
@predecessor_array = predecessors
|
||||
@predecessor_array << t
|
||||
end
|
||||
|
||||
# Return todos that should be activated if the current todo is completed
|
||||
|
|
|
|||
|
|
@ -100,8 +100,12 @@
|
|||
If Tracks is running on the same server as your mail server, you can use the integrated mail handler built into tracks. Steps to set it up:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Go to <%= link_to "Preferences", preferences_url %> and set your "From email" and "default email context" for todos sent in via email (which could come from an SMS message)</li>
|
||||
<li>In sendmail/qmail/postfix/whatever, set up an email address alias to pipe messages to <pre >/PATH/TO/RUBY/ruby /PATH/TO/TRACKS/script/runner -e production 'MessageGateway.receive(STDIN.read)'</pre></li>
|
||||
<li>Go to <%= link_to t('layouts.navigation.preferences'), preferences_url %>
|
||||
and set your "<%= Preference.human_attribute_name('sms_email') %>" and
|
||||
"<%= Preference.human_attribute_name('sms_context') %>" for todos sent in
|
||||
via email (which could come from an SMS message)</li>
|
||||
<li>In sendmail/qmail/postfix/whatever, set up an email address alias
|
||||
to pipe messages to <pre>/PATH/TO/RUBY/ruby /PATH/TO/TRACKS/script/runner -e production 'MessageGateway.receive(STDIN.read)'</pre></li>
|
||||
<li>Send an email to your newly configured address!</li>
|
||||
</ul>
|
||||
<p>You can also use the Rich Todo API to send in tasks like "do laundry @ Home"
|
||||
|
|
|
|||
|
|
@ -100,8 +100,12 @@
|
|||
If Tracks is running on the same server as your mail server, you can use the integrated mail handler built into tracks. Steps to set it up:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Go to <%= link_to "Preferences", preferences_url %> and set your "From email" and "default email context" for todos sent in via email (which could come from an SMS message)</li>
|
||||
<li>In sendmail/qmail/postfix/whatever, set up an email address alias to pipe messages to <pre >/PATH/TO/RUBY/ruby /PATH/TO/TRACKS/script/runner -e production 'MessageGateway.receive(STDIN.read)'</pre></li>
|
||||
<li>Go to <%= link_to t('layouts.navigation.preferences'), preferences_url %> and
|
||||
set your "<%= Preference.human_attribute_name('sms_email') %>" and
|
||||
"<%= Preference.human_attribute_name('sms_context') %>" for todos sent in
|
||||
via email (which could come from an SMS message)</li>
|
||||
<li>In sendmail/qmail/postfix/whatever, set up an email address
|
||||
alias to pipe messages to <pre>/PATH/TO/RUBY/ruby /PATH/TO/TRACKS/script/runner -e production 'MessageGateway.receive(STDIN.read)'</pre></li>
|
||||
<li>Send an email to your newly configured address!</li>
|
||||
</ul>
|
||||
<p>You can also use the Rich Todo API to send in tasks like "do laundry @ Home"
|
||||
|
|
|
|||
134
app/views/integrations/index.nl.html.erb
Normal file
134
app/views/integrations/index.nl.html.erb
Normal file
|
|
@ -0,0 +1,134 @@
|
|||
<% has_contexts = !current_user.contexts.empty? -%>
|
||||
<h1>Integratie</h1>
|
||||
<p>Tracks kan met een aantal tools worden geïntegreerd...
|
||||
Alles om je te helpen om dingen gedaan te krijgen!
|
||||
Deze pagina heeft informatie over het tot stand brengen van sommige integratievormen.
|
||||
Deze voorbeelden zijn niet altijd voor alle platformen van toepassing en
|
||||
sommige voorbeelden vragen meer technische kennis dan anderen
|
||||
Zie ook <%= link_to "de documentatie voor ontwikkelaars met Tracks' REST API", url_for(:action => 'rest_api') %>.</p>
|
||||
<br/><p>Inhoud:</p>
|
||||
<ul>
|
||||
<li><a href="#applescript1-section">Voeg een actie toe met Applescript</a></li>
|
||||
<li><a href="#applescript2-section">Voeg een acties toe met Applescript op basis van de huidig geselecteerde e-mail in Mail.app</a></li>
|
||||
<li><a href="#quicksilver-applescript-section">Voeg acties toe met Quicksilver en Applescript</a></li>
|
||||
<li><a href="#email-cron-section">Email jezelf automatisch de acties met een aflopende deadline</a></li>
|
||||
<li><a href="#message_gateway">Integreer Tracks met een email server om een actie via email naar Tracks te sturen</a></li>
|
||||
<li><a href="#google_gadget">Voeg tracks toe als een Google Gmail gadget</a></li>
|
||||
</ul><br/>
|
||||
<p>Heb je een tip om hier toe te voegen?
|
||||
<a href="http://www.getontracks.org/forums/viewforum/10/" title="Tracks | Tips and Tricks">Vertel ons er over in onze
|
||||
Tips and Tricks forum</a> en misschien voegen we jouw tip toe op deze pagina in een toekomstige versie van Tracks.
|
||||
</p>
|
||||
|
||||
<a name="applescript1-section"> </a>
|
||||
<h2>Voeg een actie toe met Applescript</h2>
|
||||
<p>Dit is een eenvoudig script die een dialog box toont om jou om een beschrijving te vragen en vervolgens die op te sturen naar Tracks
|
||||
met een hard-coded context.</p>
|
||||
|
||||
<% if has_contexts -%>
|
||||
<ol>
|
||||
<li>Kies de context waar de je acties aan toe wilt laten voegen: <select name="applescript1-contexts" id="applescript1-contexts"><%= options_from_collection_for_select(current_user.contexts, "id", "name", current_user.contexts.first.id) %></select>
|
||||
</li>
|
||||
<li>Kopieer de volgende Applescript naar het klembord.<br />
|
||||
<textarea id="applescript1" name="applescript1" rows="15"><%= render :partial => 'applescript1', :locals => { :context => current_user.contexts.first } %></textarea>
|
||||
</li>
|
||||
<li>Open de Script Editor en plak het script in een nieuw document.</li>
|
||||
<li>Compileer en bewaar het script. Voert het uit wanneer nodig.</li>
|
||||
</ol>
|
||||
<% else %>
|
||||
<br/><p id="no_context_msg"><i>Je hebt nog geen context(en). Het script komt beschikbaar als je het eerste context hebt toegevoegd.</i></p>
|
||||
<% end %>
|
||||
|
||||
<a name="applescript2-section"> </a>
|
||||
<h2>Voeg een acties toe met Applescript op basis van de huidig geselecteerde e-mail in Mail.app</h2>
|
||||
<p>Dit script neemt de verstuurder en het onderwerp van de geselecteerde email(s)
|
||||
van Mail over en maakt een nieuwe acties voor elke email met de beschrijving
|
||||
"Email [sender] about [subject]". De beschrijving wordt, als nodig, na 100 karakters afgebroken
|
||||
(dit is de limiet voor een beschrijving). Het heeft ook Growl notificaties mocht je Growl geïnstalleerd hebben.</p>
|
||||
|
||||
<% if has_contexts -%>
|
||||
<ol>
|
||||
<li>Kies de context waar de je acties aan toe wilt laten voegen: <select name="applescript2-contexts" id="applescript2-contexts"><%= options_from_collection_for_select(current_user.contexts, "id", "name", current_user.contexts.first.id) %></select>
|
||||
</li>
|
||||
<li>Kopieer de volgende Applescript naar het klembord.<br />
|
||||
<textarea id="applescript2" name="applescript2" rows="15"><%= render :partial => 'applescript2', :locals => { :context => current_user.contexts.first } %></textarea>
|
||||
</li>
|
||||
<li>Open de Script Editor en plak het script in een nieuw document.</li>
|
||||
<li>Compileer en bewaar het script in de directory ~/Library/Scripts/Mail Scripts.</li>
|
||||
<li>Voor meer informatie over het gebruiken van AppleScript met Mail.app, zie
|
||||
<a href="http://www.apple.com/applescript/mail/" title="Scriptable Applications: Mail">dit overzicht</a>.</li>
|
||||
</ol>
|
||||
<% else %>
|
||||
<br/><p><i>Je hebt nog geen context(en). Het script komt beschikbaar als je het eerste context hebt toegevoegd.</i></p>
|
||||
<% end %>
|
||||
|
||||
<a name="quicksilver-applescript-section"></a>
|
||||
<h2>Voeg acties toe met Quicksilver en Applescript</h2>
|
||||
|
||||
<p>Dit integratievoorbeeld laat je acties toevoegen aan Tracks via <a href="http://quicksilver.blacktree.com/">Quicksilver</a>.</p>
|
||||
|
||||
<% if has_contexts -%>
|
||||
<ol>
|
||||
<li>Kies de context waar de je acties aan toe wilt laten voegen: <select name="quicksilver-contexts" id="quicksilver-contexts"><%= options_from_collection_for_select(current_user.contexts, "id", "name", current_user.contexts.first.id) %></select>
|
||||
</li>
|
||||
<li>Kopieer de volgende Applescript naar het klembord.<br/>
|
||||
<textarea id="quicksilver" name="quicksilver" rows="15"><%= render :partial => 'quicksilver_applescript', :locals => { :context => current_user.contexts.first } %></textarea>
|
||||
</li>
|
||||
<li>Open de Script Editor en plak het script in een nieuw document.</li>
|
||||
<li>Compileer en bewaar het script als "Add to Tracks.scpt" in ~/Library/Application Support/Quicksilver/Actions/
|
||||
(mogelijk moet je eerst de Actions directory aanmaken)</li>
|
||||
<li>Herstart Quicksilver</li>
|
||||
<li>Activeer Quicksilver (Standaard via Ctrl+Space)</li>
|
||||
<li>Toets "." om quicksilver in text mode te brengen</li>
|
||||
<li>Voer de gewenste beschrijving van de actie in.</li>
|
||||
<li>Toets tab om naar de action pane te gaan.</li>
|
||||
<li>Via typen of bladeren, kies de "Add to Tracks" actie.</li>
|
||||
</ol>
|
||||
<% else %>
|
||||
<br/><p><i>Je hebt nog geen context(en). Het script komt beschikbaar als je het eerste context hebt toegevoegd.</i></p>
|
||||
<% end %>
|
||||
|
||||
<a name="email-cron-section"> </a>
|
||||
<h2>Email jezelf automatisch de acties met een aflopende deadline</h2>
|
||||
|
||||
<p>Als je de volgende regel toevoegd aan jouw crontab, dat ontvang je een e-mail op elke dag rond 05:00 met een lijst met acties waarvan de deadline afloopt binnen de komende 7 dagen.</p>
|
||||
|
||||
<textarea id="cron" name="cron">0 5 * * * /usr/bin/curl -0 "<%= home_url %>todos.txt?due=6&token=<%= current_user.token %>" | /usr/bin/mail -e -s 'Tracks actions due in the next 7 days' youremail@yourdomain.com</textarea>
|
||||
|
||||
<p>Uiteraard kan je ook een andere <%= link_to 'text feed gebruiken die Tracks biedt', feeds_path %> -- bijvoorbeeld een email met een lijst van acties voor een specifiek project naar een groep collega's die werken aan dat project?</p>
|
||||
|
||||
<a name="message_gateway"> </a>
|
||||
<h2>Integreer Tracks met een email server om een actie via email naar Tracks te sturen</h2>
|
||||
<p>
|
||||
Als Tracks draait op dezelfde server als jouw mailserver, dan kan je de geïntegreerde mail handler gebruiken van Tracks. Om dit in te stellen:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Ga naar <%= link_to t('layouts.navigation.preferences'), preferences_url %>
|
||||
en stel in "<%= Preference.human_attribute_name('sms_email') %>" en
|
||||
"<%= Preference.human_attribute_name('sms_context') %>" voor acties die
|
||||
verzonden zijn via email (die bijv. komen via een SMS message)</li>
|
||||
<li>In sendmail/qmail/postfix/whatever, stel een email address
|
||||
alias in om berichten door te sturen naar
|
||||
<pre>/PATH/TO/RUBY/ruby /PATH/TO/TRACKS/script/runner -e production 'MessageGateway.receive(STDIN.read)'</pre></li>
|
||||
<li>Verstuur een email naar het net geconfigureerde e-mail adres!</li>
|
||||
</ul>
|
||||
<p>Je kan ook de Rich Todo API gebruiken om acties te maken zoals "do laundry @ Home"
|
||||
of "Call Bill > project X". Het onderwerp van het bericht zal de bijschrijving van de actie vullen,
|
||||
de context, en het project, terwijl de body van het bericht de notities van de actie zal vullen.
|
||||
</p>
|
||||
|
||||
<a name="google_gadget"> </a>
|
||||
<h2>Voeg tracks toe als een Google Gmail gadget</h2>
|
||||
<p>
|
||||
Je kan nu ook jouw projects/actions beheren in Gmail met de Tracks Gmail Gadget.
|
||||
Voeg Tracks Gmail gadget toe aan de sidebar van Gmail en volg jouw acties
|
||||
of voeg een nieuwe actie toe zonder apart een nieuw browser tab/scherm te openen
|
||||
voor Tracks. Om dit in te stellen:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Log bij Gmail in en kies Settings in de rechter-bovenkant van jouw Gmail pagina. In de Gmail setting pagina, kies de Labs tab</li>
|
||||
<li>Zet de "Add any gadget by URL" feature aan. Deze kan je onderop de lijst vinden. Kies voor Enable and kies Save Changes.</li>
|
||||
<li>Nu zie je dat de Gadgets tab is toegevoegd aan de Gmail Settings. Ga nu naar de Gadgets tab</li>
|
||||
<li>Knip en plak de volgende link in de Add a gadget by its URL: en klik dan op de Add button:<br/>
|
||||
<pre><%= integrations_url + "/google_gadget" %></pre></li>
|
||||
</ul>
|
||||
|
|
@ -3,7 +3,7 @@
|
|||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<%= stylesheet_link_tag "scaffold" %>
|
||||
<%= javascript_include_tag 'jquery-1.5.min', 'jquery.cookie' %>
|
||||
<%= javascript_include_tag 'jquery-1.5.1.min', 'jquery.cookie' %>
|
||||
|
||||
<title><%= @page_title -%></title>
|
||||
|
||||
|
|
|
|||
|
|
@ -12,8 +12,8 @@
|
|||
<title><%= @page_title %></title>
|
||||
</head><body>
|
||||
<% if !(@new_mobile || @edit_mobile)
|
||||
if !current_user.prefs.nil? -%>
|
||||
<h1><span class="count"><%= @down_count %></span> <%=
|
||||
if current_user && !current_user.prefs.nil? -%>
|
||||
<h1><span class="count" id="badge_count"><%= @down_count %></span> <%=
|
||||
l(Date.today, :format => current_user.prefs.title_date_format) -%></h1>
|
||||
<div class="nav">
|
||||
<%= (link_to(t('layouts.mobile_navigation.new_action'), new_todo_path(new_todo_params))+" | ") unless @new_mobile -%>
|
||||
|
|
@ -25,7 +25,7 @@
|
|||
end -%><%= render_flash -%>
|
||||
</div>
|
||||
<%= yield -%>
|
||||
<hr/><% if !current_user.prefs.nil? -%>
|
||||
<hr/><% if current_user && !current_user.prefs.nil? -%>
|
||||
<div class="nav">
|
||||
<%= (link_to(t('layouts.mobile_navigation.logout'), logout_path(:format => 'm')) +" | ") -%>
|
||||
<%= (link_to(t('layouts.mobile_navigation.new_action'), new_todo_path(new_todo_params), {:accesskey => "0"})+" | ") unless @new_mobile -%>
|
||||
|
|
|
|||
|
|
@ -2,12 +2,13 @@
|
|||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<%= stylesheet_link_tag 'standard','superfish','niftyCorners', 'jquery-ui-1.8.9.custom', :cache => 'tracks-cached' %>
|
||||
<%= stylesheet_link_tag 'standard','superfish','niftyCorners', 'jquery-ui-1.8.10.custom', :cache => 'tracks-cached' %>
|
||||
<%= stylesheet_link_tag "print", :media => "print" %>
|
||||
<%= javascript_include_tag 'jquery-1.5.min', 'jquery-ui-1.8.9.custom.min',
|
||||
<%= javascript_include_tag 'jquery-1.5.1.min', 'jquery-ui-1.8.10.custom.min',
|
||||
'jquery.truncator','jquery.jeditable.mini', 'jquery.cookie', 'jquery.blockUI',
|
||||
'jquery.form','jquery.ui.autocomplete.selectFirst',
|
||||
:cache => 'jquery-cached' %>
|
||||
<%= javascript_tag_for_i18n_datepicker %>
|
||||
<%= javascript_include_tag 'hoverIntent','superfish','application',
|
||||
'accesskey-hints','niftycube','swfobject',
|
||||
:cache => 'tracks-cached' %>
|
||||
|
|
@ -24,7 +25,7 @@
|
|||
<% if current_user.prefs.refresh != 0 -%>
|
||||
setup_auto_refresh(<%= current_user.prefs["refresh"].to_i*60000 %>);
|
||||
<% end -%>
|
||||
<% unless @controller_name == 'feed' or session['noexpiry'] == "on" -%>
|
||||
<% unless controller.controller_name == 'feed' or session['noexpiry'] == "on" -%>
|
||||
setup_periodic_check("<%=url_for(:controller => "login", :action => "check_expiry")%>", 5*60);
|
||||
<% end -%>
|
||||
setup_periodic_check("<%=check_deferred_todos_path(:format => 'js')%>", 10*60, 'POST');
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@
|
|||
table_row(pref_name, nowrap_label) { text_field('prefs', pref_name) }
|
||||
end
|
||||
%>
|
||||
<%= row_with_select_field('locale', I18n.available_locales) %>
|
||||
<%= row_with_select_field('locale', I18n.available_locales.map {|l| l.to_s}) %>
|
||||
<%= row_with_text_field('date_format') %>
|
||||
<%= row_with_text_field('title_date_format') %>
|
||||
<%= table_row('time_zone', false) { time_zone_select('prefs','time_zone') } %>
|
||||
|
|
|
|||
|
|
@ -4,16 +4,16 @@
|
|||
<a href="#" class="container_toggle" id="toggle_p<%= project.id %>"><%= image_tag("collapse.png") %></a>
|
||||
<% end -%>
|
||||
<%= project.name -%></h2>
|
||||
<div id="<%= dom_id(project, "container")%>">
|
||||
<div id="<%= dom_id(project, "container")%>" class="list"><%-# list needs to be here for edit form to work -%>
|
||||
<%= render :partial => "projects/project_settings", :object => project, :locals => { :collapsible => collapsible } %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="container">
|
||||
<h2>Actions in this project</h2>
|
||||
<h2><%= t('projects.actions_in_project_title') %></h2>
|
||||
<div id="p<%= project.id %>items" class="items toggle_target">
|
||||
<div id="p<%= project.id %>empty-nd" style="display:<%= @not_done.empty? ? 'block' : 'none'%>;">
|
||||
<div class="message"><p>Currently there are no incomplete actions in this project</p></div>
|
||||
<div class="message"><p><%= t('projects.no_actions_in_project') %></p></div>
|
||||
</div>
|
||||
<%= render :partial => "todos/todo", :collection => @not_done, :locals => { :parent_container_type => "project" } %>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,25 +1,26 @@
|
|||
<% project = project_settings -%>
|
||||
<div id="<%= dom_id(project) %>" class="project">
|
||||
<div class="project_settings">This project
|
||||
<% if project.completed? -%>has been marked as completed
|
||||
<% elsif project.hidden? -%>has been marked as hidden
|
||||
<% else -%>is active
|
||||
<div class="project_settings"><%= t('projects.this_project') %>
|
||||
<% if project.completed? -%><%= t('projects.was_marked_complete') %>
|
||||
<% elsif project.hidden? -%><%= t('projects.was_marked_hidden') %>
|
||||
<% else -%><%= t('projects.is_active') %>
|
||||
<% end -%>
|
||||
with <% if project.default_context.nil? -%>
|
||||
no default context
|
||||
<% if project.default_context.nil? -%>
|
||||
<%= t('projects.with_no_default_context') %>
|
||||
<% else -%>
|
||||
a default context of <%= project.default_context.name -%>
|
||||
<%= t('projects.with_default_context', :context_name => project.default_context.name) %>
|
||||
<% end -%>
|
||||
and with <% if project.default_tags.nil? || project.default_tags.blank? -%>
|
||||
no default tags.
|
||||
<% if project.default_tags.nil? || project.default_tags.blank? -%>
|
||||
<%= t('projects.with_no_default_tags') %>.
|
||||
<% else -%>
|
||||
'<%= project.default_tags -%>' as the default tags.
|
||||
<%= t('projects.with_default_tags', :tags => project.default_tags) %>.
|
||||
<% end -%>
|
||||
<%= link_to_edit_project(project, "Edit Project Settings") %>
|
||||
<%= link_to_edit_project(project, t('projects.edit_project_settings')) %>
|
||||
</div>
|
||||
<% unless project.description.blank? -%>
|
||||
<div class="project_description"><%= format_note(project.description) %></div>
|
||||
<% end -%>
|
||||
</div>
|
||||
<div id="<%= dom_id(project, 'edit') %>" class="edit-form" style="display:none;">
|
||||
<div class="placeholder"> </div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ function replace_project_with_edit_form() {
|
|||
$('div#<%=dom_id(@project)%>').fadeOut(250, function() {
|
||||
show_edit_form();
|
||||
set_focus();
|
||||
enable_rich_interaction();
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
<div class="container">
|
||||
<div id="notes">
|
||||
<div class="add_note_link"><%= link_to t('projects.add_note'), '#' %> </div>
|
||||
<h2>Notes</h2>
|
||||
<h2><%= t('projects.notes') %></h2>
|
||||
<div id="empty-n" style="display:<%= @project.notes.empty? ? 'block' : 'none'%>;">
|
||||
<%= render :partial => "shared/empty",
|
||||
:locals => { :message => t('projects.no_notes_attached')} %>
|
||||
|
|
|
|||
|
|
@ -40,7 +40,10 @@ function update_project_page() {
|
|||
}
|
||||
|
||||
function remove_project_edit_form() {
|
||||
$('#<%=dom_id(@project, 'edit')%>').hide(500, function() {$('#<%=dom_id(@project, 'edit')%>').remove();} );
|
||||
<%-
|
||||
# do not remove() edit form as this will remove the DIV that is needed to replace with the new form, so only empty the DIV
|
||||
-%>
|
||||
$('#<%=dom_id(@project, 'edit')%>').hide(500, function() {$('#<%=dom_id(@project, 'edit')%>').html("<!- empty ->");} );
|
||||
}
|
||||
|
||||
function update_and_show_project_settings() {
|
||||
|
|
|
|||
|
|
@ -11,101 +11,104 @@
|
|||
|
||||
<div id="recurring_todo_form_container">
|
||||
<div id="recurring_todo">
|
||||
<label for="recurring_todo_description">Description</label><%=
|
||||
<label for="recurring_todo_description"><%= Todo.human_attribute_name('description') %></label><%=
|
||||
text_field_tag( "recurring_todo[description]", @recurring_todo.description, "size" => 30, "tabindex" => 1, "maxlength" => 100, :id => "edit_recurring_todo_description") -%>
|
||||
|
||||
<label for="recurring_todo_notes">Notes</label><%=
|
||||
<label for="recurring_todo_notes"><%= Todo.human_attribute_name('notes') %></label><%=
|
||||
text_area_tag( "recurring_todo[notes]", @recurring_todo.notes, {:cols => 29, :rows => 6, :tabindex => 2}) -%>
|
||||
|
||||
<label for="edit_recurring_todo_project_name">Project</label>
|
||||
<label for="edit_recurring_todo_project_name"><%= Todo.human_attribute_name('project') %></label>
|
||||
<input id="edit_recurring_todo_project_name" name="project_name" autocomplete="off" tabindex="3" size="30" type="text" value="<%= @recurring_todo.project.nil? ? 'None' : @recurring_todo.project.name.gsub(/"/,""") %>" />
|
||||
<div class="page_name_auto_complete" id="edit_project_list" style="display:none"></div>
|
||||
|
||||
<label for="edit_recurring_todo_context_name">Context</label>
|
||||
<label for="edit_recurring_todo_context_name"><%= Todo.human_attribute_name('context') %></label>
|
||||
<input id="edit_recurring_todo_context_name" name="context_name" autocomplete="off" tabindex="4" size="30" type="text" value="<%= @recurring_todo.context.name %>" />
|
||||
<div class="page_name_auto_complete" id="edit_context_list" style="display:none"></div>
|
||||
|
||||
<label for="edit_recurring_todo_tag_list">Tags (separate with commas)</label>
|
||||
<label for="edit_recurring_todo_tag_list"><%= "#{Todo.human_attribute_name('tags')} #{t('shared.separate_tags_with_commas')}"%></label>
|
||||
<%= text_field_tag "edit_recurring_todo_tag_list", @recurring_todo.tag_list, :size => 30, :tabindex => 5 -%>
|
||||
</div>
|
||||
</div>
|
||||
<div id="recurring_edit_period_id">
|
||||
<div id="recurring_edit_period">
|
||||
<label>Recurrence period</label><br/>
|
||||
<%= radio_button_tag('recurring_edit_todo[recurring_period]', 'daily', @recurring_todo.recurring_period == 'daily')%> Daily<br/>
|
||||
<%= radio_button_tag('recurring_edit_todo[recurring_period]', 'weekly', @recurring_todo.recurring_period == 'weekly')%> Weekly<br/>
|
||||
<%= radio_button_tag('recurring_edit_todo[recurring_period]', 'monthly', @recurring_todo.recurring_period == 'monthly')%> Monthly<br/>
|
||||
<%= radio_button_tag('recurring_edit_todo[recurring_period]', 'yearly', @recurring_todo.recurring_period == 'yearly')%> Yearly<br/>
|
||||
<% #behaviour is set in index because behaviours in partials are not generated -%>
|
||||
<label><%= t('todos.recurrence_period') %></label><br/>
|
||||
<%= radio_button_tag('recurring_edit_todo[recurring_period]', 'daily', @recurring_todo.recurring_period == 'daily')%> <%= t('todos.recurrence.daily') %><br/>
|
||||
<%= radio_button_tag('recurring_edit_todo[recurring_period]', 'weekly', @recurring_todo.recurring_period == 'weekly')%> <%= t('todos.recurrence.weekly') %><br/>
|
||||
<%= radio_button_tag('recurring_edit_todo[recurring_period]', 'monthly', @recurring_todo.recurring_period == 'monthly')%> <%= t('todos.recurrence.monthly') %><br/>
|
||||
<%= radio_button_tag('recurring_edit_todo[recurring_period]', 'yearly', @recurring_todo.recurring_period == 'yearly')%> <%= t('todos.recurrence.yearly') %><br/>
|
||||
<%- #behaviour is set in index because behaviours in partials are not generated -%>
|
||||
</div>
|
||||
<div id="recurring_timespan">
|
||||
<br/>
|
||||
<label for="recurring_todo[start_from]">Starts on </label><%=
|
||||
<label for="recurring_todo[start_from]"><%= t('todos.recurrence.starts_on') %>: </label><%=
|
||||
text_field_tag("recurring_todo_edit_start_from", format_date(@recurring_todo.start_from), "size" => 12, "class" => "Date", "tabindex" => 6, "autocomplete" => "off") %><br/>
|
||||
<br/>
|
||||
<label for="recurring_todo[ends_on]">Ends on:</label><br/>
|
||||
<%= radio_button_tag('recurring_todo[ends_on]', 'no_end_date', @recurring_todo.ends_on == 'no_end_date')%> No end date<br/>
|
||||
<%= radio_button_tag('recurring_todo[ends_on]', 'ends_on_number_of_times', @recurring_todo.ends_on == 'ends_on_number_of_times')%> Ends after <%= text_field_tag("recurring_todo[number_of_occurences]", @recurring_todo.number_of_occurences, "size" => 3, "tabindex" => 7) %> times<br/>
|
||||
<%= radio_button_tag('recurring_todo[ends_on]', 'ends_on_end_date', @recurring_todo.ends_on == 'ends_on_end_date')%> Ends on <%=
|
||||
text_field_tag('recurring_todo_edit_end_date', format_date(@recurring_todo.end_date), "size" => 12, "class" => "Date", "tabindex" => 8, "autocomplete" => "off") %><br/>
|
||||
<label for="recurring_todo[ends_on]"><%= t('todos.recurrence.ends_on') %>:</label><br/>
|
||||
<%= radio_button_tag('recurring_todo[ends_on]', 'no_end_date', @recurring_todo.ends_on == 'no_end_date')%> <%= t('todos.recurrence.no_end_date') %><br/>
|
||||
<%= radio_button_tag('recurring_todo[ends_on]', 'ends_on_number_of_times', @recurring_todo.ends_on == 'ends_on_number_of_times')%>
|
||||
<%= t('todos.recurrence.ends_on_number_times', :number => text_field( :recurring_todo, :number_of_occurences, "size" => 3, "tabindex" => 7)) %><br/>
|
||||
<%= radio_button_tag('recurring_todo[ends_on]', 'ends_on_end_date', @recurring_todo.ends_on == 'ends_on_end_date')%>
|
||||
<%= t('todos.recurrence.ends_on_date', :date => text_field_tag('recurring_todo_edit_end_date', format_date(@recurring_todo.end_date), "size" => 12, "class" => "Date", "tabindex" => 8, "autocomplete" => "off")) %><br/>
|
||||
</div></div>
|
||||
<div id="recurring_edit_daily" style="display:<%= @recurring_todo.recurring_period == 'daily' ? 'block' : 'none' %> ">
|
||||
<label>Settings for daily recurring actions</label><br/>
|
||||
<%= radio_button_tag('recurring_todo[daily_selector]', 'daily_every_x_day', !@recurring_todo.only_work_days)%> Every <%=
|
||||
text_field_tag( 'recurring_todo[daily_every_x_days]', @recurring_todo.daily_every_x_days, {"size" => 3, "tabindex" => 9}) %> day(s)<br/>
|
||||
<%= radio_button_tag('recurring_todo[daily_selector]', 'daily_every_work_day', @recurring_todo.only_work_days)%> Every work day<br/>
|
||||
<label><%= t('todos.recurrence.daily_options') %></label><br/>
|
||||
<%= radio_button_tag('recurring_todo[daily_selector]', 'daily_every_x_day', !@recurring_todo.only_work_days)%>
|
||||
<%= t('todos.recurrence.daily_every_number_day', :number=> text_field_tag( 'recurring_todo[daily_every_x_days]', @recurring_todo.daily_every_x_days, {"size" => 3, "tabindex" => 9})) %><br/>
|
||||
<%= radio_button_tag('recurring_todo[daily_selector]', 'daily_every_work_day', @recurring_todo.only_work_days)%> <%= t('todos.recurrence.every_work_day') %><br/>
|
||||
</div>
|
||||
<div id="recurring_edit_weekly" style="display:<%= @recurring_todo.recurring_period == 'weekly' ? 'block' : 'none' %>">
|
||||
<label>Settings for weekly recurring actions</label><br/>
|
||||
Returns every <%= text_field_tag('recurring_todo[weekly_every_x_week]', @recurring_todo.weekly_every_x_week, {"size" => 3, "tabindex" => 9}) %> week on<br/>
|
||||
<%= check_box_tag('recurring_todo[weekly_return_monday]', 'm', @recurring_todo.on_monday ) %> Monday
|
||||
<%= check_box_tag('recurring_todo[weekly_return_tuesday]', 't', @recurring_todo.on_tuesday) %> Tuesday
|
||||
<%= check_box_tag('recurring_todo[weekly_return_wednesday]', 'w', @recurring_todo.on_wednesday) %> Wednesday
|
||||
<%= check_box_tag('recurring_todo[weekly_return_thursday]', 't', @recurring_todo.on_thursday) %> Thursday<br/>
|
||||
<%= check_box_tag('recurring_todo[weekly_return_friday]', 'f', @recurring_todo.on_friday) %> Friday
|
||||
<%= check_box_tag('recurring_todo[weekly_return_saturday]', 's', @recurring_todo.on_saturday) %> Saturday
|
||||
<%= check_box_tag('recurring_todo[weekly_return_sunday]', 's', @recurring_todo.on_sunday) %> Sunday<br/>
|
||||
<label><%= t('todos.recurrence.weekly_options') %></label><br/>
|
||||
<%= t('todos.recurrence.weekly_every_number_week', :number => text_field_tag('recurring_todo[weekly_every_x_week]', @recurring_todo.weekly_every_x_week, {"size" => 3, "tabindex" => 9})) %><br/>
|
||||
<%= check_box_tag('recurring_todo[weekly_return_monday]', 'm', @recurring_todo.on_monday ) %> <%= t('date.day_names')[1] %>
|
||||
<%= check_box_tag('recurring_todo[weekly_return_tuesday]', 't', @recurring_todo.on_tuesday) %> <%= t('date.day_names')[2] %>
|
||||
<%= check_box_tag('recurring_todo[weekly_return_wednesday]', 'w', @recurring_todo.on_wednesday) %> <%= t('date.day_names')[3] %>
|
||||
<%= check_box_tag('recurring_todo[weekly_return_thursday]', 't', @recurring_todo.on_thursday) %> <%= t('date.day_names')[4] %><br/>
|
||||
<%= check_box_tag('recurring_todo[weekly_return_friday]', 'f', @recurring_todo.on_friday) %> <%= t('date.day_names')[5] %>
|
||||
<%= check_box_tag('recurring_todo[weekly_return_saturday]', 's', @recurring_todo.on_saturday) %> <%= t('date.day_names')[6] %>
|
||||
<%= check_box_tag('recurring_todo[weekly_return_sunday]', 's', @recurring_todo.on_sunday) %> <%= t('date.day_names')[0] %><br/>
|
||||
</div>
|
||||
<div id="recurring_edit_monthly" style="display:<%= @recurring_todo.recurring_period == 'monthly' ? 'block' : 'none' %>">
|
||||
<label>Settings for monthly recurring actions</label><br/>
|
||||
<%= radio_button_tag('recurring_todo[monthly_selector]', 'monthly_every_x_day', @recurring_todo.is_monthly_every_x_day || @recurring_todo.recurring_period == 'weekly')%> Day <%=
|
||||
text_field_tag('recurring_todo[monthly_every_x_day]', @recurring_todo.monthly_every_x_day, {"size" => 3, "tabindex" => 9}) %> on every <%=
|
||||
text_field_tag('recurring_todo[monthly_every_x_month]', @recurring_todo.monthly_every_x_month, {"size" => 3, "tabindex" => 10}) %> month<br/>
|
||||
<%= radio_button_tag('recurring_todo[monthly_selector]', 'monthly_every_xth_day', @recurring_todo.is_monthly_every_xth_day)%> The <%=
|
||||
select_tag('recurring_todo[monthly_every_xth_day]', options_for_select(@xth_day, @xth_day[@recurring_todo.monthly_every_xth_day(1)-1][1])) %> <%=
|
||||
select_tag('recurring_todo[monthly_day_of_week]' , options_for_select(@days_of_week, @recurring_todo.monthly_day_of_week), {}) %> of every <%=
|
||||
text_field_tag('recurring_todo[monthly_every_x_month2]', @recurring_todo.monthly_every_x_month2, {"size" => 3, "tabindex" => 11}) %> month<br/>
|
||||
<label><%= t('todos.recurrence.monthly_options') %></label><br/>
|
||||
<%= radio_button_tag('recurring_todo[monthly_selector]', 'monthly_every_x_day', @recurring_todo.is_monthly_every_x_day || @recurring_todo.recurring_period == 'weekly')%>
|
||||
<%= t('todos.recurrence.day_x_on_every_x_month',
|
||||
:day => text_field_tag('recurring_todo[monthly_every_x_day]', @recurring_todo.monthly_every_x_day, {"size" => 3, "tabindex" => 9}),
|
||||
:month => text_field_tag('recurring_todo[monthly_every_x_month]', @recurring_todo.monthly_every_x_month, {"size" => 3, "tabindex" => 10})) %><br/>
|
||||
<%= radio_button_tag('recurring_todo[monthly_selector]', 'monthly_every_xth_day', @recurring_todo.is_monthly_every_xth_day)%>
|
||||
<%= t('todos.recurrence.monthly_every_xth_day',
|
||||
:day => select_tag('recurring_todo[monthly_every_xth_day]', options_for_select(@xth_day, @xth_day[@recurring_todo.monthly_every_xth_day(1)-1][1])),
|
||||
:day_of_week => select_tag('recurring_todo[monthly_day_of_week]' , options_for_select(@days_of_week, @recurring_todo.monthly_day_of_week), {}),
|
||||
:month => text_field_tag('recurring_todo[monthly_every_x_month2]', @recurring_todo.monthly_every_x_month2, {"size" => 3, "tabindex" => 11})) %><br/>
|
||||
</div>
|
||||
<div id="recurring_edit_yearly" style="display:<%= @recurring_todo.recurring_period == 'yearly' ? 'block' : 'none' %>">
|
||||
<label>Settings for yearly recurring actions</label><br/>
|
||||
<%= radio_button_tag('recurring_todo[yearly_selector]', 'yearly_every_x_day', @recurring_todo.recurrence_selector == 0)%> Every <%=
|
||||
select_tag('recurring_todo[yearly_month_of_year]', options_for_select(@months_of_year, @recurring_todo.yearly_month_of_year), {}) %> <%=
|
||||
text_field_tag('recurring_todo[yearly_every_x_day]', @recurring_todo.yearly_every_x_day, "size" => 3, "tabindex" => 9) %><br/>
|
||||
<%= radio_button_tag('recurring_todo[yearly_selector]', 'yearly_every_xth_day', @recurring_todo.recurrence_selector == 1)%> The <%=
|
||||
select_tag('recurring_todo[yearly_every_xth_day]', options_for_select(@xth_day, @recurring_todo.yearly_every_xth_day), {}) %> <%=
|
||||
select_tag('recurring_todo[yearly_day_of_week]', options_for_select(@days_of_week, @recurring_todo.yearly_day_of_week), {}) %> of <%=
|
||||
select_tag('recurring_todo[yearly_month_of_year2]', options_for_select(@months_of_year, @recurring_todo.yearly_month_of_year2), {}) %><br/>
|
||||
<label><%= t('todos.recurrence.yearly_options') %></label><br/>
|
||||
<%= radio_button_tag('recurring_todo[yearly_selector]', 'yearly_every_x_day', @recurring_todo.recurrence_selector == 0)%>
|
||||
<%= t('todos.recurrence.yearly_every_x_day',
|
||||
:month => select_tag('recurring_todo[yearly_month_of_year]', options_for_select(@months_of_year, @recurring_todo.yearly_month_of_year), {}),
|
||||
:day => text_field_tag('recurring_todo[yearly_every_x_day]', @recurring_todo.yearly_every_x_day, "size" => 3, "tabindex" => 9)) %><br/>
|
||||
<%= radio_button_tag('recurring_todo[yearly_selector]', 'yearly_every_xth_day', @recurring_todo.recurrence_selector == 1)%>
|
||||
<%= t('todos.recurrence.yearly_every_xth_day',
|
||||
:day => select_tag('recurring_todo[yearly_every_xth_day]', options_for_select(@xth_day, @recurring_todo.yearly_every_xth_day), {}),
|
||||
:day_of_week => select_tag('recurring_todo[yearly_day_of_week]', options_for_select(@days_of_week, @recurring_todo.yearly_day_of_week), {}),
|
||||
:month => select_tag('recurring_todo[yearly_month_of_year2]', options_for_select(@months_of_year, @recurring_todo.yearly_month_of_year2), {})) %><br/>
|
||||
</div>
|
||||
<div id="recurring_target">
|
||||
<label>Set recurrence on</label><br/>
|
||||
<%= radio_button_tag('recurring_todo[recurring_target]', 'due_date', @recurring_todo.target == 'due_date')%> the date that the todo is due. Show the todo:
|
||||
<%= radio_button_tag('recurring_todo[recurring_show_always]', '1', @recurring_todo.show_always?)%> always
|
||||
<label><%= t('todos.recurrence.recurrence_on_options') %></label><br/>
|
||||
<%= radio_button_tag('recurring_todo[recurring_target]', 'due_date', @recurring_todo.target == 'due_date')%> <%= t('todos.recurrence.recurrence_on_due_date') %>. <%= t('todos.recurrence.show_options') %>:
|
||||
<%= radio_button_tag('recurring_todo[recurring_show_always]', '1', @recurring_todo.show_always?)%> <%= t('todos.recurrence.show_option_always') %>
|
||||
<%= radio_button_tag('recurring_todo[recurring_show_always]', '0', !@recurring_todo.show_always?)%>
|
||||
<%= text_field_tag( 'recurring_todo[recurring_show_days_before]', @recurring_todo.show_from_delta, {"size" => 3, "tabindex" => 12}) %>
|
||||
days before the todo is due
|
||||
<br/>
|
||||
<%= radio_button_tag('recurring_todo[recurring_target]', 'show_from_date', @recurring_todo.target == 'show_from_date')%> the date todo comes from tickler (no due date set)<br/>
|
||||
<%= t('todos.recurrence.show_days_before', :days => text_field_tag( 'recurring_todo[recurring_show_days_before]', @recurring_todo.show_from_delta, {"size" => 3, "tabindex" => 12})) %><br/>
|
||||
<%= radio_button_tag('recurring_todo[recurring_target]', 'show_from_date', @recurring_todo.target == 'show_from_date')%> <%= t('todos.recurrence.from_tickler') %><br/>
|
||||
<br/>
|
||||
</div>
|
||||
<div class="recurring_submit_box">
|
||||
<div class="widgets">
|
||||
<button type="submit" class="positive" id="recurring_todo_edit_action_submit" tabindex="15">
|
||||
<%=image_tag("accept.png", :alt => "") %>
|
||||
Update
|
||||
<%= t('common.update') %>
|
||||
</button>
|
||||
<button type="button" class="positive" id="recurring_todo_edit_action_cancel" tabindex="15">
|
||||
<%=image_tag("cancel.png", :alt => "") %>
|
||||
Cancel
|
||||
<%= t('common.cancel') %>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,10 +1,6 @@
|
|||
<div class="recurring_container">
|
||||
<%
|
||||
form_for(@new_recurring_todo, :html=> { :id=>'recurring-todo-form-new-action', :name=>'recurring_todo', :class => 'inline-form' }) do
|
||||
#form_remote_tag(
|
||||
# :url => recurring_todos_path, :method => :post,
|
||||
# :html=> { :id=>'recurring-todo-form-new-action', :name=>'recurring_todo', :class => 'inline-form' },
|
||||
# :before => "$('#recurring_todo_new_action_submit').block({message: null})") do
|
||||
-%>
|
||||
<div id="error_status"><%= error_messages_for("item", :object_name => 'action') %></div>
|
||||
|
||||
|
|
@ -76,7 +72,7 @@
|
|||
<%= radio_button_tag('recurring_todo[yearly_selector]', 'yearly_every_x_day', true)%> <%= t('todos.recurrence.yearly_every_x_day',
|
||||
:month => select_tag('recurring_todo[yearly_month_of_year]', options_for_select(@months_of_year, Time.zone.now.month), {}),
|
||||
:day => text_field_tag('recurring_todo[yearly_every_x_day]', Time.zone.now.day, "size" => 3, "tabindex" => 9)) %><br/>
|
||||
<%= radio_button_tag('recurring_todo[yearly_selector]', 'yearly_every_xth_day')%><%= t('todos.recurrence.yearly_every_xth_day',
|
||||
<%= radio_button_tag('recurring_todo[yearly_selector]', 'yearly_every_xth_day')%> <%= t('todos.recurrence.yearly_every_xth_day',
|
||||
:day => select_tag('recurring_todo[yearly_every_xth_day]', options_for_select(@xth_day), {}),
|
||||
:day_of_week => select_tag('recurring_todo[yearly_day_of_week]', options_for_select(@days_of_week, Time.zone.now.wday), {}),
|
||||
:month => select_tag('recurring_todo[yearly_month_of_year2]', options_for_select(@months_of_year, Time.zone.now.month), {})) %><br/>
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
<%
|
||||
@initial_context_name = @context.name unless @context.nil?
|
||||
@initial_context_name ||= @project.default_context.name unless @project.nil? || @project.default_context.nil?
|
||||
@initial_context_name ||= current_user.contexts.first.name unless current_user.contexts.first.nil?
|
||||
@initial_context_name ||= @contexts.first.name unless @contexts.first.nil?
|
||||
@initial_project_name = @project.name unless @project.nil?
|
||||
-%>
|
||||
<div id="todo_new_action_container">
|
||||
|
|
|
|||
|
|
@ -1,3 +1,8 @@
|
|||
<div id="footer">
|
||||
<p>Send feedback on <%= TRACKS_VERSION %>: <a href="http://www.assembla.com/spaces/tracks-tickets/tickets">Bugs</a> | <a href="http://www.getontracks.org/forums/">Forum</a> | <a href="http://www.getontracks.org/wiki/">Wiki</a> | <a href="mailto:butshesagirl@rousette.org.uk?subject=Tracks feedback">Email</a> | <a href="http://www.getontracks.org/">Website</a> | <a href="http://getontracks.org/tracks/contribute">Contribute</a></p>
|
||||
<p><%= t('footer.send_feedback', :version => TRACKS_VERSION) %>: <a href="http://www.assembla.com/spaces/tracks-tickets/tickets"><%= t('common.bugs')%></a> |
|
||||
<a href="http://www.getontracks.org/forums/"><%= t('common.forum')%></a> |
|
||||
<a href="http://www.getontracks.org/wiki/"><%= t('common.wiki')%></a> |
|
||||
<a href="mailto:butshesagirl@rousette.org.uk?subject=Tracks feedback"><%= t('common.email')%></a> |
|
||||
<a href="http://www.getontracks.org/"><%= t('common.website')%></a> |
|
||||
<a href="http://getontracks.org/tracks/contribute"><%= t('common.contribute')%></a></p>
|
||||
</div>
|
||||
|
|
@ -42,8 +42,17 @@ form_for(todo, :html=> { :name=>'todo', :id => dom_id(@todo, 'form'), :class =>
|
|||
</a>
|
||||
</div>
|
||||
|
||||
<label class="predecessor_list_label" for="<%= dom_id(@todo, 'predecessor_list') %>"><%= t('todos.depends_on_separate_with_commas') %></label>
|
||||
<%= text_field_tag 'predecessor_list', predecessor_list_text, :id => dom_id(@todo, 'predecessor_list'), :size => 30, :tabindex => 15 %>
|
||||
<div class="depends_on">
|
||||
<label for="predecessor_ul"><%= Todo.human_attribute_name('predecessors')%></label>
|
||||
<div class="selected_predecessors">
|
||||
<ul class="predecessor_list" id="predecessor_ul" style="display:<%= @todo.predecessors.empty? ? "none" : "block"%>">
|
||||
</ul>
|
||||
</div>
|
||||
<label id="label_for_predecessor_input" for="predecessor_input" style="display:none"><%= t('todos.add_another_dependency')%></label>
|
||||
<%= text_field_tag "predecessor_input", nil, :size => 30, :tabindex => 8 %>
|
||||
<%= hidden_field_tag "predecessor_list", @todo.predecessors.map{|t| t.id.to_s}.join(', ') %>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="submit_box">
|
||||
<div class="widgets">
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
</span>
|
||||
<% this_year = current_user.time.to_date.strftime("%Y").to_i
|
||||
if parent_container_type == 'show_mobile' -%>
|
||||
<p><label for="todo_done"><%= t('todos.done') %></label> <%= check_box_tag("done", 1, @todo && @todo.completed?, "tabindex" => 1) %></p>
|
||||
<p><label for="todo_done"><%= t('todos.done') %></label> <%= check_box_tag("done", 1, @todo && @todo.completed?, "tabindex" => 1, "onClick" => "document.mobileEdit.submit()") %></p>
|
||||
<% end -%>
|
||||
<h2><label for="todo_description"><%= t('common.description') %></label></h2>
|
||||
<%= text_field( "todo", "description", "tabindex" => 2, "maxlength" => 100, "size" => 50) %>
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@
|
|||
<input id="multi_todo_context_name" name="context_name" autocomplete="off" tabindex="4" size="30" type="text" value="<%= @initial_context_name %>" />
|
||||
<div class="page_name_auto_complete" id="context_list" style="display:none"></div>
|
||||
|
||||
<label for="tag_list"><%= t('shared.tags_for_all_actions') + ' (' + t('shared.separate_tags_with_commas') +')' %></label>
|
||||
<label for="tag_list"><%= t('shared.tags_for_all_actions') %></label>
|
||||
<%= text_field_tag "multi_tag_list", @default_tags, :name=>:tag_list, :size => 30, :tabindex => 5 %>
|
||||
<%= content_tag("div", "", :id => "tag_list_auto_complete", :class => "auto_complete") %>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
<%- todo = new_todo_form -%>
|
||||
|
||||
<div id="todo_new_action">
|
||||
<% form_for(todo, :html=> { :id=>'todo-form-new-action', :name=>'todo', :class => 'inline-form' }) do |t|%>
|
||||
<% form_for(todo, :html=> { :id=>'todo-form-new-action', :name=>'todo', :class => 'inline-form new_todo_form' }) do |t|%>
|
||||
<input id="default_project_name_id" name="default_project_name" type="hidden" value="<%=@initial_project_name-%>" />
|
||||
<input id="default_context_name_id" name="default_context_name" type="hidden" value="<%=@initial_context_name-%>" />
|
||||
|
||||
|
|
@ -34,8 +34,17 @@
|
|||
<%= t.text_field("show_from", "size" => 12, "class" => "Date", "tabindex" => 7, "autocomplete" => "off") %>
|
||||
</div>
|
||||
|
||||
<label for="predecessor_list"><%= Todo.human_attribute_name('predecessors')%></label>
|
||||
<%= text_field_tag "predecessor_list", nil, :size => 30, :tabindex => 8 %>
|
||||
<div class="depends_on">
|
||||
<label for="predecessor_ul"><%= Todo.human_attribute_name('predecessors')%></label>
|
||||
<div class="selected_predecessors">
|
||||
<ul class="predecessor_list" id="predecessor_ul" style="display:none">
|
||||
</ul>
|
||||
</div>
|
||||
<label id="label_for_predecessor_input" for="predecessor_input" style="display:none"><%= t('todos.add_another_dependency')%></label>
|
||||
<%= text_field_tag "predecessor_input", nil, :size => 30, :tabindex => 8 %>
|
||||
<%= hidden_field_tag "predecessor_list", ""%>
|
||||
</div>
|
||||
|
||||
<%= source_view_tag( @source_view ) %>
|
||||
<%= hidden_field_tag :_tag_name, @tag_name.underscore.gsub(/\s+/,'_') if source_view_is :tag %>
|
||||
|
||||
|
|
|
|||
|
|
@ -23,8 +23,8 @@ parameters += "&_tag_name=#{@tag_name}" if @source_view == 'tag'
|
|||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<%= grip_span(todo) %>
|
||||
<div class="description<%= staleness_class( todo ) %>">
|
||||
<%= grip_span(todo) %>
|
||||
<%= date_span(todo) -%>
|
||||
<span class="todo.descr"><%= h todo.description %></span>
|
||||
<%= image_tag_for_recurring_todo(todo) if todo.from_recurring_todo? %>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<% if @saved -%>
|
||||
TracksPages.page_notify('notice', "<%=@status_message%>", 5);
|
||||
TracksPages.page_notify('notice', "<%=escape_javascript @status_message%>", 5);
|
||||
TracksPages.hide_errors();
|
||||
TracksPages.set_page_badge(<%= @down_count %>);
|
||||
<% if should_show_new_item -%>
|
||||
|
|
@ -17,21 +17,22 @@
|
|||
|
||||
function clear_form() {
|
||||
$('#todo-form-new-action').clearForm();
|
||||
TracksForm.set_context_name('<%=@initial_context_name%>');
|
||||
TracksForm.set_project_name('<%=@initial_project_name%>');
|
||||
TracksForm.set_tag_list('<%=@default_tags%>');
|
||||
$('#todo-form-new-action').clearDeps();
|
||||
TracksForm.set_context_name('<%=escape_javascript @initial_context_name%>');
|
||||
TracksForm.set_project_name('<%=escape_javascript @initial_project_name%>');
|
||||
TracksForm.set_tag_list('<%=escape_javascript @default_tags%>');
|
||||
$('#todo-form-new-action input:text:first').focus();
|
||||
}
|
||||
|
||||
function insert_new_context_with_new_todo() {
|
||||
$('#no_todos_in_tag_view').slideUp(100);
|
||||
$('#no_todos_in_view').slideUp(100);
|
||||
$('#display_box').prepend(html_for_new_context());
|
||||
}
|
||||
|
||||
function add_todo_to_existing_context() {
|
||||
<% if source_view_is_one_of(:todo, :deferred, :tag) -%>
|
||||
$('#c<%= @todo.context_id %>').fadeIn(500, function() {});
|
||||
$('#no_todos_in_tag_view').slideUp(100);
|
||||
$('#no_todos_in_view').slideUp(100);
|
||||
<% end -%>
|
||||
$('#<%=empty_container_msg_div_id%>').hide();
|
||||
$('#<%=item_container_id(@todo)%>').append(html_for_new_todo());
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<%- if @saved -%>
|
||||
TracksPages.page_notify('notice', '<%= escape_javascript("The action was deleted succesfully") %>', 5);
|
||||
TracksPages.page_notify('notice', '<%= escape_javascript(t('todos.deleted_success')) %>', 5);
|
||||
TracksPages.set_page_badge(<%=@down_count%>);
|
||||
remove_todo_from_page();
|
||||
show_new_todo_if_todo_was_recurring();
|
||||
|
|
@ -19,7 +19,10 @@ function show_empty_messages() {
|
|||
<% end -%>
|
||||
|
||||
<% if empty_container_msg_div_id && todo_container_is_empty -%>
|
||||
$('#<%=empty_container_msg_div_id%>').slideDown(1000);
|
||||
$('#<%=empty_container_msg_div_id%>').slideDown(1000);
|
||||
<% if @down_count == 0 -%>
|
||||
$('#no_todos_in_view').slideDown(1000);
|
||||
<% end -%>
|
||||
<% end -%>
|
||||
|
||||
<% if source_view_is(:deferred) && @down_count==0 -%>
|
||||
|
|
@ -59,14 +62,24 @@ function show_new_todo_if_todo_was_recurring() {
|
|||
}
|
||||
|
||||
function activate_pending_todos() {
|
||||
<% # Activate pending todos that are successors of the deleted -%>
|
||||
<% @pending_to_activate.each do |t| -%>
|
||||
<% if source_view_is(:project) or source_view_is(:tag) %>
|
||||
$('#<%=dom_id(t)%>').remove();
|
||||
<% end -%>
|
||||
$('#<%=item_container_id(t)%>').append("<%=escape_javascript(render(:partial => t, :locals => { :parent_container_type => parent_container_type }))%>");
|
||||
$('#<%= dom_id(t, 'line')%>').effect('highlight', {}, 2000 );
|
||||
<% end -%>
|
||||
<% # Activate pending todos that are successors of the completed
|
||||
if @saved && @pending_to_activate
|
||||
# do not render the js in case of an error or if no todos to activate
|
||||
@pending_to_activate.each do |t|
|
||||
html = escape_javascript(render(:partial => t, :locals => { :parent_container_type => parent_container_type }))
|
||||
# only project and tag view have a deferred/blocked container
|
||||
if source_view_is_one_of(:project,:tag) -%>
|
||||
$('#<%= dom_id(t) %>').fadeOut(400, function() {
|
||||
$('#<%= dom_id(t) %>').remove();
|
||||
$('#<%= item_container_id(t) %>').append("<%= html %>");
|
||||
<%= "$('#tickler-empty-nd').show();" if @remaining_deferred_or_pending_count==0 -%>
|
||||
});
|
||||
<% else -%>
|
||||
$('#<%= item_container_id(t) %>').append("<%= html%>");
|
||||
<% end -%>
|
||||
TodoItems.highlight_todo('#<%= dom_id(t, 'line')%>');
|
||||
<% end -%>
|
||||
<% end -%>
|
||||
}
|
||||
|
||||
function html_for_new_recurring_todo() {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
hide_todo();
|
||||
replace_placeholder_with_form();
|
||||
fill_dependency_array();
|
||||
enable_rich_interaction();
|
||||
|
||||
function hide_todo() {
|
||||
|
|
@ -12,6 +13,14 @@ function replace_placeholder_with_form() {
|
|||
$('#<%=dom_id(@todo, 'form')%> input#todo_description').focus();
|
||||
}
|
||||
|
||||
function fill_dependency_array() {
|
||||
spec_of_todo = new Array();
|
||||
<%
|
||||
@todo.predecessors.each do |dep| -%>
|
||||
spec_of_todo['<%=dep.id%>'] = "<%= escape_javascript(dep.specification)%>";
|
||||
<% end -%>
|
||||
}
|
||||
|
||||
function html_for_edit_form() {
|
||||
return "<%= escape_javascript(render(:partial => 'todos/edit_form', :object => @todo)) %>"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,8 @@
|
|||
<div id="display_box">
|
||||
<div id="no_todos_in_view" class="container context" <%= "style=\"display:none\"" unless @not_done_todos.empty? %> >
|
||||
<h2><%= t('todos.no_actions_found_title')%></h2>
|
||||
<div class="message"><p><%= t('todos.no_actions_found') %></p></div>
|
||||
</div>
|
||||
<%= render(
|
||||
:partial => "contexts/context",
|
||||
:collection => @contexts_to_show,
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
<div id="display_box">
|
||||
<% if @not_done_todos.empty? -%>
|
||||
<div class="container context">
|
||||
<h2><%= t('todos.no_actions_found') %></h2>
|
||||
<h2><%= t('todos.no_actions_found_title') %></h2>
|
||||
<div class="message"><%= t('todos.no_actions_with', :tag_name => @tag_name) %></div>
|
||||
</div>
|
||||
<% end -%>
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ function update_successor() {
|
|||
<%= "show_empty_deferred_message(); " if @remaining_deferred_or_pending_count == 0 %>
|
||||
<% if source_view_is_one_of(:todo, :deferred, :tag) -%>
|
||||
$('#c<%= @successor.context_id %>').fadeIn(500, function() {});
|
||||
$('#no_todos_in_tag_view').slideUp(100);
|
||||
$('#no_todos_in_view').slideUp(100);
|
||||
<% end -%>
|
||||
$('#<%=item_container_id(@successor)%>').append(html_for_new_successor());
|
||||
$('#<%= dom_id(@successor, 'line')%>').effect('highlight', {}, 2000 ); <%
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
<% form_tag todo_path(@todo, :format => 'm'), :method => :put do %>
|
||||
<% form_tag todo_path(@todo, :format => 'm'), :name => 'mobileEdit', :method => :put do %>
|
||||
<%= render :partial => 'edit_mobile', :locals => { :parent_container_type => "show_mobile" } %>
|
||||
<p><input type="submit" value="<%= t('common.update') %>" tabindex="6" accesskey="#" /></p>
|
||||
<% end -%>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<div id="display_box">
|
||||
<div id="no_todos_in_tag_view" class="container context" <%= "style=\"display:none\"" unless @not_done_todos.empty? %> >
|
||||
<h2><%= t('todos.no_actions_found')%></h2>
|
||||
<div id="no_todos_in_view" class="container context" <%= "style=\"display:none\"" unless @not_done_todos.empty? %> >
|
||||
<h2><%= t('todos.no_actions_found_title')%></h2>
|
||||
<div class="message"><p><%= t('todos.no_actions_with', :tag_name=>@tag_name) %></p></div>
|
||||
</div>
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
animation = []
|
||||
animation << "remove_todo"
|
||||
if @todo.completed?
|
||||
animation << "add_to_completed_container"
|
||||
animation << "add_to_completed_container" unless source_view_is(:calendar)
|
||||
animation << "add_new_recurring_todo"
|
||||
animation << "activate_pending_todos"
|
||||
animation << "remove_source_container"
|
||||
|
|
@ -15,14 +15,15 @@
|
|||
animation << "add_todo_to_context"
|
||||
animation << "block_predecessors"
|
||||
end
|
||||
animation << "update_empty_tag_container" if source_view_is(:tag) -%>
|
||||
animation << "update_empty_container" if source_view_is_one_of(:tag, :todo) -%>
|
||||
<%= render_animation(animation) %>
|
||||
TracksPages.set_page_badge(<%= @down_count %>);
|
||||
<% end -%>
|
||||
<% end -%>
|
||||
|
||||
function redirect_after_complete() {
|
||||
redirect_to("<%= project_path(@todo.project) -%>");
|
||||
var path = "<%= @todo.project_id.nil? ? "/" : project_path(@todo.project) -%>";
|
||||
redirect_to(path);
|
||||
}
|
||||
|
||||
function remove_todo(next_steps) {
|
||||
|
|
@ -85,42 +86,43 @@ function add_new_recurring_todo(next_steps) {
|
|||
<% end -%>
|
||||
}
|
||||
|
||||
function update_empty_tag_container(next_steps) {
|
||||
function update_empty_container(next_steps) {
|
||||
<% if @down_count==0 -%>
|
||||
$('#no_todos_in_tag_view').slideDown(400, function(){ next_steps.go(); });
|
||||
$('#no_todos_in_view').slideDown(400, function(){ next_steps.go(); });
|
||||
<% else -%>
|
||||
$('#no_todos_in_tag_view').fadeOut(100, function(){ next_steps.go(); });
|
||||
$('#no_todos_in_view').fadeOut(100, function(){ next_steps.go(); });
|
||||
<% end -%>
|
||||
}
|
||||
|
||||
<% if @new_recurring_todo # hide js if @new_recurring_todo is not there-%>
|
||||
function highlight_updated_recurring_todo(next_steps) {
|
||||
highlight_todo('#<%= dom_id(@new_recurring_todo)%>');
|
||||
TodoItems.highlight_todo('#<%= dom_id(@new_recurring_todo)%>');
|
||||
next_steps.go();
|
||||
}
|
||||
<% end -%>
|
||||
|
||||
function highlight_updated_todo(next_steps) {
|
||||
highlight_todo('#<%= dom_id(@todo)%>');
|
||||
TodoItems.highlight_todo('#<%= dom_id(@todo)%>');
|
||||
next_steps.go();
|
||||
}
|
||||
|
||||
function highlight_todo(id) {
|
||||
$(id).effect('highlight', {}, 2000, function(){ });
|
||||
}
|
||||
|
||||
function activate_pending_todos(next_steps) {
|
||||
<% # Activate pending todos that are successors of the completed
|
||||
if @saved && @pending_to_activate
|
||||
# do not render the js in case of an error or if no todos to activate
|
||||
@pending_to_activate.each do |t|
|
||||
html = escape_javascript(render(:partial => t, :locals => { :parent_container_type => parent_container_type }))
|
||||
# only project and tag view have a deferred/blocked container
|
||||
if source_view_is_one_of(:project,:tag) -%>
|
||||
$('#<%= dom_id(t) %>').fadeOut(400, function() {
|
||||
$('#<%= dom_id(t) %>').remove();
|
||||
$('#<%= item_container_id(t) %>').append("<%= html %>");
|
||||
<%= "$('#tickler-empty-nd').show();" if @remaining_deferred_or_pending_count==0 -%>
|
||||
});
|
||||
<% end -%>
|
||||
$('#<%= item_container_id(t) %>').append("<%= escape_javascript(render(:partial => t, :locals => { :parent_container_type => parent_container_type }))%>");
|
||||
highlight_todo('#<%= dom_id(t)%>');
|
||||
<% else -%>
|
||||
$('#<%= item_container_id(t) %>').append("<%= html%>");
|
||||
<% end -%>
|
||||
TodoItems.highlight_todo('#<%= dom_id(t)%>');
|
||||
<% end -%>
|
||||
<% end -%>
|
||||
next_steps.go();
|
||||
|
|
@ -135,7 +137,7 @@ function block_predecessors(next_steps) {
|
|||
$('#<%= dom_id(t) %>').remove();
|
||||
<% if source_view_is(:project) or source_view_is(:tag) # Insert it in deferred/pending block if existing -%>
|
||||
$('#<%= item_container_id(t) %>').append("<%= escape_javascript(render(:partial => t, :locals => { :parent_container_type => parent_container_type }))%>");
|
||||
highlight_todo('#<%= dom_id(t)%>');
|
||||
TodoItems.highlight_todo('#<%= dom_id(t)%>');
|
||||
<% end -%>
|
||||
});
|
||||
<% end -%>
|
||||
|
|
|
|||
|
|
@ -15,12 +15,12 @@
|
|||
end
|
||||
animation << "hide_context" if update_needs_to_hide_context
|
||||
animation << "highlight_updated_todo"
|
||||
animation << "update_empty_tag_container" if source_view_is(:tag)
|
||||
animation << "update_empty_container" if source_view_is_one_of(:tag, :todo)
|
||||
animation << "update_predecessors"
|
||||
%>
|
||||
|
||||
<%= render_animation(animation) %>
|
||||
TracksPages.page_notify('notice', '<%=@status_message%>', 5);
|
||||
TracksPages.page_notify('notice', '<%=escape_javascript @status_message%>', 5);
|
||||
TracksPages.set_page_badge(<%= @down_count %>);
|
||||
<% end %>
|
||||
|
||||
|
|
@ -71,11 +71,11 @@ function highlight_updated_todo(next_steps) {
|
|||
next_steps.go();
|
||||
}
|
||||
|
||||
function update_empty_tag_container(next_steps) {
|
||||
function update_empty_container(next_steps) {
|
||||
<% if @down_count==0 -%>
|
||||
$('#no_todos_in_tag_view').slideDown(400, function(){ next_steps.go(); });
|
||||
$('#no_todos_in_view').slideDown(400, function(){ next_steps.go(); });
|
||||
<% else -%>
|
||||
$('#no_todos_in_tag_view').fadeOut(100, function(){ next_steps.go(); });
|
||||
$('#no_todos_in_view').fadeOut(100, function(){ next_steps.go(); });
|
||||
<% end -%>
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ Rails::Initializer.run do |config|
|
|||
config.gem "RedCloth"
|
||||
config.gem "soap4r", :lib => false
|
||||
config.gem 'datanoise-actionwebservice', :lib => 'actionwebservice'
|
||||
config.gem 'sanitize'
|
||||
config.gem 'sanitize', :version => '~> 1.2.1'
|
||||
config.gem 'rack', :version => '1.1.0'
|
||||
config.gem 'will_paginate', :version => '~> 2.3.15'
|
||||
config.gem 'has_many_polymorphs'
|
||||
|
|
@ -121,7 +121,7 @@ if ( SITE_CONFIG['authentication_schemes'].include? 'cas')
|
|||
end
|
||||
end
|
||||
|
||||
tracks_version='1.8devel'
|
||||
tracks_version='2.0devel'
|
||||
# comment out next two lines if you do not want (or can not) the date of the
|
||||
# last git commit in the footer
|
||||
info=`git log --pretty=format:"%ai" -1`
|
||||
|
|
|
|||
|
|
@ -41,5 +41,5 @@ config.gem "ZenTest", :lib => "zentest", :version => ">=4.0.0"
|
|||
config.gem "hpricot"
|
||||
config.gem "hoe"
|
||||
config.gem 'webrat', :lib => false, :version => '>=0.7.0' unless File.directory?(File.join(Rails.root, 'vendor/plugins/webrat'))
|
||||
config.gem 'rspec-rails', :lib => false, :version => '<2.1.0' unless File.directory?(File.join(Rails.root, 'vendor/plugins/rspec-rails'))
|
||||
config.gem 'rspec-rails', :lib => false, :version => '~>1.3.3' unless File.directory?(File.join(Rails.root, 'vendor/plugins/rspec-rails'))
|
||||
config.gem "thoughtbot-factory_girl", :lib => "factory_girl", :source => "http://gems.github.com"
|
||||
|
|
|
|||
|
|
@ -135,10 +135,7 @@ de:
|
|||
activerecord:
|
||||
attributes:
|
||||
project:
|
||||
name:
|
||||
blank: Das Projekt muss benannt sein
|
||||
taken: ist bereits vergeben
|
||||
too_long: Der Projekt-Name muss kürzer als 256 Zeichen sein
|
||||
name: Name
|
||||
default_tags: Standard Tags
|
||||
default_context_name: Standard Kontext
|
||||
description: Beschreibung
|
||||
|
|
@ -441,7 +438,7 @@ de:
|
|||
added_dependency: "%{dependency} als Abhängigkeit hinzugefügt."
|
||||
no_deferred_actions: Zur Zeit sind keine zurückgestellten Aktionen vorhanden.
|
||||
recurrence_completed: Nach dieser wiederkehrenden Aktion, die du gerade abgeschlossen hast, folgt keine mehr. Die Wiederholung endet hiermit
|
||||
no_actions_found: Keine Aktionen gefunden
|
||||
no_actions_found_title: Keine Aktionen gefunden
|
||||
in_pending_state: und als ausstehend markiert
|
||||
due: Fällig
|
||||
action_marked_complete_error: Die Aktion <strong>'%{description}'</strong> wurde aufgrund eines Fehlers NICHT als <strong>%{completed}</strong> markiert.
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ en:
|
|||
logout: "Logout"
|
||||
cancel: "Cancel"
|
||||
ok: "Ok"
|
||||
add: "Add"
|
||||
project: "Project"
|
||||
projects: "Projects"
|
||||
context: "Context"
|
||||
|
|
@ -65,7 +66,22 @@ en:
|
|||
by_task_count: "By number of tasks"
|
||||
by_task_count_title: "Sort by number of tasks"
|
||||
by_task_count_title_confirm: "Are you sure that you want to sort these projects by the number of tasks? This will replace the existing sort order."
|
||||
drag_handle: "DRAG"
|
||||
drag_handle: DRAG
|
||||
bugs: Bugs
|
||||
forum: Forum
|
||||
wiki: Wiki
|
||||
email: Email
|
||||
website: Website
|
||||
contribute: Contribute
|
||||
first: First
|
||||
second: Second
|
||||
third: Third
|
||||
fourth: Fourth
|
||||
last: Last
|
||||
errors:
|
||||
user_unauthorized: "401 Unauthorized: Only administrative users are allowed access to this function."
|
||||
footer:
|
||||
send_feedback: Send feedback on %{version}
|
||||
contexts:
|
||||
status_hidden: "Context is hidden"
|
||||
status_active: "Context is active"
|
||||
|
|
@ -239,13 +255,24 @@ en:
|
|||
deferred_actions_empty: "There are no deferred actions for this project"
|
||||
completed_actions: "Completed actions for this project"
|
||||
completed_actions_empty: "There are no completed actions for this project"
|
||||
no_actions_in_project: "Currently there are no incomplete actions in this project"
|
||||
actions_in_project_title: "Actions in this project"
|
||||
notes: "Notes"
|
||||
notes_empty: "There are no notes for this project"
|
||||
settings: "Settings"
|
||||
state: "This project is %{state}"
|
||||
this_project: "This project"
|
||||
active_projects: "Active projects"
|
||||
hidden_projects: "Hidden projects"
|
||||
completed_projects: "Completed projects"
|
||||
was_marked_complete: "has been marked as completed"
|
||||
was_marked_hidden: "has been marked as hidden"
|
||||
is_active: "is active"
|
||||
with_no_default_context: "with no default context"
|
||||
with_default_context: "with a default context of '%{context_name}'"
|
||||
with_no_default_tags: "and with no default tags"
|
||||
with_default_tags: "and with '%{tags}' as the default tags"
|
||||
edit_project_settings: "Edit Project Settings"
|
||||
page_title: "TRACKS::Project: %{project}"
|
||||
list_projects: "TRACKS::List Projects"
|
||||
no_default_context: "This project does not have a default context"
|
||||
|
|
@ -397,9 +424,11 @@ en:
|
|||
error_starring: "Could not toggle the star of this todo \'%{description}\'"
|
||||
recurrence_completed: "There is no next action after the recurring action you just finished. The recurrence is completed"
|
||||
tagged_with: "tagged with ‘%{tag_name}’"
|
||||
no_actions_found: "No actions found"
|
||||
no_actions_found_title: "No actions found"
|
||||
no_actions_found: "Currently there are no incomplete actions."
|
||||
no_actions_with: "Currently there are no incomplete actions with the tag '%{tag_name}'"
|
||||
removed_predecessor: "Removed %{successor} as dependency from %{predecessor}."
|
||||
add_another_dependency: "Add another dependency"
|
||||
error_removing_dependency: "There was an error removing the dependency"
|
||||
deferred_actions_with: "Deferred actions with the tag '%{tag_name}'"
|
||||
no_deferred_actions_with: "No deferred actions with the tag '%{tag_name}'"
|
||||
|
|
@ -407,6 +436,8 @@ en:
|
|||
no_completed_actions_with: "No completed actions with the tag '%{tag_name}'"
|
||||
next_action_description: "Next action description"
|
||||
new_related_todo_created: "A new todo was added which belongs to this recurring todo"
|
||||
new_related_todo_created_short: "created a new todo"
|
||||
new_related_todo_not_created_short: "did not create todo"
|
||||
error_completing_todo: "There was an error completing / activating the recurring todo %{description}"
|
||||
recurring_todos: "Recurring todos"
|
||||
no_recurring_todos: "Currently there are no recurring todos"
|
||||
|
|
@ -414,7 +445,9 @@ en:
|
|||
no_completed_recurring: "Currently there are no completed recurring todos"
|
||||
add_new_recurring: "Add a new recurring action"
|
||||
recurring_deleted_success: "The recurring action was deleted succesfully."
|
||||
deleted_success: "The action was deleted succesfully."
|
||||
error_deleting_recurring: "There was an error deleting the recurring todo \'%{description}\'"
|
||||
error_saving_recurring: "There was an error saving the recurring todo \'%{description}\'"
|
||||
error_starring_recurring: "Could not toggle the star of recurring todo \'%{description}\'"
|
||||
recurrence_period: "Recurrence period"
|
||||
action_marked_complete: "The action <strong>'%{description}'</strong> was marked as <strong>%{completed}</strong>"
|
||||
|
|
@ -603,6 +636,4 @@ en:
|
|||
openid_ok_pref_failed: "You have successfully verified %{url} as your identity but there was a problem saving your authentication preferences."
|
||||
auth_type_updated: "Authentication type updated."
|
||||
auth_type_update_error: "There was a problem updating your authentication type: %{error_messages}"
|
||||
new_token_generated: "New token successfully generated"
|
||||
errors:
|
||||
user_unauthorized: "401 Unauthorized: Only administrative users are allowed access to this function."
|
||||
new_token_generated: "New token successfully generated"
|
||||
|
|
@ -23,65 +23,54 @@ nl:
|
|||
|
||||
separator: ","
|
||||
delimiter: .
|
||||
dates:
|
||||
month_names:
|
||||
- Januari
|
||||
- Februari
|
||||
- Maart
|
||||
- April
|
||||
- Mei
|
||||
- Juni
|
||||
- Juli
|
||||
- Augustus
|
||||
- September
|
||||
- Oktober
|
||||
- November
|
||||
- December
|
||||
day_names:
|
||||
- Zondag
|
||||
- Maandag
|
||||
- Dinsdag
|
||||
- Woensdag
|
||||
- Donderdag
|
||||
- Vrijdag
|
||||
- Zaterdag
|
||||
integrations:
|
||||
opensearch_description: Zoek in Tracks
|
||||
gmail_description: Gadget om Tracks toe te voegen aan Gmail als een gadget
|
||||
applescript_next_action_prompt: "Omschrijving van de actie:"
|
||||
applescript_success_after_id: gemaakt
|
||||
applescript_success_before_id: Nieuwe actie met ID
|
||||
applescript_success_after_id: gemaakt
|
||||
common:
|
||||
third: Derde
|
||||
actions: Acties
|
||||
back: Terug
|
||||
add: Toevoegen
|
||||
logout: Log uit
|
||||
go_back: Ga terug
|
||||
second: Tweede
|
||||
none: Geen
|
||||
cancel: Annuleer
|
||||
optional: optioneel
|
||||
notes: Notities
|
||||
server_error: Een fout heeft op de server plaatsgevonden
|
||||
forum: Forum
|
||||
last: Laatste
|
||||
action: Actie
|
||||
projects: Projecten
|
||||
project: Project
|
||||
ok: Ok
|
||||
contribute: Bijdragen
|
||||
first: Eerste
|
||||
website: Website
|
||||
numbered_step: Stap %{number}
|
||||
fourth: Vierde
|
||||
context: Context
|
||||
errors_with_fields: Er waren problemen met de volgende velden
|
||||
drag_handle: SLEEP
|
||||
sort:
|
||||
by_task_count_title: Sorteer op aantal acties
|
||||
by_task_count_title_confirm: Weet u zeker dat u deze projecten alphabetisch wilt sorteren? Dat zal de huidige sorteervolgorde aanpassen.
|
||||
alphabetically: Alphabetisch
|
||||
sort: Sorteer
|
||||
alphabetically_title: Sorteer projecten alphabetisch
|
||||
sort: Sorteer
|
||||
alphabetically_confirm: Weet u zeker dat u deze projecten alphabetisch wilt sorteren? Dat zal de huidige sorteervolgorde aanpassen.
|
||||
by_task_count: Bij aantal acties
|
||||
drag_handle: SLEEP
|
||||
create: Maken
|
||||
description: Beschrijving
|
||||
contexts: Contexten
|
||||
update: Bijwerken
|
||||
wiki: Wiki
|
||||
bugs: Fouten
|
||||
email: E-mail
|
||||
ajaxError: Er is een fout opgetreden bij het ophalen van gegevens van de server
|
||||
search: Zoeken
|
||||
layouts:
|
||||
|
|
@ -98,13 +87,13 @@ nl:
|
|||
contexts: 2-Contexten
|
||||
home: 1-Start
|
||||
navigation:
|
||||
recurring_todos: Terugkerende todos
|
||||
manage_users_title: Toevoegen of verwijderen gebruikers
|
||||
recurring_todos: Terugkerende acties
|
||||
api_docs: REST API Docs
|
||||
feeds: Feeds
|
||||
notes_title: Toon alle notities
|
||||
stats: Statistieken
|
||||
starred: Ster
|
||||
notes_title: Toon alle notities
|
||||
tickler_title: Tickler
|
||||
manage_users: Beheren gebruikers
|
||||
export_title: Import en export van gegevens
|
||||
|
|
@ -112,12 +101,12 @@ nl:
|
|||
preferences: Voorkeuren
|
||||
calendar_title: Kalender met acties met deadline
|
||||
feeds_title: Zie een lijst met beschikbare feeds
|
||||
stats_title: Zie je statistieken
|
||||
home_title: Start
|
||||
starred_title: Zie je ster acties
|
||||
recurring_todos_title: Beheren terugkerende acties
|
||||
tickler: Tickler
|
||||
completed_tasks: Gereed
|
||||
stats_title: Zie je statistieken
|
||||
view: Bekijk
|
||||
organize: Organiseer
|
||||
completed_tasks_title: Afgerond
|
||||
|
|
@ -134,55 +123,52 @@ nl:
|
|||
feed_description: Een overzicht van alle projecten voor %{username}
|
||||
todo:
|
||||
error_date_must_be_future: moet een datum in de toekomst zijn
|
||||
preference:
|
||||
due_styles:
|
||||
- Deadline over ____ dagen
|
||||
- Deadline op ____
|
||||
user:
|
||||
error_context_not_associated: Context %{context} niet geassocieerd met gebruikers %{user}.
|
||||
error_project_not_associated: Project %{project} niet geassocieerd met gebruikers %{user}.
|
||||
preference:
|
||||
due_styles:
|
||||
- "Deadline over ____ dagen"
|
||||
- "Deadline op ____"
|
||||
data:
|
||||
import_successful: De import was succesvol
|
||||
import_errors: Er hebben zich fouten voorgedaan bij de import
|
||||
activerecord:
|
||||
attributes:
|
||||
project:
|
||||
name:
|
||||
blank: Het project moet moet een naam hebben
|
||||
taken: bestaat al
|
||||
too_long: De naam van het project moet korter zijn dan 256 tekens
|
||||
name: Naam
|
||||
default_tags: Standaard Tags
|
||||
default_context_name: Standaard context
|
||||
description: Beschrijving
|
||||
todo:
|
||||
show_from: Tonen vanaf
|
||||
predecessors: Is afhankelijk van
|
||||
predecessors: Afhankelijkheden
|
||||
notes: Notities
|
||||
project: Project
|
||||
context: Context
|
||||
description: Beschrijving
|
||||
due: Deadline
|
||||
preference:
|
||||
show_hidden_projects_in_sidebar: Toon verborgen projecten in sidebar
|
||||
show_hidden_contexts_in_sidebar: Toon verborgen contexten in sidebar
|
||||
date_format: Datum formaat
|
||||
staleness_starts: Begin van markeren openstaande actie
|
||||
sms_context: Standaard context voor email
|
||||
verbose_action_descriptors: Context en project uitschrijven in actielijst
|
||||
mobile_todos_per_page: Acties per pagina (mobiel)
|
||||
show_number_completed: Aantal te tonen afgeronde acties
|
||||
title_date_format: Datum formaat in titel
|
||||
refresh: Ververs interval (in minuten)
|
||||
week_starts: Week start op
|
||||
time_zone: Tijdzone
|
||||
due_style: Deadline stijl
|
||||
locale: Taal
|
||||
sms_email: Van email
|
||||
show_project_on_todo_done: Ga naar project pagina wanneer actie gereed is
|
||||
show_completed_projects_in_sidebar: Toon afgeronde projecten in sidebar
|
||||
user:
|
||||
last_name: Achternaam
|
||||
first_name: Voornaam
|
||||
preference:
|
||||
sms_context: Standaard context voor email
|
||||
mobile_todos_per_page: Acties per pagina (mobiel)
|
||||
refresh: Ververs interval (in minuten)
|
||||
week_starts: Week start op
|
||||
show_project_on_todo_done: Ga naar project pagina wanneer actie gereed is
|
||||
sms_email: Van email
|
||||
time_zone: Tijdzone
|
||||
due_style: Deadline stijl
|
||||
show_completed_projects_in_sidebar: Toon afgeronde projecten in sidebar
|
||||
show_hidden_projects_in_sidebar: Toon verborgen projecten in sidebar
|
||||
show_hidden_contexts_in_sidebar: Toon verborgen contexten in sidebar
|
||||
staleness_starts: Begin van markeren openstaande actie
|
||||
show_number_completed: Aantal te tonen afgeronde acties
|
||||
verbose_action_descriptors: Context en project uitschrijven in actielijst
|
||||
locale: Taal
|
||||
date_format: Datum formaat
|
||||
title_date_format: Datum formaat in titel
|
||||
errors:
|
||||
messages:
|
||||
greater_than_or_equal_to: moet groter of gelijk zijn aan %{count}
|
||||
|
|
@ -216,7 +202,7 @@ nl:
|
|||
body: Er waren problemen met de volgende velden
|
||||
header:
|
||||
one: 1 fout voorkomt het kunnen bewaren van deze %{model}
|
||||
other: "%{count} fout voorkomen dat dit %{model} bewaard kan worden"
|
||||
other: "%{count} fouten voorkomen dat dit %{model} bewaard kan worden"
|
||||
full_messages:
|
||||
format: "%{attribute} %{message}"
|
||||
stats:
|
||||
|
|
@ -237,7 +223,6 @@ nl:
|
|||
weeks: Looptijd van een actie (weken). Klik op een balk voor meer info
|
||||
totals_action_count: u heeft een totaal van %{count} acties
|
||||
totals_deferred_actions: waarvan %{count} uitgestelde acties in de tickler zijn
|
||||
top10_longrunning: Top 10 langstlopende projecten
|
||||
legend:
|
||||
number_of_days: Aantal dagen geleden
|
||||
actions: Acties
|
||||
|
|
@ -246,12 +231,13 @@ nl:
|
|||
running_time: Looptijd van een actie (weken)
|
||||
percentage: Percentage
|
||||
months_ago: Maanden geleden
|
||||
top10_longrunning: Top 10 langstlopende projecten
|
||||
top5_contexts: Top 5 contexten
|
||||
actions_lastyear_title: Acties in de afgelopen 12 maanden
|
||||
totals_actions_completed: "%{count} van deze zijn voltooid."
|
||||
totals_incomplete_actions: U heeft %{count} onvolledige acties
|
||||
totals_unique_tags: Van deze tags zijn %{count} uniek.
|
||||
actions_avg_completed_30days: en voltooide een gemiddelde van %{count} acties per dag.
|
||||
top5_contexts: Top 5 contexten
|
||||
totals_visible_context_count: Van deze zijn %{count} zichtbare contexten
|
||||
totals_blocked_actions: "%{count} zijn afhankelijk van de voltooiing van hun acties."
|
||||
action_completion_time_title: Doorlooptijd (alle voltooide acties)
|
||||
|
|
@ -263,6 +249,7 @@ nl:
|
|||
totals_project_count: U heeft %{count} projecten.
|
||||
tags: Tags
|
||||
actions_min_max_completion_days: De max-/minimum dagen tot voltooiing is %{min}/%{max}.
|
||||
tag_cloud_90days_description: Deze tag cloud bevat tags van acties die zijn gemaakt of voltooid in de afgelopen 90 dagen.
|
||||
running_time_all: Huidige looptijd van alle onvolledige acties
|
||||
totals_tag_count: U heeft %{count} tags geplaatst op acties.
|
||||
time_of_day: Tijd van de dag (alle acties)
|
||||
|
|
@ -272,26 +259,24 @@ nl:
|
|||
top5_visible_contexts_with_incomplete_actions: Top 5 zichtbare contexten met onvolledige acties
|
||||
actions_further: en verder
|
||||
tod30: Tijd van de dag (laatste 30 dagen)
|
||||
tag_cloud_90days_description: Deze tag cloud bevat tags van acties die zijn gemaakt of voltooid in de afgelopen 90 dagen.
|
||||
totals_completed_project_count: en %{count} zijn afgeronde projecten.
|
||||
click_to_return: Klik %{link} om terug te keren naar de statistieken pagina.
|
||||
top10_projects_30days: Top 10 project in de laatste 30 dagen
|
||||
actions_selected_from_week: Gekozen acties van week
|
||||
top10_projects: Top 10 projecten
|
||||
spread_of_running_actions_for_visible_contexts: Verdeling van actieve acties voor zichtbare contexten
|
||||
spread_of_actions_for_all_context: Verdeling van acties voor alle contexten
|
||||
actions_avg_created: In de afgelopen 12 maanden heeft u gemiddeld% {count} acties aangemaakt
|
||||
actions_avg_created: In de afgelopen 12 maanden heeft u gemiddeld%{count} acties aangemaakt
|
||||
click_to_show_actions_from_week: Klik %{link} om de acties van week %{week} en verder te zien.
|
||||
other_actions_label: (anderen)
|
||||
totals_completed_project_count: en %{count} zijn afgeronde projecten.
|
||||
totals: Totalen
|
||||
time_of_day_legend:
|
||||
number_of_actions: Aantal acties
|
||||
time_of_day: Tijd van de dag
|
||||
click_to_return_link: hier
|
||||
totals_hidden_context_count: en %{count} zijn verborgen contexten.
|
||||
actions_avg_completed: en voltooide een gemiddelde van %{count} acties per maand.
|
||||
totals: Totalen
|
||||
no_actions_selected: Er zijn geen acties geselecteerd.
|
||||
click_to_update_actions: Klik op een balk in de grafiek op de acties hieronder aan te passen.
|
||||
labels:
|
||||
month_avg_completed: "%{months} gem afgerond per maand"
|
||||
completed: Afgerond
|
||||
|
|
@ -299,45 +284,47 @@ nl:
|
|||
avg_created: Gem gemaakt
|
||||
avg_completed: Gem afgerond
|
||||
created: Gemaakt
|
||||
click_to_update_actions: Klik op een balk in de grafiek op de acties hieronder aan te passen.
|
||||
running_time_all_legend:
|
||||
actions: Acties
|
||||
running_time: Looptijd van een actie (weken). Klik op een balk voor meer info
|
||||
percentage: Percentage
|
||||
actions_actions_avg_created_30days: In de afgelopen 30 dagen heeft u gemiddeld% {count} acties gemaakt
|
||||
action_selection_title: "TRACKS:: Actie selectie"
|
||||
actions_actions_avg_created_30days: In de afgelopen 30 dagen heeft u gemiddeld %{count} acties gemaakt
|
||||
tod30_legend:
|
||||
number_of_actions: Aantal acties
|
||||
time_of_day: Tijd van de dag
|
||||
action_selection_title: "TRACKS:: Actie selectie"
|
||||
todos:
|
||||
recurring_action_deleted: Actie werd verwijderd. Omdat deze actie herhalend is. werd een nieuwe actie toegevoegd
|
||||
show_from: Toon vanaf
|
||||
error_starring_recurring: Kon niet de ster van deze terugkerende actie niet omgezetten \'%{description}\'
|
||||
recurring_action_deleted: Actie werd verwijderd. Omdat deze actie herhalend is. werd een nieuwe actie toegevoegd
|
||||
completed_actions: Voltooide acties
|
||||
completed_recurring: Afgesloten terugkerende todos
|
||||
added_new_next_action: Nieuwe actie toegevoegd
|
||||
completed_recurring: Afgesloten terugkerende todos
|
||||
blocked_by: Geblokkeerd door %{predecessors}
|
||||
star_action: Markeer deze actie met een ster
|
||||
completed_recurrence_completed: Er is geen actie na de terugkerende actie die u new verwijderd heeft. De herhaling is voltooid
|
||||
defer_date_after_due_date: Uitsteldatum is na de vervaldag. Gelieve vervaldag bewerken alvorens uitstedatuml aan te passen.
|
||||
defer_date_after_due_date: Uitsteldatum is na de vervaldag. Gelieve vervaldag bewerken alvorens uitsteldatum aan te passen.
|
||||
unable_to_add_dependency: Niet in staat om de afhankelijkheid toe te voegen
|
||||
done: Voltooid?
|
||||
star_action_with_description: markeer de actie'%{description}' met een ster
|
||||
star_action_with_description: markeer de actie '%{description}' met een ster
|
||||
tagged_with: gelabeld met ‘%{tag_name}’
|
||||
completed: Afgerond
|
||||
no_deferred_actions_with: Geen uitgestelde acties met de tag '%{tag_name}'
|
||||
no_hidden_actions: Momenteel zijn er geen verborgen acties gevonden
|
||||
action_due_on: (deadline actie op %{date})
|
||||
edit_action_with_description: Bewerk de actie '%{description}'
|
||||
action_due_on: (deadline actie op %{date})
|
||||
archived_tasks_title: "TRACKS:: Gearchiveerde voltooide taken"
|
||||
remove_dependency: Verwijder afhankelijkheid (zal niet de actie zelf verwijderen)
|
||||
list_incomplete_next_actions: Toon onvoltooide acties
|
||||
action_deleted_success: Actie succesvol verwijderd
|
||||
tags: Tags (gescheiden door komma's)
|
||||
new_related_todo_created: Een nieuwe actie is toegevoegd, die behoort bij deze terugkerende todo
|
||||
context_changed: Context veranderd in %{name}
|
||||
action_deleted_success: Actie succesvol verwijderd
|
||||
mobile_todos_page_title: Alle acties
|
||||
new_related_todo_created: Een nieuwe actie is toegevoegd, die behoort bij deze terugkerende todo
|
||||
context_changed: Context veranderd in '%{name}'
|
||||
add_another_dependency: Nog een afhankelijkheid toevoegen
|
||||
delete_recurring_action_title: Verwijder de terugkerende actie
|
||||
removed_predecessor: "%{succesor} is verwijderd als afhankelijkheid van %{predecessor}."
|
||||
removed_predecessor: "'%{successor}' is verwijderd als afhankelijkheid van '%{predecessor}'."
|
||||
recurring_actions_title: TRACKS::Terugkerende acties
|
||||
next_action_needed: U dient ten minste een actie in te vullen
|
||||
action_saved: Actie opgeslagen
|
||||
|
|
@ -346,35 +333,38 @@ nl:
|
|||
edit_action: Actie bewerken
|
||||
added_new_context: Nieuwe context toegevoegd
|
||||
next_actions_description: "Filter:"
|
||||
older_completed_items: Oudere voltooide items
|
||||
list_incomplete_next_actions_with_limit: Toont de laatste %{count} onvoltooide acties
|
||||
set_to_pending: "%{task} als wachtend ingesteld"
|
||||
set_to_pending: "'%{task}' als wachtend ingesteld"
|
||||
added_new_project: Nieuw project toegevoegd
|
||||
next_actions_title_additions:
|
||||
completed: acties voltooid
|
||||
due_today: deadline vandaag
|
||||
due_within_a_week: deadline binnen een week
|
||||
older_completed_items: Oudere voltooide items
|
||||
task_list_title: TRACKS::Toon acties
|
||||
append_in_this_project: in dit project
|
||||
error_deleting_item: Er is een fout opgetreden bij het verwijderen van het item '%{description}'
|
||||
task_list_title: TRACKS::Toon acties
|
||||
no_actions_due_this_week: Geen acties met deadline in rest van deze week
|
||||
no_recurring_todos: Momenteel zijn er geen terugkerende acties
|
||||
error_completing_todo: Er was een fout bij het voltooien / activeren van de terugkerende actie '%{description}'
|
||||
convert_to_project: Maak project
|
||||
no_deferred_pending_actions: Momenteel zijn er geen uitgestelde of in wachtende acties
|
||||
completed_last_day: Voltooid in de laatste 24 uur
|
||||
no_deferred_pending_actions: Momenteel zijn er geen uitgestelde of wachtende acties
|
||||
delete_recurring_action_confirm: Weet u zeker dat u wilt de terugkerende actie '%{description}' wilt verwijderen?
|
||||
show_in_days: Toon over %{days} dagen
|
||||
completed_last_day: Voltooid in de laatste 24 uur
|
||||
error_saving_recurring: Er is een fout opgetreden het opslaan van de terugkerende actie '%{description}'
|
||||
no_project: -- Geen project --
|
||||
show_in_days: Toon over %{days} dagen
|
||||
completed_more_than_x_days_ago: Voltooid meer dan %{count} dagen geleden
|
||||
new_related_todo_created_short: een nieuwe actie gemaakt
|
||||
feed_title_in_context: in context '%{context}'
|
||||
older_than_days: Ouder dan %{count} dagen
|
||||
edit: Bewerken
|
||||
pending: Wachtend
|
||||
completed_actions_with: Afgeronde acties met de tag %{tag_name}
|
||||
clear_due_date: Maak deadline leeg
|
||||
deleted_success: De actie werd met succes verwijderd.
|
||||
completed_tasks_title: TRACKS::Voltooide taken
|
||||
feed_title_in_project: In het project '%{project}'
|
||||
clear_due_date: Maak deadline leeg
|
||||
error_removing_dependency: Er is een fout opgetreden het verwijderen van de afhankelijke actie
|
||||
hidden_actions: Verborgen acties
|
||||
was_due_on_date: had deadline op %{date}
|
||||
|
|
@ -391,14 +381,15 @@ nl:
|
|||
calendar_page_title: TRACKS::Agenda
|
||||
in_hidden_state: in verborgen toestand
|
||||
show_today: Toon vandaag
|
||||
no_actions_found_title: Geen acties gevonden
|
||||
completed_last_x_days: Voltooid in de laatste %{count} dagen
|
||||
no_actions_with: Momenteel zijn er geen onvoltooide acties met de tag '%{tag_name}'
|
||||
defer_x_days:
|
||||
one: Een dag uitstellen
|
||||
other: "%{count} dagen uitstellen"
|
||||
no_actions_with: Momenteel zijn er geen onvoltooide acties met de tag '%{tag_name}'
|
||||
added_new_next_action_singular: Nieuwe actie toegevoegd
|
||||
no_completed_actions: Momenteel zijn er geen voltooide acties.
|
||||
deferred_pending_actions: Uitgestelde/wachtende van acties
|
||||
deferred_pending_actions: Uitgestelde/wachtende acties
|
||||
has_x_pending:
|
||||
one: Heeft een wachtende actie
|
||||
other: Heeft %{count} wachtende acties
|
||||
|
|
@ -419,6 +410,7 @@ nl:
|
|||
one: U heeft een actie tot nu toe vandaag voltooid.
|
||||
other: U heeft %{count} acties tot nu toe vandaag voltooid.
|
||||
added_new_next_action_plural: Nieuwe acties toegevoegd
|
||||
new_related_todo_not_created_short: een nieuwe actie is niet gemaakt
|
||||
error_starring: Kon niet de ster van deze actie niet omzetten \'%{description}\'
|
||||
show_tomorrow: Toon morgen
|
||||
calendar:
|
||||
|
|
@ -433,9 +425,9 @@ nl:
|
|||
due_this_month: Deadline in rest van %{month}
|
||||
no_actions_due_this_month: Geen acties met deadline in de rest van deze maand
|
||||
recurrence:
|
||||
ends_on_number_times: Eindigt na %{number} keer
|
||||
ends_on_date: Eindigt op %{date}
|
||||
every_work_day: Elke werkdag
|
||||
ends_on_number_times: Eindigt na %{number} keer
|
||||
recurrence_on_due_date: de datum dat deadline van de actie is
|
||||
weekly_options: Instellingen voor de wekelijkse terugkerende acties
|
||||
monthly_options: Instellingen voor maandelijks terugkerende acties
|
||||
|
|
@ -443,43 +435,43 @@ nl:
|
|||
monthly: Maandelijks
|
||||
starts_on: Begint op
|
||||
daily_options: Instellingen voor dagelijks terugkerende acties
|
||||
daily: Dagelijks
|
||||
show_option_always: altijd
|
||||
daily: Dagelijks
|
||||
yearly_every_x_day: Elke %{month} %{day}
|
||||
recurrence_on_options: Stel herhaling in op
|
||||
daily_every_number_day: Elke %{number} dag(en)
|
||||
ends_on: Eindigt op
|
||||
weekly_every_number_week: Herhaalt elke %{number} weken op
|
||||
ends_on: Eindigt op
|
||||
show_options: Toon de actie
|
||||
yearly_options: Instellingen voor jaarlijks terugkerende acties
|
||||
yearly_every_xth_day: De %{day} %{day_of_week} van %{month}
|
||||
show_days_before: "%{days} dagen v\xC3\xB3\xC3\xB3r de deadline van actie"
|
||||
yearly_every_xth_day: De %{day} %{day_of_week} van %{month}
|
||||
from_tickler: de datum dat de actie uit de tickler komt (geen deadline ingesteld)
|
||||
no_end_date: Geen einddatum
|
||||
day_x_on_every_x_month: Dag %{dag} op elke %{month} maand
|
||||
day_x_on_every_x_month: Dag %{day} op elke %{month} maand
|
||||
yearly: Jaarlijks
|
||||
monthly_every_xth_day: De %{dag} %{day_of_week} van elke %{month} maand
|
||||
monthly_every_xth_day: De %{day} %{day_of_week} van elke %{month} maand
|
||||
tagged_page_title: TRACKS::Tagged met '%{tag_name}'
|
||||
no_completed_recurring: Momenteel zijn er geen voltooide terugkerende acties
|
||||
added_dependency: "%{dependency} als afhankelijkheid toegevoegd."
|
||||
no_deferred_actions: Momenteel zijn er geen uitgestelde acties.
|
||||
recurrence_completed: Er is geen volgende actie na de terugkerende actie die u zojuist hebt voltooid. De herhaling is voltooid
|
||||
no_actions_found: Geen acties gevonden
|
||||
no_actions_found: Momenteel zijn er geen onafgeronde acties.
|
||||
in_pending_state: in wachtende toestand
|
||||
due: Deadline
|
||||
action_marked_complete_error: De actie <strong>'%{description}'</strong> is niet gemarkeerd als <strong>%{completed} vanwege een fout op de server.</strong>
|
||||
add_new_recurring: Voeg een nieuwe terugkerende actie toe
|
||||
next_actions_description_additions:
|
||||
completed: in de afgelopen %{count} dagen
|
||||
due_date: met een deadline %{due_date} of eerder
|
||||
depends_on_separate_with_commas: Afhankelijk van (gescheiden door komma's)
|
||||
recurring_action_saved: Terugkerende actie opgeslagen
|
||||
action_saved_to_tickler: Actie opgeslagen in tickler
|
||||
recurring_action_saved: Terugkerende actie opgeslagen
|
||||
completed_in_archive:
|
||||
one: Er is een voltooide actie in het archief.
|
||||
other: Er zijn %{count} afgeronde acties in het archief.
|
||||
to_tickler: naar tickler
|
||||
next_actions_description_additions:
|
||||
completed: in de afgelopen %{count} dagen
|
||||
due_date: met een deadline %{due_date} of eerder
|
||||
overdue: Achterstallig
|
||||
add_new_recurring: Voeg een nieuwe terugkerende actie toe
|
||||
no_incomplete_actions: Er zijn geen onvoltooide acties
|
||||
notes:
|
||||
delete_note_title: Verwijder de notitie '%{id}'
|
||||
|
|
@ -490,8 +482,8 @@ nl:
|
|||
show_note_title: Toon notitie
|
||||
note_location_link: "In:"
|
||||
edit_item_title: Item bewerken
|
||||
no_notes_available: "Momenteel zijn er geen notities: voeg notities toe aan projecten vanaf de individuele project pagina's."
|
||||
note_header: Notitie %{id}
|
||||
no_notes_available: "Momenteel zijn er geen notities: voeg notities toe aan projecten vanaf de individuele project pagina's."
|
||||
delete_note_confirm: Weet u zeker dat u de notitie '%{id}' wilt verwijderen?
|
||||
errors:
|
||||
user_unauthorized: "401 Unauthorized: Alleen administratieve gebruikers mogen deze functie gebruiken."
|
||||
|
|
@ -513,8 +505,8 @@ nl:
|
|||
long: "%A, %d. %B %Y, %H:%M"
|
||||
pm: middag
|
||||
preferences:
|
||||
open_id_url: Uw OpenID URL is
|
||||
staleness_starts_after: Ophopen begint na %{days} dagen
|
||||
open_id_url: Uw OpenID URL is
|
||||
change_identity_url: Verander uw Identity URL
|
||||
page_title: "TRACKS:: Voorkeuren"
|
||||
change_password: Wijzig uw wachtwoord
|
||||
|
|
@ -526,54 +518,65 @@ nl:
|
|||
generate_new_token: Genereer een nieuwe token
|
||||
sms_context_none: Geen
|
||||
token_header: Uw token
|
||||
change_authentication_type: Verander uw authenticatietype
|
||||
authentication_header: Uw authenticatie
|
||||
current_authentication_type: Uw authenticatietype is %{auth_type}
|
||||
change_authentication_type: Verander uw authenticatietype
|
||||
generate_new_token_confirm: Weet u dit zeker? Het genereren van een nieuw token zal de bestaande te vervangen en dit zal het extern gebruiken van de oude token laten mislukken.
|
||||
projects:
|
||||
no_actions_in_project: Momenteel zijn er geen onafgeronde acties in dit project
|
||||
default_tags_removed_notice: De standaard tags zijn verwijderd
|
||||
was_marked_hidden: is gemarkeerd als verborgen
|
||||
default_context_set: Stel project standaard context in op %{default_context}
|
||||
deferred_actions: Uitgestelde acties voor dit project
|
||||
edit_project_title: Bewerk project
|
||||
default_tags_removed_notice: De standaard tags zijn verwijderd
|
||||
page_title: "TRACKS:: Project: %{project}"
|
||||
hide_form: Verberg formulier
|
||||
deferred_actions_empty: Er zijn geen uitgestelde acties voor dit project
|
||||
project_state: Project is %{state}.
|
||||
show_form_title: Maak een nieuw project
|
||||
to_new_project_page: Ga naar de nieuwe projectpagina
|
||||
this_project: Dit project
|
||||
no_notes_attached: Momenteel zijn er geen notities toegevoegd aan dit project
|
||||
notes: Notities
|
||||
todos_append: in dit project
|
||||
notes_empty: Er zijn geen notities voor dit project
|
||||
no_projects: Momenteel zijn er geen projecten
|
||||
hide_form_title: Verberg nieuw project formulier
|
||||
completed_actions_empty: Er zijn nog geen afgeronde acties voor dit project
|
||||
delete_project: Project verwijderen
|
||||
with_no_default_context: zonder standaard context
|
||||
completed_actions_empty: Er zijn nog geen afgeronde acties voor dit project
|
||||
actions_in_project_title: Acties in dit project
|
||||
with_default_context: met een standaard context '%{context_name}'
|
||||
show_form: Toevoegen van een project
|
||||
delete_project_confirmation: Weet u zeker dat u wilt het project '%{naam} wilt verwijderen?
|
||||
delete_project_confirmation: Weet u zeker dat u wilt het project '%{name} wilt verwijderen?
|
||||
with_default_tags: en met '%{tags}' als de standaard tags
|
||||
set_default_tags_notice: Stel project standaard tags in op %{default_tags}
|
||||
add_note: Een notitie toevoegen
|
||||
project_saved_status: Project opgeslagen
|
||||
settings: Instellingen
|
||||
completed_projects: Voltooide projecten
|
||||
list_projects: "TRACKS:: Overizcht van projecten"
|
||||
list_projects: "TRACKS:: Overzicht van projecten"
|
||||
is_active: is actief
|
||||
add_project: Voeg project toe
|
||||
hidden_projects: Verborgen projecten
|
||||
delete_project_title: Verwijder het project
|
||||
hidden_projects: Verborgen projecten
|
||||
default_context_removed: Standaard context verwijderd
|
||||
completed_actions: Afgeronde acties voor dit project
|
||||
add_note_submit: Notitie toevoegen
|
||||
was_marked_complete: is gemarkeerd als voltooid
|
||||
default_context: De standaard context voor dit project is %{context}
|
||||
status_project_name_changed: Naam van het project werd gewijzigd
|
||||
no_default_context: Dit project heeft geen standaard context
|
||||
with_no_default_tags: en zonder standaard tags
|
||||
edit_project_settings: Bewerk project instellingen
|
||||
active_projects: Actieve projecten
|
||||
state: Dit project is %{state}
|
||||
default_context: De standaard context voor dit project is %{context}
|
||||
date:
|
||||
month_names:
|
||||
-
|
||||
date:
|
||||
month_names:
|
||||
-
|
||||
- Januari
|
||||
- Februari
|
||||
- Maar
|
||||
- Maart
|
||||
- April
|
||||
- Mei
|
||||
- Juni
|
||||
|
|
@ -583,11 +586,7 @@ nl:
|
|||
- Oktober
|
||||
- November
|
||||
- December
|
||||
order:
|
||||
- :day
|
||||
- :month
|
||||
- :year
|
||||
abbr_day_names:
|
||||
abbr_day_names:
|
||||
- Zo
|
||||
- Ma
|
||||
- Di
|
||||
|
|
@ -595,12 +594,16 @@ nl:
|
|||
- Do
|
||||
- Vr
|
||||
- Za
|
||||
formats:
|
||||
order:
|
||||
- :day
|
||||
- :month
|
||||
- :year
|
||||
formats:
|
||||
only_day: "%e"
|
||||
default: "%d-%m-%Y"
|
||||
short: "%e %b"
|
||||
long: "%e %B %Y"
|
||||
day_names:
|
||||
day_names:
|
||||
- Zondag
|
||||
- Maandag
|
||||
- Dinsdag
|
||||
|
|
@ -608,8 +611,8 @@ nl:
|
|||
- Donderdag
|
||||
- Vrijdag
|
||||
- Zaterdag
|
||||
abbr_month_names:
|
||||
-
|
||||
abbr_month_names:
|
||||
-
|
||||
- Jan
|
||||
- Feb
|
||||
- Maa
|
||||
|
|
@ -629,12 +632,14 @@ nl:
|
|||
two_words_connector: en
|
||||
select:
|
||||
prompt: Selecteer
|
||||
footer:
|
||||
send_feedback: Stuur reactie op %{version}
|
||||
shared:
|
||||
multiple_next_actions: Meerdere acties (een op elke regel)
|
||||
toggle_single: Voeg een actie toe
|
||||
hide_form: Verberg formulier
|
||||
add_actions: Toevoegen acties
|
||||
add_action: Actie toevoegen
|
||||
add_actions: Toevoegen acties
|
||||
tags_for_all_actions: Tags voor alle acties (scheiden met een komma)
|
||||
toggle_multi: Voeg meerdere acties toe
|
||||
toggle_single_title: Voeg een nieuwe actie toe
|
||||
|
|
@ -643,14 +648,43 @@ nl:
|
|||
separate_tags_with_commas: gescheiden door komma's
|
||||
toggle_multi_title: Toggle single / multi actie formulier
|
||||
hide_action_form_title: Verberg nieuwe actie formulier
|
||||
dates:
|
||||
month_names:
|
||||
- Januari
|
||||
- Februari
|
||||
- Maart
|
||||
- April
|
||||
- Mei
|
||||
- Juni
|
||||
- Juli
|
||||
- Augustus
|
||||
- September
|
||||
- Oktober
|
||||
- November
|
||||
- December
|
||||
day_names:
|
||||
- Zondag
|
||||
- Maandag
|
||||
- Dinsdag
|
||||
- Woensdag
|
||||
- Donderdag
|
||||
- Vrijdag
|
||||
- Zaterdag
|
||||
sidebar:
|
||||
list_name_active_contexts: Actieve contexten
|
||||
list_name_active_projects: Actieve projecten
|
||||
list_empty: Geen
|
||||
list_name_completed_projects: Voltooide projecten
|
||||
list_name_hidden_projects: Verborgen projecten
|
||||
list_name_hidden_contexts: Verborgen contexten
|
||||
users:
|
||||
openid_url_verified: Je hebt %{url} met succes geverifieerd als je identiteit en uw authenticatie type OpenID opgeslagen.
|
||||
destroy_successful: Gebruiker %{login} met succes verwijderd
|
||||
auth_type_update_error: "Er was een probleem met het bijwerken van uw authenticatietype: %{error_messages}"
|
||||
total_contexts: Totaal aantal contexten
|
||||
first_user_heading: "Welkom bij TRACKS. Om te beginnen, maak dan een admin account:"
|
||||
successfully_deleted_user: Succesvol gebruiker %{username} verwijderd
|
||||
failed_to_delete_user: Mislukt de gebruiker %{username} te verwijderen
|
||||
openid_url_verified: Je hebt %{url} met succes geverifieerd als je identiteit en uw authenticatie type OpenID opgeslagen.
|
||||
destroy_successful: Gebruiker %{login} met succes verwijderd
|
||||
total_projects: Totaal aantal projecten
|
||||
signup_successful: Aanmelding succesvol voor gebruiker %{username}.
|
||||
new_token_generated: Nieuwe token met succes gegenereerd
|
||||
|
|
@ -658,20 +692,20 @@ nl:
|
|||
user_created: Gebruiker aangemaakt.
|
||||
change_password_submit: Wachtwoord wijzigen
|
||||
account_signup: Aanmelden voor een account
|
||||
manage_users: Beheren gebruikers
|
||||
password_updated: Wachtwoord bijgewerkt.
|
||||
manage_users: Beheren gebruikers
|
||||
signup: Aanmelden
|
||||
confirm_password: Bevestig wachtwoord
|
||||
new_user_heading: "Registreer een nieuwe gebruiker:"
|
||||
auth_type_updated: Authenticatietype bijgewerkt.
|
||||
total_actions: Totaal aanal acties
|
||||
desired_login: Gewenste login
|
||||
confirm_password: Bevestig wachtwoord
|
||||
new_user_heading: "Registreer een nieuwe gebruiker:"
|
||||
change_password_title: TRACKS::Wachtwoord wijzigen
|
||||
change_auth_type_title: TRACKS::Wijzig authenticatietype
|
||||
change_password_prompt: Voer uw nieuwe wachtwoord in de onderstaande velden in en kies 'Wachtwoord wijzigen' om uw huidige wachtwoord met uw nieuwe te vervangen.
|
||||
password_confirmation_label: Bevestig wachtwoord
|
||||
destroy_error: Er is een fout opgetreden bij het verwijderen van de gebruiker '%{login}'
|
||||
choose_password: Kies een wachtwoord
|
||||
change_password_title: TRACKS::Wachtwoord wijzigen
|
||||
change_auth_type_title: TRACKS::Wijzig authenticatietype
|
||||
change_password_prompt: Voer uw nieuwe wachtwoord in de onderstaande velden in en kies 'Wachtwoord wijzigen' om uw huidige wachtwoord met uw nieuwe te vervangen.
|
||||
label_auth_type: Authenticatietype
|
||||
new_password_label: Nieuw wachtwoord
|
||||
register_with_cas: Met uw CAS gebruikersnaam
|
||||
|
|
@ -680,43 +714,12 @@ nl:
|
|||
new_user_title: "TRACKS:: Aanmelden als de admin gebruiker"
|
||||
destroy_confirmation: "Waarschuwing: dit zal de gebruiker '%{login} verwijderen met al zijn acties, contexten, projecten en notities. Weet u zeker dat u wilt doorgaan?"
|
||||
signup_new_user: Registreer nieuwe gebruiker
|
||||
identity_url: Identiteit URL
|
||||
openid_ok_pref_failed: Je hebt succesvol de %{url} geverifieerd als je identiteit, maar er was een probleem met het opslaan van uw authenticatie voorkeuren.
|
||||
auth_change_submit: Wijzigen authenticatietype
|
||||
change_authentication_type: Wijzigen authenticatietype
|
||||
select_authentication_type: Selecteer uw nieuwe authenticatie type en klik op 'Wijzigen authenticatietype' om uw huidige instellingen te vervangen.
|
||||
identity_url: Identiteit URL
|
||||
auth_change_submit: Wijzigen authenticatietype
|
||||
openid_ok_pref_failed: Je hebt succesvol de %{url} geverifieerd als je identiteit, maar er was een probleem met het opslaan van uw authenticatie voorkeuren.
|
||||
total_notes: Totaal aantal notities
|
||||
feedlist:
|
||||
actions_due_today: Acties die vandaag of eerder af moeten
|
||||
choose_context: Kies de context waar je een feed van wilt
|
||||
rss_feed: RSS Feed
|
||||
ical_feed: iCal feed
|
||||
legend: Legenda
|
||||
all_contexts: Alle contexten
|
||||
all_projects: Alle projecten
|
||||
choose_project: Kies het project waar je een feed van wilt
|
||||
active_projects_wo_next: Actieve projecten zonder acties
|
||||
project_needed: "Er moet ten minste \xC3\xA9\xC3\xA9n project zijn voor een feed opgevraagd kan worden"
|
||||
select_feed_for_project: Kies de feed voor dit project
|
||||
active_starred_actions: Alle gesterde, actieve acties
|
||||
context_needed: "Er moet eerst ten minste \xC3\xA9\xC3\xA9n context zijn voor je een feed kan opvragen"
|
||||
select_feed_for_context: Kies de feed voor deze context
|
||||
projects_and_actions: Actieve projecten met hun acties
|
||||
actions_due_next_week: Acties die binnen 7 dagen afgerond moeten
|
||||
notice_incomplete_only: "Merk op: alle feeds laten alleen acties zien die niet afgerond zijn, tenzij anders vermeld."
|
||||
last_fixed_number: Laatste %{number} acties
|
||||
all_actions: Alle acties
|
||||
actions_completed_last_week: Acties afgerond in de afgelopen 7 dagen
|
||||
context_centric_actions: Feeds voor onafgeronde acties in een specifieke context
|
||||
plain_text_feed: Reguliere tekst feed
|
||||
project_centric: Feeds voor onafgeronde acties in een specifiek project
|
||||
sidebar:
|
||||
list_name_active_contexts: Actieve contexten
|
||||
list_name_active_projects: Actieve projecten
|
||||
list_empty: Geen
|
||||
list_name_completed_projects: Voltooide projecten
|
||||
list_name_hidden_projects: Verborgen projecten
|
||||
list_name_hidden_contexts: Verborgen contexten
|
||||
select_authentication_type: Selecteer uw nieuwe authenticatie type en klik op 'Wijzigen authenticatietype' om uw huidige instellingen te vervangen.
|
||||
contexts:
|
||||
delete_context_title: Verwijder context
|
||||
hide_form: Verberg formulier
|
||||
|
|
@ -728,20 +731,44 @@ nl:
|
|||
hidden_contexts: Verborgen contexten
|
||||
no_contexts_active: Momenteel zijn er geen actieve contexten
|
||||
context_hide: Verberg van de start pagina?
|
||||
visible_contexts: Zichtbare contexten
|
||||
save_status_message: Context bewaard
|
||||
show_form: Maak een nieuwe context
|
||||
add_context: Context toevoegen
|
||||
visible_contexts: Zichtbare contexten
|
||||
update_status_message: Naam van de context was veranderd
|
||||
context_name: Context naam
|
||||
new_context_post: "' zal ook gemaakt worden. Weet u dit zeker?"
|
||||
update_status_message: Naam van de context was veranderd
|
||||
status_active: Context is actief
|
||||
new_context_post: "' zal ook gemaakt worden. Weet u dit zeker?"
|
||||
context_deleted: De context '%{name}' is verwijderd
|
||||
no_contexts_hidden: Momenteel zijn er geen verborgen contexten
|
||||
new_context_pre: Nieuwe context '
|
||||
no_actions: Momenteel zijn er geen onafgeronde acties in deze context
|
||||
last_completed_in_context: in deze context (laatste %{number})
|
||||
context_deleted: De context '%{name}' is verwijderd
|
||||
no_contexts_hidden: Momenteel zijn er geen verborgen contexten
|
||||
status_hidden: Context is verborgen
|
||||
feedlist:
|
||||
actions_due_today: Acties die vandaag of eerder af moeten
|
||||
choose_context: Kies de context waar je een feed van wilt
|
||||
ical_feed: iCal feed
|
||||
all_contexts: Alle contexten
|
||||
rss_feed: RSS Feed
|
||||
legend: Legenda
|
||||
all_projects: Alle projecten
|
||||
choose_project: Kies het project waar je een feed van wilt
|
||||
project_needed: "Er moet ten minste \xC3\xA9\xC3\xA9n project zijn voor een feed opgevraagd kan worden"
|
||||
select_feed_for_project: Kies de feed voor dit project
|
||||
active_projects_wo_next: Actieve projecten zonder acties
|
||||
active_starred_actions: Alle gesterde, actieve acties
|
||||
context_needed: "Er moet eerst ten minste \xC3\xA9\xC3\xA9n context zijn voor je een feed kan opvragen"
|
||||
select_feed_for_context: Kies de feed voor deze context
|
||||
projects_and_actions: Actieve projecten met hun acties
|
||||
actions_due_next_week: Acties die binnen 7 dagen afgerond moeten
|
||||
notice_incomplete_only: "Merk op: alle feeds laten alleen acties zien die niet afgerond zijn, tenzij anders vermeld."
|
||||
context_centric_actions: Feeds voor onafgeronde acties in een specifieke context
|
||||
plain_text_feed: Reguliere tekst feed
|
||||
last_fixed_number: Laatste %{number} acties
|
||||
all_actions: Alle acties
|
||||
actions_completed_last_week: Acties afgerond in de afgelopen 7 dagen
|
||||
project_centric: Feeds voor onafgeronde acties in een specifiek project
|
||||
datetime:
|
||||
prompts:
|
||||
minute: Minuut
|
||||
|
|
@ -788,34 +815,34 @@ nl:
|
|||
other: over %{count} jaren
|
||||
half_a_minute: halve minuut
|
||||
login:
|
||||
sign_in: Meld aan
|
||||
openid_identity_url_not_found: Sorry, geen gebruiker met die identiteit URL bestaat (% {identity_url})
|
||||
login_cas: Ga naar het CAS
|
||||
user_no_expiry: Blijf ingelogd
|
||||
cas_logged_in_greeting: Hallo, % {username}! U bent geauthenticeerd.
|
||||
cas_no_user_found: Hallo,% {username}! Je hebt nog geen account op Tracks.
|
||||
cas_login: CAS Inloggen
|
||||
login_cas: Ga naar het CAS
|
||||
sign_in: Meld aan
|
||||
openid_identity_url_not_found: Sorry, geen gebruiker met die identiteit URL bestaat (%{identity_url})
|
||||
successful_with_session_info: "Login succesvol:"
|
||||
please_login: Log in om Tracks te gebruiken
|
||||
cas_username_not_found: Sorry, geen gebruiker met die CAS gebruikersnaam bestaat (% {username})
|
||||
cas_create_account: Als u willen vragen ga hier om %{signup_link}
|
||||
cas_logged_in_greeting: Hallo, %{username}! U bent geauthenticeerd.
|
||||
cas_no_user_found: Hallo,%{username}! Je hebt nog geen account op Tracks.
|
||||
cas_login: CAS Inloggen
|
||||
cas_username_not_found: Sorry, geen gebruiker met die CAS gebruikersnaam bestaat (%{username})
|
||||
mobile_use_openid: ... if inloggen met een OpenID
|
||||
cas_create_account: Als u willen vragen ga hier om %{signup_link}
|
||||
account_login: Account login
|
||||
cas_signup_link: Aanvragen account
|
||||
successful: Succesvol aangemeld. Welkom terug!
|
||||
session_will_not_expire: sessie zal niet verlopen.
|
||||
session_time_out: Sessie is verlopen. Gelieve % {link}
|
||||
successful: Succesvol aangemeld. Welkom terug!
|
||||
session_will_expire: sessie zal verlopen na %{hours} u(u)r(en) van inactiviteit.
|
||||
option_separator: of,
|
||||
session_time_out: Sessie is verlopen. Gelieve %{link}
|
||||
login_standard: Ga terug naar de standaard login
|
||||
log_in_again: opnieuw in te loggen.
|
||||
logged_out: Je bent afgemeld bij Tracks.
|
||||
login_with_openid: inloggen met een OpenID
|
||||
unsuccessful: Login mislukt.
|
||||
log_in_again: log opnieuw in.
|
||||
logged_out: Je bent afgemeld bij Tracks.
|
||||
search:
|
||||
contexts_matching_query: Contexten passend bij zoekopdracht
|
||||
tags_matching_query: Tags passend bij zoekopdracht
|
||||
no_results: Uw zoekopdracht heeft geen resultaten opgeleverd.
|
||||
todos_matching_query: Todos passend bij zoekopdracht
|
||||
projects_matching_query: Projecten passend bij zoekopdracht
|
||||
notes_matching_query: Notities passend bij zoekopdracht
|
||||
no_results: Uw zoekopdracht heeft geen resultaten opgeleverd.
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1,57 +0,0 @@
|
|||
-- Dump of table contents
|
||||
-- Sample data to populate your database
|
||||
-- No data is included for users: create your own users via the http://YOURURL/signup page
|
||||
|
||||
-- Dump of table contexts
|
||||
-- ------------------------------------------------------------
|
||||
|
||||
INSERT INTO "contexts" VALUES(1,'agenda',1,'f',1,'2008-02-25 20:21:09','2008-03-24 19:23:53');
|
||||
INSERT INTO "contexts" VALUES(2,'call',2,'f',1,'2008-02-25 20:21:09','2008-03-24 19:23:53');
|
||||
INSERT INTO "contexts" VALUES(3,'email',3,'f',1,'2008-02-25 20:21:09','2008-03-24 19:23:53');
|
||||
INSERT INTO "contexts" VALUES(4,'errand',4,'f',1,'2008-02-25 20:21:09','2008-03-24 19:23:53');
|
||||
INSERT INTO "contexts" VALUES(5,'lab',5,'f',1,'2008-02-25 20:21:09','2008-03-24 19:23:53');
|
||||
INSERT INTO "contexts" VALUES(6,'library',6,'f',1,'2008-02-25 20:21:09','2008-03-24 19:23:53');
|
||||
INSERT INTO "contexts" VALUES(7,'freetime',7,'f',1,'2008-02-25 20:21:09','2008-03-24 19:23:53');
|
||||
INSERT INTO "contexts" VALUES(8,'office',8,'f',1,'2008-02-25 20:21:09','2008-03-24 19:23:53');
|
||||
INSERT INTO "contexts" VALUES(9,'waiting for',9,'f',1,'2008-02-25 20:21:09','2008-03-24 19:23:53');
|
||||
|
||||
-- Dump of table notes
|
||||
-- ------------------------------------------------------------
|
||||
|
||||
INSERT INTO "notes" VALUES(1,1,1,'Need to collect a catalogue from Time Machines R Us','2006-06-10 14:36:02','2006-06-10 14:36:02');
|
||||
INSERT INTO "notes" VALUES(2,1,1,'Should I go for a swirly effect or a whooshy one?','2006-06-10 14:36:02','2006-06-10 14:36:02');
|
||||
|
||||
|
||||
-- Dump of table projects
|
||||
-- ------------------------------------------------------------
|
||||
|
||||
INSERT INTO "projects" VALUES(1,'Build a working time machine',1,1,'','active','2008-02-25 20:21:09','2008-03-24 19:23:53',NULL,NULL);
|
||||
INSERT INTO "projects" VALUES(2,'Make more money than Billy Gates',2,1,'','active','2008-02-25 20:21:09','2008-03-24 19:23:53',NULL,NULL);
|
||||
INSERT INTO "projects" VALUES(3,'Evict dinosaurs from the garden',3,1,'','active','2008-02-25 20:21:09','2008-03-24 19:23:53',NULL,NULL);
|
||||
|
||||
|
||||
-- Dump of table schema_info
|
||||
-- ------------------------------------------------------------
|
||||
|
||||
INSERT INTO "schema_migrations" VALUES('44');
|
||||
|
||||
|
||||
-- Dump of table todos
|
||||
-- ------------------------------------------------------------
|
||||
|
||||
INSERT INTO "todos" VALUES(1,1,2,'Call Bill Gates to find out how much he makes per day',NULL,'2006-06-03 14:36:02','2006-06-23 23:00:00',NULL,1,NULL,'active',NULL,'2006-06-03 14:36:02');
|
||||
INSERT INTO "todos" VALUES(2,2,3,'Call dinosaur exterminator','Ask him if I need to hire a skip for the corpses.','2006-06-10 14:36:02','2006-06-23 23:00:00',NULL,1,NULL,'active',NULL,'2006-06-10 14:36:02');
|
||||
INSERT INTO "todos" VALUES(3,4,NULL,'Buy milk',NULL,'2006-06-10 14:36:02',NULL,NULL,1,NULL,'completed',NULL,'2006-06-10 14:36:02');
|
||||
INSERT INTO "todos" VALUES(4,4,NULL,'Buy bread',NULL,'2006-06-10 14:36:02',NULL,NULL,1,NULL,'completed',NULL,'2006-06-10 14:36:02');
|
||||
INSERT INTO "todos" VALUES(5,5,1,'Construct time dilation device',NULL,'2006-06-10 14:36:02',NULL,NULL,1,NULL,'active',NULL,'2006-06-10 14:36:02');
|
||||
INSERT INTO "todos" VALUES(6,2,1,'Phone Grandfather to ask about the paradox','Added some _notes_.','2006-06-10 14:36:02','2006-06-02 23:00:00',NULL,1,NULL,'active',NULL,'2006-06-10 14:36:02');
|
||||
INSERT INTO "todos" VALUES(7,6,3,'Get a book out of the library','Dinosaurs''R','2006-06-10 14:36:02',NULL,NULL,1,NULL,'active',NULL,'2006-06-10 14:36:02');
|
||||
INSERT INTO "todos" VALUES(8,4,NULL,'Upgrade to Rails 0.9.1',NULL,'2006-06-10 14:36:02','2006-06-09 23:00:00',NULL,1,NULL,'completed',NULL,'2006-06-10 14:36:02');
|
||||
INSERT INTO "todos" VALUES(9,1,NULL,'This should be due today',NULL,'2006-06-10 14:36:02','2006-06-09 23:00:00',NULL,1,NULL,'active',NULL,'2006-06-10 14:36:02');
|
||||
INSERT INTO "todos" VALUES(10,1,NULL,'foo',NULL,'2006-06-10 14:36:02','2005-01-05 00:00:00',NULL,1,NULL,'completed',NULL,'2006-06-10 14:36:02');
|
||||
INSERT INTO "todos" VALUES(11,1,2,'Buy shares',NULL,'2006-06-10 14:36:02','2005-02-01 00:00:00',NULL,1,NULL,'active',NULL,'2006-06-10 14:36:02');
|
||||
INSERT INTO "todos" VALUES(12,1,3,'Buy stegosaurus bait',NULL,'2006-06-10 14:36:02','2006-06-16 23:00:00',NULL,1,NULL,'active',NULL,'2006-06-10 14:36:02');
|
||||
INSERT INTO "todos" VALUES(13,1,3,'New action in context','Some notes','2006-06-10 14:36:02','2006-06-16 23:00:00',NULL,1,NULL,'active',NULL,'2006-06-10 14:36:02');
|
||||
INSERT INTO "todos" VALUES(14,2,2,'Call stock broker','tel: 12345','2006-06-03 14:36:02',NULL,NULL,1,NULL,'active',NULL,'2006-06-03 14:36:02');
|
||||
|
||||
|
||||
|
|
@ -9,16 +9,22 @@
|
|||
* Mailing list: http://lists.rousette.org.uk/mailman/listinfo/tracks-discuss
|
||||
* Original developer: bsag (http://www.rousette.org.uk/)
|
||||
* Contributors: http://getontracks.org/wiki/Contributors
|
||||
* Version: 2.0RC1
|
||||
* Copyright: (cc) 2004-2010 rousette.org.uk.
|
||||
* Version: 2.0devel
|
||||
* Copyright: (cc) 2004-2011 rousette.org.uk.
|
||||
* License: GNU GPL
|
||||
|
||||
== Version 2.0 (RC)
|
||||
|
||||
(RC1 was never release, but was mentioned in the DOCS for while. People are
|
||||
referencing RC1 with bug report. So for the release we've bumped the version
|
||||
to RC2)
|
||||
|
||||
New features:
|
||||
1. Redesign of menus and introduction of a context menu per todo
|
||||
2. You can now set the default tags for a project which are added automatically to a new todo in that project if no tags are supplied
|
||||
3. Tracks now includes support of dependencies. Making an action dependent on another action will hide it until the dependency is completed
|
||||
2. You can now set the default tags for a project which are added automatically
|
||||
to a new todo in that project if no tags are supplied
|
||||
3. Tracks now includes support of dependencies. Making an action dependent on
|
||||
another action will hide it until the dependency is completed
|
||||
4. you can now drag an action from one context to another
|
||||
5. Support for entering multiple actions in one form
|
||||
6. You can now promote an action to a project
|
||||
|
|
@ -26,16 +32,21 @@ New features:
|
|||
8. The project description supports markup
|
||||
9. support for Mail.app (message://) and OneNote (onenote://) links in notes
|
||||
10.The email receiver is now able to receive email from several email adresses.
|
||||
In site.yml this could be set to the previous behavior (receive from one address per user)
|
||||
In site.yml this could be set to the previous behavior (receive from one
|
||||
address per user)
|
||||
11.You can enable open signup (like in tracks.tra.in)
|
||||
12.Cleanup of context page
|
||||
13.Support for CAS for login
|
||||
14.Support for adding Tracks as a GMail Widget with instructions on the Integrations page
|
||||
14.Support for adding Tracks as a GMail Widget with instructions on the
|
||||
Integrations page
|
||||
15.Tracks now support internationalization. First translations are German and
|
||||
Dutch. See http://www.getontracks.org/wiki/Translating-Tracks it you like to
|
||||
help translating Tracks to other languages
|
||||
|
||||
Under the hood
|
||||
1. All js is migrated to jQuery and most ui-widgets are migrated to jQuery-UI
|
||||
2. Cucumber is added for integration testing. The RSpec stories are migrated to cucumber
|
||||
3. Upgraded to rails 2.3.5 (newer versions unfortunately conflict with cucumber)
|
||||
3. Upgraded to rails 2.3.11 and upgraded most gems/plugins
|
||||
3. Bugfixes (lots of them)
|
||||
|
||||
== Version 1.7
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ If you want to run tests using another database, that's fine, too. Just change y
|
|||
|
||||
This testing style is deprecated and are being moved over to Selenium via Cucumber.
|
||||
|
||||
See the wiki for more information to run the tests that are not yet migrated
|
||||
See the wiki for more information to run the tests that are not yet migrated: http://www.getontracks.org/wiki/Testing
|
||||
|
||||
6. RSPEC tests
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
require 'activeresource'
|
||||
|
||||
# WARNING: this is not really maintained or tested...
|
||||
|
||||
# Install the ActiveResource gem if you don't already have it:
|
||||
#
|
||||
# sudo gem install activeresource --source http://gems.rubyonrails.org --include-dependencies
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
Feature: dependencies
|
||||
Feature: Show all due actions in a calendar view
|
||||
As a Tracks user
|
||||
In order to keep overview of my due todos
|
||||
I want to manage due todos in a calendar view
|
||||
|
|
@ -8,12 +8,50 @@ Feature: dependencies
|
|||
| login | password | is_admin |
|
||||
| testuser | secret | false |
|
||||
And I have logged in as "testuser" with password "secret"
|
||||
And I have a context called "@calendar"
|
||||
|
||||
@selenium
|
||||
Scenario: Setting due date of a todo will show it in the calendar
|
||||
Given this is a pending scenario
|
||||
When I submit a new action with description "a new next action" in the context "@calendar"
|
||||
And I go to the calendar page
|
||||
Then the badge should show 0
|
||||
And I should not see "a new next action"
|
||||
When I go to the home page
|
||||
And I edit the due date of "a new next action" to tomorrow
|
||||
And I go to the calendar page
|
||||
Then the badge should show 1
|
||||
And I should see "a new next action"
|
||||
|
||||
@selenium
|
||||
Scenario: Clearing the due date of a todo will remove it from the calendar
|
||||
Given this is a pending scenario
|
||||
When I go to the home page
|
||||
And I submit a new action with description "a new next action" in the context "@calendar"
|
||||
And I edit the due date of "a new next action" to tomorrow
|
||||
And I go to the calendar page
|
||||
Then I should see "a new next action"
|
||||
When I clear the due date of "a new next action"
|
||||
Then I should not see "a new next action"
|
||||
|
||||
@selenium
|
||||
Scenario: Marking a todo complete will remove it from the calendar
|
||||
Given I have a todo "a new next action" in the context "@calendar" which is due tomorrow
|
||||
When I go to the calendar page
|
||||
Then I should see "a new next action"
|
||||
When I clear the due date of "a new next action"
|
||||
Then I should not see "a new next action"
|
||||
|
||||
@selenium
|
||||
Scenario: Deleting a todo complete will remove it from the calendar
|
||||
Given I have a todo "a new next action" in the context "@calendar" which is due tomorrow
|
||||
When I go to the calendar page
|
||||
Then I should see "a new next action"
|
||||
When I delete the action "a new next action"
|
||||
Then I should not see "a new next action"
|
||||
|
||||
@selenium
|
||||
Scenario: Changing due date of a todo will move it in the calendar
|
||||
Given this is a pending scenario
|
||||
Given I have a todo "a new next action" in the context "@calendar" which is due tomorrow
|
||||
When I go to the calendar page
|
||||
Then I should see "a new next action"
|
||||
When I edit the due date of "a new next action" to next month
|
||||
Then I should see "a new next action" in the due next month container
|
||||
|
|
|
|||
|
|
@ -23,22 +23,6 @@ Feature: dependencies
|
|||
When I expand the dependencies of "Todo 2"
|
||||
Then I should see "Todo 3" within the dependencies of "Todo 2"
|
||||
|
||||
@selenium
|
||||
Scenario: Adding dependency with comma to todo # for #975
|
||||
Given I have a context called "@pc"
|
||||
And I have a project "dependencies" that has the following todos
|
||||
| description | context |
|
||||
| test,1, 2,3 | @pc |
|
||||
| test me | @pc |
|
||||
When I visit the "dependencies" project
|
||||
And I drag "test me" to "test,1, 2,3"
|
||||
Then the successors of "test,1, 2,3" should include "test me"
|
||||
When I edit the dependency of "test me" to "'test,1, 2,3' <'@pc'; 'dependencies'>,'test,1, 2,3' <'@pc'; 'dependencies'>"
|
||||
Then there should not be an error
|
||||
|
||||
Scenario: Deleting a predecessor will activate successors
|
||||
Given this is a pending scenario
|
||||
|
||||
@selenium
|
||||
Scenario: I can edit a todo to add the todo as a dependency to another
|
||||
Given I have a context called "@pc"
|
||||
|
|
@ -48,14 +32,14 @@ Feature: dependencies
|
|||
| test 2 | @pc |
|
||||
| test 3 | @pc |
|
||||
When I visit the "dependencies" project
|
||||
When I edit the dependency of "test 1" to "'test 2' <'@pc'; 'dependencies'>"
|
||||
When I edit the dependency of "test 1" to add "test 2" as predecessor
|
||||
Then I should see "test 1" within the dependencies of "test 2"
|
||||
And I should see "test 1" in the deferred container
|
||||
When I edit the dependency of "test 1" to "'test 2' <'@pc'; 'dependencies'>, 'test 3' <'@pc'; 'dependencies'>"
|
||||
When I edit the dependency of "test 1" to add "test 3" as predecessor
|
||||
Then I should see "test 1" within the dependencies of "test 2"
|
||||
Then I should see "test 1" within the dependencies of "test 3"
|
||||
When I edit the dependency of "test 1" to "'test 2' <'@pc'; 'dependencies'>"
|
||||
And I edit the dependency of "test 2" to "'test 3' <'@pc'; 'dependencies'>"
|
||||
When I edit the dependency of "test 1" to remove "test 3" as predecessor
|
||||
And I edit the dependency of "test 2" to add "test 3" as predecessor
|
||||
Then I should see "test 1" within the dependencies of "test 3"
|
||||
Then I should see "test 2" within the dependencies of "test 3"
|
||||
|
||||
|
|
@ -69,12 +53,44 @@ Feature: dependencies
|
|||
And "test 1" depends on "test 2"
|
||||
When I visit the "dependencies" project
|
||||
Then I should see "test 1" in the deferred container
|
||||
When I edit the dependency of "test 1" to ""
|
||||
When I edit the dependency of "test 1" to remove "test 2" as predecessor
|
||||
Then I should not see "test 1" within the dependencies of "test 2"
|
||||
And I should not see "test 1" in the deferred container
|
||||
|
||||
@selenium
|
||||
Scenario: Completing a predecessor will activate successors
|
||||
Given I have a context called "@pc"
|
||||
And I have a project "dependencies" that has the following todos
|
||||
| description | context |
|
||||
| test 1 | @pc |
|
||||
| test 2 | @pc |
|
||||
| test 3 | @pc |
|
||||
And "test 2" depends on "test 1"
|
||||
When I visit the "dependencies" project
|
||||
Then I should see "test 2" in the deferred container
|
||||
And I should see "test 1" in the action container
|
||||
When I mark "test 1" as complete
|
||||
Then I should see "test 1" in the completed container
|
||||
And I should see "test 2" in the action container
|
||||
And I should not see "test 2" in the deferred container
|
||||
And I should see the empty message in the deferred container
|
||||
|
||||
@selenium
|
||||
Scenario: Deleting a predecessor will activate successors
|
||||
Given this is a pending scenario
|
||||
Given I have a context called "@pc"
|
||||
And I have a project "dependencies" that has the following todos
|
||||
| description | context |
|
||||
| test 1 | @pc |
|
||||
| test 2 | @pc |
|
||||
| test 3 | @pc |
|
||||
And "test 2" depends on "test 1"
|
||||
When I visit the "dependencies" project
|
||||
Then I should see "test 2" in the deferred container
|
||||
And I should see "test 1" in the action container
|
||||
When I delete the action "test 1"
|
||||
And I should see "test 2" in the action container
|
||||
And I should not see "test 2" in the deferred container
|
||||
And I should see the empty message in the deferred container
|
||||
|
||||
Scenario: Deleting a successor will update predecessor
|
||||
Given this is a pending scenario
|
||||
Given this is a pending scenario
|
||||
|
|
|
|||
|
|
@ -12,12 +12,12 @@ Feature: Edit a next action from every page
|
|||
Scenario: I can toggle the star of a todo
|
||||
Given this is a pending scenario
|
||||
|
||||
@selenium @wip
|
||||
@selenium
|
||||
Scenario: I can delete a todo
|
||||
Given I have a todo with description "delete me" in the context "@home"
|
||||
Given I have a todo "delete me" in the context "@home"
|
||||
When I go to the home page
|
||||
Then I should see "delete me"
|
||||
And I delete the todo
|
||||
When I delete the action "delete me"
|
||||
Then I should not see "delete me"
|
||||
|
||||
Scenario: Removing the last todo in context will hide context # delete, edit
|
||||
|
|
@ -26,24 +26,25 @@ Feature: Edit a next action from every page
|
|||
Scenario: Deleting the last todo in container will show empty message # only project, context, tag, not todo
|
||||
Given this is a pending scenario
|
||||
|
||||
@selenium @wip
|
||||
@selenium
|
||||
Scenario Outline: I can mark an active todo complete and it will update empty messages
|
||||
Given I have a context called "visible context"
|
||||
And I have a project called "visible project"
|
||||
When I go to the <page>
|
||||
Then I should see "<empty message>"
|
||||
When I submit a new action with description "visible todo" to project "visible project" with tags "test" in the context "visible context"
|
||||
When I submit a new action with description "visible todo" to project "visible project" with tags "starred" in the context "visible context"
|
||||
Then I should see "visible todo"
|
||||
And I should not see "<empty message>"
|
||||
When I mark the todo complete
|
||||
Then I should not see "visible context"
|
||||
When I mark "visible todo" as complete
|
||||
And I should see "<empty message>"
|
||||
And I should see "visible todo" in the completed todos container
|
||||
And I should see "visible todo" in the completed container
|
||||
|
||||
Scenarios:
|
||||
| page | empty message |
|
||||
| tag page for "starred" | No actions found |
|
||||
| home page | No actions found |
|
||||
| context page for "visible context" | Currently there are no deferred or pending actions |
|
||||
| project page for "visible project" | Currently there are no deferred or pending actions |
|
||||
| page | empty message |
|
||||
| "visible project" project | Currently there are no incomplete actions in this project |
|
||||
| home page | Currently there are no incomplete actions |
|
||||
| tag page for "starred" | No actions found |
|
||||
| context page for "visible context" | Currently there are no incomplete actions in this context |
|
||||
|
||||
@selenium @wip
|
||||
Scenario Outline: I can mark a deferred todo complete and it will update empty messages
|
||||
|
|
@ -52,7 +53,7 @@ Feature: Edit a next action from every page
|
|||
When I submit a new deferred action with description "visible todo" to project "visible project" with tags "test" in the context "visible context"
|
||||
Then I should see "visible todo"
|
||||
And I should not see "<empty message>"
|
||||
When I mark the todo complete
|
||||
When I mark "visible todo" complete
|
||||
Then I should not see "visible context"
|
||||
And I should see "<empty message>"
|
||||
And I should see "visible todo" in the completed todos container
|
||||
|
|
@ -63,10 +64,6 @@ Feature: Edit a next action from every page
|
|||
| context page for "visible context" | Currently there are no deferred or pending actions |
|
||||
| project page for "visible project" | Currently there are no deferred or pending actions |
|
||||
|
||||
@selenium @wip
|
||||
Scenario: I can mark a deferred todo complete and it will update empty messages
|
||||
Given this is a pending scenario
|
||||
|
||||
@selenium @wip
|
||||
Scenario Outline: I can mark a completed todo active and it will update empty messages
|
||||
Given I have a completed todo with description "visible todo" to project "visible project" with tags "test" in the context "visible context"
|
||||
|
|
|
|||
36
features/mobile_add_action.feature
Normal file
36
features/mobile_add_action.feature
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
Feature: Add new next action from mobile page
|
||||
In order to be able to add next actions from the mobile interface
|
||||
As a Tracks user
|
||||
I want to to be able to add a new next actions from the mobile interface and prepopulate the context and / or project of the prior page
|
||||
|
||||
Background:
|
||||
Given the following user record
|
||||
| login | password | is_admin |
|
||||
| testuser | secret | false |
|
||||
And I am working on the mobile interface
|
||||
And I have logged in as "testuser" with password "secret"
|
||||
And I have a context called "a context"
|
||||
And I have a project "test project" with a default context of "test context"
|
||||
|
||||
Scenario Outline: The new action form is prefilled with context and project
|
||||
Given I am on the <page>
|
||||
When I follow "0-New action"
|
||||
Then the selected project should be "<project>"
|
||||
And the selected context should be "<context>"
|
||||
|
||||
Scenarios: # empty means no selected, i.e. first in list is shown
|
||||
| page | project | context |
|
||||
| home page | | |
|
||||
| tickler page | | |
|
||||
| "test project" project | test project | |
|
||||
| context page for "test context" | | test context |
|
||||
| tag page for "starred" | | |
|
||||
|
||||
Scenario: I can add a new todo using the mobile interface
|
||||
Given I am on the home page
|
||||
Then the badge should show 0
|
||||
When I follow "0-New action"
|
||||
And I fill in "Description" with "test me"
|
||||
And I press "Create"
|
||||
Then I should see "test me"
|
||||
And the badge should show 1
|
||||
23
features/mobile_context_list.feature
Normal file
23
features/mobile_context_list.feature
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
Feature: View the list of contexts from mobile
|
||||
In order to be able to see all contexts from the mobile interface
|
||||
As a Tracks user
|
||||
I want to to be able to see a list of project
|
||||
|
||||
Background:
|
||||
Given the following user record
|
||||
| login | password | is_admin |
|
||||
| testuser | secret | false |
|
||||
And I am working on the mobile interface
|
||||
And I have logged in as "testuser" with password "secret"
|
||||
And I have a context called "@mobile"
|
||||
And I have a project "test project" that has the following todos
|
||||
| context | description |
|
||||
| @mobile | test action |
|
||||
|
||||
Scenario: I can go to a context from the mobile context list page
|
||||
Given I have a todo "test mobile page" in the context "@mobile"
|
||||
And I am on the contexts page
|
||||
Then I should see "@mobile"
|
||||
When I follow "@mobile"
|
||||
Then the badge should show 2
|
||||
And I should see "@mobile"
|
||||
38
features/mobile_edit_a_todo.feature
Normal file
38
features/mobile_edit_a_todo.feature
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
Feature: Edit a next action from the mobile view
|
||||
In order to manage a next action
|
||||
As a Tracks user
|
||||
I want to to be able to edit a next action
|
||||
|
||||
Background:
|
||||
Given the following user record
|
||||
| login | password | is_admin |
|
||||
| testuser | secret | false |
|
||||
And I am working on the mobile interface
|
||||
And I have logged in as "testuser" with password "secret"
|
||||
And I have a context called "@mobile"
|
||||
And I have a project "test project" that has the following todos
|
||||
| context | description |
|
||||
| @mobile | test action |
|
||||
|
||||
Scenario: I can edit an action on the mobile page
|
||||
When I am on the home page
|
||||
Then the badge should show 1
|
||||
Then I should see "test action"
|
||||
When I follow "test action"
|
||||
And I fill in "Description" with "changed action"
|
||||
And I press "Update"
|
||||
Then I should see "changed action"
|
||||
And I should not see "test action"
|
||||
When I follow "changed action"
|
||||
And I check "done"
|
||||
And I press "Update"
|
||||
Then I should not see "changed action"
|
||||
|
||||
Scenario: Navigate from home page
|
||||
move this to separate features when other scenarios are created for these features
|
||||
When I am on the home page
|
||||
Then the badge should show 1
|
||||
When I follow "Tickler"
|
||||
Then the badge should show 0
|
||||
When I follow "Feeds"
|
||||
Then I should see "Last 15 actions"
|
||||
22
features/mobile_project_list.feature
Normal file
22
features/mobile_project_list.feature
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
Feature: View the list of projects from mobile
|
||||
In order to be able to see all project from the mobile interface
|
||||
As a Tracks user
|
||||
I want to to be able to see a list of project
|
||||
|
||||
Background:
|
||||
Given the following user record
|
||||
| login | password | is_admin |
|
||||
| testuser | secret | false |
|
||||
And I am working on the mobile interface
|
||||
And I have logged in as "testuser" with password "secret"
|
||||
And I have a context called "@mobile"
|
||||
And I have a project "test project" that has the following todos
|
||||
| context | description |
|
||||
| @mobile | test action |
|
||||
|
||||
Scenario: I can go to a project from the list of project in mobile view
|
||||
Given I am on the projects page
|
||||
Then I should see "test project"
|
||||
When I follow "test project"
|
||||
Then the badge should show 1
|
||||
And I should see "test action"
|
||||
24
features/mobile_tagging_todos.feature
Normal file
24
features/mobile_tagging_todos.feature
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
Feature: Show the actions that are tagged on the mobile page
|
||||
In order to be able to see all actions tags with a certain tag
|
||||
As a Tracks user
|
||||
I want to to be able to find all actions with a specific tag
|
||||
|
||||
Background:
|
||||
Given the following user record
|
||||
| login | password | is_admin |
|
||||
| testuser | secret | false |
|
||||
And I am working on the mobile interface
|
||||
And I have logged in as "testuser" with password "secret"
|
||||
And I have a context called "@mobile"
|
||||
And I have a project "my project" that has the following todos
|
||||
| context | description | tags |
|
||||
| @mobile | first action | test, bla |
|
||||
| @mobile | second action | bla |
|
||||
|
||||
Scenario: I can follow the tag of a action to see all actions belonging to that todo
|
||||
When I go to the home page
|
||||
And I follow "test"
|
||||
Then the badge should show 1
|
||||
When I go to the home page
|
||||
And I follow "bla"
|
||||
Then the badge should show 2
|
||||
|
|
@ -12,13 +12,13 @@ Feature: Edit a project
|
|||
|
||||
Scenario: I can go to the note of a project
|
||||
Given I have a project "test" with 2 notes
|
||||
When I visit the "test" project
|
||||
When I go to the "test" project
|
||||
When I click on the first note icon
|
||||
Then I should go to that note page
|
||||
|
||||
@selenium
|
||||
Scenario: I can describe the project using markup
|
||||
When I visit the "manage me" project
|
||||
When I go to the "manage me" project
|
||||
And I edit the project description to "_successfull outcome_: project is *done*"
|
||||
Then I should see the italic text "successfull outcome" in the project description
|
||||
And I should see the bold text "done" in the project description
|
||||
|
|
@ -26,7 +26,7 @@ Feature: Edit a project
|
|||
@selenium
|
||||
Scenario: I can edit the project name in place
|
||||
Given I have a project "release tracks 1.8" with 1 todos
|
||||
When I visit the project page for "release tracks 1.8"
|
||||
When I go to the "release tracks 1.8" project
|
||||
And I edit the project name in place to be "release tracks 2.0"
|
||||
Then I should see the project name is "release tracks 2.0"
|
||||
When I go to the projects page
|
||||
|
|
@ -37,7 +37,7 @@ Feature: Edit a project
|
|||
@selenium
|
||||
Scenario: I can change the name of the project using the Edit Project Settings form
|
||||
Given I have a project "bananas" with 1 todos
|
||||
When I visit the "bananas" project
|
||||
When I go to the "bananas" project
|
||||
And I edit the project name to "cherries"
|
||||
Then the project title should be "cherries"
|
||||
|
||||
|
|
@ -63,21 +63,21 @@ Feature: Edit a project
|
|||
@selenium
|
||||
Scenario: I can add a note to the project
|
||||
Given I have a project called "test"
|
||||
When I visit the "test" project
|
||||
When I go to the "test" project
|
||||
And I add a note "hello I'm testing" to the project
|
||||
Then I should see one note in the project
|
||||
|
||||
@selenium
|
||||
Scenario: Cancelling adding a note to the project will remove form
|
||||
Given I have a project called "test"
|
||||
When I visit the "test" project
|
||||
When I go to the "test" project
|
||||
And I cancel adding a note to the project
|
||||
Then the form for adding a note should not be visible
|
||||
|
||||
@selenium
|
||||
Scenario: Long notes in a project are shown cut off
|
||||
Given I have a project called "test"
|
||||
When I visit the "test" project
|
||||
When I go to the "test" project
|
||||
And I add a note "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890TOO LONG" to the project
|
||||
Then I should not see "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890TOO LONG"
|
||||
And I should see "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456"
|
||||
|
|
@ -98,10 +98,11 @@ Feature: Edit a project
|
|||
Given this is a pending scenario # empty message is in separate container
|
||||
|
||||
# Ticket #1043
|
||||
@selenium @wip
|
||||
@selenium
|
||||
Scenario: I can move a todo out of the current project
|
||||
Given I have a project "foo" with 2 todos
|
||||
When I visit the "foo" project
|
||||
And I have a project called "bar"
|
||||
When I go to the "foo" project
|
||||
And I change the project_name field of "Todo 1" to "bar"
|
||||
Then I should not see the todo "Todo 1"
|
||||
And I should see the todo "Todo 2"
|
||||
Then I should not see "Todo 1"
|
||||
And I should see "Todo 2"
|
||||
|
|
|
|||
116
features/step_definitions/dependencies_steps.rb
Normal file
116
features/step_definitions/dependencies_steps.rb
Normal file
|
|
@ -0,0 +1,116 @@
|
|||
Given /^"([^"]*)" depends on "([^"]*)"$/ do |successor_name, predecessor_name|
|
||||
successor = Todo.find_by_description(successor_name)
|
||||
predecessor = Todo.find_by_description(predecessor_name)
|
||||
|
||||
successor.add_predecessor(predecessor)
|
||||
successor.state = "pending"
|
||||
successor.save!
|
||||
end
|
||||
|
||||
When /^I drag "(.*)" to "(.*)"$/ do |dragged, target|
|
||||
drag_id = Todo.find_by_description(dragged).id
|
||||
drop_id = Todo.find_by_description(target).id
|
||||
drag_name = "xpath=//div[@id='line_todo_#{drag_id}']//img[@class='grip']"
|
||||
drop_name = "xpath=//div[@id='line_todo_#{drop_id}']//div[@class='description']"
|
||||
|
||||
selenium.drag_and_drop_to_object(drag_name, drop_name)
|
||||
|
||||
arrow = "xpath=//div[@id='line_todo_#{drop_id}']/div/a[@class='show_successors']/img"
|
||||
selenium.wait_for_element(arrow, :timeout_in_seconds => 5)
|
||||
end
|
||||
|
||||
When /^I expand the dependencies of "([^\"]*)"$/ do |todo_name|
|
||||
todo = Todo.find_by_description(todo_name)
|
||||
todo.should_not be_nil
|
||||
|
||||
expand_img_locator = "xpath=//div[@id='line_todo_#{todo.id}']/div/a[@class='show_successors']/img"
|
||||
selenium.click(expand_img_locator)
|
||||
end
|
||||
|
||||
When /^I edit the dependency of "([^"]*)" to add "([^"]*)" as predecessor$/ do |todo_description, predecessor_description|
|
||||
todo = @current_user.todos.find_by_description(todo_description)
|
||||
todo.should_not be_nil
|
||||
predecessor = @current_user.todos.find_by_description(predecessor_description)
|
||||
predecessor.should_not be_nil
|
||||
|
||||
open_edit_form_for(todo)
|
||||
|
||||
input = "xpath=//form[@id='form_todo_#{todo.id}']//input[@id='predecessor_input']"
|
||||
selenium.focus(input)
|
||||
selenium.type_keys input, predecessor_description
|
||||
|
||||
# wait for auto complete
|
||||
autocomplete = "xpath=//a[@id='ui-active-menuitem']"
|
||||
selenium.wait_for_element(autocomplete, :timeout_in_seconds => 5)
|
||||
|
||||
# click first line
|
||||
first_elem = "xpath=//ul/li[1]/a[@id='ui-active-menuitem']"
|
||||
selenium.click(first_elem)
|
||||
|
||||
new_dependency_line = "xpath=//li[@id='pred_#{predecessor.id}']"
|
||||
selenium.wait_for_element(new_dependency_line, :timeout_in_seconds => 5)
|
||||
|
||||
submit_edit_todo_form(todo)
|
||||
end
|
||||
|
||||
When /^I edit the dependency of "([^"]*)" to remove "([^"]*)" as predecessor$/ do |todo_description, predecessor_description|
|
||||
todo = @current_user.todos.find_by_description(todo_description)
|
||||
todo.should_not be_nil
|
||||
predecessor = @current_user.todos.find_by_description(predecessor_description)
|
||||
predecessor.should_not be_nil
|
||||
|
||||
open_edit_form_for(todo)
|
||||
|
||||
delete_dep_button = "xpath=//form[@id='form_todo_#{todo.id}']//img[@id='delete_dep_#{predecessor.id}']"
|
||||
selenium.click(delete_dep_button)
|
||||
wait_for :timeout=>5 do
|
||||
!selenium.is_element_present(delete_dep_button)
|
||||
end
|
||||
|
||||
submit_edit_todo_form(todo)
|
||||
# note that animations will be running after the ajax is completed
|
||||
end
|
||||
|
||||
When /^I edit the dependency of "([^"]*)" to "([^"]*)"$/ do |todo_name, deps|
|
||||
todo = @dep_todo = @current_user.todos.find_by_description(todo_name)
|
||||
todo.should_not be_nil
|
||||
|
||||
open_edit_form_for(todo)
|
||||
fill_in "predecessor_list_todo_#{todo.id}", :with => deps
|
||||
submit_edit_todo_form(todo)
|
||||
end
|
||||
|
||||
Then /^the successors of "(.*)" should include "(.*)"$/ do |parent_name, child_name|
|
||||
parent = @current_user.todos.find_by_description(parent_name)
|
||||
parent.should_not be_nil
|
||||
|
||||
child = parent.pending_successors.find_by_description(child_name)
|
||||
child.should_not be_nil
|
||||
end
|
||||
|
||||
Then /^I should see "([^\"]*)" within the dependencies of "([^\"]*)"$/ do |successor_description, todo_description|
|
||||
todo = @current_user.todos.find_by_description(todo_description)
|
||||
todo.should_not be_nil
|
||||
successor = @current_user.todos.find_by_description(successor_description)
|
||||
successor.should_not be_nil
|
||||
|
||||
# argh, webrat on selenium does not support within, so this won't work
|
||||
# xpath = "//div[@id='line_todo_#{todo.id}'"
|
||||
# Then "I should see \"#{successor_description}\" within \"xpath=#{xpath}\""
|
||||
|
||||
# let selenium look for the presence of the successor
|
||||
xpath = "xpath=//div[@id='line_todo_#{todo.id}']//div[@id='successor_line_todo_#{successor.id}']//span"
|
||||
selenium.wait_for_element(xpath, :timeout_in_seconds => 5)
|
||||
end
|
||||
|
||||
Then /^I should not see "([^"]*)" within the dependencies of "([^"]*)"$/ do |successor_description, todo_description|
|
||||
todo = @current_user.todos.find_by_description(todo_description)
|
||||
todo.should_not be_nil
|
||||
successor = @current_user.todos.find_by_description(successor_description)
|
||||
successor.should_not be_nil
|
||||
# let selenium look for the presence of the successor
|
||||
xpath = "xpath=//div[@id='line_todo_#{todo.id}']//div[@id='successor_line_todo_#{successor.id}']//span"
|
||||
wait_for :timeout => 5 do
|
||||
!selenium.is_element_present(xpath)
|
||||
end
|
||||
end
|
||||
|
|
@ -31,7 +31,7 @@ Then /^I should see "([^"]*)" as the selected context$/ do |context_name|
|
|||
end
|
||||
|
||||
Then /^I should see feeds for "([^"]*)" in list of "([^"]*)"$/ do |name, list_type|
|
||||
selenium.wait_for :wait_for => :ajax, :javascript_framework => :jquery
|
||||
wait_for_ajax
|
||||
xpath= "//div[@id='feeds-for-#{list_type}']//strong"
|
||||
name.should == response.selenium.get_text("xpath=#{xpath}")
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,6 +2,10 @@ Given /this is a pending scenario/ do
|
|||
pending
|
||||
end
|
||||
|
||||
Given /^I am working on the mobile interface$/ do
|
||||
@mobile_interface = true
|
||||
end
|
||||
|
||||
Then /the badge should show (.*)/ do |number|
|
||||
badge = -1
|
||||
xpath= "//span[@id='badge_count']"
|
||||
|
|
@ -17,3 +21,16 @@ Then /the badge should show (.*)/ do |number|
|
|||
|
||||
badge.should == number.to_i
|
||||
end
|
||||
|
||||
Then /^I should see the empty message in the deferred container$/ do
|
||||
wait_for :timeout => 5 do
|
||||
selenium.is_visible("xpath=//div[@id='tickler']//div[@id='tickler-empty-nd']")
|
||||
end
|
||||
end
|
||||
|
||||
Then /^I should not see the context "([^"]*)"$/ do |context_name|
|
||||
context = @current_user.contexts.find_by_name(context_name)
|
||||
wait_for :timeout => 5 do
|
||||
!selenium.is_visible("xpath=//div[@id='c#{context.id}']")
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
Given /^I have logged in as "(.*)" with password "(.*)"$/ do |username, password|
|
||||
visit login_path
|
||||
When "I go to the login page"
|
||||
fill_in "Login", :with => username
|
||||
fill_in "Password", :with => password
|
||||
uncheck "Stay logged in:"
|
||||
|
|
@ -7,7 +7,8 @@ Given /^I have logged in as "(.*)" with password "(.*)"$/ do |username, password
|
|||
if response.respond_to? :selenium
|
||||
selenium.wait_for_page_to_load(5000)
|
||||
end
|
||||
response.should contain(/Logout \(#{username}\)/)
|
||||
logout_regexp = @mobile_interface ? "Logout" : "Logout \(#{username}\)"
|
||||
response.should contain(logout_regexp)
|
||||
@current_user = User.find_by_login(username)
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -39,13 +39,13 @@ end
|
|||
|
||||
When /^I sort the active list alphabetically$/ do
|
||||
click_link "Alphabetically"
|
||||
selenium.wait_for :wait_for => :ajax, :javascript_framework => :jquery
|
||||
wait_for_ajax
|
||||
selenium.get_confirmation.should == "Are you sure that you want to sort these projects alphabetically? This will replace the existing sort order."
|
||||
end
|
||||
|
||||
When /^I sort the list by number of tasks$/ do
|
||||
click_link "By number of tasks"
|
||||
selenium.wait_for :wait_for => :ajax, :javascript_framework => :jquery
|
||||
wait_for_ajax
|
||||
selenium.get_confirmation.should == "Are you sure that you want to sort these projects by the number of tasks? This will replace the existing sort order."
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -24,6 +24,13 @@ Given /^I have a project called "([^"]*)"$/ do |project_name|
|
|||
Given "there exists a project \"#{project_name}\" for user \"#{@current_user.login}\""
|
||||
end
|
||||
|
||||
Given /^I have a project "([^"]*)" with a default context of "([^"]*)"$/ do |project_name, context_name|
|
||||
Given "there exists a project \"#{project_name}\" for user \"#{@current_user.login}\""
|
||||
context = @current_user.contexts.create!(:name => context_name)
|
||||
@project.default_context = context
|
||||
@project.save!
|
||||
end
|
||||
|
||||
Given /^I have the following projects:$/ do |table|
|
||||
table.hashes.each do |project|
|
||||
Given 'I have a project called "'+project[:project_name]+'"'
|
||||
|
|
@ -189,4 +196,4 @@ end
|
|||
|
||||
Then /^I should see the project name is "([^"]*)"$/ do |project_name|
|
||||
Then "the project title should be \"#{project_name}\""
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ When /^I edit the name of the pattern "([^\"]*)" to "([^\"]*)"$/ do |pattern_nam
|
|||
pattern.should_not be_nil
|
||||
click_link "link_edit_recurring_todo_#{pattern.id}"
|
||||
|
||||
selenium.wait_for :wait_for => :ajax, :javascript_framework => :jquery
|
||||
wait_for_ajax
|
||||
|
||||
fill_in "edit_recurring_todo_description", :with => new_name
|
||||
selenium.click "recurring_todo_edit_action_submit"
|
||||
|
|
@ -49,7 +49,7 @@ When /^I star the pattern "([^\"]*)"$/ do |pattern_name|
|
|||
pattern = @current_user.recurring_todos.find_by_description(pattern_name)
|
||||
pattern.should_not be_nil
|
||||
click_link "star_icon_#{pattern.id}"
|
||||
selenium.wait_for :wait_for => :ajax, :javascript_framework => :jquery
|
||||
wait_for_ajax
|
||||
end
|
||||
|
||||
When /^I delete the pattern "([^"]*)"$/ do |pattern_name|
|
||||
|
|
@ -67,7 +67,7 @@ When /^I mark the pattern "([^"]*)" as complete$/ do |pattern_name|
|
|||
pattern.should_not be_nil
|
||||
pattern.completed?.should be_false
|
||||
selenium.click "check_#{pattern.id}"
|
||||
selenium.wait_for :wait_for => :ajax, :javascript_framework => :jquery
|
||||
wait_for_ajax
|
||||
end
|
||||
|
||||
When /^I mark the pattern "([^"]*)" as active$/ do |pattern_name|
|
||||
|
|
@ -75,7 +75,7 @@ When /^I mark the pattern "([^"]*)" as active$/ do |pattern_name|
|
|||
pattern.should_not be_nil
|
||||
pattern.completed?.should be_true
|
||||
selenium.click "check_#{pattern.id}"
|
||||
selenium.wait_for :wait_for => :ajax, :javascript_framework => :jquery
|
||||
wait_for_ajax
|
||||
end
|
||||
|
||||
Then /^the state list "([^"]*)" should be empty$/ do |state|
|
||||
|
|
|
|||
|
|
@ -2,15 +2,25 @@ Given /^I have no todos$/ do
|
|||
Todo.delete_all
|
||||
end
|
||||
|
||||
Given /^I have a todo "(.*)"$/ do |description|
|
||||
context = @current_user.contexts.create!(:name => "context A")
|
||||
Given /^I have a todo "([^"]*)" in the context "([^"]*)"$/ do |description, context_name|
|
||||
context = @current_user.contexts.find_or_create(:name => context_name)
|
||||
@current_user.todos.create!(:context_id => context.id, :description => description)
|
||||
end
|
||||
|
||||
Given /^I have a todo "([^"]*)" in the context "([^"]*)" which is due tomorrow$/ do |description, context_name|
|
||||
context = @current_user.contexts.find_or_create(:name => context_name)
|
||||
@todo = @current_user.todos.create!(:context_id => context.id, :description => description)
|
||||
@todo.due = @todo.created_at + 1.day
|
||||
@todo.save!
|
||||
end
|
||||
|
||||
Given /^I have a todo "([^"]*)"$/ do |description|
|
||||
Given "I have a todo \"#{description}\" in the context \"Context A\""
|
||||
end
|
||||
|
||||
Given /^I have ([0-9]+) todos$/ do |count|
|
||||
context = @current_user.contexts.create!(:name => "context A")
|
||||
count.to_i.downto 1 do |i|
|
||||
@current_user.todos.create!(:context_id => context.id, :description => "todo #{i}")
|
||||
Given "I have a todo \"todo #{i}\" in the context \"Context A\""
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -42,57 +52,29 @@ Given /^I have ([0-9]+) completed todos with a note$/ do |count|
|
|||
end
|
||||
end
|
||||
|
||||
Given /^"(.*)" depends on "(.*)"$/ do |successor_name, predecessor_name|
|
||||
successor = Todo.find_by_description(successor_name)
|
||||
predecessor = Todo.find_by_description(predecessor_name)
|
||||
|
||||
successor.add_predecessor(predecessor)
|
||||
successor.state = "pending"
|
||||
successor.save!
|
||||
end
|
||||
|
||||
Given /^I have a project "([^"]*)" that has the following todos$/ do |project_name, todos|
|
||||
Given "I have a project called \"#{project_name}\""
|
||||
@project.should_not be_nil
|
||||
todos.hashes.each do |todo|
|
||||
context_id = @current_user.contexts.find_by_name(todo[:context])
|
||||
context_id.should_not be_nil
|
||||
@current_user.todos.create!(
|
||||
context = @current_user.contexts.find_by_name(todo[:context])
|
||||
context.should_not be_nil
|
||||
new_todo = @current_user.todos.create!(
|
||||
:description => todo[:description],
|
||||
:context_id => context_id,
|
||||
:context_id => context.id,
|
||||
:project_id=>@project.id)
|
||||
unless todo[:tags].nil?
|
||||
new_todo.tag_with(todo[:tags])
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
When /^I drag "(.*)" to "(.*)"$/ do |dragged, target|
|
||||
drag_id = Todo.find_by_description(dragged).id
|
||||
drop_id = Todo.find_by_description(target).id
|
||||
drag_name = "xpath=//div[@id='line_todo_#{drag_id}']//img[@class='grip']"
|
||||
drop_name = "xpath=//div[@id='line_todo_#{drop_id}']//div[@class='description']"
|
||||
|
||||
selenium.drag_and_drop_to_object(drag_name, drop_name)
|
||||
|
||||
arrow = "xpath=//div[@id='line_todo_#{drop_id}']/div/a[@class='show_successors']/img"
|
||||
selenium.wait_for_element(arrow, :timeout_in_seconds => 5)
|
||||
end
|
||||
|
||||
When /^I expand the dependencies of "([^\"]*)"$/ do |todo_name|
|
||||
todo = Todo.find_by_description(todo_name)
|
||||
todo.should_not be_nil
|
||||
|
||||
expand_img_locator = "xpath=//div[@id='line_todo_#{todo.id}']/div/a[@class='show_successors']/img"
|
||||
selenium.click(expand_img_locator)
|
||||
end
|
||||
|
||||
When /I change the (.*) field of "([^\"]*)" to "([^\"]*)"$/ do |field, todo_name, new_value|
|
||||
When /I change the (.*) field of "([^\"]*)" to "([^\"]*)"$/ do |field_name, todo_name, new_value|
|
||||
todo = @current_user.todos.find_by_description(todo_name)
|
||||
todo.should_not be_nil
|
||||
|
||||
selenium.click("//img[@id='edit_icon_todo_#{todo.id}']", :wait_for => :ajax, :javascript_framework => :jquery)
|
||||
selenium.type("css=form.edit_todo_form input[name=#{field}]", new_value)
|
||||
selenium.click("css=button.positive", :wait_for => :ajax, :javascript_framework => :jquery)
|
||||
# TODO: change to a wait_for
|
||||
sleep(5)
|
||||
open_edit_form_for(todo)
|
||||
selenium.type("css=form.edit_todo_form input[name=#{field_name}]", new_value)
|
||||
submit_edit_todo_form(todo)
|
||||
end
|
||||
|
||||
When /^I submit a new action with description "([^"]*)"$/ do |description|
|
||||
|
|
@ -165,15 +147,52 @@ When /^I submit the new multiple actions form with$/ do |multi_line_descriptions
|
|||
submit_multiple_next_action_form
|
||||
end
|
||||
|
||||
When /^I edit the dependency of "([^"]*)" to "([^"]*)"$/ do |todo_name, deps|
|
||||
todo = @dep_todo = @current_user.todos.find_by_description(todo_name)
|
||||
When /^I edit the due date of "([^"]*)" to tomorrow$/ do |action_description|
|
||||
todo = @current_user.todos.find_by_description(action_description)
|
||||
todo.should_not be_nil
|
||||
# click edit
|
||||
selenium.click("//div[@id='line_todo_#{todo.id}']//img[@id='edit_icon_todo_#{todo.id}']", :wait_for => :ajax, :javascript_framework => :jquery)
|
||||
fill_in "predecessor_list_todo_#{todo.id}", :with => deps
|
||||
|
||||
open_edit_form_for(todo)
|
||||
fill_in "due_todo_#{todo.id}", :with => format_date(todo.created_at + 1.day)
|
||||
submit_edit_todo_form(todo)
|
||||
sleep(1) # TODO: replace with some wait_for
|
||||
end
|
||||
|
||||
When /^I edit the due date of "([^"]*)" to next month$/ do |action_description|
|
||||
todo = @current_user.todos.find_by_description(action_description)
|
||||
todo.should_not be_nil
|
||||
open_edit_form_for(todo)
|
||||
fill_in "due_todo_#{todo.id}", :with => format_date(todo.created_at + 1.month)
|
||||
submit_edit_todo_form(todo)
|
||||
end
|
||||
|
||||
When /^I clear the due date of "([^"]*)"$/ do |action_description|
|
||||
todo = @current_user.todos.find_by_description(action_description)
|
||||
todo.should_not be_nil
|
||||
open_edit_form_for(todo)
|
||||
selenium.click("//div[@id='edit_todo_#{todo.id}']//a[@id='due_x_todo_#{todo.id}']/img", :wait_for => :ajax, :javascript_framework => :jquery)
|
||||
submit_edit_todo_form(todo)
|
||||
end
|
||||
|
||||
When /^I mark "([^"]*)" as complete$/ do |action_description|
|
||||
# TODO: generalize. this currently only works for projects wrt xpath
|
||||
todo = @current_user.todos.find_by_description(action_description)
|
||||
todo.should_not be_nil
|
||||
check "mark_complete_#{todo.id}"
|
||||
wait_for :timeout => 5 do
|
||||
!selenium.is_element_present("//div[@id='p#{todo.project.id}items']//div[@id='line_todo_#{todo.id}']")
|
||||
end
|
||||
# note that animations could be running after finishing this
|
||||
end
|
||||
|
||||
When /^I delete the action "([^"]*)"$/ do |action_description|
|
||||
todo = @current_user.todos.find_by_description(action_description)
|
||||
todo.should_not be_nil
|
||||
|
||||
delete_todo_button = "xpath=//a[@id='delete_todo_#{todo.id}']/img"
|
||||
selenium.click delete_todo_button
|
||||
selenium.get_confirmation.should == "Are you sure that you want to delete the action '#{todo.description}'?"
|
||||
|
||||
wait_for :timeout => 5 do
|
||||
!selenium.is_element_present("//div[@id='line_todo_#{todo.id}']")
|
||||
end
|
||||
end
|
||||
|
||||
Then /^I should see ([0-9]+) todos$/ do |count|
|
||||
|
|
@ -185,43 +204,11 @@ end
|
|||
Then /^there should not be an error$/ do
|
||||
sleep(5)
|
||||
# form should be gone and thus no errors visible
|
||||
selenium.is_visible("edit_todo_#{@dep_todo.id}").should == false
|
||||
wait_for :timeout => 5 do
|
||||
!selenium.is_visible("edit_todo_#{@dep_todo.id}")
|
||||
end
|
||||
end
|
||||
|
||||
Then /^the successors of "(.*)" should include "(.*)"$/ do |parent_name, child_name|
|
||||
parent = @current_user.todos.find_by_description(parent_name)
|
||||
parent.should_not be_nil
|
||||
|
||||
child = parent.pending_successors.find_by_description(child_name)
|
||||
child.should_not be_nil
|
||||
end
|
||||
|
||||
Then /^I should see "([^\"]*)" within the dependencies of "([^\"]*)"$/ do |successor_description, todo_description|
|
||||
todo = @current_user.todos.find_by_description(todo_description)
|
||||
todo.should_not be_nil
|
||||
successor = @current_user.todos.find_by_description(successor_description)
|
||||
successor.should_not be_nil
|
||||
|
||||
# argh, webrat on selenium does not support within, so this won't work
|
||||
# xpath = "//div[@id='line_todo_#{todo.id}'"
|
||||
# Then "I should see \"#{successor_description}\" within \"xpath=#{xpath}\""
|
||||
|
||||
# let selenium look for the presence of the successor
|
||||
xpath = "xpath=//div[@id='line_todo_#{todo.id}']//div[@id='successor_line_todo_#{successor.id}']//span"
|
||||
selenium.wait_for_element(xpath, :timeout_in_seconds => 5)
|
||||
end
|
||||
|
||||
Then /^I should not see "([^"]*)" within the dependencies of "([^"]*)"$/ do |successor_description, todo_description|
|
||||
todo = @current_user.todos.find_by_description(todo_description)
|
||||
todo.should_not be_nil
|
||||
successor = @current_user.todos.find_by_description(successor_description)
|
||||
successor.should_not be_nil
|
||||
# let selenium look for the presence of the successor
|
||||
xpath = "xpath=//div[@id='line_todo_#{todo.id}']//div[@id='successor_line_todo_#{successor.id}']//span"
|
||||
selenium.is_element_present(xpath).should be_false
|
||||
end
|
||||
|
||||
|
||||
Then /^I should see the todo "([^\"]*)"$/ do |todo_description|
|
||||
selenium.is_element_present("//span[.=\"#{todo_description}\"]").should be_true
|
||||
end
|
||||
|
|
@ -245,8 +232,10 @@ end
|
|||
Then /^the container for the context "([^"]*)" should not be visible$/ do |context_name|
|
||||
context = @current_user.contexts.find_by_name(context_name)
|
||||
context.should_not be_nil
|
||||
|
||||
wait_for_ajax
|
||||
|
||||
xpath = "xpath=//div[@id=\"c#{context.id}\"]"
|
||||
selenium.wait_for :wait_for => :ajax, :javascript_framework => :jquery
|
||||
selenium.is_element_present(xpath).should be_false
|
||||
end
|
||||
|
||||
|
|
@ -260,7 +249,31 @@ Then /^I should see "([^"]*)" in the deferred container$/ do |todo_description|
|
|||
|
||||
xpath = "//div[@id='tickler']//div[@id='line_todo_#{todo.id}']"
|
||||
|
||||
selenium.is_element_present(xpath).should be_true
|
||||
wait_for :timeout => 5 do
|
||||
selenium.is_element_present(xpath)
|
||||
end
|
||||
end
|
||||
|
||||
Then /^I should see "([^"]*)" in the action container$/ do |todo_description|
|
||||
todo = @current_user.todos.find_by_description(todo_description)
|
||||
todo.should_not be_nil
|
||||
|
||||
xpath = "//div[@id='p#{todo.project.id}items']//div[@id='line_todo_#{todo.id}']"
|
||||
|
||||
wait_for :timeout => 5 do
|
||||
selenium.is_element_present(xpath)
|
||||
end
|
||||
end
|
||||
|
||||
Then /^I should see "([^"]*)" in the completed container$/ do |todo_description|
|
||||
todo = @current_user.todos.find_by_description(todo_description)
|
||||
todo.should_not be_nil
|
||||
|
||||
xpath = "//div[@id='completed_container']//div[@id='line_todo_#{todo.id}']"
|
||||
|
||||
wait_for :timeout => 5 do
|
||||
selenium.is_element_present(xpath)
|
||||
end
|
||||
end
|
||||
|
||||
Then /^I should not see "([^"]*)" in the deferred container$/ do |todo_description|
|
||||
|
|
@ -269,5 +282,28 @@ Then /^I should not see "([^"]*)" in the deferred container$/ do |todo_descripti
|
|||
|
||||
xpath = "//div[@id='tickler']//div[@id='line_todo_#{todo.id}']"
|
||||
|
||||
selenium.is_element_present(xpath).should be_false
|
||||
wait_for :timeout => 5 do
|
||||
!selenium.is_element_present(xpath)
|
||||
end
|
||||
end
|
||||
|
||||
Then /^I should see "([^"]*)" in the due next month container$/ do |todo_description|
|
||||
todo = @current_user.todos.find_by_description(todo_description)
|
||||
todo.should_not be_nil
|
||||
|
||||
xpath = "xpath=//div[@id='due_after_this_month']//div[@id='line_todo_#{todo.id}']"
|
||||
|
||||
wait_for :timeout => 5 do
|
||||
!selenium.is_element_present(xpath)
|
||||
end
|
||||
end
|
||||
|
||||
Then /^the selected project should be "([^"]*)"$/ do |content|
|
||||
# Works for mobile. TODO: make it work for both mobile and non-mobile
|
||||
field_labeled("Project").element.search(".//option[@selected = 'selected']").inner_html.should =~ /#{content}/
|
||||
end
|
||||
|
||||
Then /^the selected context should be "([^"]*)"$/ do |content|
|
||||
# Works for mobile. TODO: make it work for both mobile and non-mobile
|
||||
field_labeled("Context").element.search(".//option[@selected = 'selected']").inner_html.should =~ /#{content}/
|
||||
end
|
||||
|
|
|
|||
|
|
@ -6,53 +6,54 @@ module NavigationHelpers
|
|||
# step definition in web_steps.rb
|
||||
#
|
||||
def path_to(page_name)
|
||||
options = @mobile_interface ? {:format => :m} : {}
|
||||
case page_name
|
||||
|
||||
when /the home\s?page/
|
||||
root_path
|
||||
root_path(options)
|
||||
when /the statistics page/
|
||||
stats_path
|
||||
stats_path(options)
|
||||
when /the signup page/
|
||||
signup_path
|
||||
signup_path(options)
|
||||
when /the login page/
|
||||
login_path
|
||||
login_path(options)
|
||||
when /the notes page/
|
||||
notes_path
|
||||
notes_path(options)
|
||||
when /the contexts page/
|
||||
contexts_path
|
||||
contexts_path(options)
|
||||
when /the projects page/
|
||||
projects_path
|
||||
projects_path(options)
|
||||
when /the manage users page/
|
||||
users_path
|
||||
users_path(options)
|
||||
when /the repeating todos page/
|
||||
recurring_todos_path
|
||||
recurring_todos_path(options)
|
||||
when /the integrations page/
|
||||
integrations_path
|
||||
integrations_path(options)
|
||||
when /the tickler page/
|
||||
tickler_path
|
||||
tickler_path(options)
|
||||
when /the export page/
|
||||
data_path
|
||||
data_path(options)
|
||||
when /the preference page/
|
||||
preferences_path
|
||||
preferences_path(options)
|
||||
when /the rest api docs page/
|
||||
rest_api_docs_path
|
||||
rest_api_docs_path(options)
|
||||
when /the search page/
|
||||
search_path
|
||||
search_path(options)
|
||||
when /the starred page/
|
||||
tag_path("starred")
|
||||
tag_path("starred", options)
|
||||
when /the feeds page/
|
||||
feeds_path
|
||||
feeds_path(options)
|
||||
when /the context page for "([^\"]*)" for user "([^\"]*)"/i
|
||||
context_path(User.find_by_login($2).contexts.find_by_name($1))
|
||||
context_path(User.find_by_login($2).contexts.find_by_name($1), options)
|
||||
when /the context page for "([^\"]*)"/i
|
||||
context_path(@current_user.contexts.find_by_name($1))
|
||||
context_path(@current_user.contexts.find_by_name($1), options)
|
||||
when /the "([^\"]*)" project for user "([^\"]*)"/i
|
||||
project_path(User.find_by_login($2).projects.find_by_name($1))
|
||||
project_path(User.find_by_login($2).projects.find_by_name($1), options)
|
||||
when /the "([^\"]*)" project/i
|
||||
@project = @current_user.projects.find_by_name($1)
|
||||
project_path(@project)
|
||||
project_path(@project, options)
|
||||
when /the tag page for "([^"]*)"/i
|
||||
tag_path($1)
|
||||
tag_path($1, options)
|
||||
|
||||
# Add more mappings here.
|
||||
# Here is an example that pulls values out of the Regexp:
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ module TracksStepHelper
|
|||
|
||||
def submit_next_action_form
|
||||
selenium.click("xpath=//form[@id='todo-form-new-action']//button[@id='todo_new_action_submit']", :wait_for => :ajax, :javascript_framework => :jquery)
|
||||
sleep(1)
|
||||
end
|
||||
|
||||
def submit_new_context_form
|
||||
|
|
@ -17,6 +18,9 @@ module TracksStepHelper
|
|||
|
||||
def submit_edit_todo_form (todo)
|
||||
selenium.click("//div[@id='edit_todo_#{todo.id}']//button[@id='submit_todo_#{todo.id}']", :wait_for => :ajax, :javascript_framework => :jquery)
|
||||
wait_for do
|
||||
!selenium.is_element_present("//form[@id='form_todo_#{todo.id}']")
|
||||
end
|
||||
end
|
||||
|
||||
def format_date(date)
|
||||
|
|
@ -36,6 +40,20 @@ module TracksStepHelper
|
|||
execute_javascript("$('#todo_project_name').val('');")
|
||||
end
|
||||
|
||||
def open_edit_form_for(todo)
|
||||
edit_button = "xpath=//div[@id='line_todo_#{todo.id}']//img[@id='edit_icon_todo_#{todo.id}']"
|
||||
|
||||
wait_for :timeout => 5 do
|
||||
selenium.is_element_present(edit_button)
|
||||
end
|
||||
|
||||
selenium.click(edit_button, :wait_for => :ajax, :javascript_framework => :jquery)
|
||||
end
|
||||
|
||||
def wait_for_ajax
|
||||
selenium.wait_for :wait_for => :ajax, :javascript_framework => :jquery
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
World(TracksStepHelper)
|
||||
|
|
@ -12,6 +12,10 @@ module Tracks
|
|||
def nil?
|
||||
yield if @source_view.nil? && block_given?
|
||||
end
|
||||
|
||||
def context
|
||||
yield if :context == @source_view && block_given?
|
||||
end
|
||||
|
||||
def method_missing(check_source_view,*args)
|
||||
yield if check_source_view == @source_view && block_given?
|
||||
|
|
@ -61,4 +65,4 @@ module Tracks
|
|||
|
||||
end
|
||||
|
||||
ActionController::Base.send(:include, Tracks::SourceViewSwitching::Controller)
|
||||
ActionController::Base.send(:include, Tracks::SourceViewSwitching::Controller)
|
||||
|
|
|
|||
BIN
public/images/icon_delete.png
Normal file
BIN
public/images/icon_delete.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 618 B |
|
|
@ -87,6 +87,56 @@ var TracksForm = {
|
|||
submit_with_ajax_and_block_element('form#todo-form-multi-new-action', $(this));
|
||||
return false;
|
||||
});
|
||||
},
|
||||
enable_dependency_delete: function() {
|
||||
$('a[class=icon_delete_dep]').live('click', function() {
|
||||
var form = $(this).parents('form').get(0);
|
||||
var predecessor_list = $(form).find('input[name=predecessor_list]');
|
||||
var id_list = split( predecessor_list.val() );
|
||||
|
||||
// remove from ul
|
||||
$(form).find("li#pred_"+this.id).slideUp(500).remove();
|
||||
|
||||
// remove from array
|
||||
var new_list = new Array();
|
||||
while (id_list.length > 0) {
|
||||
var elem = id_list.pop();
|
||||
if (elem != this.id && elem != '' && elem != ' ') {
|
||||
new_list.push ( elem );
|
||||
}
|
||||
}
|
||||
|
||||
// update id list
|
||||
predecessor_list.val( new_list.join(", ") );
|
||||
|
||||
if (new_list.length == 0) {
|
||||
$(form).find("label#label_for_predecessor_input").hide();
|
||||
$(form).find("ul#predecessor_ul").hide();
|
||||
}
|
||||
|
||||
return false; // prevent submit/follow link
|
||||
})
|
||||
},
|
||||
generate_dependency_list: function(todo_id) {
|
||||
if (spec_of_todo.length > 0) {
|
||||
// find edit form
|
||||
var form_selector = "#form_todo_"+todo_id;
|
||||
var form = $(form_selector);
|
||||
|
||||
var predecessor_list = form.find('input[name=predecessor_list]');
|
||||
var id_list = split( predecessor_list.val() );
|
||||
|
||||
var label = form.find("label#label_for_predecessor_input").first();
|
||||
label.show();
|
||||
|
||||
while (id_list.length > 0) {
|
||||
var elem = id_list.pop();
|
||||
var new_li = TodoItems.generate_predecessor(elem, spec_of_todo[elem]);
|
||||
var ul = form.find('ul#predecessor_ul');
|
||||
ul.html(ul.html() + new_li);
|
||||
form.find('li#pred_'+elem).show();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -130,6 +180,54 @@ var TracksPages = {
|
|||
set_page_badge: function(count) {
|
||||
$('#badge_count').html(count);
|
||||
},
|
||||
setup_autocomplete_for_tag_list: function(id) {
|
||||
$(id+':not(.ac_input)')
|
||||
.bind( "keydown", function( event ) { // don't navigate away from the field on tab when selecting an item
|
||||
if ( event.keyCode === $.ui.keyCode.TAB &&
|
||||
$( this ).data( "autocomplete" ).menu.active ) {
|
||||
event.preventDefault();
|
||||
}
|
||||
})
|
||||
.autocomplete({
|
||||
minLength: 0,
|
||||
source: function( request, response ) {
|
||||
var last_term = extractLast( request.term );
|
||||
if (last_term != "" && last_term != " ")
|
||||
$.ajax( {
|
||||
url: relative_to_root('tags.autocomplete'),
|
||||
dataType: 'json',
|
||||
data: {
|
||||
term: last_term
|
||||
},
|
||||
success: function(data, textStatus, jqXHR) {
|
||||
// remove spinner as removing the class is not always done by response
|
||||
$(id).removeClass('ui-autocomplete-loading');
|
||||
response(data, textStatus, jqXHR); // call jquery callback to handle data
|
||||
}
|
||||
})
|
||||
else {
|
||||
// remove spinner as typing will always add the spinner
|
||||
$(id).removeClass('ui-autocomplete-loading');
|
||||
}
|
||||
},
|
||||
focus: function() {
|
||||
// prevent value inserted on focus
|
||||
return false;
|
||||
},
|
||||
select: function( event, ui ) {
|
||||
var terms = split( this.value );
|
||||
// remove the current input
|
||||
terms.pop();
|
||||
// add the selected item
|
||||
terms.push( ui.item.value );
|
||||
// add placeholder to get the comma-and-space at the end
|
||||
//terms.push( "" );
|
||||
this.value = terms.join( ", " );
|
||||
return false;
|
||||
},
|
||||
selectFirst: true
|
||||
});
|
||||
},
|
||||
setup_behavior: function () {
|
||||
/* main menu */
|
||||
$('ul.sf-menu').superfish({
|
||||
|
|
@ -168,16 +266,6 @@ var TracksPages = {
|
|||
|
||||
/* fade flashes and alerts in automatically */
|
||||
$(".alert").fadeOut(8000);
|
||||
|
||||
/* for edit project form and edit todo form
|
||||
* TODO: refactor to separate calls from project and todo */
|
||||
$('.edit-form a.negative').live('click', function(){
|
||||
$(this).parents('.edit-form').fadeOut(200, function () {
|
||||
$(this).parents('.list').find('.project').fadeIn(500);
|
||||
$(this).parents('.container').find('.item-show').fadeIn(500);
|
||||
})
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -265,7 +353,7 @@ var TodoItems = {
|
|||
getContextsForAutocomplete: function (term, element_to_block) {
|
||||
var allContexts = null;
|
||||
var params = default_ajax_options_for_scripts('GET', relative_to_root('contexts.autocomplete'), element_to_block);
|
||||
params.data = "term="+term;
|
||||
params.data += "&term="+term;
|
||||
params.dataType = "json";
|
||||
params.async = false;
|
||||
params.success = function(result){
|
||||
|
|
@ -286,6 +374,68 @@ var TodoItems = {
|
|||
}
|
||||
return confirm(i18n['contexts.new_context_pre'] + givenContextName + i18n['contexts.new_context_post']);
|
||||
},
|
||||
generate_predecessor: function(todo_id, todo_spec) {
|
||||
var img = "<img id=\"delete_dep_"+todo_id+"\" class=\"icon_delete_dep\" src=\""+ relative_to_root('images/blank.png') + "\">";
|
||||
var anchor = "<a class=\"icon_delete_dep\" id=\""+todo_id+"\" href=\"#\">" + img + "</a>";
|
||||
var li = "<li style=\"display:none\" id=\"pred_"+todo_id+"\">"+ anchor +" "+ todo_spec + "</li>";
|
||||
return li;
|
||||
},
|
||||
highlight_todo: function(id) {
|
||||
$(id).effect('highlight', {}, 2000, function(){ });
|
||||
},
|
||||
setup_autocomplete_for_predecessor: function() {
|
||||
$('input[name=predecessor_input]:not(.ac_input)')
|
||||
.bind( "keydown", function( event ) { // don't navigate away from the field on tab when selecting an item
|
||||
if ( event.keyCode === $.ui.keyCode.TAB &&
|
||||
$( this ).data( "autocomplete" ).menu.active ) {
|
||||
event.preventDefault();
|
||||
}
|
||||
})
|
||||
.autocomplete({
|
||||
minLength: 0,
|
||||
source: function( request, response ) {
|
||||
var term = request.term;
|
||||
if (term != "" && term != " ")
|
||||
$.getJSON( relative_to_root('auto_complete_for_predecessor'), {
|
||||
term: term
|
||||
}, response );
|
||||
},
|
||||
focus: function() {
|
||||
// prevent value inserted on focus
|
||||
return false;
|
||||
},
|
||||
select: function( event, ui ) {
|
||||
// retrieve values from input fields
|
||||
var todo_spec = ui.item.label
|
||||
var todo_id = ui.item.value
|
||||
var form = $(this).parents('form').get(0);
|
||||
var predecessor_list = $(form).find('input[name=predecessor_list]')
|
||||
var id_list = split( predecessor_list.val() );
|
||||
|
||||
// add the dependency to id list
|
||||
id_list.push( todo_id );
|
||||
predecessor_list.val( id_list.join( ", " ) );
|
||||
|
||||
// show the html for the list of deps
|
||||
$(form).find('ul#predecessor_ul').show();
|
||||
$(form).find("label#label_for_predecessor_input").show();
|
||||
if (todo_spec.length > 35 && form.id == "todo-form-new-action") {
|
||||
// cut off string only in new-todo-form
|
||||
todo_spec = todo_spec.substring(0,40)+"...";
|
||||
}
|
||||
// show the new dep in list
|
||||
var html = $(form).find('ul#predecessor_ul').html();
|
||||
var new_li = TodoItems.generate_predecessor(todo_id, todo_spec);
|
||||
$(form).find('ul#predecessor_ul').html(html + new_li);
|
||||
$(form).find('li#pred_'+todo_id).slideDown(500);
|
||||
|
||||
$(form).find('input[name=predecessor_input]').val('');
|
||||
$(form).find('input[name=predecessor_input]').focus();
|
||||
return false;
|
||||
},
|
||||
selectFirst: true
|
||||
});
|
||||
},
|
||||
setup_behavior: function() {
|
||||
/* show the notes of a todo */
|
||||
$(".show_notes").live('click', function () {
|
||||
|
|
@ -312,7 +462,12 @@ var TodoItems = {
|
|||
|
||||
/* set behavior for edit icon */
|
||||
$(".item-container a.edit_item").live('click', function (ev){
|
||||
get_with_ajax_and_block_element(this.href, $(this).parents(".item-container"));
|
||||
var ajax_options = default_ajax_options_for_scripts('GET', this.href, $(this).parents('.item-container'));
|
||||
var id = this.id.substr(15);
|
||||
ajax_options.complete.push( function(){
|
||||
TracksForm.generate_dependency_list(id);
|
||||
});
|
||||
$.ajax(ajax_options);
|
||||
return false;
|
||||
});
|
||||
|
||||
|
|
@ -320,7 +475,7 @@ var TodoItems = {
|
|||
$('.item-container a.icon_delete_item').live('click', function(evt){
|
||||
var confirm_message = $(this).attr("x_confirm_message")
|
||||
if(confirm(confirm_message)){
|
||||
delete_with_ajax_and_block_element(this.href, $(this).parents('.project'));
|
||||
delete_with_ajax_and_block_element(this.href, $(this).parents('.item-container'));
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
|
@ -331,6 +486,14 @@ var TodoItems = {
|
|||
return false;
|
||||
});
|
||||
|
||||
// for cancelling edit todo form
|
||||
$('form.edit_todo_form a.negative').live('click', function(){
|
||||
$(this).parents('.edit-form').fadeOut(200, function () {
|
||||
$(this).parents('.list').find('.project').fadeIn(500);
|
||||
$(this).parents('.container').find('.item-show').fadeIn(500);
|
||||
})
|
||||
});
|
||||
|
||||
// defer a todo
|
||||
$(".item-container a.icon_defer_item").live('click', function(ev){
|
||||
if ($(this).attr("x_defer_alert") == "true")
|
||||
|
|
@ -348,6 +511,26 @@ var TodoItems = {
|
|||
$.ajax(ajax_options);
|
||||
return false;
|
||||
});
|
||||
|
||||
TracksForm.enable_dependency_delete();
|
||||
}
|
||||
}
|
||||
|
||||
var ContextItems = {
|
||||
setup_autocomplete_for_contexts: function(id) {
|
||||
$(id).autocomplete({
|
||||
source: relative_to_root('contexts.autocomplete'),
|
||||
selectFirst: true
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
var ProjectItems = {
|
||||
setup_autocomplete_for_projects: function(id) {
|
||||
$(id).autocomplete({
|
||||
source: relative_to_root('projects.autocomplete'),
|
||||
selectFirst: true
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -444,6 +627,14 @@ var ProjectListPage = {
|
|||
return false;
|
||||
});
|
||||
|
||||
/* cancel edit project form */
|
||||
$('form.edit-project-form a.negative').live('click', function(){
|
||||
$(this).parents('.edit-form').fadeOut(200, function () {
|
||||
$(this).parents('.list').find('.project').fadeIn(500);
|
||||
$(this).parents('.container').find('.item-show').fadeIn(500);
|
||||
})
|
||||
});
|
||||
|
||||
/* submit project form after entering new project */
|
||||
$("form#project_form button.positive").live('click', function (ev) {
|
||||
submit_with_ajax_and_block_element('form.#project_form', $(this));
|
||||
|
|
@ -735,6 +926,13 @@ function setup_auto_refresh(interval){
|
|||
});
|
||||
}
|
||||
|
||||
function split( val ) {
|
||||
return val.split( /,\s*/ );
|
||||
}
|
||||
function extractLast( term ) {
|
||||
return split( term ).pop();
|
||||
}
|
||||
|
||||
$.fn.clearForm = function() {
|
||||
return this.each(function() {
|
||||
var type = this.type, tag = this.tagName.toLowerCase();
|
||||
|
|
@ -749,6 +947,13 @@ $.fn.clearForm = function() {
|
|||
});
|
||||
};
|
||||
|
||||
$.fn.clearDeps = function() {
|
||||
$('ul#predecessor_ul', this).hide();
|
||||
$("label#label_for_predecessor_input").hide();
|
||||
$('ul#predecessor_ul', this).html("");
|
||||
$('input[name=predecessor_list]').val("");
|
||||
}
|
||||
|
||||
/**************************************/
|
||||
/* Tracks AJAX functions */
|
||||
/**************************************/
|
||||
|
|
@ -758,24 +963,27 @@ function generic_get_script_for_list(element, getter, param){
|
|||
}
|
||||
|
||||
function default_ajax_options_for_submit(ajax_type, element_to_block) {
|
||||
// the complete is not a function but an array so you can push other
|
||||
// functions that will be executed after the ajax call completes
|
||||
var options = {
|
||||
type: ajax_type,
|
||||
async: true,
|
||||
context: element_to_block,
|
||||
data: "_source_view=" + SOURCE_VIEW,
|
||||
beforeSend: function() {
|
||||
// console.debug('data: '+this.data);
|
||||
if (this.context) {
|
||||
$(this.context).block({
|
||||
message: null
|
||||
});
|
||||
}
|
||||
},
|
||||
complete:function() {
|
||||
complete: [function() {
|
||||
if (this.context) {
|
||||
$(this.context).unblock();
|
||||
}
|
||||
enable_rich_interaction();
|
||||
},
|
||||
}],
|
||||
error: function(req, status) {
|
||||
TracksPages.page_notify('error', i18n['common.ajaxError']+': '+status, 8);
|
||||
}
|
||||
|
|
@ -829,17 +1037,21 @@ $(document).ajaxSend(function(event, request, settings) {
|
|||
}
|
||||
request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
|
||||
}
|
||||
request.setRequestHeader("X-CSRF-Token", $('meta[name=csrf-token]').attr('content'));
|
||||
request.setRequestHeader('X-CSRF-Token', $('meta[name=csrf-token]').attr('content'));
|
||||
request.setRequestHeader("Accept", "text/javascript");
|
||||
});
|
||||
|
||||
function setup_periodic_check(url_for_check, interval_in_sec, method) {
|
||||
var ajaxMethod = (method ? method : "GET");
|
||||
|
||||
function check_remote() {
|
||||
$.ajax(default_ajax_options_for_scripts(ajaxMethod, url_for_check, null));
|
||||
}
|
||||
setInterval(check_remote, interval_in_sec*1000);
|
||||
setInterval(
|
||||
function(){
|
||||
var settings = default_ajax_options_for_scripts( method ? method : "GET", url_for_check, null);
|
||||
if(typeof(AUTH_TOKEN) != 'undefined'){
|
||||
settings.data += "&authenticity_token=" + encodeURIComponent( AUTH_TOKEN )
|
||||
}
|
||||
$.ajax(settings);
|
||||
},
|
||||
interval_in_sec*1000
|
||||
);
|
||||
}
|
||||
|
||||
function update_order(event, ui){
|
||||
|
|
@ -894,117 +1106,27 @@ function enable_rich_interaction(){
|
|||
$('input.Date').datepicker({
|
||||
'dateFormat': dateFormat,
|
||||
'firstDay': weekStart,
|
||||
'showAnim': 'fold'
|
||||
'showButtonPanel': true,
|
||||
'showWeek': true,
|
||||
'changeMonth': true,
|
||||
'changeYear': true,
|
||||
'maxDate': '+5y',
|
||||
'minDate': '-1y',
|
||||
'showAnim': '' /* leave empty, see #1117 */
|
||||
});
|
||||
|
||||
/* Autocomplete */
|
||||
$('input[name=context_name]').autocomplete({
|
||||
source: relative_to_root('contexts.autocomplete'),
|
||||
selectFirst: true
|
||||
});
|
||||
$('input[name=project_name]').autocomplete({
|
||||
source: relative_to_root('projects.autocomplete'),
|
||||
selectFirst: true
|
||||
});
|
||||
$('input[name="project[default_context_name]"]').autocomplete({
|
||||
source: relative_to_root('contexts.autocomplete'),
|
||||
selectFirst: true
|
||||
});
|
||||
|
||||
$('input[name=tag_list]:not(.ac_input)')
|
||||
.bind( "keydown", function( event ) { // don't navigate away from the field on tab when selecting an item
|
||||
if ( event.keyCode === $.ui.keyCode.TAB &&
|
||||
$( this ).data( "autocomplete" ).menu.active ) {
|
||||
event.preventDefault();
|
||||
}
|
||||
})
|
||||
.autocomplete({
|
||||
minLength: 0,
|
||||
source: function( request, response ) {
|
||||
var last_term = extractLast( request.term );
|
||||
if (last_term != "" && last_term != " ")
|
||||
$.ajax( {
|
||||
url: relative_to_root('tags.autocomplete'),
|
||||
dataType: 'json',
|
||||
data: {
|
||||
term: last_term
|
||||
},
|
||||
success: function(data, textStatus, jqXHR) {
|
||||
// remove spinner as removing the class is not always done by response
|
||||
$('input[name=tag_list]').removeClass('ui-autocomplete-loading');
|
||||
response(data, textStatus, jqXHR); // call jquery callback to handle data
|
||||
}
|
||||
})
|
||||
else {
|
||||
// remove spinner as typing will always add the spinner
|
||||
$('input[name=tag_list]').removeClass('ui-autocomplete-loading');
|
||||
}
|
||||
},
|
||||
focus: function() {
|
||||
// prevent value inserted on focus
|
||||
return false;
|
||||
},
|
||||
select: function( event, ui ) {
|
||||
var terms = split( this.value );
|
||||
// remove the current input
|
||||
terms.pop();
|
||||
// add the selected item
|
||||
terms.push( ui.item.value );
|
||||
// add placeholder to get the comma-and-space at the end
|
||||
//terms.push( "" );
|
||||
this.value = terms.join( ", " );
|
||||
return false;
|
||||
},
|
||||
selectFirst: true
|
||||
});
|
||||
|
||||
|
||||
function split( val ) {
|
||||
return val.split( /,\s*/ );
|
||||
}
|
||||
function extractLast( term ) {
|
||||
return split( term ).pop();
|
||||
}
|
||||
|
||||
|
||||
$('input[name=predecessor_list]:not(.ac_input)')
|
||||
.bind( "keydown", function( event ) { // don't navigate away from the field on tab when selecting an item
|
||||
if ( event.keyCode === $.ui.keyCode.TAB &&
|
||||
$( this ).data( "autocomplete" ).menu.active ) {
|
||||
event.preventDefault();
|
||||
}
|
||||
})
|
||||
.autocomplete({
|
||||
minLength: 0,
|
||||
source: function( request, response ) {
|
||||
var last_term = extractLast( request.term );
|
||||
if (last_term != "" && last_term != " ")
|
||||
$.getJSON( relative_to_root('auto_complete_for_predecessor'), {
|
||||
term: last_term
|
||||
}, response );
|
||||
},
|
||||
focus: function() {
|
||||
// prevent value inserted on focus
|
||||
return false;
|
||||
},
|
||||
select: function( event, ui ) {
|
||||
var terms = split( this.value );
|
||||
// remove the current input
|
||||
terms.pop();
|
||||
// add the selected item
|
||||
terms.push( ui.item.value );
|
||||
// add placeholder to get the comma-and-space at the end
|
||||
//terms.push( "" );
|
||||
this.value = terms.join( ", " );
|
||||
return false;
|
||||
}
|
||||
});
|
||||
ProjectItems.setup_autocomplete_for_projects('input[name=project_name]');
|
||||
ContextItems.setup_autocomplete_for_contexts('input[name=context_name]');
|
||||
ContextItems.setup_autocomplete_for_contexts('input[id="project_default_context_name"]');
|
||||
TracksPages.setup_autocomplete_for_tag_list('input[name=tag_list]');
|
||||
TracksPages.setup_autocomplete_for_tag_list('input[id="project_default_tags"]');
|
||||
TodoItems.setup_autocomplete_for_predecessor();
|
||||
|
||||
/* have to bind on keypress because of limitations of live() */
|
||||
$('input[name=project_name]').live('keypress', function(){
|
||||
$(this).bind('blur', project_defaults);
|
||||
});
|
||||
|
||||
$('input[name=context_name]').live('keypress', function(){
|
||||
$(this).attr('edited', 'true');
|
||||
});
|
||||
|
|
@ -1018,15 +1140,10 @@ function enable_rich_interaction(){
|
|||
var dropped_todo = this.id.split('_')[2];
|
||||
ui.draggable.remove();
|
||||
$('.drop_target').hide(); // IE8 doesn't call stop() in this situation
|
||||
$(this).block({
|
||||
message: null
|
||||
});
|
||||
$.post(relative_to_root('todos/add_predecessor'),
|
||||
{
|
||||
successor: dragged_todo,
|
||||
predecessor: dropped_todo
|
||||
},
|
||||
null, 'script');
|
||||
|
||||
ajax_options = default_ajax_options_for_scripts('POST', relative_to_root('todos/add_predecessor'), $(this));
|
||||
ajax_options.data += "&predecessor="+dropped_todo + "&successor="+dragged_todo
|
||||
$.ajax(ajax_options);
|
||||
}
|
||||
|
||||
function drag_todo(){
|
||||
|
|
@ -1082,7 +1199,7 @@ function enable_rich_interaction(){
|
|||
field_touched = false;
|
||||
|
||||
/* shrink the notes on the project pages. This is not live(), so this needs
|
||||
* to be run after ajax adding of a new note */
|
||||
* to be run after ajax adding of a new note */
|
||||
$('.note_wrapper').truncate({
|
||||
max_length: 90,
|
||||
more: '',
|
||||
|
|
|
|||
23
public/javascripts/i18n/jquery.ui.datepicker-de.js
vendored
Normal file
23
public/javascripts/i18n/jquery.ui.datepicker-de.js
vendored
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
/* German initialisation for the jQuery UI date picker plugin. */
|
||||
/* Written by Milian Wolff (mail@milianw.de). */
|
||||
jQuery(function($){
|
||||
$.datepicker.regional['de'] = {
|
||||
closeText: 'schließen',
|
||||
prevText: '<zurück',
|
||||
nextText: 'Vor>',
|
||||
currentText: 'heute',
|
||||
monthNames: ['Januar','Februar','März','April','Mai','Juni',
|
||||
'Juli','August','September','Oktober','November','Dezember'],
|
||||
monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun',
|
||||
'Jul','Aug','Sep','Okt','Nov','Dez'],
|
||||
dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
|
||||
dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
|
||||
dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
|
||||
weekHeader: 'Wo',
|
||||
dateFormat: 'dd.mm.yy',
|
||||
firstDay: 1,
|
||||
isRTL: false,
|
||||
showMonthAfterYear: false,
|
||||
yearSuffix: ''};
|
||||
$.datepicker.setDefaults($.datepicker.regional['de']);
|
||||
});
|
||||
23
public/javascripts/i18n/jquery.ui.datepicker-nl.js
vendored
Normal file
23
public/javascripts/i18n/jquery.ui.datepicker-nl.js
vendored
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */
|
||||
/* Written by Mathias Bynens <http://mathiasbynens.be/> */
|
||||
jQuery(function($){
|
||||
$.datepicker.regional['nl'] = {
|
||||
closeText: 'Sluiten',
|
||||
prevText: '←',
|
||||
nextText: '→',
|
||||
currentText: 'Vandaag',
|
||||
monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni',
|
||||
'juli', 'augustus', 'september', 'oktober', 'november', 'december'],
|
||||
monthNamesShort: ['jan', 'feb', 'maa', 'apr', 'mei', 'jun',
|
||||
'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],
|
||||
dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
|
||||
dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'],
|
||||
dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
|
||||
weekHeader: 'Wk',
|
||||
dateFormat: 'dd-mm-yy',
|
||||
firstDay: 1,
|
||||
isRTL: false,
|
||||
showMonthAfterYear: false,
|
||||
yearSuffix: ''};
|
||||
$.datepicker.setDefaults($.datepicker.regional['nl']);
|
||||
});
|
||||
16
public/javascripts/jquery-1.5.1.min.js
vendored
Normal file
16
public/javascripts/jquery-1.5.1.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
public/javascripts/jquery-1.5.min.js
vendored
16
public/javascripts/jquery-1.5.min.js
vendored
File diff suppressed because one or more lines are too long
|
|
@ -1,5 +1,5 @@
|
|||
/*!
|
||||
* jQuery UI 1.8.9
|
||||
* jQuery UI 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -7,7 +7,7 @@
|
|||
*
|
||||
* http://docs.jquery.com/UI
|
||||
*/
|
||||
(function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.9",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,
|
||||
(function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.10",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,
|
||||
NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,
|
||||
"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");
|
||||
if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f,
|
||||
|
|
@ -16,7 +16,7 @@ d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c
|
|||
c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&&
|
||||
b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&c.ui.isOverAxis(b,e,i)}})}})(jQuery);
|
||||
;/*!
|
||||
* jQuery UI Widget 1.8.9
|
||||
* jQuery UI Widget 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -31,7 +31,7 @@ this._getCreateOptions(),a);var d=this;this.element.bind("remove."+this.widgetNa
|
|||
widget:function(){return this.element},option:function(a,c){var d=a;if(arguments.length===0)return b.extend({},this.options);if(typeof a==="string"){if(c===j)return this.options[a];d={};d[a]=c}this._setOptions(d);return this},_setOptions:function(a){var c=this;b.each(a,function(d,e){c._setOption(d,e)});return this},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},
|
||||
enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a=b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery);
|
||||
;/*!
|
||||
* jQuery UI Mouse 1.8.9
|
||||
* jQuery UI Mouse 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -48,7 +48,7 @@ this._mouseStart(a)!==false;if(!this._mouseStarted){a.preventDefault();return tr
|
|||
return a.preventDefault()}if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;a.target==this._mouseDownEvent.target&&c.data(a.target,this.widgetName+".preventClickEvent",
|
||||
true);this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery);
|
||||
;/*
|
||||
* jQuery UI Position 1.8.9
|
||||
* jQuery UI Position 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -64,7 +64,7 @@ d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a)
|
|||
a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d=c(b),
|
||||
g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery);
|
||||
;/*
|
||||
* jQuery UI Draggable 1.8.9
|
||||
* jQuery UI Draggable 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -96,7 +96,7 @@ f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent
|
|||
if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.left<this.containment[0])e=this.containment[0]+this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+this.offset.click.top;if(a.pageX-this.offset.click.left>this.containment[2])e=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/
|
||||
b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;e=this.originalPageX+Math.round((e-this.originalPageX)/b.grid[0])*b.grid[0];e=this.containment?!(e-this.offset.click.left<this.containment[0]||e-this.offset.click.left>this.containment[2])?e:!(e-this.offset.click.left<this.containment[0])?e-b.grid[0]:e+b.grid[0]:e}}return{top:g-this.offset.click.top-
|
||||
this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop()),left:e-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");this.helper[0]!=
|
||||
this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove();this.helper=null;this.cancelHelperRemoval=false},_trigger:function(a,b,c){c=c||this._uiHash();d.ui.plugin.call(this,a,[b,c]);if(a=="drag")this.positionAbs=this._convertPositionTo("absolute");return d.Widget.prototype._trigger.call(this,a,b,c)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}});d.extend(d.ui.draggable,{version:"1.8.9"});
|
||||
this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove();this.helper=null;this.cancelHelperRemoval=false},_trigger:function(a,b,c){c=c||this._uiHash();d.ui.plugin.call(this,a,[b,c]);if(a=="drag")this.positionAbs=this._convertPositionTo("absolute");return d.Widget.prototype._trigger.call(this,a,b,c)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}});d.extend(d.ui.draggable,{version:"1.8.10"});
|
||||
d.ui.plugin.add("draggable","connectToSortable",{start:function(a,b){var c=d(this).data("draggable"),f=c.options,e=d.extend({},b,{item:c.element});c.sortables=[];d(f.connectToSortable).each(function(){var g=d.data(this,"sortable");if(g&&!g.options.disabled){c.sortables.push({instance:g,shouldRevert:g.options.revert});g._refreshItems();g._trigger("activate",a,e)}})},stop:function(a,b){var c=d(this).data("draggable"),f=d.extend({},b,{item:c.element});d.each(c.sortables,function(){if(this.instance.isOver){this.instance.isOver=
|
||||
0;c.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert)this.instance.options.revert=true;this.instance._mouseStop(a);this.instance.options.helper=this.instance.options._helper;c.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})}else{this.instance.cancelHelperRemoval=false;this.instance._trigger("deactivate",a,f)}})},drag:function(a,b){var c=d(this).data("draggable"),f=this;d.each(c.sortables,function(){this.instance.positionAbs=
|
||||
c.positionAbs;this.instance.helperProportions=c.helperProportions;this.instance.offset.click=c.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;this.instance.currentItem=d(f).clone().appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return b.helper[0]};a.target=this.instance.currentItem[0];this.instance._mouseCapture(a,
|
||||
|
|
@ -114,7 +114,7 @@ left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",
|
|||
a,d.extend(c._uiHash(),{snapItem:c.snapElements[h].item}));c.snapElements[h].snapping=false}}}});d.ui.plugin.add("draggable","stack",{start:function(){var a=d(this).data("draggable").options;a=d.makeArray(d(a.stack)).sort(function(c,f){return(parseInt(d(c).css("zIndex"),10)||0)-(parseInt(d(f).css("zIndex"),10)||0)});if(a.length){var b=parseInt(a[0].style.zIndex)||0;d(a).each(function(c){this.style.zIndex=b+c});this[0].style.zIndex=b+a.length}}});d.ui.plugin.add("draggable","zIndex",{start:function(a,
|
||||
b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("zIndex"))b._zIndex=a.css("zIndex");a.css("zIndex",b.zIndex)},stop:function(a,b){a=d(this).data("draggable").options;a._zIndex&&d(b.helper).css("zIndex",a._zIndex)}})})(jQuery);
|
||||
;/*
|
||||
* jQuery UI Droppable 1.8.9
|
||||
* jQuery UI Droppable 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -133,14 +133,14 @@ a.addClasses&&this.element.addClass("ui-droppable")},destroy:function(){for(var
|
|||
this.element.addClass(this.options.activeClass);b&&this._trigger("activate",a,this.ui(b))},_deactivate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass);b&&this._trigger("deactivate",a,this.ui(b))},_over:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.addClass(this.options.hoverClass);
|
||||
this._trigger("over",a,this.ui(b))}},_out:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("out",a,this.ui(b))}},_drop:function(a,b){var c=b||d.ui.ddmanager.current;if(!c||(c.currentItem||c.element)[0]==this.element[0])return false;var e=false;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var g=
|
||||
d.data(this,"droppable");if(g.options.greedy&&!g.options.disabled&&g.options.scope==c.options.scope&&g.accept.call(g.element[0],c.currentItem||c.element)&&d.ui.intersect(c,d.extend(g,{offset:g.element.offset()}),g.options.tolerance)){e=true;return false}});if(e)return false;if(this.accept.call(this.element[0],c.currentItem||c.element)){this.options.activeClass&&this.element.removeClass(this.options.activeClass);this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("drop",
|
||||
a,this.ui(c));return this.element}return false},ui:function(a){return{draggable:a.currentItem||a.element,helper:a.helper,position:a.position,offset:a.positionAbs}}});d.extend(d.ui.droppable,{version:"1.8.9"});d.ui.intersect=function(a,b,c){if(!b.offset)return false;var e=(a.positionAbs||a.position.absolute).left,g=e+a.helperProportions.width,f=(a.positionAbs||a.position.absolute).top,h=f+a.helperProportions.height,i=b.offset.left,k=i+b.proportions.width,j=b.offset.top,l=j+b.proportions.height;
|
||||
a,this.ui(c));return this.element}return false},ui:function(a){return{draggable:a.currentItem||a.element,helper:a.helper,position:a.position,offset:a.positionAbs}}});d.extend(d.ui.droppable,{version:"1.8.10"});d.ui.intersect=function(a,b,c){if(!b.offset)return false;var e=(a.positionAbs||a.position.absolute).left,g=e+a.helperProportions.width,f=(a.positionAbs||a.position.absolute).top,h=f+a.helperProportions.height,i=b.offset.left,k=i+b.proportions.width,j=b.offset.top,l=j+b.proportions.height;
|
||||
switch(c){case "fit":return i<=e&&g<=k&&j<=f&&h<=l;case "intersect":return i<e+a.helperProportions.width/2&&g-a.helperProportions.width/2<k&&j<f+a.helperProportions.height/2&&h-a.helperProportions.height/2<l;case "pointer":return d.ui.isOver((a.positionAbs||a.position.absolute).top+(a.clickOffset||a.offset.click).top,(a.positionAbs||a.position.absolute).left+(a.clickOffset||a.offset.click).left,j,i,b.proportions.height,b.proportions.width);case "touch":return(f>=j&&f<=l||h>=j&&h<=l||f<j&&h>l)&&(e>=
|
||||
i&&e<=k||g>=i&&g<=k||e<i&&g>k);default:return false}};d.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(a,b){var c=d.ui.ddmanager.droppables[a.options.scope]||[],e=b?b.type:null,g=(a.currentItem||a.element).find(":data(droppable)").andSelf(),f=0;a:for(;f<c.length;f++)if(!(c[f].options.disabled||a&&!c[f].accept.call(c[f].element[0],a.currentItem||a.element))){for(var h=0;h<g.length;h++)if(g[h]==c[f].element[0]){c[f].proportions.height=0;continue a}c[f].visible=c[f].element.css("display")!=
|
||||
"none";if(c[f].visible){c[f].offset=c[f].element.offset();c[f].proportions={width:c[f].element[0].offsetWidth,height:c[f].element[0].offsetHeight};e=="mousedown"&&c[f]._activate.call(c[f],b)}}},drop:function(a,b){var c=false;d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(this.options){if(!this.options.disabled&&this.visible&&d.ui.intersect(a,this,this.options.tolerance))c=c||this._drop.call(this,b);if(!this.options.disabled&&this.visible&&this.accept.call(this.element[0],a.currentItem||
|
||||
a.element)){this.isout=1;this.isover=0;this._deactivate.call(this,b)}}});return c},drag:function(a,b){a.options.refreshPositions&&d.ui.ddmanager.prepareOffsets(a,b);d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(!(this.options.disabled||this.greedyChild||!this.visible)){var c=d.ui.intersect(a,this,this.options.tolerance);if(c=!c&&this.isover==1?"isout":c&&this.isover==0?"isover":null){var e;if(this.options.greedy){var g=this.element.parents(":data(droppable):eq(0)");if(g.length){e=
|
||||
d.data(g[0],"droppable");e.greedyChild=c=="isover"?1:0}}if(e&&c=="isover"){e.isover=0;e.isout=1;e._out.call(e,b)}this[c]=1;this[c=="isout"?"isover":"isout"]=0;this[c=="isover"?"_over":"_out"].call(this,b);if(e&&c=="isout"){e.isout=0;e.isover=1;e._over.call(e,b)}}}})}}})(jQuery);
|
||||
;/*
|
||||
* jQuery UI Resizable 1.8.9
|
||||
* jQuery UI Resizable 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -165,29 +165,29 @@ d=this.element;this.resizing=true;this.documentScroll={top:e(document).scrollTop
|
|||
this.helper.offset();this.position={left:c,top:f};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:c,top:f};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio:
|
||||
this.originalSize.width/this.originalSize.height||1;a=e(".ui-resizable-"+this.axis).css("cursor");e("body").css("cursor",a=="auto"?this.axis+"-resize":a);d.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,d=this._change[this.axis];if(!d)return false;c=d.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize",
|
||||
b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false},_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var d=this._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName);d=f&&e.ui.hasScroll(d[0],"left")?0:c.sizeDiff.height;
|
||||
f={width:c.size.width-(f?0:c.sizeDiff.width),height:c.size.height-d};d=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var g=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(e.extend(f,{top:g,left:d}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}e("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",
|
||||
b);this._helper&&this.helper.remove();return false},_updateCache:function(b){this.offset=this.helper.offset();if(l(b.left))this.position.left=b.left;if(l(b.top))this.position.top=b.top;if(l(b.height))this.size.height=b.height;if(l(b.width))this.size.width=b.width},_updateRatio:function(b){var a=this.position,c=this.size,d=this.axis;if(b.height)b.width=c.height*this.aspectRatio;else if(b.width)b.height=c.width/this.aspectRatio;if(d=="sw"){b.left=a.left+(c.width-b.width);b.top=null}if(d=="nw"){b.top=
|
||||
a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this.options,c=this.axis,d=l(b.width)&&a.maxWidth&&a.maxWidth<b.width,f=l(b.height)&&a.maxHeight&&a.maxHeight<b.height,g=l(b.width)&&a.minWidth&&a.minWidth>b.width,h=l(b.height)&&a.minHeight&&a.minHeight>b.height;if(g)b.width=a.minWidth;if(h)b.height=a.minHeight;if(d)b.width=a.maxWidth;if(f)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+this.size.height,
|
||||
k=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(g&&k)b.left=i-a.minWidth;if(d&&k)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(f&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a<this._proportionallyResizeElements.length;a++){var c=this._proportionallyResizeElements[a];if(!this.borderDif){var d=[c.css("borderTopWidth"),
|
||||
c.css("borderRightWidth"),c.css("borderBottomWidth"),c.css("borderLeftWidth")],f=[c.css("paddingTop"),c.css("paddingRight"),c.css("paddingBottom"),c.css("paddingLeft")];this.borderDif=e.map(d,function(g,h){g=parseInt(g,10)||0;h=parseInt(f[h],10)||0;return g+h})}e.browser.msie&&(e(b).is(":hidden")||e(b).parents(":hidden").length)||c.css({height:b.height()-this.borderDif[0]-this.borderDif[2]||0,width:b.width()-this.borderDif[1]-this.borderDif[3]||0})}},_renderProxy:function(){var b=this.options;this.elementOffset=
|
||||
this.element.offset();if(this._helper){this.helper=this.helper||e('<div style="overflow:hidden;"></div>');var a=e.browser.msie&&e.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,a){return{width:this.originalSize.width+
|
||||
a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+c}},se:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,c]))},ne:function(b,a,c){return e.extend(this._change.n.apply(this,
|
||||
arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){e.ui.plugin.call(this,b,[a,this.ui()]);b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});e.extend(e.ui.resizable,
|
||||
{version:"1.8.9"});e.ui.plugin.add("resizable","alsoResize",{start:function(){var b=e(this).data("resizable").options,a=function(c){e(c).each(function(){var d=e(this);d.data("resizable-alsoresize",{width:parseInt(d.width(),10),height:parseInt(d.height(),10),left:parseInt(d.css("left"),10),top:parseInt(d.css("top"),10),position:d.css("position")})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=b.alsoResize[0];a(b.alsoResize)}else e.each(b.alsoResize,
|
||||
function(c){a(c)});else a(b.alsoResize)},resize:function(b,a){var c=e(this).data("resizable");b=c.options;var d=c.originalSize,f=c.originalPosition,g={height:c.size.height-d.height||0,width:c.size.width-d.width||0,top:c.position.top-f.top||0,left:c.position.left-f.left||0},h=function(i,j){e(i).each(function(){var k=e(this),q=e(this).data("resizable-alsoresize"),p={},r=j&&j.length?j:k.parents(a.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(r,function(n,o){if((n=
|
||||
(q[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(e.browser.opera&&/relative/.test(k.css("position"))){c._revertToRelativePosition=true;k.css({position:"absolute",top:"auto",left:"auto"})}k.css(p)})};typeof b.alsoResize=="object"&&!b.alsoResize.nodeType?e.each(b.alsoResize,function(i,j){h(i,j)}):h(b.alsoResize)},stop:function(){var b=e(this).data("resizable"),a=b.options,c=function(d){e(d).each(function(){var f=e(this);f.css({position:f.data("resizable-alsoresize").position})})};if(b._revertToRelativePosition){b._revertToRelativePosition=
|
||||
false;typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?e.each(a.alsoResize,function(d){c(d)}):c(a.alsoResize)}e(this).removeData("resizable-alsoresize")}});e.ui.plugin.add("resizable","animate",{stop:function(b){var a=e(this).data("resizable"),c=a.options,d=a._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName),g=f&&e.ui.hasScroll(d[0],"left")?0:a.sizeDiff.height;f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height-g};g=parseInt(a.element.css("left"),10)+(a.position.left-
|
||||
a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(e.extend(f,h&&g?{top:h,left:g}:{}),{duration:c.animateDuration,easing:c.animateEasing,step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};d&&d.length&&e(d[0]).css({width:i.width,height:i.height});a._updateCache(i);a._propagate("resize",
|
||||
b)}})}});e.ui.plugin.add("resizable","containment",{start:function(){var b=e(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof e?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement=e(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}}else{var d=e(a),f=[];e(["Top",
|
||||
"Right","Left","Bottom"]).each(function(i,j){f[i]=m(d.css("padding"+j))});b.containerOffset=d.offset();b.containerPosition=d.position();b.containerSize={height:d.innerHeight()-f[3],width:d.innerWidth()-f[1]};c=b.containerOffset;var g=b.containerSize.height,h=b.containerSize.width;h=e.ui.hasScroll(a,"left")?a.scrollWidth:h;g=e.ui.hasScroll(a)?a.scrollHeight:g;b.parentData={element:a,left:c.left,top:c.top,width:h,height:g}}}},resize:function(b){var a=e(this).data("resizable"),c=a.options,d=a.containerOffset,
|
||||
f=a.position;b=a._aspectRatio||b.shiftKey;var g={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))g=d;if(f.left<(a._helper?d.left:0)){a.size.width+=a._helper?a.position.left-d.left:a.position.left-g.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?d.left:0}if(f.top<(a._helper?d.top:0)){a.size.height+=a._helper?a.position.top-d.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?d.top:0}a.offset.left=
|
||||
a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-g.left:a.offset.left-g.left)+a.sizeDiff.width);d=Math.abs((a._helper?a.offset.top-g.top:a.offset.top-d.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);g=/relative|absolute/.test(a.containerElement.css("position"));if(f&&g)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=a.size.width/a.aspectRatio}if(d+
|
||||
a.size.height>=a.parentData.height){a.size.height=a.parentData.height-d;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=e(this).data("resizable"),a=b.options,c=b.containerOffset,d=b.containerPosition,f=b.containerElement,g=e(b.helper),h=g.offset(),i=g.outerWidth()-b.sizeDiff.width;g=g.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g});b._helper&&!a.animate&&/static/.test(f.css("position"))&&
|
||||
e(this).css({left:h.left-d.left-c.left,width:i,height:g})}});e.ui.plugin.add("resizable","ghost",{start:function(){var b=e(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25,display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=e(this).data("resizable");b.ghost&&b.ghost.css({position:"relative",
|
||||
height:b.size.height,width:b.size.width})},stop:function(){var b=e(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});e.ui.plugin.add("resizable","grid",{resize:function(){var b=e(this).data("resizable"),a=b.options,c=b.size,d=b.originalSize,f=b.originalPosition,g=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-d.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-d.height)/(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(g)){b.size.width=
|
||||
d.width+h;b.size.height=d.height+a}else if(/^(ne)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}else{if(/^(sw)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else{b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}b.position.left=f.left-h}}});var m=function(b){return parseInt(b,10)||0},l=function(b){return!isNaN(parseInt(b,10))}})(jQuery);
|
||||
f=f?0:c.sizeDiff.width;f={width:c.helper.width()-f,height:c.helper.height()-d};d=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var g=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(e.extend(f,{top:g,left:d}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}e("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");
|
||||
this._propagate("stop",b);this._helper&&this.helper.remove();return false},_updateCache:function(b){this.offset=this.helper.offset();if(l(b.left))this.position.left=b.left;if(l(b.top))this.position.top=b.top;if(l(b.height))this.size.height=b.height;if(l(b.width))this.size.width=b.width},_updateRatio:function(b){var a=this.position,c=this.size,d=this.axis;if(b.height)b.width=c.height*this.aspectRatio;else if(b.width)b.height=c.width/this.aspectRatio;if(d=="sw"){b.left=a.left+(c.width-b.width);b.top=
|
||||
null}if(d=="nw"){b.top=a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this.options,c=this.axis,d=l(b.width)&&a.maxWidth&&a.maxWidth<b.width,f=l(b.height)&&a.maxHeight&&a.maxHeight<b.height,g=l(b.width)&&a.minWidth&&a.minWidth>b.width,h=l(b.height)&&a.minHeight&&a.minHeight>b.height;if(g)b.width=a.minWidth;if(h)b.height=a.minHeight;if(d)b.width=a.maxWidth;if(f)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+
|
||||
this.size.height,k=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(g&&k)b.left=i-a.minWidth;if(d&&k)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(f&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a<this._proportionallyResizeElements.length;a++){var c=this._proportionallyResizeElements[a];if(!this.borderDif){var d=
|
||||
[c.css("borderTopWidth"),c.css("borderRightWidth"),c.css("borderBottomWidth"),c.css("borderLeftWidth")],f=[c.css("paddingTop"),c.css("paddingRight"),c.css("paddingBottom"),c.css("paddingLeft")];this.borderDif=e.map(d,function(g,h){g=parseInt(g,10)||0;h=parseInt(f[h],10)||0;return g+h})}e.browser.msie&&(e(b).is(":hidden")||e(b).parents(":hidden").length)||c.css({height:b.height()-this.borderDif[0]-this.borderDif[2]||0,width:b.width()-this.borderDif[1]-this.borderDif[3]||0})}},_renderProxy:function(){var b=
|
||||
this.options;this.elementOffset=this.element.offset();if(this._helper){this.helper=this.helper||e('<div style="overflow:hidden;"></div>');var a=e.browser.msie&&e.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,
|
||||
a){return{width:this.originalSize.width+a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+c}},se:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,
|
||||
c]))},ne:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){e.ui.plugin.call(this,b,[a,this.ui()]);b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,
|
||||
originalPosition:this.originalPosition}}});e.extend(e.ui.resizable,{version:"1.8.10"});e.ui.plugin.add("resizable","alsoResize",{start:function(){var b=e(this).data("resizable").options,a=function(c){e(c).each(function(){var d=e(this);d.data("resizable-alsoresize",{width:parseInt(d.width(),10),height:parseInt(d.height(),10),left:parseInt(d.css("left"),10),top:parseInt(d.css("top"),10),position:d.css("position")})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=
|
||||
b.alsoResize[0];a(b.alsoResize)}else e.each(b.alsoResize,function(c){a(c)});else a(b.alsoResize)},resize:function(b,a){var c=e(this).data("resizable");b=c.options;var d=c.originalSize,f=c.originalPosition,g={height:c.size.height-d.height||0,width:c.size.width-d.width||0,top:c.position.top-f.top||0,left:c.position.left-f.left||0},h=function(i,j){e(i).each(function(){var k=e(this),q=e(this).data("resizable-alsoresize"),p={},r=j&&j.length?j:k.parents(a.originalElement[0]).length?["width","height"]:["width",
|
||||
"height","top","left"];e.each(r,function(n,o){if((n=(q[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(e.browser.opera&&/relative/.test(k.css("position"))){c._revertToRelativePosition=true;k.css({position:"absolute",top:"auto",left:"auto"})}k.css(p)})};typeof b.alsoResize=="object"&&!b.alsoResize.nodeType?e.each(b.alsoResize,function(i,j){h(i,j)}):h(b.alsoResize)},stop:function(){var b=e(this).data("resizable"),a=b.options,c=function(d){e(d).each(function(){var f=e(this);f.css({position:f.data("resizable-alsoresize").position})})};
|
||||
if(b._revertToRelativePosition){b._revertToRelativePosition=false;typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?e.each(a.alsoResize,function(d){c(d)}):c(a.alsoResize)}e(this).removeData("resizable-alsoresize")}});e.ui.plugin.add("resizable","animate",{stop:function(b){var a=e(this).data("resizable"),c=a.options,d=a._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName),g=f&&e.ui.hasScroll(d[0],"left")?0:a.sizeDiff.height;f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height-
|
||||
g};g=parseInt(a.element.css("left"),10)+(a.position.left-a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(e.extend(f,h&&g?{top:h,left:g}:{}),{duration:c.animateDuration,easing:c.animateEasing,step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};d&&d.length&&e(d[0]).css({width:i.width,
|
||||
height:i.height});a._updateCache(i);a._propagate("resize",b)}})}});e.ui.plugin.add("resizable","containment",{start:function(){var b=e(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof e?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement=e(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}}else{var d=
|
||||
e(a),f=[];e(["Top","Right","Left","Bottom"]).each(function(i,j){f[i]=m(d.css("padding"+j))});b.containerOffset=d.offset();b.containerPosition=d.position();b.containerSize={height:d.innerHeight()-f[3],width:d.innerWidth()-f[1]};c=b.containerOffset;var g=b.containerSize.height,h=b.containerSize.width;h=e.ui.hasScroll(a,"left")?a.scrollWidth:h;g=e.ui.hasScroll(a)?a.scrollHeight:g;b.parentData={element:a,left:c.left,top:c.top,width:h,height:g}}}},resize:function(b){var a=e(this).data("resizable"),c=a.options,
|
||||
d=a.containerOffset,f=a.position;b=a._aspectRatio||b.shiftKey;var g={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))g=d;if(f.left<(a._helper?d.left:0)){a.size.width+=a._helper?a.position.left-d.left:a.position.left-g.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?d.left:0}if(f.top<(a._helper?d.top:0)){a.size.height+=a._helper?a.position.top-d.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?
|
||||
d.top:0}a.offset.left=a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-g.left:a.offset.left-g.left)+a.sizeDiff.width);d=Math.abs((a._helper?a.offset.top-g.top:a.offset.top-d.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);g=/relative|absolute/.test(a.containerElement.css("position"));if(f&&g)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=
|
||||
a.size.width/a.aspectRatio}if(d+a.size.height>=a.parentData.height){a.size.height=a.parentData.height-d;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=e(this).data("resizable"),a=b.options,c=b.containerOffset,d=b.containerPosition,f=b.containerElement,g=e(b.helper),h=g.offset(),i=g.outerWidth()-b.sizeDiff.width;g=g.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g});b._helper&&!a.animate&&
|
||||
/static/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g})}});e.ui.plugin.add("resizable","ghost",{start:function(){var b=e(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25,display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=e(this).data("resizable");
|
||||
b.ghost&&b.ghost.css({position:"relative",height:b.size.height,width:b.size.width})},stop:function(){var b=e(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});e.ui.plugin.add("resizable","grid",{resize:function(){var b=e(this).data("resizable"),a=b.options,c=b.size,d=b.originalSize,f=b.originalPosition,g=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-d.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-d.height)/
|
||||
(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else if(/^(ne)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}else{if(/^(sw)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else{b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}b.position.left=f.left-h}}});var m=function(b){return parseInt(b,10)||0},l=function(b){return!isNaN(parseInt(b,10))}})(jQuery);
|
||||
;/*
|
||||
* jQuery UI Selectable 1.8.9
|
||||
* jQuery UI Selectable 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -207,9 +207,9 @@ c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){va
|
|||
this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.right<b||a.top>i||a.bottom<g);else if(d.tolerance=="fit")k=a.left>b&&a.right<h&&a.top>g&&a.bottom<i;if(k){if(a.selected){a.$element.removeClass("ui-selected");a.selected=false}if(a.unselecting){a.$element.removeClass("ui-unselecting");
|
||||
a.unselecting=false}if(!a.selecting){a.$element.addClass("ui-selecting");a.selecting=true;f._trigger("selecting",c,{selecting:a.element})}}else{if(a.selecting)if(c.metaKey&&a.startselected){a.$element.removeClass("ui-selecting");a.selecting=false;a.$element.addClass("ui-selected");a.selected=true}else{a.$element.removeClass("ui-selecting");a.selecting=false;if(a.startselected){a.$element.addClass("ui-unselecting");a.unselecting=true}f._trigger("unselecting",c,{unselecting:a.element})}if(a.selected)if(!c.metaKey&&
|
||||
!a.startselected){a.$element.removeClass("ui-selected");a.selected=false;a.$element.addClass("ui-unselecting");a.unselecting=true;f._trigger("unselecting",c,{unselecting:a.element})}}}});return false}},_mouseStop:function(c){var f=this;this.dragged=false;e(".ui-unselecting",this.element[0]).each(function(){var d=e.data(this,"selectable-item");d.$element.removeClass("ui-unselecting");d.unselecting=false;d.startselected=false;f._trigger("unselected",c,{unselected:d.element})});e(".ui-selecting",this.element[0]).each(function(){var d=
|
||||
e.data(this,"selectable-item");d.$element.removeClass("ui-selecting").addClass("ui-selected");d.selecting=false;d.selected=true;d.startselected=true;f._trigger("selected",c,{selected:d.element})});this._trigger("stop",c);this.helper.remove();return false}});e.extend(e.ui.selectable,{version:"1.8.9"})})(jQuery);
|
||||
e.data(this,"selectable-item");d.$element.removeClass("ui-selecting").addClass("ui-selected");d.selecting=false;d.selected=true;d.startselected=true;f._trigger("selected",c,{selected:d.element})});this._trigger("stop",c);this.helper.remove();return false}});e.extend(e.ui.selectable,{version:"1.8.10"})})(jQuery);
|
||||
;/*
|
||||
* jQuery UI Sortable 1.8.9
|
||||
* jQuery UI Sortable 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -267,9 +267,9 @@ this.fromOutside&&!b&&c.push(function(f){this._trigger("receive",f,this._uiHash(
|
|||
this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive",g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update",g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this,this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out",
|
||||
g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over=0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop",a,this._uiHash());for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}return false}b||
|
||||
this._trigger("beforeStop",a,this._uiHash());this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.helper[0]!=this.currentItem[0]&&this.helper.remove();this.helper=null;if(!b){for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}this.fromOutside=false;return true},_trigger:function(){d.Widget.prototype._trigger.apply(this,arguments)===false&&this.cancel()},_uiHash:function(a){var b=a||this;return{helper:b.helper,placeholder:b.placeholder||d([]),position:b.position,
|
||||
originalPosition:b.originalPosition,offset:b.positionAbs,item:b.currentItem,sender:a?a.element:null}}});d.extend(d.ui.sortable,{version:"1.8.9"})})(jQuery);
|
||||
originalPosition:b.originalPosition,offset:b.positionAbs,item:b.currentItem,sender:a?a.element:null}}});d.extend(d.ui.sortable,{version:"1.8.10"})})(jQuery);
|
||||
;/*
|
||||
* jQuery UI Accordion 1.8.9
|
||||
* jQuery UI Accordion 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -294,12 +294,12 @@ if(!d.disabled)if(a.target){a=c(a.currentTarget||b);b=a[0]===this.active[0];d.ac
|
|||
if(!b){a.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected);a.next().addClass("ui-accordion-content-active")}}}else if(d.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);this.active.next().addClass("ui-accordion-content-active");var g=this.active.next(),
|
||||
e={options:d,newHeader:c([]),oldHeader:d.active,newContent:c([]),oldContent:g},j=this.active=c([]);this._toggle(j,g,e)}},_toggle:function(a,b,d,h,f){var g=this,e=g.options;g.toShow=a;g.toHide=b;g.data=d;var j=function(){if(g)return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data);g.running=b.size()===0?a.size():b.size();if(e.animated){d={};d=e.collapsible&&h?{toShow:c([]),toHide:b,complete:j,down:f,autoHeight:e.autoHeight||e.fillSpace}:{toShow:a,toHide:b,complete:j,down:f,autoHeight:e.autoHeight||
|
||||
e.fillSpace};if(!e.proxied)e.proxied=e.animated;if(!e.proxiedDuration)e.proxiedDuration=e.duration;e.animated=c.isFunction(e.proxied)?e.proxied(d):e.proxied;e.duration=c.isFunction(e.proxiedDuration)?e.proxiedDuration(d):e.proxiedDuration;h=c.ui.accordion.animations;var i=e.duration,k=e.animated;if(k&&!h[k]&&!c.easing[k])k="slide";h[k]||(h[k]=function(l){this.slide(l,{easing:k,duration:i||700})});h[k](d)}else{if(e.collapsible&&h)a.toggle();else{b.hide();a.show()}j(true)}b.prev().attr({"aria-expanded":"false",
|
||||
tabIndex:-1}).blur();a.prev().attr({"aria-expanded":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(!this.running){this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");if(this.toHide.length)this.toHide.parent()[0].className=this.toHide.parent()[0].className;this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion,{version:"1.8.9",animations:{slide:function(a,b){a=
|
||||
tabIndex:-1}).blur();a.prev().attr({"aria-expanded":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(!this.running){this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");if(this.toHide.length)this.toHide.parent()[0].className=this.toHide.parent()[0].className;this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion,{version:"1.8.10",animations:{slide:function(a,b){a=
|
||||
c.extend({easing:"swing",duration:300},a,b);if(a.toHide.size())if(a.toShow.size()){var d=a.toShow.css("overflow"),h=0,f={},g={},e;b=a.toShow;e=b[0].style.width;b.width(parseInt(b.parent().width(),10)-parseInt(b.css("paddingLeft"),10)-parseInt(b.css("paddingRight"),10)-(parseInt(b.css("borderLeftWidth"),10)||0)-(parseInt(b.css("borderRightWidth"),10)||0));c.each(["height","paddingTop","paddingBottom"],function(j,i){g[i]="hide";j=(""+c.css(a.toShow[0],i)).match(/^([\d+-.]+)(.*)$/);f[i]={value:j[1],
|
||||
unit:j[2]||"px"}});a.toShow.css({height:0,overflow:"hidden"}).show();a.toHide.filter(":hidden").each(a.complete).end().filter(":visible").animate(g,{step:function(j,i){if(i.prop=="height")h=i.end-i.start===0?0:(i.now-i.start)/(i.end-i.start);a.toShow[0].style[i.prop]=h*f[i.prop].value+f[i.prop].unit},duration:a.duration,easing:a.easing,complete:function(){a.autoHeight||a.toShow.css("height","");a.toShow.css({width:e,overflow:d});a.complete()}})}else a.toHide.animate({height:"hide",paddingTop:"hide",
|
||||
paddingBottom:"hide"},a);else a.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},a)},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1E3:200})}}})})(jQuery);
|
||||
;/*
|
||||
* jQuery UI Autocomplete 1.8.9
|
||||
* jQuery UI Autocomplete 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -312,25 +312,25 @@ paddingBottom:"hide"},a);else a.toShow.animate({height:"show",paddingTop:"show",
|
|||
* jquery.ui.widget.js
|
||||
* jquery.ui.position.js
|
||||
*/
|
||||
(function(d){d.widget("ui.autocomplete",{options:{appendTo:"body",delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var a=this,b=this.element[0].ownerDocument,f;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!(a.options.disabled||a.element.attr("readonly"))){f=false;var e=d.ui.keyCode;
|
||||
switch(c.keyCode){case e.PAGE_UP:a._move("previousPage",c);break;case e.PAGE_DOWN:a._move("nextPage",c);break;case e.UP:a._move("previous",c);c.preventDefault();break;case e.DOWN:a._move("next",c);c.preventDefault();break;case e.ENTER:case e.NUMPAD_ENTER:if(a.menu.active){f=true;c.preventDefault()}case e.TAB:if(!a.menu.active)return;a.menu.select(c);break;case e.ESCAPE:a.element.val(a.term);a.close(c);break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){if(a.term!=a.element.val()){a.selectedItem=
|
||||
null;a.search(null,c)}},a.options.delay);break}}}).bind("keypress.autocomplete",function(c){if(f){f=false;c.preventDefault()}}).bind("focus.autocomplete",function(){if(!a.options.disabled){a.selectedItem=null;a.previous=a.element.val()}}).bind("blur.autocomplete",function(c){if(!a.options.disabled){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(c);a._change(c)},150)}});this._initSource();this.response=function(){return a._response.apply(a,arguments)};this.menu=d("<ul></ul>").addClass("ui-autocomplete").appendTo(d(this.options.appendTo||
|
||||
"body",b)[0]).mousedown(function(c){var e=a.menu.element[0];d(c.target).closest(".ui-menu-item").length||setTimeout(function(){d(document).one("mousedown",function(g){g.target!==a.element[0]&&g.target!==e&&!d.ui.contains(e,g.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,e){e=e.item.data("item.autocomplete");false!==a._trigger("focus",c,{item:e})&&/^key/.test(c.originalEvent.type)&&a.element.val(e.value)},selected:function(c,e){var g=e.item.data("item.autocomplete"),
|
||||
h=a.previous;if(a.element[0]!==b.activeElement){a.element.focus();a.previous=h;setTimeout(function(){a.previous=h;a.selectedItem=g},1)}false!==a._trigger("select",c,{item:g})&&a.element.val(g.value);a.term=a.element.val();a.close(c);a.selectedItem=g},blur:function(){a.menu.element.is(":visible")&&a.element.val()!==a.term&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");d.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");
|
||||
this.menu.element.remove();d.Widget.prototype.destroy.call(this)},_setOption:function(a,b){d.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(d(b||"body",this.element[0].ownerDocument)[0]);a==="disabled"&&b&&this.xhr&&this.xhr.abort()},_initSource:function(){var a=this,b,f;if(d.isArray(this.options.source)){b=this.options.source;this.source=function(c,e){e(d.ui.autocomplete.filter(b,c.term))}}else if(typeof this.options.source===
|
||||
"string"){f=this.options.source;this.source=function(c,e){a.xhr&&a.xhr.abort();a.xhr=d.ajax({url:f,data:c,dataType:"json",success:function(g,h,i){i===a.xhr&&e(g);a.xhr=null},error:function(g){g===a.xhr&&e([]);a.xhr=null}})}}else this.source=this.options.source},search:function(a,b){a=a!=null?a:this.element.val();this.term=this.element.val();if(a.length<this.options.minLength)return this.close(b);clearTimeout(this.closing);if(this._trigger("search",b)!==false)return this._search(a)},_search:function(a){this.pending++;
|
||||
this.element.addClass("ui-autocomplete-loading");this.source({term:a},this.response)},_response:function(a){if(!this.options.disabled&&a&&a.length){a=this._normalize(a);this._suggest(a);this._trigger("open")}else this.close();this.pending--;this.pending||this.element.removeClass("ui-autocomplete-loading")},close:function(a){clearTimeout(this.closing);if(this.menu.element.is(":visible")){this.menu.element.hide();this.menu.deactivate();this._trigger("close",a)}},_change:function(a){this.previous!==
|
||||
(function(d){var e=0;d.widget("ui.autocomplete",{options:{appendTo:"body",delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var a=this,b=this.element[0].ownerDocument,g;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!(a.options.disabled||a.element.attr("readonly"))){g=false;var f=d.ui.keyCode;
|
||||
switch(c.keyCode){case f.PAGE_UP:a._move("previousPage",c);break;case f.PAGE_DOWN:a._move("nextPage",c);break;case f.UP:a._move("previous",c);c.preventDefault();break;case f.DOWN:a._move("next",c);c.preventDefault();break;case f.ENTER:case f.NUMPAD_ENTER:if(a.menu.active){g=true;c.preventDefault()}case f.TAB:if(!a.menu.active)return;a.menu.select(c);break;case f.ESCAPE:a.element.val(a.term);a.close(c);break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){if(a.term!=a.element.val()){a.selectedItem=
|
||||
null;a.search(null,c)}},a.options.delay);break}}}).bind("keypress.autocomplete",function(c){if(g){g=false;c.preventDefault()}}).bind("focus.autocomplete",function(){if(!a.options.disabled){a.selectedItem=null;a.previous=a.element.val()}}).bind("blur.autocomplete",function(c){if(!a.options.disabled){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(c);a._change(c)},150)}});this._initSource();this.response=function(){return a._response.apply(a,arguments)};this.menu=d("<ul></ul>").addClass("ui-autocomplete").appendTo(d(this.options.appendTo||
|
||||
"body",b)[0]).mousedown(function(c){var f=a.menu.element[0];d(c.target).closest(".ui-menu-item").length||setTimeout(function(){d(document).one("mousedown",function(h){h.target!==a.element[0]&&h.target!==f&&!d.ui.contains(f,h.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,f){f=f.item.data("item.autocomplete");false!==a._trigger("focus",c,{item:f})&&/^key/.test(c.originalEvent.type)&&a.element.val(f.value)},selected:function(c,f){var h=f.item.data("item.autocomplete"),
|
||||
i=a.previous;if(a.element[0]!==b.activeElement){a.element.focus();a.previous=i;setTimeout(function(){a.previous=i;a.selectedItem=h},1)}false!==a._trigger("select",c,{item:h})&&a.element.val(h.value);a.term=a.element.val();a.close(c);a.selectedItem=h},blur:function(){a.menu.element.is(":visible")&&a.element.val()!==a.term&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");d.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");
|
||||
this.menu.element.remove();d.Widget.prototype.destroy.call(this)},_setOption:function(a,b){d.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(d(b||"body",this.element[0].ownerDocument)[0]);a==="disabled"&&b&&this.xhr&&this.xhr.abort()},_initSource:function(){var a=this,b,g;if(d.isArray(this.options.source)){b=this.options.source;this.source=function(c,f){f(d.ui.autocomplete.filter(b,c.term))}}else if(typeof this.options.source===
|
||||
"string"){g=this.options.source;this.source=function(c,f){a.xhr&&a.xhr.abort();a.xhr=d.ajax({url:g,data:c,dataType:"json",autocompleteRequest:++e,success:function(h){this.autocompleteRequest===e&&f(h)},error:function(){this.autocompleteRequest===e&&f([])}})}}else this.source=this.options.source},search:function(a,b){a=a!=null?a:this.element.val();this.term=this.element.val();if(a.length<this.options.minLength)return this.close(b);clearTimeout(this.closing);if(this._trigger("search",b)!==false)return this._search(a)},
|
||||
_search:function(a){this.pending++;this.element.addClass("ui-autocomplete-loading");this.source({term:a},this.response)},_response:function(a){if(!this.options.disabled&&a&&a.length){a=this._normalize(a);this._suggest(a);this._trigger("open")}else this.close();this.pending--;this.pending||this.element.removeClass("ui-autocomplete-loading")},close:function(a){clearTimeout(this.closing);if(this.menu.element.is(":visible")){this.menu.element.hide();this.menu.deactivate();this._trigger("close",a)}},_change:function(a){this.previous!==
|
||||
this.element.val()&&this._trigger("change",a,{item:this.selectedItem})},_normalize:function(a){if(a.length&&a[0].label&&a[0].value)return a;return d.map(a,function(b){if(typeof b==="string")return{label:b,value:b};return d.extend({label:b.label||b.value,value:b.value||b.label},b)})},_suggest:function(a){var b=this.menu.element.empty().zIndex(this.element.zIndex()+1);this._renderMenu(b,a);this.menu.deactivate();this.menu.refresh();b.show();this._resizeMenu();b.position(d.extend({of:this.element},this.options.position))},
|
||||
_resizeMenu:function(){var a=this.menu.element;a.outerWidth(Math.max(a.width("").outerWidth(),this.element.outerWidth()))},_renderMenu:function(a,b){var f=this;d.each(b,function(c,e){f._renderItem(a,e)})},_renderItem:function(a,b){return d("<li></li>").data("item.autocomplete",b).append(d("<a></a>").text(b.label)).appendTo(a)},_move:function(a,b){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b);
|
||||
else this.search(null,b)},widget:function(){return this.menu.element}});d.extend(d.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},filter:function(a,b){var f=new RegExp(d.ui.autocomplete.escapeRegex(b),"i");return d.grep(a,function(c){return f.test(c.label||c.value||c)})}})})(jQuery);
|
||||
(function(d){d.widget("ui.menu",{_create:function(){var a=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(b){if(d(b.target).closest(".ui-menu-item a").length){b.preventDefault();a.select(b)}});this.refresh()},refresh:function(){var a=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex",
|
||||
-1).mouseenter(function(b){a.activate(b,d(this).parent())}).mouseleave(function(){a.deactivate()})},activate:function(a,b){this.deactivate();if(this.hasScroll()){var f=b.offset().top-this.element.offset().top,c=this.element.attr("scrollTop"),e=this.element.height();if(f<0)this.element.attr("scrollTop",c+f);else f>=e&&this.element.attr("scrollTop",c+f-e+b.height())}this.active=b.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",a,{item:b})},
|
||||
deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");this._trigger("blur");this.active=null}},next:function(a){this.move("next",".ui-menu-item:first",a)},previous:function(a){this.move("prev",".ui-menu-item:last",a)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(a,b,f){if(this.active){a=this.active[a+"All"](".ui-menu-item").eq(0);
|
||||
a.length?this.activate(f,a):this.activate(f,this.element.children(b))}else this.activate(f,this.element.children(b))},nextPage:function(a){if(this.hasScroll())if(!this.active||this.last())this.activate(a,this.element.children(".ui-menu-item:first"));else{var b=this.active.offset().top,f=this.element.height(),c=this.element.children(".ui-menu-item").filter(function(){var e=d(this).offset().top-b-f+d(this).height();return e<10&&e>-10});c.length||(c=this.element.children(".ui-menu-item:last"));this.activate(a,
|
||||
c)}else this.activate(a,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(a){if(this.hasScroll())if(!this.active||this.first())this.activate(a,this.element.children(".ui-menu-item:last"));else{var b=this.active.offset().top,f=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var c=d(this).offset().top-b+f-d(this).height();return c<10&&c>-10});result.length||(result=this.element.children(".ui-menu-item:first"));
|
||||
this.activate(a,result)}else this.activate(a,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()<this.element.attr("scrollHeight")},select:function(a){this._trigger("selected",a,{item:this.active})}})})(jQuery);
|
||||
_resizeMenu:function(){var a=this.menu.element;a.outerWidth(Math.max(a.width("").outerWidth(),this.element.outerWidth()))},_renderMenu:function(a,b){var g=this;d.each(b,function(c,f){g._renderItem(a,f)})},_renderItem:function(a,b){return d("<li></li>").data("item.autocomplete",b).append(d("<a></a>").text(b.label)).appendTo(a)},_move:function(a,b){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b);
|
||||
else this.search(null,b)},widget:function(){return this.menu.element}});d.extend(d.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},filter:function(a,b){var g=new RegExp(d.ui.autocomplete.escapeRegex(b),"i");return d.grep(a,function(c){return g.test(c.label||c.value||c)})}})})(jQuery);
|
||||
(function(d){d.widget("ui.menu",{_create:function(){var e=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(a){if(d(a.target).closest(".ui-menu-item a").length){a.preventDefault();e.select(a)}});this.refresh()},refresh:function(){var e=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex",
|
||||
-1).mouseenter(function(a){e.activate(a,d(this).parent())}).mouseleave(function(){e.deactivate()})},activate:function(e,a){this.deactivate();if(this.hasScroll()){var b=a.offset().top-this.element.offset().top,g=this.element.attr("scrollTop"),c=this.element.height();if(b<0)this.element.attr("scrollTop",g+b);else b>=c&&this.element.attr("scrollTop",g+b-c+a.height())}this.active=a.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",e,{item:a})},
|
||||
deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");this._trigger("blur");this.active=null}},next:function(e){this.move("next",".ui-menu-item:first",e)},previous:function(e){this.move("prev",".ui-menu-item:last",e)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(e,a,b){if(this.active){e=this.active[e+"All"](".ui-menu-item").eq(0);
|
||||
e.length?this.activate(b,e):this.activate(b,this.element.children(a))}else this.activate(b,this.element.children(a))},nextPage:function(e){if(this.hasScroll())if(!this.active||this.last())this.activate(e,this.element.children(".ui-menu-item:first"));else{var a=this.active.offset().top,b=this.element.height(),g=this.element.children(".ui-menu-item").filter(function(){var c=d(this).offset().top-a-b+d(this).height();return c<10&&c>-10});g.length||(g=this.element.children(".ui-menu-item:last"));this.activate(e,
|
||||
g)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(e){if(this.hasScroll())if(!this.active||this.first())this.activate(e,this.element.children(".ui-menu-item:last"));else{var a=this.active.offset().top,b=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var g=d(this).offset().top-a+b-d(this).height();return g<10&&g>-10});result.length||(result=this.element.children(".ui-menu-item:first"));
|
||||
this.activate(e,result)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()<this.element.attr("scrollHeight")},select:function(e){this._trigger("selected",e,{item:this.active})}})})(jQuery);
|
||||
;/*
|
||||
* jQuery UI Button 1.8.9
|
||||
* jQuery UI Button 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -342,20 +342,21 @@ this.activate(a,result)}else this.activate(a,this.element.children(".ui-menu-ite
|
|||
* jquery.ui.core.js
|
||||
* jquery.ui.widget.js
|
||||
*/
|
||||
(function(a){var g,i=function(b){a(":ui-button",b.target.form).each(function(){var c=a(this).data("button");setTimeout(function(){c.refresh()},1)})},h=function(b){var c=b.name,d=b.form,e=a([]);if(c)e=d?a(d).find("[name='"+c+"']"):a("[name='"+c+"']",b.ownerDocument).filter(function(){return!this.form});return e};a.widget("ui.button",{options:{disabled:null,text:true,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button",
|
||||
i);if(typeof this.options.disabled!=="boolean")this.options.disabled=this.element.attr("disabled");this._determineButtonType();this.hasTitle=!!this.buttonElement.attr("title");var b=this,c=this.options,d=this.type==="checkbox"||this.type==="radio",e="ui-state-hover"+(!d?" ui-state-active":"");if(c.label===null)c.label=this.buttonElement.html();if(this.element.is(":disabled"))c.disabled=true;this.buttonElement.addClass("ui-button ui-widget ui-state-default ui-corner-all").attr("role","button").bind("mouseenter.button",
|
||||
function(){if(!c.disabled){a(this).addClass("ui-state-hover");this===g&&a(this).addClass("ui-state-active")}}).bind("mouseleave.button",function(){c.disabled||a(this).removeClass(e)}).bind("focus.button",function(){a(this).addClass("ui-state-focus")}).bind("blur.button",function(){a(this).removeClass("ui-state-focus")});d&&this.element.bind("change.button",function(){b.refresh()});if(this.type==="checkbox")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).toggleClass("ui-state-active");
|
||||
b.buttonElement.attr("aria-pressed",b.element[0].checked)});else if(this.type==="radio")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");b.buttonElement.attr("aria-pressed",true);var f=b.element[0];h(f).not(f).map(function(){return a(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed",false)});else{this.buttonElement.bind("mousedown.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");
|
||||
g=this;a(document).one("mouseup",function(){g=null})}).bind("mouseup.button",function(){if(c.disabled)return false;a(this).removeClass("ui-state-active")}).bind("keydown.button",function(f){if(c.disabled)return false;if(f.keyCode==a.ui.keyCode.SPACE||f.keyCode==a.ui.keyCode.ENTER)a(this).addClass("ui-state-active")}).bind("keyup.button",function(){a(this).removeClass("ui-state-active")});this.buttonElement.is("a")&&this.buttonElement.keyup(function(f){f.keyCode===a.ui.keyCode.SPACE&&a(this).click()})}this._setOption("disabled",
|
||||
(function(a){var g,i=function(b){a(":ui-button",b.target.form).each(function(){var c=a(this).data("button");setTimeout(function(){c.refresh()},1)})},h=function(b){var c=b.name,d=b.form,f=a([]);if(c)f=d?a(d).find("[name='"+c+"']"):a("[name='"+c+"']",b.ownerDocument).filter(function(){return!this.form});return f};a.widget("ui.button",{options:{disabled:null,text:true,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button",
|
||||
i);if(typeof this.options.disabled!=="boolean")this.options.disabled=this.element.attr("disabled");this._determineButtonType();this.hasTitle=!!this.buttonElement.attr("title");var b=this,c=this.options,d=this.type==="checkbox"||this.type==="radio",f="ui-state-hover"+(!d?" ui-state-active":"");if(c.label===null)c.label=this.buttonElement.html();if(this.element.is(":disabled"))c.disabled=true;this.buttonElement.addClass("ui-button ui-widget ui-state-default ui-corner-all").attr("role","button").bind("mouseenter.button",
|
||||
function(){if(!c.disabled){a(this).addClass("ui-state-hover");this===g&&a(this).addClass("ui-state-active")}}).bind("mouseleave.button",function(){c.disabled||a(this).removeClass(f)}).bind("focus.button",function(){a(this).addClass("ui-state-focus")}).bind("blur.button",function(){a(this).removeClass("ui-state-focus")});d&&this.element.bind("change.button",function(){b.refresh()});if(this.type==="checkbox")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).toggleClass("ui-state-active");
|
||||
b.buttonElement.attr("aria-pressed",b.element[0].checked)});else if(this.type==="radio")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");b.buttonElement.attr("aria-pressed",true);var e=b.element[0];h(e).not(e).map(function(){return a(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed",false)});else{this.buttonElement.bind("mousedown.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");
|
||||
g=this;a(document).one("mouseup",function(){g=null})}).bind("mouseup.button",function(){if(c.disabled)return false;a(this).removeClass("ui-state-active")}).bind("keydown.button",function(e){if(c.disabled)return false;if(e.keyCode==a.ui.keyCode.SPACE||e.keyCode==a.ui.keyCode.ENTER)a(this).addClass("ui-state-active")}).bind("keyup.button",function(){a(this).removeClass("ui-state-active")});this.buttonElement.is("a")&&this.buttonElement.keyup(function(e){e.keyCode===a.ui.keyCode.SPACE&&a(this).click()})}this._setOption("disabled",
|
||||
c.disabled)},_determineButtonType:function(){this.type=this.element.is(":checkbox")?"checkbox":this.element.is(":radio")?"radio":this.element.is("input")?"input":"button";if(this.type==="checkbox"||this.type==="radio"){this.buttonElement=this.element.parents().last().find("label[for="+this.element.attr("id")+"]");this.element.addClass("ui-helper-hidden-accessible");var b=this.element.is(":checked");b&&this.buttonElement.addClass("ui-state-active");this.buttonElement.attr("aria-pressed",b)}else this.buttonElement=
|
||||
this.element},widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible");this.buttonElement.removeClass("ui-button ui-widget ui-state-default ui-corner-all ui-state-hover ui-state-active ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only").removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html());this.hasTitle||
|
||||
this.buttonElement.removeAttr("title");a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments);if(b==="disabled")c?this.element.attr("disabled",true):this.element.removeAttr("disabled");this._resetButton()},refresh:function(){var b=this.element.is(":disabled");b!==this.options.disabled&&this._setOption("disabled",b);if(this.type==="radio")h(this.element[0]).each(function(){a(this).is(":checked")?a(this).button("widget").addClass("ui-state-active").attr("aria-pressed",
|
||||
true):a(this).button("widget").removeClass("ui-state-active").attr("aria-pressed",false)});else if(this.type==="checkbox")this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed",true):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed",false)},_resetButton:function(){if(this.type==="input")this.options.label&&this.element.val(this.options.label);else{var b=this.buttonElement.removeClass("ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only"),
|
||||
c=a("<span></span>").addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,e=d.primary&&d.secondary;if(d.primary||d.secondary){b.addClass("ui-button-text-icon"+(e?"s":d.primary?"-primary":"-secondary"));d.primary&&b.prepend("<span class='ui-button-icon-primary ui-icon "+d.primary+"'></span>");d.secondary&&b.append("<span class='ui-button-icon-secondary ui-icon "+d.secondary+"'></span>");if(!this.options.text){b.addClass(e?"ui-button-icons-only":"ui-button-icon-only").removeClass("ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary");
|
||||
this.hasTitle||b.attr("title",c)}}else b.addClass("ui-button-text-only")}}});a.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c);a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass("ui-corner-left").end().filter(":last").addClass("ui-corner-right").end().end()},
|
||||
destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");a.Widget.prototype.destroy.call(this)}})})(jQuery);
|
||||
c=a("<span></span>").addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,f=d.primary&&d.secondary,e=[];if(d.primary||d.secondary){e.push("ui-button-text-icon"+(f?"s":d.primary?"-primary":"-secondary"));d.primary&&b.prepend("<span class='ui-button-icon-primary ui-icon "+d.primary+"'></span>");d.secondary&&b.append("<span class='ui-button-icon-secondary ui-icon "+d.secondary+"'></span>");if(!this.options.text){e.push(f?"ui-button-icons-only":"ui-button-icon-only");
|
||||
b.removeClass("ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary");this.hasTitle||b.attr("title",c)}}else e.push("ui-button-text-only");b.addClass(e.join(" "))}}});a.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c);a.Widget.prototype._setOption.apply(this,
|
||||
arguments)},refresh:function(){this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass("ui-corner-left").end().filter(":last").addClass("ui-corner-right").end().end()},destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");
|
||||
a.Widget.prototype.destroy.call(this)}})})(jQuery);
|
||||
;/*
|
||||
* jQuery UI Dialog 1.8.9
|
||||
* jQuery UI Dialog 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -389,13 +390,13 @@ h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c
|
|||
l)d[g]=f});e&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",d)},_setOption:function(a,b){var d=this,e=d.uiDialog;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"):e.removeClass("ui-dialog-disabled");
|
||||
break;case "draggable":var g=e.is(":data(draggable)");g&&!b&&e.draggable("destroy");!g&&b&&d._makeDraggable();break;case "position":d._position(b);break;case "resizable":(g=e.is(":data(resizable)"))&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||" "));break}c.Widget.prototype._setOption.apply(d,arguments)},_size:function(){var a=this.options,b,d,e=
|
||||
this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0});if(a.minWidth>a.width)a.width=a.minWidth;b=this.uiDialog.css({height:"auto",width:a.width}).height();d=Math.max(0,a.minHeight-b);if(a.height==="auto")if(c.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();a=this.element.css("height","auto").height();e||this.uiDialog.hide();this.element.height(Math.max(a,d))}else this.element.height(Math.max(a.height-b,0));this.uiDialog.is(":data(resizable)")&&
|
||||
this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.9",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(a){if(this.instances.length===
|
||||
this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.10",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(a){if(this.instances.length===
|
||||
0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&c(document).bind(c.ui.dialog.overlay.events,function(d){if(c(d.target).zIndex()<c.ui.dialog.overlay.maxZ)return false})},1);c(document).bind("keydown.dialog-overlay",function(d){if(a.options.closeOnEscape&&d.keyCode&&d.keyCode===c.ui.keyCode.ESCAPE){a.close(d);d.preventDefault()}});c(window).bind("resize.dialog-overlay",c.ui.dialog.overlay.resize)}var b=(this.oldInstances.pop()||c("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),
|
||||
height:this.height()});c.fn.bgiframe&&b.bgiframe();this.instances.push(b);return b},destroy:function(a){var b=c.inArray(a,this.instances);b!=-1&&this.oldInstances.push(this.instances.splice(b,1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var d=0;c.each(this.instances,function(){d=Math.max(d,this.css("z-index"))});this.maxZ=d},height:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);
|
||||
b=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return a<b?c(window).height()+"px":a+"px"}else return c(document).height()+"px"},width:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth);b=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);return a<b?c(window).width()+"px":a+"px"}else return c(document).width()+"px"},resize:function(){var a=c([]);c.each(c.ui.dialog.overlay.instances,
|
||||
function(){a=a.add(this)});a.css({width:0,height:0}).css({width:c.ui.dialog.overlay.width(),height:c.ui.dialog.overlay.height()})}});c.extend(c.ui.dialog.overlay.prototype,{destroy:function(){c.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);
|
||||
;/*
|
||||
* jQuery UI Slider 1.8.9
|
||||
* jQuery UI Slider 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -426,9 +427,9 @@ this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui
|
|||
return a=this._trimAlignValue(a)}else{a=this.options.values.slice();for(c=0;c<a.length;c+=1)a[c]=this._trimAlignValue(a[c]);return a}},_trimAlignValue:function(b){if(b<=this._valueMin())return this._valueMin();if(b>=this._valueMax())return this._valueMax();var a=this.options.step>0?this.options.step:1,c=(b-this._valueMin())%a;alignValue=b-c;if(Math.abs(c)*2>=a)alignValue+=c>0?a:-a;return parseFloat(alignValue.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},
|
||||
_refreshValue:function(){var b=this.options.range,a=this.options,c=this,e=!this._animateOff?a.animate:false,f,h={},g,i,j,l;if(this.options.values&&this.options.values.length)this.handles.each(function(k){f=(c.values(k)-c._valueMin())/(c._valueMax()-c._valueMin())*100;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";d(this).stop(1,1)[e?"animate":"css"](h,a.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(k===0)c.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},a.animate);
|
||||
if(k===1)c.range[e?"animate":"css"]({width:f-g+"%"},{queue:false,duration:a.animate})}else{if(k===0)c.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},a.animate);if(k===1)c.range[e?"animate":"css"]({height:f-g+"%"},{queue:false,duration:a.animate})}g=f});else{i=this.value();j=this._valueMin();l=this._valueMax();f=l!==j?(i-j)/(l-j)*100:0;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";this.handle.stop(1,1)[e?"animate":"css"](h,a.animate);if(b==="min"&&this.orientation==="horizontal")this.range.stop(1,
|
||||
1)[e?"animate":"css"]({width:f+"%"},a.animate);if(b==="max"&&this.orientation==="horizontal")this.range[e?"animate":"css"]({width:100-f+"%"},{queue:false,duration:a.animate});if(b==="min"&&this.orientation==="vertical")this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},a.animate);if(b==="max"&&this.orientation==="vertical")this.range[e?"animate":"css"]({height:100-f+"%"},{queue:false,duration:a.animate})}}});d.extend(d.ui.slider,{version:"1.8.9"})})(jQuery);
|
||||
1)[e?"animate":"css"]({width:f+"%"},a.animate);if(b==="max"&&this.orientation==="horizontal")this.range[e?"animate":"css"]({width:100-f+"%"},{queue:false,duration:a.animate});if(b==="min"&&this.orientation==="vertical")this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},a.animate);if(b==="max"&&this.orientation==="vertical")this.range[e?"animate":"css"]({height:100-f+"%"},{queue:false,duration:a.animate})}}});d.extend(d.ui.slider,{version:"1.8.10"})})(jQuery);
|
||||
;/*
|
||||
* jQuery UI Tabs 1.8.9
|
||||
* jQuery UI Tabs 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -460,10 +461,10 @@ if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(b+(b+1<this
|
|||
this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(b){b=this._getIndex(b);var e=this.options;if(b!=e.selected){this.lis.eq(b).addClass("ui-state-disabled");e.disabled.push(b);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[b],this.panels[b]))}return this},select:function(b){b=this._getIndex(b);if(b==-1)if(this.options.collapsible&&this.options.selected!=-1)b=this.options.selected;else return this;this.anchors.eq(b).trigger(this.options.event+".tabs");return this},
|
||||
load:function(b){b=this._getIndex(b);var e=this,a=this.options,c=this.anchors.eq(b)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(a.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){e.element.find(e._sanitizeSelector(c.hash)).html(k);e._cleanup();a.cache&&d.data(c,
|
||||
"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.error(k,n,b,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this},
|
||||
url:function(b,e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.9"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k<a.anchors.length?k:0)},b);j&&j.stopPropagation()});e=a._unrotate||(a._unrotate=!e?function(j){j.clientX&&
|
||||
url:function(b,e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.10"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k<a.anchors.length?k:0)},b);j&&j.stopPropagation()});e=a._unrotate||(a._unrotate=!e?function(j){j.clientX&&
|
||||
a.rotate(null)}:function(){t=c.selected;h()});if(b){this.element.bind("tabsshow",h);this.anchors.bind(c.event+".tabs",e);h()}else{clearTimeout(a.rotation);this.element.unbind("tabsshow",h);this.anchors.unbind(c.event+".tabs",e);delete this._rotate;delete this._unrotate}return this}})})(jQuery);
|
||||
;/*
|
||||
* jQuery UI Datepicker 1.8.9
|
||||
* jQuery UI Datepicker 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -478,7 +479,7 @@ a.rotate(null)}:function(){t=c.selected;h()});if(b){this.element.bind("tabsshow"
|
|||
"ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su",
|
||||
"Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",
|
||||
minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false};d.extend(this._defaults,this.regional[""]);this.dpDiv=d('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}function E(a,b){d.extend(a,b);for(var c in b)if(b[c]==
|
||||
null||b[c]==G)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.9"}});var y=(new Date).getTime();d.extend(K.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){E(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=f}}}e=a.nodeName.toLowerCase();
|
||||
null||b[c]==G)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.10"}});var y=(new Date).getTime();d.extend(K.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){E(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=f}}}e=a.nodeName.toLowerCase();
|
||||
f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:d('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}},
|
||||
_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&&
|
||||
b.append.remove();if(c){b.append=d('<span class="'+this._appendClass+'">'+c+"</span>");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c=="focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("<img/>").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('<button type="button"></button>').addClass(this._triggerClass).html(f==
|
||||
|
|
@ -502,10 +503,10 @@ c,e);b.dpDiv.css({position:d.datepicker._inDialog&&d.blockUI?"static":e?"fixed":
|
|||
d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}},_updateDatepicker:function(a){var b=this,c=d.datepicker._getBorders(a.dpDiv);a.dpDiv.empty().append(this._generateHTML(a));var e=a.dpDiv.find("iframe.ui-datepicker-cover");e.length&&e.css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()});a.dpDiv.find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout",
|
||||
function(){d(this).removeClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).removeClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).removeClass("ui-datepicker-next-hover")}).bind("mouseover",function(){if(!b._isDisabledDatepicker(a.inline?a.dpDiv.parent()[0]:a.input[0])){d(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");d(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=
|
||||
-1&&d(this).addClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).addClass("ui-datepicker-next-hover")}}).end().find("."+this._dayOverClass+" a").trigger("mouseover").end();c=this._getNumberOfMonths(a);e=c[1];e>1?a.dpDiv.addClass("ui-datepicker-multi-"+e).css("width",17*e+"em"):a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");a.dpDiv[(c[0]!=1||c[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,
|
||||
"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input.focus();if(a.yearshtml){var f=a.yearshtml;setTimeout(function(){f===a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);f=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},
|
||||
_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),j=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-
|
||||
g):0);b.top-=Math.min(b.top,b.top+f>j&&j>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1);)a=a[b?"previousSibling":"nextSibling"];a=d(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);this._curInst=null};d.effects&&d.effects[a]?
|
||||
b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();if(a=this._get(b,"onClose"))a.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},
|
||||
"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var f=a.yearshtml;setTimeout(function(){f===a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);f=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),
|
||||
parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),j=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,
|
||||
b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>j&&j>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1||d.expr.filters.hidden(a));)a=a[b?"previousSibling":"nextSibling"];a=d(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);
|
||||
this._curInst=null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();if(a=this._get(b,"onClose"))a.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},
|
||||
_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):
|
||||
0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e._selectingMonthYear=
|
||||
false;e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){var b=this._getInst(d(a)[0]);b.input&&b._selectingMonthYear&&setTimeout(function(){b.input.focus()},0);b._selectingMonthYear=!b._selectingMonthYear},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=
|
||||
|
|
@ -538,13 +539,13 @@ o="";if(h||!j)o+='<span class="ui-datepicker-month">'+i[b]+"</span>";else{i=e&&e
|
|||
l)?" ":""));a.yearshtml="";if(h||!l)k+='<span class="ui-datepicker-year">'+c+"</span>";else{g=this._get(a,"yearRange").split(":");var r=(new Date).getFullYear();i=function(s){s=s.match(/c[+-].*/)?c+parseInt(s.substring(1),10):s.match(/[+-].*/)?r+parseInt(s,10):parseInt(s,10);return isNaN(s)?r:s};b=i(g[0]);g=Math.max(b,i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(a.yearshtml+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+
|
||||
a.id+"', this, 'Y');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+a.id+"');\">";b<=g;b++)a.yearshtml+='<option value="'+b+'"'+(b==c?' selected="selected"':"")+">"+b+"</option>";a.yearshtml+="</select>";if(d.browser.mozilla)k+='<select class="ui-datepicker-year"><option value="'+c+'" selected="selected">'+c+"</option></select>";else{k+=a.yearshtml;a.yearshtml=null}}k+=this._get(a,"yearSuffix");if(u)k+=(h||!(j&&l)?" ":"")+o;k+="</div>";return k},_adjustInstDate:function(a,b,c){var e=
|
||||
a.drawYear+(c=="Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&b<c?c:b;return b=a&&b>a?a:b},_notifyChange:function(a){var b=this._get(a,
|
||||
"onChangeMonthYear");if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a);
|
||||
"onChangeMonthYear");if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a);
|
||||
c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,
|
||||
"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker=
|
||||
function(a){if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));
|
||||
return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new K;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.9";window["DP_jQuery_"+y]=d})(jQuery);
|
||||
function(a){if(!this.length)return this;if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,
|
||||
[this[0]].concat(b));return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new K;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.10";window["DP_jQuery_"+y]=d})(jQuery);
|
||||
;/*
|
||||
* jQuery UI Progressbar 1.8.9
|
||||
* jQuery UI Progressbar 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -558,9 +559,9 @@ return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].
|
|||
*/
|
||||
(function(b,d){b.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()});this.valueDiv=b("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element);this.oldValue=this._value();this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow");
|
||||
this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===d)return this._value();this._setOption("value",a);return this},_setOption:function(a,c){if(a==="value"){this.options.value=c;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100*
|
||||
this._value()/this.options.max},_refreshValue:function(){var a=this.value(),c=this._percentage();if(this.oldValue!==a){this.oldValue=a;this._trigger("change")}this.valueDiv.toggleClass("ui-corner-right",a===this.options.max).width(c.toFixed(0)+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.9"})})(jQuery);
|
||||
this._value()/this.options.max},_refreshValue:function(){var a=this.value(),c=this._percentage();if(this.oldValue!==a){this.oldValue=a;this._trigger("change")}this.valueDiv.toggleClass("ui-corner-right",a===this.options.max).width(c.toFixed(0)+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.10"})})(jQuery);
|
||||
;/*
|
||||
* jQuery UI Effects 1.8.9
|
||||
* jQuery UI Effects 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -577,7 +578,7 @@ a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number
|
|||
211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},r=["add","remove","toggle"],t={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b,
|
||||
d){if(f.isFunction(b)){d=b;b=null}return this.queue("fx",function(){var e=f(this),g=e.attr("style")||" ",h=q(p.call(this)),l,v=e.attr("className");f.each(r,function(w,i){c[i]&&e[i+"Class"](c[i])});l=q(p.call(this));e.attr("className",v);e.animate(u(h,l),a,b,function(){f.each(r,function(w,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments)});h=f.queue(this);l=h.splice(h.length-1,1)[0];
|
||||
h.splice(1,0,l);f.dequeue(this)})};f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,
|
||||
a):f.effects.animateClass.apply(this,[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.9",save:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.data("ec.storage."+a[b],c[0].style[a[b]])},restore:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.css(a[b],c.data("ec.storage."+a[b]))},setMode:function(c,a){if(a=="toggle")a=c.is(":hidden")?"show":"hide";return a},getBaseline:function(c,
|
||||
a):f.effects.animateClass.apply(this,[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.10",save:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.data("ec.storage."+a[b],c[0].style[a[b]])},restore:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.css(a[b],c.data("ec.storage."+a[b]))},setMode:function(c,a){if(a=="toggle")a=c.is(":hidden")?"show":"hide";return a},getBaseline:function(c,
|
||||
a){var b;switch(c[0]){case "top":b=0;break;case "middle":b=0.5;break;case "bottom":b=1;break;default:b=c[0]/a.height}switch(c[1]){case "left":c=0;break;case "center":c=0.5;break;case "right":c=1;break;default:c=c[1]/a.width}return{x:c,y:b}},createWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent();var a={width:c.outerWidth(true),height:c.outerHeight(true),"float":c.css("float")},b=f("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",
|
||||
border:"none",margin:0,padding:0});c.wrap(b);b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(d,e){a[e]=c.css(e);if(isNaN(parseInt(a[e],10)))a[e]="auto"});c.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}return b.css(a).show()},removeWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent().replaceWith(c);
|
||||
return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=k.apply(this,arguments),b={options:a[1],duration:a[2],callback:a[3]};a=b.options.mode;var d=f.effects[c];if(f.fx.off||!d)return a?this[a](b.duration,b.callback):this.each(function(){b.callback&&b.callback.call(this)});return d.call(this,b)},_show:f.fn.show,show:function(c){if(m(c))return this._show.apply(this,arguments);
|
||||
|
|
@ -590,7 +591,7 @@ g/(2*Math.PI)*Math.asin(d/h);return-(h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*
|
|||
h);if(a<1)return-0.5*h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)+b;return h*Math.pow(2,-10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)*0.5+d+b},easeInBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*(a/=e)*a*((g+1)*a-g)+b},easeOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*((a=a/e-1)*a*((g+1)*a+g)+1)+b},easeInOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;if((a/=e/2)<1)return d/2*a*a*(((g*=1.525)+1)*a-g)+b;return d/2*((a-=2)*a*(((g*=1.525)+1)*a+g)+2)+b},easeInBounce:function(c,
|
||||
a,b,d,e){return d-f.easing.easeOutBounce(c,e-a,0,d,e)+b},easeOutBounce:function(c,a,b,d,e){return(a/=e)<1/2.75?d*7.5625*a*a+b:a<2/2.75?d*(7.5625*(a-=1.5/2.75)*a+0.75)+b:a<2.5/2.75?d*(7.5625*(a-=2.25/2.75)*a+0.9375)+b:d*(7.5625*(a-=2.625/2.75)*a+0.984375)+b},easeInOutBounce:function(c,a,b,d,e){if(a<e/2)return f.easing.easeInBounce(c,a*2,0,d,e)*0.5+b;return f.easing.easeOutBounce(c,a*2-e,0,d,e)*0.5+d*0.5+b}})}(jQuery);
|
||||
;/*
|
||||
* jQuery UI Effects Blind 1.8.9
|
||||
* jQuery UI Effects Blind 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -604,7 +605,7 @@ a,b,d,e){return d-f.easing.easeOutBounce(c,e-a,0,d,e)+b},easeOutBounce:function(
|
|||
(function(b){b.effects.blind=function(c){return this.queue(function(){var a=b(this),g=["position","top","bottom","left","right"],f=b.effects.setMode(a,c.options.mode||"hide"),d=c.options.direction||"vertical";b.effects.save(a,g);a.show();var e=b.effects.createWrapper(a).css({overflow:"hidden"}),h=d=="vertical"?"height":"width";d=d=="vertical"?e.height():e.width();f=="show"&&e.css(h,0);var i={};i[h]=f=="show"?d:0;e.animate(i,c.duration,c.options.easing,function(){f=="hide"&&a.hide();b.effects.restore(a,
|
||||
g);b.effects.removeWrapper(a);c.callback&&c.callback.apply(a[0],arguments);a.dequeue()})})}})(jQuery);
|
||||
;/*
|
||||
* jQuery UI Effects Bounce 1.8.9
|
||||
* jQuery UI Effects Bounce 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -619,7 +620,7 @@ g);b.effects.removeWrapper(a);c.callback&&c.callback.apply(a[0],arguments);a.deq
|
|||
3);if(h=="show")a.css("opacity",0).css(f,d=="pos"?-c:c);if(h=="hide")c/=m*2;h!="hide"&&m--;if(h=="show"){var g={opacity:1};g[f]=(d=="pos"?"+=":"-=")+c;a.animate(g,i/2,b.options.easing);c/=2;m--}for(g=0;g<m;g++){var j={},k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing);c=h=="hide"?c*2:c/2}if(h=="hide"){g={opacity:0};g[f]=(d=="pos"?"-=":"+=")+c;a.animate(g,i/2,b.options.easing,function(){a.hide();e.effects.restore(a,l);e.effects.removeWrapper(a);
|
||||
b.callback&&b.callback.apply(this,arguments)})}else{j={};k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing,function(){e.effects.restore(a,l);e.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments)})}a.queue("fx",function(){a.dequeue()});a.dequeue()})}})(jQuery);
|
||||
;/*
|
||||
* jQuery UI Effects Clip 1.8.9
|
||||
* jQuery UI Effects Clip 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -633,7 +634,7 @@ b.callback&&b.callback.apply(this,arguments)})}else{j={};k={};j[f]=(d=="pos"?"-=
|
|||
(function(b){b.effects.clip=function(e){return this.queue(function(){var a=b(this),i=["position","top","bottom","left","right","height","width"],f=b.effects.setMode(a,e.options.mode||"hide"),c=e.options.direction||"vertical";b.effects.save(a,i);a.show();var d=b.effects.createWrapper(a).css({overflow:"hidden"});d=a[0].tagName=="IMG"?d:a;var g={size:c=="vertical"?"height":"width",position:c=="vertical"?"top":"left"};c=c=="vertical"?d.height():d.width();if(f=="show"){d.css(g.size,0);d.css(g.position,
|
||||
c/2)}var h={};h[g.size]=f=="show"?c:0;h[g.position]=f=="show"?0:c/2;d.animate(h,{queue:false,duration:e.duration,easing:e.options.easing,complete:function(){f=="hide"&&a.hide();b.effects.restore(a,i);b.effects.removeWrapper(a);e.callback&&e.callback.apply(a[0],arguments);a.dequeue()}})})}})(jQuery);
|
||||
;/*
|
||||
* jQuery UI Effects Drop 1.8.9
|
||||
* jQuery UI Effects Drop 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -647,7 +648,7 @@ c/2)}var h={};h[g.size]=f=="show"?c:0;h[g.position]=f=="show"?0:c/2;d.animate(h,
|
|||
(function(c){c.effects.drop=function(d){return this.queue(function(){var a=c(this),h=["position","top","bottom","left","right","opacity"],e=c.effects.setMode(a,d.options.mode||"hide"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a);var f=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var g=d.options.distance||(f=="top"?a.outerHeight({margin:true})/2:a.outerWidth({margin:true})/2);if(e=="show")a.css("opacity",0).css(f,b=="pos"?-g:g);var i={opacity:e==
|
||||
"show"?1:0};i[f]=(e=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+g;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){e=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
|
||||
;/*
|
||||
* jQuery UI Effects Explode 1.8.9
|
||||
* jQuery UI Effects Explode 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -662,7 +663,7 @@ c/2)}var h={};h[g.size]=f=="show"?c:0;h[g.position]=f=="show"?0:c/2;d.animate(h,
|
|||
0;f<d;f++)b.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+
|
||||
e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery);
|
||||
;/*
|
||||
* jQuery UI Effects Fade 1.8.9
|
||||
* jQuery UI Effects Fade 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -675,7 +676,7 @@ e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.m
|
|||
*/
|
||||
(function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery);
|
||||
;/*
|
||||
* jQuery UI Effects Fold 1.8.9
|
||||
* jQuery UI Effects Fold 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -689,7 +690,7 @@ e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.m
|
|||
(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","bottom","left","right"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1],
|
||||
10)/100*f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery);
|
||||
;/*
|
||||
* jQuery UI Effects Highlight 1.8.9
|
||||
* jQuery UI Effects Highlight 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -703,7 +704,7 @@ e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.m
|
|||
(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&&
|
||||
this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
|
||||
;/*
|
||||
* jQuery UI Effects Pulsate 1.8.9
|
||||
* jQuery UI Effects Pulsate 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -717,7 +718,7 @@ this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments
|
|||
(function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c<times;c++){b.animate({opacity:animateTo},duration,a.options.easing);animateTo=(animateTo+1)%2}b.animate({opacity:animateTo},duration,
|
||||
a.options.easing,function(){animateTo==0&&b.hide();a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()}).dequeue()})}})(jQuery);
|
||||
;/*
|
||||
* jQuery UI Effects Scale 1.8.9
|
||||
* jQuery UI Effects Scale 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -737,7 +738,7 @@ a.css("overflow","hidden").css(a.from);if(m=="content"||m=="both"){f=f.concat(["
|
|||
child.to=c.effects.setTransition(child,f,d.to.y,child.to)}if(d.from.x!=d.to.x){child.from=c.effects.setTransition(child,k,d.from.x,child.from);child.to=c.effects.setTransition(child,k,d.to.x,child.to)}child.css(child.from);child.animate(child.to,b.duration,b.options.easing,function(){n&&c.effects.restore(child,h)})})}a.animate(a.to,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){a.to.opacity===0&&a.css("opacity",a.from.opacity);p=="hide"&&a.hide();c.effects.restore(a,
|
||||
n?e:g);c.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
|
||||
;/*
|
||||
* jQuery UI Effects Shake 1.8.9
|
||||
* jQuery UI Effects Shake 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -751,7 +752,7 @@ n?e:g);c.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments);a
|
|||
(function(d){d.effects.shake=function(a){return this.queue(function(){var b=d(this),j=["position","top","bottom","left","right"];d.effects.setMode(b,a.options.mode||"effect");var c=a.options.direction||"left",e=a.options.distance||20,l=a.options.times||3,f=a.duration||a.options.duration||140;d.effects.save(b,j);b.show();d.effects.createWrapper(b);var g=c=="up"||c=="down"?"top":"left",h=c=="up"||c=="left"?"pos":"neg";c={};var i={},k={};c[g]=(h=="pos"?"-=":"+=")+e;i[g]=(h=="pos"?"+=":"-=")+e*2;k[g]=
|
||||
(h=="pos"?"-=":"+=")+e*2;b.animate(c,f,a.options.easing);for(e=1;e<l;e++)b.animate(i,f,a.options.easing).animate(k,f,a.options.easing);b.animate(i,f,a.options.easing).animate(c,f/2,a.options.easing,function(){d.effects.restore(b,j);d.effects.removeWrapper(b);a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()});b.dequeue()})}})(jQuery);
|
||||
;/*
|
||||
* jQuery UI Effects Slide 1.8.9
|
||||
* jQuery UI Effects Slide 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -765,7 +766,7 @@ n?e:g);c.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments);a
|
|||
(function(c){c.effects.slide=function(d){return this.queue(function(){var a=c(this),h=["position","top","bottom","left","right"],f=c.effects.setMode(a,d.options.mode||"show"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a).css({overflow:"hidden"});var g=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var e=d.options.distance||(g=="top"?a.outerHeight({margin:true}):a.outerWidth({margin:true}));if(f=="show")a.css(g,b=="pos"?isNaN(e)?"-"+e:-e:e);
|
||||
var i={};i[g]=(f=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+e;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){f=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
|
||||
;/*
|
||||
* jQuery UI Effects Transfer 1.8.9
|
||||
* jQuery UI Effects Transfer 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 4.3 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 5.2 KiB |
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* jQuery UI CSS Framework 1.8.9
|
||||
* jQuery UI CSS Framework 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -42,7 +42,7 @@
|
|||
|
||||
|
||||
/*
|
||||
* jQuery UI CSS Framework 1.8.9
|
||||
* jQuery UI CSS Framework 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -293,7 +293,7 @@
|
|||
/* Overlays */
|
||||
.ui-widget-overlay { background: #5c5c5c url(images/ui-bg_flat_50_5c5c5c_40x100.png) 50% 50% repeat-x; opacity: .80;filter:Alpha(Opacity=80); }
|
||||
.ui-widget-shadow { margin: -7px 0 0 -7px; padding: 7px; background: #cccccc url(images/ui-bg_flat_30_cccccc_40x100.png) 50% 50% repeat-x; opacity: .60;filter:Alpha(Opacity=60); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/*
|
||||
* jQuery UI Resizable 1.8.9
|
||||
* jQuery UI Resizable 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -312,7 +312,7 @@
|
|||
.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
|
||||
.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
|
||||
.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*
|
||||
* jQuery UI Selectable 1.8.9
|
||||
* jQuery UI Selectable 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -322,7 +322,7 @@
|
|||
*/
|
||||
.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
|
||||
/*
|
||||
* jQuery UI Accordion 1.8.9
|
||||
* jQuery UI Accordion 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -341,7 +341,7 @@
|
|||
.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
|
||||
.ui-accordion .ui-accordion-content-active { display: block; }
|
||||
/*
|
||||
* jQuery UI Autocomplete 1.8.9
|
||||
* jQuery UI Autocomplete 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -355,7 +355,7 @@
|
|||
* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
|
||||
|
||||
/*
|
||||
* jQuery UI Menu 1.8.9
|
||||
* jQuery UI Menu 1.8.10
|
||||
*
|
||||
* Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -394,7 +394,7 @@
|
|||
margin: -1px;
|
||||
}
|
||||
/*
|
||||
* jQuery UI Button 1.8.9
|
||||
* jQuery UI Button 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -432,7 +432,7 @@ input.ui-button { padding: .4em 1em; }
|
|||
/* workarounds */
|
||||
button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
|
||||
/*
|
||||
* jQuery UI Dialog 1.8.9
|
||||
* jQuery UI Dialog 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -453,7 +453,7 @@ button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra pad
|
|||
.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
|
||||
.ui-draggable .ui-dialog-titlebar { cursor: move; }
|
||||
/*
|
||||
* jQuery UI Slider 1.8.9
|
||||
* jQuery UI Slider 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -476,7 +476,7 @@ button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra pad
|
|||
.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
|
||||
.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
|
||||
.ui-slider-vertical .ui-slider-range-max { top: 0; }/*
|
||||
* jQuery UI Tabs 1.8.9
|
||||
* jQuery UI Tabs 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -494,7 +494,7 @@ button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra pad
|
|||
.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
|
||||
.ui-tabs .ui-tabs-hide { display: none !important; }
|
||||
/*
|
||||
* jQuery UI Datepicker 1.8.9
|
||||
* jQuery UI Datepicker 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -561,7 +561,7 @@ button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra pad
|
|||
width: 200px; /*must have*/
|
||||
height: 200px; /*must have*/
|
||||
}/*
|
||||
* jQuery UI Progressbar 1.8.9
|
||||
* jQuery UI Progressbar 1.8.10
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
|
|
@ -16,7 +16,7 @@ img {
|
|||
border:0;
|
||||
}
|
||||
|
||||
#navcontainer, #input_box, #footer, .big-box, .refresh, .badge, h1, .icon, #minilinks, .defer-container, .menu_sort, .position, .buttons, .sf-item-menu, .container_toggle {
|
||||
#navcontainer, #input_box, #footer, .big-box, .refresh, .badge, h1, .icon, #minilinks, .defer-container, .menu_sort, .position, .buttons, .sf-item-menu, .container_toggle, .grip, .show_notes, .recurring_icon {
|
||||
display:none;
|
||||
}
|
||||
|
||||
|
|
@ -48,7 +48,8 @@ a, p, blockquote, ul, li, ol, dt, dd, dl, table {
|
|||
}
|
||||
|
||||
.description {
|
||||
margin-left: 12pt;
|
||||
margin-left: 18pt;
|
||||
line-height: 150%
|
||||
}
|
||||
|
||||
ul {
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
/* @override http://0.0.0.0:3000/stylesheets/standard.css?1180885851 */
|
||||
|
||||
body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td {
|
||||
div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td {
|
||||
margin:0;
|
||||
padding:0;
|
||||
}
|
||||
|
|
@ -342,10 +342,52 @@ div#input_box {
|
|||
|
||||
#input_box ul {list-style-type: circle; font-size: 0.9em;}
|
||||
|
||||
.show_from_input, .due_input, .project_input, .context_input {
|
||||
#input_box ul#predecessor_ul {
|
||||
list-style-type: none;
|
||||
color: 0;
|
||||
}
|
||||
|
||||
.show_from_input, .due_input, .project_input, .context_input,
|
||||
.predecessor_input {
|
||||
float:left;
|
||||
}
|
||||
|
||||
#input_box input.pred_remove_button {
|
||||
width:1.3em;
|
||||
}
|
||||
|
||||
.selected_predecessors {
|
||||
clear:right;
|
||||
}
|
||||
|
||||
form.new_todo_form ul.predecessor_list,
|
||||
form.edit_todo_form ul.predecessor_list {
|
||||
color: #999;
|
||||
font-size: 0.8em;
|
||||
padding: 0 0 5pt 0;
|
||||
}
|
||||
|
||||
form.edit_todo_form ul.predecessor_list {
|
||||
color: black;
|
||||
}
|
||||
|
||||
ul.predecessor_list li {
|
||||
padding: 0 0;
|
||||
}
|
||||
|
||||
/* deleting dependency from new form of a todo */
|
||||
img.icon_delete_dep {width: 10px; background-image: url(../images/icon_delete.png); background-repeat: no-repeat; background-position: -9px 0; border: none; color:black;}
|
||||
a:hover img.icon_delete_dep {width: 10px; background-image: url(../images/icon_delete.png); background-repeat: no-repeat; background-position: 0 0; border: none; color:black; background-color: black;}
|
||||
a.icon_delete_dep:hover {width: 10px; background-color: black;}
|
||||
|
||||
/* deleting dependency from edit form of a todo */
|
||||
form.edit_todo_form a.icon_delete_dep:hover { background-color: #cccccc;}
|
||||
form.edit_todo_form a:hover img.icon_delete_dep { background-color: #cccccc; }
|
||||
|
||||
/* delete button for deleting a dep from the tree of a todo */
|
||||
a.delete_dependency_button:hover {background-color: white;}
|
||||
|
||||
|
||||
.box {
|
||||
float: left;
|
||||
width: 20px;
|
||||
|
|
@ -379,8 +421,8 @@ input.item-checkbox {
|
|||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.rec_description, .description, .stale_l1, .stale_l2, .stale_l3 {
|
||||
margin-left: 60px;
|
||||
.rec_description, .description {
|
||||
margin-left: 80px;
|
||||
position:relative;
|
||||
}
|
||||
|
||||
|
|
@ -941,6 +983,7 @@ div.message {
|
|||
|
||||
.grip {
|
||||
cursor: move;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.drop_target {
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ describe ProjectsController do
|
|||
projects = mock(:project_list, :build => project,
|
||||
:active => mock(:meh, :count => 0), :size => 0)
|
||||
|
||||
user = mock_model(User, :projects => projects, :prefs => {},
|
||||
user = mock_model(User, :projects => projects, :prefs => mock(:locale => :en),
|
||||
:contexts => mock(:context_list, :find => []))
|
||||
controller.stub!(:current_user).and_return(user)
|
||||
controller.stub!(:login_required).and_return(true)
|
||||
|
|
|
|||
|
|
@ -9,4 +9,13 @@ Factory.define :context do |c|
|
|||
c.sequence(:name) { |n| "testcontext#{n}" }
|
||||
c.hide false
|
||||
c.created_at Time.now.utc
|
||||
end
|
||||
end
|
||||
|
||||
Factory.define :project do |p|
|
||||
p.sequence(:name) { |n| "testproject#{n}" }
|
||||
end
|
||||
|
||||
Factory.define :todo do |t|
|
||||
t.sequence(:description) { |n| "testtodo#{n}" }
|
||||
t.association :context
|
||||
end
|
||||
|
|
|
|||
|
|
@ -129,23 +129,27 @@ describe Todo do
|
|||
|
||||
describe 'when update_state_from_project is called' do
|
||||
it "should unhide when project is active" do
|
||||
project = mock_model(Project, :hidden? => false)
|
||||
todo = Todo.new(:state => 'project_hidden', :project => project)
|
||||
project = Factory.create(:project)
|
||||
todo = Factory.create(:todo, :project => project, :state => 'project_hidden')
|
||||
todo.hide!
|
||||
todo.should be_project_hidden
|
||||
todo.update_state_from_project
|
||||
todo.should be_active
|
||||
end
|
||||
|
||||
it "should unhide when project is null" do
|
||||
todo = Todo.new(:state => 'project_hidden', :project => nil)
|
||||
todo = Factory.create(:todo, :project => nil)
|
||||
todo.hide!
|
||||
todo.should be_project_hidden
|
||||
todo.update_state_from_project
|
||||
todo.should be_active
|
||||
end
|
||||
|
||||
it "should hide when project is hidden" do
|
||||
project = mock_model(Project, :hidden? => true)
|
||||
todo = Todo.new(:state => 'active', :project => project)
|
||||
project = Factory.create(:project)
|
||||
project.hide!
|
||||
todo = Factory.create(:todo, :project => project)
|
||||
|
||||
todo.should be_active
|
||||
todo.update_state_from_project
|
||||
todo.should be_project_hidden
|
||||
|
|
|
|||
|
|
@ -1,33 +0,0 @@
|
|||
require File.dirname(__FILE__) + '/../../spec_helper'
|
||||
|
||||
describe "/todos/_toggle_notes.rhtml" do
|
||||
# include ControllerHelper
|
||||
|
||||
before :each do
|
||||
@item = mock_model(Todo, :notes => "this is a note")
|
||||
@controller.template.stub!(:set_default_external!)
|
||||
end
|
||||
|
||||
it "should render" do
|
||||
render :partial => "/todos/toggle_notes", :object => @item
|
||||
response.should have_tag("div.todo_notes")
|
||||
end
|
||||
|
||||
it "should auto-link URLs" do
|
||||
@item.stub!(:notes).and_return("http://www.google.com/")
|
||||
render :partial => "/todos/toggle_notes", :object => @item
|
||||
response.should have_tag("a[href=\"http://www.google.com/\"]")
|
||||
end
|
||||
|
||||
it "should auto-link embedded URLs" do
|
||||
@item.stub!(:notes).and_return("this is cool: http://www.google.com/")
|
||||
render :partial => "/todos/toggle_notes", :object => @item
|
||||
response.should have_tag("a[href=\"http://www.google.com/\"]")
|
||||
end
|
||||
|
||||
it "should parse Textile URLs correctly" do
|
||||
@item.stub!(:notes).and_return("\"link\":http://www.google.com/")
|
||||
render :partial => "/todos/toggle_notes", :object => @item
|
||||
response.should have_tag("a[href=\"http://www.google.com/\"]")
|
||||
end
|
||||
end
|
||||
|
|
@ -8,4 +8,4 @@ click "submit_todo_12"
|
|||
wait_for_element_not_present "css=#c1 #todo_12"
|
||||
wait_for_visible "c4"
|
||||
wait_for_visible "css=#c4 #todo_12"
|
||||
assert_not_visible "c4empty-nd"
|
||||
wait_for_not_visible "c4empty-nd"
|
||||
|
|
|
|||
|
|
@ -5,5 +5,5 @@ assert_context_count_incremented do
|
|||
type "todo_description", "a new action"
|
||||
type "todo_context_name", "Brand new context"
|
||||
click "css=#todo-form-new-action .submit_box button"
|
||||
assert_confirmation "New context \"Brand new context\" will be also created. Are you sure?"
|
||||
assert_confirmation "New context 'Brand new context' will be also created. Are you sure?"
|
||||
end
|
||||
|
|
|
|||
|
|
@ -6,5 +6,5 @@ assert_context_count_incremented do
|
|||
type "todo_project_name", "pppp"
|
||||
type "todo_context_name", "cccc"
|
||||
click "css=#todo-form-new-action .submit_box button"
|
||||
assert_confirmation "New context \"cccc\" will be also created. Are you sure?"
|
||||
assert_confirmation "New context 'cccc' will be also created. Are you sure?"
|
||||
end
|
||||
|
|
|
|||
|
|
@ -5,5 +5,5 @@ assert_context_count_incremented do
|
|||
type "todo_description", "a new action"
|
||||
type "todo_context_name", "Brand new context"
|
||||
click "css=#todo-form-new-action .submit_box button"
|
||||
assert_confirmation "New context \"Brand new context\" will be also created. Are you sure?"
|
||||
assert_confirmation "New context 'Brand new context' will be also created. Are you sure?"
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
setup :fixtures => :all
|
||||
login :as => 'admin'
|
||||
open "/"
|
||||
wait_for_element_present '//div[@id="line_todo_5"]//img[@alt="Defer 1 day"]/..'
|
||||
click '//div[@id="line_todo_5"]//img[@alt="Defer 1 day"]/..'
|
||||
wait_for_element_present '//div[@id="line_todo_5"]//img[@alt="Defer one day"]/..'
|
||||
click '//div[@id="line_todo_5"]//img[@alt="Defer one day"]/..'
|
||||
wait_for_element_not_present "todo_5"
|
||||
assert_text 'badge_count', '10'
|
||||
wait_for_not_visible "c5"
|
||||
|
|
|
|||
|
|
@ -3,4 +3,4 @@ login :as => 'admin'
|
|||
open '/'
|
||||
click "xpath=//div[@id='completed_container'] //div[@id='todo_3'] //input[@class='item-checkbox']"
|
||||
wait_for_element_present "xpath=//div[@id='c4'] //div[@id='todo_3']"
|
||||
assert_not_visible "c4empty-nd"
|
||||
wait_for_not_visible "c4empty-nd"
|
||||
|
|
|
|||
|
|
@ -1,18 +0,0 @@
|
|||
setup :fixtures => :all
|
||||
login :as => 'admin'
|
||||
|
||||
open '/m'
|
||||
wait_for_text 'css=h1 span.count', '11'
|
||||
|
||||
click_and_wait "link=0-New action"
|
||||
|
||||
type "todo_notes", "test notes"
|
||||
type "todo_description", "test name"
|
||||
select "todo_context_id", "label=call"
|
||||
select "todo_project_id", "label=Make more money than Billy Gates"
|
||||
select "todo_due_3i", "label=1"
|
||||
select "todo_due_2i", "label=January"
|
||||
select "todo_due_1i", "label=2011"
|
||||
click_and_wait "//input[@value='Create']"
|
||||
|
||||
wait_for_text 'css=h1 span.count', '12'
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
setup :fixtures => :all
|
||||
login :as => 'admin'
|
||||
|
||||
open '/m'
|
||||
wait_for_text 'css=h1 span.count', '11'
|
||||
|
||||
open '/todos/6.m'
|
||||
wait_for_page_to_load 3000
|
||||
|
||||
click "done"
|
||||
click_and_wait "//input[@value='Update']"
|
||||
|
||||
wait_for_text 'css=h1 span.count', '10'
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
setup :fixtures => :all
|
||||
login :as => 'admin'
|
||||
|
||||
# open home page
|
||||
open '/m'
|
||||
wait_for_title "All actions"
|
||||
wait_for_text 'css=h1 span.count', '11'
|
||||
|
||||
# open context page
|
||||
click_and_wait "link=2-Contexts"
|
||||
# verify_title "All actions in context agenda"
|
||||
# choose agenda context
|
||||
click_and_wait "link=agenda"
|
||||
wait_for_text 'css=h1 span.count', '6'
|
||||
|
||||
# click on tag foo to go to tag page
|
||||
click_and_wait "link=foo"
|
||||
verify_title "TRACKS::Tagged with 'foo'"
|
||||
wait_for_text 'css=h1 span.count', '2'
|
||||
|
||||
click_and_wait "link=3-Projects"
|
||||
wait_for_text 'css=h1 span.count', '3'
|
||||
click_and_wait "link=Build a working time machine"
|
||||
wait_for_text 'css=h1 span.count', '3'
|
||||
|
||||
# follow link of action to edit form and mark done
|
||||
click_and_wait "link=Select Delorean model"
|
||||
click "done"
|
||||
click_and_wait "//input[@value='Update']"
|
||||
wait_for_text 'css=h1 span.count', '2'
|
||||
|
||||
# just test the navigation.
|
||||
click_and_wait "link=Tickler"
|
||||
wait_for_text 'css=h1 span.count', '1'
|
||||
click_and_wait "link=Feeds"
|
||||
|
|
@ -8,5 +8,5 @@ click "submit_todo_15"
|
|||
wait_for_element_not_present "css=#c6 #todo_15"
|
||||
wait_for_visible "c5"
|
||||
wait_for_visible "css=#c5 #todo_15"
|
||||
assert_not_visible "c5empty-nd"
|
||||
wait_for_not_visible "c5empty-nd"
|
||||
wait_for_not_visible "c6"
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ assert_context_count_incremented do
|
|||
type "todo_project_name", "None"
|
||||
type "todo_show_from", "1/1/2030"
|
||||
click "css=#todo-form-new-action .submit_box button"
|
||||
assert_confirmation "New context \"errands\" will be also created. Are you sure?"
|
||||
assert_confirmation "New context 'errands' will be also created. Are you sure?"
|
||||
end
|
||||
wait_for_not_visible "tickler-empty-nd"
|
||||
wait_for_element_present "css=div.item-container a[title=01/01/2030]"
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue