Showing preview only (6,154K chars total). Download the full file or copy to clipboard to get everything.
Repository: AgileVentures/WebsiteOne
Branch: develop
Commit: 15f7edb09b20
Files: 896
Total size: 5.7 MB
Directory structure:
gitextract_wh9nt73x/
├── .buildpacks
├── .codeclimate.yml
├── .coveralls.yml
├── .dockerignore
├── .eslintignore
├── .eslintrc
├── .gitignore
├── .rspec
├── .rubocop.yml
├── .rubocop_todo.yml
├── .ruby-gemset
├── .ruby-version
├── .semaphore/
│ └── semaphore.yml
├── .simplecov
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Dockerfile
├── Gemfile
├── LICENSE
├── Procfile
├── Procfile.dev
├── README.md
├── Rakefile
├── app/
│ ├── assets/
│ │ ├── builds/
│ │ │ └── .keep
│ │ ├── config/
│ │ │ └── manifest.js
│ │ ├── images/
│ │ │ └── .keep
│ │ ├── javascripts/
│ │ │ ├── application.js
│ │ │ ├── bootstrap-datepicker.js
│ │ │ ├── bootstrap-tags.js
│ │ │ ├── bootstrap.js
│ │ │ ├── controllers/
│ │ │ │ ├── application.js
│ │ │ │ ├── events_controller.js
│ │ │ │ ├── events_form_controller.js
│ │ │ │ ├── index.js
│ │ │ │ ├── projects_controller.js
│ │ │ │ └── projects_languages_controller.js
│ │ │ ├── cookies_banner.js
│ │ │ ├── disqus.js
│ │ │ ├── documents.js
│ │ │ ├── global-modules/
│ │ │ │ ├── accordion_collapse.js
│ │ │ │ ├── affix_navbar.js
│ │ │ │ ├── event_countdown.js
│ │ │ │ └── flash.js
│ │ │ ├── google-analytics.js
│ │ │ ├── hangout_play_on_hover.js
│ │ │ ├── inspectlet.js
│ │ │ ├── jq.js
│ │ │ ├── jquery-ui.js
│ │ │ ├── nprogress.js
│ │ │ ├── scrums.js
│ │ │ ├── search_toggle.js
│ │ │ ├── subscriptions.js
│ │ │ ├── typeahead.jquery.js
│ │ │ ├── users.js
│ │ │ └── websiteone.js
│ │ └── stylesheets/
│ │ ├── _mixins.scss
│ │ ├── _variables.scss
│ │ ├── actiontext.css
│ │ ├── actiontext.scss
│ │ ├── application.bootstrap.scss
│ │ ├── application.scss
│ │ ├── components/
│ │ │ ├── calendar-date.scss
│ │ │ ├── calendar-dropdown.scss
│ │ │ └── dropdown.scss
│ │ ├── global/
│ │ │ ├── articles.scss
│ │ │ ├── authentications.scss
│ │ │ ├── bootstrap-tags.scss
│ │ │ ├── bootstrap-tokenfield.min.scss
│ │ │ ├── confy.scss
│ │ │ ├── cubeportfolio.scss
│ │ │ ├── custom.scss
│ │ │ ├── custom_errors.scss
│ │ │ ├── docs.scss
│ │ │ ├── events.scss
│ │ │ ├── hangouts.scss
│ │ │ ├── hookups.scss
│ │ │ ├── nprogressbar.scss
│ │ │ ├── projects.scss
│ │ │ ├── round_banners.scss
│ │ │ ├── sidebar.scss
│ │ │ ├── social.scss
│ │ │ ├── sponsors.scss
│ │ │ ├── static_pages.scss
│ │ │ ├── tokenfield-typeahead.min.scss
│ │ │ └── users.scss
│ │ ├── jquery-ui.css
│ │ ├── jquery-ui.structure.css
│ │ ├── jquery-ui.theme.css
│ │ ├── layout/
│ │ │ ├── buttons.scss
│ │ │ ├── flash.scss
│ │ │ ├── footer.scss
│ │ │ ├── landing-page.scss
│ │ │ ├── navbar.scss
│ │ │ └── user_controls.scss
│ │ ├── main.scss
│ │ ├── subscriptions.scss
│ │ ├── timeline.scss
│ │ └── vanity.scss
│ ├── controllers/
│ │ ├── application_controller.rb
│ │ ├── articles_controller.rb
│ │ ├── authentications_controller.rb
│ │ ├── av_dashboard_tokens_controller.rb
│ │ ├── calendar_controller.rb
│ │ ├── cards_controller.rb
│ │ ├── concerns/
│ │ │ ├── .keep
│ │ │ ├── deactivated_user_finder.rb
│ │ │ └── statistics.rb
│ │ ├── cookies_controller.rb
│ │ ├── dashboard_controller.rb
│ │ ├── documents_controller.rb
│ │ ├── event_instances_controller.rb
│ │ ├── events_controller.rb
│ │ ├── legacy_api/
│ │ │ └── subscriptions_controller.rb
│ │ ├── paypal_agreement_controller.rb
│ │ ├── projects_controller.rb
│ │ ├── registrations_controller.rb
│ │ ├── scrums_controller.rb
│ │ ├── static_pages_controller.rb
│ │ ├── subscriptions_controller.rb
│ │ ├── users_controller.rb
│ │ ├── vanity_controller.rb
│ │ └── visitors_controller.rb
│ ├── helpers/
│ │ ├── application_helper.rb
│ │ ├── articles_helper.rb
│ │ ├── authentications_helper.rb
│ │ ├── cookies_helper.rb
│ │ ├── devise_helper.rb
│ │ ├── disqus_helper.rb
│ │ ├── documents_helper.rb
│ │ ├── event_helper.rb
│ │ ├── event_instances_helper.rb
│ │ ├── features.rb
│ │ ├── layout_helper.rb
│ │ ├── projects_helper.rb
│ │ ├── scrums_helper.rb
│ │ ├── static_pages_helper.rb
│ │ ├── subscriptions_helper.rb
│ │ ├── users_helper.rb
│ │ └── visitors_helper.rb
│ ├── jobs/
│ │ ├── application_job.rb
│ │ ├── github_commits_job.rb
│ │ ├── github_languages_job.rb
│ │ ├── github_last_updates_job.rb
│ │ ├── github_readme_files_job.rb
│ │ └── github_static_pages_job.rb
│ ├── mailers/
│ │ ├── .keep
│ │ ├── admin_mailer.rb
│ │ ├── application_mailer.rb
│ │ ├── mailer.rb
│ │ ├── project_mailer.rb
│ │ └── sandbox_email_interceptor.rb
│ ├── models/
│ │ ├── .keep
│ │ ├── application_record.rb
│ │ ├── article.rb
│ │ ├── authentication.rb
│ │ ├── commit_count.rb
│ │ ├── concerns/
│ │ │ ├── .keep
│ │ │ ├── act_as_page.rb
│ │ │ ├── filterable.rb
│ │ │ └── user_nullable.rb
│ │ ├── contact_form.rb
│ │ ├── document.rb
│ │ ├── event.rb
│ │ ├── event_date.rb
│ │ ├── event_instance.rb
│ │ ├── follow.rb
│ │ ├── hangout_participants_snapshot.rb
│ │ ├── issue_tracker.rb
│ │ ├── karma.rb
│ │ ├── language.rb
│ │ ├── language_project.rb
│ │ ├── null_user.rb
│ │ ├── payment_source.rb
│ │ ├── plan.rb
│ │ ├── premium.rb
│ │ ├── premium_f2_f.rb
│ │ ├── premium_mob.rb
│ │ ├── premium_plus.rb
│ │ ├── project.rb
│ │ ├── slack_channel.rb
│ │ ├── source_repository.rb
│ │ ├── static_page.rb
│ │ ├── status.rb
│ │ ├── subscription.rb
│ │ └── user.rb
│ ├── presenters/
│ │ ├── base_presenter.rb
│ │ ├── event_instance_presenter.rb
│ │ └── users/
│ │ └── user_presenter.rb
│ ├── services/
│ │ ├── add_subscription_to_user_for_plan.rb
│ │ ├── error_logging_service.rb
│ │ ├── hangout_notification_service.rb
│ │ ├── karma_calculator.rb
│ │ ├── markdown_converter.rb
│ │ ├── modify_event_participation.rb
│ │ ├── paypal_service.rb
│ │ └── youtube_notification_service.rb
│ └── views/
│ ├── active_storage/
│ │ └── blobs/
│ │ └── _blob.html.erb
│ ├── admin_mailer/
│ │ └── failed_to_invite_user_to_slack.html.erb
│ ├── application/
│ │ └── _edit_card.html.erb
│ ├── articles/
│ │ ├── _article.html.erb
│ │ ├── _form.html.erb
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ ├── preview.html.erb
│ │ └── show.html.erb
│ ├── av_dashboard_tokens/
│ │ └── create.html.erb
│ ├── cards/
│ │ ├── create.html.erb
│ │ ├── edit.html.erb
│ │ ├── new.html.erb
│ │ └── update.html.erb
│ ├── cookies/
│ │ └── index.html.erb
│ ├── dashboard/
│ │ └── index.html.erb
│ ├── devise/
│ │ ├── confirmations/
│ │ │ └── new.html.erb
│ │ ├── mailer/
│ │ │ ├── confirmation_instructions.html.erb
│ │ │ ├── reset_password_instructions.html.erb
│ │ │ └── unlock_instructions.html.erb
│ │ ├── passwords/
│ │ │ ├── edit.html.erb
│ │ │ └── new.html.erb
│ │ ├── registrations/
│ │ │ ├── _destroy_modal.html.erb
│ │ │ ├── _preview.html.erb
│ │ │ ├── edit.html.erb
│ │ │ └── new.html.erb
│ │ ├── sessions/
│ │ │ └── new.html.erb
│ │ ├── shared/
│ │ │ └── _links.erb
│ │ └── unlocks/
│ │ └── new.html.erb
│ ├── disqus/
│ │ └── _disqus.html.erb
│ ├── documents/
│ │ ├── _categories.html.erb
│ │ ├── _form.html.erb
│ │ ├── edit.html.erb
│ │ ├── new.html.erb
│ │ ├── show.html.erb
│ │ └── show.json.jbuilder
│ ├── errors/
│ │ └── unacceptable.html.erb
│ ├── event_instances/
│ │ ├── _hangout_button.html.erb
│ │ ├── _hangout_status.html.erb
│ │ ├── _hangouts.html.erb
│ │ ├── _index_basic_info.html.erb
│ │ ├── _index_extra_info.html.erb
│ │ ├── _index_header.html.erb
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ └── index.js.erb
│ ├── events/
│ │ ├── _form.html.erb
│ │ ├── _hangouts_management.html.erb
│ │ ├── _repeats_weekly_options.html.erb
│ │ ├── _videos.html.erb
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── index.json.jbuilder
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── hookups/
│ │ └── index.html.erb
│ ├── layouts/
│ │ ├── _activity_wrapper.html.erb
│ │ ├── _adwords_signup_conversion.html.erb
│ │ ├── _cookies_banner.html.erb
│ │ ├── _escalating_call_to_action.html.erb
│ │ ├── _event_link.html.erb
│ │ ├── _flash.html.erb
│ │ ├── _footer.html.erb
│ │ ├── _head.html.erb
│ │ ├── _hire_me.html.erb
│ │ ├── _meta_tags.html.erb
│ │ ├── _navbar.html.erb
│ │ ├── _require_users_profile.html.erb
│ │ ├── _round_banners.html.erb
│ │ ├── _sidebar.html.erb
│ │ ├── _sponsors.html.erb
│ │ ├── action_text/
│ │ │ └── contents/
│ │ │ └── _content.html.erb
│ │ ├── application.html.erb
│ │ ├── articles_layout.html.erb
│ │ ├── mailer.html.erb
│ │ ├── mailer.text.erb
│ │ ├── user_profile_layout.html.erb
│ │ ├── with_sidebar.html.erb
│ │ └── with_sidebar_sponsor_right.html.erb
│ ├── legacy_api/
│ │ └── subscriptions/
│ │ └── index.json.jbuilder
│ ├── mailer/
│ │ ├── hire_me_form.html.erb
│ │ ├── send_premium_payment_complete.html.erb
│ │ ├── send_sponsor_premium_payment_complete.html.erb
│ │ └── send_welcome_message.html.erb
│ ├── pages/
│ │ ├── about-us.html.erb
│ │ ├── berkeley-fall-2012-projects.html.erb
│ │ ├── code.html.erb
│ │ ├── cs-degree-online.html.erb
│ │ ├── free.html.erb
│ │ ├── getting-started.html.erb
│ │ ├── grow.html.erb
│ │ ├── guides.html.erb
│ │ ├── learn1.html.erb
│ │ ├── pair.html.erb
│ │ ├── personal-tuition-service.html.erb
│ │ ├── premium.html.erb
│ │ ├── premium_f2f.html.erb
│ │ ├── premium_mob.html.erb
│ │ ├── premium_plus.html.erb
│ │ ├── pricing.html.erb
│ │ ├── remote-pair-programming/
│ │ │ ├── analysis.html.erb
│ │ │ ├── c9-howto.html.erb
│ │ │ ├── creating-a-pp-event-on-g.html.erb
│ │ │ ├── example-videos.html.erb
│ │ │ ├── gnu-screen-pairing-notes.html.erb
│ │ │ ├── pair-programming-calendar.html.erb
│ │ │ ├── pair-programming-form.html.erb
│ │ │ ├── pair-programming-help-videos.html.erb
│ │ │ ├── pair-programming-protocols/
│ │ │ │ ├── classroom-guidelines.html.erb
│ │ │ │ └── github-pong.html.erb
│ │ │ └── pair-programming-protocols.html.erb
│ │ ├── remote-pair-programming.html.erb
│ │ ├── saas-ells-screencasts.html.erb
│ │ ├── sortable-ells-errata.html.erb
│ │ ├── sponsors.html.erb
│ │ └── ubuntu-bash-help.html.erb
│ ├── project_mailer/
│ │ ├── alert_project_creator_about_new_member.html.erb
│ │ ├── alert_project_creator_about_new_member.text.erb
│ │ ├── welcome_project_joinee.html.erb
│ │ └── welcome_project_joinee.text.erb
│ ├── projects/
│ │ ├── _activity.html.erb
│ │ ├── _connections.html.erb
│ │ ├── _documents_list.html.erb
│ │ ├── _form.html.erb
│ │ ├── _highlight_box.html.erb
│ │ ├── _issue_tracker_fields.html.erb
│ │ ├── _listing.html.erb
│ │ ├── _members_list.html.erb
│ │ ├── _source_repository_fields.html.erb
│ │ ├── _videos_list.html.erb
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ ├── pending_projects.html.erb
│ │ └── show.html.erb
│ ├── public_activity/
│ │ ├── article/
│ │ │ ├── _create.html.erb
│ │ │ └── _update.html.erb
│ │ ├── document/
│ │ │ ├── _create.html.erb
│ │ │ └── _update.html.erb
│ │ └── project/
│ │ ├── _create.html.erb
│ │ └── _update.html.erb
│ ├── scrums/
│ │ └── index.html.erb
│ ├── static_pages/
│ │ ├── internal_error.html.erb
│ │ ├── not_found.html.erb
│ │ ├── premium.html.erb
│ │ ├── premium_f2f.html.erb
│ │ ├── premium_mob.html.erb
│ │ └── show.html.erb
│ ├── subscriptions/
│ │ ├── create.html.erb
│ │ ├── new.html.erb
│ │ └── update.html.erb
│ ├── users/
│ │ ├── _user_avatar.html.erb
│ │ ├── _user_list.html.erb
│ │ ├── index.html.erb
│ │ ├── index.js.erb
│ │ ├── profile/
│ │ │ ├── _detail.html.erb
│ │ │ ├── _modal.html.erb
│ │ │ ├── _premium_mob_upgrade.html.erb
│ │ │ ├── _premium_plus_upgrade.html.erb
│ │ │ ├── _premium_upgrade.html.erb
│ │ │ ├── _set_level.html.erb
│ │ │ ├── _summary.html.erb
│ │ │ └── _videos.html.erb
│ │ └── show.html.erb
│ └── visitors/
│ ├── _text_and_image_trail.html.erb
│ ├── _text_trail.html.erb
│ └── index.html.erb
├── app.json
├── bin/
│ ├── bundle
│ ├── dev
│ ├── rails
│ ├── rake
│ ├── setup
│ ├── update
│ └── yarn
├── cloudbuild.yaml
├── coffeelint.json
├── config/
│ ├── application.rb
│ ├── boot.rb
│ ├── cable.yml
│ ├── credentials.yml.enc
│ ├── cucumber.yml
│ ├── database.yml
│ ├── environment.rb
│ ├── environments/
│ │ ├── development.rb
│ │ ├── production.rb
│ │ └── test.rb
│ ├── initializers/
│ │ ├── airbrake.rb
│ │ ├── apipie.rb
│ │ ├── application_controller_renderer.rb
│ │ ├── assets.rb
│ │ ├── backtrace_silencers.rb
│ │ ├── config.rb
│ │ ├── content_security_policy.rb
│ │ ├── cookies_serializer.rb
│ │ ├── cucumber.rb
│ │ ├── devise.rb
│ │ ├── exception_notification.rb
│ │ ├── filter_parameter_logging.rb
│ │ ├── friendly_id.rb
│ │ ├── geocoder.rb
│ │ ├── inflections.rb
│ │ ├── jvectormap.rb
│ │ ├── mime_types.rb
│ │ ├── new_framework_defaults_5_2.rb
│ │ ├── new_framework_defaults_6_1.rb
│ │ ├── new_framework_defaults_7_0.rb
│ │ ├── omniauth.rb
│ │ ├── permissions_policy.rb
│ │ ├── recaptcha.rb
│ │ ├── reload_api.rb
│ │ ├── sandbox_email_interceptor.rb
│ │ ├── secret_token.rb
│ │ ├── session_store.rb
│ │ ├── slack.rb
│ │ ├── stripe.rb
│ │ ├── vcr.rb
│ │ ├── website_one.rb
│ │ ├── wrap_parameters.rb
│ │ ├── youtube.rb
│ │ └── yt.rb
│ ├── locales/
│ │ ├── devise.en.yml
│ │ └── en.yml
│ ├── nested_key_extension.rb
│ ├── puma.rb
│ ├── routes.rb
│ ├── settings/
│ │ ├── development.yml
│ │ ├── production.yml
│ │ └── test.yml
│ ├── settings.local.yml.example
│ ├── settings.yml
│ ├── spring.rb
│ ├── storage.yml
│ ├── vanity.yml
│ └── zeus/
│ └── custom_plan.rb
├── config.ru
├── db/
│ ├── migrate/
│ │ ├── 20140109040839_devise_create_users.rb
│ │ ├── 20140110123347_create_projects.rb
│ │ ├── 20140116112830_create_documents.rb
│ │ ├── 20140118045711_change_projects_attributes.rb
│ │ ├── 20140120014041_add_first_last_names_to_users.rb
│ │ ├── 20140124205750_add_parent_id_to_documents.rb
│ │ ├── 20140124213333_create_authentications.rb
│ │ ├── 20140127043432_acts_as_follower_migration.rb
│ │ ├── 20140130073721_add_created_by_to_documents.rb
│ │ ├── 20140130073828_add_created_by_to_projects.rb
│ │ ├── 20140207004506_add_display_email_to_users.rb
│ │ ├── 20140207033343_add_you_tube_id_to_user.rb
│ │ ├── 20140207190458_add_slugs_to_models.rb
│ │ ├── 20140209164254_add_display_profile_to_users.rb
│ │ ├── 20140215192014_acts_as_taggable_on_migration.rb
│ │ ├── 20140219145424_create_articles.rb
│ │ ├── 20140220091703_add_latitude_and_longitude_to_user.rb
│ │ ├── 20140220131347_add_country_region_city_to_user.rb
│ │ ├── 20140225000044_create_versions.rb
│ │ ├── 20140225215805_create_events.rb
│ │ ├── 20140304210808_add_youtube_user_name_to_user.rb
│ │ ├── 20140305125426_add_current_hoa_url_to_events.rb
│ │ ├── 20140309133549_add_github_profile_url.rb
│ │ ├── 20140311052222_add_pivotaltracker_id_to_projects.rb
│ │ ├── 20140313161712_replace_document_index.rb
│ │ ├── 20140317093616_add_display_hire_me_to_users.rb
│ │ ├── 20140319173130_add_bio_to_users.rb
│ │ ├── 20140322120003_create_pages.rb
│ │ ├── 20140324210924_add_github_url_to_projects.rb
│ │ ├── 20140324211134_add_pivotaltracker_url_to_projects.rb
│ │ ├── 20140402091353_add_slug_to_events.rb
│ │ ├── 20140404100037_remove_pivotaltracker_id_from_projects.rb
│ │ ├── 20140414125301_add_email_option_to_user.rb
│ │ ├── 20140417124942_acts_as_votable_migration.rb
│ │ ├── 20140427074629_add_missing_unique_indices.acts_as_taggable_on_engine.rb
│ │ ├── 20140427074630_add_taggings_counter_cache_to_tags.acts_as_taggable_on_engine.rb
│ │ ├── 20140525135633_add_karma_to_users.rb
│ │ ├── 20140606204845_create_hangouts.rb
│ │ ├── 20140615154859_add_indexes_for_references.rb
│ │ ├── 20140618153610_create_commit_counts.rb
│ │ ├── 20140707211758_add_category_to_hangout.rb
│ │ ├── 20140716134701_import_getting_started_static_page.rb
│ │ ├── 20140725131327_event_combine_date_and_time_fields.rb
│ │ ├── 20140730123120_add_project_and_host_to_hangout.rb
│ │ ├── 20140910225619_add_exclusions_to_events.rb
│ │ ├── 20140913021637_add_pitch_to_projects.rb
│ │ ├── 20140913183322_change_column.rb
│ │ ├── 20140914202645_create_activities.rb
│ │ ├── 20140917070939_rename_hangouts_to_event_instances.rb
│ │ ├── 20140929201012_create_statuses.rb
│ │ ├── 20141002084933_create_newsletters.rb
│ │ ├── 20141007192312_add_commit_count_to_projects.rb
│ │ ├── 20141013191112_add_attributes_to_users.rb
│ │ ├── 20141119002743_add_image_url_to_projects.rb
│ │ ├── 20150208124239_add_timezone_offset_to_users.rb
│ │ ├── 20150308085306_add_missing_taggable_index.acts_as_taggable_on_engine.rb
│ │ ├── 20150308085307_change_collation_for_tag_names.acts_as_taggable_on_engine.rb
│ │ ├── 20150410173625_add_status_count_to_users.rb
│ │ ├── 20150520184236_add_hoa_status_to_event_instances.rb
│ │ ├── 20160316153919_add_project_to_events.rb
│ │ ├── 20160627134611_add_creator_to_events.rb
│ │ ├── 20160831131548_add_stripe_customer_i_dto_users.rb
│ │ ├── 20160921152810_create_karmas.rb
│ │ ├── 20160923135850_add_subscriptions.rb
│ │ ├── 20160923145243_add_payment_sources.rb
│ │ ├── 20160928132707_remove_karma_from_user_table.rb
│ │ ├── 20160928134250_rename_karma_karma_to_total.rb
│ │ ├── 20160928152822_add_hangout_participants_snapshots.rb
│ │ ├── 20161028144621_add_url_set_directly_column_to_event_instance.rb
│ │ ├── 20161103011445_create_friendly_id_slugs.rb
│ │ ├── 20161122200727_add_deleted_at_to_users.rb
│ │ ├── 20161128165206_add_last_commit_at_to_projects.rb
│ │ ├── 20161218160338_create_plans.rb
│ │ ├── 20161221125828_add_plan_to_subscription.rb
│ │ ├── 20161221182758_remove_stripe_customer_from_user.rb
│ │ ├── 20161223092205_add_youtube_tweeet_sent_to_event_instances.rb
│ │ ├── 20170115171525_add_category_column_to_plans.rb
│ │ ├── 20170918083218_create_source_repositories.rb
│ │ ├── 20171118201937_add_sponsor_column_to_subscription.rb
│ │ ├── 20180121175914_add_for_column_to_events.rb
│ │ ├── 20180406015134_add_event_participation_count_to_users.rb
│ │ ├── 20180507045056_add_column_modifier_id_to_events.rb
│ │ ├── 20180514105034_set_users_receive_mailings_default_false.rb
│ │ ├── 20180515093331_remove_newsletter.rb
│ │ ├── 20180729040001_add_slack_channel_name_to_projects.rb
│ │ ├── 20180730173345_add_creator_attendance_to_events.rb
│ │ ├── 20180803173355_add_can_see_dashboard_to_users.rb
│ │ ├── 20180810180605_add_karma_breakdown_elements_to_karma_table.rb
│ │ ├── 20180813125658_create_languages.rb
│ │ ├── 20180828145628_vanity_migration.rb
│ │ ├── 20181220155404_create_slack_channel.rb
│ │ ├── 20181220160421_create_join_table_project_slack_channel.rb
│ │ ├── 20190129191454_add_paypal_id_to_plans.rb
│ │ ├── 20190311230108_create_issue_trackers.rb
│ │ ├── 20190412143519_create_join_table_events_slack_channel.rb
│ │ ├── 20210702172212_drop_vanity_tables.rb
│ │ ├── 20210721093118_add_admin_to_users.rb
│ │ ├── 20221215192333_change_exclusions_in_events.rb
│ │ ├── 20221215193425_change_participants_in_event_instances.rb
│ │ ├── 20230314192607_create_active_storage_tables.active_storage.rb
│ │ └── 20230314193359_create_action_text_tables.action_text.rb
│ ├── schema.rb
│ ├── seeds/
│ │ ├── event_instances.rb
│ │ └── events.rb
│ └── seeds.rb
├── docker/
│ ├── README.md
│ ├── setup.sh
│ ├── start.sh
│ └── stop.sh
├── docker-compose.yml
├── docker-entrypoint.sh
├── docs/
│ ├── README.md
│ ├── adding_title_to_page_view.md
│ ├── c9/
│ │ └── install_notes.md
│ ├── cert_renewal_heroku.md
│ ├── code_style_conventions.md
│ ├── create_tags_for_project.md
│ ├── current_staging_servers.md
│ ├── deploy.md
│ ├── development_environment_set_up.md
│ ├── domain_vision_statement.md
│ ├── expanded_mission_statement.md
│ ├── features_and_implementation_map.md
│ ├── how_to_setup_av_dashboard_token_endpoint.md
│ ├── how_to_submit_a_pull_request_on_github.md
│ ├── mission_statement.md
│ ├── osx/
│ │ └── el_capitan_10.11.2_install_notes.md
│ ├── project_coordination_outline.md
│ ├── project_setup.md
│ ├── project_wishlist.md
│ ├── rails_asset_pipeline.md
│ ├── scrum_minutes.md
│ ├── solutions_for_signup_issues.md
│ ├── sponsorship.md
│ ├── sprint_retrospective.md
│ ├── sprint_review.md
│ ├── thoughts_on_integrating_pair_programming_with_bdd_and_tdd.md
│ ├── tmux_setup_for_remote_pair_programming.md
│ └── ubuntu/
│ └── ubuntu_14.04_manual_install_notes.md
├── entrypoint.sh
├── esbuild.config.cjs
├── events_exploration.md
├── experiments/
│ ├── landing_page_options.rb
│ └── metrics/
│ ├── premium_signups.rb
│ └── signups.rb
├── features/
│ ├── advanced_site_search.feature
│ ├── article_vote.feature
│ ├── articles.feature
│ ├── basic_layout.feature
│ ├── custom_errors.feature
│ ├── dashboard/
│ │ ├── dashboard_stats.feature
│ │ └── public_activity.feature
│ ├── devops/
│ │ ├── create_plans.feature
│ │ ├── github_commits.feature
│ │ ├── github_languages.feature
│ │ ├── github_last_updates.feature
│ │ ├── github_readme_files.feature
│ │ ├── github_static_pages.feature
│ │ ├── inspect_emails.feature
│ │ ├── migrate_github_urls.feature
│ │ ├── migrate_plans.feature
│ │ └── support_https_renewal.feature
│ ├── events/
│ │ ├── client_meetings.feature
│ │ ├── create_events.feature
│ │ ├── edit_event.feature
│ │ ├── edit_future_event.feature
│ │ ├── edit_past_event.feature
│ │ ├── event_countdown.feature
│ │ ├── event_countdown_widget.feature
│ │ ├── event_videos.feature
│ │ ├── events_by_project.feature
│ │ ├── list_past_events.feature
│ │ ├── list_repeating_events.feature
│ │ ├── list_single_events.feature
│ │ ├── live_event.feature
│ │ ├── next_scrum.feature
│ │ ├── next_scrum_for_new_user.feature
│ │ ├── past_events_page.feature
│ │ ├── private_events.feature
│ │ ├── rsvping_event.feature
│ │ ├── show_event.feature
│ │ ├── start_event.feature
│ │ └── upcoming_events.feature
│ ├── follow_project.feature
│ ├── hangouts/
│ │ ├── edit_hangout_url.feature
│ │ ├── edit_youtube_url.feature
│ │ └── hangout.feature
│ ├── hire_me_modal.feature
│ ├── information_pages.feature
│ ├── jitsi_meet/
│ │ └── start_jitsi_button.feature
│ ├── navbar_user_info.feature
│ ├── past_events.feature
│ ├── project_documents.feature
│ ├── projects/
│ │ ├── connections.feature
│ │ ├── create_projects.feature
│ │ ├── deactive_owners.feature
│ │ ├── edit_project.feature
│ │ ├── list_projects.feature
│ │ ├── notify_project_creator.feature
│ │ ├── notify_project_joinee.feature
│ │ ├── project_pivotal_stories.feature
│ │ ├── project_show_tabs.feature
│ │ ├── project_videos.feature
│ │ └── show_project.feature
│ ├── remind_complete_profile.feature
│ ├── sidebar.feature
│ ├── step_definitions/
│ │ ├── .gitkeep
│ │ ├── activity_feed_steps.rb
│ │ ├── advanced_site_search.rb
│ │ ├── article_votes_steps.rb
│ │ ├── articles_steps.rb
│ │ ├── av_dashboard_token_steps.rb
│ │ ├── avatar_steps.rb
│ │ ├── basic_steps.rb
│ │ ├── commit_count_steps.rb
│ │ ├── contained_search_steps.rb
│ │ ├── custom_errors_step.rb
│ │ ├── devops_steps.rb
│ │ ├── documents_steps.rb
│ │ ├── email_steps.rb
│ │ ├── event_instances_steps.rb
│ │ ├── event_steps.rb
│ │ ├── features_step.rb
│ │ ├── hangout_steps.rb
│ │ ├── jitsi_steps.rb
│ │ ├── karma_calculator_steps.rb
│ │ ├── layout_steps.rb
│ │ ├── pages_steps.rb
│ │ ├── pivotal_steps.rb
│ │ ├── premium_steps.rb
│ │ ├── profile_karma_link.rb
│ │ ├── projects_steps.rb
│ │ ├── scrums_steps.rb
│ │ ├── sponsors_steps.rb
│ │ ├── static_pages_edit_button_steps.rb
│ │ ├── statistics_steps.rb
│ │ ├── tabs_steps.rb
│ │ ├── title_steps.rb
│ │ ├── user_steps.rb
│ │ └── youtube_steps.rb
│ ├── support/
│ │ ├── capybara.rb
│ │ ├── database_cleaner.rb
│ │ ├── env.rb
│ │ ├── geocoder.rb
│ │ ├── helpers.rb
│ │ ├── hooks.rb
│ │ ├── puffing_billy.rb
│ │ ├── selectors.rb
│ │ ├── suppress_logger.rb
│ │ └── vcr.rb
│ ├── user_status.feature
│ └── users/
│ ├── activities.feature
│ ├── avatar.feature
│ ├── github_commit_count.feature
│ ├── link_github.feature
│ ├── omniauth.feature
│ ├── opt_out_mailings.feature
│ ├── password_reset.feature
│ ├── profile.feature
│ ├── profile_karma.feature
│ ├── profile_karma_link.feature
│ ├── profile_privacy.feature
│ ├── profile_update_credit_card.feature
│ ├── sign_in.feature
│ ├── sign_off.feature
│ ├── sign_out.feature
│ ├── sign_up.feature
│ ├── skills.feature
│ ├── titles.feature
│ ├── user_bio.feature
│ ├── user_list.feature
│ ├── user_management.feature
│ └── user_videos.feature
├── fixtures/
│ ├── .keep
│ ├── articles.yml.new
│ ├── authentications.yml.new
│ ├── documents.yml.new
│ ├── events.yml.new
│ ├── follows.yml.new
│ ├── projects.yml.new
│ ├── taggings.yml.new
│ ├── tags.yml.new
│ ├── users.yml.new
│ └── versions.yml.new
├── lib/
│ ├── agile_ventures/
│ │ └── errors.rb
│ ├── agile_ventures.rb
│ ├── assets/
│ │ └── .keep
│ ├── channels_list.rb
│ ├── core_ext/
│ │ ├── active_record/
│ │ │ └── base_extension.rb
│ │ └── datetime.rb
│ ├── custom_errors.rb
│ ├── paypal.rb
│ ├── tasks/
│ │ ├── .keep
│ │ ├── apply_one-time_google_hangout_event_participation_count.rake
│ │ ├── brakeman.rake
│ │ ├── bundle-audit.rake
│ │ ├── ci.rake
│ │ ├── create_anonymous_user.rake
│ │ ├── create_plans.rake
│ │ ├── cucumber.rake
│ │ ├── db.rake
│ │ ├── db_dump.rake
│ │ ├── dump.rake
│ │ ├── event_participation/
│ │ │ └── event_participation_karma.csv
│ │ ├── fix_karma.rake
│ │ ├── github_content_for_static_pages.rake
│ │ ├── import_pages.rake
│ │ ├── migrate_plans.rake
│ │ ├── regenerate_slugs.rake
│ │ ├── scheduler.rake
│ │ ├── send_welcome_message.rake
│ │ ├── utils.rake
│ │ └── vcr_billy_caches.rake
│ └── validators/
│ ├── image_url_validator.rb
│ ├── pivotal_tracker_url_validator.rb
│ └── uri_validator.rb
├── log/
│ └── .keep
├── package.json
├── public/
│ ├── 403.html
│ ├── 404.html
│ ├── 422.html
│ ├── 500.html
│ ├── analytics.txt
│ └── robots.txt
├── scripts/
│ └── copy_javascript_dependencies.cjs
├── spec/
│ ├── controllers/
│ │ ├── application_controller_spec.rb
│ │ ├── articles_controller_spec.rb
│ │ ├── authentications_controller_spec.rb
│ │ ├── calendar_controller_spec.rb
│ │ ├── concerns/
│ │ │ ├── deactivated_user_finder_spec.rb
│ │ │ └── statistics_spec.rb
│ │ ├── dashboard_controller_spec.rb
│ │ ├── documents_controller_spec.rb
│ │ ├── event_instances_controller_spec.rb
│ │ ├── scrums_controller_spec.rb
│ │ ├── static_pages_controller_spec.rb
│ │ ├── subscriptions_controller_spec.rb
│ │ ├── users_controller_spec.rb
│ │ └── visitors_controller_spec.rb
│ ├── factories/
│ │ ├── articles.rb
│ │ ├── authentications.rb
│ │ ├── commit_count.rb
│ │ ├── documents.rb
│ │ ├── event_instances.rb
│ │ ├── events.rb
│ │ ├── karmas.rb
│ │ ├── papertrail_version.rb
│ │ ├── payment_source.rb
│ │ ├── plans.rb
│ │ ├── projects.rb
│ │ ├── scrums.rb
│ │ ├── source_repositories.rb
│ │ ├── static_page.rb
│ │ ├── statuses.rb
│ │ ├── subscriptions.rb
│ │ └── users.rb
│ ├── features/
│ │ └── project_create_and_approval_spec.rb
│ ├── fixtures/
│ │ ├── cassettes/
│ │ │ ├── GithubLastUpdatesJob/
│ │ │ │ └── _run/
│ │ │ │ └── shf-project_with_hyphen/
│ │ │ │ └── has_correct_last_commit_date_after_job_run.yml
│ │ │ ├── github_commit_count/
│ │ │ │ └── websiteone_stats.yml
│ │ │ ├── github_readme_pitch/
│ │ │ │ └── github_readme_pitch.yml
│ │ │ └── scrums_controller/
│ │ │ └── videos_by_query.yml
│ │ ├── country_codes.txt
│ │ ├── paypal_agreement_response.json
│ │ ├── pivotal_tracker_project_current_iteration.json
│ │ └── pivotal_tracker_project_response.json
│ ├── helpers/
│ │ ├── application_helper_spec.rb
│ │ ├── articles_helper_spec.rb
│ │ ├── devise_helper_spec.rb
│ │ ├── documents_helper_spec.rb
│ │ ├── event_helper_spec.rb
│ │ ├── event_instances_helper_spec.rb
│ │ ├── layout_helper_spec.rb
│ │ ├── projects_helper_spec.rb
│ │ ├── users_helper_spec.rb
│ │ └── visitors_helper_spec.rb
│ ├── javascripts/
│ │ ├── accordion_collapse_spec.js
│ │ ├── affix_navbar_spec.js
│ │ ├── application_spec.js
│ │ ├── documents_spec.js
│ │ ├── event_countdown_spec.js
│ │ ├── event_instances.js
│ │ ├── flash_spec.js
│ │ ├── helpers/
│ │ │ ├── .gitkeep
│ │ │ ├── jasmine-jquery.js
│ │ │ └── spec_helper.js
│ │ ├── support/
│ │ │ ├── jasmine-browser.json
│ │ │ ├── jasmine.yml
│ │ │ └── jasmine_helper.rb
│ │ └── users_spec.js
│ ├── jobs/
│ │ ├── github_commits_job_spec.rb
│ │ ├── github_last_updates_job_spec.rb
│ │ └── github_readme_files_job_spec.rb
│ ├── lib/
│ │ ├── custom_errors_spec.rb
│ │ ├── settings_spec.rb
│ │ └── validators/
│ │ ├── image_url_validator_spec.rb
│ │ ├── pivotal_tracker_url_validator_spec.rb
│ │ └── uri_validator_spec.rb
│ ├── mailers/
│ │ ├── admin_mailer_spec.rb
│ │ ├── mailer_spec.rb
│ │ ├── previews/
│ │ │ ├── admin_mailer_preview.rb
│ │ │ └── project_mailer_preview.rb
│ │ ├── project_mailer_spec.rb
│ │ └── sandbox_email_interceptor_spec.rb
│ ├── migrations/
│ │ └── event_time_refactor_spec.rb
│ ├── models/
│ │ ├── article_spec.rb
│ │ ├── authentication_spec.rb
│ │ ├── commit_count_spec.rb
│ │ ├── contact_form_spec.rb
│ │ ├── document_spec.rb
│ │ ├── event_date_spec.rb
│ │ ├── event_instance_spec.rb
│ │ ├── event_spec.rb
│ │ ├── follow_spec.rb
│ │ ├── hangout_participants_snapshot_spec.rb
│ │ ├── issue_tracker_spec.rb
│ │ ├── karma_spec.rb
│ │ ├── language_project_spec.rb
│ │ ├── null_user_spec.rb
│ │ ├── payment_source_spec.rb
│ │ ├── plan_spec.rb
│ │ ├── project_spec.rb
│ │ ├── source_repository_spec.rb
│ │ ├── static_page_spec.rb
│ │ ├── status_spec.rb
│ │ ├── subscription_spec.rb
│ │ └── user_spec.rb
│ ├── presenters/
│ │ ├── event_instance_presenter_spec.rb
│ │ └── users/
│ │ └── user_presenter_spec.rb
│ ├── rails_helper.rb
│ ├── requests/
│ │ ├── authentications_spec.rb
│ │ ├── documents_spec.rb
│ │ ├── events_spec.rb
│ │ ├── legacy_api_subscriptions_spec.rb
│ │ └── paypal_agreement_spec.rb
│ ├── routing/
│ │ ├── documents_routing_spec.rb
│ │ └── static_pages_routing_spec.rb
│ ├── services/
│ │ ├── add_subscription_to_user_for_plan_spec.rb
│ │ ├── hangout_notification_service_spec.rb
│ │ ├── karma_calculator_spec.rb
│ │ ├── markdown_converter_spec.rb
│ │ └── youtube_notification_service_spec.rb
│ ├── spec_helper.rb
│ └── support/
│ ├── helpers.rb
│ ├── jasmine-browser.json
│ ├── privileged_user_helper.rb
│ └── shared_examples/
│ ├── presentable.rb
│ ├── shared_example_for_disqus.rb
│ ├── shared_example_for_hangout_button.rb
│ └── shared_example_for_user_avatar.rb
├── test/
│ └── fixtures/
│ └── project_mailer/
│ ├── project_creator_notification_html
│ ├── project_creator_notification_text
│ ├── project_joinee_notification_helloworld_html
│ ├── project_joinee_notification_helloworld_text
│ ├── project_joinee_notification_html
│ └── project_joinee_notification_text
└── vendor/
└── assets/
├── javascripts/
│ ├── .keep
│ ├── 404.js
│ ├── bootstrap-tags.js
│ ├── fullcalendar.js
│ ├── lolex.js
│ └── moment-timezone-with-data-2012-2022.js
└── stylesheets/
├── .keep
└── fullcalendar.css
================================================
FILE CONTENTS
================================================
================================================
FILE: .buildpacks
================================================
https://github.com/jayzes/heroku-buildpack-jpegoptim
https://github.com/heroku/heroku-buildpack-ruby
https://github.com/heroku/heroku-buildpack-nodejs
================================================
FILE: .codeclimate.yml
================================================
---
version: "2"
checks:
identical-code:
enabled: false
similar-code:
enabled: false
plugins:
brakeman:
enabled: true
bundler-audit:
enabled: true
coffeelint:
enabled: true
duplication:
enabled: true
config:
languages:
ruby:
count_threshold: 3
eslint:
enabled: true
exclude_patterns:
- "app/assets/javascripts/bootstrap.js"
- "app/assets/javascripts/bootstrap-tags.js"
- "app/assets/javascripts/jquery_ujs.js"
- "app/assets/javascripts/jquery-ui.js"
fixme:
enabled: true
rubocop:
enabled: true
channel: rubocop-1-39-0
exclude_patterns:
- "config/"
- "db/"
- "features/"
- "script/"
- "spec/"
- "vendor/"
- "public/"
- "app/assets/javascripts/bootstrap.js"
- "app/assets/javascripts/bootstrap-tags.js"
- "app/assets/javascripts/jquery_ujs.js"
- "app/assets/javascripts/jquery-ui.js"
================================================
FILE: .coveralls.yml
================================================
repo_token: HRkua0MTRxARFHN0VnQGzrqRskIv3crds
================================================
FILE: .dockerignore
================================================
================================================
FILE: .eslintignore
================================================
**/*{.,-}min.js
================================================
FILE: .eslintrc
================================================
ecmaFeatures:
modules: true
jsx: true
env:
amd: true
browser: true
es6: true
jquery: true
node: true
# http://eslint.org/docs/rules/
rules:
# Possible Errors
comma-dangle: [2, never]
no-cond-assign: 2
no-console: 0
no-constant-condition: 2
no-control-regex: 2
no-debugger: 2
no-dupe-args: 2
no-dupe-keys: 2
no-duplicate-case: 2
no-empty: 2
no-empty-character-class: 2
no-ex-assign: 2
no-extra-boolean-cast: 2
no-extra-parens: 0
no-extra-semi: 2
no-func-assign: 2
no-inner-declarations: [2, functions]
no-invalid-regexp: 2
no-irregular-whitespace: 2
no-negated-in-lhs: 2
no-obj-calls: 2
no-regex-spaces: 2
no-sparse-arrays: 2
no-unexpected-multiline: 2
no-unreachable: 2
use-isnan: 2
valid-jsdoc: 0
valid-typeof: 2
# Best Practices
accessor-pairs: 2
block-scoped-var: 0
complexity: [2, 6]
consistent-return: 0
curly: 0
default-case: 0
dot-location: 0
dot-notation: 0
eqeqeq: 2
guard-for-in: 2
no-alert: 2
no-caller: 2
no-case-declarations: 2
no-div-regex: 2
no-else-return: 0
no-empty-label: 2
no-empty-pattern: 2
no-eq-null: 2
no-eval: 2
no-extend-native: 2
no-extra-bind: 2
no-fallthrough: 2
no-floating-decimal: 0
no-implicit-coercion: 0
no-implied-eval: 2
no-invalid-this: 0
no-iterator: 2
no-labels: 0
no-lone-blocks: 2
no-loop-func: 2
no-magic-number: 0
no-multi-spaces: 0
no-multi-str: 0
no-native-reassign: 2
no-new-func: 2
no-new-wrappers: 2
no-new: 2
no-octal-escape: 2
no-octal: 2
no-proto: 2
no-redeclare: 2
no-return-assign: 2
no-script-url: 2
no-self-compare: 2
no-sequences: 0
no-throw-literal: 0
no-unused-expressions: 2
no-useless-call: 2
no-useless-concat: 2
no-void: 2
no-warning-comments: 0
no-with: 2
radix: 2
vars-on-top: 0
wrap-iife: 2
yoda: 0
# Strict
strict: 0
# Variables
init-declarations: 0
no-catch-shadow: 2
no-delete-var: 2
no-label-var: 2
no-shadow-restricted-names: 2
no-shadow: 0
no-undef-init: 2
no-undef: 0
no-undefined: 0
no-unused-vars: 0
no-use-before-define: 0
# Node.js and CommonJS
callback-return: 2
global-require: 2
handle-callback-err: 2
no-mixed-requires: 0
no-new-require: 0
no-path-concat: 2
no-process-exit: 2
no-restricted-modules: 0
no-sync: 0
# Stylistic Issues
array-bracket-spacing: 0
block-spacing: 0
brace-style: 0
camelcase: 0
comma-spacing: 0
comma-style: 0
computed-property-spacing: 0
consistent-this: 0
eol-last: 0
func-names: 0
func-style: 0
id-length: 0
id-match: 0
indent: 0
jsx-quotes: 0
key-spacing: 0
linebreak-style: 0
lines-around-comment: 0
max-depth: 0
max-len: 0
max-nested-callbacks: 0
max-params: 0
max-statements: [2, 30]
new-cap: 0
new-parens: 0
newline-after-var: 0
no-array-constructor: 0
no-bitwise: 0
no-continue: 0
no-inline-comments: 0
no-lonely-if: 0
no-mixed-spaces-and-tabs: 0
no-multiple-empty-lines: 0
no-negated-condition: 0
no-nested-ternary: 0
no-new-object: 0
no-plusplus: 0
no-restricted-syntax: 0
no-spaced-func: 0
no-ternary: 0
no-trailing-spaces: 0
no-underscore-dangle: 0
no-unneeded-ternary: 0
object-curly-spacing: 0
one-var: 0
operator-assignment: 0
operator-linebreak: 0
padded-blocks: 0
quote-props: 0
quotes: 0
require-jsdoc: 0
semi-spacing: 0
semi: 0
sort-vars: 0
space-after-keywords: 0
space-before-blocks: 0
space-before-function-paren: 0
space-before-keywords: 0
space-in-parens: 0
space-infix-ops: 0
space-return-throw-case: 0
space-unary-ops: 0
spaced-comment: 0
wrap-regex: 0
# ECMAScript 6
arrow-body-style: 0
arrow-parens: 0
arrow-spacing: 0
constructor-super: 0
generator-star-spacing: 0
no-arrow-condition: 0
no-class-assign: 0
no-const-assign: 0
no-dupe-class-members: 0
no-this-before-super: 0
no-var: 0
object-shorthand: 0
prefer-arrow-callback: 0
prefer-const: 0
prefer-reflect: 0
prefer-spread: 0
prefer-template: 0
require-yield: 0
================================================
FILE: .gitignore
================================================
# See https://help.github.com/articles/ignoring-files for more about ignoring files.
#
# If you find yourself ignoring temporary files generated by your text editor
# or operating system, you probably want to add a global ignore instead:
# git config --global core.excludesfile '~/.gitignore_global'
# Ignore bundler config.
/.bundle
/vendor/bundle
# Ignore coverage results
/coverage
# Ignore the default SQLite database.
/db/*.sqlite3
/db/*.sqlite3-journal
# Ignore all logfiles and tempfiles.
/log/*.log
/tmp
# scm revert files
**.orig
# Mac finder artifacts
.DS_Store
# Netbeans project directory
/nbproject/
# RubyMine project files
.idea
/.idea/*
# Textmate project files
/*.tmproj
# vim artifacts
**.swp
# Ignore application configuration
#/config/application.yml
.env
.env_develop_server
# Ignore Railroady docs
doc/**/*
# Versioning
.rvmrc.env
.rvmrc
# .ruby-version
# .ruby-gemset
# Ignore Precompiled Assets
public/assets/**
# Plugin files
.floo
.flooignore
# Zeus config
zeus.json
.pryrc
features/support/fixtures/req_cache/
config/secrets.yml
config/settings.local.yml
config/settings/*.local.yml
config/environments/*.local.yml
#
# Guard config
Guardfile
.vagrant/
tags
.byebug_history
node_modules/*
vendor/assets/javascripts/moment.min.js
# vendor/assets/javascripts/moment-timezone-with-data-2012-2022.js
vendor/assets/javascripts/bootstrap-datepicker.js
vendor/assets/javascripts/bootstrap-timepicker.min.js
vendor/assets/javascripts/typeahead.jquery.js
vendor/assets/javascripts/nprogress.js
latest.dump
certbot.log
# Ignore vscode config
.vscode/**/*
# db/schema.rb
rerun.txt
# Ignore VCR
features/support/fixtures/cassettes/**
/config/master.key
/app/assets/builds/*
!/app/assets/builds/.keep
================================================
FILE: .rspec
================================================
--require rails_helper
--format documentation
--color
--order rand
================================================
FILE: .rubocop.yml
================================================
inherit_from: .rubocop_todo.yml
AllCops:
Exclude:
- 'bin/*'
- 'db/schema.rb'
- 'node_modules/**/*'
- 'server/**/*'
- 'vendor/**/*'
TargetRubyVersion: 3.0.5
NewCops: enable
require: rubocop-rails
Gemspec/DeprecatedAttributeAssignment:
Enabled: true
Layout/SpaceBeforeBrackets: # (new in 1.7)
Enabled: true
Lint/AmbiguousAssignment: # (new in 1.7)
Enabled: true
Lint/DeprecatedConstants: # (new in 1.8)
Enabled: true
Lint/DuplicateBranch: # (new in 1.3)
Enabled: true
Lint/DuplicateRegexpCharacterClassElement: # (new in 1.1)
Enabled: true
Lint/EmptyBlock: # (new in 1.1)
Enabled: true
Lint/EmptyClass: # (new in 1.3)
Enabled: true
Lint/LambdaWithoutLiteralBlock: # (new in 1.8)
Enabled: true
Lint/NoReturnInBeginEndBlocks: # (new in 1.2)
Enabled: true
Lint/NumberedParameterAssignment: # (new in 1.9)
Enabled: true
Lint/OrAssignmentToConstant: # (new in 1.9)
Enabled: true
Lint/RedundantDirGlobSort: # (new in 1.8)
Enabled: true
Lint/SymbolConversion: # (new in 1.9)
Enabled: true
Lint/ToEnumArguments: # (new in 1.1)
Enabled: true
Lint/TripleQuotes: # (new in 1.9)
Enabled: true
Lint/UnexpectedBlockArity: # (new in 1.5)
Enabled: true
Lint/UnmodifiedReduceAccumulator: # (new in 1.1)
Enabled: true
Style/ArgumentsForwarding: # (new in 1.1)
Enabled: true
Style/CollectionCompact: # (new in 1.2)
Enabled: true
Style/DocumentDynamicEvalDefinition: # (new in 1.1)
Enabled: true
Style/EndlessMethod: # (new in 1.8)
Enabled: true
Style/HashConversion: # (new in 1.10)
Enabled: true
Style/HashExcept: # (new in 1.7)
Enabled: true
Style/IfWithBooleanLiteralBranches: # (new in 1.9)
Enabled: true
Style/NegatedIfElseCondition: # (new in 1.2)
Enabled: true
Style/NilLambda: # (new in 1.3)
Enabled: true
Style/RedundantArgument: # (new in 1.4)
Enabled: true
Style/StringChars: # (new in 1.12)
Enabled: true
Style/SwapValues: # (new in 1.1)
Enabled: true
Layout/DefEndAlignment:
AutoCorrect: true
Layout/EndAlignment:
AutoCorrect: true
EnforcedStyleAlignWith: keyword
Layout/IndentationConsistency:
EnforcedStyle: normal
Lint/AssignmentInCondition:
Enabled: false
Lint/Debugger:
Enabled: true
Naming/FileName:
Description: Use snake_case for source file names.
StyleGuide: https://github.com/bbatsov/ruby-style-guide#snake-case-files
Enabled: false
Style/Alias:
EnforcedStyle: prefer_alias_method
Style/AsciiComments:
Enabled: false
Style/AutoResourceCleanup:
Enabled: true
Style/ClassAndModuleChildren:
Enabled: false
Style/CollectionMethods:
Description: Preferred collection methods.
StyleGuide: https://github.com/bbatsov/ruby-style-guide#map-find-select-reduce-size
Enabled: true
PreferredMethods:
collect: map
collect!: map!
find: detect
find_all: select
reduce: inject
Style/Documentation:
Enabled: false
Style/PercentLiteralDelimiters:
PreferredDelimiters:
'%i': '()'
'%I': '()'
'%r': '{}'
'%w': '()'
'%W': '()'
Style/StringLiterals:
EnforcedStyle: single_quotes
================================================
FILE: .rubocop_todo.yml
================================================
# This configuration was generated by
# `rubocop --auto-gen-config --auto-gen-only-exclude --exclude-limit 10000`
# on 2023-03-08 12:54:14 UTC using RuboCop version 1.46.0.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again.
# Offense count: 6
# Configuration parameters: AllowedMethods, AllowedPatterns.
Lint/AmbiguousBlockAssociation:
Exclude:
- 'features/step_definitions/event_steps.rb'
- 'spec/migrations/event_time_refactor_spec.rb'
# Offense count: 2
# Configuration parameters: AllowedMethods.
# AllowedMethods: enums
Lint/ConstantDefinitionInBlock:
Exclude:
- 'spec/controllers/concerns/deactivated_user_finder_spec.rb'
- 'spec/controllers/concerns/statistics_spec.rb'
# Offense count: 2
# Configuration parameters: DebuggerMethods.
Lint/Debugger:
Exclude:
- 'features/step_definitions/basic_steps.rb'
# Offense count: 4
# Configuration parameters: IgnoreLiteralBranches, IgnoreConstantBranches.
Lint/DuplicateBranch:
Exclude:
- 'app/controllers/subscriptions_controller.rb'
- 'features/step_definitions/basic_steps.rb'
- 'features/step_definitions/event_steps.rb'
- 'lib/custom_errors.rb'
# Offense count: 2
# Configuration parameters: AllowComments, AllowEmptyLambdas.
Lint/EmptyBlock:
Exclude:
- 'lib/tasks/cucumber.rake'
- 'spec/factories/payment_source.rb'
# Offense count: 1
Lint/MissingSuper:
Exclude:
- 'lib/agile_ventures/errors.rb'
# Offense count: 2
Lint/RescueException:
Exclude:
- 'app/controllers/projects_controller.rb'
- 'app/helpers/articles_helper.rb'
# Offense count: 1
# Configuration parameters: IgnoreImplicitReferences.
Lint/ShadowedArgument:
Exclude:
- 'features/step_definitions/jitsi_steps.rb'
# Offense count: 3
Lint/ShadowingOuterLocalVariable:
Exclude:
- 'app/controllers/concerns/statistics.rb'
- 'app/controllers/dashboard_controller.rb'
- 'db/seeds.rb'
# Offense count: 2
# Configuration parameters: AllowComments, AllowNil.
Lint/SuppressedException:
Exclude:
- 'config/application.rb'
- 'lib/validators/uri_validator.rb'
# Offense count: 1
# Configuration parameters: AllowKeywordBlockArguments.
Lint/UnderscorePrefixedVariableName:
Exclude:
- 'app/models/event.rb'
# Offense count: 14
Lint/UselessAssignment:
Exclude:
- 'app/controllers/concerns/statistics.rb'
- 'app/controllers/dashboard_controller.rb'
- 'app/jobs/github_commits_job.rb'
- 'app/models/event.rb'
- 'features/step_definitions/user_steps.rb'
- 'spec/models/event_spec.rb'
- 'spec/models/language_project_spec.rb'
- 'spec/models/user_spec.rb'
- 'spec/support/privileged_user_helper.rb'
- 'spec/support/shared_examples/shared_example_for_disqus.rb'
# Offense count: 33
# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes, Max.
Metrics/AbcSize:
Exclude:
- 'app/controllers/articles_controller.rb'
- 'app/controllers/authentications_controller.rb'
- 'app/controllers/calendar_controller.rb'
- 'app/controllers/concerns/statistics.rb'
- 'app/controllers/dashboard_controller.rb'
- 'app/controllers/documents_controller.rb'
- 'app/controllers/event_instances_controller.rb'
- 'app/controllers/events_controller.rb'
- 'app/controllers/paypal_agreement_controller.rb'
- 'app/controllers/projects_controller.rb'
- 'app/controllers/registrations_controller.rb'
- 'app/controllers/subscriptions_controller.rb'
- 'app/controllers/users_controller.rb'
- 'app/helpers/application_helper.rb'
- 'app/helpers/disqus_helper.rb'
- 'app/helpers/documents_helper.rb'
- 'app/helpers/visitors_helper.rb'
- 'app/jobs/github_commits_job.rb'
- 'app/models/event.rb'
- 'db/migrate/20140725131327_event_combine_date_and_time_fields.rb'
- 'db/migrate/20230314192607_create_active_storage_tables.active_storage.rb'
- 'db/migrate/20180828145628_vanity_migration.rb'
- 'features/step_definitions/basic_steps.rb'
- 'features/step_definitions/email_steps.rb'
# Offense count: 91
# Configuration parameters: CountComments, Max, CountAsOne, AllowedMethods, AllowedPatterns.
# AllowedMethods: refine
Metrics/BlockLength:
Exclude:
- 'config/environments/development.rb'
- 'config/environments/production.rb'
- 'config/routes.rb'
- 'db/migrate/20180828145628_vanity_migration.rb'
- 'features/support/puffing_billy.rb'
- 'lib/tasks/cucumber.rake'
- 'spec/controllers/application_controller_spec.rb'
- 'spec/controllers/articles_controller_spec.rb'
- 'spec/controllers/authentications_controller_spec.rb'
- 'spec/controllers/concerns/statistics_spec.rb'
- 'spec/controllers/documents_controller_spec.rb'
- 'spec/controllers/event_instances_controller_spec.rb'
- 'spec/controllers/static_pages_controller_spec.rb'
- 'spec/controllers/users_controller_spec.rb'
- 'spec/factories/event_instances.rb'
- 'spec/features/project_create_and_approval_spec.rb'
- 'spec/helpers/application_helper_spec.rb'
- 'spec/helpers/articles_helper_spec.rb'
- 'spec/helpers/devise_helper_spec.rb'
- 'spec/helpers/event_helper_spec.rb'
- 'spec/helpers/layout_helper_spec.rb'
- 'spec/jobs/github_commits_job_spec.rb'
- 'spec/jobs/github_readme_files_job_spec.rb'
- 'spec/lib/custom_errors_spec.rb'
- 'spec/lib/validators/image_url_validator_spec.rb'
- 'spec/mailers/mailer_spec.rb'
- 'spec/mailers/project_mailer_spec.rb'
- 'spec/migrations/event_time_refactor_spec.rb'
- 'spec/models/article_spec.rb'
- 'spec/models/document_spec.rb'
- 'spec/models/event_instance_spec.rb'
- 'spec/models/event_spec.rb'
- 'spec/models/project_spec.rb'
- 'spec/models/static_page_spec.rb'
- 'spec/models/user_spec.rb'
- 'spec/presenters/event_instance_presenter_spec.rb'
- 'spec/presenters/users/user_presenter_spec.rb'
- 'spec/rails_helper.rb'
- 'spec/requests/authentications_spec.rb'
- 'spec/services/add_subscription_to_user_for_plan_spec.rb'
- 'spec/services/hangout_notification_service_spec.rb'
- 'spec/services/karma_calculator_spec.rb'
- 'spec/services/youtube_notification_service_spec.rb'
- 'spec/support/shared_examples/shared_example_for_hangout_button.rb'
# Offense count: 5
# Configuration parameters: CountComments, Max, CountAsOne.
Metrics/ClassLength:
Exclude:
- 'app/controllers/events_controller.rb'
- 'app/controllers/projects_controller.rb'
- 'app/controllers/subscriptions_controller.rb'
- 'app/models/event.rb'
- 'app/models/user.rb'
# Offense count: 5
# Configuration parameters: AllowedMethods, AllowedPatterns, Max.
Metrics/CyclomaticComplexity:
Exclude:
- 'app/controllers/authentications_controller.rb'
- 'app/models/event.rb'
- 'features/step_definitions/basic_steps.rb'
- 'features/step_definitions/contained_search_steps.rb'
- 'features/support/selectors.rb'
# Offense count: 45
# Configuration parameters: CountComments, Max, CountAsOne, AllowedMethods, AllowedPatterns.
Metrics/MethodLength:
Exclude:
- 'app/controllers/articles_controller.rb'
- 'app/controllers/authentications_controller.rb'
- 'app/controllers/calendar_controller.rb'
- 'app/controllers/concerns/statistics.rb'
- 'app/controllers/documents_controller.rb'
- 'app/controllers/event_instances_controller.rb'
- 'app/controllers/events_controller.rb'
- 'app/controllers/projects_controller.rb'
- 'app/controllers/registrations_controller.rb'
- 'app/controllers/subscriptions_controller.rb'
- 'app/controllers/users_controller.rb'
- 'app/helpers/application_helper.rb'
- 'app/helpers/articles_helper.rb'
- 'app/helpers/devise_helper.rb'
- 'app/helpers/disqus_helper.rb'
- 'app/helpers/visitors_helper.rb'
- 'app/jobs/github_commits_job.rb'
- 'app/models/event.rb'
- 'app/services/paypal_service.rb'
- 'db/migrate/20140109040839_devise_create_users.rb'
- 'db/migrate/20140215192014_acts_as_taggable_on_migration.rb'
- 'db/migrate/20140225215805_create_events.rb'
- 'db/migrate/20140417124942_acts_as_votable_migration.rb'
- 'db/migrate/20140725131327_event_combine_date_and_time_fields.rb'
- 'db/migrate/20140914202645_create_activities.rb'
- 'db/migrate/20161103011445_create_friendly_id_slugs.rb'
- 'db/migrate/20180828145628_vanity_migration.rb'
- 'db/migrate/20230314192607_create_active_storage_tables.active_storage.rb'
- 'features/step_definitions/basic_steps.rb'
- 'features/step_definitions/contained_search_steps.rb'
- 'features/step_definitions/user_steps.rb'
- 'features/support/helpers.rb'
- 'features/support/selectors.rb'
- 'lib/custom_errors.rb'
- 'lib/validators/pivotal_tracker_url_validator.rb'
# Offense count: 1
# Configuration parameters: CountComments, Max, CountAsOne.
Metrics/ModuleLength:
Exclude:
- 'app/helpers/application_helper.rb'
# Offense count: 3
# Configuration parameters: Max, CountKeywordArgs, MaxOptionalParameters.
Metrics/ParameterLists:
Exclude:
- 'app/services/add_subscription_to_user_for_plan.rb'
- 'features/step_definitions/email_steps.rb'
- 'lib/paypal.rb'
# Offense count: 2
# Configuration parameters: AllowedMethods, AllowedPatterns, Max.
Metrics/PerceivedComplexity:
Exclude:
- 'app/controllers/authentications_controller.rb'
# Offense count: 11
Naming/AccessorMethodName:
Exclude:
- 'app/controllers/application_controller.rb'
- 'app/controllers/dashboard_controller.rb'
- 'app/controllers/documents_controller.rb'
- 'app/controllers/projects_controller.rb'
- 'app/controllers/users_controller.rb'
- 'app/controllers/visitors_controller.rb'
- 'db/seeds.rb'
- 'spec/support/helpers.rb'
- 'spec/support/privileged_user_helper.rb'
# Offense count: 4
# Configuration parameters: EnforcedStyleForLeadingUnderscores.
# SupportedStylesForLeadingUnderscores: disallowed, required, optional
Naming/MemoizedInstanceVariableName:
Exclude:
- 'app/controllers/projects_controller.rb'
- 'features/support/helpers.rb'
- 'lib/core_ext/active_record/base_extension.rb'
# Offense count: 5
# Configuration parameters: MinNameLength, AllowNamesEndingInNumbers, AllowedNames, ForbiddenNames.
# AllowedNames: as, at, by, cc, db, id, if, in, io, ip, of, on, os, pp, to
Naming/MethodParameterName:
Exclude:
- 'app/helpers/application_helper.rb'
- 'db/migrate/20140725131327_event_combine_date_and_time_fields.rb'
# Offense count: 13
# Configuration parameters: NamePrefix, ForbiddenPrefixes, AllowedMethods, MethodDefinitionMacros.
# NamePrefix: is_, has_, have_
# ForbiddenPrefixes: is_, has_, have_
# AllowedMethods: is_a?
# MethodDefinitionMacros: define_method, define_singleton_method
Naming/PredicateName:
Exclude:
- 'app/controllers/subscriptions_controller.rb'
- 'app/helpers/application_helper.rb'
- 'app/models/user.rb'
- 'app/presenters/users/user_presenter.rb'
- 'features/support/helpers.rb'
- 'lib/validators/image_url_validator.rb'
- 'lib/validators/pivotal_tracker_url_validator.rb'
# Offense count: 12
# Configuration parameters: EnforcedStyle, CheckMethodNames, CheckSymbols, AllowedIdentifiers, AllowedPatterns.
# SupportedStyles: snake_case, normalcase, non_integer
# AllowedIdentifiers: capture3, iso8601, rfc1123_date, rfc822, rfc2822, rfc3339, x86_64
Naming/VariableNumber:
Exclude:
- 'features/step_definitions/youtube_steps.rb'
- 'spec/controllers/documents_controller_spec.rb'
- 'spec/lib/custom_errors_spec.rb'
- 'spec/models/user_spec.rb'
# Offense count: 5
# This cop supports unsafe autocorrection (--autocorrect-all).
Rails/ActionControllerFlashBeforeRender:
Exclude:
- 'app/controllers/articles_controller.rb'
- 'app/controllers/event_instances_controller.rb'
- 'app/controllers/projects_controller.rb'
# Offense count: 2
# This cop supports unsafe autocorrection (--autocorrect-all).
Rails/ApplicationController:
Exclude:
- 'spec/controllers/concerns/deactivated_user_finder_spec.rb'
- 'spec/controllers/concerns/statistics_spec.rb'
# Offense count: 1
# This cop supports unsafe autocorrection (--autocorrect-all).
Rails/ApplicationMailer:
Exclude:
- 'app/mailers/mailer.rb'
# Offense count: 7
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: NilOrEmpty, NotPresent, UnlessPresent.
Rails/Blank:
Exclude:
- 'app/controllers/users_controller.rb'
- 'app/helpers/application_helper.rb'
- 'app/models/user.rb'
- 'app/presenters/event_instance_presenter.rb'
- 'features/step_definitions/premium_steps.rb'
- 'lib/validators/image_url_validator.rb'
# Offense count: 11
# Configuration parameters: Database, Include.
# SupportedDatabases: mysql, postgresql
# Include: db/migrate/*.rb
Rails/BulkChangeTable:
Exclude:
- 'db/migrate/20140120014041_add_first_last_names_to_users.rb'
- 'db/migrate/20140220091703_add_latitude_and_longitude_to_user.rb'
- 'db/migrate/20140220131347_add_country_region_city_to_user.rb'
- 'db/migrate/20140707211758_add_category_to_hangout.rb'
- 'db/migrate/20140725131327_event_combine_date_and_time_fields.rb'
- 'db/migrate/20140730123120_add_project_and_host_to_hangout.rb'
- 'db/migrate/20180810180605_add_karma_breakdown_elements_to_karma_table.rb'
- 'db/migrate/20221215192333_change_exclusions_in_events.rb'
- 'db/migrate/20221215193425_change_participants_in_event_instances.rb'
# Offense count: 9
# Configuration parameters: Include.
# Include: db/migrate/*.rb
Rails/CreateTableWithTimestamps:
Exclude:
- 'db/migrate/20140215192014_acts_as_taggable_on_migration.rb'
- 'db/migrate/20140618153610_create_commit_counts.rb'
- 'db/migrate/20160923135850_add_subscriptions.rb'
- 'db/migrate/20160923145243_add_payment_sources.rb'
- 'db/migrate/20160928152822_add_hangout_participants_snapshots.rb'
- 'db/migrate/20180813125658_create_languages.rb'
- 'db/migrate/20180828145628_vanity_migration.rb'
- 'db/migrate/20181220155404_create_slack_channel.rb'
- 'db/migrate/20230314192607_create_active_storage_tables.active_storage.rb'
# Offense count: 5
# Configuration parameters: EnforcedStyle, AllowToTime.
# SupportedStyles: strict, flexible
Rails/Date:
Exclude:
- 'app/models/event_date.rb'
- 'db/seeds/events.rb'
- 'spec/models/event_date_spec.rb'
# Offense count: 85
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: Whitelist, AllowedMethods, AllowedReceivers.
# Whitelist: find_by_sql, find_by_token_for
# AllowedMethods: find_by_sql, find_by_token_for
# AllowedReceivers: Gem::Specification, page
Rails/DynamicFindBy:
Exclude:
- 'app/controllers/authentications_controller.rb'
- 'app/controllers/documents_controller.rb'
- 'app/helpers/application_helper.rb'
- 'app/jobs/github_commits_job.rb'
- 'app/jobs/github_static_pages_job.rb'
- 'app/models/static_page.rb'
- 'db/migrate/20140716134701_import_getting_started_static_page.rb'
- 'db/seeds.rb'
- 'features/step_definitions/article_votes_steps.rb'
- 'features/step_definitions/articles_steps.rb'
- 'features/step_definitions/avatar_steps.rb'
- 'features/step_definitions/basic_steps.rb'
- 'features/step_definitions/devops_steps.rb'
- 'features/step_definitions/documents_steps.rb'
- 'features/step_definitions/event_steps.rb'
- 'features/step_definitions/hangout_steps.rb'
- 'features/step_definitions/pages_steps.rb'
- 'features/step_definitions/projects_steps.rb'
- 'features/step_definitions/scrums_steps.rb'
- 'features/step_definitions/sponsors_steps.rb'
- 'features/step_definitions/user_steps.rb'
- 'features/step_definitions/youtube_steps.rb'
- 'features/support/helpers.rb'
- 'lib/tasks/import_pages.rake'
- 'spec/controllers/documents_controller_spec.rb'
- 'spec/controllers/event_instances_controller_spec.rb'
- 'spec/models/user_spec.rb'
# Offense count: 1
# Configuration parameters: Include.
# Include: app/**/*.rb, config/**/*.rb, lib/**/*.rb
Rails/Exit:
Exclude:
- 'config/zeus/custom_plan.rb'
# Offense count: 17
# Configuration parameters: EnforcedStyle.
# SupportedStyles: slashes, arguments
Rails/FilePath:
Exclude:
- 'app/controllers/application_controller.rb'
- 'config/application.rb'
- 'config/environments/development.rb'
- 'config/initializers/reload_api.rb'
- 'config/initializers/vcr.rb'
- 'config/initializers/website_one.rb'
- 'db/migrate/20140716134701_import_getting_started_static_page.rb'
- 'db/seeds.rb'
- 'lib/tasks/cucumber.rake'
- 'lib/tasks/db_dump.rake'
- 'lib/tasks/import_pages.rake'
- 'spec/rails_helper.rb'
- 'spec/support/helpers.rb'
# Offense count: 6
# Configuration parameters: Include.
# Include: app/models/**/*.rb
Rails/HasAndBelongsToMany:
Exclude:
- 'app/models/event.rb'
- 'app/models/language.rb'
- 'app/models/project.rb'
- 'app/models/slack_channel.rb'
# Offense count: 16
# Configuration parameters: Include.
# Include: app/models/**/*.rb
Rails/HasManyOrHasOneDependent:
Exclude:
- 'app/models/event.rb'
- 'app/models/event_instance.rb'
- 'app/models/project.rb'
- 'app/models/subscription.rb'
- 'app/models/user.rb'
# Offense count: 18
# Configuration parameters: Include.
# Include: app/helpers/**/*.rb
Rails/HelperInstanceVariable:
Exclude:
- 'app/helpers/documents_helper.rb'
- 'app/helpers/event_helper.rb'
- 'app/helpers/layout_helper.rb'
- 'app/helpers/projects_helper.rb'
- 'app/helpers/static_pages_helper.rb'
- 'app/helpers/subscriptions_helper.rb'
# Offense count: 40
Rails/I18nLocaleTexts:
Exclude:
- 'app/controllers/application_controller.rb'
- 'app/controllers/articles_controller.rb'
- 'app/controllers/authentications_controller.rb'
- 'app/controllers/documents_controller.rb'
- 'app/controllers/event_instances_controller.rb'
- 'app/controllers/events_controller.rb'
- 'app/controllers/projects_controller.rb'
- 'app/controllers/registrations_controller.rb'
- 'app/controllers/subscriptions_controller.rb'
- 'app/controllers/users_controller.rb'
- 'app/mailers/mailer.rb'
- 'lib/mercury/authentication.rb'
- 'spec/helpers/layout_helper_spec.rb'
# Offense count: 2
# Configuration parameters: IgnoreScopes, Include.
# Include: app/models/**/*.rb
Rails/InverseOf:
Exclude:
- 'app/models/subscription.rb'
# Offense count: 2
# Configuration parameters: Include.
# Include: app/controllers/**/*.rb, app/mailers/**/*.rb
Rails/LexicallyScopedActionFilter:
Exclude:
- 'app/controllers/documents_controller.rb'
- 'app/controllers/events_controller.rb'
# Offense count: 1
# This cop supports unsafe autocorrection (--autocorrect-all).
Rails/NegateInclude:
Exclude:
- 'lib/validators/uri_validator.rb'
# Offense count: 8
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: Include.
# Include: app/**/*.rb, config/**/*.rb, db/**/*.rb, lib/**/*.rb
Rails/Output:
Exclude:
- 'db/migrate/20140716134701_import_getting_started_static_page.rb'
- 'db/seeds.rb'
# Offense count: 12
Rails/OutputSafety:
Exclude:
- 'app/controllers/projects_controller.rb'
- 'app/helpers/application_helper.rb'
- 'app/helpers/articles_helper.rb'
- 'app/helpers/devise_helper.rb'
- 'app/helpers/disqus_helper.rb'
- 'app/helpers/scrums_helper.rb'
- 'app/helpers/visitors_helper.rb'
- 'app/presenters/event_instance_presenter.rb'
- 'app/services/markdown_converter.rb'
# Offense count: 7
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: Include.
# Include: **/Rakefile, **/*.rake
Rails/RakeEnvironment:
Exclude:
- 'lib/tasks/brakeman.rake'
- 'lib/tasks/bundle-audit.rake'
- 'lib/tasks/cucumber.rake'
# Offense count: 4
# This cop supports unsafe autocorrection (--autocorrect-all).
Rails/RedundantPresenceValidationOnBelongsTo:
Exclude:
- 'app/models/article.rb'
- 'app/models/commit_count.rb'
- 'app/models/document.rb'
- 'app/models/status.rb'
# Offense count: 12
# Configuration parameters: Include.
# Include: db/**/*.rb
Rails/ReversibleMigration:
Exclude:
- 'db/migrate/20140404100037_remove_pivotaltracker_id_from_projects.rb'
- 'db/migrate/20140913183322_change_column.rb'
- 'db/migrate/20180515093331_remove_newsletter.rb'
- 'db/migrate/20210702172212_drop_vanity_tables.rb'
- 'db/migrate/20221215192333_change_exclusions_in_events.rb'
- 'db/migrate/20221215193425_change_participants_in_event_instances.rb'
# Offense count: 3
# This cop supports unsafe autocorrection (--autocorrect-all).
Rails/RootPathnameMethods:
Exclude:
- 'config/initializers/website_one.rb'
- 'db/seeds.rb'
# Offense count: 5
# Configuration parameters: ForbiddenMethods, AllowedMethods.
# ForbiddenMethods: decrement!, decrement_counter, increment!, increment_counter, insert, insert!, insert_all, insert_all!, toggle!, touch, touch_all, update_all, update_attribute, update_column, update_columns, update_counters, upsert, upsert_all
Rails/SkipsModelValidations:
Exclude:
- 'app/models/follow.rb'
- 'db/migrate/20150520184236_add_hoa_status_to_event_instances.rb'
- 'spec/helpers/documents_helper_spec.rb'
- 'spec/models/event_spec.rb'
# Offense count: 30
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: EnforcedStyle.
# SupportedStyles: strict, flexible
Rails/TimeZone:
Exclude:
- 'app/controllers/articles_controller.rb'
- 'app/controllers/event_instances_controller.rb'
- 'app/controllers/events_controller.rb'
- 'app/controllers/subscriptions_controller.rb'
- 'app/helpers/visitors_helper.rb'
- 'app/models/event.rb'
- 'app/models/null_user.rb'
- 'features/step_definitions/basic_steps.rb'
- 'features/step_definitions/devops_steps.rb'
- 'features/step_definitions/event_steps.rb'
- 'features/step_definitions/hangout_steps.rb'
- 'features/step_definitions/user_steps.rb'
- 'features/step_definitions/youtube_steps.rb'
- 'spec/controllers/calendar_controller_spec.rb'
- 'spec/controllers/concerns/statistics_spec.rb'
- 'spec/controllers/event_instances_controller_spec.rb'
- 'spec/factories/event_instances.rb'
- 'spec/factories/subscriptions.rb'
# Offense count: 3
# Configuration parameters: Include.
# Include: app/models/**/*.rb
Rails/UniqueValidationWithoutIndex:
Exclude:
- 'app/models/authentication.rb'
- 'app/models/commit_count.rb'
- 'app/models/language.rb'
# Offense count: 1
# This cop supports unsafe autocorrection (--autocorrect-all).
Rails/WhereEquals:
Exclude:
- 'app/helpers/documents_helper.rb'
# Offense count: 2
Security/Eval:
Exclude:
- 'features/step_definitions/basic_steps.rb'
- 'features/step_definitions/event_steps.rb'
# Offense count: 2
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: AllowOnConstant, AllowOnSelfClass.
Style/CaseEquality:
Exclude:
- 'app/controllers/subscriptions_controller.rb'
- 'app/services/paypal_service.rb'
# Offense count: 1
# This cop supports safe autocorrection (--autocorrect).
Style/ComparableClamp:
Exclude:
- 'app/models/user.rb'
# Offense count: 2
Style/DocumentDynamicEvalDefinition:
Exclude:
- 'features/step_definitions/basic_steps.rb'
- 'features/step_definitions/event_steps.rb'
# Offense count: 2
# This cop supports safe autocorrection (--autocorrect).
Style/EvalWithLocation:
Exclude:
- 'features/step_definitions/basic_steps.rb'
- 'features/step_definitions/event_steps.rb'
# Offense count: 12
# Configuration parameters: AllowedVariables.
Style/GlobalVars:
Exclude:
- 'features/step_definitions/devops_steps.rb'
- 'features/support/hooks.rb'
# Offense count: 1
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: InverseMethods, InverseBlocks.
Style/InverseMethods:
Exclude:
- 'lib/validators/uri_validator.rb'
# Offense count: 2
Style/MissingRespondToMissing:
Exclude:
- 'app/helpers/features.rb'
- 'app/presenters/base_presenter.rb'
# Offense count: 4
Style/MixinUsage:
Exclude:
- 'app/services/hangout_notification_service.rb'
- 'app/services/youtube_notification_service.rb'
- 'spec/factories/users.rb'
- 'spec/support/shared_examples/shared_example_for_hangout_button.rb'
# Offense count: 3
Style/MultilineBlockChain:
Exclude:
- 'app/models/event.rb'
- 'lib/tasks/import_pages.rake'
# Offense count: 1
Style/OpenStructUse:
Exclude:
- 'spec/requests/paypal_agreement_spec.rb'
# Offense count: 349
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: Max, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns.
# URISchemes: http, https
Layout/LineLength:
Exclude:
- 'Guardfile'
- 'app/controllers/events_controller.rb'
- 'app/controllers/projects_controller.rb'
- 'app/controllers/subscriptions_controller.rb'
- 'app/helpers/application_helper.rb'
- 'app/helpers/articles_helper.rb'
- 'app/helpers/documents_helper.rb'
- 'app/helpers/event_helper.rb'
- 'app/jobs/github_commits_job.rb'
- 'app/models/event.rb'
- 'app/services/karma_calculator.rb'
- 'config/initializers/devise.rb'
- 'config/initializers/exception_notification.rb'
- 'db/seeds.rb'
- 'db/seeds/event_instances.rb'
- 'db/seeds/events.rb'
- 'features/step_definitions/basic_steps.rb'
- 'features/step_definitions/devops_steps.rb'
- 'features/step_definitions/email_steps.rb'
- 'features/step_definitions/event_steps.rb'
- 'features/step_definitions/hangout_steps.rb'
- 'features/step_definitions/projects_steps.rb'
- 'features/step_definitions/user_steps.rb'
- 'features/step_definitions/youtube_steps.rb'
- 'lib/paypal.rb'
- 'lib/tasks/import_pages.rake'
- 'spec/controllers/users_controller_spec.rb'
- 'spec/helpers/articles_helper_spec.rb'
- 'spec/migrations/event_time_refactor_spec.rb'
- 'spec/models/event_spec.rb'
- 'spec/requests/authentications_spec.rb'
- 'spec/requests/legacy_api_subscriptions_spec.rb'
- 'spec/services/hangout_notification_service_spec.rb'
- 'spec/services/youtube_notification_service_spec.rb'
================================================
FILE: .ruby-gemset
================================================
wso
================================================
FILE: .ruby-version
================================================
3.2.1
================================================
FILE: .semaphore/semaphore.yml
================================================
version: v1.0
name: WebsiteOne - CI
agent:
machine:
type: e1-standard-2
os_image: ubuntu2004
blocks:
- name: Test
task:
env_vars:
- name: RAILS_ENV
value: test
- name: CC_TEST_REPORTER_ID
value: c70a143fe21eb298eb2a98131dfc592947ea7ebfb87fbff9d9f69e724721d636
- name: STRIPE_SECRET_KEY
value: sk_test_4O7CTmoS1jwlDAX3z1abLYWm
- name: STRIPE_PUBLISHABLE_KEY
value: pk_test_4O7CBxlnqMFgw0BAmpKmOjTn
secrets:
- name: stripe-sk
- name: stripe-pbk
- name: cc_test_id
jobs:
- name: Test
commands:
- checkout
- sem-service start postgres 13
- sem-version ruby 3.2.1
- sudo -u postgres createuser -s semaphore
- createdb -U postgres -h 0.0.0.0 websiteone_test
- cache restore
- bundle config set --local path 'vendor/bundle'
- bundle install
- mkdir -p tmp/pids
- npm install yarn
- yarn install
- bundle exec rake assets:clobber
- bundle exec rake assets:precompile
- cache store
- 'RAILS_ENV=test bundle exec rake db:migrate'
- 'curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter'
- chmod +x ./cc-test-reporter
- ./cc-test-reporter before-build
- 'npx jasmine-browser-runner runSpecs'
- 'bundle exec rake ci:tests'
# - cat $HOME/cucumber_report.json || true
- ./cc-test-reporter after-build
================================================
FILE: .simplecov
================================================
# frozen_string_literal: true
if ENV['COVERAGE']
SimpleCov.start 'rails' do
add_filter ['/test/', '/features/', '/spec/', 'lib/tasks']
add_group 'Models', 'app/models'
add_group 'Controllers', 'app/controllers'
add_group 'Presenters', 'app/presenters'
add_group 'Helpers', 'app/helpers'
add_group 'Services', 'app/services'
add_group 'Mailers', 'app/mailers'
add_group 'Jobs', 'app/jobs'
end
end
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at info@agileventures.org. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to WebSiteOne (WSO)
So you'd like to contribute to the WebSiteOne codebase? That's wonderful, we're excited to have your help :-)
Please do come and say hello in our [Slack chat](https://agileventures.slack.com/messages/websiteone). You can get an invite by signing up at [AgileVentures](https://www.agileventures.org) or emailing [info@agileventures.org](mailto:info@agileventures.org). We sometimes have [weekly meetings](https://www.agileventures.org/events/websiteone-planning) to coordinate our efforts and we try to do planning poker voting on tickets before starting work on them. Feel free to join any [event](https://www.agileventures.org/events/) to ask questions, to listen in, or just say hi :-)
Getting set up with the system on your local machine can be tricky depending on your platform and your devops skills.
## Getting Started
This describes how to contribute to WebSiteOne: the tools we use to track and coordinate the work that is happening and that needs to happen. This also describes the *workflow* -- the processes and sequences for getting contributions merged into the project in an organized and coherent way.
First be sure that you've set up your development environment following all the steps
in **[Setting Up for Development on WebSiteOne _(Project Set Up)_](https://github.com/AgileVentures/WebsiteOne/blob/develop/docs/project_setup.md)**
We keep our code on [GitHub](http://github.com), use [git](https://git-scm.com) for version control and [Github](https://github.com/orgs/AgileVentures/projects) to manage our projects. Sometimes we use [ZenHub](https://zenhub.com) to organize work on features, chores and bugfixes.
## General Steps
To get involved please follow these steps:
#### 1. Get the system working on your development environment:
1. [install WSO on your dev environment (locally)](https://github.com/AgileVentures/WebsiteOne/blob/develop/docs/project_setup.md) or [on docker](https://github.com/AgileVentures/WebsiteOne/tree/develop/docker)
2. get tests passing (unit and integration tests in `spec/` and acceptance tests in `features`)
3. check that the site can be run manually (locally)
4. (optional) deploy to a remote (e.g. Heroku, drie, google, etc.) and ensure it runs there
#### 2. Look at what needs to be done on our Github [projects](https://github.com/orgs/AgileVentures/projects):
1. review [open PRs](https://github.com/AgileVentures/WebsiteOne/pulls) on GitHub - leave comments or collaborate if interested
2. review [open Issues](https://github.com/AgileVentures/WebsiteOne/issues) on GitHub and leave a comment if you are interested or if you are working on the issue
##### Voting
In the past, items needed to be voted on before work could start:
Voting happens in scrums or the weekly meeting (currently Fridays). Note that even without the meetings you can get a vote on any issue you're thinking of working on by using the Async voting bot in the [#websiteone slack channel](https://agileventures.slack.com/messages/C029E8G80/details/), using the following syntax: `/voter ISSUE NAME https://github.com/AgileVentures/WebsiteOne/issues/number`.
e.g.
```
/voter make a press-kit link in the footer https://github.com/AgileVentures/WebsiteOne/issues/1738
```
More on how to handle a vote can be found at: https://github.com/AgileVentures/AgileVentures/blob/master/ASYNC_VOTING.md#automated-async-vote
## git and GitHub
Our **default working branch is `develop`**. We do work by creating branches off `develop` for new features and bugfixes.
Any *feature* should include appropriate Cucumber acceptance tests and RSpec unit tests. We try to avoid view and controller specs, and focus purely on unit tests at the model and service level where possible.
A *bugfix* may include an acceptance test depending on where the bug occurred, but fixing a bug should start with the creation of a test that replicates the bug, so that any bugfix submission will include an appropriate test as well as the fix itself.
Each developer will usually work with a [fork](https://help.github.com/articles/fork-a-repo/) of the [main repository on Agile Ventures](https://github.com/AgileVentures/WebSiteOne). Before starting work on a new feature or bugfix, please ensure you have [synced your fork to upstream/develop](https://help.github.com/articles/syncing-a-fork/):
```
git pull upstream develop
```
Note that you should be re-syncing often on your feature/bugfix branch to ensure that you are always building on top of very latest develop code.
### Pull Requests: naming, syncing, size
Here is [how to create and submit a pull requests](https://github.com/AgileVentures/WebsiteOne/blob/develop/docs/how_to_submit_a_pull_request_on_github.md).
Every pull request should refer to a corresponding GitHub issue, and when you create feature/bug-fix branches please include the id of the relevant issue, e.g.
```
git checkout -b 799_add_contributing_md
```
Please ensure that each commit in your pull request makes a single coherent change and that the overall pull request only includes commits related to the specific GitHub issue that the pull request is addressing. This helps the project managers understand the PRs and merge them more quickly.
Whatever you are working on, or however far you get please do open a "Work in Progress" (WIP) [pull request](https://help.github.com/articles/creating-a-pull-request/) (just prepend your PR title with "[WIP]" ) so that others in the team can comment on your approach. Even if you hate your horrible code :-) please throw it up there and we'll help guide your code to fit in with the rest of the project.
Before you make a pull request it is a great idea to sync again to the upstream develop branch to reduce the chance that there will be any merge conflicts arising from other PRs that have been merged to develop since you started work:
```
git pull upstream develop
```
In your pull request description please include a sensible description of your code and a tag `fixes #<issue-id>` e.g. :
```
This PR adds a CONTRIBUTING.md file and a docs directory
fixes #799
```
which will associate the pull request with the issue.
This all adds up to a work flow that should look something like this:
0) ensure issue has full description of change and has been voted on
1) create branch prefixed with id of issue (moves issue into 'in progress')
2) create failing test on the branch (acceptance level)
3) create failing tests (unit level)
4) get test to pass with functionality
5) submit pull request with fixes #xyz
6) pull request reviewed
7) changes to original PR if required
8) pull request merged (presence of "fixes #xyz" then moves issue to 'done')
9) code moved to staging and checked against production data clone
10) code moved to production
Acceptance Tests and Caching
----------------------------
We have unit tests in RSpec and acceptance tests in Cucumber. At the start of the project we were doing unit, controller and view unit tests in RSpec, but have since stepped back from that requirement, finding it seems rather brittle. For any new functionality we recommend a simple combination of unit tests in RSpec and acceptance tests in Cucumber, and ensuring that as much logic as possible is moved out of views and controllers into models, services, presenters and helpers where they can be easily unit tested. This allows us to avoid brittle controller and view tests.
We have several challenges with the current acceptance tests. One is that some of the javascript tests fail intermittently, particularly on CI. Partly in an attempt to address this issue we added comprehensive [VCR](https://github.com/vcr/vcr) and [PuffingBilly](https://github.com/oesmith/puffing-billy) sandboxing of network interactions in the acceptance tests. While these caches allow some of our tests to run faster, and avoid us hitting third party services, they can be very confusing to develop against.
The principle is that one should avoid having tests depend on 3rd party systems over the network, and that we shouldn't spam 3rd party remote services with our test runs. However the reality is more complicated. For example in talking to 3rd party Stripe, they've said that they are happy to support test run hits "within reason". Also, a cached network interaction can make it seem like a part of the system is working, when in fact it will fail in production due to a real change to the network service. The action here should be to delete the relevant cache files, re-run, save the new cache files (which VCR and PuffingBilly should handle for us) and then commit the new cache files to git.
The reality is that it is often difficult to work out which are the relevant cache files (particularly if you're new to the project) and it's easy to mis-understand what's happening with the caches. A common reaction to seeing lots of cache files (files in `features/support/fixtures/`) when you run `git status` is to add them to `.gitignore` (which happened on LocalSupport and caused lots of confusion) or simply delete them.
There's a Gordian Knot here which is that we'd like it that if a tests passes on your machine, then it should pass on my machine. However, if the test relies on a 3rd party network service, then all bets are off. With some reliable network services that's not such a big deal, but it can be very confusing. If we just add the cache files to `.gitignore` we can get into some very confusing situations where developers don't realise they are running against cached network interactions. Simply deleting the cache files (`rm -rf features/support/fixtures/`) and re-checking out ( via `git checkout features/support/fixtures/`) is av perfectly reasonable way to get back to a baseline, but you still might be confused about which cache files you should be checking in with your tests.
In the ideal world the `develop` branch would run green for you and there would be no extraneous files. Then you add your new test and it's implementation. Once it's all working you will likely have a bunch of cache files. These should be deleted in the first instance since some may be due to erroneous network interactions as you were developing. Assuming you have got to a reliable green test stage you can clean up (`rake vcr_billy_caches:reset`) and then re-run. At this point, if you got another complete green run (for safety just run your new tests) any new cache files are associated with your tests, and these should be checked in to ensure that your new test/functionality will run the same everywhere.
However the above is complicated and we are actively looking for some sort of testing solution that allows us to avoid the intermittent failing tests, maybe dropping the whole caching approach is one way forward.
Airbrake Issues
---------------
Currently Airbrake automatically opens github issues when we have an error on production. We suspect that a good portion of them are related to performance, i.e. heroku's business model is based on limiting our memory size, and when we run out of memory then some requests die giving the run for longer than 150000ms errors or what have you.
Pull Request Review
-------------------
A project manager will review your pull request as soon as possible. Usually the project manager will need to sign off in order to merge a pull request.
The project manager will review the pull request for coherence with the specified feature or bug fix, and give feedback on code quality, user experience, documentation and git style. Please respond to comments from the project managers with explanation, or further commits to your pull request in order to get merged in as quickly as possible.
To maximize flexibility add the project manager as a collaborator to your WebSiteOne fork in order to allow them to help you fix your pull request, but this is not required.
If your tests are passing locally, but failing on CI, please have a look at the fails and if you can't fix, please do reach out to the project manager.
================================================
FILE: Dockerfile
================================================
# Use the official Ruby image from Docker Hub
# https://hub.docker.com/_/ruby
# [START cloudrun_rails_base_image]
# Pinning the OS to buster because the nodejs install script is buster-specific.
# Be sure to update the nodejs install command if the base image OS is updated.
FROM ruby:3.2.1 as base
# [END cloudrun_rails_base_image]
RUN (curl -sS https://deb.nodesource.com/gpgkey/nodesource.gpg.key | gpg --dearmor | apt-key add -) && \
echo "deb https://deb.nodesource.com/node_14.x buster main" > /etc/apt/sources.list.d/nodesource.list && \
apt-get update && apt-get install -y nodejs lsb-release
RUN (curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -) && \
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
apt-get update && apt-get install -y yarn
RUN apt-get update -qq && apt-get install -y dos2unix postgresql-client
RUN mkdir /WebsiteOne
WORKDIR /WebsiteOne
COPY Gemfile /WebsiteOne/Gemfile
COPY Gemfile.lock /WebsiteOne/Gemfile.lock
#Production or staging, use middle 2 config lines below when bundling
RUN gem install bundler && \
# bundle config set --local deployment 'true' && \
# bundle config set --local without 'development test' && \
bundle install
COPY package.json /WebsiteOne/package.json
COPY scripts /WebsiteOne/scripts
COPY vendor/assets/javascripts /WebsiteOne/assets/javascripts
FROM base
# To execute tests, install chromium
RUN apt install -y xvfb chromium chromium-driver
RUN dos2unix scripts/copy_javascript_dependencies.cjs
RUN yarn install
COPY . /WebsiteOne
RUN bundle exec rake assets:precompile
#Production or staging, take out 'bundle' line above and use the following
# ENV RAILS_ENV=production
# ENV RAILS_SERVE_STATIC_FILES=true
# # Redirect Rails log to STDOUT for Cloud Run to capture
# ENV RAILS_LOG_TO_STDOUT=true
# # [START cloudrun_rails_dockerfile_key]
# ARG MASTER_KEY
# ENV RAILS_MASTER_KEY=${MASTER_KEY}
# # [END cloudrun_rails_dockerfile_key]
# # pre-compile Rails assets with master key
# RUN bundle exec rake assets:precompile
# EXPOSE 8080
# CMD ["bin/rails", "server", "-b", "0.0.0.0", "-p", "8080"]
# Also add lines below to database.yml under 'production:'
# username: av
# password: <%= Rails.application.credentials.gcp[:db_password] %>
# host: /cloudsql/av-wso:us-central1:postgres
================================================
FILE: Gemfile
================================================
# frozen_string_literal: true
source 'https://rubygems.org'
ruby '3.2.1'
# Rather than loading the entire Rails framework, we charry pick the parts we use
gem 'actionmailer', '~> 7.0.4.3'
gem 'actionpack', '~> 7.0.4.3'
gem 'actionview', '~> 7.0.4.3'
gem 'activejob', '~> 7.0.4.3'
gem 'activemodel', '~> 7.0.4.3'
gem 'activerecord', '~> 7.0.4.3'
gem 'activestorage', '~> 7.0.4.3'
gem 'activesupport', '~> 7.0.4.3'
gem 'cssbundling-rails'
gem 'jsbundling-rails'
gem 'railties', '~> 7.0.4.3'
gem 'redis'
gem 'sprockets'
gem 'sprockets-rails'
gem 'stimulus-rails'
gem 'turbo-rails'
# Gems used in production
gem 'acts_as_follower', git: 'https://github.com/AgileVentures/acts_as_follower.git'
gem 'acts-as-taggable-on'
gem 'acts_as_tree'
gem 'acts_as_votable', '~> 0.12.1'
gem 'addressable'
gem 'bootsnap', '~> 1.9'
gem 'bootstrap-sass'
gem 'cocoon'
gem 'code_climate_badges', git: 'https://github.com/AgileVentures/codeclimate_badges'
gem 'coderay'
gem 'colored'
gem 'config'
gem 'devise', '~> 4.7'
gem 'eventmachine', '~> 1.2.7'
gem 'exception_notification'
gem 'factory_bot_rails'
gem 'faker'
gem 'font-awesome-rails'
gem 'friendly_id'
gem 'geocoder'
gem 'icalendar'
gem 'jbuilder'
gem 'jquery-rails'
gem 'jvectormap-rails', '~> 2.0'
gem 'jwt'
gem 'kaminari'
gem 'kramdown', '~> 2.1'
gem 'local_time', '~> 2.1'
gem 'mime-types', '~> 3.3', '>= 3.3.1'
gem 'nokogiri', '~> 1.14.2'
gem 'octokit'
gem 'omniauth'
gem 'omniauth-github'
gem 'omniauth-google-oauth2'
gem 'omniauth-oauth2'
gem 'omniauth-rails_csrf_protection'
gem 'paper_trail', '~> 12.0'
gem 'paranoia', '~> 2.4'
gem 'paypal-sdk-rest'
gem 'pg'
gem 'pivotal-tracker-api', git: 'https://github.com/AgileVentures/pivotal-tracker-api.git'
gem 'public_activity'
gem 'puma'
gem 'rack-cache'
gem 'rack-cors', require: 'rack/cors'
gem 'rack-timeout'
gem 'rails_autolink'
gem 'recaptcha', require: 'recaptcha/rails'
gem 'redcarpet'
gem 'ruby-gitter'
gem 'sass-rails', '>= 5'
gem 'seed_dump'
gem 'slack-ruby-client'
gem 'sorted_set', '~> 1.0', '>= 1.0.3'
gem 'spinjs-rails'
gem 'stripe'
gem 'sucker_punch'
gem 'utf8-cleaner'
gem 'vanity'
gem 'verbs'
gem 'will_paginate-bootstrap'
gem 'youtube_rails', '~> 1.2.3'
group :production do
gem 'mini_racer' # for environment without pre-existing js runtimes
end
group :test do
gem 'capybara'
gem 'capybara-screenshot'
gem 'cucumber-rails', require: false
gem 'cuprite'
gem 'database_cleaner'
gem 'delorean' # gem is discontinued
gem 'faraday-retry'
gem 'launchy'
gem 'puffing-billy'
gem 'rails-controller-testing', '~> 1.0', '>= 1.0.2'
gem 'rubocop-performance', '~> 1.5', '>= 1.5.2'
gem 'rubocop-rails', '~> 2.10', '>= 2.10.1'
gem 'rubocop-rspec', '>=1.28'
gem 'shoulda-matchers', require: false
gem 'stripe-ruby-mock', '~> 3.1.0.rc2', require: 'stripe_mock'
gem 'vcr'
gem 'webdrivers'
gem 'webmock'
end
group :development do
gem 'better_errors'
gem 'derailed_benchmarks'
gem 'letter_opener'
end
group :development, :test do
gem 'awesome_print'
gem 'binding_of_caller'
gem 'brakeman', require: false
gem 'bullet'
gem 'bundler-audit', require: false
gem 'constant-redefinition'
gem 'coveralls_reborn', require: false
gem 'dotenv-rails'
gem 'foreman'
gem 'guard'
gem 'guard-cucumber'
gem 'guard-livereload'
gem 'guard-rspec'
gem 'hirb'
gem 'pry-nav'
gem 'pry-rails'
gem 'railroady'
gem 'rails-erd'
gem 'rb-readline'
gem 'rspec-activemodel-mocks'
gem 'rspec-html-matchers'
gem 'rspec-rails'
gem 'simplecov', '~> 0.17.1'
end
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
gem 'ice_cube', github: 'ice-cube-ruby/ice_cube', ref: '6b97e77c106cd6662cb7292a5f59b01e4ccaedc6'
================================================
FILE: LICENSE
================================================
The MIT License (MIT)
Copyright (c) 2014 AgileVentures
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Note that the following files:
* app/assets/images/jobs.svg
* app/assets/images/lady-dev.svg
* app/assets/images/real-projects.svg
* app/assets/images/runners.svg
* app/assets/images/standups.svg
Are not MIT License and are subject to the [Shutterstock Licensing terms](https://www.shutterstock.com/license)
================================================
FILE: Procfile
================================================
web: bundle exec puma -C config/puma.rb
================================================
FILE: Procfile.dev
================================================
web: unset PORT && bin/rails server
js: yarn build --watch
css: yarn build:css --watch
================================================
FILE: README.md
================================================
# AgileVentures WebSiteOne
[](https://codeclimate.com/github/AgileVentures/WebsiteOne/maintainability) [](https://codeclimate.com/github/AgileVentures/WebsiteOne/test_coverage)
## Legacy code
This [Ruby on Rails](http://rubyonrails.org/) app powers the [AgileVentures main developer site](http://agileventures.org/), showing lists of active [projects](https://www.agileventures.org/projects), [members](https://www.agileventures.org/users), [upcoming events](https://www.agileventures.org/events), [past event recordings](https://www.agileventures.org/scrums), as well as information for how to [get involved](https://www.agileventures.org/membership-plans).
## Installation
See the [Project Setup](docs/project_setup.md) documentation
## Contributing
See our [Contribution guidelines](CONTRIBUTING.md)
## History
in 2011, inspired by Dave Patterson and Armando Fox's UCBerkeley Software Engineering Massive Open Online Class (MOOC), Sam Joseph had the idea for a global online pairing community where everyone worked together to use the agile development methodology to deliver solutions to IT charities and non-profits. Thomas Ochman joined as project manager and led the development of the WebSiteOne codebase with Bryan Yap serving as technical lead. Initialy Sam was the notional "client", not getting involved in the tech development, and many different volunteers contributed code. During this phase the events, projects and user systems were developed. There was also a blog like articles system. Yaro Appletov led a tight integration with Google hangouts to allow recordable hangouts to be launched from the site and report back telemetry.
Later Raoul Diffou joined to take over as project manager as Thomas and Bryan had less and less time for the project. Sam took over the technical lead role in 2016 and also stared pairing with Raoul as project manager. Later in 2016 as Raoul had less and less time Sam became the sole project manager. During the course of 2016 Sam and long time AV contributor Michael revised the events framework, and replaced the articles system with a Premium payments framework intended to help ensure AV was sustainable into the future. In 2017 Google withdrew their Hangouts API breaking various functionality in the site. Sam and Lokesh Sharma replaced the API integration with manual updates, and Sam pulled in the agile-bot node microservice so that WSO now communicates directly with Slack to alert members about new online meetings and their recordings. In 2022 AV contributor Matt Lindsey did some cleanup by replacing the mercury document editor with active text and updated the asset pipeline.
## Approaches
* Agile Development
* In the past we had regular sprints, offered daily standups, and got regular feedback from end users. We have discussions on Slack and occasional meetings now.
* Behaviour Driven Development (BDD)
* We use Cucumber and RSpec testing tools that describe the behaviours of the system and its units
* We try to work outside in, starting with acceptance tests, dropping to integration tests, then unit tests and then writing application code
* We do spike application code occasionally to work out what's going on, but then either throw away the spike, or make sure all our tests break before wrapping the application code in tests (by strategically or globally breaking things)
* Where possible we go for declarative over imperative scenarios in our acceptance tests, trying to boil down the high level features to be easily comprehensible in terms of user intention
* Domain Driven Design (DDD)
* Sometimes we switch to inside out, trying to adjust the underlying entity schema to better represent the domain model
* Self-documenting code
* We prefer executable documentation (tests) and relatively short methods where the method and variable names effectively document the code
## Reading material
* [Imperative vs Declarative Cucumber](http://fasteragile.com/blog/2015/01/19/declarative-user-stories-translate-to-good-cucumber-features/)
## Admin rake tasks
```bash
rake fetch_github_last_updates
rake fetch_github_languages
rake fetch_github_content_for_static_pages
rake fetch_github_readme_files
rake fetch_github_commits
rake karma_calculator
rake geocode:all
rake user:create_anonymous
rake vcr_billy_caches:reset
```
Updating the live static pages (like 'About' and 'Getting Started') requires the administrator to run `rake fetch_github:content_for_static_pages.`
================================================
FILE: Rakefile
================================================
# frozen_string_literal: true
# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
require File.expand_path('config/application', __dir__)
Rails.application.load_tasks
================================================
FILE: app/assets/builds/.keep
================================================
================================================
FILE: app/assets/config/manifest.js
================================================
//= link_tree ../builds/
//= link_tree ../images/
//= link application.css
//= link jquery-ui.js
//= link bootstrap.js
//= link lolex.js
//= link disqus.js
//= link 404.js
//= link subscriptions.css
//= link google-analytics.js
//= link cookies_banner.js
================================================
FILE: app/assets/images/.keep
================================================
================================================
FILE: app/assets/javascripts/application.js
================================================
import "./jq"
import "./jquery-ui"
import * as WebsiteOne from './websiteone';
import "./bootstrap";
import "./bootstrap-tags";
import "moment";
import "moment-timezone";
import "fullcalendar";
import "@nathanvda/cocoon";
import "trix";
import './global-modules/*.js';
import './documents';
import './users';
import LocalTime from "local-time";
import './controllers/*.js';
LocalTime.start()
$(function() {
if (!window.WebsiteOne._registered) {
$(document).ready(window.WebsiteOne._init);
$(document).on('page:load', window.WebsiteOne._init);
window.WebsiteOne._registered = true;
}
});
$(function() {
$('#calendar').fullCalendar({
header: {
right: 'prev, next, today, month, agendaWeek, agendaDay'
},
events: function(start, end, timezone, callback) {
var timezoneoffset = new Date().getTimezoneOffset();
var events = [];
$.ajax({
url: '/events.json',
success: function(doc) {
$.map(doc, function(event) {
event.start = moment.utc(event.start).local();
event.end = moment.utc(event.end).local();
events.push(event);
});
callback(events);
}
});
}
});
});
function infiniteScroll(params) {
$(window).scroll(function() {
var url = $('.pagination a[rel="next"]').attr('href');
if (url && $(window).scrollTop() > $(document).height() - $(window).height() - 450) {
$('.pagination').text("Please Wait...");
return $.getScript(url + params);
}
});
}
================================================
FILE: app/assets/javascripts/bootstrap-datepicker.js
================================================
/* =========================================================
* bootstrap-datepicker.js
* Repo: https://github.com/uxsolutions/bootstrap-datepicker/
* Demo: https://eternicode.github.io/bootstrap-datepicker/
* Docs: https://bootstrap-datepicker.readthedocs.org/
* =========================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================= */
(function(factory){
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function($, undefined){
function UTCDate(){
return new Date(Date.UTC.apply(Date, arguments));
}
function UTCToday(){
var today = new Date();
return UTCDate(today.getFullYear(), today.getMonth(), today.getDate());
}
function isUTCEquals(date1, date2) {
return (
date1.getUTCFullYear() === date2.getUTCFullYear() &&
date1.getUTCMonth() === date2.getUTCMonth() &&
date1.getUTCDate() === date2.getUTCDate()
);
}
function alias(method, deprecationMsg){
return function(){
if (deprecationMsg !== undefined) {
$.fn.datepicker.deprecated(deprecationMsg);
}
return this[method].apply(this, arguments);
};
}
function isValidDate(d) {
return d && !isNaN(d.getTime());
}
var DateArray = (function(){
var extras = {
get: function(i){
return this.slice(i)[0];
},
contains: function(d){
// Array.indexOf is not cross-browser;
// $.inArray doesn't work with Dates
var val = d && d.valueOf();
for (var i=0, l=this.length; i < l; i++)
// Use date arithmetic to allow dates with different times to match
if (0 <= this[i].valueOf() - val && this[i].valueOf() - val < 1000*60*60*24)
return i;
return -1;
},
remove: function(i){
this.splice(i,1);
},
replace: function(new_array){
if (!new_array)
return;
if (!$.isArray(new_array))
new_array = [new_array];
this.clear();
this.push.apply(this, new_array);
},
clear: function(){
this.length = 0;
},
copy: function(){
var a = new DateArray();
a.replace(this);
return a;
}
};
return function(){
var a = [];
a.push.apply(a, arguments);
$.extend(a, extras);
return a;
};
})();
// Picker object
var Datepicker = function(element, options){
$.data(element, 'datepicker', this);
this._events = [];
this._secondaryEvents = [];
this._process_options(options);
this.dates = new DateArray();
this.viewDate = this.o.defaultViewDate;
this.focusDate = null;
this.element = $(element);
this.isInput = this.element.is('input');
this.inputField = this.isInput ? this.element : this.element.find('input');
this.component = this.element.hasClass('date') ? this.element.find('.add-on, .input-group-addon, .input-group-append, .input-group-prepend, .btn') : false;
if (this.component && this.component.length === 0)
this.component = false;
this.isInline = !this.component && this.element.is('div');
this.picker = $(DPGlobal.template);
// Checking templates and inserting
if (this._check_template(this.o.templates.leftArrow)) {
this.picker.find('.prev').html(this.o.templates.leftArrow);
}
if (this._check_template(this.o.templates.rightArrow)) {
this.picker.find('.next').html(this.o.templates.rightArrow);
}
this._buildEvents();
this._attachEvents();
if (this.isInline){
this.picker.addClass('datepicker-inline').appendTo(this.element);
}
else {
this.picker.addClass('datepicker-dropdown dropdown-menu');
}
if (this.o.rtl){
this.picker.addClass('datepicker-rtl');
}
if (this.o.calendarWeeks) {
this.picker.find('.datepicker-days .datepicker-switch, thead .datepicker-title, tfoot .today, tfoot .clear')
.attr('colspan', function(i, val){
return Number(val) + 1;
});
}
this._process_options({
startDate: this._o.startDate,
endDate: this._o.endDate,
daysOfWeekDisabled: this.o.daysOfWeekDisabled,
daysOfWeekHighlighted: this.o.daysOfWeekHighlighted,
datesDisabled: this.o.datesDisabled
});
this._allow_update = false;
this.setViewMode(this.o.startView);
this._allow_update = true;
this.fillDow();
this.fillMonths();
this.update();
if (this.isInline){
this.show();
}
};
Datepicker.prototype = {
constructor: Datepicker,
_resolveViewName: function(view){
$.each(DPGlobal.viewModes, function(i, viewMode){
if (view === i || $.inArray(view, viewMode.names) !== -1){
view = i;
return false;
}
});
return view;
},
_resolveDaysOfWeek: function(daysOfWeek){
if (!$.isArray(daysOfWeek))
daysOfWeek = daysOfWeek.split(/[,\s]*/);
return $.map(daysOfWeek, Number);
},
_check_template: function(tmp){
try {
// If empty
if (tmp === undefined || tmp === "") {
return false;
}
// If no html, everything ok
if ((tmp.match(/[<>]/g) || []).length <= 0) {
return true;
}
// Checking if html is fine
var jDom = $(tmp);
return jDom.length > 0;
}
catch (ex) {
return false;
}
},
_process_options: function(opts){
// Store raw options for reference
this._o = $.extend({}, this._o, opts);
// Processed options
var o = this.o = $.extend({}, this._o);
// Check if "de-DE" style date is available, if not language should
// fallback to 2 letter code eg "de"
var lang = o.language;
if (!dates[lang]){
lang = lang.split('-')[0];
if (!dates[lang])
lang = defaults.language;
}
o.language = lang;
// Retrieve view index from any aliases
o.startView = this._resolveViewName(o.startView);
o.minViewMode = this._resolveViewName(o.minViewMode);
o.maxViewMode = this._resolveViewName(o.maxViewMode);
// Check view is between min and max
o.startView = Math.max(this.o.minViewMode, Math.min(this.o.maxViewMode, o.startView));
// true, false, or Number > 0
if (o.multidate !== true){
o.multidate = Number(o.multidate) || false;
if (o.multidate !== false)
o.multidate = Math.max(0, o.multidate);
}
o.multidateSeparator = String(o.multidateSeparator);
o.weekStart %= 7;
o.weekEnd = (o.weekStart + 6) % 7;
var format = DPGlobal.parseFormat(o.format);
if (o.startDate !== -Infinity){
if (!!o.startDate){
if (o.startDate instanceof Date)
o.startDate = this._local_to_utc(this._zero_time(o.startDate));
else
o.startDate = DPGlobal.parseDate(o.startDate, format, o.language, o.assumeNearbyYear);
}
else {
o.startDate = -Infinity;
}
}
if (o.endDate !== Infinity){
if (!!o.endDate){
if (o.endDate instanceof Date)
o.endDate = this._local_to_utc(this._zero_time(o.endDate));
else
o.endDate = DPGlobal.parseDate(o.endDate, format, o.language, o.assumeNearbyYear);
}
else {
o.endDate = Infinity;
}
}
o.daysOfWeekDisabled = this._resolveDaysOfWeek(o.daysOfWeekDisabled||[]);
o.daysOfWeekHighlighted = this._resolveDaysOfWeek(o.daysOfWeekHighlighted||[]);
o.datesDisabled = o.datesDisabled||[];
if (!$.isArray(o.datesDisabled)) {
o.datesDisabled = o.datesDisabled.split(',');
}
o.datesDisabled = $.map(o.datesDisabled, function(d){
return DPGlobal.parseDate(d, format, o.language, o.assumeNearbyYear);
});
var plc = String(o.orientation).toLowerCase().split(/\s+/g),
_plc = o.orientation.toLowerCase();
plc = $.grep(plc, function(word){
return /^auto|left|right|top|bottom$/.test(word);
});
o.orientation = {x: 'auto', y: 'auto'};
if (!_plc || _plc === 'auto')
; // no action
else if (plc.length === 1){
switch (plc[0]){
case 'top':
case 'bottom':
o.orientation.y = plc[0];
break;
case 'left':
case 'right':
o.orientation.x = plc[0];
break;
}
}
else {
_plc = $.grep(plc, function(word){
return /^left|right$/.test(word);
});
o.orientation.x = _plc[0] || 'auto';
_plc = $.grep(plc, function(word){
return /^top|bottom$/.test(word);
});
o.orientation.y = _plc[0] || 'auto';
}
if (o.defaultViewDate instanceof Date || typeof o.defaultViewDate === 'string') {
o.defaultViewDate = DPGlobal.parseDate(o.defaultViewDate, format, o.language, o.assumeNearbyYear);
} else if (o.defaultViewDate) {
var year = o.defaultViewDate.year || new Date().getFullYear();
var month = o.defaultViewDate.month || 0;
var day = o.defaultViewDate.day || 1;
o.defaultViewDate = UTCDate(year, month, day);
} else {
o.defaultViewDate = UTCToday();
}
},
_applyEvents: function(evs){
for (var i=0, el, ch, ev; i < evs.length; i++){
el = evs[i][0];
if (evs[i].length === 2){
ch = undefined;
ev = evs[i][1];
} else if (evs[i].length === 3){
ch = evs[i][1];
ev = evs[i][2];
}
el.on(ev, ch);
}
},
_unapplyEvents: function(evs){
for (var i=0, el, ev, ch; i < evs.length; i++){
el = evs[i][0];
if (evs[i].length === 2){
ch = undefined;
ev = evs[i][1];
} else if (evs[i].length === 3){
ch = evs[i][1];
ev = evs[i][2];
}
el.off(ev, ch);
}
},
_buildEvents: function(){
var events = {
keyup: $.proxy(function(e){
if ($.inArray(e.keyCode, [27, 37, 39, 38, 40, 32, 13, 9]) === -1)
this.update();
}, this),
keydown: $.proxy(this.keydown, this),
paste: $.proxy(this.paste, this)
};
if (this.o.showOnFocus === true) {
events.focus = $.proxy(this.show, this);
}
if (this.isInput) { // single input
this._events = [
[this.element, events]
];
}
// component: input + button
else if (this.component && this.inputField.length) {
this._events = [
// For components that are not readonly, allow keyboard nav
[this.inputField, events],
[this.component, {
click: $.proxy(this.show, this)
}]
];
}
else {
this._events = [
[this.element, {
click: $.proxy(this.show, this),
keydown: $.proxy(this.keydown, this)
}]
];
}
this._events.push(
// Component: listen for blur on element descendants
[this.element, '*', {
blur: $.proxy(function(e){
this._focused_from = e.target;
}, this)
}],
// Input: listen for blur on element
[this.element, {
blur: $.proxy(function(e){
this._focused_from = e.target;
}, this)
}]
);
if (this.o.immediateUpdates) {
// Trigger input updates immediately on changed year/month
this._events.push([this.element, {
'changeYear changeMonth': $.proxy(function(e){
this.update(e.date);
}, this)
}]);
}
this._secondaryEvents = [
[this.picker, {
click: $.proxy(this.click, this)
}],
[this.picker, '.prev, .next', {
click: $.proxy(this.navArrowsClick, this)
}],
[this.picker, '.day:not(.disabled)', {
click: $.proxy(this.dayCellClick, this)
}],
[$(window), {
resize: $.proxy(this.place, this)
}],
[$(document), {
'mousedown touchstart': $.proxy(function(e){
// Clicked outside the datepicker, hide it
if (!(
this.element.is(e.target) ||
this.element.find(e.target).length ||
this.picker.is(e.target) ||
this.picker.find(e.target).length ||
this.isInline
)){
this.hide();
}
}, this)
}]
];
},
_attachEvents: function(){
this._detachEvents();
this._applyEvents(this._events);
},
_detachEvents: function(){
this._unapplyEvents(this._events);
},
_attachSecondaryEvents: function(){
this._detachSecondaryEvents();
this._applyEvents(this._secondaryEvents);
},
_detachSecondaryEvents: function(){
this._unapplyEvents(this._secondaryEvents);
},
_trigger: function(event, altdate){
var date = altdate || this.dates.get(-1),
local_date = this._utc_to_local(date);
this.element.trigger({
type: event,
date: local_date,
viewMode: this.viewMode,
dates: $.map(this.dates, this._utc_to_local),
format: $.proxy(function(ix, format){
if (arguments.length === 0){
ix = this.dates.length - 1;
format = this.o.format;
} else if (typeof ix === 'string'){
format = ix;
ix = this.dates.length - 1;
}
format = format || this.o.format;
var date = this.dates.get(ix);
return DPGlobal.formatDate(date, format, this.o.language);
}, this)
});
},
show: function(){
if (this.inputField.is(':disabled') || (this.inputField.prop('readonly') && this.o.enableOnReadonly === false))
return;
if (!this.isInline)
this.picker.appendTo(this.o.container);
this.place();
this.picker.show();
this._attachSecondaryEvents();
this._trigger('show');
if ((window.navigator.msMaxTouchPoints || 'ontouchstart' in document) && this.o.disableTouchKeyboard) {
$(this.element).blur();
}
return this;
},
hide: function(){
if (this.isInline || !this.picker.is(':visible'))
return this;
this.focusDate = null;
this.picker.hide().detach();
this._detachSecondaryEvents();
this.setViewMode(this.o.startView);
if (this.o.forceParse && this.inputField.val())
this.setValue();
this._trigger('hide');
return this;
},
destroy: function(){
this.hide();
this._detachEvents();
this._detachSecondaryEvents();
this.picker.remove();
delete this.element.data().datepicker;
if (!this.isInput){
delete this.element.data().date;
}
return this;
},
paste: function(e){
var dateString;
if (e.originalEvent.clipboardData && e.originalEvent.clipboardData.types
&& $.inArray('text/plain', e.originalEvent.clipboardData.types) !== -1) {
dateString = e.originalEvent.clipboardData.getData('text/plain');
} else if (window.clipboardData) {
dateString = window.clipboardData.getData('Text');
} else {
return;
}
this.setDate(dateString);
this.update();
e.preventDefault();
},
_utc_to_local: function(utc){
if (!utc) {
return utc;
}
var local = new Date(utc.getTime() + (utc.getTimezoneOffset() * 60000));
if (local.getTimezoneOffset() !== utc.getTimezoneOffset()) {
local = new Date(utc.getTime() + (local.getTimezoneOffset() * 60000));
}
return local;
},
_local_to_utc: function(local){
return local && new Date(local.getTime() - (local.getTimezoneOffset()*60000));
},
_zero_time: function(local){
return local && new Date(local.getFullYear(), local.getMonth(), local.getDate());
},
_zero_utc_time: function(utc){
return utc && UTCDate(utc.getUTCFullYear(), utc.getUTCMonth(), utc.getUTCDate());
},
getDates: function(){
return $.map(this.dates, this._utc_to_local);
},
getUTCDates: function(){
return $.map(this.dates, function(d){
return new Date(d);
});
},
getDate: function(){
return this._utc_to_local(this.getUTCDate());
},
getUTCDate: function(){
var selected_date = this.dates.get(-1);
if (selected_date !== undefined) {
return new Date(selected_date);
} else {
return null;
}
},
clearDates: function(){
this.inputField.val('');
this.update();
this._trigger('changeDate');
if (this.o.autoclose) {
this.hide();
}
},
setDates: function(){
var args = $.isArray(arguments[0]) ? arguments[0] : arguments;
this.update.apply(this, args);
this._trigger('changeDate');
this.setValue();
return this;
},
setUTCDates: function(){
var args = $.isArray(arguments[0]) ? arguments[0] : arguments;
this.setDates.apply(this, $.map(args, this._utc_to_local));
return this;
},
setDate: alias('setDates'),
setUTCDate: alias('setUTCDates'),
remove: alias('destroy', 'Method `remove` is deprecated and will be removed in version 2.0. Use `destroy` instead'),
setValue: function(){
var formatted = this.getFormattedDate();
this.inputField.val(formatted);
return this;
},
getFormattedDate: function(format){
if (format === undefined)
format = this.o.format;
var lang = this.o.language;
return $.map(this.dates, function(d){
return DPGlobal.formatDate(d, format, lang);
}).join(this.o.multidateSeparator);
},
getStartDate: function(){
return this.o.startDate;
},
setStartDate: function(startDate){
this._process_options({startDate: startDate});
this.update();
this.updateNavArrows();
return this;
},
getEndDate: function(){
return this.o.endDate;
},
setEndDate: function(endDate){
this._process_options({endDate: endDate});
this.update();
this.updateNavArrows();
return this;
},
setDaysOfWeekDisabled: function(daysOfWeekDisabled){
this._process_options({daysOfWeekDisabled: daysOfWeekDisabled});
this.update();
return this;
},
setDaysOfWeekHighlighted: function(daysOfWeekHighlighted){
this._process_options({daysOfWeekHighlighted: daysOfWeekHighlighted});
this.update();
return this;
},
setDatesDisabled: function(datesDisabled){
this._process_options({datesDisabled: datesDisabled});
this.update();
return this;
},
place: function(){
if (this.isInline)
return this;
var calendarWidth = this.picker.outerWidth(),
calendarHeight = this.picker.outerHeight(),
visualPadding = 10,
container = $(this.o.container),
windowWidth = container.width(),
scrollTop = this.o.container === 'body' ? $(document).scrollTop() : container.scrollTop(),
appendOffset = container.offset();
var parentsZindex = [0];
this.element.parents().each(function(){
var itemZIndex = $(this).css('z-index');
if (itemZIndex !== 'auto' && Number(itemZIndex) !== 0) parentsZindex.push(Number(itemZIndex));
});
var zIndex = Math.max.apply(Math, parentsZindex) + this.o.zIndexOffset;
var offset = this.component ? this.component.parent().offset() : this.element.offset();
var height = this.component ? this.component.outerHeight(true) : this.element.outerHeight(false);
var width = this.component ? this.component.outerWidth(true) : this.element.outerWidth(false);
var left = offset.left - appendOffset.left;
var top = offset.top - appendOffset.top;
if (this.o.container !== 'body') {
top += scrollTop;
}
this.picker.removeClass(
'datepicker-orient-top datepicker-orient-bottom '+
'datepicker-orient-right datepicker-orient-left'
);
if (this.o.orientation.x !== 'auto'){
this.picker.addClass('datepicker-orient-' + this.o.orientation.x);
if (this.o.orientation.x === 'right')
left -= calendarWidth - width;
}
// auto x orientation is best-placement: if it crosses a window
// edge, fudge it sideways
else {
if (offset.left < 0) {
// component is outside the window on the left side. Move it into visible range
this.picker.addClass('datepicker-orient-left');
left -= offset.left - visualPadding;
} else if (left + calendarWidth > windowWidth) {
// the calendar passes the widow right edge. Align it to component right side
this.picker.addClass('datepicker-orient-right');
left += width - calendarWidth;
} else {
if (this.o.rtl) {
// Default to right
this.picker.addClass('datepicker-orient-right');
} else {
// Default to left
this.picker.addClass('datepicker-orient-left');
}
}
}
// auto y orientation is best-situation: top or bottom, no fudging,
// decision based on which shows more of the calendar
var yorient = this.o.orientation.y,
top_overflow;
if (yorient === 'auto'){
top_overflow = -scrollTop + top - calendarHeight;
yorient = top_overflow < 0 ? 'bottom' : 'top';
}
this.picker.addClass('datepicker-orient-' + yorient);
if (yorient === 'top')
top -= calendarHeight + parseInt(this.picker.css('padding-top'));
else
top += height;
if (this.o.rtl) {
var right = windowWidth - (left + width);
this.picker.css({
top: top,
right: right,
zIndex: zIndex
});
} else {
this.picker.css({
top: top,
left: left,
zIndex: zIndex
});
}
return this;
},
_allow_update: true,
update: function(){
if (!this._allow_update)
return this;
var oldDates = this.dates.copy(),
dates = [],
fromArgs = false;
if (arguments.length){
$.each(arguments, $.proxy(function(i, date){
if (date instanceof Date)
date = this._local_to_utc(date);
dates.push(date);
}, this));
fromArgs = true;
} else {
dates = this.isInput
? this.element.val()
: this.element.data('date') || this.inputField.val();
if (dates && this.o.multidate)
dates = dates.split(this.o.multidateSeparator);
else
dates = [dates];
delete this.element.data().date;
}
dates = $.map(dates, $.proxy(function(date){
return DPGlobal.parseDate(date, this.o.format, this.o.language, this.o.assumeNearbyYear);
}, this));
dates = $.grep(dates, $.proxy(function(date){
return (
!this.dateWithinRange(date) ||
!date
);
}, this), true);
this.dates.replace(dates);
if (this.o.updateViewDate) {
if (this.dates.length)
this.viewDate = new Date(this.dates.get(-1));
else if (this.viewDate < this.o.startDate)
this.viewDate = new Date(this.o.startDate);
else if (this.viewDate > this.o.endDate)
this.viewDate = new Date(this.o.endDate);
else
this.viewDate = this.o.defaultViewDate;
}
if (fromArgs){
// setting date by clicking
this.setValue();
this.element.change();
}
else if (this.dates.length){
// setting date by typing
if (String(oldDates) !== String(this.dates) && fromArgs) {
this._trigger('changeDate');
this.element.change();
}
}
if (!this.dates.length && oldDates.length) {
this._trigger('clearDate');
this.element.change();
}
this.fill();
return this;
},
fillDow: function(){
if (this.o.showWeekDays) {
var dowCnt = this.o.weekStart,
html = '<tr>';
if (this.o.calendarWeeks){
html += '<th class="cw"> </th>';
}
while (dowCnt < this.o.weekStart + 7){
html += '<th class="dow';
if ($.inArray(dowCnt, this.o.daysOfWeekDisabled) !== -1)
html += ' disabled';
html += '">'+dates[this.o.language].daysMin[(dowCnt++)%7]+'</th>';
}
html += '</tr>';
this.picker.find('.datepicker-days thead').append(html);
}
},
fillMonths: function(){
var localDate = this._utc_to_local(this.viewDate);
var html = '';
var focused;
for (var i = 0; i < 12; i++){
focused = localDate && localDate.getMonth() === i ? ' focused' : '';
html += '<span class="month' + focused + '">' + dates[this.o.language].monthsShort[i] + '</span>';
}
this.picker.find('.datepicker-months td').html(html);
},
setRange: function(range){
if (!range || !range.length)
delete this.range;
else
this.range = $.map(range, function(d){
return d.valueOf();
});
this.fill();
},
getClassNames: function(date){
var cls = [],
year = this.viewDate.getUTCFullYear(),
month = this.viewDate.getUTCMonth(),
today = UTCToday();
if (date.getUTCFullYear() < year || (date.getUTCFullYear() === year && date.getUTCMonth() < month)){
cls.push('old');
} else if (date.getUTCFullYear() > year || (date.getUTCFullYear() === year && date.getUTCMonth() > month)){
cls.push('new');
}
if (this.focusDate && date.valueOf() === this.focusDate.valueOf())
cls.push('focused');
// Compare internal UTC date with UTC today, not local today
if (this.o.todayHighlight && isUTCEquals(date, today)) {
cls.push('today');
}
if (this.dates.contains(date) !== -1)
cls.push('active');
if (!this.dateWithinRange(date)){
cls.push('disabled');
}
if (this.dateIsDisabled(date)){
cls.push('disabled', 'disabled-date');
}
if ($.inArray(date.getUTCDay(), this.o.daysOfWeekHighlighted) !== -1){
cls.push('highlighted');
}
if (this.range){
if (date > this.range[0] && date < this.range[this.range.length-1]){
cls.push('range');
}
if ($.inArray(date.valueOf(), this.range) !== -1){
cls.push('selected');
}
if (date.valueOf() === this.range[0]){
cls.push('range-start');
}
if (date.valueOf() === this.range[this.range.length-1]){
cls.push('range-end');
}
}
return cls;
},
_fill_yearsView: function(selector, cssClass, factor, year, startYear, endYear, beforeFn){
var html = '';
var step = factor / 10;
var view = this.picker.find(selector);
var startVal = Math.floor(year / factor) * factor;
var endVal = startVal + step * 9;
var focusedVal = Math.floor(this.viewDate.getFullYear() / step) * step;
var selected = $.map(this.dates, function(d){
return Math.floor(d.getUTCFullYear() / step) * step;
});
var classes, tooltip, before;
for (var currVal = startVal - step; currVal <= endVal + step; currVal += step) {
classes = [cssClass];
tooltip = null;
if (currVal === startVal - step) {
classes.push('old');
} else if (currVal === endVal + step) {
classes.push('new');
}
if ($.inArray(currVal, selected) !== -1) {
classes.push('active');
}
if (currVal < startYear || currVal > endYear) {
classes.push('disabled');
}
if (currVal === focusedVal) {
classes.push('focused');
}
if (beforeFn !== $.noop) {
before = beforeFn(new Date(currVal, 0, 1));
if (before === undefined) {
before = {};
} else if (typeof before === 'boolean') {
before = {enabled: before};
} else if (typeof before === 'string') {
before = {classes: before};
}
if (before.enabled === false) {
classes.push('disabled');
}
if (before.classes) {
classes = classes.concat(before.classes.split(/\s+/));
}
if (before.tooltip) {
tooltip = before.tooltip;
}
}
html += '<span class="' + classes.join(' ') + '"' + (tooltip ? ' title="' + tooltip + '"' : '') + '>' + currVal + '</span>';
}
view.find('.datepicker-switch').text(startVal + '-' + endVal);
view.find('td').html(html);
},
fill: function(){
var d = new Date(this.viewDate),
year = d.getUTCFullYear(),
month = d.getUTCMonth(),
startYear = this.o.startDate !== -Infinity ? this.o.startDate.getUTCFullYear() : -Infinity,
startMonth = this.o.startDate !== -Infinity ? this.o.startDate.getUTCMonth() : -Infinity,
endYear = this.o.endDate !== Infinity ? this.o.endDate.getUTCFullYear() : Infinity,
endMonth = this.o.endDate !== Infinity ? this.o.endDate.getUTCMonth() : Infinity,
todaytxt = dates[this.o.language].today || dates['en'].today || '',
cleartxt = dates[this.o.language].clear || dates['en'].clear || '',
titleFormat = dates[this.o.language].titleFormat || dates['en'].titleFormat,
todayDate = UTCToday(),
titleBtnVisible = (this.o.todayBtn === true || this.o.todayBtn === 'linked') && todayDate >= this.o.startDate && todayDate <= this.o.endDate && !this.weekOfDateIsDisabled(todayDate),
tooltip,
before;
if (isNaN(year) || isNaN(month))
return;
this.picker.find('.datepicker-days .datepicker-switch')
.text(DPGlobal.formatDate(d, titleFormat, this.o.language));
this.picker.find('tfoot .today')
.text(todaytxt)
.css('display', titleBtnVisible ? 'table-cell' : 'none');
this.picker.find('tfoot .clear')
.text(cleartxt)
.css('display', this.o.clearBtn === true ? 'table-cell' : 'none');
this.picker.find('thead .datepicker-title')
.text(this.o.title)
.css('display', typeof this.o.title === 'string' && this.o.title !== '' ? 'table-cell' : 'none');
this.updateNavArrows();
this.fillMonths();
var prevMonth = UTCDate(year, month, 0),
day = prevMonth.getUTCDate();
prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.o.weekStart + 7)%7);
var nextMonth = new Date(prevMonth);
if (prevMonth.getUTCFullYear() < 100){
nextMonth.setUTCFullYear(prevMonth.getUTCFullYear());
}
nextMonth.setUTCDate(nextMonth.getUTCDate() + 42);
nextMonth = nextMonth.valueOf();
var html = [];
var weekDay, clsName;
while (prevMonth.valueOf() < nextMonth){
weekDay = prevMonth.getUTCDay();
if (weekDay === this.o.weekStart){
html.push('<tr>');
if (this.o.calendarWeeks){
// ISO 8601: First week contains first thursday.
// ISO also states week starts on Monday, but we can be more abstract here.
var
// Start of current week: based on weekstart/current date
ws = new Date(+prevMonth + (this.o.weekStart - weekDay - 7) % 7 * 864e5),
// Thursday of this week
th = new Date(Number(ws) + (7 + 4 - ws.getUTCDay()) % 7 * 864e5),
// First Thursday of year, year from thursday
yth = new Date(Number(yth = UTCDate(th.getUTCFullYear(), 0, 1)) + (7 + 4 - yth.getUTCDay()) % 7 * 864e5),
// Calendar week: ms between thursdays, div ms per day, div 7 days
calWeek = (th - yth) / 864e5 / 7 + 1;
html.push('<td class="cw">'+ calWeek +'</td>');
}
}
clsName = this.getClassNames(prevMonth);
clsName.push('day');
var content = prevMonth.getUTCDate();
if (this.o.beforeShowDay !== $.noop){
before = this.o.beforeShowDay(this._utc_to_local(prevMonth));
if (before === undefined)
before = {};
else if (typeof before === 'boolean')
before = {enabled: before};
else if (typeof before === 'string')
before = {classes: before};
if (before.enabled === false)
clsName.push('disabled');
if (before.classes)
clsName = clsName.concat(before.classes.split(/\s+/));
if (before.tooltip)
tooltip = before.tooltip;
if (before.content)
content = before.content;
}
//Check if uniqueSort exists (supported by jquery >=1.12 and >=2.2)
//Fallback to unique function for older jquery versions
if ($.isFunction($.uniqueSort)) {
clsName = $.uniqueSort(clsName);
} else {
clsName = $.unique(clsName);
}
html.push('<td class="'+clsName.join(' ')+'"' + (tooltip ? ' title="'+tooltip+'"' : '') + ' data-date="' + prevMonth.getTime().toString() + '">' + content + '</td>');
tooltip = null;
if (weekDay === this.o.weekEnd){
html.push('</tr>');
}
prevMonth.setUTCDate(prevMonth.getUTCDate() + 1);
}
this.picker.find('.datepicker-days tbody').html(html.join(''));
var monthsTitle = dates[this.o.language].monthsTitle || dates['en'].monthsTitle || 'Months';
var months = this.picker.find('.datepicker-months')
.find('.datepicker-switch')
.text(this.o.maxViewMode < 2 ? monthsTitle : year)
.end()
.find('tbody span').removeClass('active');
$.each(this.dates, function(i, d){
if (d.getUTCFullYear() === year)
months.eq(d.getUTCMonth()).addClass('active');
});
if (year < startYear || year > endYear){
months.addClass('disabled');
}
if (year === startYear){
months.slice(0, startMonth).addClass('disabled');
}
if (year === endYear){
months.slice(endMonth+1).addClass('disabled');
}
if (this.o.beforeShowMonth !== $.noop){
var that = this;
$.each(months, function(i, month){
var moDate = new Date(year, i, 1);
var before = that.o.beforeShowMonth(moDate);
if (before === undefined)
before = {};
else if (typeof before === 'boolean')
before = {enabled: before};
else if (typeof before === 'string')
before = {classes: before};
if (before.enabled === false && !$(month).hasClass('disabled'))
$(month).addClass('disabled');
if (before.classes)
$(month).addClass(before.classes);
if (before.tooltip)
$(month).prop('title', before.tooltip);
});
}
// Generating decade/years picker
this._fill_yearsView(
'.datepicker-years',
'year',
10,
year,
startYear,
endYear,
this.o.beforeShowYear
);
// Generating century/decades picker
this._fill_yearsView(
'.datepicker-decades',
'decade',
100,
year,
startYear,
endYear,
this.o.beforeShowDecade
);
// Generating millennium/centuries picker
this._fill_yearsView(
'.datepicker-centuries',
'century',
1000,
year,
startYear,
endYear,
this.o.beforeShowCentury
);
},
updateNavArrows: function(){
if (!this._allow_update)
return;
var d = new Date(this.viewDate),
year = d.getUTCFullYear(),
month = d.getUTCMonth(),
startYear = this.o.startDate !== -Infinity ? this.o.startDate.getUTCFullYear() : -Infinity,
startMonth = this.o.startDate !== -Infinity ? this.o.startDate.getUTCMonth() : -Infinity,
endYear = this.o.endDate !== Infinity ? this.o.endDate.getUTCFullYear() : Infinity,
endMonth = this.o.endDate !== Infinity ? this.o.endDate.getUTCMonth() : Infinity,
prevIsDisabled,
nextIsDisabled,
factor = 1;
switch (this.viewMode){
case 4:
factor *= 10;
/* falls through */
case 3:
factor *= 10;
/* falls through */
case 2:
factor *= 10;
/* falls through */
case 1:
prevIsDisabled = Math.floor(year / factor) * factor <= startYear;
nextIsDisabled = Math.floor(year / factor) * factor + factor > endYear;
break;
case 0:
prevIsDisabled = year <= startYear && month <= startMonth;
nextIsDisabled = year >= endYear && month >= endMonth;
break;
}
this.picker.find('.prev').toggleClass('disabled', prevIsDisabled);
this.picker.find('.next').toggleClass('disabled', nextIsDisabled);
},
click: function(e){
e.preventDefault();
e.stopPropagation();
var target, dir, day, year, month;
target = $(e.target);
// Clicked on the switch
if (target.hasClass('datepicker-switch') && this.viewMode !== this.o.maxViewMode){
this.setViewMode(this.viewMode + 1);
}
// Clicked on today button
if (target.hasClass('today') && !target.hasClass('day')){
this.setViewMode(0);
this._setDate(UTCToday(), this.o.todayBtn === 'linked' ? null : 'view');
}
// Clicked on clear button
if (target.hasClass('clear')){
this.clearDates();
}
if (!target.hasClass('disabled')){
// Clicked on a month, year, decade, century
if (target.hasClass('month')
|| target.hasClass('year')
|| target.hasClass('decade')
|| target.hasClass('century')) {
this.viewDate.setUTCDate(1);
day = 1;
if (this.viewMode === 1){
month = target.parent().find('span').index(target);
year = this.viewDate.getUTCFullYear();
this.viewDate.setUTCMonth(month);
} else {
month = 0;
year = Number(target.text());
this.viewDate.setUTCFullYear(year);
}
this._trigger(DPGlobal.viewModes[this.viewMode - 1].e, this.viewDate);
if (this.viewMode === this.o.minViewMode){
this._setDate(UTCDate(year, month, day));
} else {
this.setViewMode(this.viewMode - 1);
this.fill();
}
}
}
if (this.picker.is(':visible') && this._focused_from){
this._focused_from.focus();
}
delete this._focused_from;
},
dayCellClick: function(e){
var $target = $(e.currentTarget);
var timestamp = $target.data('date');
var date = new Date(timestamp);
if (this.o.updateViewDate) {
if (date.getUTCFullYear() !== this.viewDate.getUTCFullYear()) {
this._trigger('changeYear', this.viewDate);
}
if (date.getUTCMonth() !== this.viewDate.getUTCMonth()) {
this._trigger('changeMonth', this.viewDate);
}
}
this._setDate(date);
},
// Clicked on prev or next
navArrowsClick: function(e){
var $target = $(e.currentTarget);
var dir = $target.hasClass('prev') ? -1 : 1;
if (this.viewMode !== 0){
dir *= DPGlobal.viewModes[this.viewMode].navStep * 12;
}
this.viewDate = this.moveMonth(this.viewDate, dir);
this._trigger(DPGlobal.viewModes[this.viewMode].e, this.viewDate);
this.fill();
},
_toggle_multidate: function(date){
var ix = this.dates.contains(date);
if (!date){
this.dates.clear();
}
if (ix !== -1){
if (this.o.multidate === true || this.o.multidate > 1 || this.o.toggleActive){
this.dates.remove(ix);
}
} else if (this.o.multidate === false) {
this.dates.clear();
this.dates.push(date);
}
else {
this.dates.push(date);
}
if (typeof this.o.multidate === 'number')
while (this.dates.length > this.o.multidate)
this.dates.remove(0);
},
_setDate: function(date, which){
if (!which || which === 'date')
this._toggle_multidate(date && new Date(date));
if ((!which && this.o.updateViewDate) || which === 'view')
this.viewDate = date && new Date(date);
this.fill();
this.setValue();
if (!which || which !== 'view') {
this._trigger('changeDate');
}
this.inputField.trigger('change');
if (this.o.autoclose && (!which || which === 'date')){
this.hide();
}
},
moveDay: function(date, dir){
var newDate = new Date(date);
newDate.setUTCDate(date.getUTCDate() + dir);
return newDate;
},
moveWeek: function(date, dir){
return this.moveDay(date, dir * 7);
},
moveMonth: function(date, dir){
if (!isValidDate(date))
return this.o.defaultViewDate;
if (!dir)
return date;
var new_date = new Date(date.valueOf()),
day = new_date.getUTCDate(),
month = new_date.getUTCMonth(),
mag = Math.abs(dir),
new_month, test;
dir = dir > 0 ? 1 : -1;
if (mag === 1){
test = dir === -1
// If going back one month, make sure month is not current month
// (eg, Mar 31 -> Feb 31 == Feb 28, not Mar 02)
? function(){
return new_date.getUTCMonth() === month;
}
// If going forward one month, make sure month is as expected
// (eg, Jan 31 -> Feb 31 == Feb 28, not Mar 02)
: function(){
return new_date.getUTCMonth() !== new_month;
};
new_month = month + dir;
new_date.setUTCMonth(new_month);
// Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11
new_month = (new_month + 12) % 12;
}
else {
// For magnitudes >1, move one month at a time...
for (var i=0; i < mag; i++)
// ...which might decrease the day (eg, Jan 31 to Feb 28, etc)...
new_date = this.moveMonth(new_date, dir);
// ...then reset the day, keeping it in the new month
new_month = new_date.getUTCMonth();
new_date.setUTCDate(day);
test = function(){
return new_month !== new_date.getUTCMonth();
};
}
// Common date-resetting loop -- if date is beyond end of month, make it
// end of month
while (test()){
new_date.setUTCDate(--day);
new_date.setUTCMonth(new_month);
}
return new_date;
},
moveYear: function(date, dir){
return this.moveMonth(date, dir*12);
},
moveAvailableDate: function(date, dir, fn){
do {
date = this[fn](date, dir);
if (!this.dateWithinRange(date))
return false;
fn = 'moveDay';
}
while (this.dateIsDisabled(date));
return date;
},
weekOfDateIsDisabled: function(date){
return $.inArray(date.getUTCDay(), this.o.daysOfWeekDisabled) !== -1;
},
dateIsDisabled: function(date){
return (
this.weekOfDateIsDisabled(date) ||
$.grep(this.o.datesDisabled, function(d){
return isUTCEquals(date, d);
}).length > 0
);
},
dateWithinRange: function(date){
return date >= this.o.startDate && date <= this.o.endDate;
},
keydown: function(e){
if (!this.picker.is(':visible')){
if (e.keyCode === 40 || e.keyCode === 27) { // allow down to re-show picker
this.show();
e.stopPropagation();
}
return;
}
var dateChanged = false,
dir, newViewDate,
focusDate = this.focusDate || this.viewDate;
switch (e.keyCode){
case 27: // escape
if (this.focusDate){
this.focusDate = null;
this.viewDate = this.dates.get(-1) || this.viewDate;
this.fill();
}
else
this.hide();
e.preventDefault();
e.stopPropagation();
break;
case 37: // left
case 38: // up
case 39: // right
case 40: // down
if (!this.o.keyboardNavigation || this.o.daysOfWeekDisabled.length === 7)
break;
dir = e.keyCode === 37 || e.keyCode === 38 ? -1 : 1;
if (this.viewMode === 0) {
if (e.ctrlKey){
newViewDate = this.moveAvailableDate(focusDate, dir, 'moveYear');
if (newViewDate)
this._trigger('changeYear', this.viewDate);
} else if (e.shiftKey){
newViewDate = this.moveAvailableDate(focusDate, dir, 'moveMonth');
if (newViewDate)
this._trigger('changeMonth', this.viewDate);
} else if (e.keyCode === 37 || e.keyCode === 39){
newViewDate = this.moveAvailableDate(focusDate, dir, 'moveDay');
} else if (!this.weekOfDateIsDisabled(focusDate)){
newViewDate = this.moveAvailableDate(focusDate, dir, 'moveWeek');
}
} else if (this.viewMode === 1) {
if (e.keyCode === 38 || e.keyCode === 40) {
dir = dir * 4;
}
newViewDate = this.moveAvailableDate(focusDate, dir, 'moveMonth');
} else if (this.viewMode === 2) {
if (e.keyCode === 38 || e.keyCode === 40) {
dir = dir * 4;
}
newViewDate = this.moveAvailableDate(focusDate, dir, 'moveYear');
}
if (newViewDate){
this.focusDate = this.viewDate = newViewDate;
this.setValue();
this.fill();
e.preventDefault();
}
break;
case 13: // enter
if (!this.o.forceParse)
break;
focusDate = this.focusDate || this.dates.get(-1) || this.viewDate;
if (this.o.keyboardNavigation) {
this._toggle_multidate(focusDate);
dateChanged = true;
}
this.focusDate = null;
this.viewDate = this.dates.get(-1) || this.viewDate;
this.setValue();
this.fill();
if (this.picker.is(':visible')){
e.preventDefault();
e.stopPropagation();
if (this.o.autoclose)
this.hide();
}
break;
case 9: // tab
this.focusDate = null;
this.viewDate = this.dates.get(-1) || this.viewDate;
this.fill();
this.hide();
break;
}
if (dateChanged){
if (this.dates.length)
this._trigger('changeDate');
else
this._trigger('clearDate');
this.inputField.trigger('change');
}
},
setViewMode: function(viewMode){
this.viewMode = viewMode;
this.picker
.children('div')
.hide()
.filter('.datepicker-' + DPGlobal.viewModes[this.viewMode].clsName)
.show();
this.updateNavArrows();
this._trigger('changeViewMode', new Date(this.viewDate));
}
};
var DateRangePicker = function(element, options){
$.data(element, 'datepicker', this);
this.element = $(element);
this.inputs = $.map(options.inputs, function(i){
return i.jquery ? i[0] : i;
});
delete options.inputs;
this.keepEmptyValues = options.keepEmptyValues;
delete options.keepEmptyValues;
datepickerPlugin.call($(this.inputs), options)
.on('changeDate', $.proxy(this.dateUpdated, this));
this.pickers = $.map(this.inputs, function(i){
return $.data(i, 'datepicker');
});
this.updateDates();
};
DateRangePicker.prototype = {
updateDates: function(){
this.dates = $.map(this.pickers, function(i){
return i.getUTCDate();
});
this.updateRanges();
},
updateRanges: function(){
var range = $.map(this.dates, function(d){
return d.valueOf();
});
$.each(this.pickers, function(i, p){
p.setRange(range);
});
},
clearDates: function(){
$.each(this.pickers, function(i, p){
p.clearDates();
});
},
dateUpdated: function(e){
// `this.updating` is a workaround for preventing infinite recursion
// between `changeDate` triggering and `setUTCDate` calling. Until
// there is a better mechanism.
if (this.updating)
return;
this.updating = true;
var dp = $.data(e.target, 'datepicker');
if (dp === undefined) {
return;
}
var new_date = dp.getUTCDate(),
keep_empty_values = this.keepEmptyValues,
i = $.inArray(e.target, this.inputs),
j = i - 1,
k = i + 1,
l = this.inputs.length;
if (i === -1)
return;
$.each(this.pickers, function(i, p){
if (!p.getUTCDate() && (p === dp || !keep_empty_values))
p.setUTCDate(new_date);
});
if (new_date < this.dates[j]){
// Date being moved earlier/left
while (j >= 0 && new_date < this.dates[j]){
this.pickers[j--].setUTCDate(new_date);
}
} else if (new_date > this.dates[k]){
// Date being moved later/right
while (k < l && new_date > this.dates[k]){
this.pickers[k++].setUTCDate(new_date);
}
}
this.updateDates();
delete this.updating;
},
destroy: function(){
$.map(this.pickers, function(p){ p.destroy(); });
$(this.inputs).off('changeDate', this.dateUpdated);
delete this.element.data().datepicker;
},
remove: alias('destroy', 'Method `remove` is deprecated and will be removed in version 2.0. Use `destroy` instead')
};
function opts_from_el(el, prefix){
// Derive options from element data-attrs
var data = $(el).data(),
out = {}, inkey,
replace = new RegExp('^' + prefix.toLowerCase() + '([A-Z])');
prefix = new RegExp('^' + prefix.toLowerCase());
function re_lower(_,a){
return a.toLowerCase();
}
for (var key in data)
if (prefix.test(key)){
inkey = key.replace(replace, re_lower);
out[inkey] = data[key];
}
return out;
}
function opts_from_locale(lang){
// Derive options from locale plugins
var out = {};
// Check if "de-DE" style date is available, if not language should
// fallback to 2 letter code eg "de"
if (!dates[lang]){
lang = lang.split('-')[0];
if (!dates[lang])
return;
}
var d = dates[lang];
$.each(locale_opts, function(i,k){
if (k in d)
out[k] = d[k];
});
return out;
}
var old = $.fn.datepicker;
var datepickerPlugin = function(option){
var args = Array.apply(null, arguments);
args.shift();
var internal_return;
this.each(function(){
var $this = $(this),
data = $this.data('datepicker'),
options = typeof option === 'object' && option;
if (!data){
var elopts = opts_from_el(this, 'date'),
// Preliminary otions
xopts = $.extend({}, defaults, elopts, options),
locopts = opts_from_locale(xopts.language),
// Options priority: js args, data-attrs, locales, defaults
opts = $.extend({}, defaults, locopts, elopts, options);
if ($this.hasClass('input-daterange') || opts.inputs){
$.extend(opts, {
inputs: opts.inputs || $this.find('input').toArray()
});
data = new DateRangePicker(this, opts);
}
else {
data = new Datepicker(this, opts);
}
$this.data('datepicker', data);
}
if (typeof option === 'string' && typeof data[option] === 'function'){
internal_return = data[option].apply(data, args);
}
});
if (
internal_return === undefined ||
internal_return instanceof Datepicker ||
internal_return instanceof DateRangePicker
)
return this;
if (this.length > 1)
throw new Error('Using only allowed for the collection of a single element (' + option + ' function)');
else
return internal_return;
};
$.fn.datepicker = datepickerPlugin;
var defaults = $.fn.datepicker.defaults = {
assumeNearbyYear: false,
autoclose: false,
beforeShowDay: $.noop,
beforeShowMonth: $.noop,
beforeShowYear: $.noop,
beforeShowDecade: $.noop,
beforeShowCentury: $.noop,
calendarWeeks: false,
clearBtn: false,
toggleActive: false,
daysOfWeekDisabled: [],
daysOfWeekHighlighted: [],
datesDisabled: [],
endDate: Infinity,
forceParse: true,
format: 'mm/dd/yyyy',
keepEmptyValues: false,
keyboardNavigation: true,
language: 'en',
minViewMode: 0,
maxViewMode: 4,
multidate: false,
multidateSeparator: ',',
orientation: "auto",
rtl: false,
startDate: -Infinity,
startView: 0,
todayBtn: false,
todayHighlight: false,
updateViewDate: true,
weekStart: 0,
disableTouchKeyboard: false,
enableOnReadonly: true,
showOnFocus: true,
zIndexOffset: 10,
container: 'body',
immediateUpdates: false,
title: '',
templates: {
leftArrow: '«',
rightArrow: '»'
},
showWeekDays: true
};
var locale_opts = $.fn.datepicker.locale_opts = [
'format',
'rtl',
'weekStart'
];
$.fn.datepicker.Constructor = Datepicker;
var dates = $.fn.datepicker.dates = {
en: {
days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
today: "Today",
clear: "Clear",
titleFormat: "MM yyyy"
}
};
var DPGlobal = {
viewModes: [
{
names: ['days', 'month'],
clsName: 'days',
e: 'changeMonth'
},
{
names: ['months', 'year'],
clsName: 'months',
e: 'changeYear',
navStep: 1
},
{
names: ['years', 'decade'],
clsName: 'years',
e: 'changeDecade',
navStep: 10
},
{
names: ['decades', 'century'],
clsName: 'decades',
e: 'changeCentury',
navStep: 100
},
{
names: ['centuries', 'millennium'],
clsName: 'centuries',
e: 'changeMillennium',
navStep: 1000
}
],
validParts: /dd?|DD?|mm?|MM?|yy(?:yy)?/g,
nonpunctuation: /[^ -\/:-@\u5e74\u6708\u65e5\[-`{-~\t\n\r]+/g,
parseFormat: function(format){
if (typeof format.toValue === 'function' && typeof format.toDisplay === 'function')
return format;
// IE treats \0 as a string end in inputs (truncating the value),
// so it's a bad format delimiter, anyway
var separators = format.replace(this.validParts, '\0').split('\0'),
parts = format.match(this.validParts);
if (!separators || !separators.length || !parts || parts.length === 0){
throw new Error("Invalid date format.");
}
return {separators: separators, parts: parts};
},
parseDate: function(date, format, language, assumeNearby){
if (!date)
return undefined;
if (date instanceof Date)
return date;
if (typeof format === 'string')
format = DPGlobal.parseFormat(format);
if (format.toValue)
return format.toValue(date, format, language);
var fn_map = {
d: 'moveDay',
m: 'moveMonth',
w: 'moveWeek',
y: 'moveYear'
},
dateAliases = {
yesterday: '-1d',
today: '+0d',
tomorrow: '+1d'
},
parts, part, dir, i, fn;
if (date in dateAliases){
date = dateAliases[date];
}
if (/^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/i.test(date)){
parts = date.match(/([\-+]\d+)([dmwy])/gi);
date = new Date();
for (i=0; i < parts.length; i++){
part = parts[i].match(/([\-+]\d+)([dmwy])/i);
dir = Number(part[1]);
fn = fn_map[part[2].toLowerCase()];
date = Datepicker.prototype[fn](date, dir);
}
return Datepicker.prototype._zero_utc_time(date);
}
parts = date && date.match(this.nonpunctuation) || [];
function applyNearbyYear(year, threshold){
if (threshold === true)
threshold = 10;
// if year is 2 digits or less, than the user most likely is trying to get a recent century
if (year < 100){
year += 2000;
// if the new year is more than threshold years in advance, use last century
if (year > ((new Date()).getFullYear()+threshold)){
year -= 100;
}
}
return year;
}
var parsed = {},
setters_order = ['yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'd', 'dd'],
setters_map = {
yyyy: function(d,v){
return d.setUTCFullYear(assumeNearby ? applyNearbyYear(v, assumeNearby) : v);
},
m: function(d,v){
if (isNaN(d))
return d;
v -= 1;
while (v < 0) v += 12;
v %= 12;
d.setUTCMonth(v);
while (d.getUTCMonth() !== v)
d.setUTCDate(d.getUTCDate()-1);
return d;
},
d: function(d,v){
return d.setUTCDate(v);
}
},
val, filtered;
setters_map['yy'] = setters_map['yyyy'];
setters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m'];
setters_map['dd'] = setters_map['d'];
date = UTCToday();
var fparts = format.parts.slice();
// Remove noop parts
if (parts.length !== fparts.length){
fparts = $(fparts).filter(function(i,p){
return $.inArray(p, setters_order) !== -1;
}).toArray();
}
// Process remainder
function match_part(){
var m = this.slice(0, parts[i].length),
p = parts[i].slice(0, m.length);
return m.toLowerCase() === p.toLowerCase();
}
if (parts.length === fparts.length){
var cnt;
for (i=0, cnt = fparts.length; i < cnt; i++){
val = parseInt(parts[i], 10);
part = fparts[i];
if (isNaN(val)){
switch (part){
case 'MM':
filtered = $(dates[language].months).filter(match_part);
val = $.inArray(filtered[0], dates[language].months) + 1;
break;
case 'M':
filtered = $(dates[language].monthsShort).filter(match_part);
val = $.inArray(filtered[0], dates[language].monthsShort) + 1;
break;
}
}
parsed[part] = val;
}
var _date, s;
for (i=0; i < setters_order.length; i++){
s = setters_order[i];
if (s in parsed && !isNaN(parsed[s])){
_date = new Date(date);
setters_map[s](_date, parsed[s]);
if (!isNaN(_date))
date = _date;
}
}
}
return date;
},
formatDate: function(date, format, language){
if (!date)
return '';
if (typeof format === 'string')
format = DPGlobal.parseFormat(format);
if (format.toDisplay)
return format.toDisplay(date, format, language);
var val = {
d: date.getUTCDate(),
D: dates[language].daysShort[date.getUTCDay()],
DD: dates[language].days[date.getUTCDay()],
m: date.getUTCMonth() + 1,
M: dates[language].monthsShort[date.getUTCMonth()],
MM: dates[language].months[date.getUTCMonth()],
yy: date.getUTCFullYear().toString().substring(2),
yyyy: date.getUTCFullYear()
};
val.dd = (val.d < 10 ? '0' : '') + val.d;
val.mm = (val.m < 10 ? '0' : '') + val.m;
date = [];
var seps = $.extend([], format.separators);
for (var i=0, cnt = format.parts.length; i <= cnt; i++){
if (seps.length)
date.push(seps.shift());
date.push(val[format.parts[i]]);
}
return date.join('');
},
headTemplate: '<thead>'+
'<tr>'+
'<th colspan="7" class="datepicker-title"></th>'+
'</tr>'+
'<tr>'+
'<th class="prev">'+defaults.templates.leftArrow+'</th>'+
'<th colspan="5" class="datepicker-switch"></th>'+
'<th class="next">'+defaults.templates.rightArrow+'</th>'+
'</tr>'+
'</thead>',
contTemplate: '<tbody><tr><td colspan="7"></td></tr></tbody>',
footTemplate: '<tfoot>'+
'<tr>'+
'<th colspan="7" class="today"></th>'+
'</tr>'+
'<tr>'+
'<th colspan="7" class="clear"></th>'+
'</tr>'+
'</tfoot>'
};
DPGlobal.template = '<div class="datepicker">'+
'<div class="datepicker-days">'+
'<table class="table-condensed">'+
DPGlobal.headTemplate+
'<tbody></tbody>'+
DPGlobal.footTemplate+
'</table>'+
'</div>'+
'<div class="datepicker-months">'+
'<table class="table-condensed">'+
DPGlobal.headTemplate+
DPGlobal.contTemplate+
DPGlobal.footTemplate+
'</table>'+
'</div>'+
'<div class="datepicker-years">'+
'<table class="table-condensed">'+
DPGlobal.headTemplate+
DPGlobal.contTemplate+
DPGlobal.footTemplate+
'</table>'+
'</div>'+
'<div class="datepicker-decades">'+
'<table class="table-condensed">'+
DPGlobal.headTemplate+
DPGlobal.contTemplate+
DPGlobal.footTemplate+
'</table>'+
'</div>'+
'<div class="datepicker-centuries">'+
'<table class="table-condensed">'+
DPGlobal.headTemplate+
DPGlobal.contTemplate+
DPGlobal.footTemplate+
'</table>'+
'</div>'+
'</div>';
$.fn.datepicker.DPGlobal = DPGlobal;
/* DATEPICKER NO CONFLICT
* =================== */
$.fn.datepicker.noConflict = function(){
$.fn.datepicker = old;
return this;
};
/* DATEPICKER VERSION
* =================== */
$.fn.datepicker.version = '1.9.0';
$.fn.datepicker.deprecated = function(msg){
var console = window.console;
if (console && console.warn) {
console.warn('DEPRECATED: ' + msg);
}
};
/* DATEPICKER DATA-API
* ================== */
$(document).on(
'focus.datepicker.data-api click.datepicker.data-api',
'[data-provide="datepicker"]',
function(e){
var $this = $(this);
if ($this.data('datepicker'))
return;
e.preventDefault();
// component click requires us to explicitly show it
datepickerPlugin.call($this, 'show');
}
);
$(function(){
datepickerPlugin.call($('[data-provide="datepicker-inline"]'));
});
}));
================================================
FILE: app/assets/javascripts/bootstrap-tags.js
================================================
/*!
* bootstrap-tags 1.1.0
* https://github.com/maxwells/bootstrap-tags
* Copyright 2013 Max Lahey; Licensed MIT
*/
(function($) {
(function() {
window.Tags || (window.Tags = {});
jQuery(function() {
$.tags = function(element, options) {
var key, tag, tagData, value, _i, _len, _ref, _this = this;
if (options == null) {
options = {};
}
for (key in options) {
value = options[key];
this[key] = value;
}
this.bootstrapVersion || (this.bootstrapVersion = "3");
this.readOnly || (this.readOnly = false);
this.suggestions || (this.suggestions = []);
this.restrictTo = options.restrictTo != null ? options.restrictTo.concat(this.suggestions) : false;
this.exclude || (this.exclude = false);
this.displayPopovers = options.popovers != null ? true : options.popoverData != null;
this.popoverTrigger || (this.popoverTrigger = "hover");
this.tagClass || (this.tagClass = "btn-info");
this.tagSize || (this.tagSize = "md");
this.promptText || (this.promptText = "Enter tags...");
this.caseInsensitive || (this.caseInsensitive = false);
this.readOnlyEmptyMessage || (this.readOnlyEmptyMessage = "No tags to display...");
this.beforeAddingTag || (this.beforeAddingTag = function(tag) {});
this.afterAddingTag || (this.afterAddingTag = function(tag) {});
this.beforeDeletingTag || (this.beforeDeletingTag = function(tag) {});
this.afterDeletingTag || (this.afterDeletingTag = function(tag) {});
this.definePopover || (this.definePopover = function(tag) {
return 'associated content for "' + tag + '"';
});
this.excludes || (this.excludes = function() {
return false;
});
this.tagRemoved || (this.tagRemoved = function(tag) {});
this.pressedReturn || (this.pressedReturn = function(e) {});
this.pressedDelete || (this.pressedDelete = function(e) {});
this.pressedDown || (this.pressedDown = function(e) {});
this.pressedUp || (this.pressedUp = function(e) {});
this.$element = $(element);
if (options.tagData != null) {
this.tagsArray = options.tagData;
} else {
tagData = $(".tag-data", this.$element).html();
this.tagsArray = tagData != null ? tagData.split(",") : [];
}
if (options.popoverData) {
this.popoverArray = options.popoverData;
} else {
this.popoverArray = [];
_ref = this.tagsArray;
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
tag = _ref[_i];
this.popoverArray.push(null);
}
}
this.getTags = function() {
return _this.tagsArray;
};
this.getTagsContent = function() {
return _this.popoverArray;
};
this.getTagsWithContent = function() {
var combined, i, _j, _ref1;
combined = [];
for (i = _j = 0, _ref1 = _this.tagsArray.length - 1; 0 <= _ref1 ? _j <= _ref1 : _j >= _ref1; i = 0 <= _ref1 ? ++_j : --_j) {
combined.push({
tag: _this.tagsArray[i],
content: _this.popoverArray[i]
});
}
return combined;
};
this.getTag = function(tag) {
var index;
index = _this.tagsArray.indexOf(tag);
if (index > -1) {
return _this.tagsArray[index];
} else {
return null;
}
};
this.getTagWithContent = function(tag) {
var index;
index = _this.tagsArray.indexOf(tag);
return {
tag: _this.tagsArray[index],
content: _this.popoverArray[index]
};
};
this.hasTag = function(tag) {
return _this.tagsArray.indexOf(tag) > -1;
};
this.removeTagClicked = function(e) {
if (e.currentTarget.tagName === "A") {
_this.removeTag($("span", e.currentTarget.parentElement).html());
$(e.currentTarget.parentNode).remove();
}
return _this;
};
this.removeLastTag = function() {
_this.removeTag(_this.tagsArray[_this.tagsArray.length - 1]);
return _this;
};
this.removeTag = function(tag) {
if (_this.tagsArray.indexOf(tag) > -1) {
if (_this.beforeDeletingTag(tag) === false) {
return;
}
_this.popoverArray.splice(_this.tagsArray.indexOf(tag), 1);
_this.tagsArray.splice(_this.tagsArray.indexOf(tag), 1);
_this.renderTags();
_this.afterDeletingTag(tag);
}
return _this;
};
this.addTag = function(tag) {
var associatedContent;
if ((_this.restrictTo === false || _this.restrictTo.indexOf(tag) !== -1) && _this.tagsArray.indexOf(tag) < 0 && tag.length > 0 && (_this.exclude === false || _this.exclude.indexOf(tag) === -1) && !_this.excludes(tag)) {
if (_this.beforeAddingTag(tag) === false) {
return;
}
associatedContent = _this.definePopover(tag);
_this.popoverArray.push(associatedContent || null);
_this.tagsArray.push(tag);
_this.afterAddingTag(tag);
_this.renderTags();
}
return _this;
};
this.addTagWithContent = function(tag, content) {
if ((_this.restrictTo === false || _this.restrictTo.indexOf(tag) !== -1) && _this.tagsArray.indexOf(tag) < 0 && tag.length > 0) {
if (_this.beforeAddingTag(tag) === false) {
return;
}
_this.tagsArray.push(tag);
_this.popoverArray.push(content);
_this.afterAddingTag(tag);
_this.renderTags();
}
return _this;
};
this.renameTag = function(name, newName) {
_this.tagsArray[_this.tagsArray.indexOf(name)] = newName;
_this.renderTags();
return _this;
};
this.setPopover = function(tag, popoverContent) {
_this.popoverArray[_this.tagsArray.indexOf(tag)] = popoverContent;
_this.renderTags();
return _this;
};
this.keyDownHandler = function(e) {
var k, numSuggestions;
k = e.keyCode != null ? e.keyCode : e.which;
switch (k) {
case 13:
_this.pressedReturn(e);
tag = e.target.value;
if (_this.suggestedIndex !== -1) {
tag = _this.suggestionList[_this.suggestedIndex];
}
_this.addTag(tag);
e.target.value = "";
_this.renderTags();
return _this.hideSuggestions();
case 46:
case 8:
_this.pressedDelete(e);
if (e.target.value === "") {
_this.removeLastTag();
}
if (e.target.value.length === 1) {
return _this.hideSuggestions();
}
break;
case 40:
_this.pressedDown(e);
if (_this.input.val() === "" && (_this.suggestedIndex === -1 || _this.suggestedIndex == null)) {
_this.makeSuggestions(e, true);
}
numSuggestions = _this.suggestionList.length;
_this.suggestedIndex = _this.suggestedIndex < numSuggestions - 1 ? _this.suggestedIndex + 1 : numSuggestions - 1;
_this.selectSuggested(_this.suggestedIndex);
if (_this.suggestedIndex >= 0) {
return _this.scrollSuggested(_this.suggestedIndex);
}
break;
case 38:
_this.pressedUp(e);
_this.suggestedIndex = _this.suggestedIndex > 0 ? _this.suggestedIndex - 1 : 0;
_this.selectSuggested(_this.suggestedIndex);
if (_this.suggestedIndex >= 0) {
return _this.scrollSuggested(_this.suggestedIndex);
}
break;
case 9:
case 27:
_this.hideSuggestions();
return _this.suggestedIndex = -1;
}
};
this.keyUpHandler = function(e) {
var k;
k = e.keyCode != null ? e.keyCode : e.which;
if (k !== 40 && k !== 38 && k !== 27) {
return _this.makeSuggestions(e, false);
}
};
this.getSuggestions = function(str, overrideLengthCheck) {
var _this = this;
if (this.caseInsensitive) {
str = str.toLowerCase();
}
this.suggestionList = [];
$.each(this.suggestions, function(i, suggestion) {
var suggestionVal;
suggestionVal = _this.caseInsensitive ? suggestion.substring(0, str.length) : suggestion.substring(0, str.length).toLowerCase();
if (_this.tagsArray.indexOf(suggestion) < 0 && suggestionVal === str && (str.length > 0 || overrideLengthCheck)) {
return _this.suggestionList.push(suggestion);
}
});
return this.suggestionList;
};
this.makeSuggestions = function(e, overrideLengthCheck) {
var val;
val = e.target.value != null ? e.target.value : e.target.textContent;
_this.suggestedIndex = -1;
_this.$suggestionList.html("");
$.each(_this.getSuggestions(val, overrideLengthCheck), function(i, suggestion) {
return _this.$suggestionList.append(_this.template("tags_suggestion", {
suggestion: suggestion
}));
});
_this.$(".tags-suggestion").mouseover(_this.selectSuggestedMouseOver);
_this.$(".tags-suggestion").click(_this.suggestedClicked);
if (_this.suggestionList.length > 0) {
return _this.showSuggestions();
} else {
return _this.hideSuggestions();
}
};
this.suggestedClicked = function(e) {
tag = e.target.textContent;
if (_this.suggestedIndex !== -1) {
tag = _this.suggestionList[_this.suggestedIndex];
}
_this.addTag(tag);
_this.input.val("");
_this.makeSuggestions(e, false);
_this.input.focus();
return _this.hideSuggestions();
};
this.hideSuggestions = function() {
return _this.$(".tags-suggestion-list").css({
display: "none"
});
};
this.showSuggestions = function() {
return _this.$(".tags-suggestion-list").css({
display: "block"
});
};
this.selectSuggestedMouseOver = function(e) {
$(".tags-suggestion").removeClass("tags-suggestion-highlighted");
$(e.target).addClass("tags-suggestion-highlighted");
$(e.target).mouseout(_this.selectSuggestedMousedOut);
return _this.suggestedIndex = _this.$(".tags-suggestion").index($(e.target));
};
this.selectSuggestedMousedOut = function(e) {
return $(e.target).removeClass("tags-suggestion-highlighted");
};
this.selectSuggested = function(i) {
var tagElement;
$(".tags-suggestion").removeClass("tags-suggestion-highlighted");
tagElement = _this.$(".tags-suggestion").eq(i);
return tagElement.addClass("tags-suggestion-highlighted");
};
this.scrollSuggested = function(i) {
var pos, tagElement, topElement, topPos;
tagElement = _this.$(".tags-suggestion").eq(i);
topElement = _this.$(".tags-suggestion").eq(0);
pos = tagElement.position();
topPos = topElement.position();
if (pos != null) {
return _this.$(".tags-suggestion-list").scrollTop(pos.top - topPos.top);
}
};
this.adjustInputPosition = function() {
var pBottom, pLeft, pTop, pWidth, tagElement, tagPosition;
tagElement = _this.$(".tag").last();
tagPosition = tagElement.position();
pLeft = tagPosition != null ? tagPosition.left + tagElement.outerWidth(true) : 0;
pTop = tagPosition != null ? tagPosition.top : 0;
pWidth = _this.$element.width() - pLeft;
$(".tags-input", _this.$element).css({
paddingLeft: Math.max(pLeft, 0),
paddingTop: Math.max(pTop, 0),
width: pWidth
});
pBottom = tagPosition != null ? tagPosition.top + tagElement.outerHeight(true) : 22;
return _this.$element.css({
paddingBottom: pBottom - _this.$element.height()
});
};
this.renderTags = function() {
var tagList;
tagList = _this.$(".tags");
tagList.html("");
_this.input.attr("placeholder", _this.tagsArray.length === 0 ? _this.promptText : "");
$.each(_this.tagsArray, function(i, tag) {
tag = $(_this.formatTag(i, tag));
$("a", tag).click(_this.removeTagClicked);
$("a", tag).mouseover(_this.toggleCloseColor);
$("a", tag).mouseout(_this.toggleCloseColor);
if (_this.displayPopovers) {
_this.initializePopoverFor(tag, _this.tagsArray[i], _this.popoverArray[i]);
}
return tagList.append(tag);
});
return _this.adjustInputPosition();
};
this.renderReadOnly = function() {
var tagList;
tagList = _this.$(".tags");
tagList.html(_this.tagsArray.length === 0 ? _this.readOnlyEmptyMessage : "");
return $.each(_this.tagsArray, function(i, tag) {
tag = $(_this.formatTag(i, tag, true));
if (_this.displayPopovers) {
_this.initializePopoverFor(tag, _this.tagsArray[i], _this.popoverArray[i]);
}
return tagList.append(tag);
});
};
this.initializePopoverFor = function(tag, title, content) {
options = {
title: title,
content: content,
placement: "bottom"
};
if (_this.popoverTrigger === "hoverShowClickHide") {
$(tag).mouseover(function() {
$(tag).popover("show");
return $(".tag").not(tag).popover("hide");
});
$(document).click(function() {
return $(tag).popover("hide");
});
} else {
options.trigger = _this.popoverTrigger;
}
return $(tag).popover(options);
};
this.toggleCloseColor = function(e) {
var opacity, tagAnchor;
tagAnchor = $(e.currentTarget);
opacity = tagAnchor.css("opacity");
opacity = opacity < .8 ? 1 : .6;
return tagAnchor.css({
opacity: opacity
});
};
this.formatTag = function(i, tag, isReadOnly) {
var escapedTag;
if (isReadOnly == null) {
isReadOnly = false;
}
escapedTag = tag.replace("<", "<").replace(">", ">");
return _this.template("tag", {
tag: escapedTag,
tagClass: _this.tagClass,
isPopover: _this.displayPopovers,
isReadOnly: isReadOnly,
tagSize: _this.tagSize
});
};
this.addDocumentListeners = function() {
return $(document).mouseup(function(e) {
var container;
container = _this.$(".tags-suggestion-list");
if (container.has(e.target).length === 0) {
return _this.hideSuggestions();
}
});
};
this.template = function(name, options) {
return Tags.Templates.Template(this.getBootstrapVersion(), name, options);
};
this.$ = function(selector) {
return $(selector, this.$element);
};
this.getBootstrapVersion = function() {
return Tags.bootstrapVersion || this.bootstrapVersion;
};
this.initializeDom = function() {
return this.$element.append(this.template("tags_container"));
};
this.init = function() {
this.$element.addClass("bootstrap-tags").addClass("bootstrap-" + this.getBootstrapVersion());
this.initializeDom();
if (this.readOnly) {
this.renderReadOnly();
this.removeTag = function() {};
this.removeTagClicked = function() {};
this.removeLastTag = function() {};
this.addTag = function() {};
this.addTagWithContent = function() {};
this.renameTag = function() {};
return this.setPopover = function() {};
} else {
this.input = $(this.template("input", {
tagSize: this.tagSize
}));
this.input.keydown(this.keyDownHandler);
this.input.keyup(this.keyUpHandler);
this.$element.append(this.input);
this.$suggestionList = $(this.template("suggestion_list"));
this.$element.append(this.$suggestionList);
this.renderTags();
return this.addDocumentListeners();
}
};
this.init();
return this;
};
return $.fn.tags = function(options) {
var stopOn, tagsObject;
tagsObject = {};
stopOn = typeof options === "number" ? options : -1;
this.each(function(i, el) {
var $el;
$el = $(el);
if ($el.data("tags") == null) {
$el.data("tags", new $.tags(this, options));
}
if (stopOn === i || i === 0) {
return tagsObject = $el.data("tags");
}
});
return tagsObject;
};
});
}).call(this);
(function() {
window.Tags || (window.Tags = {});
Tags.Helpers || (Tags.Helpers = {});
Tags.Helpers.addPadding = function(string, amount, doPadding) {
if (amount == null) {
amount = 1;
}
if (doPadding == null) {
doPadding = true;
}
if (!doPadding) {
return string;
}
if (amount === 0) {
return string;
}
return Tags.Helpers.addPadding(" " + string + " ", amount - 1);
};
}).call(this);
(function() {
var _base;
window.Tags || (window.Tags = {});
Tags.Templates || (Tags.Templates = {});
(_base = Tags.Templates)["2"] || (_base["2"] = {});
Tags.Templates["2"].input = function(options) {
var tagSize;
if (options == null) {
options = {};
}
tagSize = function() {
switch (options.tagSize) {
case "sm":
return "small";
case "md":
return "medium";
case "lg":
return "large";
}
}();
return "<input type='text' class='tags-input input-" + tagSize + "' />";
};
}).call(this);
(function() {
var _base;
window.Tags || (window.Tags = {});
Tags.Templates || (Tags.Templates = {});
(_base = Tags.Templates)["2"] || (_base["2"] = {});
Tags.Templates["2"].tag = function(options) {
if (options == null) {
options = {};
}
return "<div class='tag label " + options.tagClass + " " + options.tagSize + "' " + (options.isPopover ? "rel='popover'" : "") + "> <span>" + Tags.Helpers.addPadding(options.tag, 2, options.isReadOnly) + "</span> " + (options.isReadOnly ? "" : "<a><i class='remove icon-remove-sign icon-white' /></a>") + " </div>";
};
}).call(this);
(function() {
var _base;
window.Tags || (window.Tags = {});
Tags.Templates || (Tags.Templates = {});
(_base = Tags.Templates)["3"] || (_base["3"] = {});
Tags.Templates["3"].input = function(options) {
if (options == null) {
options = {};
}
return "<input type='text' class='form-control tags-input input-" + options.tagSize + "' />";
};
}).call(this);
(function() {
var _base;
window.Tags || (window.Tags = {});
Tags.Templates || (Tags.Templates = {});
(_base = Tags.Templates)["3"] || (_base["3"] = {});
Tags.Templates["3"].tag = function(options) {
if (options == null) {
options = {};
}
return "<div class='tag label " + options.tagClass + " " + options.tagSize + "' " + (options.isPopover ? "rel='popover'" : "") + "> <span>" + Tags.Helpers.addPadding(options.tag, 2, options.isReadOnly) + "</span> " + (options.isReadOnly ? "" : "<a><i class='remove glyphicon glyphicon-remove-sign glyphicon-white' /></a>") + " </div>";
};
}).call(this);
(function() {
var _base;
window.Tags || (window.Tags = {});
Tags.Templates || (Tags.Templates = {});
(_base = Tags.Templates).shared || (_base.shared = {});
Tags.Templates.shared.suggestion_list = function(options) {
if (options == null) {
options = {};
}
return '<ul class="tags-suggestion-list dropdown-menu"></ul>';
};
}).call(this);
(function() {
var _base;
window.Tags || (window.Tags = {});
Tags.Templates || (Tags.Templates = {});
(_base = Tags.Templates).shared || (_base.shared = {});
Tags.Templates.shared.tags_container = function(options) {
if (options == null) {
options = {};
}
return '<div class="tags"></div>';
};
}).call(this);
(function() {
var _base;
window.Tags || (window.Tags = {});
Tags.Templates || (Tags.Templates = {});
(_base = Tags.Templates).shared || (_base.shared = {});
Tags.Templates.shared.tags_suggestion = function(options) {
if (options == null) {
options = {};
}
return "<li class='tags-suggestion'>" + options.suggestion + "</li>";
};
}).call(this);
(function() {
window.Tags || (window.Tags = {});
Tags.Templates || (Tags.Templates = {});
Tags.Templates.Template = function(version, templateName, options) {
if (Tags.Templates[version] != null) {
if (Tags.Templates[version][templateName] != null) {
return Tags.Templates[version][templateName](options);
}
}
return Tags.Templates.shared[templateName](options);
};
}).call(this);
})(window.jQuery);
================================================
FILE: app/assets/javascripts/bootstrap.js
================================================
/*!
* Bootstrap v3.4.1 (https://getbootstrap.com/)
* Copyright 2011-2019 Twitter, Inc.
* Licensed under the MIT license
*/
if (typeof jQuery === 'undefined') {
throw new Error('Bootstrap\'s JavaScript requires jQuery')
}
+function ($) {
'use strict';
var version = $.fn.jquery.split(' ')[0].split('.')
if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) {
throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4')
}
}(jQuery);
/* ========================================================================
* Bootstrap: transition.js v3.4.1
* https://getbootstrap.com/docs/3.4/javascript/#transitions
* ========================================================================
* Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
+function ($) {
'use strict';
// CSS TRANSITION SUPPORT (Shoutout: https://modernizr.com/)
// ============================================================
function transitionEnd() {
var el = document.createElement('bootstrap')
var transEndEventNames = {
WebkitTransition : 'webkitTransitionEnd',
MozTransition : 'transitionend',
OTransition : 'oTransitionEnd otransitionend',
transition : 'transitionend'
}
for (var name in transEndEventNames) {
if (el.style[name] !== undefined) {
return { end: transEndEventNames[name] }
}
}
return false // explicit for ie8 ( ._.)
}
// https://blog.alexmaccaw.com/css-transitions
$.fn.emulateTransitionEnd = function (duration) {
var called = false
var $el = this
$(this).one('bsTransitionEnd', function () { called = true })
var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
setTimeout(callback, duration)
return this
}
$(function () {
$.support.transition = transitionEnd()
if (!$.support.transition) return
$.event.special.bsTransitionEnd = {
bindType: $.support.transition.end,
delegateType: $.support.transition.end,
handle: function (e) {
if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
}
}
})
}(jQuery);
/* ========================================================================
* Bootstrap: alert.js v3.4.1
* https://getbootstrap.com/docs/3.4/javascript/#alerts
* ========================================================================
* Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
+function ($) {
'use strict';
// ALERT CLASS DEFINITION
// ======================
var dismiss = '[data-dismiss="alert"]'
var Alert = function (el) {
$(el).on('click', dismiss, this.close)
}
Alert.VERSION = '3.4.1'
Alert.TRANSITION_DURATION = 150
Alert.prototype.close = function (e) {
var $this = $(this)
var selector = $this.attr('data-target')
if (!selector) {
selector = $this.attr('href')
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
}
selector = selector === '#' ? [] : selector
var $parent = $(document).find(selector)
if (e) e.preventDefault()
if (!$parent.length) {
$parent = $this.closest('.alert')
}
$parent.trigger(e = $.Event('close.bs.alert'))
if (e.isDefaultPrevented()) return
$parent.removeClass('in')
function removeElement() {
// detach from parent, fire event then clean up data
$parent.detach().trigger('closed.bs.alert').remove()
}
$.support.transition && $parent.hasClass('fade') ?
$parent
.one('bsTransitionEnd', removeElement)
.emulateTransitionEnd(Alert.TRANSITION_DURATION) :
removeElement()
}
// ALERT PLUGIN DEFINITION
// =======================
function Plugin(option) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.alert')
if (!data) $this.data('bs.alert', (data = new Alert(this)))
if (typeof option == 'string') data[option].call($this)
})
}
var old = $.fn.alert
$.fn.alert = Plugin
$.fn.alert.Constructor = Alert
// ALERT NO CONFLICT
// =================
$.fn.alert.noConflict = function () {
$.fn.alert = old
return this
}
// ALERT DATA-API
// ==============
$(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
}(jQuery);
/* ========================================================================
* Bootstrap: button.js v3.4.1
* https://getbootstrap.com/docs/3.4/javascript/#buttons
* ========================================================================
* Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
+function ($) {
'use strict';
// BUTTON PUBLIC CLASS DEFINITION
// ==============================
var Button = function (element, options) {
this.$element = $(element)
this.options = $.extend({}, Button.DEFAULTS, options)
this.isLoading = false
}
Button.VERSION = '3.4.1'
Button.DEFAULTS = {
loadingText: 'loading...'
}
Button.prototype.setState = function (state) {
var d = 'disabled'
var $el = this.$element
var val = $el.is('input') ? 'val' : 'html'
var data = $el.data()
state += 'Text'
if (data.resetText == null) $el.data('resetText', $el[val]())
// push to event loop to allow forms to submit
setTimeout($.proxy(function () {
$el[val](data[state] == null ? this.options[state] : data[state])
if (state == 'loadingText') {
this.isLoading = true
$el.addClass(d).attr(d, d).prop(d, true)
} else if (this.isLoading) {
this.isLoading = false
$el.removeClass(d).removeAttr(d).prop(d, false)
}
}, this), 0)
}
Button.prototype.toggle = function () {
var changed = true
var $parent = this.$element.closest('[data-toggle="buttons"]')
if ($parent.length) {
var $input = this.$element.find('input')
if ($input.prop('type') == 'radio') {
if ($input.prop('checked')) changed = false
$parent.find('.active').removeClass('active')
this.$element.addClass('active')
} else if ($input.prop('type') == 'checkbox') {
if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false
this.$element.toggleClass('active')
}
$input.prop('checked', this.$element.hasClass('active'))
if (changed) $input.trigger('change')
} else {
this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
this.$element.toggleClass('active')
}
}
// BUTTON PLUGIN DEFINITION
// ========================
function Plugin(option) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.button')
var options = typeof option == 'object' && option
if (!data) $this.data('bs.button', (data = new Button(this, options)))
if (option == 'toggle') data.toggle()
else if (option) data.setState(option)
})
}
var old = $.fn.button
$.fn.button = Plugin
$.fn.button.Constructor = Button
// BUTTON NO CONFLICT
// ==================
$.fn.button.noConflict = function () {
$.fn.button = old
return this
}
// BUTTON DATA-API
// ===============
$(document)
.on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
var $btn = $(e.target).closest('.btn')
Plugin.call($btn, 'toggle')
if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) {
// Prevent double click on radios, and the double selections (so cancellation) on checkboxes
e.preventDefault()
// The target component still receive the focus
if ($btn.is('input,button')) $btn.trigger('focus')
else $btn.find('input:visible,button:visible').first().trigger('focus')
}
})
.on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
$(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
})
}(jQuery);
/* ========================================================================
* Bootstrap: carousel.js v3.4.1
* https://getbootstrap.com/docs/3.4/javascript/#carousel
* ========================================================================
* Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
+function ($) {
'use strict';
// CAROUSEL CLASS DEFINITION
// =========================
var Carousel = function (element, options) {
this.$element = $(element)
this.$indicators = this.$element.find('.carousel-indicators')
this.options = options
this.paused = null
this.sliding = null
this.interval = null
this.$active = null
this.$items = null
this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
.on('mouseenter.bs.carousel', $.proxy(this.pause, this))
.on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
}
Carousel.VERSION = '3.4.1'
Carousel.TRANSITION_DURATION = 600
Carousel.DEFAULTS = {
interval: 5000,
pause: 'hover',
wrap: true,
keyboard: true
}
Carousel.prototype.keydown = function (e) {
if (/input|textarea/i.test(e.target.tagName)) return
switch (e.which) {
case 37: this.prev(); break
case 39: this.next(); break
default: return
}
e.preventDefault()
}
Carousel.prototype.cycle = function (e) {
e || (this.paused = false)
this.interval && clearInterval(this.interval)
this.options.interval
&& !this.paused
&& (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
return this
}
Carousel.prototype.getItemIndex = function (item) {
this.$items = item.parent().children('.item')
return this.$items.index(item || this.$active)
}
Carousel.prototype.getItemForDirection = function (direction, active) {
var activeIndex = this.getItemIndex(active)
var willWrap = (direction == 'prev' && activeIndex === 0)
|| (direction == 'next' && activeIndex == (this.$items.length - 1))
if (willWrap && !this.options.wrap) return active
var delta = direction == 'prev' ? -1 : 1
var itemIndex = (activeIndex + delta) % this.$items.length
return this.$items.eq(itemIndex)
}
Carousel.prototype.to = function (pos) {
var that = this
var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
if (pos > (this.$items.length - 1) || pos < 0) return
if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
if (activeIndex == pos) return this.pause().cycle()
return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
}
Carousel.prototype.pause = function (e) {
e || (this.paused = true)
if (this.$element.find('.next, .prev').length && $.support.transition) {
this.$element.trigger($.support.transition.end)
this.cycle(true)
}
this.interval = clearInterval(this.interval)
return this
}
Carousel.prototype.next = function () {
if (this.sliding) return
return this.slide('next')
}
Carousel.prototype.prev = function () {
if (this.sliding) return
return this.slide('prev')
}
Carousel.prototype.slide = function (type, next) {
var $active = this.$element.find('.item.active')
var $next = next || this.getItemForDirection(type, $active)
var isCycling = this.interval
var direction = type == 'next' ? 'left' : 'right'
var that = this
if ($next.hasClass('active')) return (this.sliding = false)
var relatedTarget = $next[0]
var slideEvent = $.Event('slide.bs.carousel', {
relatedTarget: relatedTarget,
direction: direction
})
this.$element.trigger(slideEvent)
if (slideEvent.isDefaultPrevented()) return
this.sliding = true
isCycling && this.pause()
if (this.$indicators.length) {
this.$indicators.find('.active').removeClass('active')
var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
$nextIndicator && $nextIndicator.addClass('active')
}
var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
if ($.support.transition && this.$element.hasClass('slide')) {
$next.addClass(type)
if (typeof $next === 'object' && $next.length) {
$next[0].offsetWidth // force reflow
}
$active.addClass(direction)
$next.addClass(direction)
$active
.one('bsTransitionEnd', function () {
$next.removeClass([type, direction].join(' ')).addClass('active')
$active.removeClass(['active', direction].join(' '))
that.sliding = false
setTimeout(function () {
that.$element.trigger(slidEvent)
}, 0)
})
.emulateTransitionEnd(Carousel.TRANSITION_DURATION)
} else {
$active.removeClass('active')
$next.addClass('active')
this.sliding = false
this.$element.trigger(slidEvent)
}
isCycling && this.cycle()
return this
}
// CAROUSEL PLUGIN DEFINITION
// ==========================
function Plugin(option) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.carousel')
var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
var action = typeof option == 'string' ? option : options.slide
if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
if (typeof option == 'number') data.to(option)
else if (action) data[action]()
else if (options.interval) data.pause().cycle()
})
}
var old = $.fn.carousel
$.fn.carousel = Plugin
$.fn.carousel.Constructor = Carousel
// CAROUSEL NO CONFLICT
// ====================
$.fn.carousel.noConflict = function () {
$.fn.carousel = old
return this
}
// CAROUSEL DATA-API
// =================
var clickHandler = function (e) {
var $this = $(this)
var href = $this.attr('href')
if (href) {
href = href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
}
var target = $this.attr('data-target') || href
var $target = $(document).find(target)
if (!$target.hasClass('carousel')) return
var options = $.extend({}, $target.data(), $this.data())
var slideIndex = $this.attr('data-slide-to')
if (slideIndex) options.interval = false
Plugin.call($target, options)
if (slideIndex) {
$target.data('bs.carousel').to(slideIndex)
}
e.preventDefault()
}
$(document)
.on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
.on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
$(window).on('load', function () {
$('[data-ride="carousel"]').each(function () {
var $carousel = $(this)
Plugin.call($carousel, $carousel.data())
})
})
}(jQuery);
/* ========================================================================
* Bootstrap: collapse.js v3.4.1
* https://getbootstrap.com/docs/3.4/javascript/#collapse
* ========================================================================
* Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
/* jshint latedef: false */
+function ($) {
'use strict';
// COLLAPSE PUBLIC CLASS DEFINITION
// ================================
var Collapse = function (element, options) {
this.$element = $(element)
this.options = $.extend({}, Collapse.DEFAULTS, options)
this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
'[data-toggle="collapse"][data-target="#' + element.id + '"]')
this.transitioning = null
if (this.options.parent) {
this.$parent = this.getParent()
} else {
this.addAriaAndCollapsedClass(this.$element, this.$trigger)
}
if (this.options.toggle) this.toggle()
}
Collapse.VERSION = '3.4.1'
Collapse.TRANSITION_DURATION = 350
Collapse.DEFAULTS = {
toggle: true
}
Collapse.prototype.dimension = function () {
var hasWidth = this.$element.hasClass('width')
return hasWidth ? 'width' : 'height'
}
Collapse.prototype.show = function () {
if (this.transitioning || this.$element.hasClass('in')) return
var activesData
var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
if (actives && actives.length) {
activesData = actives.data('bs.collapse')
if (activesData && activesData.transitioning) return
}
var startEvent = $.Event('show.bs.collapse')
this.$element.trigger(startEvent)
if (startEvent.isDefaultPrevented()) return
if (actives && actives.length) {
Plugin.call(actives, 'hide')
activesData || actives.data('bs.collapse', null)
}
var dimension = this.dimension()
this.$element
.removeClass('collapse')
.addClass('collapsing')[dimension](0)
.attr('aria-expanded', true)
this.$trigger
.removeClass('collapsed')
.attr('aria-expanded', true)
this.transitioning = 1
var complete = function () {
this.$element
.removeClass('collapsing')
.addClass('collapse in')[dimension]('')
this.transitioning = 0
this.$element
.trigger('shown.bs.collapse')
}
if (!$.support.transition) return complete.call(this)
var scrollSize = $.camelCase(['scroll', dimension].join('-'))
this.$element
.one('bsTransitionEnd', $.proxy(complete, this))
.emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
}
Collapse.prototype.hide = function () {
if (this.transitioning || !this.$element.hasClass('in')) return
var startEvent = $.Event('hide.bs.collapse')
this.$element.trigger(startEvent)
if (startEvent.isDefaultPrevented()) return
var dimension = this.dimension()
this.$element[dimension](this.$element[dimension]())[0].offsetHeight
this.$element
.addClass('collapsing')
.removeClass('collapse in')
.attr('aria-expanded', false)
this.$trigger
.addClass('collapsed')
.attr('aria-expanded', false)
this.transitioning = 1
var complete = function () {
this.transitioning = 0
this.$element
.removeClass('collapsing')
.addClass('collapse')
.trigger('hidden.bs.collapse')
}
if (!$.support.transition) return complete.call(this)
this.$element
[dimension](0)
.one('bsTransitionEnd', $.proxy(complete, this))
.emulateTransitionEnd(Collapse.TRANSITION_DURATION)
}
Collapse.prototype.toggle = function () {
this[this.$element.hasClass('in') ? 'hide' : 'show']()
}
Collapse.prototype.getParent = function () {
return $(document).find(this.options.parent)
.find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
.each($.proxy(function (i, element) {
var $element = $(element)
this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
}, this))
.end()
}
Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
var isOpen = $element.hasClass('in')
$element.attr('aria-expanded', isOpen)
$trigger
.toggleClass('collapsed', !isOpen)
.attr('aria-expanded', isOpen)
}
function getTargetFromTrigger($trigger) {
var href
var target = $trigger.attr('data-target')
|| (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
return $(document).find(target)
}
// COLLAPSE PLUGIN DEFINITION
// ==========================
function Plugin(option) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.collapse')
var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
if (typeof option == 'string') data[option]()
})
}
var old = $.fn.collapse
$.fn.collapse = Plugin
$.fn.collapse.Constructor = Collapse
// COLLAPSE NO CONFLICT
// ====================
$.fn.collapse.noConflict = function () {
$.fn.collapse = old
return this
}
// COLLAPSE DATA-API
// =================
$(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
var $this = $(this)
if (!$this.attr('data-target')) e.preventDefault()
var $target = getTargetFromTrigger($this)
var data = $target.data('bs.collapse')
var option = data ? 'toggle' : $this.data()
Plugin.call($target, option)
})
}(jQuery);
/* ========================================================================
* Bootstrap: dropdown.js v3.4.1
* https://getbootstrap.com/docs/3.4/javascript/#dropdowns
* ========================================================================
* Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
+function ($) {
'use strict';
// DROPDOWN CLASS DEFINITION
// =========================
var backdrop = '.dropdown-backdrop'
var toggle = '[data-toggle="dropdown"]'
var Dropdown = function (element) {
$(element).on('click.bs.dropdown', this.toggle)
}
Dropdown.VERSION = '3.4.1'
function getParent($this) {
var selector = $this.attr('data-target')
if (!selector) {
selector = $this.attr('href')
selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
}
var $parent = selector !== '#' ? $(document).find(selector) : null
return $parent && $parent.length ? $parent : $this.parent()
}
function clearMenus(e) {
if (e && e.which === 3) return
$(backdrop).remove()
$(toggle).each(function () {
var $this = $(this)
var $parent = getParent($this)
var relatedTarget = { relatedTarget: this }
if (!$parent.hasClass('open')) return
if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return
$parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
if (e.isDefaultPrevented()) return
$this.attr('aria-expanded', 'false')
$parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))
})
}
Dropdown.prototype.toggle = function (e) {
var $this = $(this)
if ($this.is('.disabled, :disabled')) return
var $parent = getParent($this)
var isActive = $parent.hasClass('open')
clearMenus()
if (!isActive) {
if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
// if mobile we use a backdrop because click events don't delegate
$(document.createElement('div'))
.addClass('dropdown-backdrop')
.insertAfter($(this))
.on('click', clearMenus)
}
var relatedTarget = { relatedTarget: this }
$parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
if (e.isDefaultPrevented()) return
$this
.trigger('focus')
.attr('aria-expanded', 'true')
$parent
.toggleClass('open')
.trigger($.Event('shown.bs.dropdown', relatedTarget))
}
return false
}
Dropdown.prototype.keydown = function (e) {
if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
var $this = $(this)
e.preventDefault()
e.stopPropagation()
if ($this.is('.disabled, :disabled')) return
var $parent = getParent($this)
var isActive = $parent.hasClass('open')
if (!isActive && e.which != 27 || isActive && e.which == 27) {
if (e.which == 27) $parent.find(toggle).trigger('focus')
return $this.trigger('click')
}
var desc = ' li:not(.disabled):visible a'
var $items = $parent.find('.dropdown-menu' + desc)
if (!$items.length) return
var index = $items.index(e.target)
if (e.which == 38 && index > 0) index-- // up
if (e.which == 40 && index < $items.length - 1) index++ // down
if (!~index) index = 0
$items.eq(index).trigger('focus')
}
// DROPDOWN PLUGIN DEFINITION
// ==========================
function Plugin(option) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.dropdown')
if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
if (typeof option == 'string') data[option].call($this)
})
}
var old = $.fn.dropdown
$.fn.dropdown = Plugin
$.fn.dropdown.Constructor = Dropdown
// DROPDOWN NO CONFLICT
// ====================
$.fn.dropdown.noConflict = function () {
$.fn.dropdown = old
return this
}
// APPLY TO STANDARD DROPDOWN ELEMENTS
// ===================================
$(document)
.on('click.bs.dropdown.data-api', clearMenus)
.on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
.on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
.on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
.on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)
}(jQuery);
/* ========================================================================
* Bootstrap: modal.js v3.4.1
* https://getbootstrap.com/docs/3.4/javascript/#modals
* ========================================================================
* Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
+function ($) {
'use strict';
// MODAL CLASS DEFINITION
// ======================
var Modal = function (element, options) {
this.options = options
this.$body = $(document.body)
this.$element = $(element)
this.$dialog = this.$element.find('.modal-dialog')
this.$backdrop = null
this.isShown = null
this.originalBodyPad = null
this.scrollbarWidth = 0
this.ignoreBackdropClick = false
this.fixedContent = '.navbar-fixed-top, .navbar-fixed-bottom'
if (this.options.remote) {
this.$element
.find('.modal-content')
.load(this.options.remote, $.proxy(function () {
this.$element.trigger('loaded.bs.modal')
}, this))
}
}
Modal.VERSION = '3.4.1'
Modal.TRANSITION_DURATION = 300
Modal.BACKDROP_TRANSITION_DURATION = 150
Modal.DEFAULTS = {
backdrop: true,
keyboard: true,
show: true
}
Modal.prototype.toggle = function (_relatedTarget) {
return this.isShown ? this.hide() : this.show(_relatedTarget)
}
Modal.prototype.show = function (_relatedTarget) {
var that = this
var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
this.$element.trigger(e)
if (this.isShown || e.isDefaultPrevented()) return
this.isShown = true
this.checkScrollbar()
this.setScrollbar()
this.$body.addClass('modal-open')
this.escape()
this.resize()
this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
this.$dialog.on('mousedown.dismiss.bs.modal', function () {
that.$element.one('mouseup.dismiss.bs.modal', function (e) {
if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
})
})
this.backdrop(function () {
var transition = $.support.transition && that.$element.hasClass('fade')
if (!that.$element.parent().length) {
that.$element.appendTo(that.$body) // don't move modals dom position
}
that.$element
.show()
.scrollTop(0)
that.adjustDialog()
if (transition) {
that.$element[0].offsetWidth // force reflow
}
that.$element.addClass('in')
that.enforceFocus()
var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
transition ?
that.$dialog // wait for modal to slide in
.one('bsTransitionEnd', function () {
that.$element.trigger('focus').trigger(e)
})
.emulateTransitionEnd(Modal.TRANSITION_DURATION) :
that.$element.trigger('focus').trigger(e)
})
}
Modal.prototype.hide = function (e) {
if (e) e.preventDefault()
e = $.Event('hide.bs.modal')
this.$element.trigger(e)
if (!this.isShown || e.isDefaultPrevented()) return
this.isShown = false
this.escape()
this.resize()
$(document).off('focusin.bs.modal')
this.$element
.removeClass('in')
.off('click.dismiss.bs.modal')
.off('mouseup.dismiss.bs.modal')
this.$dialog.off('mousedown.dismiss.bs.modal')
$.support.transition && this.$element.hasClass('fade') ?
this.$element
.one('bsTransitionEnd', $.proxy(this.hideModal, this))
.emulateTransitionEnd(Modal.TRANSITION_DURATION) :
this.hideModal()
}
Modal.prototype.enforceFocus = function () {
$(document)
.off('focusin.bs.modal') // guard against infinite focus loop
.on('focusin.bs.modal', $.proxy(function (e) {
if (document !== e.target &&
this.$element[0] !== e.target &&
!this.$element.has(e.target).length) {
this.$element.trigger('focus')
}
}, this))
}
Modal.prototype.escape = function () {
if (this.isShown && this.options.keyboard) {
this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
e.which == 27 && this.hide()
}, this))
} else if (!this.isShown) {
this.$element.off('keydown.dismiss.bs.modal')
}
}
Modal.prototype.resize = function () {
if (this.isShown) {
$(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
} else {
$(window).off('resize.bs.modal')
}
}
Modal.prototype.hideModal = function () {
var that = this
this.$element.hide()
this.backdrop(function () {
that.$body.removeClass('modal-open')
that.resetAdjustments()
that.resetScrollbar()
that.$element.trigger('hidden.bs.modal')
})
}
Modal.prototype.removeBackdrop = function () {
this.$backdrop && this.$backdrop.remove()
this.$backdrop = null
}
Modal.prototype.backdrop = function (callback) {
var that = this
var animate = this.$element.hasClass('fade') ? 'fade' : ''
if (this.isShown && this.options.backdrop) {
var doAnimate = $.support.transition && animate
this.$backdrop = $(document.createElement('div'))
.addClass('modal-backdrop ' + animate)
.appendTo(this.$body)
this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
if (this.ignoreBackdropClick) {
this.ignoreBackdropClick = false
return
}
if (e.target !== e.currentTarget) return
this.options.backdrop == 'static'
? this.$element[0].focus()
: this.hide()
}, this))
if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
this.$backdrop.addClass('in')
if (!callback) return
doAnimate ?
this.$backdrop
.one('bsTransitionEnd', callback)
.emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
callback()
} else if (!this.isShown && this.$backdrop) {
this.$backdrop.removeClass('in')
var callbackRemove = function () {
that.removeBackdrop()
callback && callback()
}
$.support.transition && this.$element.hasClass('fade') ?
this.$backdrop
.one('bsTransitionEnd', callbackRemove)
.emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
callbackRemove()
} else if (callback) {
callback()
}
}
// these following methods are used to handle overflowing modals
Modal.prototype.handleUpdate = function () {
this.adjustDialog()
}
Modal.prototype.adjustDialog = function () {
var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
this.$element.css({
paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
})
}
Modal.prototype.resetAdjustments = function () {
this.$element.css({
paddingLeft: '',
paddingRight: ''
})
}
Modal.prototype.checkScrollbar = function () {
var fullWindowWidth = window.innerWidth
if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
var documentElementRect = document.documentElement.getBoundingClientRect()
fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
}
this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
this.scrollbarWidth = this.measureScrollbar()
}
Modal.prototype.setScrollbar = function () {
var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
this.originalBodyPad = document.body.style.paddingRight || ''
var scrollbarWidth = this.scrollbarWidth
if (this.bodyIsOverflowing) {
this.$body.css('padding-right', bodyPad + scrollbarWidth)
$(this.fixedContent).each(function (index, element) {
var actualPadding = element.style.paddingRight
var calculatedPadding = $(element).css('padding-right')
$(element)
.data('padding-right', actualPadding)
.css('padding-right', parseFloat(calculatedPadding) + scrollbarWidth + 'px')
})
}
}
Modal.prototype.resetScrollbar = function () {
this.$body.css('padding-right', this.originalBodyPad)
$(this.fixedContent).each(function (index, element) {
var padding = $(element).data('padding-right')
$(element).removeData('padding-right')
element.style.paddingRight = padding ? padding : ''
})
}
Modal.prototype.measureScrollbar = function () { // thx walsh
var scrollDiv = document.createElement('div')
scrollDiv.className = 'modal-scrollbar-measure'
this.$body.append(scrollDiv)
var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
this.$body[0].removeChild(scrollDiv)
return scrollbarWidth
}
// MODAL PLUGIN DEFINITION
// =======================
function Plugin(option, _relatedTarget) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.modal')
var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
if (typeof option == 'string') data[option](_relatedTarget)
else if (options.show) data.show(_relatedTarget)
})
}
var old = $.fn.modal
$.fn.modal = Plugin
$.fn.modal.Constructor = Modal
// MODAL NO CONFLICT
// =================
$.fn.modal.noConflict = function () {
$.fn.modal = old
return this
}
// MODAL DATA-API
// ==============
$(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
var $this = $(this)
var href = $this.attr('href')
var target = $this.attr('data-target') ||
(href && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
var $target = $(document).find(target)
var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
if ($this.is('a')) e.preventDefault()
$target.one('show.bs.modal', function (showEvent) {
if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
$target.one('hidden.bs.modal', function () {
$this.is(':visible') && $this.trigger('focus')
})
})
Plugin.call($target, option, this)
})
}(jQuery);
/* ========================================================================
* Bootstrap: tooltip.js v3.4.1
* https://getbootstrap.com/docs/3.4/javascript/#tooltip
* Inspired by the original jQuery.tipsy by Jason Frame
* ========================================================================
* Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
+function ($) {
'use strict';
var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']
var uriAttrs = [
'background',
'cite',
'href',
'itemtype',
'longdesc',
'poster',
'src',
'xlink:href'
]
var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i
var DefaultWhitelist = {
// Global attributes allowed on any supplied element below.
'*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
a: ['target', 'href', 'title', 'rel'],
area: [],
b: [],
br: [],
col: [],
code: [],
div: [],
em: [],
hr: [],
h1: [],
h2: [],
h3: [],
h4: [],
h5: [],
h6: [],
i: [],
img: ['src', 'alt', 'title', 'width', 'height'],
li: [],
ol: [],
p: [],
pre: [],
s: [],
small: [],
span: [],
sub: [],
sup: [],
strong: [],
u: [],
ul: []
}
/**
* A pattern that recognizes a commonly useful subset of URLs that are safe.
*
* Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
*/
var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi
/**
* A pattern that matches safe data URLs. Only matches image, video and audio types.
*
* Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
*/
var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i
function allowedAttribute(attr, allowedAttributeList) {
var attrName = attr.nodeName.toLowerCase()
if ($.inArray(attrName, allowedAttributeList) !== -1) {
if ($.inArray(attrName, uriAttrs) !== -1) {
return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN))
}
return true
}
var regExp = $(allowedAttributeList).filter(function (index, value) {
return value instanceof RegExp
})
// Check if a regular expression validates the attribute.
for (var i = 0, l = regExp.length; i < l; i++) {
if (attrName.match(regExp[i])) {
return true
}
}
return false
}
function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {
if (unsafeHtml.length === 0) {
return unsafeHtml
}
if (sanitizeFn && typeof sanitizeFn === 'function') {
return sanitizeFn(unsafeHtml)
}
// IE 8 and below don't support createHTMLDocument
if (!document.implementation || !document.implementation.createHTMLDocument) {
return unsafeHtml
}
var createdDocument = document.implementation.createHTMLDocument('sanitization')
createdDocument.body.innerHTML = unsafeHtml
var whitelistKeys = $.map(whiteList, function (el, i) { return i })
var elements = $(createdDocument.body).find('*')
for (var i = 0, len = elements.length; i < len; i++) {
var el = elements[i]
var elName = el.nodeName.toLowerCase()
if ($.inArray(elName, whitelistKeys) === -1) {
el.parentNode.removeChild(el)
continue
}
var attributeList = $.map(el.attributes, function (el) { return el })
var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])
for (var j = 0, len2 = attributeList.length; j < len2; j++) {
if (!allowedAttribute(attributeList[j], whitelistedAttributes)) {
el.removeAttribute(attributeList[j].nodeName)
}
}
}
return createdDocument.body.innerHTML
}
// TOOLTIP PUBLIC CLASS DEFINITION
// ===============================
var Tooltip = function (element, options) {
this.type = null
this.options = null
this.enabled = null
this.timeout = null
this.hoverState = null
t
gitextract_wh9nt73x/
├── .buildpacks
├── .codeclimate.yml
├── .coveralls.yml
├── .dockerignore
├── .eslintignore
├── .eslintrc
├── .gitignore
├── .rspec
├── .rubocop.yml
├── .rubocop_todo.yml
├── .ruby-gemset
├── .ruby-version
├── .semaphore/
│ └── semaphore.yml
├── .simplecov
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Dockerfile
├── Gemfile
├── LICENSE
├── Procfile
├── Procfile.dev
├── README.md
├── Rakefile
├── app/
│ ├── assets/
│ │ ├── builds/
│ │ │ └── .keep
│ │ ├── config/
│ │ │ └── manifest.js
│ │ ├── images/
│ │ │ └── .keep
│ │ ├── javascripts/
│ │ │ ├── application.js
│ │ │ ├── bootstrap-datepicker.js
│ │ │ ├── bootstrap-tags.js
│ │ │ ├── bootstrap.js
│ │ │ ├── controllers/
│ │ │ │ ├── application.js
│ │ │ │ ├── events_controller.js
│ │ │ │ ├── events_form_controller.js
│ │ │ │ ├── index.js
│ │ │ │ ├── projects_controller.js
│ │ │ │ └── projects_languages_controller.js
│ │ │ ├── cookies_banner.js
│ │ │ ├── disqus.js
│ │ │ ├── documents.js
│ │ │ ├── global-modules/
│ │ │ │ ├── accordion_collapse.js
│ │ │ │ ├── affix_navbar.js
│ │ │ │ ├── event_countdown.js
│ │ │ │ └── flash.js
│ │ │ ├── google-analytics.js
│ │ │ ├── hangout_play_on_hover.js
│ │ │ ├── inspectlet.js
│ │ │ ├── jq.js
│ │ │ ├── jquery-ui.js
│ │ │ ├── nprogress.js
│ │ │ ├── scrums.js
│ │ │ ├── search_toggle.js
│ │ │ ├── subscriptions.js
│ │ │ ├── typeahead.jquery.js
│ │ │ ├── users.js
│ │ │ └── websiteone.js
│ │ └── stylesheets/
│ │ ├── _mixins.scss
│ │ ├── _variables.scss
│ │ ├── actiontext.css
│ │ ├── actiontext.scss
│ │ ├── application.bootstrap.scss
│ │ ├── application.scss
│ │ ├── components/
│ │ │ ├── calendar-date.scss
│ │ │ ├── calendar-dropdown.scss
│ │ │ └── dropdown.scss
│ │ ├── global/
│ │ │ ├── articles.scss
│ │ │ ├── authentications.scss
│ │ │ ├── bootstrap-tags.scss
│ │ │ ├── bootstrap-tokenfield.min.scss
│ │ │ ├── confy.scss
│ │ │ ├── cubeportfolio.scss
│ │ │ ├── custom.scss
│ │ │ ├── custom_errors.scss
│ │ │ ├── docs.scss
│ │ │ ├── events.scss
│ │ │ ├── hangouts.scss
│ │ │ ├── hookups.scss
│ │ │ ├── nprogressbar.scss
│ │ │ ├── projects.scss
│ │ │ ├── round_banners.scss
│ │ │ ├── sidebar.scss
│ │ │ ├── social.scss
│ │ │ ├── sponsors.scss
│ │ │ ├── static_pages.scss
│ │ │ ├── tokenfield-typeahead.min.scss
│ │ │ └── users.scss
│ │ ├── jquery-ui.css
│ │ ├── jquery-ui.structure.css
│ │ ├── jquery-ui.theme.css
│ │ ├── layout/
│ │ │ ├── buttons.scss
│ │ │ ├── flash.scss
│ │ │ ├── footer.scss
│ │ │ ├── landing-page.scss
│ │ │ ├── navbar.scss
│ │ │ └── user_controls.scss
│ │ ├── main.scss
│ │ ├── subscriptions.scss
│ │ ├── timeline.scss
│ │ └── vanity.scss
│ ├── controllers/
│ │ ├── application_controller.rb
│ │ ├── articles_controller.rb
│ │ ├── authentications_controller.rb
│ │ ├── av_dashboard_tokens_controller.rb
│ │ ├── calendar_controller.rb
│ │ ├── cards_controller.rb
│ │ ├── concerns/
│ │ │ ├── .keep
│ │ │ ├── deactivated_user_finder.rb
│ │ │ └── statistics.rb
│ │ ├── cookies_controller.rb
│ │ ├── dashboard_controller.rb
│ │ ├── documents_controller.rb
│ │ ├── event_instances_controller.rb
│ │ ├── events_controller.rb
│ │ ├── legacy_api/
│ │ │ └── subscriptions_controller.rb
│ │ ├── paypal_agreement_controller.rb
│ │ ├── projects_controller.rb
│ │ ├── registrations_controller.rb
│ │ ├── scrums_controller.rb
│ │ ├── static_pages_controller.rb
│ │ ├── subscriptions_controller.rb
│ │ ├── users_controller.rb
│ │ ├── vanity_controller.rb
│ │ └── visitors_controller.rb
│ ├── helpers/
│ │ ├── application_helper.rb
│ │ ├── articles_helper.rb
│ │ ├── authentications_helper.rb
│ │ ├── cookies_helper.rb
│ │ ├── devise_helper.rb
│ │ ├── disqus_helper.rb
│ │ ├── documents_helper.rb
│ │ ├── event_helper.rb
│ │ ├── event_instances_helper.rb
│ │ ├── features.rb
│ │ ├── layout_helper.rb
│ │ ├── projects_helper.rb
│ │ ├── scrums_helper.rb
│ │ ├── static_pages_helper.rb
│ │ ├── subscriptions_helper.rb
│ │ ├── users_helper.rb
│ │ └── visitors_helper.rb
│ ├── jobs/
│ │ ├── application_job.rb
│ │ ├── github_commits_job.rb
│ │ ├── github_languages_job.rb
│ │ ├── github_last_updates_job.rb
│ │ ├── github_readme_files_job.rb
│ │ └── github_static_pages_job.rb
│ ├── mailers/
│ │ ├── .keep
│ │ ├── admin_mailer.rb
│ │ ├── application_mailer.rb
│ │ ├── mailer.rb
│ │ ├── project_mailer.rb
│ │ └── sandbox_email_interceptor.rb
│ ├── models/
│ │ ├── .keep
│ │ ├── application_record.rb
│ │ ├── article.rb
│ │ ├── authentication.rb
│ │ ├── commit_count.rb
│ │ ├── concerns/
│ │ │ ├── .keep
│ │ │ ├── act_as_page.rb
│ │ │ ├── filterable.rb
│ │ │ └── user_nullable.rb
│ │ ├── contact_form.rb
│ │ ├── document.rb
│ │ ├── event.rb
│ │ ├── event_date.rb
│ │ ├── event_instance.rb
│ │ ├── follow.rb
│ │ ├── hangout_participants_snapshot.rb
│ │ ├── issue_tracker.rb
│ │ ├── karma.rb
│ │ ├── language.rb
│ │ ├── language_project.rb
│ │ ├── null_user.rb
│ │ ├── payment_source.rb
│ │ ├── plan.rb
│ │ ├── premium.rb
│ │ ├── premium_f2_f.rb
│ │ ├── premium_mob.rb
│ │ ├── premium_plus.rb
│ │ ├── project.rb
│ │ ├── slack_channel.rb
│ │ ├── source_repository.rb
│ │ ├── static_page.rb
│ │ ├── status.rb
│ │ ├── subscription.rb
│ │ └── user.rb
│ ├── presenters/
│ │ ├── base_presenter.rb
│ │ ├── event_instance_presenter.rb
│ │ └── users/
│ │ └── user_presenter.rb
│ ├── services/
│ │ ├── add_subscription_to_user_for_plan.rb
│ │ ├── error_logging_service.rb
│ │ ├── hangout_notification_service.rb
│ │ ├── karma_calculator.rb
│ │ ├── markdown_converter.rb
│ │ ├── modify_event_participation.rb
│ │ ├── paypal_service.rb
│ │ └── youtube_notification_service.rb
│ └── views/
│ ├── active_storage/
│ │ └── blobs/
│ │ └── _blob.html.erb
│ ├── admin_mailer/
│ │ └── failed_to_invite_user_to_slack.html.erb
│ ├── application/
│ │ └── _edit_card.html.erb
│ ├── articles/
│ │ ├── _article.html.erb
│ │ ├── _form.html.erb
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ ├── preview.html.erb
│ │ └── show.html.erb
│ ├── av_dashboard_tokens/
│ │ └── create.html.erb
│ ├── cards/
│ │ ├── create.html.erb
│ │ ├── edit.html.erb
│ │ ├── new.html.erb
│ │ └── update.html.erb
│ ├── cookies/
│ │ └── index.html.erb
│ ├── dashboard/
│ │ └── index.html.erb
│ ├── devise/
│ │ ├── confirmations/
│ │ │ └── new.html.erb
│ │ ├── mailer/
│ │ │ ├── confirmation_instructions.html.erb
│ │ │ ├── reset_password_instructions.html.erb
│ │ │ └── unlock_instructions.html.erb
│ │ ├── passwords/
│ │ │ ├── edit.html.erb
│ │ │ └── new.html.erb
│ │ ├── registrations/
│ │ │ ├── _destroy_modal.html.erb
│ │ │ ├── _preview.html.erb
│ │ │ ├── edit.html.erb
│ │ │ └── new.html.erb
│ │ ├── sessions/
│ │ │ └── new.html.erb
│ │ ├── shared/
│ │ │ └── _links.erb
│ │ └── unlocks/
│ │ └── new.html.erb
│ ├── disqus/
│ │ └── _disqus.html.erb
│ ├── documents/
│ │ ├── _categories.html.erb
│ │ ├── _form.html.erb
│ │ ├── edit.html.erb
│ │ ├── new.html.erb
│ │ ├── show.html.erb
│ │ └── show.json.jbuilder
│ ├── errors/
│ │ └── unacceptable.html.erb
│ ├── event_instances/
│ │ ├── _hangout_button.html.erb
│ │ ├── _hangout_status.html.erb
│ │ ├── _hangouts.html.erb
│ │ ├── _index_basic_info.html.erb
│ │ ├── _index_extra_info.html.erb
│ │ ├── _index_header.html.erb
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ └── index.js.erb
│ ├── events/
│ │ ├── _form.html.erb
│ │ ├── _hangouts_management.html.erb
│ │ ├── _repeats_weekly_options.html.erb
│ │ ├── _videos.html.erb
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── index.json.jbuilder
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── hookups/
│ │ └── index.html.erb
│ ├── layouts/
│ │ ├── _activity_wrapper.html.erb
│ │ ├── _adwords_signup_conversion.html.erb
│ │ ├── _cookies_banner.html.erb
│ │ ├── _escalating_call_to_action.html.erb
│ │ ├── _event_link.html.erb
│ │ ├── _flash.html.erb
│ │ ├── _footer.html.erb
│ │ ├── _head.html.erb
│ │ ├── _hire_me.html.erb
│ │ ├── _meta_tags.html.erb
│ │ ├── _navbar.html.erb
│ │ ├── _require_users_profile.html.erb
│ │ ├── _round_banners.html.erb
│ │ ├── _sidebar.html.erb
│ │ ├── _sponsors.html.erb
│ │ ├── action_text/
│ │ │ └── contents/
│ │ │ └── _content.html.erb
│ │ ├── application.html.erb
│ │ ├── articles_layout.html.erb
│ │ ├── mailer.html.erb
│ │ ├── mailer.text.erb
│ │ ├── user_profile_layout.html.erb
│ │ ├── with_sidebar.html.erb
│ │ └── with_sidebar_sponsor_right.html.erb
│ ├── legacy_api/
│ │ └── subscriptions/
│ │ └── index.json.jbuilder
│ ├── mailer/
│ │ ├── hire_me_form.html.erb
│ │ ├── send_premium_payment_complete.html.erb
│ │ ├── send_sponsor_premium_payment_complete.html.erb
│ │ └── send_welcome_message.html.erb
│ ├── pages/
│ │ ├── about-us.html.erb
│ │ ├── berkeley-fall-2012-projects.html.erb
│ │ ├── code.html.erb
│ │ ├── cs-degree-online.html.erb
│ │ ├── free.html.erb
│ │ ├── getting-started.html.erb
│ │ ├── grow.html.erb
│ │ ├── guides.html.erb
│ │ ├── learn1.html.erb
│ │ ├── pair.html.erb
│ │ ├── personal-tuition-service.html.erb
│ │ ├── premium.html.erb
│ │ ├── premium_f2f.html.erb
│ │ ├── premium_mob.html.erb
│ │ ├── premium_plus.html.erb
│ │ ├── pricing.html.erb
│ │ ├── remote-pair-programming/
│ │ │ ├── analysis.html.erb
│ │ │ ├── c9-howto.html.erb
│ │ │ ├── creating-a-pp-event-on-g.html.erb
│ │ │ ├── example-videos.html.erb
│ │ │ ├── gnu-screen-pairing-notes.html.erb
│ │ │ ├── pair-programming-calendar.html.erb
│ │ │ ├── pair-programming-form.html.erb
│ │ │ ├── pair-programming-help-videos.html.erb
│ │ │ ├── pair-programming-protocols/
│ │ │ │ ├── classroom-guidelines.html.erb
│ │ │ │ └── github-pong.html.erb
│ │ │ └── pair-programming-protocols.html.erb
│ │ ├── remote-pair-programming.html.erb
│ │ ├── saas-ells-screencasts.html.erb
│ │ ├── sortable-ells-errata.html.erb
│ │ ├── sponsors.html.erb
│ │ └── ubuntu-bash-help.html.erb
│ ├── project_mailer/
│ │ ├── alert_project_creator_about_new_member.html.erb
│ │ ├── alert_project_creator_about_new_member.text.erb
│ │ ├── welcome_project_joinee.html.erb
│ │ └── welcome_project_joinee.text.erb
│ ├── projects/
│ │ ├── _activity.html.erb
│ │ ├── _connections.html.erb
│ │ ├── _documents_list.html.erb
│ │ ├── _form.html.erb
│ │ ├── _highlight_box.html.erb
│ │ ├── _issue_tracker_fields.html.erb
│ │ ├── _listing.html.erb
│ │ ├── _members_list.html.erb
│ │ ├── _source_repository_fields.html.erb
│ │ ├── _videos_list.html.erb
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ ├── pending_projects.html.erb
│ │ └── show.html.erb
│ ├── public_activity/
│ │ ├── article/
│ │ │ ├── _create.html.erb
│ │ │ └── _update.html.erb
│ │ ├── document/
│ │ │ ├── _create.html.erb
│ │ │ └── _update.html.erb
│ │ └── project/
│ │ ├── _create.html.erb
│ │ └── _update.html.erb
│ ├── scrums/
│ │ └── index.html.erb
│ ├── static_pages/
│ │ ├── internal_error.html.erb
│ │ ├── not_found.html.erb
│ │ ├── premium.html.erb
│ │ ├── premium_f2f.html.erb
│ │ ├── premium_mob.html.erb
│ │ └── show.html.erb
│ ├── subscriptions/
│ │ ├── create.html.erb
│ │ ├── new.html.erb
│ │ └── update.html.erb
│ ├── users/
│ │ ├── _user_avatar.html.erb
│ │ ├── _user_list.html.erb
│ │ ├── index.html.erb
│ │ ├── index.js.erb
│ │ ├── profile/
│ │ │ ├── _detail.html.erb
│ │ │ ├── _modal.html.erb
│ │ │ ├── _premium_mob_upgrade.html.erb
│ │ │ ├── _premium_plus_upgrade.html.erb
│ │ │ ├── _premium_upgrade.html.erb
│ │ │ ├── _set_level.html.erb
│ │ │ ├── _summary.html.erb
│ │ │ └── _videos.html.erb
│ │ └── show.html.erb
│ └── visitors/
│ ├── _text_and_image_trail.html.erb
│ ├── _text_trail.html.erb
│ └── index.html.erb
├── app.json
├── bin/
│ ├── bundle
│ ├── dev
│ ├── rails
│ ├── rake
│ ├── setup
│ ├── update
│ └── yarn
├── cloudbuild.yaml
├── coffeelint.json
├── config/
│ ├── application.rb
│ ├── boot.rb
│ ├── cable.yml
│ ├── credentials.yml.enc
│ ├── cucumber.yml
│ ├── database.yml
│ ├── environment.rb
│ ├── environments/
│ │ ├── development.rb
│ │ ├── production.rb
│ │ └── test.rb
│ ├── initializers/
│ │ ├── airbrake.rb
│ │ ├── apipie.rb
│ │ ├── application_controller_renderer.rb
│ │ ├── assets.rb
│ │ ├── backtrace_silencers.rb
│ │ ├── config.rb
│ │ ├── content_security_policy.rb
│ │ ├── cookies_serializer.rb
│ │ ├── cucumber.rb
│ │ ├── devise.rb
│ │ ├── exception_notification.rb
│ │ ├── filter_parameter_logging.rb
│ │ ├── friendly_id.rb
│ │ ├── geocoder.rb
│ │ ├── inflections.rb
│ │ ├── jvectormap.rb
│ │ ├── mime_types.rb
│ │ ├── new_framework_defaults_5_2.rb
│ │ ├── new_framework_defaults_6_1.rb
│ │ ├── new_framework_defaults_7_0.rb
│ │ ├── omniauth.rb
│ │ ├── permissions_policy.rb
│ │ ├── recaptcha.rb
│ │ ├── reload_api.rb
│ │ ├── sandbox_email_interceptor.rb
│ │ ├── secret_token.rb
│ │ ├── session_store.rb
│ │ ├── slack.rb
│ │ ├── stripe.rb
│ │ ├── vcr.rb
│ │ ├── website_one.rb
│ │ ├── wrap_parameters.rb
│ │ ├── youtube.rb
│ │ └── yt.rb
│ ├── locales/
│ │ ├── devise.en.yml
│ │ └── en.yml
│ ├── nested_key_extension.rb
│ ├── puma.rb
│ ├── routes.rb
│ ├── settings/
│ │ ├── development.yml
│ │ ├── production.yml
│ │ └── test.yml
│ ├── settings.local.yml.example
│ ├── settings.yml
│ ├── spring.rb
│ ├── storage.yml
│ ├── vanity.yml
│ └── zeus/
│ └── custom_plan.rb
├── config.ru
├── db/
│ ├── migrate/
│ │ ├── 20140109040839_devise_create_users.rb
│ │ ├── 20140110123347_create_projects.rb
│ │ ├── 20140116112830_create_documents.rb
│ │ ├── 20140118045711_change_projects_attributes.rb
│ │ ├── 20140120014041_add_first_last_names_to_users.rb
│ │ ├── 20140124205750_add_parent_id_to_documents.rb
│ │ ├── 20140124213333_create_authentications.rb
│ │ ├── 20140127043432_acts_as_follower_migration.rb
│ │ ├── 20140130073721_add_created_by_to_documents.rb
│ │ ├── 20140130073828_add_created_by_to_projects.rb
│ │ ├── 20140207004506_add_display_email_to_users.rb
│ │ ├── 20140207033343_add_you_tube_id_to_user.rb
│ │ ├── 20140207190458_add_slugs_to_models.rb
│ │ ├── 20140209164254_add_display_profile_to_users.rb
│ │ ├── 20140215192014_acts_as_taggable_on_migration.rb
│ │ ├── 20140219145424_create_articles.rb
│ │ ├── 20140220091703_add_latitude_and_longitude_to_user.rb
│ │ ├── 20140220131347_add_country_region_city_to_user.rb
│ │ ├── 20140225000044_create_versions.rb
│ │ ├── 20140225215805_create_events.rb
│ │ ├── 20140304210808_add_youtube_user_name_to_user.rb
│ │ ├── 20140305125426_add_current_hoa_url_to_events.rb
│ │ ├── 20140309133549_add_github_profile_url.rb
│ │ ├── 20140311052222_add_pivotaltracker_id_to_projects.rb
│ │ ├── 20140313161712_replace_document_index.rb
│ │ ├── 20140317093616_add_display_hire_me_to_users.rb
│ │ ├── 20140319173130_add_bio_to_users.rb
│ │ ├── 20140322120003_create_pages.rb
│ │ ├── 20140324210924_add_github_url_to_projects.rb
│ │ ├── 20140324211134_add_pivotaltracker_url_to_projects.rb
│ │ ├── 20140402091353_add_slug_to_events.rb
│ │ ├── 20140404100037_remove_pivotaltracker_id_from_projects.rb
│ │ ├── 20140414125301_add_email_option_to_user.rb
│ │ ├── 20140417124942_acts_as_votable_migration.rb
│ │ ├── 20140427074629_add_missing_unique_indices.acts_as_taggable_on_engine.rb
│ │ ├── 20140427074630_add_taggings_counter_cache_to_tags.acts_as_taggable_on_engine.rb
│ │ ├── 20140525135633_add_karma_to_users.rb
│ │ ├── 20140606204845_create_hangouts.rb
│ │ ├── 20140615154859_add_indexes_for_references.rb
│ │ ├── 20140618153610_create_commit_counts.rb
│ │ ├── 20140707211758_add_category_to_hangout.rb
│ │ ├── 20140716134701_import_getting_started_static_page.rb
│ │ ├── 20140725131327_event_combine_date_and_time_fields.rb
│ │ ├── 20140730123120_add_project_and_host_to_hangout.rb
│ │ ├── 20140910225619_add_exclusions_to_events.rb
│ │ ├── 20140913021637_add_pitch_to_projects.rb
│ │ ├── 20140913183322_change_column.rb
│ │ ├── 20140914202645_create_activities.rb
│ │ ├── 20140917070939_rename_hangouts_to_event_instances.rb
│ │ ├── 20140929201012_create_statuses.rb
│ │ ├── 20141002084933_create_newsletters.rb
│ │ ├── 20141007192312_add_commit_count_to_projects.rb
│ │ ├── 20141013191112_add_attributes_to_users.rb
│ │ ├── 20141119002743_add_image_url_to_projects.rb
│ │ ├── 20150208124239_add_timezone_offset_to_users.rb
│ │ ├── 20150308085306_add_missing_taggable_index.acts_as_taggable_on_engine.rb
│ │ ├── 20150308085307_change_collation_for_tag_names.acts_as_taggable_on_engine.rb
│ │ ├── 20150410173625_add_status_count_to_users.rb
│ │ ├── 20150520184236_add_hoa_status_to_event_instances.rb
│ │ ├── 20160316153919_add_project_to_events.rb
│ │ ├── 20160627134611_add_creator_to_events.rb
│ │ ├── 20160831131548_add_stripe_customer_i_dto_users.rb
│ │ ├── 20160921152810_create_karmas.rb
│ │ ├── 20160923135850_add_subscriptions.rb
│ │ ├── 20160923145243_add_payment_sources.rb
│ │ ├── 20160928132707_remove_karma_from_user_table.rb
│ │ ├── 20160928134250_rename_karma_karma_to_total.rb
│ │ ├── 20160928152822_add_hangout_participants_snapshots.rb
│ │ ├── 20161028144621_add_url_set_directly_column_to_event_instance.rb
│ │ ├── 20161103011445_create_friendly_id_slugs.rb
│ │ ├── 20161122200727_add_deleted_at_to_users.rb
│ │ ├── 20161128165206_add_last_commit_at_to_projects.rb
│ │ ├── 20161218160338_create_plans.rb
│ │ ├── 20161221125828_add_plan_to_subscription.rb
│ │ ├── 20161221182758_remove_stripe_customer_from_user.rb
│ │ ├── 20161223092205_add_youtube_tweeet_sent_to_event_instances.rb
│ │ ├── 20170115171525_add_category_column_to_plans.rb
│ │ ├── 20170918083218_create_source_repositories.rb
│ │ ├── 20171118201937_add_sponsor_column_to_subscription.rb
│ │ ├── 20180121175914_add_for_column_to_events.rb
│ │ ├── 20180406015134_add_event_participation_count_to_users.rb
│ │ ├── 20180507045056_add_column_modifier_id_to_events.rb
│ │ ├── 20180514105034_set_users_receive_mailings_default_false.rb
│ │ ├── 20180515093331_remove_newsletter.rb
│ │ ├── 20180729040001_add_slack_channel_name_to_projects.rb
│ │ ├── 20180730173345_add_creator_attendance_to_events.rb
│ │ ├── 20180803173355_add_can_see_dashboard_to_users.rb
│ │ ├── 20180810180605_add_karma_breakdown_elements_to_karma_table.rb
│ │ ├── 20180813125658_create_languages.rb
│ │ ├── 20180828145628_vanity_migration.rb
│ │ ├── 20181220155404_create_slack_channel.rb
│ │ ├── 20181220160421_create_join_table_project_slack_channel.rb
│ │ ├── 20190129191454_add_paypal_id_to_plans.rb
│ │ ├── 20190311230108_create_issue_trackers.rb
│ │ ├── 20190412143519_create_join_table_events_slack_channel.rb
│ │ ├── 20210702172212_drop_vanity_tables.rb
│ │ ├── 20210721093118_add_admin_to_users.rb
│ │ ├── 20221215192333_change_exclusions_in_events.rb
│ │ ├── 20221215193425_change_participants_in_event_instances.rb
│ │ ├── 20230314192607_create_active_storage_tables.active_storage.rb
│ │ └── 20230314193359_create_action_text_tables.action_text.rb
│ ├── schema.rb
│ ├── seeds/
│ │ ├── event_instances.rb
│ │ └── events.rb
│ └── seeds.rb
├── docker/
│ ├── README.md
│ ├── setup.sh
│ ├── start.sh
│ └── stop.sh
├── docker-compose.yml
├── docker-entrypoint.sh
├── docs/
│ ├── README.md
│ ├── adding_title_to_page_view.md
│ ├── c9/
│ │ └── install_notes.md
│ ├── cert_renewal_heroku.md
│ ├── code_style_conventions.md
│ ├── create_tags_for_project.md
│ ├── current_staging_servers.md
│ ├── deploy.md
│ ├── development_environment_set_up.md
│ ├── domain_vision_statement.md
│ ├── expanded_mission_statement.md
│ ├── features_and_implementation_map.md
│ ├── how_to_setup_av_dashboard_token_endpoint.md
│ ├── how_to_submit_a_pull_request_on_github.md
│ ├── mission_statement.md
│ ├── osx/
│ │ └── el_capitan_10.11.2_install_notes.md
│ ├── project_coordination_outline.md
│ ├── project_setup.md
│ ├── project_wishlist.md
│ ├── rails_asset_pipeline.md
│ ├── scrum_minutes.md
│ ├── solutions_for_signup_issues.md
│ ├── sponsorship.md
│ ├── sprint_retrospective.md
│ ├── sprint_review.md
│ ├── thoughts_on_integrating_pair_programming_with_bdd_and_tdd.md
│ ├── tmux_setup_for_remote_pair_programming.md
│ └── ubuntu/
│ └── ubuntu_14.04_manual_install_notes.md
├── entrypoint.sh
├── esbuild.config.cjs
├── events_exploration.md
├── experiments/
│ ├── landing_page_options.rb
│ └── metrics/
│ ├── premium_signups.rb
│ └── signups.rb
├── features/
│ ├── advanced_site_search.feature
│ ├── article_vote.feature
│ ├── articles.feature
│ ├── basic_layout.feature
│ ├── custom_errors.feature
│ ├── dashboard/
│ │ ├── dashboard_stats.feature
│ │ └── public_activity.feature
│ ├── devops/
│ │ ├── create_plans.feature
│ │ ├── github_commits.feature
│ │ ├── github_languages.feature
│ │ ├── github_last_updates.feature
│ │ ├── github_readme_files.feature
│ │ ├── github_static_pages.feature
│ │ ├── inspect_emails.feature
│ │ ├── migrate_github_urls.feature
│ │ ├── migrate_plans.feature
│ │ └── support_https_renewal.feature
│ ├── events/
│ │ ├── client_meetings.feature
│ │ ├── create_events.feature
│ │ ├── edit_event.feature
│ │ ├── edit_future_event.feature
│ │ ├── edit_past_event.feature
│ │ ├── event_countdown.feature
│ │ ├── event_countdown_widget.feature
│ │ ├── event_videos.feature
│ │ ├── events_by_project.feature
│ │ ├── list_past_events.feature
│ │ ├── list_repeating_events.feature
│ │ ├── list_single_events.feature
│ │ ├── live_event.feature
│ │ ├── next_scrum.feature
│ │ ├── next_scrum_for_new_user.feature
│ │ ├── past_events_page.feature
│ │ ├── private_events.feature
│ │ ├── rsvping_event.feature
│ │ ├── show_event.feature
│ │ ├── start_event.feature
│ │ └── upcoming_events.feature
│ ├── follow_project.feature
│ ├── hangouts/
│ │ ├── edit_hangout_url.feature
│ │ ├── edit_youtube_url.feature
│ │ └── hangout.feature
│ ├── hire_me_modal.feature
│ ├── information_pages.feature
│ ├── jitsi_meet/
│ │ └── start_jitsi_button.feature
│ ├── navbar_user_info.feature
│ ├── past_events.feature
│ ├── project_documents.feature
│ ├── projects/
│ │ ├── connections.feature
│ │ ├── create_projects.feature
│ │ ├── deactive_owners.feature
│ │ ├── edit_project.feature
│ │ ├── list_projects.feature
│ │ ├── notify_project_creator.feature
│ │ ├── notify_project_joinee.feature
│ │ ├── project_pivotal_stories.feature
│ │ ├── project_show_tabs.feature
│ │ ├── project_videos.feature
│ │ └── show_project.feature
│ ├── remind_complete_profile.feature
│ ├── sidebar.feature
│ ├── step_definitions/
│ │ ├── .gitkeep
│ │ ├── activity_feed_steps.rb
│ │ ├── advanced_site_search.rb
│ │ ├── article_votes_steps.rb
│ │ ├── articles_steps.rb
│ │ ├── av_dashboard_token_steps.rb
│ │ ├── avatar_steps.rb
│ │ ├── basic_steps.rb
│ │ ├── commit_count_steps.rb
│ │ ├── contained_search_steps.rb
│ │ ├── custom_errors_step.rb
│ │ ├── devops_steps.rb
│ │ ├── documents_steps.rb
│ │ ├── email_steps.rb
│ │ ├── event_instances_steps.rb
│ │ ├── event_steps.rb
│ │ ├── features_step.rb
│ │ ├── hangout_steps.rb
│ │ ├── jitsi_steps.rb
│ │ ├── karma_calculator_steps.rb
│ │ ├── layout_steps.rb
│ │ ├── pages_steps.rb
│ │ ├── pivotal_steps.rb
│ │ ├── premium_steps.rb
│ │ ├── profile_karma_link.rb
│ │ ├── projects_steps.rb
│ │ ├── scrums_steps.rb
│ │ ├── sponsors_steps.rb
│ │ ├── static_pages_edit_button_steps.rb
│ │ ├── statistics_steps.rb
│ │ ├── tabs_steps.rb
│ │ ├── title_steps.rb
│ │ ├── user_steps.rb
│ │ └── youtube_steps.rb
│ ├── support/
│ │ ├── capybara.rb
│ │ ├── database_cleaner.rb
│ │ ├── env.rb
│ │ ├── geocoder.rb
│ │ ├── helpers.rb
│ │ ├── hooks.rb
│ │ ├── puffing_billy.rb
│ │ ├── selectors.rb
│ │ ├── suppress_logger.rb
│ │ └── vcr.rb
│ ├── user_status.feature
│ └── users/
│ ├── activities.feature
│ ├── avatar.feature
│ ├── github_commit_count.feature
│ ├── link_github.feature
│ ├── omniauth.feature
│ ├── opt_out_mailings.feature
│ ├── password_reset.feature
│ ├── profile.feature
│ ├── profile_karma.feature
│ ├── profile_karma_link.feature
│ ├── profile_privacy.feature
│ ├── profile_update_credit_card.feature
│ ├── sign_in.feature
│ ├── sign_off.feature
│ ├── sign_out.feature
│ ├── sign_up.feature
│ ├── skills.feature
│ ├── titles.feature
│ ├── user_bio.feature
│ ├── user_list.feature
│ ├── user_management.feature
│ └── user_videos.feature
├── fixtures/
│ ├── .keep
│ ├── articles.yml.new
│ ├── authentications.yml.new
│ ├── documents.yml.new
│ ├── events.yml.new
│ ├── follows.yml.new
│ ├── projects.yml.new
│ ├── taggings.yml.new
│ ├── tags.yml.new
│ ├── users.yml.new
│ └── versions.yml.new
├── lib/
│ ├── agile_ventures/
│ │ └── errors.rb
│ ├── agile_ventures.rb
│ ├── assets/
│ │ └── .keep
│ ├── channels_list.rb
│ ├── core_ext/
│ │ ├── active_record/
│ │ │ └── base_extension.rb
│ │ └── datetime.rb
│ ├── custom_errors.rb
│ ├── paypal.rb
│ ├── tasks/
│ │ ├── .keep
│ │ ├── apply_one-time_google_hangout_event_participation_count.rake
│ │ ├── brakeman.rake
│ │ ├── bundle-audit.rake
│ │ ├── ci.rake
│ │ ├── create_anonymous_user.rake
│ │ ├── create_plans.rake
│ │ ├── cucumber.rake
│ │ ├── db.rake
│ │ ├── db_dump.rake
│ │ ├── dump.rake
│ │ ├── event_participation/
│ │ │ └── event_participation_karma.csv
│ │ ├── fix_karma.rake
│ │ ├── github_content_for_static_pages.rake
│ │ ├── import_pages.rake
│ │ ├── migrate_plans.rake
│ │ ├── regenerate_slugs.rake
│ │ ├── scheduler.rake
│ │ ├── send_welcome_message.rake
│ │ ├── utils.rake
│ │ └── vcr_billy_caches.rake
│ └── validators/
│ ├── image_url_validator.rb
│ ├── pivotal_tracker_url_validator.rb
│ └── uri_validator.rb
├── log/
│ └── .keep
├── package.json
├── public/
│ ├── 403.html
│ ├── 404.html
│ ├── 422.html
│ ├── 500.html
│ ├── analytics.txt
│ └── robots.txt
├── scripts/
│ └── copy_javascript_dependencies.cjs
├── spec/
│ ├── controllers/
│ │ ├── application_controller_spec.rb
│ │ ├── articles_controller_spec.rb
│ │ ├── authentications_controller_spec.rb
│ │ ├── calendar_controller_spec.rb
│ │ ├── concerns/
│ │ │ ├── deactivated_user_finder_spec.rb
│ │ │ └── statistics_spec.rb
│ │ ├── dashboard_controller_spec.rb
│ │ ├── documents_controller_spec.rb
│ │ ├── event_instances_controller_spec.rb
│ │ ├── scrums_controller_spec.rb
│ │ ├── static_pages_controller_spec.rb
│ │ ├── subscriptions_controller_spec.rb
│ │ ├── users_controller_spec.rb
│ │ └── visitors_controller_spec.rb
│ ├── factories/
│ │ ├── articles.rb
│ │ ├── authentications.rb
│ │ ├── commit_count.rb
│ │ ├── documents.rb
│ │ ├── event_instances.rb
│ │ ├── events.rb
│ │ ├── karmas.rb
│ │ ├── papertrail_version.rb
│ │ ├── payment_source.rb
│ │ ├── plans.rb
│ │ ├── projects.rb
│ │ ├── scrums.rb
│ │ ├── source_repositories.rb
│ │ ├── static_page.rb
│ │ ├── statuses.rb
│ │ ├── subscriptions.rb
│ │ └── users.rb
│ ├── features/
│ │ └── project_create_and_approval_spec.rb
│ ├── fixtures/
│ │ ├── cassettes/
│ │ │ ├── GithubLastUpdatesJob/
│ │ │ │ └── _run/
│ │ │ │ └── shf-project_with_hyphen/
│ │ │ │ └── has_correct_last_commit_date_after_job_run.yml
│ │ │ ├── github_commit_count/
│ │ │ │ └── websiteone_stats.yml
│ │ │ ├── github_readme_pitch/
│ │ │ │ └── github_readme_pitch.yml
│ │ │ └── scrums_controller/
│ │ │ └── videos_by_query.yml
│ │ ├── country_codes.txt
│ │ ├── paypal_agreement_response.json
│ │ ├── pivotal_tracker_project_current_iteration.json
│ │ └── pivotal_tracker_project_response.json
│ ├── helpers/
│ │ ├── application_helper_spec.rb
│ │ ├── articles_helper_spec.rb
│ │ ├── devise_helper_spec.rb
│ │ ├── documents_helper_spec.rb
│ │ ├── event_helper_spec.rb
│ │ ├── event_instances_helper_spec.rb
│ │ ├── layout_helper_spec.rb
│ │ ├── projects_helper_spec.rb
│ │ ├── users_helper_spec.rb
│ │ └── visitors_helper_spec.rb
│ ├── javascripts/
│ │ ├── accordion_collapse_spec.js
│ │ ├── affix_navbar_spec.js
│ │ ├── application_spec.js
│ │ ├── documents_spec.js
│ │ ├── event_countdown_spec.js
│ │ ├── event_instances.js
│ │ ├── flash_spec.js
│ │ ├── helpers/
│ │ │ ├── .gitkeep
│ │ │ ├── jasmine-jquery.js
│ │ │ └── spec_helper.js
│ │ ├── support/
│ │ │ ├── jasmine-browser.json
│ │ │ ├── jasmine.yml
│ │ │ └── jasmine_helper.rb
│ │ └── users_spec.js
│ ├── jobs/
│ │ ├── github_commits_job_spec.rb
│ │ ├── github_last_updates_job_spec.rb
│ │ └── github_readme_files_job_spec.rb
│ ├── lib/
│ │ ├── custom_errors_spec.rb
│ │ ├── settings_spec.rb
│ │ └── validators/
│ │ ├── image_url_validator_spec.rb
│ │ ├── pivotal_tracker_url_validator_spec.rb
│ │ └── uri_validator_spec.rb
│ ├── mailers/
│ │ ├── admin_mailer_spec.rb
│ │ ├── mailer_spec.rb
│ │ ├── previews/
│ │ │ ├── admin_mailer_preview.rb
│ │ │ └── project_mailer_preview.rb
│ │ ├── project_mailer_spec.rb
│ │ └── sandbox_email_interceptor_spec.rb
│ ├── migrations/
│ │ └── event_time_refactor_spec.rb
│ ├── models/
│ │ ├── article_spec.rb
│ │ ├── authentication_spec.rb
│ │ ├── commit_count_spec.rb
│ │ ├── contact_form_spec.rb
│ │ ├── document_spec.rb
│ │ ├── event_date_spec.rb
│ │ ├── event_instance_spec.rb
│ │ ├── event_spec.rb
│ │ ├── follow_spec.rb
│ │ ├── hangout_participants_snapshot_spec.rb
│ │ ├── issue_tracker_spec.rb
│ │ ├── karma_spec.rb
│ │ ├── language_project_spec.rb
│ │ ├── null_user_spec.rb
│ │ ├── payment_source_spec.rb
│ │ ├── plan_spec.rb
│ │ ├── project_spec.rb
│ │ ├── source_repository_spec.rb
│ │ ├── static_page_spec.rb
│ │ ├── status_spec.rb
│ │ ├── subscription_spec.rb
│ │ └── user_spec.rb
│ ├── presenters/
│ │ ├── event_instance_presenter_spec.rb
│ │ └── users/
│ │ └── user_presenter_spec.rb
│ ├── rails_helper.rb
│ ├── requests/
│ │ ├── authentications_spec.rb
│ │ ├── documents_spec.rb
│ │ ├── events_spec.rb
│ │ ├── legacy_api_subscriptions_spec.rb
│ │ └── paypal_agreement_spec.rb
│ ├── routing/
│ │ ├── documents_routing_spec.rb
│ │ └── static_pages_routing_spec.rb
│ ├── services/
│ │ ├── add_subscription_to_user_for_plan_spec.rb
│ │ ├── hangout_notification_service_spec.rb
│ │ ├── karma_calculator_spec.rb
│ │ ├── markdown_converter_spec.rb
│ │ └── youtube_notification_service_spec.rb
│ ├── spec_helper.rb
│ └── support/
│ ├── helpers.rb
│ ├── jasmine-browser.json
│ ├── privileged_user_helper.rb
│ └── shared_examples/
│ ├── presentable.rb
│ ├── shared_example_for_disqus.rb
│ ├── shared_example_for_hangout_button.rb
│ └── shared_example_for_user_avatar.rb
├── test/
│ └── fixtures/
│ └── project_mailer/
│ ├── project_creator_notification_html
│ ├── project_creator_notification_text
│ ├── project_joinee_notification_helloworld_html
│ ├── project_joinee_notification_helloworld_text
│ ├── project_joinee_notification_html
│ └── project_joinee_notification_text
└── vendor/
└── assets/
├── javascripts/
│ ├── .keep
│ ├── 404.js
│ ├── bootstrap-tags.js
│ ├── fullcalendar.js
│ ├── lolex.js
│ └── moment-timezone-with-data-2012-2022.js
└── stylesheets/
├── .keep
└── fullcalendar.css
SYMBOL INDEX (1222 symbols across 256 files)
FILE: app/assets/javascripts/application.js
function infiniteScroll (line 52) | function infiniteScroll(params) {
FILE: app/assets/javascripts/bootstrap-datepicker.js
function UTCDate (line 29) | function UTCDate(){
function UTCToday (line 32) | function UTCToday(){
function isUTCEquals (line 36) | function isUTCEquals(date1, date2) {
function alias (line 43) | function alias(method, deprecationMsg){
function isValidDate (line 52) | function isValidDate(d) {
function opts_from_el (line 1608) | function opts_from_el(el, prefix){
function opts_from_locale (line 1625) | function opts_from_locale(lang){
function applyNearbyYear (line 1837) | function applyNearbyYear(year, threshold){
function match_part (line 1887) | function match_part(){
FILE: app/assets/javascripts/bootstrap.js
function transitionEnd (line 34) | function transitionEnd() {
function removeElement (line 127) | function removeElement() {
function Plugin (line 143) | function Plugin(option) {
function Plugin (line 252) | function Plugin(option) {
function Plugin (line 478) | function Plugin(option) {
function getTargetFromTrigger (line 705) | function getTargetFromTrigger($trigger) {
function Plugin (line 717) | function Plugin(option) {
function getParent (line 784) | function getParent($this) {
function clearMenus (line 797) | function clearMenus(e) {
function Plugin (line 890) | function Plugin(option) {
function Plugin (line 1234) | function Plugin(option, _relatedTarget) {
function allowedAttribute (line 1361) | function allowedAttribute(attr, allowedAttributeList) {
function sanitizeHtml (line 1386) | function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {
function complete (line 1757) | function complete() {
function Plugin (line 1936) | function Plugin(option) {
function Plugin (line 2060) | function Plugin(option) {
function ScrollSpy (line 2103) | function ScrollSpy(element, options) {
function Plugin (line 2223) | function Plugin(option) {
function next (line 2332) | function next() {
function Plugin (line 2378) | function Plugin(option) {
function Plugin (line 2537) | function Plugin(option) {
FILE: app/assets/javascripts/controllers/events_controller.js
method connect (line 5) | connect() {
FILE: app/assets/javascripts/controllers/events_form_controller.js
method connect (line 5) | connect() {
method repeats (line 32) | repeats() {
method repeat_ends_on (line 48) | repeat_ends_on(){
FILE: app/assets/javascripts/controllers/projects_controller.js
method show_hidden (line 4) | show_hidden() {
FILE: app/assets/javascripts/controllers/projects_languages_controller.js
method language (line 4) | language() {
FILE: app/assets/javascripts/documents.js
function init (line 2) | function init(){
FILE: app/assets/javascripts/global-modules/affix_navbar.js
function AffixedNavbar (line 3) | function AffixedNavbar() {
FILE: app/assets/javascripts/global-modules/event_countdown.js
function EventCountdown (line 3) | function EventCountdown() {
FILE: app/assets/javascripts/google-analytics.js
function readCookie (line 3) | function readCookie(cookieName) {
FILE: app/assets/javascripts/hangout_play_on_hover.js
function onPlayerReady (line 30) | function onPlayerReady(event) {
function onYouTubeIframeAPIReady (line 34) | function onYouTubeIframeAPIReady() {
FILE: app/assets/javascripts/jquery-ui.js
function focusable (line 94) | function focusable( element, isTabIndexNotNaN ) {
function visible (line 115) | function visible( element ) {
function reduce (line 157) | function reduce( elem, size, border, margin ) {
function handlerProxy (line 716) | function handlerProxy() {
function handlerProxy (line 758) | function handlerProxy() {
function getOffsets (line 1071) | function getOffsets( offsets, width, height ) {
function parseCss (line 1078) | function parseCss( element, property ) {
function getDimensions (line 1082) | function getDimensions( elem ) {
function datepicker_getZindex (line 3784) | function datepicker_getZindex( elem ) {
function Datepicker (line 3811) | function Datepicker() {
function datepicker_bindHover (line 5754) | function datepicker_bindHover(dpDiv) {
function datepicker_handleMouseover (line 5768) | function datepicker_handleMouseover() {
function datepicker_extendRemove (line 5782) | function datepicker_extendRemove(target, props) {
function checkFocus (line 8386) | function checkFocus() {
function filteredUi (line 8570) | function filteredUi( ui ) {
function filteredUi (line 8617) | function filteredUi( ui ) {
function isOverAxis (line 9161) | function isOverAxis( x, reference, size ) {
function clamp (line 9517) | function clamp( value, prop, allowEmpty ) {
function stringParse (line 9543) | function stringParse( string ) {
function hue2rgb (line 9793) | function hue2rgb( p, q, h ) {
function getElementStyles (line 10059) | function getElementStyles( elem ) {
function styleDifference (line 10086) | function styleDifference( oldStyle, newStyle ) {
function _normalizeArguments (line 10406) | function _normalizeArguments( effect, options, speed, callback ) {
function standardAnimationOption (line 10458) | function standardAnimationOption( option ) {
function run (line 10503) | function run( next ) {
function childComplete (line 10983) | function childComplete() {
function animComplete (line 11032) | function animComplete() {
function addItems (line 14129) | function addItems() {
function delayEvent (line 14710) | function delayEvent( type, instance, container ) {
function spinner_modifier (line 14799) | function spinner_modifier( fn ) {
function checkFocus (line 14923) | function checkFocus() {
function constrain (line 15517) | function constrain() {
function complete (line 15893) | function complete() {
function show (line 15898) | function show() {
function position (line 16428) | function position( event ) {
FILE: app/assets/javascripts/nprogress.js
function clamp (line 300) | function clamp(n, min, max) {
function toBarPerc (line 311) | function toBarPerc(n) {
function barPositionCSS (line 321) | function barPositionCSS(n, speed, ease) {
function next (line 344) | function next() {
function camelCase (line 369) | function camelCase(string) {
function getVendorProp (line 375) | function getVendorProp(name) {
function getStyleProp (line 390) | function getStyleProp(name) {
function applyCss (line 395) | function applyCss(element, prop, value) {
function hasClass (line 420) | function hasClass(element, name) {
function addClass (line 429) | function addClass(element, name) {
function removeClass (line 443) | function removeClass(element, name) {
function classList (line 462) | function classList(element) {
function removeElement (line 470) | function removeElement(element) {
FILE: app/assets/javascripts/typeahead.jquery.js
function reverseArgs (line 55) | function reverseArgs(index, value) {
function template (line 100) | function template() {
function _p8 (line 153) | function _p8(s) {
function build (line 178) | function build(o) {
function buildHtml (line 197) | function buildHtml(c) {
function buildSelectors (line 203) | function buildSelectors(classes) {
function buildCss (line 210) | function buildCss() {
function EventBus (line 267) | function EventBus(o) {
function on (line 304) | function on(method, types, cb, context) {
function onAsync (line 321) | function onAsync(types, cb, context) {
function onSync (line 324) | function onSync(types, cb, context) {
function off (line 327) | function off(types) {
function trigger (line 338) | function trigger(types) {
function getFlush (line 352) | function getFlush(callbacks, context, args) {
function getNextTick (line 362) | function getNextTick() {
function bindContext (line 379) | function bindContext(fn, context) {
function hightlightTextNode (line 433) | function hightlightTextNode(textNode) {
function traverse (line 445) | function traverse(el, hightlightTextNode) {
function accent_replacer (line 457) | function accent_replacer(chr) {
function getRegex (line 460) | function getRegex(patterns, caseSensitive, wordsOnly, diacriticInsensiti...
function Input (line 485) | function Input(o, www) {
function buildOverflowHelper (line 684) | function buildOverflowHelper($input) {
function areQueriesEquivalent (line 701) | function areQueriesEquivalent(a, b) {
function withModifier (line 704) | function withModifier($e) {
function Dataset (line 717) | function Dataset(o, www) {
function sync (line 858) | function sync(suggestions) {
function async (line 870) | function async(suggestions) {
function getDisplayFn (line 895) | function getDisplayFn(display) {
function getTemplates (line 902) | function getTemplates(templates, displayFn) {
function isValidName (line 918) | function isValidName(str) {
function Menu (line 924) | function Menu(o, www) {
function updateDataset (line 1046) | function updateDataset(dataset) {
function clearDataset (line 1054) | function clearDataset(dataset) {
function destroyDataset (line 1062) | function destroyDataset(dataset) {
function Status (line 1071) | function Status(options) {
function DefaultMenu (line 1121) | function DefaultMenu() {
function Typeahead (line 1164) | function Typeahead(o, www) {
function c (line 1447) | function c(ctx) {
function attach (line 1473) | function attach() {
function ttEach (line 1632) | function ttEach($els, fn) {
function buildHintFromInput (line 1638) | function buildHintFromInput($input, www) {
function prepInput (line 1647) | function prepInput($input, www) {
function getBackgroundStyles (line 1662) | function getBackgroundStyles($el) {
function revert (line 1674) | function revert($input) {
function $elOrNull (line 1687) | function $elOrNull(obj) {
FILE: app/assets/javascripts/users.js
function selectVideo (line 4) | function selectVideo(event) {
function enableBootstrapTooltipsOnNonTouchDevices (line 15) | function enableBootstrapTooltipsOnNonTouchDevices() {
function init (line 21) | function init() {
FILE: app/assets/javascripts/websiteone.js
function restoreModule (line 22) | function restoreModule(name){
function define (line 26) | function define(name, factory) {
function runOnce (line 45) | function runOnce(name, callback) {
function clear (line 52) | function clear() {
function init (line 59) | function init() {
FILE: app/controllers/application_controller.rb
class ApplicationController (line 4) | class ApplicationController < ActionController::Base
method configure_permitted_parameters (line 20) | def configure_permitted_parameters
method after_sign_in_path_for (line 31) | def after_sign_in_path_for(resource)
method check_privileged (line 41) | def check_privileged
method request_path_blacklisted? (line 51) | def request_path_blacklisted?
method get_next_scrum (line 63) | def get_next_scrum
method store_location (line 67) | def store_location
method user_activity (line 72) | def user_activity
method show_deactivated_message_and_redirect_to_root (line 76) | def show_deactivated_message_and_redirect_to_root
method modify_user_signup_params (line 81) | def modify_user_signup_params
method set_user_id (line 91) | def set_user_id
FILE: app/controllers/articles_controller.rb
class ArticlesController (line 3) | class ArticlesController < ApplicationController
method index (line 8) | def index
method show (line 16) | def show
method new (line 20) | def new
method edit (line 25) | def edit; end
method create (line 27) | def create
method update (line 40) | def update
method preview (line 51) | def preview
method upvote (line 61) | def upvote
method downvote (line 78) | def downvote
method cancelvote (line 95) | def cancelvote
method article_params (line 110) | def article_params
method load_article (line 114) | def load_article
FILE: app/controllers/authentications_controller.rb
class AuthenticationsController (line 3) | class AuthenticationsController < ApplicationController
method create (line 8) | def create
method failure (line 24) | def failure
method destroy (line 29) | def destroy
method link_github_profile (line 48) | def link_github_profile
method attempt_login_with_auth (line 68) | def attempt_login_with_auth(authentication, path)
method create_new_authentication_for_current_user (line 78) | def create_new_authentication_for_current_user(omniauth, path)
method create_new_user_with_authentication (line 92) | def create_new_user_with_authentication(omniauth)
FILE: app/controllers/av_dashboard_tokens_controller.rb
class AvDashboardTokensController (line 3) | class AvDashboardTokensController < ApplicationController
method create (line 9) | def create
FILE: app/controllers/calendar_controller.rb
class CalendarController (line 3) | class CalendarController < ApplicationController
method index (line 4) | def index
method add_events (line 23) | def add_events(cal)
FILE: app/controllers/cards_controller.rb
class CardsController (line 3) | class CardsController < ApplicationController
method new (line 6) | def new; end
method edit (line 8) | def edit; end
method create (line 10) | def create
method update (line 21) | def update
method stripe_token (line 34) | def stripe_token(params)
method generate_test_token (line 38) | def generate_test_token
FILE: app/controllers/concerns/deactivated_user_finder.rb
type DeactivatedUserFinder (line 3) | module DeactivatedUserFinder
function deactivated_user_with_email (line 6) | def deactivated_user_with_email(email)
FILE: app/controllers/concerns/statistics.rb
type Statistics (line 3) | module Statistics
function get_stats_for (line 6) | def get_stats_for(entity)
function calculate_duration (line 25) | def calculate_duration(category)
FILE: app/controllers/cookies_controller.rb
class CookiesController (line 3) | class CookiesController < ApplicationController
method index (line 4) | def index
FILE: app/controllers/dashboard_controller.rb
class DashboardController (line 3) | class DashboardController < ApplicationController
method index (line 5) | def index
method get_stats (line 12) | def get_stats
method get_activities (line 24) | def get_activities
FILE: app/controllers/documents_controller.rb
class DocumentsController (line 3) | class DocumentsController < ApplicationController
method index (line 11) | def index
method show (line 18) | def show
method update_parent_id (line 22) | def update_parent_id
method get_doc_categories (line 27) | def get_doc_categories
method new (line 33) | def new
method edit (line 38) | def edit; end
method create (line 42) | def create
method update (line 59) | def update
method destroy (line 70) | def destroy
method find_project (line 81) | def find_project
method set_document (line 86) | def set_document
method set_parent (line 90) | def set_parent
method change_document_parent (line 94) | def change_document_parent(new_parent_id)
method document_params (line 105) | def document_params
FILE: app/controllers/event_instances_controller.rb
class EventInstancesController (line 3) | class EventInstancesController < ApplicationController
method index (line 7) | def index
method edit (line 13) | def edit
method update (line 17) | def update
method update_link (line 29) | def update_link
method local_event? (line 42) | def local_event?
method hangout_url_changed? (line 46) | def hangout_url_changed?
method send_messages_to_social_media (line 50) | def send_messages_to_social_media(event, event_params, hangout_url_cha...
method updating_hangout_url? (line 63) | def updating_hangout_url?(event, hangout_url_changed)
method slack_notify_hangout? (line 67) | def slack_notify_hangout?
method updating_valid_yt_url? (line 71) | def updating_valid_yt_url?(event, event_params)
method yt_video_id_changed? (line 75) | def yt_video_id_changed?(event, event_params)
method slack_notify_yt? (line 79) | def slack_notify_yt?
method event_instance_params (line 83) | def event_instance_params
method local_request? (line 87) | def local_request?
method whitelist_params (line 93) | def whitelist_params
method transform_params (line 100) | def transform_params
FILE: app/controllers/events_controller.rb
class EventsController (line 3) | class EventsController < ApplicationController
method index (line 8) | def index
method show (line 19) | def show
method new (line 28) | def new
method edit (line 33) | def edit
method create (line 37) | def create
method update (line 48) | def update
method destroy (line 64) | def destroy
method transform_params (line 71) | def transform_params
method normalize_event_dates (line 80) | def normalize_event_dates(event_params)
method whitelist_event_params (line 87) | def whitelist_event_params
method action_initiator (line 99) | def action_initiator
method create_start_date_time (line 103) | def create_start_date_time(event_params)
method check_days_of_week (line 111) | def check_days_of_week(event_params)
method date_and_time_present? (line 126) | def date_and_time_present?
method specified_project (line 131) | def specified_project
method set_event (line 135) | def set_event
method set_projects (line 139) | def set_projects
method new_params (line 143) | def new_params
FILE: app/controllers/paypal_agreement_controller.rb
class PaypalAgreementController (line 3) | class PaypalAgreementController < ApplicationController
method new (line 4) | def new
method create (line 16) | def create
method new_paypal_agreement (line 30) | def new_paypal_agreement
FILE: app/controllers/projects_controller.rb
class ProjectsController (line 3) | class ProjectsController < ApplicationController
method index (line 13) | def index
method show (line 23) | def show
method new (line 31) | def new
method edit (line 38) | def edit; end
method create (line 40) | def create
method update (line 54) | def update
method follow (line 66) | def follow
method unfollow (line 78) | def unfollow
method send_email_notifications (line 87) | def send_email_notifications
method set_project (line 99) | def set_project
method query_projects (line 103) | def query_projects(order)
method add_to_feed (line 117) | def add_to_feed(action)
method get_current_stories (line 121) | def get_current_stories
method project_params (line 140) | def project_params
method valid_admin (line 148) | def valid_admin
method access_to_edit (line 155) | def access_to_edit
method update_project_status (line 161) | def update_project_status(command)
FILE: app/controllers/registrations_controller.rb
class RegistrationsController (line 3) | class RegistrationsController < Devise::RegistrationsController
method create (line 10) | def create
method update (line 19) | def update
method check_captcha (line 46) | def check_captcha
method build_resource (line 54) | def build_resource(hash = {})
method after_update_path_for (line 63) | def after_update_path_for(resource)
method after_sign_up_path_for (line 67) | def after_sign_up_path_for(_resource)
method fetch_email_from_params (line 71) | def fetch_email_from_params
method check_for_deactivated_user (line 75) | def check_for_deactivated_user
FILE: app/controllers/scrums_controller.rb
class ScrumsController (line 3) | class ScrumsController < ApplicationController
method index (line 4) | def index
FILE: app/controllers/static_pages_controller.rb
class StaticPagesController (line 3) | class StaticPagesController < ApplicationController
method loaderio (line 6) | def loaderio
method letsencrypt (line 10) | def letsencrypt
method show (line 14) | def show
method get_page_id (line 23) | def get_page_id(page)
method redirect_email_blunder (line 27) | def redirect_email_blunder
FILE: app/controllers/subscriptions_controller.rb
class SubscriptionsController (line 3) | class SubscriptionsController < ApplicationController
method new (line 8) | def new
method create (line 14) | def create
method update (line 28) | def update
method require_login? (line 70) | def require_login?
method storable_location? (line 76) | def storable_location?
method store_user_location! (line 80) | def store_user_location!
method detect_plan_before_payment (line 84) | def detect_plan_before_payment
method default_plan (line 90) | def default_plan
method detect_plan_after_payment (line 94) | def detect_plan_after_payment
method detect_user (line 99) | def detect_user
method paypal? (line 105) | def paypal?
method create_stripe_customer (line 109) | def create_stripe_customer
method is_sponsorship? (line 117) | def is_sponsorship?
method stripe_token (line 121) | def stripe_token(params)
method generate_test_token (line 125) | def generate_test_token
method add_appropriate_subscription (line 129) | def add_appropriate_subscription(user, sponsor = user)
method send_acknowledgement_email (line 142) | def send_acknowledgement_email
method change_plan_through_stripe (line 151) | def change_plan_through_stripe(user, new_subscription_plan)
FILE: app/controllers/users_controller.rb
class UsersController (line 3) | class UsersController < ApplicationController
method index (line 12) | def index
method show (line 25) | def show
method new (line 34) | def new
method hire_me (line 39) | def hire_me
method destroy (line 55) | def destroy
method add_status (line 62) | def add_status
method user_has_status (line 75) | def user_has_status(params)
method users (line 79) | def users
method should_display_user? (line 90) | def should_display_user?(user)
method get_user (line 94) | def get_user
method set_filter_params (line 98) | def set_filter_params
method set_activity_tab (line 102) | def set_activity_tab(param)
FILE: app/controllers/vanity_controller.rb
class VanityController (line 3) | class VanityController < ApplicationController
FILE: app/controllers/visitors_controller.rb
class VisitorsController (line 3) | class VisitorsController < ApplicationController
method index (line 6) | def index
method get_next_scrum (line 14) | def get_next_scrum
FILE: app/helpers/application_helper.rb
type ApplicationHelper (line 3) | module ApplicationHelper
function user_details (line 7) | def user_details(id)
function resource_name (line 16) | def resource_name
function privileged_visitor? (line 20) | def privileged_visitor?
function static_page_path (line 24) | def static_page_path(page)
function is_in_static_page? (line 28) | def is_in_static_page?(static_page_name)
function resource (line 34) | def resource
function devise_mapping (line 38) | def devise_mapping
function current_projects (line 42) | def current_projects
function date_format (line 46) | def date_format(date)
function social_button (line 60) | def social_button(provider, options = {})
function add_social_account_button (line 67) | def add_social_account_button(provider, options)
function remove_social_account_button (line 79) | def remove_social_account_button(provider, options)
function prefix (line 92) | def prefix
function supported_third_parties (line 96) | def supported_third_parties
function valid_email? (line 101) | def valid_email?(email)
function custom_css_btn (line 105) | def custom_css_btn(text, icon_class, path, options = {})
function awesome_text_field (line 125) | def awesome_text_field(f, object_name, options = {})
function awesome_text_area (line 129) | def awesome_text_area(f, object_name, options = {})
function awesome_text_method (line 133) | def awesome_text_method(method_name, f, object_name, options = {})
function active_if (line 144) | def active_if(condition)
function active_if_controller_is (line 148) | def active_if_controller_is(controller_name)
function shared_meta_keywords (line 152) | def shared_meta_keywords
function default_meta_description (line 156) | def default_meta_description
function present (line 165) | def present(model)
function delete_google_cookies (line 169) | def delete_google_cookies
FILE: app/helpers/articles_helper.rb
type ArticlesHelper (line 3) | module ArticlesHelper
function clean_html (line 4) | def clean_html(html)
function standard_tags (line 19) | def standard_tags
function link_to_tags (line 26) | def link_to_tags(tags)
class CodeRayify (line 30) | class CodeRayify < Redcarpet::Render::HTML
method block_code (line 31) | def block_code(code, language)
function from_markdown (line 39) | def from_markdown(markdown)
function markdown_preview (line 45) | def markdown_preview(markdown)
function markdown_engine (line 55) | def markdown_engine
FILE: app/helpers/authentications_helper.rb
type AuthenticationsHelper (line 3) | module AuthenticationsHelper
FILE: app/helpers/cookies_helper.rb
type CookiesHelper (line 3) | module CookiesHelper
FILE: app/helpers/devise_helper.rb
type DeviseHelper (line 3) | module DeviseHelper
function devise_error_simple_message (line 4) | def devise_error_simple_message
function devise_error_messages_flash (line 17) | def devise_error_messages_flash
FILE: app/helpers/disqus_helper.rb
type DisqusHelper (line 3) | module DisqusHelper
function get_disqus_sso (line 4) | def get_disqus_sso(user)
FILE: app/helpers/documents_helper.rb
type DocumentsHelper (line 3) | module DocumentsHelper
function documents (line 4) | def documents
function metadata (line 8) | def metadata
function inside_mercury? (line 16) | def inside_mercury?
FILE: app/helpers/event_helper.rb
type EventHelper (line 3) | module EventHelper
function current_occurrence_time (line 4) | def current_occurrence_time(event)
function topic (line 12) | def topic(event, event_schedule)
function format_timepicker (line 16) | def format_timepicker(datetime)
function format_datepicker (line 20) | def format_datepicker(datetime)
function format_time_range (line 24) | def format_time_range(event)
function format_time (line 30) | def format_time(datetime)
function format_date (line 34) | def format_date(datetime)
function show_local_time_range (line 38) | def show_local_time_range(time, duration)
function google_calendar_link (line 44) | def google_calendar_link(event)
function set_column_width (line 48) | def set_column_width
function show_private_event_info? (line 52) | def show_private_event_info?
FILE: app/helpers/event_instances_helper.rb
type EventInstancesHelper (line 4) | module EventInstancesHelper
function generate_event_instance_id (line 5) | def generate_event_instance_id(user, project_id = nil)
function watchable? (line 9) | def watchable?(event_instance)
FILE: app/helpers/features.rb
type Features (line 3) | module Features
function enabled? (line 5) | def enabled?(feature_name)
function enable (line 12) | def enable(feature_name)
function disable (line 16) | def disable(feature_name)
function method_missing (line 20) | def method_missing(method_name, *args, &block)
FILE: app/helpers/layout_helper.rb
type LayoutHelper (line 3) | module LayoutHelper
function flash_messages (line 4) | def flash_messages(opts = {})
function show_layout_flash? (line 14) | def show_layout_flash?
function event_name_or_invitation_to_guest_user (line 18) | def event_name_or_invitation_to_guest_user(event)
FILE: app/helpers/projects_helper.rb
type ProjectsHelper (line 3) | module ProjectsHelper
function created_date (line 4) | def created_date
FILE: app/helpers/scrums_helper.rb
type ScrumsHelper (line 3) | module ScrumsHelper
function scrum_link (line 4) | def scrum_link(video)
function link_video (line 8) | def link_video(video)
function display_error (line 19) | def display_error(video)
FILE: app/helpers/static_pages_helper.rb
type StaticPagesHelper (line 3) | module StaticPagesHelper
function github_static_pages_edit_url (line 4) | def github_static_pages_edit_url
FILE: app/helpers/subscriptions_helper.rb
type SubscriptionsHelper (line 3) | module SubscriptionsHelper
function action_text (line 4) | def action_text
function type (line 8) | def type
FILE: app/helpers/users_helper.rb
type UsersHelper (line 3) | module UsersHelper
function activity_tab (line 4) | def activity_tab(param_tab)
function about_tab (line 8) | def about_tab(param_tab)
FILE: app/helpers/visitors_helper.rb
type VisitorsHelper (line 3) | module VisitorsHelper
function display_countdown (line 4) | def display_countdown(event)
function show_svg (line 21) | def show_svg(path)
FILE: app/jobs/application_job.rb
class ApplicationJob (line 3) | class ApplicationJob < ActiveJob::Base
FILE: app/jobs/github_commits_job.rb
type GithubCommitsJob (line 5) | module GithubCommitsJob
function initialize (line 8) | def initialize
function run (line 13) | def run
function update_total_commit_count_for (line 23) | def update_total_commit_count_for(project)
function github_url (line 32) | def github_url(project)
function update_user_commit_counts_for (line 36) | def update_user_commit_counts_for(project)
function get_contributor_stats (line 54) | def get_contributor_stats(repo)
function client (line 61) | def client
FILE: app/jobs/github_languages_job.rb
type GithubLanguagesJob (line 5) | module GithubLanguagesJob
function client (line 8) | def client
function run (line 16) | def run
function add_new_languages_to (line 24) | def add_new_languages_to(project)
function github_languages_for (line 31) | def github_languages_for(project)
function db_languages_for (line 42) | def db_languages_for(project)
function new_languages_for (line 46) | def new_languages_for(project)
function log_error (line 50) | def log_error(error, project)
FILE: app/jobs/github_last_updates_job.rb
type GithubLastUpdatesJob (line 5) | module GithubLastUpdatesJob
function run (line 8) | def run
function client (line 19) | def client
FILE: app/jobs/github_readme_files_job.rb
type GithubReadmeFilesJob (line 6) | module GithubReadmeFilesJob
function client (line 9) | def client
function run (line 17) | def run(projects)
function replace_relative_links_with_absolute (line 25) | def replace_relative_links_with_absolute(project_readme_html, project)
function anchor_link? (line 37) | def anchor_link?(url)
function convert_path (line 41) | def convert_path(node, base_uri)
function project_readme (line 45) | def project_readme(project)
function error_message (line 52) | def error_message(repository)
function content (line 56) | def content(repository, path)
function evaluate_exception (line 60) | def evaluate_exception(error, project)
function log_error (line 68) | def log_error(error, project)
FILE: app/jobs/github_static_pages_job.rb
type GithubStaticPagesJob (line 6) | module GithubStaticPagesJob
function client (line 11) | def client
function run (line 19) | def run
function get_content (line 28) | def get_content(repository)
function get_markdown_pages (line 32) | def get_markdown_pages(content)
function process_markdown_pages (line 36) | def process_markdown_pages(md_pages)
function create_static_page (line 48) | def create_static_page(filename, markdown)
function update_body (line 56) | def update_body(static_page, markdown)
function get_title (line 61) | def get_title(filename)
function get_slug (line 65) | def get_slug(filename)
function convert_markdown_to_html (line 69) | def convert_markdown_to_html(markdown)
FILE: app/mailers/admin_mailer.rb
class AdminMailer (line 3) | class AdminMailer < ApplicationMailer
method failed_to_invite_user_to_slack (line 6) | def failed_to_invite_user_to_slack(email, error, slack_error_message)
method backtrace_output (line 17) | def backtrace_output
FILE: app/mailers/application_mailer.rb
class ApplicationMailer (line 3) | class ApplicationMailer < ActionMailer::Base
FILE: app/mailers/mailer.rb
class Mailer (line 3) | class Mailer < ActionMailer::Base
method send_premium_payment_complete (line 6) | def send_premium_payment_complete(plan, email)
method send_sponsor_premium_payment_complete (line 11) | def send_sponsor_premium_payment_complete(email, sponsor_email)
method send_welcome_message (line 17) | def send_welcome_message(user)
method hire_me_form (line 22) | def hire_me_form(user, hire_me_form)
FILE: app/mailers/project_mailer.rb
class ProjectMailer (line 3) | class ProjectMailer < ApplicationMailer
method alert_project_creator_about_new_member (line 8) | def alert_project_creator_about_new_member
method welcome_project_joinee (line 12) | def welcome_project_joinee
method set_params (line 18) | def set_params
FILE: app/mailers/sandbox_email_interceptor.rb
class SandboxEmailInterceptor (line 3) | class SandboxEmailInterceptor
method delivering_email (line 4) | def self.delivering_email(message)
FILE: app/models/application_record.rb
class ApplicationRecord (line 3) | class ApplicationRecord < ActiveRecord::Base
FILE: app/models/article.rb
class Article (line 3) | class Article < ApplicationRecord
method url_for_me (line 16) | def url_for_me(action)
method vote_value (line 24) | def vote_value
method authored_by? (line 28) | def authored_by?(user)
FILE: app/models/authentication.rb
class Authentication (line 3) | class Authentication < ApplicationRecord
FILE: app/models/commit_count.rb
class CommitCount (line 5) | class CommitCount < ApplicationRecord
FILE: app/models/concerns/act_as_page.rb
type ActAsPage (line 3) | module ActAsPage
function included (line 4) | def self.included(base)
FILE: app/models/concerns/filterable.rb
type Filterable (line 3) | module Filterable
type ClassMethods (line 6) | module ClassMethods
function param_filter (line 7) | def param_filter(filtering_params)
FILE: app/models/concerns/user_nullable.rb
type UserNullable (line 3) | module UserNullable
function user (line 4) | def user
FILE: app/models/contact_form.rb
class ContactForm (line 3) | class ContactForm
FILE: app/models/document.rb
class Document (line 3) | class Document < ApplicationRecord
method url_for_me (line 19) | def url_for_me(action)
method slug_candidates (line 27) | def slug_candidates
FILE: app/models/event.rb
class Event (line 3) | class Event < ApplicationRecord
method set_repeat_ends_string (line 35) | def set_repeat_ends_string
method base_future_events (line 39) | def self.base_future_events(project)
method future_events (line 43) | def self.future_events
method repeats? (line 48) | def repeats?
method upcoming_events (line 52) | def self.upcoming_events(project = nil)
method remove_past_events (line 59) | def self.remove_past_events(events)
method hookups (line 66) | def self.hookups
method pending_hookups (line 70) | def self.pending_hookups
method event_date (line 80) | def event_date
method start_time (line 84) | def start_time
method series_end_time (line 88) | def series_end_time
method instance_end_time (line 92) | def instance_end_time
method end_date (line 96) | def end_date
method live? (line 104) | def live?
method final_datetime_for_collection (line 108) | def final_datetime_for_collection(options = {})
method start_datetime_for_collection (line 119) | def start_datetime_for_collection(options = {})
method next_occurrence_time_method (line 125) | def next_occurrence_time_method(start = Time.now)
method next_occurrence (line 130) | def self.next_occurrence(event_type, begin_time = NEXT_SCRUM_COLLECTIO...
method next_event_occurrence_with_time (line 146) | def next_event_occurrence_with_time(start = Time.now, final = 2.months...
method next_event_occurrence_with_time_inner (line 162) | def next_event_occurrence_with_time_inner(start_time, end_time)
method next_occurrences (line 167) | def next_occurrences(options = {})
method occurrences_between (line 179) | def occurrences_between(start_time, end_time)
method repeats_weekly_each_days_of_the_week= (line 183) | def repeats_weekly_each_days_of_the_week=(repeats_weekly_each_days_of_...
method repeats_weekly_each_days_of_the_week (line 189) | def repeats_weekly_each_days_of_the_week
method remove_from_schedule (line 195) | def remove_from_schedule(timedate)
method schedule (line 207) | def schedule
method start_time_with_timezone (line 229) | def start_time_with_timezone
method last_hangout (line 233) | def last_hangout
method recent_hangouts (line 237) | def recent_hangouts
method less_than_ten_till_start? (line 243) | def less_than_ten_till_start?
method within_current_event_duration? (line 251) | def within_current_event_duration?
method current_start_time (line 255) | def current_start_time
method current_end_time (line 259) | def current_end_time
method before_current_end_time? (line 263) | def before_current_end_time?
method after_current_start_time? (line 269) | def after_current_start_time?
method jitsi_room_link (line 275) | def jitsi_room_link
method modifier (line 279) | def modifier
method slack_channel_codes (line 283) | def slack_channel_codes
method must_have_at_least_one_repeats_weekly_each_days_of_the_week (line 289) | def must_have_at_least_one_repeats_weekly_each_days_of_the_week
method repeating_and_ends? (line 295) | def repeating_and_ends?
FILE: app/models/event_date.rb
class EventDate (line 3) | class EventDate
method for (line 4) | def self.for(event_date)
FILE: app/models/event_instance.rb
class EventInstance (line 3) | class EventInstance < ApplicationRecord
method for (line 21) | def for
method active_hangouts (line 25) | def self.active_hangouts
method started? (line 29) | def started?
method updated_within_last_two_minutes? (line 33) | def updated_within_last_two_minutes?
method updated_within_current_event_duration? (line 38) | def updated_within_current_event_duration?(margin)
method live? (line 45) | def live?
method duration (line 53) | def duration
method start_datetime (line 57) | def start_datetime
method broadcaster (line 61) | def broadcaster
method yt_url (line 67) | def yt_url
method channels_for_event (line 71) | def channels_for_event
method this_month_until_now (line 78) | def self.this_month_until_now
method manually_updated_event_not_finished? (line 87) | def manually_updated_event_not_finished?
FILE: app/models/follow.rb
class Follow (line 3) | class Follow < ApplicationRecord
method block! (line 11) | def block!
FILE: app/models/hangout_participants_snapshot.rb
class HangoutParticipantsSnapshot (line 3) | class HangoutParticipantsSnapshot < ApplicationRecord
FILE: app/models/issue_tracker.rb
class IssueTracker (line 3) | class IssueTracker < ApplicationRecord
FILE: app/models/karma.rb
class Karma (line 3) | class Karma < ApplicationRecord
FILE: app/models/language.rb
class Language (line 3) | class Language < ApplicationRecord
FILE: app/models/language_project.rb
class LanguageProject (line 3) | class LanguageProject < ApplicationRecord
FILE: app/models/null_user.rb
class NullUser (line 3) | class NullUser < User
method persisted? (line 4) | def persisted?
method initialize (line 8) | def initialize(name)
method presenter (line 12) | def presenter
method gravatar_image (line 16) | def gravatar_image
FILE: app/models/payment_source.rb
type PaymentSource (line 3) | module PaymentSource
class PaymentSource (line 4) | class PaymentSource < ApplicationRecord
class CraftAcademy (line 8) | class CraftAcademy < PaymentSource
class Stripe (line 11) | class Stripe < PaymentSource
class PayPal (line 14) | class PayPal < PaymentSource
class Invoice (line 17) | class Invoice < PaymentSource
class Other (line 20) | class Other < PaymentSource
FILE: app/models/plan.rb
class Plan (line 3) | class Plan < ApplicationRecord
method free_trial? (line 4) | def free_trial?
FILE: app/models/premium.rb
class Premium (line 3) | class Premium < Subscription
FILE: app/models/premium_f2_f.rb
class PremiumF2F (line 3) | class PremiumF2F < Subscription
FILE: app/models/premium_mob.rb
class PremiumMob (line 3) | class PremiumMob < Subscription
FILE: app/models/premium_plus.rb
class PremiumPlus (line 3) | class PremiumPlus < Subscription
FILE: app/models/project.rb
class Project (line 3) | class Project < ApplicationRecord
method with_github_url (line 38) | def self.with_github_url
method gpa (line 44) | def gpa
method github_url (line 48) | def github_url
method slack_channel (line 52) | def slack_channel
method youtube_tags (line 56) | def youtube_tags
method members (line 64) | def members
method members_tags (line 68) | def members_tags
method github_repo (line 75) | def github_repo
method github_repo_name (line 82) | def github_repo_name
method github_repo_user_name (line 86) | def github_repo_user_name
method contribution_url (line 90) | def contribution_url
method url_for_me (line 96) | def url_for_me(action)
method jitsi_room_link (line 104) | def jitsi_room_link
method meet_room_link (line 108) | def meet_room_link
method slack_channel_codes (line 112) | def slack_channel_codes
method should_generate_new_friendly_id? (line 118) | def should_generate_new_friendly_id?
FILE: app/models/slack_channel.rb
class SlackChannel (line 3) | class SlackChannel < ApplicationRecord
FILE: app/models/source_repository.rb
class SourceRepository (line 3) | class SourceRepository < ApplicationRecord
method name (line 6) | def name
FILE: app/models/static_page.rb
class StaticPage (line 3) | class StaticPage < ApplicationRecord
method url_for_me (line 7) | def self.url_for_me(page)
method to_param (line 18) | def to_param
FILE: app/models/status.rb
class Status (line 3) | class Status < ApplicationRecord
FILE: app/models/subscription.rb
class Subscription (line 3) | class Subscription < ApplicationRecord
FILE: app/models/user.rb
class User (line 3) | class User < ApplicationRecord
method stripe_customer_id (line 52) | def stripe_customer_id
method current_subscription (line 81) | def current_subscription
method allowed_to_attend? (line 89) | def allowed_to_attend?
method filter_if_title (line 93) | def self.filter_if_title(title)
method membership_type (line 99) | def membership_type
method apply_omniauth (line 106) | def apply_omniauth(omniauth)
method password_required? (line 112) | def password_required?
method has_auth (line 116) | def has_auth(provider)
method followed_project_tags (line 120) | def followed_project_tags
method display_name (line 126) | def display_name
method full_name (line 130) | def full_name
method email_designator (line 135) | def email_designator
method should_generate_new_friendly_id? (line 141) | def should_generate_new_friendly_id?
method gravatar_url (line 145) | def gravatar_url(options = {})
method profile_completeness (line 154) | def profile_completeness
method is_privileged? (line 165) | def is_privileged?
method find_by_github_username (line 171) | def self.find_by_github_username(username)
method online? (line 176) | def online?
method map_data (line 180) | def self.map_data
method incomplete? (line 193) | def incomplete?
method commit_count_total (line 197) | def commit_count_total
method number_hangouts_started_with_more_than_one_participant (line 201) | def number_hangouts_started_with_more_than_one_participant
method activity (line 205) | def activity
method membership_length (line 209) | def membership_length
method karma_total (line 213) | def karma_total
method user_age_in_months (line 221) | def user_age_in_months
method email_absence (line 227) | def email_absence
FILE: app/presenters/base_presenter.rb
class BasePresenter (line 5) | class BasePresenter
method initialize (line 14) | def initialize(object)
method presents (line 18) | def self.presents(name)
method object_age_in_words (line 24) | def object_age_in_words
method method_missing (line 28) | def method_missing(...)
FILE: app/presenters/event_instance_presenter.rb
class EventInstancePresenter (line 3) | class EventInstancePresenter < BasePresenter
method created_at (line 6) | def created_at
method title (line 10) | def title
method category (line 14) | def category
method project_link (line 18) | def project_link
method event_link (line 27) | def event_link
method host (line 31) | def host
method participants (line 35) | def participants
method video_url (line 39) | def video_url
method duration (line 47) | def duration
method video_link (line 51) | def video_link
method video_embed_link (line 57) | def video_embed_link
method map_to_users (line 63) | def map_to_users(participants)
method process_users (line 68) | def process_users(participant)
FILE: app/presenters/users/user_presenter.rb
class UserPresenter (line 5) | class UserPresenter < BasePresenter
method has_skills? (line 10) | def has_skills?
method joined_projects? (line 14) | def joined_projects?
method contributed? (line 18) | def contributed?
method contributions (line 22) | def contributions
method country (line 28) | def country
method title_list (line 33) | def title_list
method has_title? (line 37) | def has_title?
method gravatar_image (line 41) | def gravatar_image(options = {})
method email_link (line 52) | def email_link(text = nil)
method github_username (line 56) | def github_username
method github_link (line 60) | def github_link
method profile_link (line 64) | def profile_link
method status (line 68) | def status
method status? (line 72) | def status?
method blank_fields (line 76) | def blank_fields
method user_same_as? (line 82) | def user_same_as?(other_user)
method display_hire_me? (line 86) | def display_hire_me?(current_user = nil)
FILE: app/services/add_subscription_to_user_for_plan.rb
class AddSubscriptionToUserForPlan (line 3) | class AddSubscriptionToUserForPlan
method with (line 4) | def self.with(user, sponsor, time, plan, payment_source, subscription_...
method ensure_all_previous_subscriptions_are_ended (line 13) | def self.ensure_all_previous_subscriptions_are_ended(user, time)
FILE: app/services/error_logging_service.rb
class ErrorLoggingService (line 3) | class ErrorLoggingService
method initialize (line 4) | def initialize(error)
method log (line 8) | def log(message)
FILE: app/services/hangout_notification_service.rb
class HangoutNotificationService (line 7) | class HangoutNotificationService
method with (line 8) | def self.with(event_instance,
method initialize (line 16) | def initialize(event_instance, slack_client, gitter_client)
method run (line 22) | def run
method channels_for_project (line 35) | def channels_for_project(project)
method send_notifications (line 41) | def send_notifications(channels)
method post_premium_mob_hangout_notification (line 55) | def post_premium_mob_hangout_notification
method post_scrum_notification (line 60) | def post_scrum_notification
method post_pair_programming_notification (line 66) | def post_pair_programming_notification(channels)
method send_gitter_message_avoid_repeats (line 78) | def send_gitter_message_avoid_repeats(message)
method send_slack_message (line 85) | def send_slack_message(client, channels, message)
FILE: app/services/karma_calculator.rb
class KarmaCalculator (line 3) | class KarmaCalculator
method initialize (line 6) | def initialize(user)
method calculate (line 10) | def calculate
method sum_elements (line 24) | def sum_elements
method membership_length (line 30) | def membership_length
method profile_completeness (line 35) | def profile_completeness
method number_github_contributions (line 43) | def number_github_contributions
method number_hangouts_started_with_more_than_one_participant (line 47) | def number_hangouts_started_with_more_than_one_participant
method activity (line 52) | def activity
method event_participation (line 56) | def event_participation
FILE: app/services/markdown_converter.rb
class MarkdownConverter (line 3) | class MarkdownConverter
method initialize (line 7) | def initialize(markdown)
method as_html (line 11) | def as_html
method converted_markdown (line 17) | def converted_markdown
FILE: app/services/modify_event_participation.rb
class ModifyEventParticipation (line 3) | class ModifyEventParticipation
method run (line 4) | def self.run
FILE: app/services/paypal_service.rb
class PaypalService (line 11) | class PaypalService
method initialize (line 12) | def initialize(plan)
method create_and_activate_recurring_plan (line 16) | def create_and_activate_recurring_plan
method create_agreement (line 23) | def create_agreement
method execute_agreement (line 31) | def self.execute_agreement(agreement_token)
method activate_plan_params (line 39) | def activate_plan_params
method plan_params_with_trial (line 47) | def plan_params_with_trial
method plan_params_without_trial (line 57) | def plan_params_without_trial
method agreement_params (line 67) | def agreement_params(plan)
method merchant_preferences (line 77) | def merchant_preferences
method regular_payment_definition (line 92) | def regular_payment_definition
method trial_payment_definition (line 107) | def trial_payment_definition
FILE: app/services/youtube_notification_service.rb
class YoutubeNotificationService (line 6) | class YoutubeNotificationService
method with (line 7) | def self.with(event_instance,
method initialize (line 14) | def initialize(event_instance, slack_client)
method run (line 19) | def run
method channels_for_project (line 32) | def channels_for_project(project)
method send_notifications (line 38) | def send_notifications(channels)
method post_premium_mob_youtube_notification (line 51) | def post_premium_mob_youtube_notification
method send_slack_message (line 55) | def send_slack_message(channels)
FILE: config/application.rb
type WebsiteOne (line 26) | module WebsiteOne
class Application (line 27) | class Application < Rails::Application
FILE: config/initializers/cucumber.rb
function feature (line 8) | def feature
FILE: config/initializers/youtube.rb
type Youtube (line 3) | module Youtube
FILE: config/nested_key_extension.rb
function nested_hash_value (line 3) | def nested_hash_value(obj, key)
FILE: config/routes.rb
function loaderio_token (line 3) | def loaderio_token
FILE: config/zeus/custom_plan.rb
class CucumberPlan (line 4) | class CucumberPlan < Zeus::Rails
method cucumber_environment (line 5) | def cucumber_environment
method cucumber (line 11) | def cucumber(argv = ARGV)
FILE: db/migrate/20140109040839_devise_create_users.rb
class DeviseCreateUsers (line 3) | class DeviseCreateUsers < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140110123347_create_projects.rb
class CreateProjects (line 3) | class CreateProjects < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140116112830_create_documents.rb
class CreateDocuments (line 3) | class CreateDocuments < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140118045711_change_projects_attributes.rb
class ChangeProjectsAttributes (line 3) | class ChangeProjectsAttributes < ActiveRecord::Migration[4.2]
method up (line 4) | def up
FILE: db/migrate/20140120014041_add_first_last_names_to_users.rb
class AddFirstLastNamesToUsers (line 3) | class AddFirstLastNamesToUsers < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140124205750_add_parent_id_to_documents.rb
class AddParentIdToDocuments (line 3) | class AddParentIdToDocuments < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140124213333_create_authentications.rb
class CreateAuthentications (line 3) | class CreateAuthentications < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140127043432_acts_as_follower_migration.rb
class ActsAsFollowerMigration (line 3) | class ActsAsFollowerMigration < ActiveRecord::Migration[4.2]
method up (line 4) | def self.up
method down (line 16) | def self.down
FILE: db/migrate/20140130073721_add_created_by_to_documents.rb
class AddCreatedByToDocuments (line 3) | class AddCreatedByToDocuments < ActiveRecord::Migration[4.2]
method up (line 4) | def self.up
method down (line 9) | def self.down
FILE: db/migrate/20140130073828_add_created_by_to_projects.rb
class AddCreatedByToProjects (line 3) | class AddCreatedByToProjects < ActiveRecord::Migration[4.2]
method up (line 4) | def self.up
method down (line 9) | def self.down
FILE: db/migrate/20140207004506_add_display_email_to_users.rb
class AddDisplayEmailToUsers (line 3) | class AddDisplayEmailToUsers < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140207033343_add_you_tube_id_to_user.rb
class AddYouTubeIdToUser (line 3) | class AddYouTubeIdToUser < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140207190458_add_slugs_to_models.rb
class AddSlugsToModels (line 3) | class AddSlugsToModels < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140209164254_add_display_profile_to_users.rb
class AddDisplayProfileToUsers (line 3) | class AddDisplayProfileToUsers < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140215192014_acts_as_taggable_on_migration.rb
class ActsAsTaggableOnMigration (line 3) | class ActsAsTaggableOnMigration < ActiveRecord::Migration[4.2]
method up (line 4) | def self.up
method down (line 28) | def self.down
FILE: db/migrate/20140219145424_create_articles.rb
class CreateArticles (line 3) | class CreateArticles < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140220091703_add_latitude_and_longitude_to_user.rb
class AddLatitudeAndLongitudeToUser (line 3) | class AddLatitudeAndLongitudeToUser < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140220131347_add_country_region_city_to_user.rb
class AddCountryRegionCityToUser (line 3) | class AddCountryRegionCityToUser < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140225000044_create_versions.rb
class CreateVersions (line 3) | class CreateVersions < ActiveRecord::Migration[4.2]
method up (line 4) | def self.up
method down (line 16) | def self.down
FILE: db/migrate/20140225215805_create_events.rb
class CreateEvents (line 3) | class CreateEvents < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140304210808_add_youtube_user_name_to_user.rb
class AddYoutubeUserNameToUser (line 3) | class AddYoutubeUserNameToUser < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140305125426_add_current_hoa_url_to_events.rb
class AddCurrentHoaUrlToEvents (line 3) | class AddCurrentHoaUrlToEvents < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140309133549_add_github_profile_url.rb
class AddGithubProfileUrl (line 3) | class AddGithubProfileUrl < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140311052222_add_pivotaltracker_id_to_projects.rb
class AddPivotaltrackerIdToProjects (line 3) | class AddPivotaltrackerIdToProjects < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140313161712_replace_document_index.rb
class ReplaceDocumentIndex (line 3) | class ReplaceDocumentIndex < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140317093616_add_display_hire_me_to_users.rb
class AddDisplayHireMeToUsers (line 3) | class AddDisplayHireMeToUsers < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140319173130_add_bio_to_users.rb
class AddBioToUsers (line 3) | class AddBioToUsers < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140322120003_create_pages.rb
class CreatePages (line 3) | class CreatePages < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140324210924_add_github_url_to_projects.rb
class AddGithubUrlToProjects (line 3) | class AddGithubUrlToProjects < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140324211134_add_pivotaltracker_url_to_projects.rb
class AddPivotaltrackerUrlToProjects (line 3) | class AddPivotaltrackerUrlToProjects < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140402091353_add_slug_to_events.rb
class AddSlugToEvents (line 3) | class AddSlugToEvents < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140404100037_remove_pivotaltracker_id_from_projects.rb
class RemovePivotaltrackerIdFromProjects (line 3) | class RemovePivotaltrackerIdFromProjects < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140414125301_add_email_option_to_user.rb
class AddEmailOptionToUser (line 3) | class AddEmailOptionToUser < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140417124942_acts_as_votable_migration.rb
class ActsAsVotableMigration (line 3) | class ActsAsVotableMigration < ActiveRecord::Migration[4.2]
method up (line 4) | def self.up
method down (line 25) | def self.down
FILE: db/migrate/20140427074629_add_missing_unique_indices.acts_as_taggable_on_engine.rb
class AddMissingUniqueIndices (line 4) | class AddMissingUniqueIndices < ActiveRecord::Migration[4.2]
method up (line 5) | def self.up
method down (line 15) | def self.down
FILE: db/migrate/20140427074630_add_taggings_counter_cache_to_tags.acts_as_taggable_on_engine.rb
class AddTaggingsCounterCacheToTags (line 4) | class AddTaggingsCounterCacheToTags < ActiveRecord::Migration[4.2]
method up (line 5) | def self.up
method down (line 14) | def self.down
FILE: db/migrate/20140525135633_add_karma_to_users.rb
class AddKarmaToUsers (line 3) | class AddKarmaToUsers < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140606204845_create_hangouts.rb
class CreateHangouts (line 3) | class CreateHangouts < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140615154859_add_indexes_for_references.rb
class AddIndexesForReferences (line 3) | class AddIndexesForReferences < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140618153610_create_commit_counts.rb
class CreateCommitCounts (line 3) | class CreateCommitCounts < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140707211758_add_category_to_hangout.rb
class AddCategoryToHangout (line 3) | class AddCategoryToHangout < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140716134701_import_getting_started_static_page.rb
class ImportGettingStartedStaticPage (line 3) | class ImportGettingStartedStaticPage < ActiveRecord::Migration[4.2]
method up (line 4) | def up
method down (line 11) | def down; end
FILE: db/migrate/20140725131327_event_combine_date_and_time_fields.rb
class EventCombineDateAndTimeFields (line 3) | class EventCombineDateAndTimeFields < ActiveRecord::Migration[4.2]
method convert_start_datetime (line 4) | def convert_start_datetime(e)
method convert_duration (line 12) | def convert_duration(e)
method up (line 20) | def up
method down (line 36) | def down
FILE: db/migrate/20140730123120_add_project_and_host_to_hangout.rb
class AddProjectAndHostToHangout (line 3) | class AddProjectAndHostToHangout < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140910225619_add_exclusions_to_events.rb
class AddExclusionsToEvents (line 3) | class AddExclusionsToEvents < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140913021637_add_pitch_to_projects.rb
class AddPitchToProjects (line 3) | class AddPitchToProjects < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140913183322_change_column.rb
class ChangeColumn (line 3) | class ChangeColumn < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140914202645_create_activities.rb
class CreateActivities (line 4) | class CreateActivities < ActiveRecord::Migration[4.2]
method up (line 6) | def self.up
method down (line 23) | def self.down
FILE: db/migrate/20140917070939_rename_hangouts_to_event_instances.rb
class RenameHangoutsToEventInstances (line 3) | class RenameHangoutsToEventInstances < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20140929201012_create_statuses.rb
class CreateStatuses (line 3) | class CreateStatuses < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20141002084933_create_newsletters.rb
class CreateNewsletters (line 3) | class CreateNewsletters < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20141007192312_add_commit_count_to_projects.rb
class AddCommitCountToProjects (line 3) | class AddCommitCountToProjects < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20141013191112_add_attributes_to_users.rb
class AddAttributesToUsers (line 3) | class AddAttributesToUsers < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20141119002743_add_image_url_to_projects.rb
class AddImageUrlToProjects (line 3) | class AddImageUrlToProjects < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20150208124239_add_timezone_offset_to_users.rb
class AddTimezoneOffsetToUsers (line 3) | class AddTimezoneOffsetToUsers < ActiveRecord::Migration[4.2]
method up (line 4) | def up
method down (line 8) | def down
FILE: db/migrate/20150308085306_add_missing_taggable_index.acts_as_taggable_on_engine.rb
class AddMissingTaggableIndex (line 4) | class AddMissingTaggableIndex < ActiveRecord::Migration[4.2]
method up (line 5) | def self.up
method down (line 9) | def self.down
FILE: db/migrate/20150308085307_change_collation_for_tag_names.acts_as_taggable_on_engine.rb
class ChangeCollationForTagNames (line 6) | class ChangeCollationForTagNames < ActiveRecord::Migration[4.2]
method up (line 7) | def up
FILE: db/migrate/20150410173625_add_status_count_to_users.rb
class AddStatusCountToUsers (line 3) | class AddStatusCountToUsers < ActiveRecord::Migration[4.2]
method up (line 4) | def up
method down (line 8) | def down
FILE: db/migrate/20150520184236_add_hoa_status_to_event_instances.rb
class AddHoaStatusToEventInstances (line 3) | class AddHoaStatusToEventInstances < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20160316153919_add_project_to_events.rb
class AddProjectToEvents (line 3) | class AddProjectToEvents < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20160627134611_add_creator_to_events.rb
class AddCreatorToEvents (line 3) | class AddCreatorToEvents < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20160831131548_add_stripe_customer_i_dto_users.rb
class AddStripeCustomerIDtoUsers (line 3) | class AddStripeCustomerIDtoUsers < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20160921152810_create_karmas.rb
class CreateKarmas (line 3) | class CreateKarmas < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20160923135850_add_subscriptions.rb
class AddSubscriptions (line 3) | class AddSubscriptions < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20160923145243_add_payment_sources.rb
class AddPaymentSources (line 3) | class AddPaymentSources < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20160928132707_remove_karma_from_user_table.rb
class RemoveKarmaFromUserTable (line 3) | class RemoveKarmaFromUserTable < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20160928134250_rename_karma_karma_to_total.rb
class RenameKarmaKarmaToTotal (line 3) | class RenameKarmaKarmaToTotal < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20160928152822_add_hangout_participants_snapshots.rb
class AddHangoutParticipantsSnapshots (line 3) | class AddHangoutParticipantsSnapshots < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20161028144621_add_url_set_directly_column_to_event_instance.rb
class AddUrlSetDirectlyColumnToEventInstance (line 3) | class AddUrlSetDirectlyColumnToEventInstance < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20161103011445_create_friendly_id_slugs.rb
class CreateFriendlyIdSlugs (line 3) | class CreateFriendlyIdSlugs < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20161122200727_add_deleted_at_to_users.rb
class AddDeletedAtToUsers (line 3) | class AddDeletedAtToUsers < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20161128165206_add_last_commit_at_to_projects.rb
class AddLastCommitAtToProjects (line 3) | class AddLastCommitAtToProjects < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20161218160338_create_plans.rb
class CreatePlans (line 3) | class CreatePlans < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20161221125828_add_plan_to_subscription.rb
class AddPlanToSubscription (line 3) | class AddPlanToSubscription < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20161221182758_remove_stripe_customer_from_user.rb
class RemoveStripeCustomerFromUser (line 3) | class RemoveStripeCustomerFromUser < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20161223092205_add_youtube_tweeet_sent_to_event_instances.rb
class AddYoutubeTweeetSentToEventInstances (line 3) | class AddYoutubeTweeetSentToEventInstances < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20170115171525_add_category_column_to_plans.rb
class AddCategoryColumnToPlans (line 3) | class AddCategoryColumnToPlans < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20170918083218_create_source_repositories.rb
class CreateSourceRepositories (line 3) | class CreateSourceRepositories < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20171118201937_add_sponsor_column_to_subscription.rb
class AddSponsorColumnToSubscription (line 3) | class AddSponsorColumnToSubscription < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20180121175914_add_for_column_to_events.rb
class AddForColumnToEvents (line 3) | class AddForColumnToEvents < ActiveRecord::Migration[4.2]
method change (line 4) | def change
FILE: db/migrate/20180406015134_add_event_participation_count_to_users.rb
class AddEventParticipationCountToUsers (line 3) | class AddEventParticipationCountToUsers < ActiveRecord::Migration[5.1]
method change (line 4) | def change
FILE: db/migrate/20180507045056_add_column_modifier_id_to_events.rb
class AddColumnModifierIdToEvents (line 3) | class AddColumnModifierIdToEvents < ActiveRecord::Migration[5.1]
method change (line 4) | def change
FILE: db/migrate/20180514105034_set_users_receive_mailings_default_false.rb
class SetUsersReceiveMailingsDefaultFalse (line 3) | class SetUsersReceiveMailingsDefaultFalse < ActiveRecord::Migration[5.1]
method change (line 4) | def change
FILE: db/migrate/20180515093331_remove_newsletter.rb
class RemoveNewsletter (line 3) | class RemoveNewsletter < ActiveRecord::Migration[5.1]
method change (line 4) | def change
FILE: db/migrate/20180729040001_add_slack_channel_name_to_projects.rb
class AddSlackChannelNameToProjects (line 3) | class AddSlackChannelNameToProjects < ActiveRecord::Migration[5.1]
method change (line 4) | def change
FILE: db/migrate/20180730173345_add_creator_attendance_to_events.rb
class AddCreatorAttendanceToEvents (line 3) | class AddCreatorAttendanceToEvents < ActiveRecord::Migration[5.1]
method change (line 4) | def change
FILE: db/migrate/20180803173355_add_can_see_dashboard_to_users.rb
class AddCanSeeDashboardToUsers (line 3) | class AddCanSeeDashboardToUsers < ActiveRecord::Migration[5.1]
method change (line 4) | def change
FILE: db/migrate/20180810180605_add_karma_breakdown_elements_to_karma_table.rb
class AddKarmaBreakdownElementsToKarmaTable (line 3) | class AddKarmaBreakdownElementsToKarmaTable < ActiveRecord::Migration[5.1]
method change (line 4) | def change
FILE: db/migrate/20180813125658_create_languages.rb
class CreateLanguages (line 3) | class CreateLanguages < ActiveRecord::Migration[5.1]
method change (line 4) | def change
FILE: db/migrate/20180828145628_vanity_migration.rb
class VanityMigration (line 5) | class VanityMigration < ActiveRecord::Migration[5.1]
method connection (line 9) | def connection
method with_vanity_connection (line 14) | def with_vanity_connection
method up (line 20) | def up
method down (line 70) | def down
FILE: db/migrate/20181220155404_create_slack_channel.rb
class CreateSlackChannel (line 3) | class CreateSlackChannel < ActiveRecord::Migration[5.2]
method change (line 4) | def change
FILE: db/migrate/20181220160421_create_join_table_project_slack_channel.rb
class CreateJoinTableProjectSlackChannel (line 3) | class CreateJoinTableProjectSlackChannel < ActiveRecord::Migration[5.2]
method change (line 4) | def change
FILE: db/migrate/20190129191454_add_paypal_id_to_plans.rb
class AddPaypalIdToPlans (line 3) | class AddPaypalIdToPlans < ActiveRecord::Migration[5.2]
method change (line 4) | def change
FILE: db/migrate/20190311230108_create_issue_trackers.rb
class CreateIssueTrackers (line 3) | class CreateIssueTrackers < ActiveRecord::Migration[5.2]
method change (line 4) | def change
FILE: db/migrate/20190412143519_create_join_table_events_slack_channel.rb
class CreateJoinTableEventsSlackChannel (line 3) | class CreateJoinTableEventsSlackChannel < ActiveRecord::Migration[5.2]
method change (line 4) | def change
FILE: db/migrate/20210702172212_drop_vanity_tables.rb
class DropVanityTables (line 3) | class DropVanityTables < ActiveRecord::Migration[6.1]
method change (line 4) | def change
FILE: db/migrate/20210721093118_add_admin_to_users.rb
class AddAdminToUsers (line 3) | class AddAdminToUsers < ActiveRecord::Migration[6.1]
method change (line 4) | def change
FILE: db/migrate/20221215192333_change_exclusions_in_events.rb
class ChangeExclusionsInEvents (line 3) | class ChangeExclusionsInEvents < ActiveRecord::Migration[6.1]
method change (line 4) | def change
FILE: db/migrate/20221215193425_change_participants_in_event_instances.rb
class ChangeParticipantsInEventInstances (line 3) | class ChangeParticipantsInEventInstances < ActiveRecord::Migration[6.1]
method change (line 4) | def change
FILE: db/migrate/20230314192607_create_active_storage_tables.active_storage.rb
class CreateActiveStorageTables (line 4) | class CreateActiveStorageTables < ActiveRecord::Migration[5.2]
method change (line 5) | def change
method primary_and_foreign_key_types (line 54) | def primary_and_foreign_key_types
FILE: db/migrate/20230314193359_create_action_text_tables.action_text.rb
class CreateActionTextTables (line 4) | class CreateActionTextTables < ActiveRecord::Migration[6.0]
method change (line 5) | def change
method primary_and_foreign_key_types (line 22) | def primary_and_foreign_key_types
FILE: db/seeds.rb
function get_country (line 7) | def get_country
FILE: features/step_definitions/basic_steps.rb
function url_for_title (line 3) | def url_for_title(options)
function path_to (line 8) | def path_to(page_name, id = '')
function current_fullpath (line 191) | def current_fullpath
function assert_link_exists (line 350) | def assert_link_exists(path, text)
FILE: features/step_definitions/contained_search_steps.rb
function css_selector_for (line 4) | def css_selector_for(container)
FILE: features/step_definitions/email_steps.rb
function check_email (line 23) | def check_email(email, negate, subject, body = nil, message = 0, num_mai...
FILE: features/step_definitions/hangout_steps.rb
function set_event_start_date (line 3) | def set_event_start_date(event_ins, num)
FILE: features/step_definitions/pages_steps.rb
function static_page_path (line 3) | def static_page_path(page)
FILE: features/step_definitions/premium_steps.rb
function submit_card_details_for_button_with (line 44) | def submit_card_details_for_button_with(text, email = 'random@morerandom...
function other_plans (line 149) | def other_plans(plan_name)
FILE: features/step_definitions/static_pages_edit_button_steps.rb
function github_edit_url (line 3) | def github_edit_url
function static_page (line 7) | def static_page
FILE: features/step_definitions/user_steps.rb
function set_user_as_premium (line 54) | def set_user_as_premium(user, plan = 'Premium')
FILE: features/support/helpers.rb
type Helpers (line 3) | module Helpers
function default_test_author (line 4) | def default_test_author
function test_ip_address (line 10) | def test_ip_address
function test_user_password (line 14) | def test_user_password
function default_test_user_details (line 18) | def default_test_user_details
function create_visitor (line 35) | def create_visitor(receive_mailings: false)
function create_user (line 47) | def create_user(opts = {})
function create_privileged_visitor (line 52) | def create_privileged_visitor(receive_mailings: false)
function create_privileged_user (line 64) | def create_privileged_user
function delete_user (line 69) | def delete_user
function sign_up (line 75) | def sign_up
function sign_in (line 87) | def sign_in
function all_users (line 96) | def all_users
type WithinHelpers (line 101) | module WithinHelpers
function with_scope (line 102) | def with_scope(locator, &block)
function has_link_or_button? (line 106) | def has_link_or_button?(page, name)
type WaitForAjax (line 111) | module WaitForAjax
function wait_for_ajax (line 112) | def wait_for_ajax
function finished_all_ajax_requests? (line 118) | def finished_all_ajax_requests?
class Capybara::Result (line 127) | class Capybara::Result
method second (line 128) | def second
type Capybara (line 133) | module Capybara
class Session (line 134) | class Session
method has_link_or_button? (line 135) | def has_link_or_button?(name)
class String (line 141) | class String
method underscore (line 142) | def underscore
FILE: features/support/selectors.rb
type HtmlSelectorsHelpers (line 3) | module HtmlSelectorsHelpers
function selector_for (line 10) | def selector_for(locator)
FILE: lib/agile_ventures.rb
type AgileVentures (line 5) | module AgileVentures
FILE: lib/agile_ventures/errors.rb
type AgileVentures (line 3) | module AgileVentures
class Error (line 4) | class Error < RuntimeError
class AccessDenied (line 7) | class AccessDenied < Error
method initialize (line 8) | def initialize(user, request)
FILE: lib/channels_list.rb
type ChannelsList (line 3) | module ChannelsList
FILE: lib/core_ext/active_record/base_extension.rb
type ActiveRecord (line 3) | module ActiveRecord
class Base (line 4) | class Base
method presenter (line 5) | def presenter
FILE: lib/core_ext/datetime.rb
class DateTime (line 3) | class DateTime
method distance_to (line 4) | def distance_to(end_date)
FILE: lib/custom_errors.rb
type CustomErrors (line 5) | module CustomErrors
function included (line 6) | def self.included(base)
function render_error (line 18) | def render_error(status, error)
FILE: lib/paypal.rb
class Paypal (line 3) | class Paypal
method initialize (line 4) | def initialize(token, email, payer_id, payment_method, plan, user)
method url_params (line 13) | def url_params
FILE: lib/tasks/import_pages.rake
function get_title (line 36) | def get_title(page)
FILE: lib/validators/image_url_validator.rb
class ImageUrlValidator (line 3) | class ImageUrlValidator < ActiveModel::Validator
method validate (line 10) | def validate(record)
method invalid_format? (line 24) | def invalid_format?(url)
method is_image_host_whitelisted? (line 29) | def is_image_host_whitelisted?(url)
FILE: lib/validators/pivotal_tracker_url_validator.rb
class PivotalTrackerUrlValidator (line 3) | class PivotalTrackerUrlValidator < ActiveModel::Validator
method validate (line 4) | def validate(record)
method validate_pivotal_tracker_url (line 10) | def validate_pivotal_tracker_url(record)
method is_pivotal_tracker_url? (line 27) | def is_pivotal_tracker_url?(record)
FILE: lib/validators/uri_validator.rb
class UriValidator (line 4) | class UriValidator < ActiveModel::EachValidator
method validate_each (line 5) | def validate_each(record, attribute, value)
method generic_failure_message (line 16) | def generic_failure_message
method allowed_protocols_humanized (line 20) | def allowed_protocols_humanized
method allowed_protocols (line 24) | def allowed_protocols
method parse_uri (line 28) | def parse_uri(value)
FILE: spec/controllers/application_controller_spec.rb
function events (line 5) | def events
function new (line 9) | def new
function new_user (line 13) | def new_user
function new_password (line 17) | def new_password
function signout (line 21) | def signout
function edit_password (line 25) | def edit_password
FILE: spec/controllers/concerns/deactivated_user_finder_spec.rb
class FakeController (line 5) | class FakeController < ActionController::Base
FILE: spec/controllers/concerns/statistics_spec.rb
class FakeController (line 5) | class FakeController < ActionController::Base
FILE: spec/helpers/devise_helper_spec.rb
function acts_well_when_no_error? (line 43) | def acts_well_when_no_error?(method_name)
FILE: spec/javascripts/helpers/spec_helper.js
function reloadModule (line 7) | function reloadModule(name) {
FILE: spec/javascripts/support/jasmine_helper.rb
type Jasmine (line 15) | module Jasmine
class Config (line 16) | class Config
FILE: spec/lib/custom_errors_spec.rb
function raise_404 (line 9) | def raise_404
function raise_500 (line 13) | def raise_500
FILE: spec/mailers/previews/admin_mailer_preview.rb
class AdminMailerPreview (line 4) | class AdminMailerPreview < ActionMailer::Preview
FILE: spec/mailers/previews/project_mailer_preview.rb
class ProjectMailerPreview (line 4) | class ProjectMailerPreview < ActionMailer::Preview
method alert_project_creator_about_new_member (line 5) | def alert_project_creator_about_new_member
method welcome_project_joinee (line 10) | def welcome_project_joinee
method welcome_project_joinee_special_websiteone_message (line 15) | def welcome_project_joinee_special_websiteone_message
FILE: spec/requests/events_spec.rb
function login (line 25) | def login
FILE: spec/requests/paypal_agreement_spec.rb
class PayPalLinkMock (line 26) | class PayPalLinkMock
method initialize (line 29) | def initialize(method, href)
FILE: spec/support/helpers.rb
type Helpers (line 3) | module Helpers
function within (line 12) | def within(selector, &block)
function view_spec_page (line 18) | def view_spec_page
function get_country (line 27) | def get_country
FILE: spec/support/privileged_user_helper.rb
function create_privileged_user (line 3) | def create_privileged_user
function get_privileged_user (line 9) | def get_privileged_user
FILE: vendor/assets/javascripts/404.js
function initialize (line 42) | function initialize() {
function animate (line 91) | function animate() {
function Eye (line 136) | function Eye( canvas, x, y, scale, time ) {
FILE: vendor/assets/javascripts/fullcalendar.js
function mergeOptions (line 93) | function mergeOptions(optionObjs) {
function compensateScroll (line 115) | function compensateScroll(rowEls, scrollbarWidths) {
function uncompensateScroll (line 132) | function uncompensateScroll(rowEls) {
function disableCursor (line 143) | function disableCursor() {
function enableCursor (line 149) | function enableCursor() {
function distributeHeight (line 158) | function distributeHeight(els, availableHeight, shouldRedistribute) {
function undistributeHeight (line 211) | function undistributeHeight(els) {
function matchCellWidths (line 219) | function matchCellWidths(els) {
function subtractInnerElHeight (line 239) | function subtractInnerElHeight(outerEl, innerEl) {
function getScrollParent (line 265) | function getScrollParent(el) {
function getOuterRect (line 281) | function getOuterRect(el, origin) {
function getClientRect (line 300) | function getClientRect(el, origin) {
function getContentRect (line 318) | function getContentRect(el, origin) {
function getScrollbarWidths (line 337) | function getScrollbarWidths(el) {
function sanitizeScrollbarWidth (line 360) | function sanitizeScrollbarWidth(width) {
function getIsLeftRtlScrollbars (line 371) | function getIsLeftRtlScrollbars() { // responsible for caching the compu...
function computeIsLeftRtlScrollbars (line 378) | function computeIsLeftRtlScrollbars() { // creates an offscreen test ele...
function getCssFloat (line 399) | function getCssFloat(el, prop) {
function isPrimaryMouseButton (line 411) | function isPrimaryMouseButton(ev) {
function getEvX (line 416) | function getEvX(ev) {
function getEvY (line 429) | function getEvY(ev) {
function getEvIsTouch (line 442) | function getEvIsTouch(ev) {
function preventSelection (line 447) | function preventSelection(el) {
function allowSelection (line 453) | function allowSelection(el) {
function preventDefault (line 460) | function preventDefault(ev) {
function intersectRects (line 471) | function intersectRects(rect1, rect2) {
function constrainPoint (line 487) | function constrainPoint(point, rect) {
function getRectCenter (line 496) | function getRectCenter(rect) {
function diffPoints (line 505) | function diffPoints(point1, point2) {
function parseFieldSpecs (line 522) | function parseFieldSpecs(input) {
function compareByFieldSpecs (line 556) | function compareByFieldSpecs(obj1, obj2, fieldSpecs) {
function compareByFieldSpec (line 571) | function compareByFieldSpec(obj1, obj2, fieldSpec) {
function flexibleCompare (line 580) | function flexibleCompare(a, b) {
function diffDayTime (line 612) | function diffDayTime(a, b) {
function diffDay (line 621) | function diffDay(a, b) {
function diffByUnit (line 629) | function diffByUnit(a, b, unit) {
function computeGreatestUnit (line 640) | function computeGreatestUnit(start, end) {
function computeDurationGreatestUnit (line 658) | function computeDurationGreatestUnit(duration, durationInput) {
function computeRangeAs (line 674) | function computeRangeAs(unit, start, end) {
function divideRangeByDuration (line 689) | function divideRangeByDuration(start, end, dur) {
function divideDurationByDuration (line 704) | function divideDurationByDuration(dur1, dur2) {
function multiplyDuration (line 723) | function multiplyDuration(dur, n) {
function durationHasTime (line 738) | function durationHasTime(dur) {
function isNativeDate (line 743) | function isNativeDate(input) {
function isTimeString (line 749) | function isTimeString(str) {
function mergeProps (line 786) | function mergeProps(propObjs, complexProps) {
function copyOwnProps (line 833) | function copyOwnProps(src, dest) {
function hasOwnProp (line 842) | function hasOwnProp(obj, name) {
function applyAll (line 847) | function applyAll(functions, thisObj, args) {
function removeMatching (line 862) | function removeMatching(array, testFunc) {
function removeExact (line 880) | function removeExact(array, exactVal) {
function isArraysEqual (line 899) | function isArraysEqual(a0, a1) {
function firstDefined (line 918) | function firstDefined() {
function htmlEscape (line 927) | function htmlEscape(s) {
function stripHtmlEntities (line 937) | function stripHtmlEntities(text) {
function cssToStr (line 944) | function cssToStr(cssProps) {
function attrsToStr (line 959) | function attrsToStr(attrs) {
function capitaliseFirstLetter (line 972) | function capitaliseFirstLetter(str) {
function compareNumbers (line 977) | function compareNumbers(a, b) { // for .sort()
function isInt (line 982) | function isInt(n) {
function proxy (line 990) | function proxy(obj, methodName) {
function debounce (line 1004) | function debounce(func, wait, immediate) {
function makeMoment (line 1094) | function makeMoment(args, parseAsUTC, parseZone) {
function englishMoment (line 1372) | function englishMoment(mom) {
function formatDate (line 1445) | function formatDate(date, formatStr) {
function oldMomentFormat (line 1455) | function oldMomentFormat(mom, formatStr) {
function formatRange (line 1470) | function formatRange(date1, date2, formatStr, separator, isRTL) {
function renderParsedFormat (line 1495) | function renderParsedFormat(parsedFormat, date1, date2, separator, isRTL) {
function getParsedFormatString (line 1568) | function getParsedFormatString(formatStr) {
function parseFormatString (line 1581) | function parseFormatString(formatStr) {
function chunkFormatString (line 1594) | function chunkFormatString(formatStr) {
function splitStringLiteral (line 1627) | function splitStringLiteral(s) {
function buildFakeFormatString (line 1640) | function buildFakeFormatString(chunks) {
function buildSameUnits (line 1678) | function buildSameUnits(chunks) {
function renderFakeFormatString (line 1710) | function renderFakeFormatString(fakeFormatString, date) {
function renderFakeFormatStringParts (line 1719) | function renderFakeFormatStringParts(fakeFormatString, date) {
function processMaybeMarkers (line 1746) | function processMaybeMarkers(s) {
function queryMostGranularFormatUnit (line 1764) | function queryMostGranularFormatUnit(formatStr) {
function Class (line 1802) | function Class() { }
function extendClass (line 1826) | function extendClass(superClass, members) {
function onBeforeDepChange (line 2267) | function onBeforeDepChange(depName, val, isOptional) {
function onDepChange (line 2278) | function onDepChange(depName, val, isOptional) {
function bind (line 2315) | function bind(eventName, handler) {
function attachImmediatelyResolvingThen (line 2454) | function attachImmediatelyResolvingThen(promise, val) {
function attachImmediatelyRejectingThen (line 2464) | function attachImmediatelyRejectingThen(promise) {
function isHitsEqual (line 3814) | function isHitsEqual(hit0, hit1) {
function isHitPropsWithin (line 3831) | function isHitPropsWithin(subHit, superHit) {
function complete (line 4133) | function complete() { // might be called by .animate(), which might chan...
function Iterator (line 4383) | function Iterator(items) {
function getDraggedElMeta (line 5434) | function getDraggedElMeta(el) {
function convertEventsPayloadToLegacyArray (line 7012) | function convertEventsPayloadToLegacyArray(eventsPayload) {
function Toolbar (line 9302) | function Toolbar(calendar, toolbarOptions) {
function queryButtonText (line 10427) | function queryButtonText(options) {
function isOverlapsAllowedByFunc (line 11149) | function isOverlapsAllowedByFunc(overlapEventFootprints, overlapFunc, su...
function isOverlapEventInstancesAllowed (line 11167) | function isOverlapEventInstancesAllowed(overlapEventFootprints, subjectE...
function filterLegacyEventInstances (line 11482) | function filterLegacyEventInstances(legacyEventInstances, legacyQuery) {
function populateInstanceComputableOptions (line 11802) | function populateInstanceComputableOptions(options) {
function getMomentLocaleData (line 11812) | function getMomentLocaleData(localeCode) {
function invertUnzonedRanges (line 11975) | function invertUnzonedRanges(ranges, constraintRange) {
function compareUnzonedRanges (line 12013) | function compareUnzonedRanges(range1, range2) {
function isSourcesEquivalent (line 12741) | function isSourcesEquivalent(source0, source1) {
function subtractDates (line 13858) | function subtractDates(date1, date0) { // date1 - date0
function eventDefsToEventInstances (line 13893) | function eventDefsToEventInstances(eventDefs, unzonedRange) {
function eventInstanceToEventRange (line 13907) | function eventInstanceToEventRange(eventInstance) {
function eventRangeToEventFootprint (line 13916) | function eventRangeToEventFootprint(eventRange) {
function eventInstanceToUnzonedRange (line 13928) | function eventInstanceToUnzonedRange(eventInstance) {
function eventFootprintToComponentFootprint (line 13933) | function eventFootprintToComponentFootprint(eventFootprint) {
function emptyCellsUntil (line 14893) | function emptyCellsUntil(endCol) {
function isDaySegCollision (line 15092) | function isDaySegCollision(seg, otherSegs) {
function compareDaySegCols (line 15111) | function compareDaySegCols(a, b) {
function iterInnerHeights (line 15614) | function iterInnerHeights(i, childNode) {
function emptyCellsUntil (line 15657) | function emptyCellsUntil(endCol) { // goes from current `col` to `endCol`
function buildSlotSegLevels (line 16685) | function buildSlotSegLevels(segs) {
function computeForwardSlotSegs (line 16711) | function computeForwardSlotSegs(levels) {
function computeSlotSegPressures (line 16733) | function computeSlotSegPressures(seg) {
function computeSlotSegCollisions (line 16761) | function computeSlotSegCollisions(seg, otherSegs, results) {
function isSlotSegCollision (line 16775) | function isSlotSegCollision(seg1, seg2) {
function groupEventFootprintsByAllDay (line 17929) | function groupEventFootprintsByAllDay(eventFootprints) {
FILE: vendor/assets/javascripts/lolex.js
function s (line 1) | function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&re...
function parseTime (line 49) | function parseTime(str) {
function fixedFloor (line 80) | function fixedFloor(n) {
function fixedModulo (line 87) | function fixedModulo(n, m) {
function getEpoch (line 95) | function getEpoch(epoch) {
function inRange (line 102) | function inRange(from, to, timer) {
function mirrorDateProperties (line 106) | function mirrorDateProperties(target, source) {
function createDate (line 145) | function createDate() {
function enqueueJob (line 173) | function enqueueJob(clock, job) {
function runJobs (line 181) | function runJobs(clock) {
function addTimer (line 193) | function addTimer(clock, timer) {
function compareTimers (line 238) | function compareTimers(a, b) {
function firstTimerInRange (line 274) | function firstTimerInRange(clock, from, to) {
function firstTimer (line 292) | function firstTimer(clock) {
function lastTimer (line 308) | function lastTimer(clock) {
function callTimer (line 324) | function callTimer(clock, timer) {
function clearTimer (line 339) | function clearTimer(clock, timerId, ttype) {
function uninstall (line 370) | function uninstall(clock, target, config) {
function hijackMethod (line 409) | function hijackMethod(target, method, clock) {
function doIntervalTick (line 432) | function doIntervalTick(clock, advanceTimeDelta) {
function createClock (line 485) | function createClock(start, loopLimit) {
FILE: vendor/assets/javascripts/moment-timezone-with-data-2012-2022.js
function charCodeToInt (line 57) | function charCodeToInt(charCode) {
function unpackBase60 (line 66) | function unpackBase60(string) {
function arrayToInt (line 98) | function arrayToInt(array) {
function intToUntil (line 104) | function intToUntil(array, length) {
function mapIndices (line 112) | function mapIndices(source, indices) {
function unpack (line 122) | function unpack(string) {
function Zone (line 147) | function Zone(packedString) {
function Country (line 225) | function Country(country_name, zone_names) {
function OffsetAt (line 234) | function OffsetAt(at) {
function ZoneScore (line 258) | function ZoneScore(zone) {
function findChange (line 271) | function findChange(low, high) {
function userOffsets (line 286) | function userOffsets() {
function sortZoneScores (line 310) | function sortZoneScores(a, b) {
function addToGuesses (line 323) | function addToGuesses(name, offsets) {
function guessesForUserOffsets (line 333) | function guessesForUserOffsets(offsets) {
function rebuildGuess (line 357) | function rebuildGuess() {
function guess (line 392) | function guess(ignoreCache) {
function normalizeName (line 403) | function normalizeName(name) {
function addZone (line 407) | function addZone(packed) {
function getZone (line 424) | function getZone(name, caller) {
function getNames (line 452) | function getNames() {
function getCountryNames (line 464) | function getCountryNames() {
function addLink (line 468) | function addLink(aliases) {
function addCountries (line 489) | function addCountries(data) {
function getCountry (line 503) | function getCountry(name) {
function zonesForCountry (line 508) | function zonesForCountry(country, with_offset) {
function loadData (line 528) | function loadData(data) {
function zoneExists (line 535) | function zoneExists(name) {
function needsOffset (line 543) | function needsOffset(m) {
function logError (line 548) | function logError(message) {
function tz (line 558) | function tz(input) {
function abbrWrap (line 647) | function abbrWrap(old) {
function resetZoneWrap (line 654) | function resetZoneWrap(old) {
function resetZoneWrap2 (line 661) | function resetZoneWrap2(old) {
Condensed preview — 896 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (6,554K chars).
[
{
"path": ".buildpacks",
"chars": 150,
"preview": "https://github.com/jayzes/heroku-buildpack-jpegoptim\nhttps://github.com/heroku/heroku-buildpack-ruby\nhttps://github.com/"
},
{
"path": ".codeclimate.yml",
"chars": 888,
"preview": "---\nversion: \"2\"\nchecks:\n identical-code:\n enabled: false\n similar-code:\n enabled: false\nplugins:\n brakeman:\n "
},
{
"path": ".coveralls.yml",
"chars": 45,
"preview": "repo_token: HRkua0MTRxARFHN0VnQGzrqRskIv3crds"
},
{
"path": ".dockerignore",
"chars": 0,
"preview": ""
},
{
"path": ".eslintignore",
"chars": 16,
"preview": "**/*{.,-}min.js\n"
},
{
"path": ".eslintrc",
"chars": 4062,
"preview": "ecmaFeatures:\n modules: true\n jsx: true\n\nenv:\n amd: true\n browser: true\n es6: true\n jquery: true\n node: true\n\n# h"
},
{
"path": ".gitignore",
"chars": 1750,
"preview": "# See https://help.github.com/articles/ignoring-files for more about ignoring files.\n#\n# If you find yourself ignoring t"
},
{
"path": ".rspec",
"chars": 66,
"preview": "--require rails_helper\n--format documentation\n--color\n--order rand"
},
{
"path": ".rubocop.yml",
"chars": 3040,
"preview": "inherit_from: .rubocop_todo.yml\n\nAllCops:\n Exclude:\n - 'bin/*'\n - 'db/schema.rb'\n - 'node_modules/**/*'\n - "
},
{
"path": ".rubocop_todo.yml",
"chars": 26766,
"preview": "# This configuration was generated by\n# `rubocop --auto-gen-config --auto-gen-only-exclude --exclude-limit 10000`\n# on 2"
},
{
"path": ".ruby-gemset",
"chars": 4,
"preview": "wso\n"
},
{
"path": ".ruby-version",
"chars": 6,
"preview": "3.2.1\n"
},
{
"path": ".semaphore/semaphore.yml",
"chars": 1658,
"preview": "version: v1.0\nname: WebsiteOne - CI\nagent:\n machine:\n type: e1-standard-2\n os_image: ubuntu2004\nblocks:\n - name:"
},
{
"path": ".simplecov",
"chars": 434,
"preview": "# frozen_string_literal: true\n\nif ENV['COVERAGE']\n SimpleCov.start 'rails' do\n add_filter ['/test/', '/features/', '"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 3219,
"preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
},
{
"path": "CONTRIBUTING.md",
"chars": 12104,
"preview": "# Contributing to WebSiteOne (WSO)\n\nSo you'd like to contribute to the WebSiteOne codebase? That's wonderful, we're exc"
},
{
"path": "Dockerfile",
"chars": 2356,
"preview": "# Use the official Ruby image from Docker Hub\n# https://hub.docker.com/_/ruby\n\n# [START cloudrun_rails_base_image]\n# Pin"
},
{
"path": "Gemfile",
"chars": 3673,
"preview": "# frozen_string_literal: true\n\nsource 'https://rubygems.org'\n\nruby '3.2.1'\n\n# Rather than loading the entire Rails frame"
},
{
"path": "LICENSE",
"chars": 1392,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2014 AgileVentures\n\nPermission is hereby granted, free of charge, to any person obt"
},
{
"path": "Procfile",
"chars": 40,
"preview": "web: bundle exec puma -C config/puma.rb\n"
},
{
"path": "Procfile.dev",
"chars": 87,
"preview": "web: unset PORT && bin/rails server\njs: yarn build --watch\ncss: yarn build:css --watch\n"
},
{
"path": "README.md",
"chars": 4675,
"preview": "# AgileVentures WebSiteOne\n\n[\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under the MIT licen"
},
{
"path": "app/assets/javascripts/controllers/application.js",
"chars": 249,
"preview": "import { Application } from \"@hotwired/stimulus\"\nimport \"@hotwired/turbo-rails\"\n\nconst application = Application.start()"
},
{
"path": "app/assets/javascripts/controllers/events_controller.js",
"chars": 259,
"preview": "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n static targets = [ \"local_t"
},
{
"path": "app/assets/javascripts/controllers/events_form_controller.js",
"chars": 2682,
"preview": "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n static targets = [ \"start\","
},
{
"path": "app/assets/javascripts/controllers/index.js",
"chars": 714,
"preview": "// This file is auto-generated by ./bin/rails stimulus:manifest:update\n// Run that command whenever you add a new contro"
},
{
"path": "app/assets/javascripts/controllers/projects_controller.js",
"chars": 221,
"preview": "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n show_hidden() {\n $('a')."
},
{
"path": "app/assets/javascripts/controllers/projects_languages_controller.js",
"chars": 145,
"preview": "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n language() {\n this.eleme"
},
{
"path": "app/assets/javascripts/cookies_banner.js",
"chars": 331,
"preview": "if (sessionStorage.getItem('banner') === 'hide') {\n document.querySelector('.cookies-banner-modal').style.display = 'no"
},
{
"path": "app/assets/javascripts/disqus.js",
"chars": 543,
"preview": "var disqus_div = $('#disqus_thread'),\n disqus_shortname = disqus_div.data('disqus-shortname'),\n disqus_identifier "
},
{
"path": "app/assets/javascripts/documents.js",
"chars": 344,
"preview": "WebsiteOne.define('Documents', function(){\n function init(){\n $('#revisions-anchor').on('click', function(e){\n"
},
{
"path": "app/assets/javascripts/global-modules/accordion_collapse.js",
"chars": 607,
"preview": "WebsiteOne.define('AccordionCollapse', function() {\n\n WebsiteOne.toggleCaret = function(child) {\n var collapsedClass"
},
{
"path": "app/assets/javascripts/global-modules/affix_navbar.js",
"chars": 1125,
"preview": "WebsiteOne.define('AffixedNavbar', function() {\n\n function AffixedNavbar() {\n var isAffixed, affixedNav, header, mai"
},
{
"path": "app/assets/javascripts/global-modules/event_countdown.js",
"chars": 2254,
"preview": "WebsiteOne.define('EventCountdown', function () {\n\n function EventCountdown() {\n var countdownClock, eventName"
},
{
"path": "app/assets/javascripts/global-modules/flash.js",
"chars": 332,
"preview": "WebsiteOne.define('FlashMessages', function() {\n return {\n init: function() {\n var flash = $('#flash-container'"
},
{
"path": "app/assets/javascripts/google-analytics.js",
"chars": 848,
"preview": "\n// read user id from cookie\nfunction readCookie(cookieName) {\n var re = new RegExp('[; ]'+cookieName+'=([^\\\\s;]*)');\n v"
},
{
"path": "app/assets/javascripts/hangout_play_on_hover.js",
"chars": 1005,
"preview": "var tag = document.createElement('script');\ntag.src = \"https://www.youtube.com/iframe_api\";\nvar firstScriptTag = documen"
},
{
"path": "app/assets/javascripts/inspectlet.js",
"chars": 826,
"preview": "// snippet for inspectlet session recording software\n// https://www.inspectlet.com\n// inspectlet login: wsoinspectlet@gm"
},
{
"path": "app/assets/javascripts/jq.js",
"chars": 125,
"preview": "import jquery from \"jquery\";\nwindow.jQuery = jquery;\nwindow.$ = jquery;\nimport moment from \"moment\";\nwindow.moment = mom"
},
{
"path": "app/assets/javascripts/jquery-ui.js",
"chars": 470597,
"preview": "/*! jQuery UI - v1.11.4 - 2015-03-11\n* http://jqueryui.com\n* Includes: core.js, widget.js, mouse.js, position.js, accord"
},
{
"path": "app/assets/javascripts/nprogress.js",
"chars": 11594,
"preview": "/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress\n * @license MIT */\n\n;(function(root, fact"
},
{
"path": "app/assets/javascripts/scrums.js",
"chars": 586,
"preview": "var Scrum = {\n setup: function () {\n $('.scrum_yt_link').on('click', Scrum.select_video);\n $('#scrumVideo').on('h"
},
{
"path": "app/assets/javascripts/search_toggle.js",
"chars": 424,
"preview": "$(document).ready(function() {\n // Replace search icon with close on toggle\n\n $('#google-search-dropdown').on('shown.b"
},
{
"path": "app/assets/javascripts/subscriptions.js",
"chars": 597,
"preview": "(function() {\n $(function() {\n return $('[data-behavior~=ajax-spin]').on('click', function() {\n var target;\n "
},
{
"path": "app/assets/javascripts/typeahead.jquery.js",
"chars": 70128,
"preview": "/*!\n * typeahead.js 1.3.1\n * https://github.com/corejavascript/typeahead.js\n * Copyright 2013-2020 Twitter, Inc. and oth"
},
{
"path": "app/assets/javascripts/users.js",
"chars": 3123,
"preview": "WebsiteOne.define('Users', function () {\n var player;\n\n function selectVideo(event) {\n event.preventDefault"
},
{
"path": "app/assets/javascripts/websiteone.js",
"chars": 2221,
"preview": "// To deal with the headache of initializing JavaScripts with TurboLinks, I\n// wrote this custom module definer to handl"
},
{
"path": "app/assets/stylesheets/_mixins.scss",
"chars": 1092,
"preview": "@mixin css-border-radius($args...) {\n -webkit-border-radius: $args;\n -mox-border-radius: $args;\n border-radius: $args"
},
{
"path": "app/assets/stylesheets/_variables.scss",
"chars": 493,
"preview": "\n// for the projects sidebar\n$sidebar-width: 250px;\n$sidebar-bg-color: #efefef;\n$sidebar-a-color: #777;\n$sidebar-a-hover"
},
{
"path": "app/assets/stylesheets/actiontext.css",
"chars": 1134,
"preview": "/*\n * Provides a drop-in pointer for the default Trix stylesheet that will format the toolbar and\n * the trix-editor con"
},
{
"path": "app/assets/stylesheets/actiontext.scss",
"chars": 16,
"preview": "@import \"trix\";\n"
},
{
"path": "app/assets/stylesheets/application.bootstrap.scss",
"chars": 88,
"preview": "@import 'bootstrap/dist/css/bootstrap';\n@import 'bootstrap-icons/font/bootstrap-icons';\n"
},
{
"path": "app/assets/stylesheets/application.scss",
"chars": 1753,
"preview": "@import \"bootstrap-sprockets\";\n@import \"bootstrap\";\n@import \"font-awesome\";\n\n@import \"variables\";\n@import \"mixins\";\n\n@im"
},
{
"path": "app/assets/stylesheets/components/calendar-date.scss",
"chars": 205,
"preview": ".calendar-block {\n margin-left: 10px;\n\n .fa-calendar {\n display: inline-block;\n font-size: 24px;\n margin: 10p"
},
{
"path": "app/assets/stylesheets/components/calendar-dropdown.scss",
"chars": 171,
"preview": "#calendar_links {\n position: absolute;\n background: $off-white;\n padding: 10px 20px 10px 10px;\n font-size: 90%;\n bo"
},
{
"path": "app/assets/stylesheets/components/dropdown.scss",
"chars": 110,
"preview": ".dropdown-beside-HOA {\n margin-left: 10px;\n float: right;\n display: inline-block;\n vertical-align: top;\n}\n"
},
{
"path": "app/assets/stylesheets/global/articles.scss",
"chars": 444,
"preview": "// Place all the styles related to the Articles controller here.\n// They will automatically be included in application.c"
},
{
"path": "app/assets/stylesheets/global/authentications.scss",
"chars": 186,
"preview": "// Place all the styles related to the Authentications controller here.\n// They will automatically be included in applic"
},
{
"path": "app/assets/stylesheets/global/bootstrap-tags.scss",
"chars": 2317,
"preview": "/* bootstrap-tags styles */\n.bootstrap-tags.bootstrap-3 .tag a {\n margin: 0 0 0 .3em; }\n.bootstrap-tags.bootstrap-3 .gl"
},
{
"path": "app/assets/stylesheets/global/bootstrap-tokenfield.min.scss",
"chars": 3636,
"preview": ".tokenfield{height:auto;min-height:34px;padding-bottom:0}.tokenfield.focus{border-color:#66afe9;outline:0;-webkit-box-sh"
},
{
"path": "app/assets/stylesheets/global/confy.scss",
"chars": 3129,
"preview": ".cfy-wrap {\n background-color: #F2F2F2;\n border-right: 1px solid #DFDFDF;\n left: -261px;\n position: absolute"
},
{
"path": "app/assets/stylesheets/global/cubeportfolio.scss",
"chars": 80434,
"preview": "/**\n * cubeportfolio v1.2 - http: //scriptpie.com\n *\n * Copyright - 2013 Mihai Buricea (http: //www.scriptpie.com)\n * Al"
},
{
"path": "app/assets/stylesheets/global/custom.scss",
"chars": 7777,
"preview": "@import url(https://fonts.googleapis.com/css?family=Ubuntu);\n\n/* ------------------------------------------------------"
},
{
"path": "app/assets/stylesheets/global/custom_errors.scss",
"chars": 409,
"preview": "@import \"variables\";\n\n#fof {\n position: relative;\n margin-top: -20px;\n width: 860px;\n height: 430px;\n}\n\n#fof canvas "
},
{
"path": "app/assets/stylesheets/global/docs.scss",
"chars": 852,
"preview": "@import \"variables\";\n@import \"mixins\";\n\nsection.doc-preview {\n padding: 5px 0;\n height: auto;\n min-height: 20px;\n ma"
},
{
"path": "app/assets/stylesheets/global/events.scss",
"chars": 1945,
"preview": ".calendar, .eventTitle {\n float: left;\n}\n\n.calendar {\n height: 60px;\n width: 70px;\n margin-right: 10px;\n position: "
},
{
"path": "app/assets/stylesheets/global/hangouts.scss",
"chars": 5534,
"preview": "@import \"../variables\";\n\n.hangouts-management {\n @extend .panel-group;\n margin: 0px;\n\n .restart-panel, .edit-link-pan"
},
{
"path": "app/assets/stylesheets/global/hookups.scss",
"chars": 71,
"preview": ".hookups_table {\n border-spacing: 10px;\n border-collapse: separate;\n}"
},
{
"path": "app/assets/stylesheets/global/nprogressbar.scss",
"chars": 2331,
"preview": "@import \"mixins\";\n@import \"variables\";\n\n/* Make clicks pass-through */\n#nprogress {\n pointer-events: none;\n -webkit-po"
},
{
"path": "app/assets/stylesheets/global/projects.scss",
"chars": 2701,
"preview": "@import \"variables\";\n@import \"mixins\";\n\n.activity {\n i {\n margin: 10px 0 0 5px;\n }\n\n .story_name {\n span {\n "
},
{
"path": "app/assets/stylesheets/global/round_banners.scss",
"chars": 4142,
"preview": "@import \"mixins\";\n\n/* Round banners */\n\n/* =====[ GOOGLE FONT \"LATO\" ]=================================================="
},
{
"path": "app/assets/stylesheets/global/sidebar.scss",
"chars": 932,
"preview": "@import \"variables\";\n@import \"mixins\";\n\n#not-sidebar-content {\n width: 100%;\n height: 100%;\n padding: 15px 0;\n}\n\n@med"
},
{
"path": "app/assets/stylesheets/global/social.scss",
"chars": 4210,
"preview": "$fa-custom-icon-size: 1.1em;\n\n.fa-custom-social {\n height: $fa-custom-icon-size;\n width: $fa-custom-icon-size;\n text-"
},
{
"path": "app/assets/stylesheets/global/sponsors.scss",
"chars": 1755,
"preview": "#sponsorsBar {\n padding: 20px 0;\n}\n#sponsorsBar .seeAllSponsorLink {\n display: inline-block;\n font-size: 12px;\n"
},
{
"path": "app/assets/stylesheets/global/static_pages.scss",
"chars": 1546,
"preview": "@import \"variables\";\n@import \"mixins\";\n\n.page-option {\n display: inline;\n vertical-align: middle;\n overflow: hidden;\n"
},
{
"path": "app/assets/stylesheets/global/tokenfield-typeahead.min.scss",
"chars": 3250,
"preview": ".twitter-typeahead{width:100%;position:relative;vertical-align:top}.twitter-typeahead .tt-query,.twitter-typeahead .tt-h"
},
{
"path": "app/assets/stylesheets/global/users.scss",
"chars": 2312,
"preview": "@import \"variables\";\n@import \"mixins\";\n\n.member-title {\n font-size: 0.85em;\n font-weight: bold;\n color: $theme-darker"
},
{
"path": "app/assets/stylesheets/jquery-ui.css",
"chars": 35348,
"preview": "/*! jQuery UI - v1.11.4 - 2015-03-11\n* http://jqueryui.com\n* Includes: core.css, accordion.css, autocomplete.css, button"
},
{
"path": "app/assets/stylesheets/jquery-ui.structure.css",
"chars": 18016,
"preview": "/*!\n * jQuery UI CSS Framework 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n *"
},
{
"path": "app/assets/stylesheets/jquery-ui.theme.css",
"chars": 17415,
"preview": "/*!\n * jQuery UI CSS Framework 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n *"
},
{
"path": "app/assets/stylesheets/layout/buttons.scss",
"chars": 883,
"preview": "@import \"mixins\";\n@import \"variables\";\n\n.btn-be-a-supporter {\n background: #e10000;\n border: 1px solid lightgray;\n op"
},
{
"path": "app/assets/stylesheets/layout/flash.scss",
"chars": 441,
"preview": "@import \"mixins\";\n\n#flash-container {\n position: relative;\n height: 0;\n}\n\n#flash-display {\n position: absolute;\n top"
},
{
"path": "app/assets/stylesheets/layout/footer.scss",
"chars": 1135,
"preview": "@import 'mixins';\n@import 'variables';\n\n$footer-height: 350px;\n$footer-upper-section-height: 200px;\n\n/* Wrapper for page"
},
{
"path": "app/assets/stylesheets/layout/landing-page.scss",
"chars": 1762,
"preview": "@import \"mixins\";\n@import \"variables\";\n\n$top-content-text-color: $theme-darker;\n\ndiv.section-well {\n padding: 1em;\n ma"
},
{
"path": "app/assets/stylesheets/layout/navbar.scss",
"chars": 5481,
"preview": "@import 'mixins';\n@import 'variables';\n\n$header-height: 60px;\n$navbar-height: 50px;\n$small-logo-height: 26px;\n$small-log"
},
{
"path": "app/assets/stylesheets/layout/user_controls.scss",
"chars": 251,
"preview": "@import \"variables\";\n\n.user-controls {\n list-style: none;\n padding-left: 0;\n font-size: 1.2em;\n\n li {\n display: i"
},
{
"path": "app/assets/stylesheets/main.scss",
"chars": 1555,
"preview": "#main {\n padding-top: 3em;\n}\n\n.signin {\n h2 {\n margin-top: 0;\n }\n form {\n margin-bottom: 20px;\n }\n .glyphico"
},
{
"path": "app/assets/stylesheets/subscriptions.scss",
"chars": 258,
"preview": "// Place all the styles related to the subscriptions controller here.\n// They will automatically be included in applicat"
},
{
"path": "app/assets/stylesheets/timeline.scss",
"chars": 3394,
"preview": ".timeline {\n list-style: none;\n padding: 20px 0 20px;\n position: relative;\n}\n\n.timeline:before {\n top: 0;\n bottom: "
},
{
"path": "app/assets/stylesheets/vanity.scss",
"chars": 177,
"preview": "// Place all the styles related to the Vanity controller here.\n// They will automatically be included in application.css"
},
{
"path": "app/controllers/application_controller.rb",
"chars": 2917,
"preview": "# frozen_string_literal: true\n\nrequire 'custom_errors'\nclass ApplicationController < ActionController::Base\n protect_fr"
},
{
"path": "app/controllers/articles_controller.rb",
"chars": 3295,
"preview": "# frozen_string_literal: true\n\nclass ArticlesController < ApplicationController\n layout 'articles_layout'\n before_acti"
},
{
"path": "app/controllers/authentications_controller.rb",
"chars": 3582,
"preview": "# frozen_string_literal: true\n\nclass AuthenticationsController < ApplicationController\n include DeactivatedUserFinder\n\n"
},
{
"path": "app/controllers/av_dashboard_tokens_controller.rb",
"chars": 480,
"preview": "# frozen_string_literal: true\n\nclass AvDashboardTokensController < ApplicationController\n require 'jwt'\n require 'date"
},
{
"path": "app/controllers/calendar_controller.rb",
"chars": 1262,
"preview": "# frozen_string_literal: true\n\nclass CalendarController < ApplicationController\n def index\n cal = Icalendar::Calenda"
},
{
"path": "app/controllers/cards_controller.rb",
"chars": 1115,
"preview": "# frozen_string_literal: true\n\nclass CardsController < ApplicationController\n before_action :authenticate_user!\n\n def "
},
{
"path": "app/controllers/concerns/.keep",
"chars": 0,
"preview": ""
},
{
"path": "app/controllers/concerns/deactivated_user_finder.rb",
"chars": 192,
"preview": "# frozen_string_literal: true\n\nmodule DeactivatedUserFinder\n extend ActiveSupport::Concern\n\n def deactivated_user_with"
},
{
"path": "app/controllers/concerns/statistics.rb",
"chars": 742,
"preview": "# frozen_string_literal: true\n\nmodule Statistics\n extend ActiveSupport::Concern\n\n def get_stats_for(entity)\n stats "
},
{
"path": "app/controllers/cookies_controller.rb",
"chars": 199,
"preview": "# frozen_string_literal: true\n\nclass CookiesController < ApplicationController\n def index\n session[:cookies_accepted"
},
{
"path": "app/controllers/dashboard_controller.rb",
"chars": 980,
"preview": "# frozen_string_literal: true\n\nclass DashboardController < ApplicationController\n include Statistics\n def index\n @s"
},
{
"path": "app/controllers/documents_controller.rb",
"chars": 3148,
"preview": "# frozen_string_literal: true\n\nclass DocumentsController < ApplicationController\n layout 'with_sidebar'\n before_action"
},
{
"path": "app/controllers/event_instances_controller.rb",
"chars": 3707,
"preview": "# frozen_string_literal: true\n\nclass EventInstancesController < ApplicationController\n skip_before_action :verify_authe"
},
{
"path": "app/controllers/events_controller.rb",
"chars": 4806,
"preview": "# frozen_string_literal: true\n\nclass EventsController < ApplicationController\n before_action :authenticate_user!, excep"
},
{
"path": "app/controllers/legacy_api/subscriptions_controller.rb",
"chars": 1014,
"preview": "# frozen_string_literal: true\n# class LegacyApi::SubscriptionsController < ApplicationController\n# respond_to :json\n\n#"
},
{
"path": "app/controllers/paypal_agreement_controller.rb",
"chars": 1242,
"preview": "# frozen_string_literal: true\n\nclass PaypalAgreementController < ApplicationController\n def new\n @plan = Plan.find(p"
},
{
"path": "app/controllers/projects_controller.rb",
"chars": 5758,
"preview": "# frozen_string_literal: true\n\nclass ProjectsController < ApplicationController\n layout 'with_sidebar'\n before_action "
},
{
"path": "app/controllers/registrations_controller.rb",
"chars": 2443,
"preview": "# frozen_string_literal: true\n\nclass RegistrationsController < Devise::RegistrationsController\n include DeactivatedUser"
},
{
"path": "app/controllers/scrums_controller.rb",
"chars": 183,
"preview": "# frozen_string_literal: true\n\nclass ScrumsController < ApplicationController\n def index\n @scrums = EventInstance.la"
},
{
"path": "app/controllers/static_pages_controller.rb",
"chars": 793,
"preview": "# frozen_string_literal: true\n\nclass StaticPagesController < ApplicationController\n before_action :authenticate_user!, "
},
{
"path": "app/controllers/subscriptions_controller.rb",
"chars": 5434,
"preview": "# frozen_string_literal: true\n\nclass SubscriptionsController < ApplicationController\n before_action :store_user_locatio"
},
{
"path": "app/controllers/users_controller.rb",
"chars": 3182,
"preview": "# frozen_string_literal: true\n\nclass UsersController < ApplicationController\n layout 'layouts/user_profile_layout', onl"
},
{
"path": "app/controllers/vanity_controller.rb",
"chars": 132,
"preview": "# frozen_string_literal: true\n\nclass VanityController < ApplicationController\n include Vanity::Rails::Dashboard\n layou"
},
{
"path": "app/controllers/visitors_controller.rb",
"chars": 393,
"preview": "# frozen_string_literal: true\n\nclass VisitorsController < ApplicationController\n include ApplicationHelper\n\n def index"
},
{
"path": "app/helpers/application_helper.rb",
"chars": 5318,
"preview": "# frozen_string_literal: true\n\nmodule ApplicationHelper\n include ArticlesHelper\n include DisqusHelper\n\n def user_deta"
},
{
"path": "app/helpers/articles_helper.rb",
"chars": 2101,
"preview": "# frozen_string_literal: true\n\nmodule ArticlesHelper\n def clean_html(html)\n raw sanitize html,\n tags"
},
{
"path": "app/helpers/authentications_helper.rb",
"chars": 64,
"preview": "# frozen_string_literal: true\n\nmodule AuthenticationsHelper\nend\n"
},
{
"path": "app/helpers/cookies_helper.rb",
"chars": 56,
"preview": "# frozen_string_literal: true\n\nmodule CookiesHelper\nend\n"
},
{
"path": "app/helpers/devise_helper.rb",
"chars": 812,
"preview": "# frozen_string_literal: true\n\nmodule DeviseHelper\n def devise_error_simple_message\n return '' if resource.errors.em"
},
{
"path": "app/helpers/disqus_helper.rb",
"chars": 787,
"preview": "# frozen_string_literal: true\n\nmodule DisqusHelper\n def get_disqus_sso(user)\n data = {}\n present user do |present"
},
{
"path": "app/helpers/documents_helper.rb",
"chars": 620,
"preview": "# frozen_string_literal: true\n\nmodule DocumentsHelper\n def documents\n @documents = Document.where('project_id = ?', "
},
{
"path": "app/helpers/event_helper.rb",
"chars": 1892,
"preview": "# frozen_string_literal: true\n\nmodule EventHelper\n def current_occurrence_time(event)\n time = nested_hash_value(even"
},
{
"path": "app/helpers/event_instances_helper.rb",
"chars": 308,
"preview": "# frozen_string_literal: true\n\nrequire 'securerandom'\nmodule EventInstancesHelper\n def generate_event_instance_id(user,"
},
{
"path": "app/helpers/features.rb",
"chars": 559,
"preview": "# frozen_string_literal: true\n\nmodule Features\n class << self\n def enabled?(feature_name)\n feature = Settings.f"
},
{
"path": "app/helpers/layout_helper.rb",
"chars": 506,
"preview": "# frozen_string_literal: true\n\nmodule LayoutHelper\n def flash_messages(opts = {})\n @layout_flash = opts.fetch(:layou"
},
{
"path": "app/helpers/projects_helper.rb",
"chars": 136,
"preview": "# frozen_string_literal: true\n\nmodule ProjectsHelper\n def created_date\n @project.created_at.strftime('Created: %Y-%m"
},
{
"path": "app/helpers/scrums_helper.rb",
"chars": 556,
"preview": "# frozen_string_literal: true\n\nmodule ScrumsHelper\n def scrum_link(video)\n video.yt_video_id ? link_video(video) : d"
},
{
"path": "app/helpers/static_pages_helper.rb",
"chars": 204,
"preview": "# frozen_string_literal: true\n\nmodule StaticPagesHelper\n def github_static_pages_edit_url\n \"https://github.com/Agile"
},
{
"path": "app/helpers/subscriptions_helper.rb",
"chars": 189,
"preview": "# frozen_string_literal: true\n\nmodule SubscriptionsHelper\n def action_text\n @sponsorship ? 'Sponsor' : 'Get'\n end\n\n"
},
{
"path": "app/helpers/users_helper.rb",
"chars": 222,
"preview": "# frozen_string_literal: true\n\nmodule UsersHelper\n def activity_tab(param_tab)\n return 'active' if param_tab == 'act"
},
{
"path": "app/helpers/visitors_helper.rb",
"chars": 878,
"preview": "# frozen_string_literal: true\n\nmodule VisitorsHelper\n def display_countdown(event)\n time_to_next_event_instance = Ti"
},
{
"path": "app/jobs/application_job.rb",
"chars": 74,
"preview": "# frozen_string_literal: true\n\nclass ApplicationJob < ActiveJob::Base\nend\n"
},
{
"path": "app/jobs/github_commits_job.rb",
"chars": 1944,
"preview": "# frozen_string_literal: true\n\nrequire 'octokit'\n\nmodule GithubCommitsJob\n extend self\n\n def initialize\n @client = "
},
{
"path": "app/jobs/github_languages_job.rb",
"chars": 1396,
"preview": "# frozen_string_literal: true\n\nrequire 'octokit'\n\nmodule GithubLanguagesJob\n module_function\n\n def client\n credenti"
},
{
"path": "app/jobs/github_last_updates_job.rb",
"chars": 528,
"preview": "# frozen_string_literal: true\n\nrequire 'octokit'\n\nmodule GithubLastUpdatesJob\n extend self\n\n def run\n Project.with_"
},
{
"path": "app/jobs/github_readme_files_job.rb",
"chars": 1823,
"preview": "# frozen_string_literal: true\n\nrequire 'octokit'\nrequire 'base64'\n\nmodule GithubReadmeFilesJob\n extend self\n\n def clie"
},
{
"path": "app/jobs/github_static_pages_job.rb",
"chars": 1940,
"preview": "# frozen_string_literal: true\n\nrequire 'octokit'\nrequire 'base64'\n\nmodule GithubStaticPagesJob\n extend self\n\n FILE_NAM"
},
{
"path": "app/mailers/.keep",
"chars": 0,
"preview": ""
},
{
"path": "app/mailers/admin_mailer.rb",
"chars": 586,
"preview": "# frozen_string_literal: true\n\nclass AdminMailer < ApplicationMailer\n default from: 'bot@agileventures.org'\n\n def fail"
},
{
"path": "app/mailers/application_mailer.rb",
"chars": 133,
"preview": "# frozen_string_literal: true\n\nclass ApplicationMailer < ActionMailer::Base\n default from: 'from@example.com'\n layout "
},
{
"path": "app/mailers/mailer.rb",
"chars": 948,
"preview": "# frozen_string_literal: true\n\nclass Mailer < ActionMailer::Base\n default from: 'matt@agileventures.org', reply_to: 'ma"
},
{
"path": "app/mailers/project_mailer.rb",
"chars": 632,
"preview": "# frozen_string_literal: true\n\nclass ProjectMailer < ApplicationMailer\n default from: 'matt@agileventures.org', reply_t"
},
{
"path": "app/mailers/sandbox_email_interceptor.rb",
"chars": 154,
"preview": "# frozen_string_literal: true\n\nclass SandboxEmailInterceptor\n def self.delivering_email(message)\n message.to = ENV.f"
},
{
"path": "app/models/.keep",
"chars": 0,
"preview": ""
},
{
"path": "app/models/application_record.rb",
"chars": 109,
"preview": "# frozen_string_literal: true\n\nclass ApplicationRecord < ActiveRecord::Base\n self.abstract_class = true\nend\n"
},
{
"path": "app/models/article.rb",
"chars": 630,
"preview": "# frozen_string_literal: true\n\nclass Article < ApplicationRecord\n include ActAsPage\n include UserNullable\n include Pu"
},
{
"path": "app/models/authentication.rb",
"chars": 296,
"preview": "# frozen_string_literal: true\n\nclass Authentication < ApplicationRecord\n belongs_to :user\n # Bryan: validation of user"
},
{
"path": "app/models/commit_count.rb",
"chars": 245,
"preview": "# frozen_string_literal: true\n\nrequire 'open-uri'\n\nclass CommitCount < ApplicationRecord\n belongs_to :user\n belongs_to"
},
{
"path": "app/models/concerns/.keep",
"chars": 0,
"preview": ""
},
{
"path": "app/models/concerns/act_as_page.rb",
"chars": 243,
"preview": "# frozen_string_literal: true\n\nmodule ActAsPage\n def self.included(base)\n base.acts_as_tree\n base.extend Friendly"
},
{
"path": "app/models/concerns/filterable.rb",
"chars": 324,
"preview": "# frozen_string_literal: true\n\nmodule Filterable\n extend ActiveSupport::Concern\n\n module ClassMethods\n def param_fi"
},
{
"path": "app/models/concerns/user_nullable.rb",
"chars": 111,
"preview": "# frozen_string_literal: true\n\nmodule UserNullable\n def user\n super || NullUser.new('Anonymous')\n end\nend\n"
},
{
"path": "app/models/contact_form.rb",
"chars": 234,
"preview": "# frozen_string_literal: true\n\nclass ContactForm\n include ActiveModel::Model\n\n attr_accessor :name, :email, :message\n\n"
},
{
"path": "app/models/document.rb",
"chars": 697,
"preview": "# frozen_string_literal: true\n\nclass Document < ApplicationRecord\n include ActAsPage\n include UserNullable\n include P"
},
{
"path": "app/models/event.rb",
"chars": 10139,
"preview": "# frozen_string_literal: true\n\nclass Event < ApplicationRecord\n has_many :event_instances\n belongs_to :project, option"
},
{
"path": "app/models/event_date.rb",
"chars": 124,
"preview": "# frozen_string_literal: true\n\nclass EventDate\n def self.for(event_date)\n (event_date.presence || Date.today)\n end\n"
},
{
"path": "app/models/event_instance.rb",
"chars": 2185,
"preview": "# frozen_string_literal: true\n\nclass EventInstance < ApplicationRecord\n self.per_page = 30\n\n belongs_to :event, option"
},
{
"path": "app/models/follow.rb",
"chars": 367,
"preview": "# frozen_string_literal: true\n\nclass Follow < ApplicationRecord\n extend ActsAsFollower::FollowerLib\n extend ActsAsFoll"
},
{
"path": "app/models/hangout_participants_snapshot.rb",
"chars": 118,
"preview": "# frozen_string_literal: true\n\nclass HangoutParticipantsSnapshot < ApplicationRecord\n belongs_to :event_instance\nend\n"
},
{
"path": "app/models/issue_tracker.rb",
"chars": 96,
"preview": "# frozen_string_literal: true\n\nclass IssueTracker < ApplicationRecord\n belongs_to :project\nend\n"
},
{
"path": "app/models/karma.rb",
"chars": 67,
"preview": "# frozen_string_literal: true\n\nclass Karma < ApplicationRecord\nend\n"
},
{
"path": "app/models/language.rb",
"chars": 159,
"preview": "# frozen_string_literal: true\n\nclass Language < ApplicationRecord\n has_and_belongs_to_many :projects\n\n validates :name"
},
{
"path": "app/models/language_project.rb",
"chars": 184,
"preview": "# frozen_string_literal: true\n\nclass LanguageProject < ApplicationRecord\n belongs_to :language\n belongs_to :project\n\n "
},
{
"path": "app/models/null_user.rb",
"chars": 305,
"preview": "# frozen_string_literal: true\n\nclass NullUser < User\n def persisted?\n false\n end\n\n def initialize(name)\n super("
},
{
"path": "app/models/payment_source.rb",
"chars": 329,
"preview": "# frozen_string_literal: true\n\nmodule PaymentSource\n class PaymentSource < ApplicationRecord\n belongs_to :subscripti"
},
{
"path": "app/models/plan.rb",
"chars": 128,
"preview": "# frozen_string_literal: true\n\nclass Plan < ApplicationRecord\n def free_trial?\n free_trial_length_days&.positive?\n "
},
{
"path": "app/models/premium.rb",
"chars": 64,
"preview": "# frozen_string_literal: true\n\nclass Premium < Subscription\nend\n"
},
{
"path": "app/models/premium_f2_f.rb",
"chars": 67,
"preview": "# frozen_string_literal: true\n\nclass PremiumF2F < Subscription\nend\n"
},
{
"path": "app/models/premium_mob.rb",
"chars": 67,
"preview": "# frozen_string_literal: true\n\nclass PremiumMob < Subscription\nend\n"
},
{
"path": "app/models/premium_plus.rb",
"chars": 68,
"preview": "# frozen_string_literal: true\n\nclass PremiumPlus < Subscription\nend\n"
},
{
"path": "app/models/project.rb",
"chars": 2997,
"preview": "# frozen_string_literal: true\n\nclass Project < ApplicationRecord\n extend FriendlyId\n include Filterable\n friendly_id "
},
{
"path": "app/models/slack_channel.rb",
"chars": 144,
"preview": "# frozen_string_literal: true\n\nclass SlackChannel < ApplicationRecord\n has_and_belongs_to_many :projects\n has_and_belo"
},
{
"path": "app/models/source_repository.rb",
"chars": 208,
"preview": "# frozen_string_literal: true\n\nclass SourceRepository < ApplicationRecord\n belongs_to :project\n\n def name\n return '"
},
{
"path": "app/models/static_page.rb",
"chars": 700,
"preview": "# frozen_string_literal: true\n\nclass StaticPage < ApplicationRecord\n include ActAsPage\n\n # Sampriti: Used to generate "
},
{
"path": "app/models/status.rb",
"chars": 409,
"preview": "# frozen_string_literal: true\n\nclass Status < ApplicationRecord\n belongs_to :user, counter_cache: :status_count\n\n OPTI"
},
{
"path": "app/models/subscription.rb",
"chars": 393,
"preview": "# frozen_string_literal: true\n\nclass Subscription < ApplicationRecord\n belongs_to :user, -> { with_deleted }\n belongs_"
},
{
"path": "app/models/user.rb",
"chars": 5893,
"preview": "# frozen_string_literal: true\n\nclass User < ApplicationRecord\n acts_as_paranoid\n\n include Filterable\n\n extend Forward"
},
{
"path": "app/presenters/base_presenter.rb",
"chars": 580,
"preview": "# frozen_string_literal: true\n\nrequire 'action_view'\n\nclass BasePresenter\n include ActionView::Helpers::AssetTagHelper\n"
},
{
"path": "app/presenters/event_instance_presenter.rb",
"chars": 1912,
"preview": "# frozen_string_literal: true\n\nclass EventInstancePresenter < BasePresenter\n presents :event_instance\n\n def created_at"
},
{
"path": "app/presenters/users/user_presenter.rb",
"chars": 1929,
"preview": "# frozen_string_literal: true\n\nrequire_relative '../base_presenter'\n\nclass UserPresenter < BasePresenter\n presents :use"
},
{
"path": "app/services/add_subscription_to_user_for_plan.rb",
"chars": 710,
"preview": "# frozen_string_literal: true\n\nclass AddSubscriptionToUserForPlan\n def self.with(user, sponsor, time, plan, payment_sou"
},
{
"path": "app/services/error_logging_service.rb",
"chars": 265,
"preview": "# frozen_string_literal: true\n\nclass ErrorLoggingService\n def initialize(error)\n @error = error\n end\n\n def log(mes"
},
{
"path": "app/services/hangout_notification_service.rb",
"chars": 3119,
"preview": "# frozen_string_literal: true\n\nrequire 'slack'\nrequire 'gitter'\ninclude ChannelsList\n\nclass HangoutNotificationService\n "
},
{
"path": "app/services/karma_calculator.rb",
"chars": 1462,
"preview": "# frozen_string_literal: true\n\nclass KarmaCalculator\n attr_reader :user\n\n def initialize(user)\n @user = user\n end\n"
},
{
"path": "app/services/markdown_converter.rb",
"chars": 304,
"preview": "# frozen_string_literal: true\n\nclass MarkdownConverter\n attr_reader :markdown\n private :markdown\n\n def initialize(mar"
},
{
"path": "app/services/modify_event_participation.rb",
"chars": 276,
"preview": "# frozen_string_literal: true\n\nclass ModifyEventParticipation\n def self.run\n CSV.foreach('lib/tasks/event_participat"
},
{
"path": "app/services/paypal_service.rb",
"chars": 2971,
"preview": "# frozen_string_literal: true\n\nrequire 'paypal-sdk-rest'\n\nPayPal::SDK::REST.set_config(\n mode: ENV.fetch('PAYPAL_SDK_MO"
},
{
"path": "app/services/youtube_notification_service.rb",
"chars": 1755,
"preview": "# frozen_string_literal: true\n\nrequire 'slack'\ninclude ChannelsList\n\nclass YoutubeNotificationService\n def self.with(ev"
},
{
"path": "app/views/active_storage/blobs/_blob.html.erb",
"chars": 605,
"preview": "<figure class=\"attachment attachment--<%= blob.representable? ? \"preview\" : \"file\" %> attachment--<%= blob.filename.exte"
},
{
"path": "app/views/admin_mailer/failed_to_invite_user_to_slack.html.erb",
"chars": 351,
"preview": "Slack invite failed for user with email <%= @email %>\n\n<% if @slack_error_message %>\n <h2>Slack Error Message:</h2>\n\n"
},
{
"path": "app/views/application/_edit_card.html.erb",
"chars": 420,
"preview": "<%= form_tag card_path(current_user.slug), method: :put do %>\n <script\n src=\"https://checkout.stripe.com/checkout.js\" "
},
{
"path": "app/views/articles/_article.html.erb",
"chars": 1882,
"preview": "<section class=\"article-full\">\n <div id=\"doc-box\">\n <h1><%= article.title %></h1>\n\n <% if user_signed_in? && !art"
}
]
// ... and 696 more files (download for full content)
About this extraction
This page contains the full source code of the AgileVentures/WebsiteOne GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 896 files (5.7 MB), approximately 1.5M tokens, and a symbol index with 1222 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.