xrono 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +19 -0
- data/.rspec +1 -0
- data/.travis.yml +20 -0
- data/Gemfile +30 -0
- data/Gemfile.lock +336 -0
- data/LICENSE +21 -0
- data/README.md +64 -0
- data/RELEASE_NOTES.md +83 -0
- data/Rakefile +15 -0
- data/XRONO.md +64 -0
- data/app/assets/images/chosen-sprite.png +0 -0
- data/app/assets/images/grid.png +0 -0
- data/app/assets/images/isotope_logo.png +0 -0
- data/app/assets/images/logo.png +0 -0
- data/app/assets/images/logo_122x40.png +0 -0
- data/app/assets/images/logo_97x40.png +0 -0
- data/app/assets/images/main_bg.jpg +0 -0
- data/app/assets/images/nav_bg.jpg +0 -0
- data/app/assets/images/rails.png +0 -0
- data/app/assets/images/top_bg.jpg +0 -0
- data/app/assets/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/app/assets/images/ui-bg_flat_0_fbf9ee_40x100.png +0 -0
- data/app/assets/images/ui-bg_flat_55_fbec88_40x100.png +0 -0
- data/app/assets/images/ui-bg_flat_65_ffffff_40x100.png +0 -0
- data/app/assets/images/ui-bg_flat_75_cccccc_40x100.png +0 -0
- data/app/assets/images/ui-bg_flat_75_dadada_40x100.png +0 -0
- data/app/assets/images/ui-bg_flat_75_e6e6e6_40x100.png +0 -0
- data/app/assets/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/app/assets/images/ui-bg_flat_95_fef1ec_40x100.png +0 -0
- data/app/assets/images/ui-bg_glass_75_d0e5f5_1x400.png +0 -0
- data/app/assets/images/ui-bg_glass_85_dfeffc_1x400.png +0 -0
- data/app/assets/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/app/assets/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png +0 -0
- data/app/assets/images/ui-bg_inset-hard_100_f5f8f9_1x100.png +0 -0
- data/app/assets/images/ui-bg_inset-hard_100_fcfdfd_1x100.png +0 -0
- data/app/assets/images/ui-icons_217bc0_256x240.png +0 -0
- data/app/assets/images/ui-icons_222222_256x240.png +0 -0
- data/app/assets/images/ui-icons_2e83ff_256x240.png +0 -0
- data/app/assets/images/ui-icons_454545_256x240.png +0 -0
- data/app/assets/images/ui-icons_469bdd_256x240.png +0 -0
- data/app/assets/images/ui-icons_6da8d5_256x240.png +0 -0
- data/app/assets/images/ui-icons_888888_256x240.png +0 -0
- data/app/assets/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/app/assets/images/ui-icons_d8e7f3_256x240.png +0 -0
- data/app/assets/images/ui-icons_f9bd01_256x240.png +0 -0
- data/app/assets/javascripts/add_taxonomy.js.erb +307 -0
- data/app/assets/javascripts/admin_invoices.js +15 -0
- data/app/assets/javascripts/api/v1/clients.js.coffee +3 -0
- data/app/assets/javascripts/api/v1/tokens.js.coffee +3 -0
- data/app/assets/javascripts/application.js.erb +25 -0
- data/app/assets/javascripts/bootstrap-dropdown.js +92 -0
- data/app/assets/javascripts/bootstrap-tabs.js +80 -0
- data/app/assets/javascripts/bootstrap.js.coffee +4 -0
- data/app/assets/javascripts/calendar.js +25 -0
- data/app/assets/javascripts/chosen.jquery.js +898 -0
- data/app/assets/javascripts/client_login/clients.js.coffee +3 -0
- data/app/assets/javascripts/client_login/reports.js.coffee +3 -0
- data/app/assets/javascripts/comments.js +16 -0
- data/app/assets/javascripts/css_browser_selector.js +8 -0
- data/app/assets/javascripts/dashboard.js +3 -0
- data/app/assets/javascripts/data_vaults.js.coffee +3 -0
- data/app/assets/javascripts/file_attachments.js +9 -0
- data/app/assets/javascripts/jquery-tagselector.js +50 -0
- data/app/assets/javascripts/jquery-ui-1.8.16.custom.min.js +791 -0
- data/app/assets/javascripts/jquery.jeditable.js +543 -0
- data/app/assets/javascripts/jquery_ujs.js +336 -0
- data/app/assets/javascripts/schedule_modal.js +25 -0
- data/app/assets/javascripts/specify_project.js +21 -0
- data/app/assets/javascripts/ticket_board.js +104 -0
- data/app/assets/stylesheets/_jquery-ui-1.8.16.custom.css +568 -0
- data/app/assets/stylesheets/application.css +7 -0
- data/app/assets/stylesheets/bootstrap_and_overrides.css.scss +41 -0
- data/app/assets/stylesheets/chosen.css +367 -0
- data/app/assets/stylesheets/client_login/clients.css.scss +3 -0
- data/app/assets/stylesheets/client_login/reports.css.scss +3 -0
- data/app/assets/stylesheets/data_vaults.css.scss +3 -0
- data/app/assets/stylesheets/jquery-tagselector.css +49 -0
- data/app/assets/stylesheets/responsive.scss +650 -0
- data/app/assets/stylesheets/screen.scss +303 -0
- data/app/controllers/admin/base_controller.rb +18 -0
- data/app/controllers/admin/invoices_controller.rb +42 -0
- data/app/controllers/admin/payroll_controller.rb +29 -0
- data/app/controllers/admin/site_settings_controller.rb +19 -0
- data/app/controllers/admin/unentered_time_report_controller.rb +26 -0
- data/app/controllers/admin/users_controller.rb +86 -0
- data/app/controllers/admin/weekly_time_report_controller.rb +11 -0
- data/app/controllers/api/base_controller.rb +14 -0
- data/app/controllers/api/v1/base_controller.rb +2 -0
- data/app/controllers/api/v1/clients_controller.rb +10 -0
- data/app/controllers/api/v1/credentials_controller.rb +10 -0
- data/app/controllers/api/v1/projects_controller.rb +27 -0
- data/app/controllers/api/v1/tickets_controller.rb +46 -0
- data/app/controllers/api/v1/tokens_controller.rb +30 -0
- data/app/controllers/api/v1/work_units_controller.rb +23 -0
- data/app/controllers/client_login/base_controller.rb +3 -0
- data/app/controllers/client_login/clients_controller.rb +35 -0
- data/app/controllers/client_login/contacts_controller.rb +53 -0
- data/app/controllers/client_login/projects_controller.rb +24 -0
- data/app/controllers/client_login/reports_controller.rb +23 -0
- data/app/controllers/client_login/tickets_controller.rb +41 -0
- data/app/controllers/client_login/work_units_controller.rb +11 -0
- data/app/controllers/clients_controller.rb +103 -0
- data/app/controllers/comments_controller.rb +75 -0
- data/app/controllers/contacts_controller.rb +54 -0
- data/app/controllers/dashboard/base_controller.rb +79 -0
- data/app/controllers/data_vaults_controller.rb +12 -0
- data/app/controllers/doorkeeper/application_controller.rb +33 -0
- data/app/controllers/file_attachments_controller.rb +60 -0
- data/app/controllers/projects_controller.rb +62 -0
- data/app/controllers/tickets_controller.rb +48 -0
- data/app/controllers/users_controller.rb +57 -0
- data/app/controllers/work_units_controller.rb +114 -0
- data/app/controllers/xrono/application_controller.rb +65 -0
- data/app/helpers/admin/unentered_time_report_helper.rb +9 -0
- data/app/helpers/admin_base_helper.rb +14 -0
- data/app/helpers/clients_helper.rb +5 -0
- data/app/helpers/dashboard_helper.rb +9 -0
- data/app/helpers/gravatar_helper.rb +5 -0
- data/app/helpers/refurl_helper.rb +9 -0
- data/app/helpers/xrono/application_helper.rb +54 -0
- data/app/mailers/notifier.rb +18 -0
- data/app/models/chart_data.rb +20 -0
- data/app/models/client.rb +98 -0
- data/app/models/comment.rb +8 -0
- data/app/models/contact.rb +10 -0
- data/app/models/data_vault.rb +6 -0
- data/app/models/file_attachment.rb +8 -0
- data/app/models/project.rb +76 -0
- data/app/models/role.rb +3 -0
- data/app/models/roles_user.rb +4 -0
- data/app/models/site_settings.rb +4 -0
- data/app/models/ticket.rb +85 -0
- data/app/models/user.rb +147 -0
- data/app/models/weekly_time_report.rb +26 -0
- data/app/models/work_unit.rb +99 -0
- data/app/models/work_unit/finders.rb +67 -0
- data/app/views/admin/_nav.html.haml +1 -0
- data/app/views/admin/base/index.html.haml +3 -0
- data/app/views/admin/base/reports.html.haml +3 -0
- data/app/views/admin/invoices/index.html.haml +19 -0
- data/app/views/admin/invoices/show.html.haml +57 -0
- data/app/views/admin/payroll/index.html.haml +18 -0
- data/app/views/admin/payroll/show.html.haml +56 -0
- data/app/views/admin/site_settings/edit.html.haml +32 -0
- data/app/views/admin/unentered_time_report/_week_navigation.html.haml +6 -0
- data/app/views/admin/unentered_time_report/show.html.haml +16 -0
- data/app/views/admin/users/_form.html.haml +48 -0
- data/app/views/admin/users/_locked_users.html.haml +31 -0
- data/app/views/admin/users/_users_table.html.haml +25 -0
- data/app/views/admin/users/edit.html.haml +1 -0
- data/app/views/admin/users/index.html.haml +14 -0
- data/app/views/admin/users/locked_clients.html.haml +13 -0
- data/app/views/admin/users/locked_users.html.haml +13 -0
- data/app/views/admin/users/new.html.haml +1 -0
- data/app/views/admin/users/projects.html.haml +25 -0
- data/app/views/admin/users/unlocked_clients.html.haml +13 -0
- data/app/views/admin/weekly_time_report/_week_pagination.html.haml +11 -0
- data/app/views/admin/weekly_time_report/show.html.haml +41 -0
- data/app/views/client_login/_work_unit_index.haml +16 -0
- data/app/views/client_login/base/index.html.haml +18 -0
- data/app/views/client_login/clients/show.html.haml +32 -0
- data/app/views/client_login/contacts/_form.html.haml +34 -0
- data/app/views/client_login/contacts/edit.html.haml +4 -0
- data/app/views/client_login/contacts/index.html.haml +30 -0
- data/app/views/client_login/contacts/new.html.haml +5 -0
- data/app/views/client_login/contacts/show.html.haml +26 -0
- data/app/views/client_login/projects/_tickets.html.haml +31 -0
- data/app/views/client_login/projects/show.html.haml +8 -0
- data/app/views/client_login/reports/index.html.haml +4 -0
- data/app/views/client_login/reports/work_units.html.haml +96 -0
- data/app/views/client_login/tickets/_form.html.haml +33 -0
- data/app/views/client_login/tickets/new.html.haml +1 -0
- data/app/views/client_login/tickets/show.html.haml +23 -0
- data/app/views/client_login/work_units/show.html.haml +18 -0
- data/app/views/clients/_breadcrumbs.html.haml +2 -0
- data/app/views/clients/_clients_table.html.haml +24 -0
- data/app/views/clients/_form.html.haml +34 -0
- data/app/views/clients/_projects.html.haml +31 -0
- data/app/views/clients/edit.html.haml +1 -0
- data/app/views/clients/inactive_clients.html.haml +9 -0
- data/app/views/clients/index.html.haml +8 -0
- data/app/views/clients/new.html.haml +1 -0
- data/app/views/clients/show.html.haml +34 -0
- data/app/views/clients/suspended_clients.html.haml +8 -0
- data/app/views/comments/_comment.html.haml +46 -0
- data/app/views/comments/_comment_form.haml +29 -0
- data/app/views/comments/_comments.html.haml +3 -0
- data/app/views/contacts/_form.html.haml +34 -0
- data/app/views/contacts/edit.html.haml +1 -0
- data/app/views/contacts/index.html.haml +23 -0
- data/app/views/contacts/new.html.haml +1 -0
- data/app/views/contacts/show.html.haml +26 -0
- data/app/views/dashboard/base/_two_week_time_report.html.haml +13 -0
- data/app/views/dashboard/base/_week_pagination.html.haml +10 -0
- data/app/views/dashboard/base/calendar.html.haml +1 -0
- data/app/views/dashboard/base/calendar.js.erb +3 -0
- data/app/views/dashboard/base/index.html.haml +18 -0
- data/app/views/devise/confirmations/new.html.haml +9 -0
- data/app/views/devise/mailer/confirmation_instructions.html.haml +4 -0
- data/app/views/devise/mailer/reset_password_instructions.html.haml +6 -0
- data/app/views/devise/mailer/unlock_instructions.html.haml +5 -0
- data/app/views/devise/passwords/edit.html.haml +17 -0
- data/app/views/devise/passwords/new.html.haml +12 -0
- data/app/views/devise/registrations/edit.html.haml +36 -0
- data/app/views/devise/registrations/new.html.haml +32 -0
- data/app/views/devise/sessions/new.html.haml +22 -0
- data/app/views/devise/shared/_links.haml +15 -0
- data/app/views/devise/unlocks/new.html.haml +9 -0
- data/app/views/file_attachments/_file_attachment.html.haml +10 -0
- data/app/views/file_attachments/_file_attachment_combined.html.haml +30 -0
- data/app/views/file_attachments/_file_attachments.html.haml +5 -0
- data/app/views/file_attachments/new.html.haml +17 -0
- data/app/views/layouts/application.html.haml +32 -0
- data/app/views/layouts/doorkeeper.html.haml +31 -0
- data/app/views/notifier/daily.text.erb +8 -0
- data/app/views/notifier/work_unit_notification.text.erb +17 -0
- data/app/views/projects/_breadcrumbs.html.haml +5 -0
- data/app/views/projects/_form.html.haml +94 -0
- data/app/views/projects/_pie_chart_metrics.html.haml +4 -0
- data/app/views/projects/_specify.html.haml +11 -0
- data/app/views/projects/_ticket_table.html.haml +36 -0
- data/app/views/projects/edit.html.haml +2 -0
- data/app/views/projects/new.html.haml +2 -0
- data/app/views/projects/show.html.haml +57 -0
- data/app/views/shared/_calendar.html.haml +86 -0
- data/app/views/shared/_data_vault.html.haml +16 -0
- data/app/views/shared/_files_and_comments.html.haml +21 -0
- data/app/views/shared/_flashes.html.haml +10 -0
- data/app/views/shared/_javascripts.html.haml +8 -0
- data/app/views/shared/_menu.html.haml +14 -0
- data/app/views/shared/_user_roles.html.haml +7 -0
- data/app/views/shared/_work_unit_index.html.haml +24 -0
- data/app/views/tickets/_add_ticket.html.haml +27 -0
- data/app/views/tickets/_breadcrumbs.html.haml +8 -0
- data/app/views/tickets/_form.html.haml +40 -0
- data/app/views/tickets/_ticket_detail.html.haml +18 -0
- data/app/views/tickets/edit.html.haml +2 -0
- data/app/views/tickets/modal_new.html.haml +28 -0
- data/app/views/tickets/new.html.haml +1 -0
- data/app/views/tickets/show.html.haml +28 -0
- data/app/views/tickets/ticket_detail.html.haml +18 -0
- data/app/views/users/_change_password_form.haml +13 -0
- data/app/views/users/_user_head.html.haml +7 -0
- data/app/views/users/edit.haml +34 -0
- data/app/views/users/historical_time.html.haml +5 -0
- data/app/views/users/index.html.haml +18 -0
- data/app/views/users/show.html.haml +13 -0
- data/app/views/work_units/_add_work_unit.html.haml +81 -0
- data/app/views/work_units/_breadcrumbs.html.haml +11 -0
- data/app/views/work_units/_dashboard_line.html.haml +6 -0
- data/app/views/work_units/_edit_work_unit.haml +44 -0
- data/app/views/work_units/_shared_form.haml +40 -0
- data/app/views/work_units/edit.html.haml +2 -0
- data/app/views/work_units/index.html.haml +7 -0
- data/app/views/work_units/new.html.haml +6 -0
- data/app/views/work_units/show.html.haml +25 -0
- data/app/workers/daily_notifier_worker.rb +7 -0
- data/app/workers/work_unit_notifier_worker.rb +7 -0
- data/config.ru +7 -0
- data/config/admin_navigation.rb +71 -0
- data/config/admin_reports_navigation.rb +6 -0
- data/config/boot.rb +6 -0
- data/config/client_navigation.rb +64 -0
- data/config/cucumber.yml +8 -0
- data/config/initializers/00_requirements.rb +2 -0
- data/config/initializers/backtrace_silencers.rb +7 -0
- data/config/initializers/devise.rb +144 -0
- data/config/initializers/doorkeeper.rb +32 -0
- data/config/initializers/doorkeeper_monkeypatch.rb +66 -0
- data/config/initializers/github_concern.rb +4 -0
- data/config/initializers/haml.rb +13 -0
- data/config/initializers/inflections.rb +10 -0
- data/config/initializers/load_controller_mixins.rb +1 -0
- data/config/initializers/mime_types.rb +5 -0
- data/config/initializers/paper_clip.rb +1 -0
- data/config/initializers/simple_navigation.rb +1 -0
- data/config/initializers/wrap_parameters.rb +14 -0
- data/config/locales/devise.en.yml +39 -0
- data/config/locales/doorkeeper.en.yml +23 -0
- data/config/locales/en.yml +201 -0
- data/config/locales/faker.en.yml +48 -0
- data/config/navigation.rb +78 -0
- data/config/rackspace_cloudfiles.yml +14 -0
- data/config/routes.rb +113 -0
- data/config/secondary_navigation.rb +65 -0
- data/config/trinidad.yml +4 -0
- data/config/warble.rb +144 -0
- data/db/migrate/20100825165612_create_clients.rb +14 -0
- data/db/migrate/20100825185313_create_projects.rb +14 -0
- data/db/migrate/20100825223943_create_tickets.rb +16 -0
- data/db/migrate/20100902174920_create_work_units.rb +14 -0
- data/db/migrate/20100902190129_add_missing_fields_to_work_units.rb +13 -0
- data/db/migrate/20100904173839_add_guid_to_clients_projects_tickets_and_work_orders.rb +13 -0
- data/db/migrate/20100922181642_create_comments.rb +19 -0
- data/db/migrate/20100927180254_devise_create_users.rb +32 -0
- data/db/migrate/20100927184505_add_details_to_users.rb +13 -0
- data/db/migrate/20100927191329_add_user_to_work_units.rb +9 -0
- data/db/migrate/20100928163356_create_roles.rb +22 -0
- data/db/migrate/20100928203745_create_addresses.rb +19 -0
- data/db/migrate/20100928204544_create_contacts.rb +17 -0
- data/db/migrate/20101007175626_add_lockable_to_users.rb +11 -0
- data/db/migrate/20101020162216_add_paid_at_to_work_units_table.rb +9 -0
- data/db/migrate/20101020162516_add_check_number_to_work_units_table.rb +9 -0
- data/db/migrate/20101020215135_add_paid_field_to_work_units_table.rb +9 -0
- data/db/migrate/20101020215226_add_invoiced_field_to_work_units_table.rb +9 -0
- data/db/migrate/20101020215457_remove_paid_at_from_work_units_table.rb +9 -0
- data/db/migrate/20101020215624_remove_check_number_from_work_units_table.rb +9 -0
- data/db/migrate/20101025161443_add_invoiced_at_to_work_units_table.rb +9 -0
- data/db/migrate/20101026151900_add_initials_to_clients.rb +9 -0
- data/db/migrate/20101029145059_create_file_attachments.rb +18 -0
- data/db/migrate/20101030142615_add_guid_to_users.rb +9 -0
- data/db/migrate/20101102145137_add_paid_at_to_work_units.rb +9 -0
- data/db/migrate/20101112151337_add_active_to_comments.rb +9 -0
- data/db/migrate/20101119172727_add_recieves_email_to_contact.rb +10 -0
- data/db/migrate/20101122225423_projects_users.rb +11 -0
- data/db/migrate/20101129214537_remove_projects_users_table.rb +11 -0
- data/db/migrate/20101130225328_contact_receives_email.rb +9 -0
- data/db/migrate/20101202203051_add_address_to_contacts.rb +19 -0
- data/db/migrate/20101202214746_remove_address_table.rb +17 -0
- data/db/migrate/20101216214304_add_hours_type_to_work_unit.rb +9 -0
- data/db/migrate/20101217152455_add_effective_hours_to_work_units.rb +9 -0
- data/db/migrate/20101228154820_add_overtime_multiplier_to_clients_table.rb +9 -0
- data/db/migrate/20101228154951_add_overtime_multiplier_to_projects_table.rb +9 -0
- data/db/migrate/20101228155122_create_site_settings_table.rb +11 -0
- data/db/migrate/20110107190927_add_site_logo_columns_to_site_settings.rb +15 -0
- data/db/migrate/20110111155513_add_total_yearly_pto_per_user_to_site_settings.rb +9 -0
- data/db/migrate/20110111220015_add_not_valid_to_file_attachment.rb +9 -0
- data/db/migrate/20110125153818_add_fullwidth_to_users.rb +9 -0
- data/db/migrate/20110222162404_add_daily_target_hours_to_users.rb +9 -0
- data/db/migrate/20110310021732_add_client_to_site_settings.rb +9 -0
- data/db/migrate/20110630194044_add_expanded_calendar_to_user.rb +9 -0
- data/db/migrate/20110922175742_add_state_to_tickets.rb +9 -0
- data/db/migrate/20111212193345_add_estimated_hours_to_tickets.rb +5 -0
- data/db/migrate/20111216152557_add_client_boolean_to_user.rb +5 -0
- data/db/migrate/20111220193307_add_repo_and_branch_to_projects_and_ticket.rb +6 -0
- data/db/migrate/20111220193619_create_git_pushes.rb +9 -0
- data/db/migrate/20111220193620_create_git_commits.rb +10 -0
- data/db/migrate/20111220193621_add_user_id_to_git_push.rb +5 -0
- data/db/migrate/20111220193622_create_github_concernable_git_pushes.rb +11 -0
- data/db/migrate/20111227140859_add_token_to_user.rb +7 -0
- data/db/migrate/20120102185406_add_completed_boolean_to_ticket.rb +5 -0
- data/db/migrate/20120104132121_add_completed_to_project.rb +5 -0
- data/db/migrate/20120124184915_modify_project_for_new_git_integration.rb +11 -0
- data/db/migrate/20120125145833_add_rates_to_project.rb +6 -0
- data/db/migrate/20120126151009_create_data_vaults.rb +11 -0
- data/db/migrate/20120126151341_create_versions.rb +18 -0
- data/db/migrate/20120126154403_rename_column_data_to_encrypted_data.rb +8 -0
- data/db/migrate/20120221193022_add_index_to_user_id_on_work_units.rb +5 -0
- data/db/migrate/20120221195345_acts_as_taggable_on_migration.rb +30 -0
- data/db/migrate/20120320212313_remove_timestamps_from_roles_users_table.rb +11 -0
- data/db/migrate/20120710034831_create_doorkeeper_tables.rb +42 -0
- data/db/migrate/20121021122002_add_missing_indices.rb +21 -0
- data/doc/website/favicon.ico +0 -0
- data/doc/website/images/clock_box.png +0 -0
- data/doc/website/images/demo.png +0 -0
- data/doc/website/images/download.png +0 -0
- data/doc/website/images/fork_me.png +0 -0
- data/doc/website/images/lightbox-blank.gif +0 -0
- data/doc/website/images/lightbox-btn-close.gif +0 -0
- data/doc/website/images/lightbox-btn-next.gif +0 -0
- data/doc/website/images/lightbox-btn-prev.gif +0 -0
- data/doc/website/images/lightbox-ico-loading.gif +0 -0
- data/doc/website/images/main_bg.png +0 -0
- data/doc/website/images/nav_bg.png +0 -0
- data/doc/website/images/screen_1.png +0 -0
- data/doc/website/images/screen_2.png +0 -0
- data/doc/website/images/screen_3.png +0 -0
- data/doc/website/images/screen_4.png +0 -0
- data/doc/website/images/screen_5.png +0 -0
- data/doc/website/images/screen_6.png +0 -0
- data/doc/website/images/support.png +0 -0
- data/doc/website/images/thumb_1.png +0 -0
- data/doc/website/images/thumb_2.png +0 -0
- data/doc/website/images/thumb_3.png +0 -0
- data/doc/website/images/thumb_4.png +0 -0
- data/doc/website/images/thumb_5.png +0 -0
- data/doc/website/images/thumb_6.png +0 -0
- data/doc/website/images/xrono_logo.png +0 -0
- data/doc/website/index.html +274 -0
- data/doc/website/javascripts/application.js +18 -0
- data/doc/website/javascripts/greyscalebasic_regular.typeface.js +1 -0
- data/doc/website/javascripts/jquery.lightbox-0.5.min.js +42 -0
- data/doc/website/javascripts/jquery.min.js +32 -0
- data/doc/website/javascripts/jquery.tweet.js +181 -0
- data/doc/website/javascripts/typeface.js +873 -0
- data/doc/website/javascripts/verdana_regular.typeface.js +1 -0
- data/doc/website/stylesheets/jquery.lightbox.css +104 -0
- data/doc/website/stylesheets/jquery.tweet.css +38 -0
- data/doc/website/stylesheets/reset-fonts-grids.css +32 -0
- data/doc/website/stylesheets/screen.css +228 -0
- data/doc/xrono_dash.png +0 -0
- data/doc/xrono_ticket.png +0 -0
- data/features/admin/invoices.feature +37 -0
- data/features/admin/manage_users.feature +17 -0
- data/features/admin/payroll.feature +64 -0
- data/features/admin/roles.feature +9 -0
- data/features/admin/site_settings.feature +19 -0
- data/features/admin/unentered_time_report.feature +38 -0
- data/features/admin/weekly_time_report.feature +14 -0
- data/features/api/v1/clients_controller.feature +58 -0
- data/features/authorization-admin.feature +34 -0
- data/features/authorization-non-admin.feature +38 -0
- data/features/client_login.feature +15 -0
- data/features/collaborative_work_units.feature +112 -0
- data/features/daily_emails.feature +11 -0
- data/features/dashboard.feature +74 -0
- data/features/manage_clients.feature +116 -0
- data/features/manage_comments.feature +30 -0
- data/features/manage_contacts.feature +56 -0
- data/features/manage_file_attachments.feature +51 -0
- data/features/manage_projects.feature +92 -0
- data/features/manage_self.feature +48 -0
- data/features/manage_tickets.feature +74 -0
- data/features/manage_users.feature +76 -0
- data/features/manage_work_units.feature +115 -0
- data/features/mockups/images/asset-tracker-client-show.png +0 -0
- data/features/mockups/images/asset-tracker.png +0 -0
- data/features/mockups/images/ixi - asset tracker v3 homepage - no time entered modal.png +0 -0
- data/features/mockups/images/ixi - asset tracker v3 homepage - schedule on modal.png +0 -0
- data/features/mockups/images/ixi - asset tracker v3 homepage.png +0 -0
- data/features/mockups/ixi - asset tracker v3 homepage - no time entered modal.bmml +194 -0
- data/features/mockups/ixi - asset tracker v3 homepage - schedule on modal.bmml +208 -0
- data/features/mockups/ixi - asset tracker v3 homepage.bmml +172 -0
- data/features/project_assignment.feature +69 -0
- data/features/search_work_units.feature +38 -0
- data/features/step_definitions/calendar_expansion_steps.rb +7 -0
- data/features/step_definitions/client_login_steps.rb +8 -0
- data/features/step_definitions/client_steps.rb +29 -0
- data/features/step_definitions/comment_steps.rb +4 -0
- data/features/step_definitions/contact_steps.rb +22 -0
- data/features/step_definitions/debug_steps.rb +5 -0
- data/features/step_definitions/devise_steps.rb +26 -0
- data/features/step_definitions/email_steps.rb +74 -0
- data/features/step_definitions/file_attachment_steps.rb +8 -0
- data/features/step_definitions/modified_web_steps.rb +25 -0
- data/features/step_definitions/pickle_steps.rb +101 -0
- data/features/step_definitions/project_steps.rb +32 -0
- data/features/step_definitions/search_steps.rb +3 -0
- data/features/step_definitions/ticket_board_steps.rb +39 -0
- data/features/step_definitions/ticket_detail_steps.rb +9 -0
- data/features/step_definitions/ticket_steps.rb +12 -0
- data/features/step_definitions/unentered_time_report_steps.rb +3 -0
- data/features/step_definitions/user_steps.rb +43 -0
- data/features/step_definitions/web_steps.rb +274 -0
- data/features/step_definitions/weekly_time_report_steps.rb +7 -0
- data/features/step_definitions/work_unit_index_steps.rb +8 -0
- data/features/step_definitions/work_unit_steps.rb +39 -0
- data/features/support/email.rb +21 -0
- data/features/support/env.rb +80 -0
- data/features/support/paths.rb +96 -0
- data/features/support/pickle.rb +26 -0
- data/features/support/selectors.rb +51 -0
- data/features/support/xrono.rb +19 -0
- data/features/work_unit_notifier.feature +11 -0
- data/lib/controller_mixins.rb +5 -0
- data/lib/controller_mixins/authorization.rb +15 -0
- data/lib/controller_mixins/contacts.rb +37 -0
- data/lib/controller_mixins/generic.rb +15 -0
- data/lib/controller_mixins/tickets.rb +35 -0
- data/lib/controller_mixins/work_units.rb +13 -0
- data/lib/date_ext.rb +16 -0
- data/lib/guid_referenced.rb +19 -0
- data/lib/tasks/.gitkeep +0 -0
- data/lib/tasks/acts_as_commentable_tasks.rake +4 -0
- data/lib/tasks/cucumber.rake +65 -0
- data/lib/tasks/git_repo_tasks.rake +47 -0
- data/lib/tasks/notifications.rake +8 -0
- data/lib/tasks/paperclip_tasks.rake +79 -0
- data/lib/xrono.rb +1 -0
- data/lib/xrono/engine.rb +45 -0
- data/public/404.html +26 -0
- data/public/422.html +26 -0
- data/public/500.html +26 -0
- data/public/favicon.ico +0 -0
- data/public/favicon.psd +0 -0
- data/public/robots.txt +5 -0
- data/public/stylesheets/.gitkeep +0 -0
- data/public/stylesheets/ie.css +53 -0
- data/public/stylesheets/print.css +57 -0
- data/public/stylesheets/screen.css +182 -0
- data/script/cucumber +10 -0
- data/script/rails +6 -0
- data/spec/blueprints.rb +86 -0
- data/spec/controllers/api/v1/clients_controller_spec.rb +41 -0
- data/spec/controllers/api/v1/projects_controller_spec.rb +54 -0
- data/spec/controllers/api/v1/tickets_controller_spec.rb +122 -0
- data/spec/controllers/api/v1/tokens_controller_spec.rb +52 -0
- data/spec/controllers/client_login/clients_controller_spec.rb +5 -0
- data/spec/controllers/client_login/reports_controller_spec.rb +5 -0
- data/spec/controllers/data_vaults_controller_spec.rb +5 -0
- data/spec/internal/app/controllers/application_controller.rb +5 -0
- data/spec/internal/config/admin_navigation.rb +71 -0
- data/spec/internal/config/database.yml +14 -0
- data/spec/internal/config/database.yml.example +20 -0
- data/spec/internal/config/database.yml.mysql +20 -0
- data/spec/internal/config/database.yml.mysql.jruby +20 -0
- data/spec/internal/config/database.yml.postgres +20 -0
- data/spec/internal/config/database.yml.postgres.jruby +20 -0
- data/spec/internal/config/navigation.rb +80 -0
- data/spec/internal/config/routes.rb +3 -0
- data/spec/internal/config/secondary_navigation.rb +65 -0
- data/spec/internal/db/schema.rb +296 -0
- data/spec/internal/log/.gitignore +1 -0
- data/spec/internal/public/favicon.ico +0 -0
- data/spec/internal/public/system/attachment_files/2/original/tmp.txt +1 -0
- data/spec/internal/public/system/attachment_files/3/original/tmp.txt +1 -0
- data/spec/lib/date_ext_spec.rb +40 -0
- data/spec/mailers/notifier_spec.rb +9 -0
- data/spec/models/client_spec.rb +167 -0
- data/spec/models/contact_spec.rb +29 -0
- data/spec/models/data_vault_spec.rb +5 -0
- data/spec/models/project_spec.rb +115 -0
- data/spec/models/ticket_spec.rb +223 -0
- data/spec/models/user_spec.rb +258 -0
- data/spec/models/work_unit_spec.rb +467 -0
- data/spec/spec_helper.rb +44 -0
- data/spec/support/xrono/macros.rb +15 -0
- data/vendor/plugins/.gitkeep +0 -0
- data/xrono.gemspec +50 -0
- metadata +1209 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
Given /^(\d+) work units exist for that user$/ do |number|
|
|
2
|
+
user = User.last
|
|
3
|
+
client = Client.create!(:name => "Regis", :status => "Good")
|
|
4
|
+
project = Project.create!(:name => "Haircutting", :client_id => client.id)
|
|
5
|
+
ticket = Ticket.create!(:name => "Cut Hairs", :project_id => project.id, :description => "Do the cutting of the hairs.")
|
|
6
|
+
number.to_i.times { WorkUnit.create!(:description => "Did the clipping and the cutting", :ticket_id => ticket.id, :hours => 8, :scheduled_at => "2010-10-01 12:00:00", :user_id => user.id) }
|
|
7
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
Given /^I have (?:a|an) "([^\"]*)" work unit scheduled today for "([^\"]*)" hours$/ do |hours_type, hours|
|
|
2
|
+
WorkUnit.make(:hours_type => hours_type, :scheduled_at => Date.current, :user => @current_user, :hours => hours)
|
|
3
|
+
end
|
|
4
|
+
|
|
5
|
+
Then /^I should see the following work_units:$/ do |expected_work_units_table|
|
|
6
|
+
expected_work_units_table.diff!(find('table').all('tr').map { |row| row.all('th, td').map { |cell| cell.text.strip } })
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
When /^I create a work unit with #{capture_model}$/ do |ticket|
|
|
10
|
+
WorkUnit.make(:ticket => find_model!(ticket))
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
Given /^I have no work units for the previous day$/ do
|
|
14
|
+
@current_user.work_units.where(:scheduled_at => Date.yesterday).destroy_all
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
Given /^I have a "([^"]*)" hour work unit for yesterday with ticket "([^"]*)"$/ do |hours, ticket|
|
|
18
|
+
WorkUnit.make(:ticket => find_model!(ticket), :hours_type => "Normal",
|
|
19
|
+
:scheduled_at => 1.days.ago.beginning_of_day, :user => @current_user, :hours => hours)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
Then /^that work unit should still have a scheduled at date of yesterday$/ do
|
|
23
|
+
WorkUnit.last.scheduled_at.should == 1.day.ago.beginning_of_day
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
Then /^I should see the new ticket fields$/ do
|
|
27
|
+
within("#on_demand_ticket") do
|
|
28
|
+
page.should have_css('#on_demand_ticket_name')
|
|
29
|
+
page.should have_css('#on_demand_ticket_description')
|
|
30
|
+
page.should have_css('#on_demand_ticket_estimated_hours')
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
Then /^there should be a ticket named "([^"]*)" with (\d+) hours$/ do |ticket_name, hours|
|
|
35
|
+
sleep(1)
|
|
36
|
+
@ticket = Ticket.where(:name => ticket_name).last
|
|
37
|
+
@ticket.should_not be_nil
|
|
38
|
+
@ticket.work_units.last.hours.should == BigDecimal(hours)
|
|
39
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module EmailHelpers
|
|
2
|
+
# Maps a name to an email address. Used by email_steps
|
|
3
|
+
|
|
4
|
+
def email_for(to)
|
|
5
|
+
case to
|
|
6
|
+
|
|
7
|
+
# add your own name => email address mappings here
|
|
8
|
+
|
|
9
|
+
when /^#{capture_model}$/
|
|
10
|
+
model($1).email
|
|
11
|
+
|
|
12
|
+
when /^"(.*)"$/
|
|
13
|
+
$1
|
|
14
|
+
|
|
15
|
+
else
|
|
16
|
+
to
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
World(EmailHelpers)
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Simplecov Setup
|
|
2
|
+
if RUBY_VERSION >= '1.9.2'
|
|
3
|
+
require 'simplecov'
|
|
4
|
+
require 'simplecov-rcov'
|
|
5
|
+
SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter
|
|
6
|
+
SimpleCov.start 'rails' do
|
|
7
|
+
add_filter '/vendor/'
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
# IMPORTANT: This file is generated by cucumber-rails - edit at your own peril.
|
|
11
|
+
# It is recommended to regenerate this file in the future when you upgrade to a
|
|
12
|
+
# newer version of cucumber-rails. Consider adding your own code to a new file
|
|
13
|
+
# instead of editing this one. Cucumber will automatically load all features/**/*.rb
|
|
14
|
+
# files.
|
|
15
|
+
|
|
16
|
+
ENV["RAILS_ENV"] ||= 'test'
|
|
17
|
+
|
|
18
|
+
require 'bundler'
|
|
19
|
+
Bundler.require :default, :development, :assets
|
|
20
|
+
$:.push(File.expand_path('../../../lib', __FILE__))
|
|
21
|
+
require 'xrono'
|
|
22
|
+
require 'combustion'
|
|
23
|
+
Combustion.initialize!
|
|
24
|
+
|
|
25
|
+
require 'cucumber'
|
|
26
|
+
require 'capybara'
|
|
27
|
+
require 'capybara/dsl'
|
|
28
|
+
require 'capybara/rspec/matchers'
|
|
29
|
+
require 'sidekiq/testing/inline'
|
|
30
|
+
|
|
31
|
+
World(Capybara::RSpecMatchers)
|
|
32
|
+
World(Capybara::DSL)
|
|
33
|
+
module RouteProxy
|
|
34
|
+
# didn't find a cleaner way to get route helpers into my steps
|
|
35
|
+
def method_missing(sym, *args)
|
|
36
|
+
if route_helpers.respond_to?(sym)
|
|
37
|
+
route_helpers.send(sym, *args)
|
|
38
|
+
else
|
|
39
|
+
super
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def route_helpers
|
|
44
|
+
Rails.application.routes.url_helpers
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
World(RouteProxy)
|
|
49
|
+
Before do
|
|
50
|
+
Rails.application.routes.default_url_options[:host] = 'test.host'
|
|
51
|
+
end
|
|
52
|
+
# Capybara defaults to XPath selectors rather than Webrat's default of CSS3. In
|
|
53
|
+
# order to ease the transition to Capybara we set the default here. If you'd
|
|
54
|
+
# prefer to use XPath just remove this line and adjust any selectors in your
|
|
55
|
+
# steps to use the XPath syntax.
|
|
56
|
+
Capybara.default_selector = :css
|
|
57
|
+
|
|
58
|
+
# By default, any exception happening in your Rails application will bubble up
|
|
59
|
+
# to Cucumber so that your scenario will fail. This is a different from how
|
|
60
|
+
# your application behaves in the production environment, where an error page will
|
|
61
|
+
# be rendered instead.
|
|
62
|
+
#
|
|
63
|
+
# Sometimes we want to override this default behaviour and allow Rails to rescue
|
|
64
|
+
# exceptions and display an error page (just like when the app is running in production).
|
|
65
|
+
# Typical scenarios where you want to do this is when you test your error pages.
|
|
66
|
+
# There are two ways to allow Rails to rescue exceptions:
|
|
67
|
+
#
|
|
68
|
+
# 1) Tag your scenario (or feature) with @allow-rescue
|
|
69
|
+
#
|
|
70
|
+
# 2) Set the value below to true. Beware that doing this globally is not
|
|
71
|
+
# recommended as it will mask a lot of errors for you!
|
|
72
|
+
#
|
|
73
|
+
#ActionController::Base.allow_rescue = false
|
|
74
|
+
Capybara.app = Rails.application
|
|
75
|
+
Before("@javascript") do
|
|
76
|
+
Capybara.current_driver = :selenium
|
|
77
|
+
end
|
|
78
|
+
After("@javascript") do
|
|
79
|
+
Capybara.current_driver = Capybara.default_driver
|
|
80
|
+
end
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
module NavigationHelpers
|
|
2
|
+
# Maps a name to a path. Used by the
|
|
3
|
+
#
|
|
4
|
+
# When /^I go to (.+)$/ do |page_name|
|
|
5
|
+
#
|
|
6
|
+
# step definition in web_steps.rb
|
|
7
|
+
#
|
|
8
|
+
def path_to(page_name)
|
|
9
|
+
case page_name
|
|
10
|
+
|
|
11
|
+
when /the clients client_login_client page/
|
|
12
|
+
client_login_client_path(Client.for_user(@current_user).first)
|
|
13
|
+
|
|
14
|
+
when /the home\s?page/
|
|
15
|
+
'/'
|
|
16
|
+
|
|
17
|
+
when /^the contacts page$/
|
|
18
|
+
client_contacts_path
|
|
19
|
+
|
|
20
|
+
when /^the new client page$/
|
|
21
|
+
new_client_path
|
|
22
|
+
|
|
23
|
+
when /^the login page$/
|
|
24
|
+
'/login'
|
|
25
|
+
|
|
26
|
+
when /path "(.+)"/
|
|
27
|
+
$1
|
|
28
|
+
|
|
29
|
+
when /the last work units edit page/
|
|
30
|
+
edit_work_unit_path(WorkUnit.last)
|
|
31
|
+
|
|
32
|
+
when /^my edit profile page$/
|
|
33
|
+
edit_user_path(@current_user)
|
|
34
|
+
|
|
35
|
+
# the following are examples using path_to_pickle
|
|
36
|
+
when /^the admin #{capture_model}(?:'s)? page$/
|
|
37
|
+
path_to_pickle 'admin', $1
|
|
38
|
+
|
|
39
|
+
when /^the admin invoices page$/
|
|
40
|
+
'/admin/invoices'
|
|
41
|
+
|
|
42
|
+
when /^the admin #{capture_model}(?:'s)? (.+?) page$/
|
|
43
|
+
path_to_pickle 'admin', $1, :extra => $2
|
|
44
|
+
|
|
45
|
+
when /^the admin payroll show page for #{capture_model}$/
|
|
46
|
+
user = model!($1)
|
|
47
|
+
"/admin/payroll/#{user.id}"
|
|
48
|
+
|
|
49
|
+
when /^the dashboard #{capture_model}(?:'s)? page$/ # eg. the forum's page
|
|
50
|
+
path_to_pickle 'dashboard', $1
|
|
51
|
+
|
|
52
|
+
when /^#{capture_model}(?:'s)? page$/ # eg. the forum's page
|
|
53
|
+
path_to_pickle $1
|
|
54
|
+
|
|
55
|
+
when /^#{capture_model}(?:'s)? #{capture_model}(?:'s)? page$/ # eg. the forum's post's page
|
|
56
|
+
path_to_pickle $1, $2
|
|
57
|
+
|
|
58
|
+
when /^#{capture_model}(?:'s)? #{capture_model}(?:'s)? #{capture_model}(?:'s)? page$/ # eg. the forum's category's post's page
|
|
59
|
+
path_to_pickle $1, $2, $3
|
|
60
|
+
|
|
61
|
+
when /^#{capture_model}(?:'s)? #{capture_model}(?:'s)? #{capture_model}(?:'s)? #{capture_model}(?:'s)? page$/ # eg. the forum's category's post's comment's page
|
|
62
|
+
path_to_pickle $1, $2, $3, $4
|
|
63
|
+
|
|
64
|
+
when /^#{capture_model}(?:'s)? #{capture_model}'s #{capture_model}(?:'s)? #{capture_model}(?:'s)? (.+?) page$/ # eg. the forum's category's post's comment's moderations page
|
|
65
|
+
path_to_pickle $1, $2, $3, $4, :extra => $5 # or the forum's post's comment's moderation's edit page
|
|
66
|
+
|
|
67
|
+
when /^#{capture_model}(?:'s)? #{capture_model}'s #{capture_model}(?:'s)? (.+?) page$/ # eg. the forum's category's post's comments page
|
|
68
|
+
path_to_pickle $1, $2, $3, :extra => $4 # or the forum's category's post's edit page
|
|
69
|
+
|
|
70
|
+
when /^#{capture_model}(?:'s)? #{capture_model}'s (.+?) page$/ # eg. the forum's post's comments page
|
|
71
|
+
path_to_pickle $1, $2, :extra => $3 # or the forum's post's edit page
|
|
72
|
+
|
|
73
|
+
when /^#{capture_model}(?:'s)? (.+?) page$/ # eg. the forum's posts page
|
|
74
|
+
path_to_pickle $1, :extra => $2 # or the forum's edit page
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
# Add more mappings here.
|
|
78
|
+
# Here is an example that pulls values out of the Regexp:
|
|
79
|
+
#
|
|
80
|
+
# when /^(.*)'s profile page$/i
|
|
81
|
+
# user_profile_path(User.find_by_login($1))
|
|
82
|
+
|
|
83
|
+
else
|
|
84
|
+
begin
|
|
85
|
+
page_name =~ /^the (.*) page$/
|
|
86
|
+
path_components = $1.split(/\s+/)
|
|
87
|
+
self.send(path_components.push('path').join('_').to_sym)
|
|
88
|
+
rescue NoMethodError, ArgumentError
|
|
89
|
+
raise "Can't find mapping from \"#{page_name}\" to a path.\n" +
|
|
90
|
+
"Now, go and add a mapping in #{__FILE__}"
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
World(NavigationHelpers)
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# this file generated by script/generate pickle [paths] [email]
|
|
2
|
+
#
|
|
3
|
+
# Make sure that you are loading your factory of choice in your cucumber environment
|
|
4
|
+
#
|
|
5
|
+
# For machinist add: features/support/machinist.rb
|
|
6
|
+
#
|
|
7
|
+
# require 'machinist/active_record' # or your chosen adaptor
|
|
8
|
+
# require File.dirname(__FILE__) + '/../../spec/blueprints' # or wherever your blueprints are
|
|
9
|
+
# Before { Sham.reset } # to reset Sham's seed between scenarios so each run has same random sequences
|
|
10
|
+
#
|
|
11
|
+
# For FactoryGirl add: features/support/factory_girl.rb
|
|
12
|
+
#
|
|
13
|
+
# require 'factory_girl'
|
|
14
|
+
# require File.dirname(__FILE__) + '/../../spec/factories' # or wherever your factories are
|
|
15
|
+
#
|
|
16
|
+
# You may also need to add gem dependencies on your factory of choice in <tt>config/environments/cucumber.rb</tt>
|
|
17
|
+
|
|
18
|
+
require 'pickle/world'
|
|
19
|
+
# Example of configuring pickle:
|
|
20
|
+
#
|
|
21
|
+
# Pickle.configure do |config|
|
|
22
|
+
# config.adapters = [:machinist]
|
|
23
|
+
# config.map 'I', 'myself', 'me', 'my', :to => 'user: "me"'
|
|
24
|
+
# end
|
|
25
|
+
require 'pickle/path/world'
|
|
26
|
+
require 'pickle/email/world'
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
module HtmlSelectorsHelpers
|
|
2
|
+
# Maps a name to a selector. Used primarily by the
|
|
3
|
+
#
|
|
4
|
+
# When /^(.+) within (.+)$/ do |step, scope|
|
|
5
|
+
#
|
|
6
|
+
# step definitions in web_steps.rb
|
|
7
|
+
#
|
|
8
|
+
def selector_for(locator)
|
|
9
|
+
case locator
|
|
10
|
+
|
|
11
|
+
when "the page"
|
|
12
|
+
"html > body"
|
|
13
|
+
|
|
14
|
+
when "the actions list"
|
|
15
|
+
".form-actions"
|
|
16
|
+
|
|
17
|
+
when "the breadcrumbs"
|
|
18
|
+
"ul.breadcrumb"
|
|
19
|
+
|
|
20
|
+
when "the subnav"
|
|
21
|
+
".btn-group"
|
|
22
|
+
|
|
23
|
+
when "the edit project link"
|
|
24
|
+
"a[rel=edit-project]"
|
|
25
|
+
|
|
26
|
+
# Add more mappings here.
|
|
27
|
+
# Here is an example that pulls values out of the Regexp:
|
|
28
|
+
#
|
|
29
|
+
# when /^the (notice|error|info) flash$/
|
|
30
|
+
# ".flash.#{$1}"
|
|
31
|
+
|
|
32
|
+
# You can also return an array to use a different selector
|
|
33
|
+
# type, like:
|
|
34
|
+
#
|
|
35
|
+
# when /the header/
|
|
36
|
+
# [:xpath, "//header"]
|
|
37
|
+
|
|
38
|
+
# This allows you to provide a quoted selector as the scope
|
|
39
|
+
# for "within" steps as was previously the default for the
|
|
40
|
+
# web steps:
|
|
41
|
+
when /^"(.+)"$/
|
|
42
|
+
$1
|
|
43
|
+
|
|
44
|
+
else
|
|
45
|
+
raise "Can't find mapping from \"#{locator}\" to a selector.\n" +
|
|
46
|
+
"Now, go and add a mapping in #{__FILE__}"
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
World(HtmlSelectorsHelpers)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
ENV["RAILS_ENV"] ||= "test"
|
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + "/../../spec/blueprints")
|
|
3
|
+
|
|
4
|
+
begin
|
|
5
|
+
require 'database_cleaner'
|
|
6
|
+
require 'database_cleaner/cucumber'
|
|
7
|
+
|
|
8
|
+
DatabaseCleaner.strategy = :truncation
|
|
9
|
+
rescue NameError
|
|
10
|
+
raise "You need to add database_cleaner to your Gemfile (in the :test group) if you wish to use it."
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
Before do
|
|
14
|
+
DatabaseCleaner.start
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
After do |scenario|
|
|
18
|
+
DatabaseCleaner.clean
|
|
19
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
Feature: Send Email to Client after Work Unit Creation
|
|
2
|
+
|
|
3
|
+
Scenario: A client receives an email after work unit creation
|
|
4
|
+
Given all emails have been delivered
|
|
5
|
+
And a client "test client" exists
|
|
6
|
+
And a contact "test contact" exists with client: client "test client", email_address: "testcontact@example.com", receives_email: true
|
|
7
|
+
And a project "test project" exists with name: "test project", client: client "test client"
|
|
8
|
+
And a ticket "test ticket" exists with project: project "test project", name: "test ticket"
|
|
9
|
+
When I create a work unit with ticket "test ticket"
|
|
10
|
+
Then 1 email should be delivered bcc to "testcontact@example.com"
|
|
11
|
+
And the first email should contain "For your records, a new work unit has been created or modified:"
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module ControllerMixins
|
|
2
|
+
module Authorization
|
|
3
|
+
extend ActiveSupport::Concern
|
|
4
|
+
|
|
5
|
+
module ClassMethods
|
|
6
|
+
def authorize_owners_with_client_show(object)
|
|
7
|
+
access_control do
|
|
8
|
+
allow :admin
|
|
9
|
+
allow :developer, :of => object
|
|
10
|
+
allow :client, :of => object, :to => :show
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module ControllerMixins
|
|
2
|
+
module Contacts
|
|
3
|
+
def create!(path)
|
|
4
|
+
@contact = Contact.new(params[:contact])
|
|
5
|
+
@contact.client = @client
|
|
6
|
+
if @contact.save
|
|
7
|
+
flash[:notice] = "Contact created successfully."
|
|
8
|
+
redirect_to send(path, @contact.client, @contact)
|
|
9
|
+
else
|
|
10
|
+
flash.now[:error] = "There was a problem saving the new contact."
|
|
11
|
+
render :action => 'new'
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def update!(path)
|
|
16
|
+
@contact = Contact.find(params[:id])
|
|
17
|
+
if @contact.update_attributes(params[:contact])
|
|
18
|
+
flash[:notice] = "Contact updated successfully."
|
|
19
|
+
redirect_to send(path)
|
|
20
|
+
else
|
|
21
|
+
flash.now[:error] = "There was a problem saving the contact."
|
|
22
|
+
render :action => 'edit'
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def destroy!(path)
|
|
27
|
+
@contact = Contact.find(params[:id])
|
|
28
|
+
if @contact.destroy
|
|
29
|
+
flash[:notice] = "Contact was successfully deleted"
|
|
30
|
+
redirect_to send(path)
|
|
31
|
+
else
|
|
32
|
+
flash.now[:error] = "There was a problem deleting the contact."
|
|
33
|
+
render :action => 'show'
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module ControllerMixins
|
|
2
|
+
module Generic
|
|
3
|
+
protected
|
|
4
|
+
def generic_save_and_redirect(object_type, action_type)
|
|
5
|
+
instance = instance_variable_get("@#{object_type}")
|
|
6
|
+
if instance.save
|
|
7
|
+
flash[:notice] = t("#{object_type}_#{action_type}d_successfully".to_sym)
|
|
8
|
+
redirect_to send("#{object_type}_path", instance)
|
|
9
|
+
else
|
|
10
|
+
flash.now[:error] = t("#{object_type}_#{action_type}d_unsuccessfully".to_sym)
|
|
11
|
+
render :action => 'new'
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|