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
data/RELEASE_NOTES.md
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
08/30/2012
|
|
2
|
+
|
|
3
|
+
- Separete clients from normal users in admin report
|
|
4
|
+
- fix issue where ticket show page was not rendering work units in descending
|
|
5
|
+
order of scheduled date.
|
|
6
|
+
|
|
7
|
+
03/23/2012
|
|
8
|
+
|
|
9
|
+
- Add totals to weekly time report
|
|
10
|
+
|
|
11
|
+
02/27/2012
|
|
12
|
+
|
|
13
|
+
- Bootstrap2 upgrade complete and in place.
|
|
14
|
+
- Clean up various views to be more idiomatic rails3
|
|
15
|
+
- Clean up display in general to be more happy-to-be-bootstrap
|
|
16
|
+
- Change pie charts to progress bars
|
|
17
|
+
- Make most active project show up at top of projects listing.
|
|
18
|
+
- factor out a show_message method from dashboard code.
|
|
19
|
+
|
|
20
|
+
02/22/2012
|
|
21
|
+
|
|
22
|
+
- Link to projects in two week time report on dash.
|
|
23
|
+
|
|
24
|
+
02/16/2012
|
|
25
|
+
|
|
26
|
+
- Added better client dashboard to see monthly work unit statistics.
|
|
27
|
+
|
|
28
|
+
02/07/2012
|
|
29
|
+
|
|
30
|
+
- Refactored the way that work_units are loaded in the calendar.
|
|
31
|
+
|
|
32
|
+
02/06/2012
|
|
33
|
+
|
|
34
|
+
- Upgraded to rails 3.2
|
|
35
|
+
- Removed fnordmetric as it was not compatible with the rails 3.2 upgrade
|
|
36
|
+
- Ticket descriptions now render with markdown
|
|
37
|
+
|
|
38
|
+
01/30/2012
|
|
39
|
+
|
|
40
|
+
- Made minor modifications to the api for the cli app
|
|
41
|
+
|
|
42
|
+
01/27/2012
|
|
43
|
+
|
|
44
|
+
- Added data vault to store username and passwords
|
|
45
|
+
|
|
46
|
+
01/24/2012
|
|
47
|
+
|
|
48
|
+
- Added release note and xrono note functionality to projects
|
|
49
|
+
|
|
50
|
+
01/23/2012
|
|
51
|
+
|
|
52
|
+
- Added ability to create tickets while creating a new work unit
|
|
53
|
+
|
|
54
|
+
01/04/2012
|
|
55
|
+
|
|
56
|
+
- Added realtime metrics
|
|
57
|
+
- Added github integration
|
|
58
|
+
- Bar graphs for work units
|
|
59
|
+
- Fixed a bug in work unit creation
|
|
60
|
+
> Now when you try to submit a work unit without a ticket you get a dialog
|
|
61
|
+
|
|
62
|
+
12/25/2011
|
|
63
|
+
|
|
64
|
+
- New client login feature:
|
|
65
|
+
> Users can now be given special login behavior via a "Client Login" checkbox
|
|
66
|
+
> Users with "Client Logins" will be isolated to the client_login namespace
|
|
67
|
+
> Users with "Client Logins" have an awesome experience to manage (add/update) their contacts and view their work units
|
|
68
|
+
> Users with "Client Logins" will also be able to see reporting on a per-ticket basis that shows a fancy pie chart.
|
|
69
|
+
The pie chart displays a percentage of completion based on estimated time to complete a ticket and the ammount of
|
|
70
|
+
that estimated time that remains.
|
|
71
|
+
|
|
72
|
+
12/15/2011
|
|
73
|
+
|
|
74
|
+
- Email notifications to clients as background jobs using Resque::Mailer
|
|
75
|
+
- Styling changes to the admin/invoices page
|
|
76
|
+
- A centralized reporting page for admins.
|
|
77
|
+
- Ticket numbers on the project's index.
|
|
78
|
+
- Reporting on Tickets based on estimated time to complete a ticket versus total effective hours on the ticket.
|
|
79
|
+
- Showing the add ticket partial to admins.
|
|
80
|
+
|
|
81
|
+
EARLIER
|
|
82
|
+
|
|
83
|
+
- No release notes were really kept prior to this date. Oops :)
|
data/Rakefile
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env rake
|
|
2
|
+
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
|
3
|
+
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
require 'rake'
|
|
7
|
+
|
|
8
|
+
require 'rubygems'
|
|
9
|
+
require 'bundler/setup'
|
|
10
|
+
Bundler.require :default, :development
|
|
11
|
+
Combustion::Application.load_tasks
|
|
12
|
+
begin
|
|
13
|
+
require 'ci/reporter/rake/rspec' # use this if you're using RSpec
|
|
14
|
+
rescue LoadError
|
|
15
|
+
end
|
data/XRONO.md
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
|
|
2
|
+
## Xrono
|
|
3
|
+
[](https://travis-ci.org/isotope11/xrono)
|
|
4
|
+
|
|
5
|
+
Xrono is a mature, open source, time tracking solution for your business.
|
|
6
|
+
Developed by Isotope11, Xrono is intended to be a core technology for smooth
|
|
7
|
+
operation of consultancies. Xrono allows team members to bill time against
|
|
8
|
+
clients, and then admins to easily export invoices and payroll into their
|
|
9
|
+
accounting systems. Beyond that, it has vacation time management, overtime,
|
|
10
|
+
client access and notification, and many more features. Xrono is currently under
|
|
11
|
+
active development, so feel free to check out our
|
|
12
|
+
[support](http://www.xrono.org/#support) section of our
|
|
13
|
+
[website](http://www.xrono.org/) if you have any questions.
|
|
14
|
+
|
|
15
|
+
### Demo site
|
|
16
|
+
[See it in action here.](http://demo.xrono.org)
|
|
17
|
+
|
|
18
|
+
You can log in as any of the following email addresses. All have the password
|
|
19
|
+
'123456'
|
|
20
|
+
|
|
21
|
+
admin@xrono.org
|
|
22
|
+
dev@xrono.org
|
|
23
|
+
client@xrono.org
|
|
24
|
+
|
|
25
|
+
### Screenshots
|
|
26
|
+
Here are some screenshots of what it looks like:
|
|
27
|
+
|
|
28
|
+
#### The developer dashboard
|
|
29
|
+

|
|
30
|
+
|
|
31
|
+
#### A ticket view
|
|
32
|
+

|
|
33
|
+
|
|
34
|
+
### Continuous Integration Trends
|
|
35
|
+
|
|
36
|
+
#### Test Result Trend
|
|
37
|
+

|
|
38
|
+
#### Rcov coverage
|
|
39
|
+

|
|
40
|
+
|
|
41
|
+
### OAuth provider
|
|
42
|
+
|
|
43
|
+
Xrono is now an OAuth2 provider. [Details on how you can totes verify this here.](https://github.com/applicake/doorkeeper/wiki/Testing-your-provider-with-OAuth2-gem)
|
|
44
|
+
|
|
45
|
+
### Development Installation
|
|
46
|
+
Fork, then clone the repository to your development environment
|
|
47
|
+
|
|
48
|
+
gem install bundler
|
|
49
|
+
bundle install
|
|
50
|
+
cp config/database.yml.example config/database.yml
|
|
51
|
+
# Change config/database.yml as you see fit to match your development environment needs
|
|
52
|
+
rake db:reset db:test:clone spec cucumber
|
|
53
|
+
|
|
54
|
+
### Support
|
|
55
|
+
For support, please do one of the following:
|
|
56
|
+
|
|
57
|
+
* Post to our [Google Group](http://groups.google.com/group/xrono).
|
|
58
|
+
* Join us in IRC on Freenode [#xrono](irc://irc.freenode.net:6667/xrono)
|
|
59
|
+
* Create a ticket on our [GitHub Issue Tracker](http://github.com/isotope11/xrono/issues) for bugs.
|
|
60
|
+
|
|
61
|
+
### Contributing
|
|
62
|
+
We love contributions! please fork the project, make your changes in a branch,
|
|
63
|
+
test them properly - rspec for model/lib/helpers) and cucumber for integration
|
|
64
|
+
testing - then send us a pull request.
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
// ---------- Work Unit Creation
|
|
2
|
+
|
|
3
|
+
// When a developer needs to add work units
|
|
4
|
+
// to a project he/she has not been assigned
|
|
5
|
+
$("#checkbox").change(function(){
|
|
6
|
+
var me = $("#work_unit_client_id");
|
|
7
|
+
me.children().remove();
|
|
8
|
+
me.append( new Option("Select a client","") )
|
|
9
|
+
$("#work_unit_project_id").children().remove();
|
|
10
|
+
$("#work_unit_project_id").append( new Option("Select a project",""))
|
|
11
|
+
$("#work_unit_ticket_id").children().remove();
|
|
12
|
+
$("#work_unit_ticket_id").append( new Option("Select a ticket",""))
|
|
13
|
+
|
|
14
|
+
params = {bucket: "Client"}
|
|
15
|
+
params["all"] = this.checked ? 'true' : 'false'
|
|
16
|
+
$.get("/dashboard/json_index", params, function(data){
|
|
17
|
+
$.each(data, function(i, client){
|
|
18
|
+
me.append( new Option(client.name, client.id) )
|
|
19
|
+
});
|
|
20
|
+
<% unless Rails.env.test? || Rails.env.cucumber? %>
|
|
21
|
+
<% # only use chosen in dev r prod - it breaks cukes %>
|
|
22
|
+
me.trigger("liszt:updated");
|
|
23
|
+
<% end %>
|
|
24
|
+
}, "json");
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
// when client is changed, populate the projects
|
|
28
|
+
$("#work_unit_client_id").change(function(){
|
|
29
|
+
var me = $("#work_unit_project_id");
|
|
30
|
+
me.children().remove();
|
|
31
|
+
me.append( new Option("Select a project","") )
|
|
32
|
+
$("#work_unit_ticket_id").children().remove();
|
|
33
|
+
$("#work_unit_ticket_id").append( new Option("Select a ticket",""))
|
|
34
|
+
if(this.value != '') {
|
|
35
|
+
params = {bucket: "Project", id: this.value}
|
|
36
|
+
params["all"] = document.getElementById("checkbox").checked ? 'true' : 'false'
|
|
37
|
+
$.get("/dashboard/json_index", params, function(data){
|
|
38
|
+
$.each(data, function(i, project){
|
|
39
|
+
me.append( new Option(project.name, project.id) )
|
|
40
|
+
});
|
|
41
|
+
<% unless Rails.env.test? || Rails.env.cucumber? %>
|
|
42
|
+
<% # only use chosen in dev r prod - it breaks cukes %>
|
|
43
|
+
me.trigger("liszt:updated");
|
|
44
|
+
$("#work_unit_ticket_id").trigger("liszt:updated");
|
|
45
|
+
<% end %>
|
|
46
|
+
}, "json");
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// when project is changed, populate the tickets
|
|
51
|
+
$("#work_unit_project_id").change(function(){
|
|
52
|
+
var me = $("#work_unit_ticket_id")
|
|
53
|
+
me.children().remove();
|
|
54
|
+
me.append( new Option("Select a ticket","") )
|
|
55
|
+
me.append( new Option("New Ticket", "-1") )
|
|
56
|
+
if(!this.value.blank) {
|
|
57
|
+
params = {bucket: "Ticket", id: this.value, all: "true"}
|
|
58
|
+
$.get("/dashboard/json_index", params, function(data){
|
|
59
|
+
$.each(data, function(i, ticket){
|
|
60
|
+
me.append( new Option(ticket.name, ticket.id) )
|
|
61
|
+
});
|
|
62
|
+
<% unless Rails.env.test? || Rails.env.cucumber? %>
|
|
63
|
+
<% # only use chosen in dev r prod - it breaks cukes %>
|
|
64
|
+
me.trigger("liszt:updated");
|
|
65
|
+
<% end %>
|
|
66
|
+
}, "json");
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// When ticket is changed, test to see if is changed to "New Ticket"
|
|
71
|
+
$('#work_unit_ticket_id').change(function() {
|
|
72
|
+
if (this.value == "-1") {
|
|
73
|
+
$('#on_demand_ticket').show();
|
|
74
|
+
} else {
|
|
75
|
+
$('#on_demand_ticket').hide();
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
// AJAX work unit creation
|
|
81
|
+
|
|
82
|
+
$("#new_work_unit").submit(function() {
|
|
83
|
+
var me = $(this);
|
|
84
|
+
$("#work_unit_submit").attr('disabled', true);
|
|
85
|
+
data = {"work_unit[description]": me.find("#work_unit_description").val(),
|
|
86
|
+
"work_unit[scheduled_at]": me.find("#work_unit_scheduled_at").val(),
|
|
87
|
+
"work_unit[client_id]": me.find("#work_unit_client_id").val(),
|
|
88
|
+
"work_unit[project_id]": me.find("#work_unit_project_id").val(),
|
|
89
|
+
"work_unit[ticket_id]": me.find("#work_unit_ticket_id").val(),
|
|
90
|
+
"work_unit[hours]": me.find("#work_unit_hours").val(),
|
|
91
|
+
"work_unit[overtime]": me.find("#work_unit_overtime").val(),
|
|
92
|
+
"hours_type": me.find("#hours_type").val()
|
|
93
|
+
}
|
|
94
|
+
if ($("#on_demand_ticket").is(":visible")) {
|
|
95
|
+
data["ticket[name]"] = me.find("#on_demand_ticket_name").val()
|
|
96
|
+
data["ticket[description]"] = me.find("#on_demand_ticket_description").val()
|
|
97
|
+
data["ticket[estimated_hours]"] = me.find("#on_demand_ticket_estimated_hours").val()
|
|
98
|
+
}
|
|
99
|
+
$.ajax(
|
|
100
|
+
{
|
|
101
|
+
async: true,
|
|
102
|
+
global: false,
|
|
103
|
+
url: me.attr("action"),
|
|
104
|
+
type: "POST",
|
|
105
|
+
dataType: "json",
|
|
106
|
+
data: data,
|
|
107
|
+
success: function(result)
|
|
108
|
+
{
|
|
109
|
+
var notice = result.notice
|
|
110
|
+
me.trigger("reset");
|
|
111
|
+
me.effect("highlight");
|
|
112
|
+
$("#on_demand_ticket").hide();
|
|
113
|
+
$("#work_unit_client_id").children().remove();
|
|
114
|
+
$("#work_unit_client_id").append( new Option("Select a client","") );
|
|
115
|
+
$("#work_unit_project_id").children().remove();
|
|
116
|
+
$("#work_unit_project_id").append( new Option("Select a project","") );
|
|
117
|
+
$("#work_unit_ticket_id").children().remove();
|
|
118
|
+
$("#work_unit_ticket_id").append( new Option("Select a ticket","") );
|
|
119
|
+
document.getElementById("hours_type").options[0].selected = true; // May need to do this two ways (browser differences)
|
|
120
|
+
$("#hours_type").selectedIndex = 0; // Reset hours_type to "normal"
|
|
121
|
+
$("#hours_type").trigger("liszt:updated"); // Chosen provides an overlay for the hours_type select box. Here we tell chosen we've changed the selected item.
|
|
122
|
+
$.get("/dashboard/json_index", { bucket: "Client", id: this.value }, function(data){
|
|
123
|
+
$.each(data, function(i, client){
|
|
124
|
+
$("#work_unit_client_id").append( new Option(client.name, client.id) )
|
|
125
|
+
});
|
|
126
|
+
<% unless Rails.env.test? || Rails.env.cucumber? %>
|
|
127
|
+
<% # only use chosen in dev r prod - it breaks cukes %>
|
|
128
|
+
$("#work_unit_client_id").trigger("liszt:updated");
|
|
129
|
+
$("#work_unit_project_id").trigger("liszt:updated");
|
|
130
|
+
$("#work_unit_ticket_id").trigger("liszt:updated");
|
|
131
|
+
<% end %>
|
|
132
|
+
}, "json");
|
|
133
|
+
// Ask the calendar to update itself
|
|
134
|
+
update_calendar_block();
|
|
135
|
+
$('#scheduled_at').datepicker('setDate', new Date());
|
|
136
|
+
$('#work_unit_scheduled_at').val(new Date());
|
|
137
|
+
$('#schedule_modal_link').text($('#scheduled_at').val());
|
|
138
|
+
if(notice) {
|
|
139
|
+
$("#work_unit_errors").data('notice', notice);
|
|
140
|
+
$("#work_unit_errors").dialog('open');
|
|
141
|
+
};
|
|
142
|
+
$("#work_unit_submit").attr('disabled', false);
|
|
143
|
+
},
|
|
144
|
+
error: function(result)
|
|
145
|
+
{
|
|
146
|
+
var json_result = JSON.parse(result.responseText);
|
|
147
|
+
var errors = json_result.errors;
|
|
148
|
+
$("#work_unit_errors").data('errors', errors);
|
|
149
|
+
$("#work_unit_errors").dialog('open');
|
|
150
|
+
$("#work_unit_submit").attr('disabled', false);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
return false;
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
// Error handling on failed AJAX work unit creation
|
|
157
|
+
$("#work_unit_errors").dialog( {
|
|
158
|
+
autoOpen: false,
|
|
159
|
+
hide: true,
|
|
160
|
+
title: "Notice",
|
|
161
|
+
modal: true,
|
|
162
|
+
draggable: false,
|
|
163
|
+
open: function() {
|
|
164
|
+
var dialog = $("#work_unit_errors");
|
|
165
|
+
dialog.html("");
|
|
166
|
+
if(dialog.data('errors')) {
|
|
167
|
+
dialog.append("<p>" + dialog.data('errors') + "</p>");
|
|
168
|
+
};
|
|
169
|
+
if(dialog.data('notice')) {
|
|
170
|
+
dialog.append("<p>" + dialog.data('notice') + "</p>")
|
|
171
|
+
};
|
|
172
|
+
},
|
|
173
|
+
close: function() {
|
|
174
|
+
var dialog = $("#work_unit_errors")
|
|
175
|
+
dialog.html("");
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
// ---------- Ticket Creation
|
|
180
|
+
|
|
181
|
+
// when client is changed, populate the projects
|
|
182
|
+
$("#ticket_client_id").change(function(){
|
|
183
|
+
var me = $("#ticket_project_id");
|
|
184
|
+
me.children().remove();
|
|
185
|
+
me.append( new Option("Select a project","") )
|
|
186
|
+
$("#work_unit_ticket_id").children().remove();
|
|
187
|
+
$("#work_unit_ticket_id").append( new Option("Select a ticket",""))
|
|
188
|
+
if(this.value != "") {
|
|
189
|
+
$.get("/dashboard/client", { id: this.value }, function(data){
|
|
190
|
+
$.each(data, function(k, v){
|
|
191
|
+
me.append( new Option(v.name, v.id) )
|
|
192
|
+
});
|
|
193
|
+
<% unless Rails.env.test? || Rails.env.cucumber? %>
|
|
194
|
+
<% # only use chosen in dev r prod - it breaks cukes %>
|
|
195
|
+
me.trigger("liszt:updated");
|
|
196
|
+
<% end %>
|
|
197
|
+
}, "json");
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
// when project is changed, populate the tickets
|
|
202
|
+
$("#ticket_project_id").change(function(){
|
|
203
|
+
var me = $("#ticket_ticket_id")
|
|
204
|
+
me.children().remove();
|
|
205
|
+
me.append( new Option("Select a ticket","") )
|
|
206
|
+
if(this.value != "") {
|
|
207
|
+
$.get("/dashboard/project", { id: this.value }, function(data){
|
|
208
|
+
$.each(data, function(k, v){
|
|
209
|
+
me.append( new Option(v.name, v.id) )
|
|
210
|
+
});
|
|
211
|
+
<% unless Rails.env.test? || Rails.env.cucumber? %>
|
|
212
|
+
<% # only use chosen in dev r prod - it breaks cukes %>
|
|
213
|
+
me.trigger("liszt:updated");
|
|
214
|
+
<% end %>
|
|
215
|
+
}, "json");
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
// AJAX ticket creation
|
|
220
|
+
$("#new_ticket").submit(function() {
|
|
221
|
+
var me = $(this);
|
|
222
|
+
$("#ticket_submit").attr('disabled', true);
|
|
223
|
+
$.ajax(
|
|
224
|
+
{
|
|
225
|
+
async: true,
|
|
226
|
+
global: false,
|
|
227
|
+
url: me.attr("action"),
|
|
228
|
+
type: "POST",
|
|
229
|
+
dataType: "json",
|
|
230
|
+
data: {"ticket[project_id]": me.find("#ticket_project_id").val(),
|
|
231
|
+
"ticket[name]": me.find("#ticket_name").val(),
|
|
232
|
+
"ticket[estimated_hours]": me.find("#ticket_estimated_hours").val(),
|
|
233
|
+
"ticket[description]": me.find("#ticket_description").val() },
|
|
234
|
+
success: function(result)
|
|
235
|
+
{
|
|
236
|
+
var json = $.parseJSON( result.responseText )
|
|
237
|
+
me.trigger("reset");
|
|
238
|
+
me.effect("highlight");
|
|
239
|
+
$("#ticket_submit").attr('disabled', false);
|
|
240
|
+
},
|
|
241
|
+
error: function(result)
|
|
242
|
+
{
|
|
243
|
+
var json = $.parseJSON( result.responseText )
|
|
244
|
+
$("#ticket_errors").data('errors', json);
|
|
245
|
+
$("#ticket_errors").dialog('open');
|
|
246
|
+
$("#ticket_submit").attr('disabled', false);
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
return false;
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
// Error handling on failed AJAX ticket creation
|
|
253
|
+
$("#ticket_errors").dialog( {
|
|
254
|
+
autoOpen: false,
|
|
255
|
+
hide: true,
|
|
256
|
+
title: "Error",
|
|
257
|
+
modal: true,
|
|
258
|
+
draggable: false,
|
|
259
|
+
open: function() {
|
|
260
|
+
var dialog = $("#ticket_errors")
|
|
261
|
+
dialog.html("")
|
|
262
|
+
$.each( dialog.data('errors'), function() {
|
|
263
|
+
dialog.append("<p>" + this + "</p>")
|
|
264
|
+
});
|
|
265
|
+
},
|
|
266
|
+
close: function() {
|
|
267
|
+
var dialog = $("#ticket_errors")
|
|
268
|
+
dialog.html("");
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
// ---------- Schedule Modal
|
|
274
|
+
function update_calendar_block(){
|
|
275
|
+
$.ajax( {
|
|
276
|
+
async: true,
|
|
277
|
+
url: '/dashboard/calendar',
|
|
278
|
+
type: 'GET',
|
|
279
|
+
dataType: 'script'
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// ---------- Calendar Javascript
|
|
284
|
+
function get_week(week){
|
|
285
|
+
$.ajax( {
|
|
286
|
+
async: true,
|
|
287
|
+
url: '/dashboard/update_calendar?date=' + week,
|
|
288
|
+
type: 'GET',
|
|
289
|
+
dataType: 'json',
|
|
290
|
+
success: function(response){
|
|
291
|
+
$('.calendar').html(response.data);
|
|
292
|
+
$('.week_pagination').html(response.week_pagination);
|
|
293
|
+
// We have to reload the triggers since they are regenerated on each request
|
|
294
|
+
set_week_pagination_triggers();
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
function set_week_pagination_triggers(){
|
|
300
|
+
$('.get_week_calendar').click(function(e){
|
|
301
|
+
var week = /\d{4}-\d{2}-\d{2}/i.exec(this);
|
|
302
|
+
get_week(week);
|
|
303
|
+
return false;
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
set_week_pagination_triggers();
|