From bc73b18bed08cdb499d3c3708e516eaced7f7d7c Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Fri, 11 Mar 2011 21:01:24 +0100 Subject: [PATCH] fix #1123 and fix #1124 and refactor drag and drop a bit --- app/controllers/todos_controller.rb | 23 +- app/views/todos/add_predecessor.js.erb | 20 +- config/locales/en.yml | 1 + config/locales/nl.yml | 399 +++++++++--------- features/dependencies.feature | 15 +- .../step_definitions/dependencies_steps.rb | 3 +- features/step_definitions/generic_steps.rb | 31 ++ features/step_definitions/todo_steps.rb | 3 + public/javascripts/application.js | 180 ++++---- 9 files changed, 364 insertions(+), 311 deletions(-) diff --git a/app/controllers/todos_controller.rb b/app/controllers/todos_controller.rb index 61892c55..57da225b 100644 --- a/app/controllers/todos_controller.rb +++ b/app/controllers/todos_controller.rb @@ -241,15 +241,19 @@ class TodosController < ApplicationController @predecessor = current_user.todos.find(params['predecessor']) @todo = current_user.todos.find(params['successor']) @original_state = @todo.state - # Add predecessor - @todo.add_predecessor(@predecessor) - @todo.state = 'pending' - @saved = @todo.save + unless @predecessor.completed? + # Add predecessor + @todo.add_predecessor(@predecessor) + @todo.state = 'pending' + @saved = @todo.save + + @status_message = t('todos.added_dependency', :dependency => @predecessor.description) + @status_message += t('todos.set_to_pending', :task => @todo.description) unless @original_state == 'pending' + else + @saved = false + end respond_to do |format| - format.js { - @status_message = t('todos.added_dependency', :dependency => @predecessor.description) - @status_message += t('todos.set_to_pending', :task => @todo.description) unless @original_state == 'pending' - } + format.js end end @@ -342,7 +346,8 @@ class TodosController < ApplicationController @saved = @todo.save @context_changed = true - @message = t('todos.context_changed', :name => @context.name) + @status_message = t('todos.context_changed', :name => @context.name) + determine_down_count determine_remaining_in_context_count(@original_item_context_id) respond_to do |format| diff --git a/app/views/todos/add_predecessor.js.erb b/app/views/todos/add_predecessor.js.erb index 25517fbc..69af584b 100644 --- a/app/views/todos/add_predecessor.js.erb +++ b/app/views/todos/add_predecessor.js.erb @@ -1,6 +1,11 @@ -<% if !@saved -%> +<% if !@saved + if @predecessor.completed? -%> + TracksPages.page_notify('error', "<%= t('todos.cannot_add_dependency_to_completed_todo') %>", 8); + $('#<%=dom_id(@todo)%>').html(html_for_todo()); +<% else -%> TracksPages.page_notify('error', "<%= t('todos.unable_to_add_dependency') %>", 8); -<% else -%> +<% end + else -%> remove_successor_from_page(); replace_updated_predecessor(); regenerate_predecessor_family(); @@ -19,7 +24,7 @@ function replace_updated_predecessor() { function show_in_tickler_box() { $("#tickler-empty-nd").hide(); - $('#tickler').append( html_for_deferred_todo() ); + $('#tickler').append( html_for_todo() ); } function regenerate_predecessor_family() { @@ -37,9 +42,12 @@ function html_for_predecessor() { return "<%= escape_javascript(render(:partial => @predecessor, :locals => { :parent_container_type => parent_container_type })) %>"; } -function html_for_deferred_todo() { +<% end # if !@saved + +# following js is needed in case of an error with dragging onto a completed action althoug +%> + +function html_for_todo() { return "<%= escape_javascript(render(:partial => @todo, :locals => { :parent_container_type => parent_container_type })) %>"; } -<% end # if !@saved -%> \ No newline at end of file diff --git a/config/locales/en.yml b/config/locales/en.yml index e88710f1..a0869af1 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -557,6 +557,7 @@ en: set_to_pending: "%{task} set to pending" append_in_this_project: "in this project" unable_to_add_dependency: "Unable to add dependency" + cannot_add_dependency_to_completed_todo : "Cannot add this action as a dependency to a completed action!" calendar: due_today: "Due today" no_actions_due_today: "No actions due today" diff --git a/config/locales/nl.yml b/config/locales/nl.yml index e8ab0851..bf844bfe 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -27,8 +27,8 @@ nl: 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_before_id: Nieuwe actie met ID applescript_success_after_id: gemaakt + applescript_success_before_id: Nieuwe actie met ID common: third: Derde actions: Acties @@ -36,43 +36,43 @@ nl: add: Toevoegen logout: Log uit go_back: Ga terug - second: Tweede none: Geen + second: Tweede cancel: Annuleer optional: optioneel notes: Notities - server_error: Een fout heeft op de server plaatsgevonden forum: Forum + server_error: Een fout heeft op de server plaatsgevonden last: Laatste action: Actie projects: Projecten project: Project - ok: Ok contribute: Bijdragen + ok: Ok first: Eerste - website: Website numbered_step: Stap %{number} - fourth: Vierde + website: Website context: Context - errors_with_fields: Er waren problemen met de volgende velden - drag_handle: SLEEP + fourth: Vierde 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 - alphabetically_title: Sorteer projecten alphabetisch sort: Sorteer + alphabetically_title: Sorteer projecten alphabetisch alphabetically_confirm: Weet u zeker dat u deze projecten alphabetisch wilt sorteren? Dat zal de huidige sorteervolgorde aanpassen. by_task_count: Bij aantal acties + errors_with_fields: Er waren problemen met de volgende velden create: Maken + drag_handle: SLEEP description: Beschrijving contexts: Contexten update: Bijwerken - wiki: Wiki bugs: Fouten + wiki: Wiki email: E-mail - ajaxError: Er is een fout opgetreden bij het ophalen van gegevens van de server search: Zoeken + ajaxError: Er is een fout opgetreden bij het ophalen van gegevens van de server layouts: toggle_notes: Toggle notities next_actions_rss_feed: RSS-feed van de acties @@ -87,26 +87,26 @@ nl: contexts: 2-Contexten home: 1-Start navigation: - manage_users_title: Toevoegen of verwijderen gebruikers recurring_todos: Terugkerende acties + manage_users_title: Toevoegen of verwijderen gebruikers api_docs: REST API Docs feeds: Feeds - stats: Statistieken starred: Ster notes_title: Toon alle notities + stats: Statistieken tickler_title: Tickler manage_users: Beheren gebruikers export_title: Import en export van gegevens - integrations_: Integreer Tracks preferences: Voorkeuren - calendar_title: Kalender met acties met deadline + integrations_: Integreer Tracks feeds_title: Zie een lijst met beschikbare feeds + calendar_title: Kalender met acties met deadline + stats_title: Zie je statistieken home_title: Start starred_title: Zie je ster acties - recurring_todos_title: Beheren terugkerende acties tickler: Tickler + recurring_todos_title: Beheren terugkerende acties completed_tasks: Gereed - stats_title: Zie je statistieken view: Bekijk organize: Organiseer completed_tasks_title: Afgerond @@ -152,19 +152,19 @@ nl: 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 + mobile_todos_per_page: Acties per pagina (mobiel) 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 + staleness_starts: Begin van markeren openstaande actie title_date_format: Datum formaat in titel + show_number_completed: Aantal te tonen afgeronde acties 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 + sms_email: Van email show_completed_projects_in_sidebar: Toon afgeronde projecten in sidebar user: last_name: Achternaam @@ -179,8 +179,8 @@ nl: exclusion: is gereserveerd invalid: mag niet een komma (',') karakter bevatten odd: moet oneven zijn - empty: mag niet leeg zijn wrong_length: heeft de verkeerde lengte (moet %{count} karakters lang zijn) + empty: mag niet leeg zijn even: moet even zijn too_short: is te kort (minimum is %{count} karakters) less_than: moet kleiner zijn dan %{count} @@ -206,52 +206,49 @@ nl: full_messages: format: "%{attribute} %{message}" stats: - totals_active_project_count: Van deze zijn %{count} actieve projecten tag_cloud_title: Tag Cloud voor alle acties tag_cloud_description: Deze tag cloud bevat tags van alle acties (afgerond, niet voltooid, zichtbaar en / of verborgen) tag_cloud_90days_title: Tag cloud met acties in afgelopen 90 dagen - actions_avg_completion_time: Van al uw afgeronde acties, de gemiddelde tijd dat dit in beslag nam is %{count} dagen. + totals_active_project_count: Van deze zijn %{count} actieve projecten actions_last_year_legend: number_of_actions: Aantal acties months_ago: Maanden geleden totals_first_action: Sinds uw eerste actie op %{date} - actions_dow_30days_title: Dag van de week (laatste 30 dagen) - current_running_time_of_incomplete_visible_actions: Huidige looptijd van onvolledige zichtbare acties + actions_avg_completion_time: Van al uw afgeronde acties, de gemiddelde tijd dat dit in beslag nam is %{count} dagen. running_time_legend: actions: Acties percentage: Percentage 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 + number_of_days: Aantal dagen geleden number_of_actions: Aantal acties day_of_week: Dag van de week 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 + actions_dow_30days_title: Dag van de week (laatste 30 dagen) + current_running_time_of_incomplete_visible_actions: Huidige looptijd van onvolledige zichtbare acties 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. - totals_visible_context_count: Van deze zijn %{count} zichtbare contexten - totals_blocked_actions: "%{count} zijn afhankelijk van de voltooiing van hun acties." + top5_contexts: Top 5 contexten + actions_lastyear_title: Acties in de afgelopen 12 maanden action_completion_time_title: Doorlooptijd (alle voltooide acties) actions_last_year: Acties in de afgelopen jaren totals_context_count: U heeft %{count} contexten. - actions_min_completion_time: De minimale tijd tot afronding is %{time}. + totals_visible_context_count: Van deze zijn %{count} zichtbare contexten + totals_blocked_actions: "%{count} zijn afhankelijk van de voltooiing van hun acties." no_tags_available: geen tags beschikbaar actions_day_of_week_title: Dag van de week (alle acties) 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. + tags: Tags + actions_min_completion_time: De minimale tijd tot afronding is %{time}. time_of_day: Tijd van de dag (alle acties) actions_30days_title: Acties in de afgelopen 30 dagen totals_hidden_project_count: "%{count} zijn verborgen" @@ -259,24 +256,31 @@ 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) - 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 + 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. 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 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. + 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 + 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 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. - 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. + running_time_all_legend: + actions: Acties + running_time: Looptijd van een actie (weken). Klik op een balk voor meer info + percentage: Percentage labels: month_avg_completed: "%{months} gem afgerond per maand" completed: Afgerond @@ -284,23 +288,19 @@ 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 - action_selection_title: "TRACKS:: Actie selectie" - actions_actions_avg_created_30days: In de afgelopen 30 dagen heeft u gemiddeld %{count} acties gemaakt + no_actions_selected: Er zijn geen acties geselecteerd. tod30_legend: number_of_actions: Aantal acties time_of_day: Tijd van de dag + action_selection_title: "TRACKS:: Actie selectie" + actions_actions_avg_created_30days: In de afgelopen 30 dagen heeft u gemiddeld %{count} acties gemaakt todos: - recurring_action_deleted: Actie werd verwijderd. Omdat deze actie herhalend is. werd een nieuwe actie toegevoegd + completed_actions: Voltooide acties show_from: Toon vanaf error_starring_recurring: Kon niet de ster van deze terugkerende actie niet omgezetten \'%{description}\' - completed_actions: Voltooide acties - added_new_next_action: Nieuwe actie toegevoegd + recurring_action_deleted: Actie werd verwijderd. Omdat deze actie herhalend is. werd een nieuwe actie toegevoegd completed_recurring: Afgesloten terugkerende todos + added_new_next_action: Nieuwe actie toegevoegd 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 @@ -312,17 +312,17 @@ nl: completed: Afgerond no_deferred_actions_with: Geen uitgestelde acties met de tag '%{tag_name}' no_hidden_actions: Momenteel zijn er geen verborgen acties gevonden - edit_action_with_description: Bewerk de actie '%{description}' action_due_on: (deadline actie op %{date}) - archived_tasks_title: "TRACKS:: Gearchiveerde voltooide taken" + edit_action_with_description: Bewerk de actie '%{description}' remove_dependency: Verwijder afhankelijkheid (zal niet de actie zelf verwijderen) + archived_tasks_title: "TRACKS:: Gearchiveerde voltooide taken" list_incomplete_next_actions: Toon onvoltooide acties - tags: Tags (gescheiden door komma's) action_deleted_success: Actie succesvol verwijderd - mobile_todos_page_title: Alle acties + 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}' add_another_dependency: Nog een afhankelijkheid toevoegen + mobile_todos_page_title: Alle acties delete_recurring_action_title: Verwijder de terugkerende actie removed_predecessor: "'%{successor}' is verwijderd als afhankelijkheid van '%{predecessor}'." recurring_actions_title: TRACKS::Terugkerende acties @@ -333,7 +333,6 @@ 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" added_new_project: Nieuw project toegevoegd @@ -341,9 +340,10 @@ nl: completed: acties voltooid due_today: deadline vandaag due_within_a_week: deadline binnen een week - task_list_title: TRACKS::Toon acties + older_completed_items: Oudere voltooide items 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}' @@ -351,18 +351,18 @@ nl: 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? 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 + no_project: -- Geen project -- + error_saving_recurring: Er is een fout opgetreden het opslaan van de terugkerende actie '%{description}' 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}' + completed_actions_with: Afgeronde acties met de tag %{tag_name} older_than_days: Ouder dan %{count} dagen edit: Bewerken pending: Wachtend - completed_actions_with: Afgeronde acties met de tag %{tag_name} - deleted_success: De actie werd met succes verwijderd. completed_tasks_title: TRACKS::Voltooide taken + deleted_success: De actie werd met succes verwijderd. 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 @@ -383,10 +383,10 @@ nl: 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 acties @@ -401,6 +401,7 @@ nl: recurring_todos: Terugkerende acties delete: Verwijder drag_action_title: Sleep naar een andere actie om deze afhankelijk te maken van die actie + cannot_add_dependency_to_completed_todo: Kan deze actie niet als een afhankelijkheid van een voltooide actie toevoegen! depends_on: Hangt af van tickler_items_due: one: Een tickler item wordt nu zichtbaar - vernieuw de pagina om het te zien. @@ -416,70 +417,70 @@ nl: calendar: get_in_ical_format: Ontvang deze agenda in iCal-formaat due_next_week: Deadline deze week - due_this_week: Deadline in rest van deze week no_actions_due_next_week: Geen acties met deadline in volgende week - no_actions_due_today: Geen acties met deadline vandaag + due_this_week: Deadline in rest van deze week due_today: Deadline vandaag + no_actions_due_today: Geen acties met deadline vandaag due_next_month_and_later: Deadline in %{month} en later no_actions_due_after_this_month: Geen acties met deadline na deze maand - due_this_month: Deadline in rest van %{month} no_actions_due_this_month: Geen acties met deadline in de rest van deze maand + due_this_month: Deadline in rest van %{month} recurrence: 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 weekly: Wekelijks - monthly: Maandelijks + monthly_options: Instellingen voor maandelijks terugkerende acties starts_on: Begint op daily_options: Instellingen voor dagelijks terugkerende acties - show_option_always: altijd + monthly: Maandelijks daily: Dagelijks - yearly_every_x_day: Elke %{month} %{day} + show_option_always: altijd recurrence_on_options: Stel herhaling in op + yearly_every_x_day: Elke %{month} %{day} daily_every_number_day: Elke %{number} dag(en) - 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 - 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} + ends_on: Eindigt op + weekly_every_number_week: Herhaalt elke %{number} weken op from_tickler: de datum dat de actie uit de tickler komt (geen deadline ingesteld) no_end_date: Geen einddatum + yearly_every_xth_day: De %{day} %{day_of_week} van %{month} day_x_on_every_x_month: Dag %{day} op elke %{month} maand - yearly: Jaarlijks + yearly_options: Instellingen voor jaarlijks terugkerende acties + show_days_before: "%{days} dagen v\xC3\xB3\xC3\xB3r de deadline van actie" monthly_every_xth_day: De %{day} %{day_of_week} van elke %{month} maand + yearly: Jaarlijks 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 + action_marked_complete_error: De actie '%{description}' is niet gemarkeerd als %{completed} vanwege een fout op de server. no_actions_found: Momenteel zijn er geen onafgeronde acties. in_pending_state: in wachtende toestand due: Deadline - action_marked_complete_error: De actie '%{description}' is niet gemarkeerd als %{completed} vanwege een fout op de server. - 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) - action_saved_to_tickler: Actie opgeslagen in tickler + overdue: Achterstallig recurring_action_saved: Terugkerende actie opgeslagen + action_saved_to_tickler: Actie opgeslagen in tickler + depends_on_separate_with_commas: Afhankelijk van (gescheiden door komma's) 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 - overdue: Achterstallig - 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 no_incomplete_actions: Er zijn geen onvoltooide acties + add_new_recurring: Voeg een nieuwe terugkerende actie toe notes: - delete_note_title: Verwijder de notitie '%{id}' delete_confirmation: Weet u zeker dat u de notitie '%{id}' wilt verwijderen? delete_item_title: Verwijder item - deleted_note: Verwijder notitie '%{id}' + delete_note_title: Verwijder de notitie '%{id}' note_link_title: Toon notitie %{id} show_note_title: Toon notitie + deleted_note: Verwijder notitie '%{id}' note_location_link: "In:" edit_item_title: Item bewerken note_header: Notitie %{id} @@ -487,6 +488,14 @@ nl: 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." + time: + am: ochtend + formats: + default: "%A, %d %B %Y %H:%M:%S %z" + time: "%H:%M" + short: "%d %B %H:%M" + long: "%A, %d. %B %Y, %H:%M" + pm: middag states: hidden_plural: Verborgen completed: Afgerond @@ -496,81 +505,73 @@ nl: active_plural: Actieve active: Actief hidden: Verborgen - time: - am: ochtend - formats: - default: "%A, %d %B %Y %H:%M:%S %z" - time: "%H:%M" - short: "%d %B %H:%M" - long: "%A, %d. %B %Y, %H:%M" - pm: middag preferences: 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" + open_id_url: Uw OpenID URL is change_password: Wijzig uw wachtwoord - token_description: Token (voor feeds en API gebruik) + page_title: "TRACKS:: Voorkeuren" title: Uw voorkeuren + token_description: Token (voor feeds en API gebruik) show_number_completed: Toon %{number} voltooide items edit_preferences: Voorkeuren bewerken page_title_edit: "TRACKS:: Voorkeuren bewerken" 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 + no_actions_in_project: Momenteel zijn er geen onafgeronde acties in dit project edit_project_title: Bewerk project - page_title: "TRACKS:: Project: %{project}" + was_marked_hidden: is gemarkeerd als verborgen + default_tags_removed_notice: De standaard tags zijn verwijderd + default_context_set: Stel project standaard context in op %{default_context} hide_form: Verberg formulier - deferred_actions_empty: Er zijn geen uitgestelde acties voor dit project - project_state: Project is %{state}. + page_title: "TRACKS:: Project: %{project}" 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 + deferred_actions_empty: Er zijn geen uitgestelde acties voor dit project + this_project: Dit project + project_state: Project is %{state}. 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 + notes_empty: Er zijn geen notities voor dit project + 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 '%{name} wilt verwijderen? + actions_in_project_title: Acties in dit project + with_default_context: met een standaard context '%{context_name}' + is_active: is actief + settings: Instellingen + completed_projects: Voltooide projecten with_default_tags: en met '%{tags}' als de standaard tags + list_projects: "TRACKS:: Overzicht van projecten" + add_project: Voeg project toe 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:: Overzicht van projecten" - is_active: is actief - add_project: Voeg project toe - delete_project_title: Verwijder het project hidden_projects: Verborgen projecten - default_context_removed: Standaard context verwijderd + delete_project_title: Verwijder het project completed_actions: Afgeronde acties voor dit project + default_context_removed: Standaard context verwijderd add_note_submit: Notitie toevoegen was_marked_complete: is gemarkeerd als voltooid + with_no_default_tags: en zonder standaard tags default_context: De standaard context voor dit project is %{context} + active_projects: Actieve projecten + edit_project_settings: Bewerk project instellingen + state: Dit project is %{state} 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} date: month_names: - @@ -586,6 +587,10 @@ nl: - Oktober - November - December + order: + - :day + - :month + - :year abbr_day_names: - Zo - Ma @@ -594,10 +599,6 @@ nl: - Do - Vr - Za - order: - - :day - - :month - - :year formats: only_day: "%e" default: "%d-%m-%Y" @@ -634,20 +635,6 @@ nl: 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_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 - project_for_all_actions: Project voor alle acties - context_for_all_actions: Context voor alle acties - 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 @@ -670,56 +657,87 @@ nl: - 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 + 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 + tags_for_all_actions: Tags voor alle acties (scheiden met een komma) + toggle_single_title: Voeg een nieuwe actie toe + project_for_all_actions: Project voor alle acties + context_for_all_actions: Context voor alle acties + toggle_multi: Voeg meerdere acties toe + separate_tags_with_commas: gescheiden door komma's + toggle_multi_title: Toggle single / multi actie formulier + hide_action_form_title: Verberg nieuwe actie formulier 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 + new_token_generated: Nieuwe token met succes gegenereerd total_projects: Totaal aantal projecten signup_successful: Aanmelding succesvol voor gebruiker %{username}. - new_token_generated: Nieuwe token met succes gegenereerd no_signups_title: "TRACKS:: Geen nieuwe aanmeldingen" user_created: Gebruiker aangemaakt. change_password_submit: Wachtwoord wijzigen account_signup: Aanmelden voor een account - password_updated: Wachtwoord bijgewerkt. manage_users: Beheren gebruikers - signup: Aanmelden - confirm_password: Bevestig wachtwoord + password_updated: Wachtwoord bijgewerkt. new_user_heading: "Registreer een nieuwe gebruiker:" + signup: Aanmelden auth_type_updated: Authenticatietype bijgewerkt. total_actions: Totaal aanal acties desired_login: Gewenste login - password_confirmation_label: Bevestig wachtwoord - destroy_error: Er is een fout opgetreden bij het verwijderen van de gebruiker '%{login}' - choose_password: Kies een wachtwoord + confirm_password: Bevestig 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. + password_confirmation_label: Bevestig wachtwoord + destroy_error: Er is een fout opgetreden bij het verwijderen van de gebruiker '%{login}' + choose_password: Kies een wachtwoord label_auth_type: Authenticatietype new_password_label: Nieuw wachtwoord register_with_cas: Met uw CAS gebruikersnaam + new_user_title: "TRACKS:: Aanmelden als de admin gebruiker" destroy_user: Verwijder de gebruiker total_users_count: Je hebt een totaal van %{count} gebruikers - 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 - change_authentication_type: Wijzigen authenticatietype 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 + change_authentication_type: Wijzigen authenticatietype + auth_change_submit: Wijzigen authenticatietype select_authentication_type: Selecteer uw nieuwe authenticatie type en klik op 'Wijzigen authenticatietype' om uw huidige instellingen te vervangen. + 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 + legend: Legenda + ical_feed: iCal feed + all_contexts: Alle contexten + all_projects: Alle projecten + choose_project: Kies het project waar je een feed van wilt + select_feed_for_project: Kies de feed voor dit project + 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" + 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." + 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 + context_centric_actions: Feeds voor onafgeronde acties in een specifieke context + project_centric: Feeds voor onafgeronde acties in een specifiek project contexts: delete_context_title: Verwijder context hide_form: Verberg formulier @@ -731,44 +749,27 @@ 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 + save_status_message: Context bewaard context_name: Context naam 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 + 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 datetime: prompts: minute: Minuut @@ -816,33 +817,33 @@ nl: half_a_minute: halve minuut login: user_no_expiry: Blijf ingelogd - 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 + login_cas: Ga naar het CAS 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 + 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}) - mobile_use_openid: ... if inloggen met een OpenID cas_create_account: Als u willen vragen ga hier om %{signup_link} + mobile_use_openid: ... if inloggen met een OpenID account_login: Account login cas_signup_link: Aanvragen account session_will_not_expire: sessie zal niet verlopen. successful: Succesvol aangemeld. Welkom terug! + session_time_out: Sessie is verlopen. Gelieve %{link} 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: opnieuw in te loggen. + logged_out: Je bent afgemeld bij Tracks. search: contexts_matching_query: Contexten passend bij zoekopdracht tags_matching_query: Tags passend bij zoekopdracht - 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. + todos_matching_query: Todos passend bij zoekopdracht + projects_matching_query: Projecten passend bij zoekopdracht diff --git a/features/dependencies.feature b/features/dependencies.feature index b15f6377..591f345f 100644 --- a/features/dependencies.feature +++ b/features/dependencies.feature @@ -1,6 +1,6 @@ Feature: dependencies As a Tracks user - In order to keep track of complex todos + In order to keep track of complex todos that are dependent on each other I want to assign and manage todo dependencies Background: @@ -94,3 +94,16 @@ Feature: dependencies Scenario: Deleting a successor will update predecessor Given this is a pending scenario + + @selenium @wip + Scenario: Dragging an action to a completed action will not add it as a dependency + Given I have a context called "@pc" + And I have a project "dependencies" that has the following todos + | description | context | completed | + | test 1 | @pc | no | + | test 2 | @pc | no | + | test 3 | @pc | yes | + When I visit the "dependencies" project + And I drag "test 1" to "test 3" + Then I should see an error flash message saying "Cannot add this action as a dependency to a completed action!" + And I should see "test 1" in project container for "dependencies" \ No newline at end of file diff --git a/features/step_definitions/dependencies_steps.rb b/features/step_definitions/dependencies_steps.rb index 26833079..5de5cde4 100644 --- a/features/step_definitions/dependencies_steps.rb +++ b/features/step_definitions/dependencies_steps.rb @@ -15,8 +15,7 @@ When /^I drag "(.*)" to "(.*)"$/ do |dragged, target| 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) + wait_for_ajax end When /^I expand the dependencies of "([^\"]*)"$/ do |todo_name| diff --git a/features/step_definitions/generic_steps.rb b/features/step_definitions/generic_steps.rb index c21113a5..be22dcdc 100644 --- a/features/step_definitions/generic_steps.rb +++ b/features/step_definitions/generic_steps.rb @@ -34,3 +34,34 @@ Then /^I should not see the context "([^"]*)"$/ do |context_name| !selenium.is_visible("xpath=//div[@id='c#{context.id}']") end end + +Then /^I should see an error flash message saying "([^"]*)"$/ do |message| + xpath = "//div[@id='message_holder']/h4[@id='flash']" + text = response.selenium.get_text("xpath=#{xpath}") + text.should == message +end + +Then /^I should see "([^"]*)" in context container for "([^"]*)"$/ do |todo_description, context_name| + context = @current_user.contexts.find_by_name(context_name) + context.should_not be_nil + todo = @current_user.todos.find_by_description(todo_description) + todo.should_not be_nil + + xpath = "xpath=//div[@id=\"c#{context.id}\"]//div[@id='line_todo_#{todo.id}']" + selenium.wait_for_element(xpath, :timeout_in_seconds => 5) + selenium.is_visible(xpath).should be_true +end + +Then /^I should see "([^"]*)" in project container for "([^"]*)"$/ do |todo_description, project_name| + todo = @current_user.todos.find_by_description(todo_description) + todo.should_not be_nil + + project = @current_user.projects.find_by_name(project_name) + project.should_not be_nil + + xpath = "//div[@id='p#{project.id}items']//div[@id='line_todo_#{todo.id}']" + + selenium.wait_for_element("xpath=#{xpath}", :timeout_in_seconds => 5) + selenium.is_visible(xpath).should be_true +end + diff --git a/features/step_definitions/todo_steps.rb b/features/step_definitions/todo_steps.rb index 8e122f72..a9d9f4da 100644 --- a/features/step_definitions/todo_steps.rb +++ b/features/step_definitions/todo_steps.rb @@ -65,6 +65,9 @@ Given /^I have a project "([^"]*)" that has the following todos$/ do |project_na unless todo[:tags].nil? new_todo.tag_with(todo[:tags]) end + unless todo[:completed].nil? + new_todo.complete! if todo[:completed] == 'yes' + end end end diff --git a/public/javascripts/application.js b/public/javascripts/application.js index d964d8f7..592909ec 100644 --- a/public/javascripts/application.js +++ b/public/javascripts/application.js @@ -171,7 +171,7 @@ var TracksPages = { Nifty("div#project_new_project_container","normal"); }, page_notify: function(type, message, fade_duration_in_sec) { - var flash = $('h4#flash'); + var flash = $('div#message_holder'); flash.html("

"+message+"

"); flash = $('h4#flash'); flash.show(); @@ -228,6 +228,33 @@ var TracksPages = { selectFirst: true }); }, + setup_all_autocompleters: function() { + //fix for #1036 where closing a edit form before the autocomplete was filled + //resulted in a dropdown box that could not be removed. We remove all + //autocomplete boxes the hard way + $('.ac_results').remove(); + + // initialize autocompleters + 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(); + }, + setup_datepicker: function() { + $('input.Date').datepicker({ + 'dateFormat': dateFormat, + 'firstDay': weekStart, + 'showButtonPanel': true, + 'showWeek': true, + 'changeMonth': true, + 'changeYear': true, + 'maxDate': '+5y', + 'minDate': '-1y', + 'showAnim': '' /* leave empty, see #1117 */ + }); + }, setup_behavior: function () { /* main menu */ $('ul.sf-menu').superfish({ @@ -436,6 +463,53 @@ var TodoItems = { selectFirst: true }); }, + drag_todo: function() { + $('.drop_target').show(); + $(this).parents(".container").find(".context_target").hide(); + }, + drop_todo: function(evt, ui) { + /* Drag & Drop for successor/predecessor */ + var dragged_todo = ui.draggable[0].id.split('_')[2]; + var dropped_todo = this.id.split('_')[2]; + ui.draggable.remove(); + $('.drop_target').hide(); // IE8 doesn't call stop() in this situation + + 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); + }, + drop_todo_on_context: function(evt, ui) { + /* Drag & drop for changing contexts */ + var target = $(this).parent().get(); + var dragged_todo = ui.draggable[0].id.split('_')[2]; + var context_id = this.id.split('_')[1]; + ui.draggable.remove(); + $('.drop_target').hide(); + + ajax_options = default_ajax_options_for_scripts('POST', relative_to_root('todos/change_context'), target); + ajax_options.data += "&todo[id]="+dragged_todo + "&todo[context_id]="+context_id + $.ajax(ajax_options); + }, + setup_drag_and_drop: function() { + $('.item-show').draggable({ + handle: '.grip', + revert: 'invalid', + start: TodoItems.drag_todo, + stop: function() { + $('.drop_target').hide(); + } + }); + $('.item-show').droppable({ + drop: TodoItems.drop_todo, + tolerance: 'pointer', + hoverClass: 'hover' + }); + $('.context_target').droppable({ + drop: TodoItems.drop_todo_on_context, + tolerance: 'pointer', + hoverClass: 'hover' + }); + }, setup_behavior: function() { /* show the notes of a todo */ $(".show_notes").live('click', function () { @@ -968,21 +1042,21 @@ function default_ajax_options_for_submit(ajax_type, element_to_block) { var options = { type: ajax_type, async: true, - context: element_to_block, + block_element: element_to_block, data: "_source_view=" + SOURCE_VIEW, beforeSend: function() { - // console.debug('data: '+this.data); - if (this.context) { - $(this.context).block({ + if (this.block_element) { + $(this.block_element).block({ message: null }); } }, complete: [function() { - if (this.context) { - $(this.context).unblock(); + if (this.block_element) { + $(this.block_element).unblock(); } - enable_rich_interaction(); + // delay a bit to wait for animations to finish + setTimeout(function(){enable_rich_interaction();}, 500); }], error: function(req, status) { TracksPages.page_notify('error', i18n['common.ajaxError']+': '+status, 8); @@ -1098,30 +1172,9 @@ function project_defaults(){ function enable_rich_interaction(){ // called after completion of all AJAX calls - //fix for #1036 where closing a edit form before the autocomplete was filled - //resulted in a dropdown box that could not be removed. We remove all - //autocomplete boxes the hard way - $('.ac_results').remove(); - - $('input.Date').datepicker({ - 'dateFormat': dateFormat, - 'firstDay': weekStart, - 'showButtonPanel': true, - 'showWeek': true, - 'changeMonth': true, - 'changeYear': true, - 'maxDate': '+5y', - 'minDate': '-1y', - 'showAnim': '' /* leave empty, see #1117 */ - }); - - /* Autocomplete */ - 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(); + TracksPages.setup_datepicker(); + TracksPages.setup_all_autocompleters(); + TodoItems.setup_drag_and_drop(); /* have to bind on keypress because of limitations of live() */ $('input[name=project_name]').live('keypress', function(){ @@ -1134,72 +1187,11 @@ function enable_rich_interaction(){ $(this).attr('edited', 'true'); }); - /* Drag & Drop for successor/predecessor */ - function drop_todo(evt, ui) { - var dragged_todo = ui.draggable[0].id.split('_')[2]; - var dropped_todo = this.id.split('_')[2]; - ui.draggable.remove(); - $('.drop_target').hide(); // IE8 doesn't call stop() in this situation - - 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(){ - $('.drop_target').show(); - $(this).parents(".container").find(".context_target").hide(); - } - - $('.item-show').draggable({ - handle: '.grip', - revert: 'invalid', - start: drag_todo, - stop: function() { - $('.drop_target').hide(); - } - }); - - $('.item-show').droppable({ - drop: drop_todo, - tolerance: 'pointer', - hoverClass: 'hover' - }); - - /* Drag & drop for changing contexts */ - function drop_todo_on_context(evt, ui) { - var target = $(this); - var dragged_todo = ui.draggable[0].id.split('_')[2]; - var context_id = this.id.split('_')[1]; - ui.draggable.remove(); - target.block({ - message: null - }); - setTimeout(function() { - target.show() - }, 0); - $.post(relative_to_root('todos/change_context'), - { - "todo[id]": dragged_todo, - "todo[context_id]": context_id - }, - function(){ - target.unblock(); - target.hide(); - }, 'script'); - } - - $('.context_target').droppable({ - drop: drop_todo_on_context, - tolerance: 'pointer', - hoverClass: 'hover' - }); - /* Reset auto updater */ 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: '',