├── .annotaterb.yml ├── .browserslistrc ├── .devcontainer └── devcontainer.json ├── .dockerignore ├── .env.development ├── .env.development.local.sample ├── .env.test ├── .github ├── release-drafter.yml └── workflows │ ├── ci.yml │ ├── codeql-analysis.yml │ ├── release.yml │ └── static.yml ├── .gitignore ├── .husky ├── .gitignore └── pre-commit ├── .node-version ├── .prettierignore ├── .prettierrc.cjs ├── .profile.d └── heroku-exec.sh ├── .rubocop.yml ├── .rubocop_todo.yml ├── .ruby-version ├── .solargraph.yml ├── .swcrc ├── .toys.rb ├── .whitesource ├── .yarn ├── releases │ └── yarn-4.9.1.cjs └── sdks │ ├── eslint │ ├── bin │ │ └── eslint.js │ ├── lib │ │ ├── api.js │ │ ├── types │ │ │ ├── index.d.ts │ │ │ ├── rules │ │ │ │ └── index.d.ts │ │ │ ├── universal.d.ts │ │ │ └── use-at-your-own-risk.d.ts │ │ ├── universal.js │ │ └── unsupported-api.js │ └── package.json │ ├── integrations.yml │ ├── prettier │ ├── bin │ │ └── prettier.cjs │ ├── index.cjs │ └── package.json │ └── typescript │ ├── bin │ ├── tsc │ └── tsserver │ ├── lib │ ├── tsc.js │ ├── tsserver.js │ ├── tsserverlibrary.js │ └── typescript.js │ └── package.json ├── .yarnrc.yml ├── CODE_OF_CONDUCT.md ├── Dockerfile ├── Dockerfile.assets ├── Gemfile ├── Gemfile.lock ├── LICENSE ├── README.md ├── Rakefile ├── SECURITY.md ├── __mocks__ ├── fileMock.js ├── popper.js.js └── styleMock.js ├── app.json ├── app ├── assets │ └── config │ │ └── manifest.js ├── controllers │ ├── application_controller.rb │ ├── authenticity_tokens_controller.rb │ ├── calendars_controller.rb │ ├── concerns │ │ ├── absolute_urls.rb │ │ ├── cms_content_helpers.rb │ │ ├── profile_setup_workflow.rb │ │ ├── redirect_with_authentication.rb │ │ └── send_csv.rb │ ├── csv_exports_controller.rb │ ├── email_forwarders_controller.rb │ ├── graphiql_controller.rb │ ├── graphql_controller.rb │ ├── health_controller.rb │ ├── json_failure_app.rb │ ├── passwords_controller.rb │ ├── registrations_controller.rb │ ├── reports_controller.rb │ ├── sessions_controller.rb │ ├── single_page_app_controller.rb │ ├── sitemaps_controller.rb │ ├── sns_notifications_controller.rb │ ├── stripe_account_controller.rb │ ├── stripe_webhooks_controller.rb │ └── user_con_profiles_controller.rb ├── graphql │ ├── concerns │ │ ├── cms_content_group_mutation.rb │ │ ├── cms_parent_implementation.rb │ │ ├── context_accessors.rb │ │ ├── form_response_attrs_fields.rb │ │ ├── order_entry_inputs.rb │ │ └── scheduled_value_inputs.rb │ ├── graphql_operation.rb │ ├── graphql_operations_generated.json │ ├── intercode_schema.rb │ ├── money_helper.rb │ ├── mutations │ │ ├── .keep │ │ ├── accept_clickwrap_agreement.rb │ │ ├── accept_signup_request.rb │ │ ├── add_order_entry_to_current_pending_order.rb │ │ ├── attach_image_to_event.rb │ │ ├── attach_image_to_event_proposal.rb │ │ ├── base_mutation.rb │ │ ├── cancel_order.rb │ │ ├── convert_ticket_to_event_provided.rb │ │ ├── create_cms_content_group.rb │ │ ├── create_cms_file.rb │ │ ├── create_cms_graphql_query.rb │ │ ├── create_cms_layout.rb │ │ ├── create_cms_navigation_item.rb │ │ ├── create_cms_partial.rb │ │ ├── create_convention.rb │ │ ├── create_convention_stripe_account.rb │ │ ├── create_coupon.rb │ │ ├── create_coupon_application.rb │ │ ├── create_department.rb │ │ ├── create_email_route.rb │ │ ├── create_event.rb │ │ ├── create_event_category.rb │ │ ├── create_event_proposal.rb │ │ ├── create_filler_event.rb │ │ ├── create_form.rb │ │ ├── create_form_item.rb │ │ ├── create_form_section.rb │ │ ├── create_form_with_json.rb │ │ ├── create_maximum_event_provided_tickets_override.rb │ │ ├── create_multiple_runs.rb │ │ ├── create_my_signup.rb │ │ ├── create_or_update_run_for_event.rb │ │ ├── create_order.rb │ │ ├── create_order_entry.rb │ │ ├── create_organization_role.rb │ │ ├── create_page.rb │ │ ├── create_product.rb │ │ ├── create_ranked_choice_user_constraint.rb │ │ ├── create_room.rb │ │ ├── create_run.rb │ │ ├── create_signup_ranked_choice.rb │ │ ├── create_signup_request.rb │ │ ├── create_signup_round.rb │ │ ├── create_staff_position.rb │ │ ├── create_team_member.rb │ │ ├── create_ticket.rb │ │ ├── create_ticket_type.rb │ │ ├── create_user_activity_alert.rb │ │ ├── create_user_con_profile.rb │ │ ├── create_user_signup.rb │ │ ├── delete_cms_content_group.rb │ │ ├── delete_cms_file.rb │ │ ├── delete_cms_graphql_query.rb │ │ ├── delete_cms_layout.rb │ │ ├── delete_cms_navigation_item.rb │ │ ├── delete_cms_partial.rb │ │ ├── delete_cms_variable.rb │ │ ├── delete_coupon.rb │ │ ├── delete_coupon_application.rb │ │ ├── delete_department.rb │ │ ├── delete_email_route.rb │ │ ├── delete_event_category.rb │ │ ├── delete_event_proposal.rb │ │ ├── delete_form.rb │ │ ├── delete_form_item.rb │ │ ├── delete_form_section.rb │ │ ├── delete_maximum_event_provided_tickets_override.rb │ │ ├── delete_order_entry.rb │ │ ├── delete_organization_role.rb │ │ ├── delete_page.rb │ │ ├── delete_product.rb │ │ ├── delete_ranked_choice_user_constraint.rb │ │ ├── delete_room.rb │ │ ├── delete_run.rb │ │ ├── delete_signup_ranked_choice.rb │ │ ├── delete_signup_round.rb │ │ ├── delete_staff_position.rb │ │ ├── delete_team_member.rb │ │ ├── delete_ticket.rb │ │ ├── delete_ticket_type.rb │ │ ├── delete_user_activity_alert.rb │ │ ├── delete_user_con_profile.rb │ │ ├── drop_event.rb │ │ ├── force_confirm_signup.rb │ │ ├── freeze_bucket_assignments.rb │ │ ├── mark_order_paid.rb │ │ ├── merge_users.rb │ │ ├── move_form_item.rb │ │ ├── move_form_section.rb │ │ ├── provide_event_ticket.rb │ │ ├── rate_event.rb │ │ ├── reject_signup_request.rb │ │ ├── rename_cms_file.rb │ │ ├── rerun_moderated_ranked_choice_signup_round.rb │ │ ├── restore_dropped_event.rb │ │ ├── revoke_authorized_application.rb │ │ ├── send_notification_preview.rb │ │ ├── set_cms_variable.rb │ │ ├── set_convention_canceled.rb │ │ ├── set_signup_ranked_choice_prioritize_waitlist.rb │ │ ├── sort_cms_navigation_items.rb │ │ ├── submit_event_proposal.rb │ │ ├── submit_order.rb │ │ ├── transition_event_proposal.rb │ │ ├── update_cms_content_group.rb │ │ ├── update_cms_graphql_query.rb │ │ ├── update_cms_layout.rb │ │ ├── update_cms_navigation_item.rb │ │ ├── update_cms_partial.rb │ │ ├── update_convention.rb │ │ ├── update_coupon.rb │ │ ├── update_department.rb │ │ ├── update_email_route.rb │ │ ├── update_event.rb │ │ ├── update_event_admin_notes.rb │ │ ├── update_event_category.rb │ │ ├── update_event_proposal.rb │ │ ├── update_event_proposal_admin_notes.rb │ │ ├── update_form.rb │ │ ├── update_form_item.rb │ │ ├── update_form_section.rb │ │ ├── update_form_with_json.rb │ │ ├── update_maximum_event_provided_tickets_override.rb │ │ ├── update_notification_template.rb │ │ ├── update_order.rb │ │ ├── update_order_entry.rb │ │ ├── update_organization_role.rb │ │ ├── update_page.rb │ │ ├── update_product.rb │ │ ├── update_ranked_choice_user_constraint.rb │ │ ├── update_room.rb │ │ ├── update_root_site.rb │ │ ├── update_run.rb │ │ ├── update_signup_bucket.rb │ │ ├── update_signup_counted.rb │ │ ├── update_signup_ranked_choice_priority.rb │ │ ├── update_signup_round.rb │ │ ├── update_staff_position.rb │ │ ├── update_staff_position_permissions.rb │ │ ├── update_team_member.rb │ │ ├── update_ticket.rb │ │ ├── update_ticket_type.rb │ │ ├── update_user_activity_alert.rb │ │ ├── update_user_con_profile.rb │ │ ├── withdraw_all_user_con_profile_signups.rb │ │ ├── withdraw_my_signup.rb │ │ ├── withdraw_signup_request.rb │ │ └── withdraw_user_signup.rb │ ├── product_mutation_helper.rb │ ├── sources │ │ ├── active_record_association.rb │ │ ├── active_storage_attachment.rb │ │ ├── authorization_info.rb │ │ ├── cms_page_content.rb │ │ ├── event_rating.rb │ │ ├── event_runs.rb │ │ ├── event_team_members.rb │ │ ├── form_items.rb │ │ ├── markdown.rb │ │ ├── model_by_id.rb │ │ ├── model_permission.rb │ │ ├── my_signup_ranked_choices.rb │ │ ├── my_signup_requests.rb │ │ ├── my_signups.rb │ │ ├── order_quantity_by_status.rb │ │ ├── order_summary.rb │ │ ├── run_room_names.rb │ │ ├── signup_choice.rb │ │ ├── signup_count.rb │ │ ├── simulated_skip_reason.rb │ │ └── waitlist_position.rb │ └── types │ │ ├── .keep │ │ ├── ability_type.rb │ │ ├── active_storage_attachment_type.rb │ │ ├── authorized_application_type.rb │ │ ├── base_enum.rb │ │ ├── base_field.rb │ │ ├── base_input_object.rb │ │ ├── base_interface.rb │ │ ├── base_object.rb │ │ ├── base_scalar.rb │ │ ├── base_union.rb │ │ ├── big_decimal_type.rb │ │ ├── choice_count_type.rb │ │ ├── cms_content_group_input_type.rb │ │ ├── cms_content_group_type.rb │ │ ├── cms_content_input_type.rb │ │ ├── cms_content_type.rb │ │ ├── cms_content_type_indicator.rb │ │ ├── cms_file_type.rb │ │ ├── cms_graphql_query_input_type.rb │ │ ├── cms_graphql_query_type.rb │ │ ├── cms_layout_input_type.rb │ │ ├── cms_layout_type.rb │ │ ├── cms_navigation_item_input_type.rb │ │ ├── cms_navigation_item_type.rb │ │ ├── cms_parent.rb │ │ ├── cms_partial_block_name.rb │ │ ├── cms_partial_input_type.rb │ │ ├── cms_partial_type.rb │ │ ├── cms_variable.rb │ │ ├── cms_variable_input.rb │ │ ├── contact_email_type.rb │ │ ├── convention_filters_input_type.rb │ │ ├── convention_input_type.rb │ │ ├── convention_reports_type.rb │ │ ├── convention_type.rb │ │ ├── conventions_pagination_type.rb │ │ ├── coupon_application_type.rb │ │ ├── coupon_filters_input_type.rb │ │ ├── coupon_input_type.rb │ │ ├── coupon_type.rb │ │ ├── coupons_pagination_type.rb │ │ ├── date_type.rb │ │ ├── department_input_type.rb │ │ ├── department_type.rb │ │ ├── email_mode_type.rb │ │ ├── email_route_filters_input_type.rb │ │ ├── email_route_input_type.rb │ │ ├── email_route_type.rb │ │ ├── email_routes_pagination_type.rb │ │ ├── event_category_input_type.rb │ │ ├── event_category_type.rb │ │ ├── event_filters_input_type.rb │ │ ├── event_input_type.rb │ │ ├── event_proposal_filters_input_type.rb │ │ ├── event_proposal_input_type.rb │ │ ├── event_proposal_type.rb │ │ ├── event_proposals_pagination_type.rb │ │ ├── event_provided_ticket_list_type.rb │ │ ├── event_type.rb │ │ ├── event_with_choice_counts_type.rb │ │ ├── events_pagination_type.rb │ │ ├── form_input_type.rb │ │ ├── form_item_expose_in_type.rb │ │ ├── form_item_input_type.rb │ │ ├── form_item_role_type.rb │ │ ├── form_item_type.rb │ │ ├── form_response_change_type.rb │ │ ├── form_section_input_type.rb │ │ ├── form_section_type.rb │ │ ├── form_type.rb │ │ ├── form_type_type.rb │ │ ├── grouped_signup_count_type.rb │ │ ├── json.rb │ │ ├── liquid_assign.rb │ │ ├── mailing_lists_result_type.rb │ │ ├── mailing_lists_type.rb │ │ ├── mailing_lists_waitlists_result_type.rb │ │ ├── maximum_event_provided_tickets_override_type.rb │ │ ├── money_input_type.rb │ │ ├── money_type.rb │ │ ├── mutation_type.rb │ │ ├── notification_condition_input_type.rb │ │ ├── notification_condition_type.rb │ │ ├── notification_condition_type_type.rb │ │ ├── notification_destination_input_type.rb │ │ ├── notification_destination_type.rb │ │ ├── notification_dynamic_destination.rb │ │ ├── notification_event_key.rb │ │ ├── notification_event_type.rb │ │ ├── notification_source_type.rb │ │ ├── notification_template_input_type.rb │ │ ├── notification_template_type.rb │ │ ├── order_entry_input_type.rb │ │ ├── order_entry_type.rb │ │ ├── order_filters_input_type.rb │ │ ├── order_input_type.rb │ │ ├── order_quantity_by_status_type.rb │ │ ├── order_status_type.rb │ │ ├── order_type.rb │ │ ├── orders_connection_type.rb │ │ ├── orders_pagination_type.rb │ │ ├── organization_role_input_type.rb │ │ ├── organization_role_type.rb │ │ ├── organization_type.rb │ │ ├── page_input_type.rb │ │ ├── page_type.rb │ │ ├── pagination_interface.rb │ │ ├── pagination_type.rb │ │ ├── pay_what_you_want_input_type.rb │ │ ├── pay_what_you_want_value_type.rb │ │ ├── payment_mode_type.rb │ │ ├── permission_input_type.rb │ │ ├── permission_type.rb │ │ ├── permissioned_model_type.rb │ │ ├── permissioned_model_type_indicator.rb │ │ ├── permissioned_role_type.rb │ │ ├── permissioned_role_type_indicator.rb │ │ ├── pricing_strategy_type.rb │ │ ├── pricing_structure_input_type.rb │ │ ├── pricing_structure_type.rb │ │ ├── pricing_structure_value_type.rb │ │ ├── product_input_type.rb │ │ ├── product_type.rb │ │ ├── product_variant_input_type.rb │ │ ├── product_variant_type.rb │ │ ├── query_type.rb │ │ ├── ranked_choice_decision_filters_input_type.rb │ │ ├── ranked_choice_decision_reason_type.rb │ │ ├── ranked_choice_decision_type.rb │ │ ├── ranked_choice_decision_value_type.rb │ │ ├── ranked_choice_decisions_pagination_type.rb │ │ ├── ranked_choice_order.rb │ │ ├── ranked_choice_user_constraint_input_type.rb │ │ ├── ranked_choice_user_constraint_type.rb │ │ ├── receive_signup_email_type.rb │ │ ├── refund_status_type.rb │ │ ├── registration_policy_bucket_input_type.rb │ │ ├── registration_policy_bucket_type.rb │ │ ├── registration_policy_input_type.rb │ │ ├── registration_policy_type.rb │ │ ├── room_input_type.rb │ │ ├── room_type.rb │ │ ├── root_site_input_type.rb │ │ ├── root_site_type.rb │ │ ├── run_filters_input_type.rb │ │ ├── run_input_type.rb │ │ ├── run_type.rb │ │ ├── runs_pagination_type.rb │ │ ├── sales_count_by_product_and_payment_amount_type.rb │ │ ├── scheduled_money_value_input_type.rb │ │ ├── scheduled_money_value_type.rb │ │ ├── scheduled_value_input_type.rb │ │ ├── scheduled_value_type.rb │ │ ├── scheduling_ui_type.rb │ │ ├── search_result_entry_type.rb │ │ ├── search_result_type.rb │ │ ├── searchable_model_type.rb │ │ ├── show_schedule_type.rb │ │ ├── signup_automation_mode_type.rb │ │ ├── signup_change_action_type.rb │ │ ├── signup_change_filters_input_type.rb │ │ ├── signup_change_type.rb │ │ ├── signup_changes_pagination_type.rb │ │ ├── signup_count_by_state_type.rb │ │ ├── signup_filters_input_type.rb │ │ ├── signup_mode_type.rb │ │ ├── signup_move_result_type.rb │ │ ├── signup_ranked_choice_state_type.rb │ │ ├── signup_ranked_choice_type.rb │ │ ├── signup_request_filters_input_type.rb │ │ ├── signup_request_state_type.rb │ │ ├── signup_request_type.rb │ │ ├── signup_requests_pagination_type.rb │ │ ├── signup_round_input_type.rb │ │ ├── signup_round_type.rb │ │ ├── signup_state_type.rb │ │ ├── signup_type.rb │ │ ├── signups_pagination_type.rb │ │ ├── simulated_skip_reason_type.rb │ │ ├── site_mode_type.rb │ │ ├── sort_input_type.rb │ │ ├── staff_position_input_type.rb │ │ ├── staff_position_type.rb │ │ ├── stripe_account_type.rb │ │ ├── team_member_input_type.rb │ │ ├── team_member_type.rb │ │ ├── ticket_count_by_type_and_payment_amount_type.rb │ │ ├── ticket_input_type.rb │ │ ├── ticket_mode_type.rb │ │ ├── ticket_type.rb │ │ ├── ticket_type_input_type.rb │ │ ├── ticket_type_parent_type.rb │ │ ├── ticket_type_type.rb │ │ ├── timespan_with_money_value_input_type.rb │ │ ├── timespan_with_money_value_type.rb │ │ ├── timespan_with_value_input_type.rb │ │ ├── timespan_with_value_type.rb │ │ ├── timezone_mode_type.rb │ │ ├── uncamelized_field.rb │ │ ├── user_activity_alert_input_type.rb │ │ ├── user_activity_alert_type.rb │ │ ├── user_con_profile_filters_input_type.rb │ │ ├── user_con_profile_input_type.rb │ │ ├── user_con_profile_type.rb │ │ ├── user_con_profiles_pagination_type.rb │ │ ├── user_filters_input_type.rb │ │ ├── user_signup_constraints_type.rb │ │ ├── user_type.rb │ │ ├── users_pagination_type.rb │ │ └── winning_user_con_profile_input_type.rb ├── helpers │ ├── application_helper.rb │ ├── authenticity_tokens_helper.rb │ ├── calendars_helper.rb │ ├── csv_exports_helper.rb │ ├── graphiql_helper.rb │ ├── passwords_helper.rb │ ├── registrations_helper.rb │ ├── reports_helper.rb │ ├── single_page_app_helper.rb │ ├── sitemaps_helper.rb │ ├── stripe_account_helper.rb │ └── user_con_profiles_helper.rb ├── javascript │ ├── @types │ │ ├── assets.d.ts │ │ ├── globals.d.ts │ │ ├── i18next.d.ts │ │ └── react-table-config.d.ts │ ├── AppRoot.tsx │ ├── AppRootContext.tsx │ ├── AppRootLayout.tsx │ ├── AppRouter.tsx │ ├── AppWrapper.tsx │ ├── Authentication │ │ ├── AccountFormContent.tsx │ │ ├── AuthenticationForms.tsx │ │ ├── AuthenticationModal.tsx │ │ ├── AuthenticationModalContext.tsx │ │ ├── EditUser.tsx │ │ ├── ForgotPasswordForm.tsx │ │ ├── PasswordConfirmationInput.tsx │ │ ├── PasswordInputWithStrengthCheck.tsx │ │ ├── ResetPassword.tsx │ │ ├── SignInButton.tsx │ │ ├── SignInForm.tsx │ │ ├── SignOutButton.tsx │ │ ├── SignUpButton.tsx │ │ ├── SignUpForm.tsx │ │ ├── UserFormFields.tsx │ │ ├── queries.generated.ts │ │ ├── queries.graphql │ │ ├── useAfterSessionChange.ts │ │ ├── useAuthorizationRequired.tsx │ │ └── useLoginRequired.tsx │ ├── AuthenticityTokensContext.tsx │ ├── Breadcrumbs │ │ ├── BreadcrumbItem.tsx │ │ ├── LeafBreadcrumbItem.tsx │ │ ├── NamedRouteBreadcrumbItem.tsx │ │ ├── RouteActivatedBreadcrumbItem.tsx │ │ └── RouteActivatedBreadcrumbItemV2.tsx │ ├── BuiltInFormControls │ │ ├── AddFileModal.tsx │ │ ├── AdminNotes.tsx │ │ ├── ArrayEditor.tsx │ │ ├── CommitableInput.tsx │ │ ├── ConventionDaySelect.tsx │ │ ├── DateTimeInput.tsx │ │ ├── EmailAliasInput.tsx │ │ ├── EventCategorySelect.tsx │ │ ├── EventSelect.tsx │ │ ├── GraphQLAsyncSelect.tsx │ │ ├── InPlaceEditor.tsx │ │ ├── LiquidInput.tsx │ │ ├── MarkdownInput.tsx │ │ ├── MaximumEventProvidedTicketsOverrideEditor.tsx │ │ ├── OrganizationSelect.tsx │ │ ├── ProductSelect.tsx │ │ ├── RoomSelect.tsx │ │ ├── RunSelect.tsx │ │ ├── ScheduledValueEditor.tsx │ │ ├── ScheduledValueTimespanRow.tsx │ │ ├── SelectWithLabel.tsx │ │ ├── TimeSelect.tsx │ │ ├── TimezoneSelect.tsx │ │ ├── UserConProfileSelect.tsx │ │ ├── UserSelect.tsx │ │ ├── previewQueries.generated.ts │ │ ├── previewQueries.graphql │ │ ├── selectDefaultQueries.generated.ts │ │ ├── selectDefaultQueries.graphql │ │ └── timezoneSelectData.json │ ├── BuiltInForms │ │ ├── EditEvent.tsx │ │ ├── EditEventHeader.tsx │ │ ├── FileUploadForm.tsx │ │ └── RunFormFields.tsx │ ├── ChangeSet.ts │ ├── ClickwrapAgreement │ │ ├── index.tsx │ │ ├── mutations.generated.ts │ │ ├── mutations.graphql │ │ ├── queries.generated.ts │ │ └── queries.graphql │ ├── CmsAdmin │ │ ├── CmsContentGroupsAdmin │ │ │ ├── CmsContentGroupFormFields.tsx │ │ │ ├── CmsContentGroupsAdminTable.tsx │ │ │ ├── CmsContentSelect.tsx │ │ │ ├── EditCmsContentGroup.tsx │ │ │ ├── NewCmsContentGroup.tsx │ │ │ ├── SingleCmsContentGroupRoute.ts │ │ │ ├── ViewCmsContentGroup.tsx │ │ │ ├── loaders.ts │ │ │ ├── mutations.generated.ts │ │ │ ├── mutations.graphql │ │ │ ├── queries.generated.ts │ │ │ └── queries.graphql │ │ ├── CmsFilesAdmin │ │ │ ├── FileInputWithPreview.tsx │ │ │ ├── FilePreview.tsx │ │ │ ├── index.tsx │ │ │ ├── mutations.generated.ts │ │ │ ├── mutations.graphql │ │ │ ├── queries.generated.ts │ │ │ └── queries.graphql │ │ ├── CmsGraphqlQueriesAdmin │ │ │ ├── CmsGraphqlQueriesAdminTable.tsx │ │ │ ├── CmsGraphqlQueryForm.tsx │ │ │ ├── EditCmsGraphqlQuery.tsx │ │ │ ├── NewCmsGraphqlQuery.tsx │ │ │ ├── SingleGraphqlQueryRoute.ts │ │ │ ├── ViewCmsGraphqlQuerySource.tsx │ │ │ ├── buildCmsGraphqlQueryInput.ts │ │ │ ├── loaders.ts │ │ │ ├── mutations.generated.ts │ │ │ ├── mutations.graphql │ │ │ ├── queries.generated.ts │ │ │ └── queries.graphql │ │ ├── CmsLayoutsAdmin │ │ │ ├── CmsLayoutForm.tsx │ │ │ ├── CmsLayoutsAdminTable.tsx │ │ │ ├── EditCmsLayout.tsx │ │ │ ├── NewCmsLayout.tsx │ │ │ ├── SingleLayoutRoute.tsx │ │ │ ├── ViewCmsLayoutSource.tsx │ │ │ ├── buildLayoutInput.ts │ │ │ ├── loaders.ts │ │ │ ├── mutations.generated.ts │ │ │ ├── mutations.graphql │ │ │ ├── queries.generated.ts │ │ │ └── queries.graphql │ │ ├── CmsPagesAdmin │ │ │ ├── CmsPageForm.tsx │ │ │ ├── CmsPagesAdminTable.tsx │ │ │ ├── EditCmsPage.tsx │ │ │ ├── NewCmsPage.tsx │ │ │ ├── SinglePageRoute.tsx │ │ │ ├── ViewCmsPageSource.tsx │ │ │ ├── buildPageInput.ts │ │ │ ├── loaders.ts │ │ │ ├── mutations.generated.ts │ │ │ ├── mutations.graphql │ │ │ ├── queries.generated.ts │ │ │ └── queries.graphql │ │ ├── CmsPartialsAdmin │ │ │ ├── CmsPartialForm.tsx │ │ │ ├── CmsPartialsAdminTable.tsx │ │ │ ├── EditCmsPartial.tsx │ │ │ ├── NewCmsPartial.tsx │ │ │ ├── SinglePartialRoute.tsx │ │ │ ├── ViewCmsPartialSource.tsx │ │ │ ├── buildPartialInput.ts │ │ │ ├── loaders.ts │ │ │ ├── mutations.generated.ts │ │ │ ├── mutations.graphql │ │ │ ├── queries.generated.ts │ │ │ └── queries.graphql │ │ ├── CmsVariablesAdmin │ │ │ ├── AddVariableRow.tsx │ │ │ ├── ExistingVariableRow.tsx │ │ │ ├── SingleVariableRoute.ts │ │ │ ├── index.tsx │ │ │ ├── mutations.generated.ts │ │ │ ├── mutations.graphql │ │ │ ├── queries.generated.ts │ │ │ └── queries.graphql │ │ ├── NavigationItemsAdmin │ │ │ ├── Client.ts │ │ │ ├── index.tsx │ │ │ ├── mutations.generated.ts │ │ │ ├── mutations.graphql │ │ │ ├── queries.generated.ts │ │ │ └── queries.graphql │ │ ├── index.tsx │ │ ├── loaders.ts │ │ ├── queries.generated.ts │ │ └── queries.graphql │ ├── CmsPage │ │ ├── PageAdminDropdown.tsx │ │ ├── index.tsx │ │ ├── queries.generated.ts │ │ └── queries.graphql │ ├── ColorPicker │ │ ├── SyncColorPicker.tsx │ │ └── index.tsx │ ├── ConventionAdmin │ │ ├── ConventionForm.tsx │ │ ├── ConventionFormBillingSection.tsx │ │ ├── ConventionFormEmailSection.tsx │ │ ├── ConventionFormEventsSection.tsx │ │ ├── ConventionFormGeneralSection.tsx │ │ ├── ConventionFormHeader.tsx │ │ ├── ConventionFormWebsiteSection.tsx │ │ ├── ConventionLanguageInput.tsx │ │ ├── index.tsx │ │ ├── mutations.generated.ts │ │ ├── mutations.graphql │ │ ├── queries.generated.ts │ │ └── queries.graphql │ ├── DateTimeFormats.ts │ ├── DepartmentAdmin │ │ ├── DepartmentAdminIndex.tsx │ │ ├── DepartmentForm.tsx │ │ ├── EditDepartment.tsx │ │ ├── NewDepartment.tsx │ │ ├── SingleDepartmentRoute.ts │ │ ├── buildDepartmentInput.ts │ │ ├── loaders.ts │ │ ├── mutations.generated.ts │ │ ├── mutations.graphql │ │ ├── queries.generated.ts │ │ └── queries.graphql │ ├── DevModeGraphiql.tsx │ ├── ErrorReporting.ts │ ├── EventAdmin │ │ ├── $id.ts │ │ ├── AdminNotesRoute.ts │ │ ├── CategorySpecificEventAdmin.tsx │ │ ├── CreateMultipleRunsRoute.ts │ │ ├── DroppedEventAdmin.tsx │ │ ├── EditRun.tsx │ │ ├── EditRunModal.tsx │ │ ├── EventAdminEditEvent.tsx │ │ ├── EventAdminRow.tsx │ │ ├── EventAdminRunsTable.tsx │ │ ├── InputBuilders.ts │ │ ├── NewEvent.tsx │ │ ├── NewRun.tsx │ │ ├── ProspectiveRunSchedule.tsx │ │ ├── RecurringEventAdmin.tsx │ │ ├── RecurringEventSection.tsx │ │ ├── RestoreEventRoute.ts │ │ ├── ScheduleMultipleRunsModal.tsx │ │ ├── SingleRunEventAdminList.tsx │ │ ├── SingleRunRoute.ts │ │ ├── buildEventCategoryUrl.ts │ │ ├── buildRunInputFromFormData.tsx │ │ ├── create.ts │ │ ├── drop.ts │ │ ├── getFormForEventCategory.ts │ │ ├── index.tsx │ │ ├── loaders.ts │ │ ├── mutations.generated.ts │ │ ├── mutations.graphql │ │ ├── queries.generated.ts │ │ ├── queries.graphql │ │ ├── sortEventCategories.ts │ │ ├── useEventAdminCategory.ts │ │ ├── useEventCategorySelection.ts │ │ ├── useEventForm.tsx │ │ └── useEventFormWithCategorySelection.tsx │ ├── EventCategoryAdmin │ │ ├── $id.ts │ │ ├── EditEventCategory.tsx │ │ ├── EventCategoryForm.tsx │ │ ├── EventCategoryIndex.tsx │ │ ├── EventCategoryRow.tsx │ │ ├── NewEventCategory.tsx │ │ ├── buildEventCategoryInput.ts │ │ ├── index.tsx │ │ ├── loaders.ts │ │ ├── mutations.generated.ts │ │ ├── mutations.graphql │ │ ├── queries.generated.ts │ │ └── queries.graphql │ ├── EventProposals │ │ ├── $id │ │ │ ├── admin_notes.ts │ │ │ ├── route.ts │ │ │ └── transition.ts │ │ ├── AdminEditEventProposal.tsx │ │ ├── CreateEventProposalModal.tsx │ │ ├── EditEventProposal.tsx │ │ ├── EventProposalAdminDisplay.tsx │ │ ├── EventProposalDisplay.tsx │ │ ├── EventProposalForm.tsx │ │ ├── EventProposalHistory.tsx │ │ ├── EventProposalStatusUpdater.tsx │ │ ├── EventProposalsAdmin.tsx │ │ ├── EventProposalsAdminTable.tsx │ │ ├── ProposeEventButton.tsx │ │ ├── loaders.ts │ │ ├── mutations.generated.ts │ │ ├── mutations.graphql │ │ ├── queries.generated.ts │ │ ├── queries.graphql │ │ └── route.ts │ ├── EventRatings │ │ ├── EventRatingIcon.tsx │ │ ├── RateEventControl.tsx │ │ ├── RatingsHelp.tsx │ │ ├── mutations.generated.ts │ │ ├── mutations.graphql │ │ └── useRateEvent.ts │ ├── EventsApp │ │ ├── EventCatalog │ │ │ ├── EventCatalogNavTabs.tsx │ │ │ ├── EventList │ │ │ │ ├── EventCard.tsx │ │ │ │ ├── EventListCategoryDropdown.tsx │ │ │ │ ├── EventListEvents.tsx │ │ │ │ ├── EventListFilterableFormItemDropdown.tsx │ │ │ │ ├── EventListMyRatingSelector.tsx │ │ │ │ ├── EventListPageSizeControl.tsx │ │ │ │ ├── EventListSortDropdown.tsx │ │ │ │ ├── getSortedRuns.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── queries.generated.ts │ │ │ │ └── queries.graphql │ │ │ └── EventTable │ │ │ │ ├── index.tsx │ │ │ │ ├── queries.generated.ts │ │ │ │ └── queries.graphql │ │ ├── EventPage │ │ │ ├── BucketAvailabilityDisplay.tsx │ │ │ ├── CreateModeratedSignupModal.tsx │ │ │ ├── EventAdminMenu.tsx │ │ │ ├── EventBreadcrumbItems.tsx │ │ │ ├── EventCapacityDisplay.tsx │ │ │ ├── EventHistory.tsx │ │ │ ├── EventPageRunCard.tsx │ │ │ ├── EventTicketPurchaseModal.tsx │ │ │ ├── LongFormEventDetails.tsx │ │ │ ├── RunCapacityGraph.tsx │ │ │ ├── RunCapacityGraphBucket.tsx │ │ │ ├── RunCard.tsx │ │ │ ├── RunsSection.tsx │ │ │ ├── ShortFormEventDetails.tsx │ │ │ ├── SignupButtonDisplay.tsx │ │ │ ├── SignupButtons.tsx │ │ │ ├── ViewSignupsOptions.tsx │ │ │ ├── WithdrawMySignupButton.tsx │ │ │ ├── WithdrawMySignupModal.tsx │ │ │ ├── WithdrawSignupButton.tsx │ │ │ ├── buildSignupOptions.ts │ │ │ ├── eventHistoryQuery.generated.ts │ │ │ ├── eventHistoryQuery.graphql │ │ │ ├── index.tsx │ │ │ ├── mutations.generated.ts │ │ │ ├── mutations.graphql │ │ │ ├── queries.generated.ts │ │ │ ├── queries.graphql │ │ │ ├── sortBuckets.ts │ │ │ ├── useSectionizedFormItems.ts │ │ │ └── valueIsPresent.ts │ │ ├── EventTicketTypesWrapper.tsx │ │ ├── MaximumEventProvidedTicketsOverrides │ │ │ ├── $id.ts │ │ │ └── route.ts │ │ ├── MySignupQueue │ │ │ ├── NextRoundInfoBox.tsx │ │ │ ├── RankedChoicePriorityIndicator.tsx │ │ │ ├── RankedChoiceUserSettings.tsx │ │ │ ├── UserSignupQueue.tsx │ │ │ ├── index.tsx │ │ │ ├── mutations.generated.ts │ │ │ ├── mutations.graphql │ │ │ ├── queries.generated.ts │ │ │ ├── queries.graphql │ │ │ ├── signup-queue.module.css │ │ │ └── usePendingChoices.tsx │ │ ├── RunList │ │ │ ├── RunListEventRun.tsx │ │ │ └── index.tsx │ │ ├── ScheduleApp.tsx │ │ ├── ScheduleGrid │ │ │ ├── AvailabilityBar.tsx │ │ │ ├── AvailabilityUtils.tsx │ │ │ ├── CategoryLegend.tsx │ │ │ ├── ConventionDayTabContainer.tsx │ │ │ ├── FakeEventRun.tsx │ │ │ ├── FullnessLegend.tsx │ │ │ ├── LayoutConstants.ts │ │ │ ├── PersonalScheduleFiltersBar.tsx │ │ │ ├── RefreshButton.tsx │ │ │ ├── RunDetails.tsx │ │ │ ├── RunDisplay.tsx │ │ │ ├── Schedule.ts │ │ │ ├── ScheduleBlock.tsx │ │ │ ├── ScheduleGrid.tsx │ │ │ ├── ScheduleGridConfig.ts │ │ │ ├── ScheduleGridContext.tsx │ │ │ ├── ScheduleGridEventRun.tsx │ │ │ ├── ScheduleGridExtendedCounts.tsx │ │ │ ├── ScheduleGridHeaderBlock.tsx │ │ │ ├── ScheduleGridHour.tsx │ │ │ ├── ScheduleGridLayout.ts │ │ │ ├── ScheduleGridRowHeader.tsx │ │ │ ├── ScheduleGridSkeleton.tsx │ │ │ ├── ScheduleLayout │ │ │ │ ├── ColumnReservation.ts │ │ │ │ ├── ColumnReservationSet.ts │ │ │ │ └── ScheduleLayoutBlock.ts │ │ │ ├── SignupStatusBadge.tsx │ │ │ ├── StylingUtils.ts │ │ │ ├── getCapacityThresholds.ts │ │ │ ├── getFullnessClass.ts │ │ │ ├── index.tsx │ │ │ ├── queries.generated.ts │ │ │ ├── queries.graphql │ │ │ └── useLayoutForTimespan.ts │ │ ├── SignupAdmin │ │ │ ├── $id │ │ │ │ ├── change_bucket.tsx │ │ │ │ ├── force_confirm.tsx │ │ │ │ └── route.tsx │ │ │ ├── AddToCalendarDropdown.tsx │ │ │ ├── BucketInput.tsx │ │ │ ├── RunEmailList.tsx │ │ │ ├── RunHeader.tsx │ │ │ ├── RunSignupChangesTable.tsx │ │ │ ├── RunSignupSummary.tsx │ │ │ ├── RunSignupsTable.tsx │ │ │ ├── SignupUtils.ts │ │ │ ├── SignupsIndex.tsx │ │ │ ├── UserConProfileSignupsCard.tsx │ │ │ ├── loaders.ts │ │ │ ├── mutations.generated.ts │ │ │ ├── mutations.graphql │ │ │ ├── queries.generated.ts │ │ │ └── queries.graphql │ │ ├── SignupCountData.ts │ │ ├── StandaloneEditEvent │ │ │ ├── index.tsx │ │ │ ├── mutations.generated.ts │ │ │ ├── mutations.graphql │ │ │ ├── queries.generated.ts │ │ │ └── queries.graphql │ │ ├── TeamMemberAdmin │ │ │ ├── Checkmark.tsx │ │ │ ├── EditTeamMember.tsx │ │ │ ├── NewTeamMember.tsx │ │ │ ├── ProvidableTicketTypeSelection.tsx │ │ │ ├── ProvideTicketModal.tsx │ │ │ ├── ProvideTicketUtils.ts │ │ │ ├── TeamMemberForm.tsx │ │ │ ├── TeamMembersIndex.tsx │ │ │ ├── TicketingStatusDescription.tsx │ │ │ ├── buildTeamMemberInput.ts │ │ │ ├── index.tsx │ │ │ ├── loader.ts │ │ │ ├── mutations.generated.ts │ │ │ ├── mutations.graphql │ │ │ ├── queries.generated.ts │ │ │ └── queries.graphql │ │ ├── attach_image.ts │ │ ├── buildEventUrl.ts │ │ ├── conventionDayUrls.ts │ │ ├── eventIdRegexp.ts │ │ ├── queries.generated.ts │ │ ├── queries.graphql │ │ ├── runTimeFormatting.ts │ │ ├── teamMembersForDisplay.ts │ │ ├── useFilterableFormItems.ts │ │ └── useMergeCategoriesIntoEvents.ts │ ├── FormAdmin │ │ ├── $id │ │ │ ├── edit │ │ │ │ └── section │ │ │ │ │ ├── $sectionId │ │ │ │ │ ├── FormEditorItemPreview.tsx │ │ │ │ │ ├── FormEditorItemPreviewDragOverlay.tsx │ │ │ │ │ ├── FormSectionEditorAddItemBar.tsx │ │ │ │ │ ├── FormSectionEditorContent.tsx │ │ │ │ │ ├── FormSectionNav.tsx │ │ │ │ │ ├── FormSectionNavItem.tsx │ │ │ │ │ ├── FormSectionNavItemDragOverlay.tsx │ │ │ │ │ ├── NewFormItemModal.tsx │ │ │ │ │ ├── item │ │ │ │ │ │ ├── $itemId │ │ │ │ │ │ │ ├── FormItemEditorContent.tsx │ │ │ │ │ │ │ ├── move.ts │ │ │ │ │ │ │ └── route.tsx │ │ │ │ │ │ └── route.ts │ │ │ │ │ ├── move.ts │ │ │ │ │ └── route.tsx │ │ │ │ │ └── route.ts │ │ │ └── route.ts │ │ ├── FormAdminIndex.tsx │ │ ├── FormEditor.tsx │ │ ├── FormEditorContexts.ts │ │ ├── FormItemEditorProps.ts │ │ ├── FormItemTools.tsx │ │ ├── FormItemUtils.ts │ │ ├── FormJSONEditor.tsx │ │ ├── ItemEditors │ │ │ ├── AgeRestrictionsEditor.tsx │ │ │ ├── CommonQuestionFields.tsx │ │ │ ├── DateEditor.tsx │ │ │ ├── DefaultAnswerModal.tsx │ │ │ ├── EventEmailEditor.tsx │ │ │ ├── FormItemIdentifierInput.tsx │ │ │ ├── FreeTextEditor.tsx │ │ │ ├── MultipleChoiceEditor.tsx │ │ │ ├── MultipleChoiceOptionRow.tsx │ │ │ ├── MultipleChoiceOptionRowDragOverlay.tsx │ │ │ ├── RegistrationPolicyItemEditor.tsx │ │ │ ├── RegistrationPolicyItemEditorPresetModal.tsx │ │ │ ├── RegistrationPolicyItemEditorPresetRow.tsx │ │ │ ├── RegistrationPolicyItemEditorPresetRowDragOverlay.tsx │ │ │ ├── StaticTextEditor.tsx │ │ │ ├── TimeblockPreferenceEditor.tsx │ │ │ ├── TimeblockPreferenceEditorOmissionsRow.tsx │ │ │ ├── TimeblockPreferenceEditorTimeblockRow.tsx │ │ │ ├── TimeblockPreferenceEditorTimeblockRowDragOverlay.tsx │ │ │ ├── TimespanEditor.tsx │ │ │ ├── useArrayProperty.ts │ │ │ └── usePropertyUpdater.ts │ │ ├── NewFormModal.tsx │ │ ├── buildNewFormItem.ts │ │ ├── index.tsx │ │ ├── mutations.generated.ts │ │ ├── mutations.graphql │ │ ├── queries.generated.ts │ │ ├── queries.graphql │ │ └── serializeParsedFormItem.ts │ ├── FormPresenter │ │ ├── ItemChangeDisplays │ │ │ ├── AgeRestrictionsItemChangeDisplay.tsx │ │ │ ├── DateItemChangeDisplay.tsx │ │ │ ├── EventEmailItemChangeDisplay.tsx │ │ │ ├── FormItemChangeDisplay.tsx │ │ │ ├── FormItemChangeGroup.tsx │ │ │ ├── FormItemChangeUtils.ts │ │ │ ├── FormResponseChangeHistory.tsx │ │ │ ├── FreeTextItemChangeDisplay.tsx │ │ │ ├── MultipleChoiceItemChangeDisplay.tsx │ │ │ ├── ObjectDiffDisplay.tsx │ │ │ ├── RegistrationPolicyItemChangeDisplay.tsx │ │ │ ├── TextDiffDisplay.tsx │ │ │ ├── TimeblockPreferenceItemChangeDisplay.tsx │ │ │ └── TimespanItemChangeDisplay.tsx │ │ ├── ItemDisplays │ │ │ ├── AdminCaption.tsx │ │ │ ├── AgeRestrictionsDisplay.tsx │ │ │ ├── DateItemDisplay.tsx │ │ │ ├── EventEmailDisplay.tsx │ │ │ ├── FormItemDisplay.tsx │ │ │ ├── FormItemDisplayMode.ts │ │ │ ├── FreeTextItemDisplay.tsx │ │ │ ├── MarkdownDisplay.tsx │ │ │ ├── MultipleChoiceItemDisplay.tsx │ │ │ ├── RegistrationPolicyItemDisplay.tsx │ │ │ ├── TimeblockPreferenceItemDisplay.tsx │ │ │ └── TimespanItemDisplay.tsx │ │ ├── ItemFilters │ │ │ ├── CommonFormItemFilterProps.ts │ │ │ ├── FormItemFilter.tsx │ │ │ ├── FreeTextItemFilter.tsx │ │ │ └── MultipleChoiceItemFilter.tsx │ │ ├── ItemInputs │ │ │ ├── AgeRestrictionsInput.tsx │ │ │ ├── CaptionLabel.tsx │ │ │ ├── CaptionLegend.tsx │ │ │ ├── CommonFormItemInputProps.ts │ │ │ ├── DateItemInput.tsx │ │ │ ├── EventEmailInput.tsx │ │ │ ├── FieldRequiredFeedback.tsx │ │ │ ├── FormItemInput.tsx │ │ │ ├── FreeTextItemInput.tsx │ │ │ ├── MultipleChoiceItemInput.tsx │ │ │ ├── PermissionDisclosures.tsx │ │ │ ├── RegistrationPolicyItemInput.tsx │ │ │ ├── RequiredIndicator.tsx │ │ │ ├── TimeblockPreferenceCell.tsx │ │ │ ├── TimeblockPreferenceItemInput.tsx │ │ │ └── TimespanItemInput.tsx │ │ ├── ItemInteractionTracker.tsx │ │ ├── Layouts │ │ │ ├── FormBody.tsx │ │ │ ├── FormFooter.tsx │ │ │ ├── FormHeader.tsx │ │ │ ├── FormPresenter.tsx │ │ │ ├── FormProgress.tsx │ │ │ └── FormSection.tsx │ │ ├── SectionTraversalContext.tsx │ │ ├── SinglePageFormPresenter.tsx │ │ ├── StaticTextItem.tsx │ │ ├── TimeblockTypes.ts │ │ ├── TimeblockUtils.ts │ │ ├── TimespanItemUtils.ts │ │ ├── index.tsx │ │ ├── useAutocommitFormResponseOnChange.ts │ │ ├── useFormResponse.ts │ │ ├── useFormValidation.ts │ │ └── useValidatableForm.ts │ ├── FourOhFourPage.tsx │ ├── GeneratedIdUtils.ts │ ├── Gravatar.tsx │ ├── LazyStripe.tsx │ ├── LiquidDocs │ │ ├── AssignDoc.tsx │ │ ├── AssignDocHeader.tsx │ │ ├── AssignDocLink.tsx │ │ ├── AssignName.tsx │ │ ├── CompactAssignDocHeader.tsx │ │ ├── DocData.ts │ │ ├── FilterDoc.tsx │ │ ├── FilterDocHeader.tsx │ │ ├── FilterDocLink.tsx │ │ ├── LiquidTagDoc.tsx │ │ ├── LiquidTagDocHeader.tsx │ │ ├── LiquidTagDocLink.tsx │ │ ├── MethodDoc.tsx │ │ ├── TagDoc.tsx │ │ ├── escapeRegExp.ts │ │ ├── findClass.ts │ │ ├── findLiquidTagName.ts │ │ ├── findMethodReturnClass.ts │ │ ├── index.tsx │ │ ├── loader.ts │ │ ├── queries.generated.ts │ │ └── queries.graphql │ ├── MailingLists │ │ ├── EventProposers.tsx │ │ ├── TabbedMailingList.tsx │ │ ├── TeamMembers.tsx │ │ ├── TicketedAttendees.tsx │ │ ├── UsersWithPendingBio.tsx │ │ ├── WaitlistMailingLists.tsx │ │ ├── WhosFree.tsx │ │ ├── WhosFreeForm.tsx │ │ ├── index.tsx │ │ ├── queries.generated.ts │ │ └── queries.graphql │ ├── Maps │ │ ├── ConventionLocationMap.tsx │ │ ├── LocationSelect.tsx │ │ ├── OpenLayersMap.tsx │ │ ├── geoJSONUtils.ts │ │ ├── geocodingBackends │ │ │ ├── mapbox.tsx │ │ │ └── photon.tsx │ │ └── openLayersMapMarkers.tsx │ ├── Models │ │ ├── Form.ts │ │ ├── FormItem.ts │ │ ├── commonFormFragments.generated.ts │ │ ├── commonFormFragments.graphql │ │ └── deserializeFormResponse.ts │ ├── MyProfile │ │ ├── MyProfileDisplay.tsx │ │ ├── MyProfileForm.tsx │ │ ├── queries.generated.ts │ │ └── queries.graphql │ ├── MyTicket │ │ ├── MyTicketDisplay.tsx │ │ ├── TicketPurchaseForm.tsx │ │ ├── TicketPurchasePage.tsx │ │ ├── queries.generated.ts │ │ └── queries.graphql │ ├── NavigationBar │ │ ├── AdminNavigationSection.tsx │ │ ├── EventsNavigationSection.tsx │ │ ├── GeneratedNavigationSection.tsx │ │ ├── MenuIcon.tsx │ │ ├── NavigationBarContext.ts │ │ ├── NavigationBrand.tsx │ │ ├── NavigationItem.tsx │ │ ├── NavigationSection.tsx │ │ ├── SearchNavigationItem.tsx │ │ ├── SiteSearch.tsx │ │ ├── TicketPurchaseNavigationItem.tsx │ │ ├── UserNavigationSection.tsx │ │ ├── htmlFetch.ts │ │ ├── index.tsx │ │ ├── siteSearchQueries.generated.ts │ │ ├── siteSearchQueries.graphql │ │ ├── useAutoCloseOnNavigate.ts │ │ └── useCollapse.ts │ ├── NotificationAdmin │ │ ├── NotificationAdminIndex.tsx │ │ ├── NotificationConfiguration.tsx │ │ ├── NotificationDestinationDescription.tsx │ │ ├── NotificationDestinationsConfig.tsx │ │ ├── getNotificationEventKey.tsx │ │ ├── mutations.generated.ts │ │ ├── mutations.graphql │ │ ├── preview.ts │ │ ├── queries.generated.ts │ │ └── queries.graphql │ ├── OAuth │ │ ├── $uid.ts │ │ ├── AuthorizationPrompt.tsx │ │ ├── AuthorizedApplications.tsx │ │ ├── PermissionsPrompt.tsx │ │ ├── mutations.generated.ts │ │ ├── mutations.graphql │ │ ├── queries.generated.ts │ │ └── queries.graphql │ ├── OAuthApplications │ │ └── index.tsx │ ├── OrganizationAdmin │ │ ├── $id │ │ │ └── roles │ │ │ │ └── $organizationRoleId │ │ │ │ └── route.ts │ │ ├── EditOrganizationRole.tsx │ │ ├── NewOrganizationRole.tsx │ │ ├── OrganizationDisplay.tsx │ │ ├── OrganizationIndex.tsx │ │ ├── index.tsx │ │ ├── loaders.ts │ │ ├── mutations.generated.ts │ │ ├── mutations.graphql │ │ ├── queries.generated.ts │ │ ├── queries.graphql │ │ └── useOrganizationRoleForm.tsx │ ├── OutletWithLoading.tsx │ ├── Permissions │ │ ├── PermissionCheckBox.tsx │ │ ├── PermissionUtils.ts │ │ ├── PermissionsListInput.tsx │ │ ├── PermissionsTableCell.tsx │ │ ├── PermissionsTableInput.tsx │ │ ├── fragments.generated.ts │ │ ├── fragments.graphql │ │ ├── usePermissionToggle.ts │ │ └── usePermissionsChangeSet.ts │ ├── PlainTextDisplay.tsx │ ├── RailsDirectUploadsContext.ts │ ├── RegistrationPolicy │ │ ├── NoPreferenceHelpPopover.tsx │ │ ├── PreventNoPreferenceSignupRow.tsx │ │ ├── RegistrationBucketRow.tsx │ │ ├── RegistrationPolicy.ts │ │ ├── RegistrationPolicyBucket.ts │ │ ├── RegistrationPolicyDisplay.tsx │ │ ├── RegistrationPolicyEditor.tsx │ │ ├── RegistrationPolicyPresetSelector.tsx │ │ ├── RegistrationPolicyPreview.tsx │ │ └── RegistrationPolicyUtils.ts │ ├── RenderingUtils.ts │ ├── Reports │ │ ├── AttendanceByPaymentAmount.tsx │ │ ├── EventProvidedTickets.tsx │ │ ├── EventsByChoice.tsx │ │ ├── SignupSpy.tsx │ │ ├── SignupSpyTable.tsx │ │ ├── index.tsx │ │ ├── queries.generated.ts │ │ └── queries.graphql │ ├── RoomsAdmin │ │ ├── $id │ │ │ └── route.ts │ │ ├── index.tsx │ │ ├── mutations.generated.ts │ │ ├── mutations.graphql │ │ ├── queries.generated.ts │ │ └── queries.graphql │ ├── RootSiteAdmin │ │ ├── EditRootSite.tsx │ │ ├── mutations.generated.ts │ │ ├── mutations.graphql │ │ ├── queries.generated.ts │ │ └── queries.graphql │ ├── RootSiteConventionsAdmin │ │ ├── ConventionDisplay.tsx │ │ ├── NewConventionModal.tsx │ │ ├── RootSiteConventionsAdminTable.tsx │ │ ├── clone.tsx │ │ ├── index.tsx │ │ ├── mutations.generated.ts │ │ ├── mutations.graphql │ │ ├── new.tsx │ │ ├── queries.generated.ts │ │ └── queries.graphql │ ├── RootSiteEmailRoutesAdmin │ │ ├── EditEmailRouteModal.tsx │ │ ├── EmailRouteForm.tsx │ │ ├── NewEmailRouteModal.tsx │ │ ├── buildEmailRouteInput.ts │ │ ├── index.tsx │ │ ├── mutations.generated.ts │ │ ├── mutations.graphql │ │ ├── queries.generated.ts │ │ └── queries.graphql │ ├── ScheduledValueUtils.ts │ ├── SignupModeration │ │ ├── CreateSignup.tsx │ │ ├── CreateSignupRunCard.tsx │ │ ├── RankedChoiceQueue.tsx │ │ ├── SignupModerationQueue.tsx │ │ ├── UserRankedChoiceQueue.tsx │ │ ├── index.tsx │ │ ├── mutations.generated.ts │ │ ├── mutations.graphql │ │ ├── queries.generated.ts │ │ ├── queries.graphql │ │ ├── signup_requests │ │ │ └── $id │ │ │ │ ├── accept.ts │ │ │ │ └── reject.ts │ │ └── signup_rounds │ │ │ └── $id │ │ │ └── rerun.ts │ ├── SignupRoundUtils.ts │ ├── SignupRoundsAdmin │ │ ├── $id.ts │ │ ├── CreateNewSignupRoundForm.tsx │ │ ├── MaximumEventSignupsInput.tsx │ │ ├── MaximumEventSignupsPreview.tsx │ │ ├── RankedChoiceSignupDecisionsPage.tsx │ │ ├── SignupRoundCard.tsx │ │ ├── SignupRoundScheduleTable.tsx │ │ ├── SignupRoundsAdminPage.tsx │ │ ├── buildSignupRoundInput.tsx │ │ ├── describeSignupRound.tsx │ │ ├── index.tsx │ │ ├── mutations.generated.ts │ │ ├── mutations.graphql │ │ ├── queries.generated.ts │ │ └── queries.graphql │ ├── SortableUtils.tsx │ ├── Spoiler.tsx │ ├── StaffPositionAdmin │ │ ├── $id │ │ │ └── route.ts │ │ ├── EditStaffPosition.tsx │ │ ├── EditStaffPositionPermissions.tsx │ │ ├── NewStaffPosition.tsx │ │ ├── StaffPositionForm.tsx │ │ ├── StaffPositionsTable.tsx │ │ ├── buildStaffPositionInput.ts │ │ ├── index.tsx │ │ ├── mutations.generated.ts │ │ ├── mutations.graphql │ │ ├── queries.generated.ts │ │ └── queries.graphql │ ├── Store │ │ ├── ApplyCouponControl.tsx │ │ ├── Cart │ │ │ ├── CartContents.tsx │ │ │ ├── coupon_applications │ │ │ │ ├── $id.ts │ │ │ │ └── route.ts │ │ │ ├── index.tsx │ │ │ ├── mutations.generated.ts │ │ │ ├── mutations.graphql │ │ │ ├── order_entries │ │ │ │ └── $id.ts │ │ │ ├── queries.generated.ts │ │ │ └── queries.graphql │ │ ├── CouponAdmin │ │ │ ├── CouponAdminTable.tsx │ │ │ ├── CouponForm.tsx │ │ │ ├── EditCouponModal.tsx │ │ │ ├── NewCouponModal.tsx │ │ │ ├── buildCouponInput.ts │ │ │ ├── mutations.generated.ts │ │ │ ├── mutations.graphql │ │ │ ├── queries.generated.ts │ │ │ └── queries.graphql │ │ ├── CurrencySelect.tsx │ │ ├── InPlaceMoneyEditor.tsx │ │ ├── MoneyInput.tsx │ │ ├── OrderAdmin │ │ │ ├── $id.tsx │ │ │ ├── AdminOrderEntriesTable.tsx │ │ │ ├── AdminOrderForm.tsx │ │ │ ├── EditOrderModal.tsx │ │ │ ├── NewOrderModal.tsx │ │ │ ├── cancel.ts │ │ │ ├── coupon_applications │ │ │ │ ├── $couponApplicationId.ts │ │ │ │ └── route.ts │ │ │ ├── index.tsx │ │ │ ├── mark_paid.ts │ │ │ ├── mutations.generated.ts │ │ │ ├── mutations.graphql │ │ │ ├── new.tsx │ │ │ ├── order_entries │ │ │ │ ├── $orderEntryId.ts │ │ │ │ └── route.ts │ │ │ ├── queries.generated.ts │ │ │ └── queries.graphql │ │ ├── OrderHistory.tsx │ │ ├── OrderPaymentModal.tsx │ │ ├── OrderSummary.tsx │ │ ├── ProductAdmin │ │ │ ├── $id.ts │ │ │ ├── AdminProductCard.tsx │ │ │ ├── AdminProductVariantDragOverlayDisplay.tsx │ │ │ ├── AdminProductVariantEditRow.tsx │ │ │ ├── AdminProductVariantsTable.tsx │ │ │ ├── EditAdminProductCard.tsx │ │ │ ├── EditPricingStructureModal.tsx │ │ │ ├── EditProductForm.tsx │ │ │ ├── EditingProductTypes.ts │ │ │ ├── PricingStructureForm.tsx │ │ │ ├── PricingStructureInput.tsx │ │ │ ├── index.tsx │ │ │ ├── mutations.generated.ts │ │ │ ├── mutations.graphql │ │ │ ├── queries.generated.ts │ │ │ └── queries.graphql │ │ ├── ProductOrderForm.tsx │ │ ├── ProductPage.tsx │ │ ├── StoreAdmin.tsx │ │ ├── adminProductFields.generated.ts │ │ ├── adminProductFields.graphql │ │ ├── buildMoneyInput.ts │ │ ├── buildProductInput.ts │ │ ├── couponFields.generated.ts │ │ ├── couponFields.graphql │ │ ├── describeCoupon.ts │ │ ├── describePricingStructure.tsx │ │ ├── mutations.generated.ts │ │ ├── mutations.graphql │ │ ├── orderFields.generated.ts │ │ ├── orderFields.graphql │ │ ├── pricingStructureFields.generated.ts │ │ ├── pricingStructureFields.graphql │ │ ├── queries.generated.ts │ │ ├── queries.graphql │ │ ├── sortProductVariants.ts │ │ └── useSubmitOrder.ts │ ├── Tables │ │ ├── ArrayToSentenceCell.tsx │ │ ├── BooleanCell.tsx │ │ ├── BooleanChoiceSetFilter.tsx │ │ ├── BucketChangeCell.tsx │ │ ├── CapacityCell.tsx │ │ ├── ChoiceSetFilter.tsx │ │ ├── ColumnSelector.tsx │ │ ├── DurationCell.tsx │ │ ├── EmailCell.tsx │ │ ├── EventCategoryCell.tsx │ │ ├── EventCategoryFilter.tsx │ │ ├── ExportButton.tsx │ │ ├── FilterUtils.ts │ │ ├── FreeTextFilter.tsx │ │ ├── HtmlCell.tsx │ │ ├── MoneyCell.tsx │ │ ├── ReactTableExportButtonWithColumnTransform.tsx │ │ ├── ReactTableWithTheWorks.tsx │ │ ├── SignupChangeActionFilter.tsx │ │ ├── SignupChangeCell.tsx │ │ ├── SignupChangesTableExportButton.tsx │ │ ├── SignupChoiceCell.tsx │ │ ├── SignupStateCell.tsx │ │ ├── TableHeader.tsx │ │ ├── TableUtils.ts │ │ ├── TimestampCell.tsx │ │ ├── UserConProfileWithGravatarCell.tsx │ │ ├── tables.module.css │ │ ├── useColumnSelection.tsx │ │ ├── useGraphQLReactTable.tsx │ │ ├── useLocalStorageReactTable.tsx │ │ ├── useReactRouterReactTable.tsx │ │ └── useReactTableWithTheWorks.tsx │ ├── TicketTypeAdmin │ │ ├── $id.ts │ │ ├── EditTicketProvidingProductModal.tsx │ │ ├── EditTicketType.tsx │ │ ├── NewTicketProvidingProductModal.tsx │ │ ├── NewTicketType.tsx │ │ ├── TicketTypeForm.tsx │ │ ├── TicketTypesList.tsx │ │ ├── buildTicketTypeInput.ts │ │ ├── loaders.tsx │ │ ├── mutations.generated.ts │ │ ├── mutations.graphql │ │ ├── queries.generated.ts │ │ ├── queries.graphql │ │ └── sortTicketTypes.ts │ ├── TimeUtils.ts │ ├── Timespan.ts │ ├── TimespanUtils.ts │ ├── UIComponents │ │ ├── AdminWarning.tsx │ │ ├── BlockPartial.tsx │ │ ├── BootstrapNavLink.tsx │ │ ├── CookieConsent.tsx │ │ ├── DropdownMenu.tsx │ │ ├── EmailList.tsx │ │ └── ScheduledValuePreview.tsx │ ├── URLUtils.ts │ ├── UserActivityAlerts │ │ ├── EditUserActivityAlert.tsx │ │ ├── NewUserActivityAlert.tsx │ │ ├── UserActivityAlertForm.tsx │ │ ├── UserActivityAlertsAdmin.tsx │ │ ├── UserActivityAlertsList.tsx │ │ ├── buildUserActivityAlertInput.ts │ │ ├── mutations.generated.ts │ │ ├── mutations.graphql │ │ ├── queries.generated.ts │ │ └── queries.graphql │ ├── UserConProfiles │ │ ├── AddAttendeeModal.tsx │ │ ├── AddOrderToTicketButton.tsx │ │ ├── AttendeesPage.tsx │ │ ├── ConvertToEventProvidedTicketModal.tsx │ │ ├── EditTicket.tsx │ │ ├── EditUserConProfile.tsx │ │ ├── NewTicket.tsx │ │ ├── TicketAdminSection.tsx │ │ ├── TicketForm.tsx │ │ ├── UserConProfileAdminDisplay.tsx │ │ ├── UserConProfileForm.tsx │ │ ├── UserConProfilesTable.tsx │ │ ├── buildFormStateFromData.ts │ │ ├── mutations.generated.ts │ │ ├── mutations.graphql │ │ ├── queries.generated.ts │ │ ├── queries.graphql │ │ └── userConProfileLoader.ts │ ├── Users │ │ ├── MergeUsersModal.tsx │ │ ├── MultiUserActionsDropdown.tsx │ │ ├── UserAdminDisplay.tsx │ │ ├── UsersAdmin.tsx │ │ ├── UsersTable.tsx │ │ ├── mutations.generated.ts │ │ ├── mutations.graphql │ │ ├── queries.generated.ts │ │ └── queries.graphql │ ├── appRootQueries.generated.ts │ ├── appRootQueries.graphql │ ├── checkAppEntrypointHeadersMatch.ts │ ├── describeMaximumEventSignupsValue.tsx │ ├── entrypoints │ │ └── application.js │ ├── enumTypes.json │ ├── formatMoney.ts │ ├── graphqlTypes.generated.ts │ ├── humanize.ts │ ├── images │ │ └── powered_by_stripe.svg │ ├── mountReactComponents.ts │ ├── packs │ │ ├── application.ts │ │ ├── applicationEntry.ts │ │ ├── applicationStyles.ts │ │ ├── components.ts │ │ └── setPublicPath.ts │ ├── parameterize.ts │ ├── parseCmsContent.ts │ ├── parsePageContent.tsx │ ├── parseResponseErrors.tsx │ ├── possibleTypes.json │ ├── printLezerTree.ts │ ├── scrollToLocationHash.ts │ ├── setupI18Next.ts │ ├── styles │ │ ├── _bootstrap_custom.scss │ │ ├── _bootstrap_defs.scss │ │ ├── _buckets.scss │ │ ├── _buckets_defs.scss │ │ ├── _color_variants.scss │ │ ├── _color_variants_defs.scss │ │ ├── _glow.scss │ │ ├── _print.scss │ │ ├── _signups.scss │ │ ├── _spin.scss │ │ ├── _tables.scss │ │ ├── _toast.scss │ │ ├── application.scss │ │ ├── bucket_availability_display.module.scss │ │ ├── bucket_availability_display.module.scss.d.ts │ │ ├── dev-mode-graphiql.scss │ │ ├── event_list.module.scss │ │ ├── event_list.module.scss.d.ts │ │ ├── event_ratings.module.scss │ │ ├── event_ratings.module.scss.d.ts │ │ ├── form_editor.module.scss │ │ ├── form_editor.module.scss.d.ts │ │ ├── liquid_docs.module.scss │ │ ├── liquid_docs.module.scss.d.ts │ │ ├── page_admin_dropdown.module.scss │ │ ├── page_admin_dropdown.module.scss.d.ts │ │ ├── run_capacity_graph.module.scss │ │ ├── run_capacity_graph.module.scss.d.ts │ │ ├── schedule_grid.module.scss │ │ ├── schedule_grid.module.scss.d.ts │ │ ├── scheduled_value_previews.module.scss │ │ ├── scheduled_value_previews.module.scss.d.ts │ │ ├── search.module.scss │ │ ├── search.module.scss.d.ts │ │ ├── spoiler.module.scss │ │ └── spoiler.module.scss.d.ts │ ├── useAsyncFunction.ts │ ├── useCachedLoadableValue.ts │ ├── useIntercodeApolloClient.ts │ ├── useNamedRouteMatch.tsx │ ├── usePageTitle.ts │ ├── useTimeout.ts │ ├── useValueUnless.ts │ └── useWhyDidYouUpdate.ts ├── jobs │ ├── application_job.rb │ ├── deliver_sms_job.rb │ ├── drop_expired_signups_job.rb │ ├── notify_event_changes_job.rb │ ├── notify_event_proposal_changes_job.rb │ ├── receive_sns_email_delivery_job.rb │ ├── remind_draft_event_proposals_job.rb │ ├── send_user_activity_alerts_job.rb │ ├── sync_email_forwarding_for_domain_job.rb │ └── sync_team_mailing_list_job.rb ├── liquid_drops │ ├── bucket_availability_drop.rb │ ├── convention_drop.rb │ ├── department_drop.rb │ ├── event_category_drop.rb │ ├── event_drop.rb │ ├── event_proposal_drop.rb │ ├── events_created_since_drop.rb │ ├── money │ │ └── currency_drop.rb │ ├── money_drop.rb │ ├── order_drop.rb │ ├── order_entry_drop.rb │ ├── organization_drop.rb │ ├── page_drop.rb │ ├── pay_what_you_want_value_drop.rb │ ├── pricing_structure_drop.rb │ ├── product_drop.rb │ ├── product_variant_drop.rb │ ├── registration_policy │ │ └── bucket_drop.rb │ ├── run_availability_drop.rb │ ├── run_drop.rb │ ├── runs_created_since_drop.rb │ ├── scheduled_value │ │ └── timespan_drop.rb │ ├── scheduled_value_drop.rb │ ├── signup_drop.rb │ ├── signup_move_result_drop.rb │ ├── signup_request_drop.rb │ ├── staff_position_drop.rb │ ├── ticket_drop.rb │ ├── ticket_type_drop.rb │ ├── timespan_with_value_drop.rb │ ├── user_con_profile_drop.rb │ └── user_drop.rb ├── mailers │ ├── .gitkeep │ ├── application_mailer.rb │ ├── notifications_mailer.rb │ └── user_mailer.rb ├── models │ ├── .gitkeep │ ├── active_model_coder.rb │ ├── ahoy │ │ ├── event.rb │ │ └── visit.rb │ ├── application_record.rb │ ├── assumed_identity_request_log.rb │ ├── assumed_identity_session.rb │ ├── cms_content_group.rb │ ├── cms_content_group_association.rb │ ├── cms_content_set.rb │ ├── cms_file.rb │ ├── cms_graphql_query.rb │ ├── cms_layout.rb │ ├── cms_navigation_item.rb │ ├── cms_partial.rb │ ├── cms_variable.rb │ ├── concerns │ │ ├── age_restrictions.rb │ │ ├── cms_references.rb │ │ ├── deprecated_ticket_api_compat.rb │ │ ├── event_email.rb │ │ ├── exclusive_arc.rb │ │ ├── form_response.rb │ │ ├── markdown_indexing.rb │ │ ├── names.rb │ │ └── order_by_title.rb │ ├── convention.rb │ ├── coupon.rb │ ├── coupon_application.rb │ ├── department.rb │ ├── deprecated_graph_ql_usage.rb │ ├── email_route.rb │ ├── event.rb │ ├── event_category.rb │ ├── event_proposal.rb │ ├── event_proposal │ │ └── timeblock_preference.rb │ ├── event_rating.rb │ ├── form.rb │ ├── form_item.rb │ ├── form_response_change.rb │ ├── form_section.rb │ ├── json_array_coder_wrapper.rb │ ├── maximum_event_provided_tickets_override.rb │ ├── money_coder.rb │ ├── notification_destination.rb │ ├── notification_template.rb │ ├── order.rb │ ├── order_entry.rb │ ├── organization.rb │ ├── organization_role.rb │ ├── page.rb │ ├── pay_what_you_want_value.rb │ ├── permission.rb │ ├── pricing_structure.rb │ ├── product.rb │ ├── product_variant.rb │ ├── ranked_choice_decision.rb │ ├── ranked_choice_user_constraint.rb │ ├── registration_policy.rb │ ├── registration_policy │ │ ├── bucket.rb │ │ └── error.rb │ ├── room.rb │ ├── root_site.rb │ ├── run.rb │ ├── scheduled_money_value.rb │ ├── search_result.rb │ ├── signup.rb │ ├── signup_change.rb │ ├── signup_ranked_choice.rb │ ├── signup_request.rb │ ├── signup_round.rb │ ├── staff_position.rb │ ├── team_member.rb │ ├── ticket.rb │ ├── ticket_type.rb │ ├── user.rb │ ├── user_activity_alert.rb │ └── user_con_profile.rb ├── notifiers │ ├── event_proposals │ │ ├── event_proposal_notifications_helper.rb │ │ ├── new_proposal_notifier.rb │ │ ├── proposal_submit_confirmation_notifier.rb │ │ ├── proposal_updated_notifier.rb │ │ └── unfinished_draft_reminder_notifier.rb │ ├── events │ │ └── event_updated_notifier.rb │ ├── notifier.rb │ ├── notifier │ │ ├── conditions.rb │ │ ├── dsl.rb │ │ └── dynamic_destinations.rb │ ├── notifier_preview_factory.rb │ ├── orders │ │ ├── cancelled_notifier.rb │ │ └── purchased_notifier.rb │ ├── signup_requests │ │ ├── new_signup_request_notifier.rb │ │ └── request_accepted_notifier.rb │ ├── signups │ │ ├── hold_expired_notifier.rb │ │ ├── new_signup_notifier.rb │ │ ├── registration_policy_change_moved_signups_notifier.rb │ │ ├── signup_confirmation_notifier.rb │ │ ├── user_signup_moved_notifier.rb │ │ ├── withdraw_confirmation_notifier.rb │ │ └── withdrawal_notifier.rb │ ├── tickets │ │ └── purchased_notifier.rb │ └── user_activity_alerts │ │ └── alert_notifier.rb ├── policies │ ├── application_policy.rb │ ├── authorization_info.rb │ ├── cms_content_group_policy.rb │ ├── cms_file_policy.rb │ ├── cms_graphql_query_policy.rb │ ├── cms_layout_policy.rb │ ├── cms_navigation_item_policy.rb │ ├── cms_partial_policy.rb │ ├── cms_variable_policy.rb │ ├── concerns │ │ └── cms_content_policy.rb │ ├── convention_policy.rb │ ├── coupon_application_policy.rb │ ├── coupon_policy.rb │ ├── department_policy.rb │ ├── doorkeeper │ │ └── application_policy.rb │ ├── email_route_policy.rb │ ├── event_category_policy.rb │ ├── event_policy.rb │ ├── event_proposal_policy.rb │ ├── event_rating_policy.rb │ ├── form_item_policy.rb │ ├── form_policy.rb │ ├── form_section_policy.rb │ ├── mailing_lists_policy.rb │ ├── maximum_event_provided_tickets_override_policy.rb │ ├── notification_template_policy.rb │ ├── order_entry_policy.rb │ ├── order_policy.rb │ ├── organization_policy.rb │ ├── organization_role_policy.rb │ ├── page_policy.rb │ ├── permission_policy.rb │ ├── product_policy.rb │ ├── queries │ │ ├── disjunctive_where.rb │ │ ├── nil_safe_cache.rb │ │ ├── oauth_scoped_disjunction.rb │ │ ├── permissions_query_manager.rb │ │ ├── query_manager.rb │ │ ├── schedule_release_query_manager.rb │ │ ├── signup_query_manager.rb │ │ ├── team_member_query_manager.rb │ │ └── user_con_profile_query_manager.rb │ ├── ranked_choice_decision_policy.rb │ ├── ranked_choice_user_constraint_policy.rb │ ├── room_policy.rb │ ├── root_site_policy.rb │ ├── run_policy.rb │ ├── signup_change_policy.rb │ ├── signup_policy.rb │ ├── signup_ranked_choice_policy.rb │ ├── signup_request_policy.rb │ ├── signup_round_policy.rb │ ├── staff_position_policy.rb │ ├── team_member_policy.rb │ ├── ticket_policy.rb │ ├── ticket_type_policy.rb │ ├── user_activity_alert_policy.rb │ ├── user_con_profile_policy.rb │ └── user_policy.rb ├── presenters │ ├── browser_warning_presenter.rb │ ├── cms_rendering_context.rb │ ├── compacting_form_response_changes_presenter.rb │ ├── concerns │ │ ├── form_markdown.rb │ │ └── sort_buckets.rb │ ├── contact_email.rb │ ├── convention_reports_presenter.rb │ ├── form_api_presenter.rb │ ├── form_export_presenter.rb │ ├── form_item_presenter.rb │ ├── form_response_change_group_presenter.rb │ ├── form_response_presenter.rb │ ├── graphql_presend_presenter.rb │ ├── liquid_assign_graphql_presenter.rb │ ├── mailing_lists_presenter.rb │ ├── markdown_presenter.rb │ ├── order_summary_presenter.rb │ ├── run_availability_presenter.rb │ ├── signup_count_presenter.rb │ ├── signup_options_presenter.rb │ └── tables │ │ ├── conventions_table_results_presenter.rb │ │ ├── coupons_table_results_presenter.rb │ │ ├── email_routes_table_results_presenter.rb │ │ ├── event_proposals_table_results_presenter.rb │ │ ├── events_table_results_presenter.rb │ │ ├── orders_table_results_presenter.rb │ │ ├── ranked_choice_decisions_table_results_presenter.rb │ │ ├── runs_table_results_presenter.rb │ │ ├── signup_changes_table_results_presenter.rb │ │ ├── signup_requests_table_results_presenter.rb │ │ ├── signups_table_results_presenter.rb │ │ ├── table_results_presenter.rb │ │ ├── user_con_profiles_table_results_presenter.rb │ │ └── users_table_results_presenter.rb ├── services │ ├── accept_event_proposal_service.rb │ ├── accept_signup_ranked_choice_service.rb │ ├── accept_signup_request_service.rb │ ├── autoscale_servers_service.rb │ ├── cancel_order_service.rb │ ├── cleanup_db_service.rb │ ├── clear_cms_content_service.rb │ ├── clone_convention_service.rb │ ├── cms_content_finder.rb │ ├── cms_content_loaders │ │ ├── base.rb │ │ ├── cms_files.rb │ │ ├── cms_graphql_queries.rb │ │ ├── cms_layouts.rb │ │ ├── cms_partials.rb │ │ ├── conflict_policies │ │ │ └── update.rb │ │ ├── conflict_policy.rb │ │ ├── forms.rb │ │ ├── notification_templates.rb │ │ └── pages.rb │ ├── cms_content_storage_adapters │ │ ├── base.rb │ │ ├── cms_files.rb │ │ ├── cms_graphql_queries.rb │ │ ├── cms_layouts.rb │ │ ├── cms_partials.rb │ │ ├── forms.rb │ │ ├── notification_templates.rb │ │ └── pages.rb │ ├── compact_form_response_changes_service.rb │ ├── concerns │ │ ├── convention_registration_freeze.rb │ │ ├── signup_count_limits.rb │ │ ├── skippable_advisory_lock.rb │ │ └── split_ticket_order.rb │ ├── connect_stripe_account_service.rb │ ├── content_cloners │ │ ├── cms_content_cloner.rb │ │ ├── content_cloner_base.rb │ │ ├── convention_cloner.rb │ │ ├── departments_cloner.rb │ │ ├── early_cms_content_cloner.rb │ │ ├── event_categories_cloner.rb │ │ ├── rooms_cloner.rb │ │ ├── signup_rounds_cloner.rb │ │ ├── staff_positions_cloner.rb │ │ ├── store_content_cloner.rb │ │ ├── ticket_types_cloner.rb │ │ └── user_activity_alerts_cloner.rb │ ├── create_signup_request_service.rb │ ├── create_team_member_service.rb │ ├── delete_ticket_service.rb │ ├── drop_event_service.rb │ ├── email_forwarding_router.rb │ ├── error_reporting.rb │ ├── event_change_registration_policy_service.rb │ ├── event_freeze_bucket_assignments_service.rb │ ├── event_signup_service.rb │ ├── event_vacancy_fill_service.rb │ ├── event_withdraw_service.rb │ ├── execute_ranked_choice_signup_round_service.rb │ ├── execute_ranked_choice_signup_service.rb │ ├── export_cms_content_set_service.rb │ ├── forward_email_via_ses_service.rb │ ├── hosting_service_adapters │ │ ├── base.rb │ │ ├── fly.rb │ │ ├── heroku.rb │ │ └── render.rb │ ├── import_form_content_service.rb │ ├── load_cms_content_set_service.rb │ ├── merge_users_service.rb │ ├── notify_form_response_changes_service.rb │ ├── overwrite_cms_content_service.rb │ ├── provide_event_ticket_service.rb │ ├── provide_order_entry_ticket_service.rb │ ├── receive_sns_email_delivery_service.rb │ ├── refresh_ssl_certificate_service.rb │ ├── remind_draft_event_proposals.rb │ ├── rerun_moderated_ranked_choice_signup_round_service.rb │ ├── restore_dropped_event_service.rb │ ├── run_notifications_service.rb │ ├── send_user_activity_alerts_service.rb │ ├── setup_user_con_profile_service.rb │ ├── signup_bucket_finder.rb │ ├── signup_move_result.rb │ ├── submit_order_service.rb │ ├── sync_forward_email_service.rb │ └── user_signup_constraints.rb └── views │ ├── doorkeeper │ ├── applications │ │ ├── _delete_form.html.erb │ │ ├── _form.html.erb │ │ ├── edit.html.erb │ │ ├── index.html.erb │ │ ├── new.html.erb │ │ └── show.html.erb │ ├── authorizations │ │ ├── error.html.erb │ │ └── show.html.erb │ └── authorized_applications │ │ ├── _delete_form.html.erb │ │ └── index.html.erb │ ├── graphiql │ └── show.html.erb │ ├── layouts │ ├── _head.html.erb │ ├── application.html.erb │ ├── doorkeeper │ │ ├── admin.html.erb │ │ └── application.html.erb │ ├── graphiql.html.erb │ ├── liquid_docs.html.erb │ ├── mailer.html.erb │ ├── mailer.text.erb │ └── print_reports.html.erb │ ├── notifications │ └── notification.html.erb │ ├── reports │ ├── _event_capacity.html.erb │ ├── _per_event_single.html.erb │ ├── _per_user_single.html.erb │ ├── events_by_time.html.erb │ ├── per_event.html.erb │ ├── per_room.html.erb │ ├── per_user.html.erb │ ├── single_user_printable.html.erb │ └── volunteer_events.html.erb │ └── user_mailer │ ├── confirmation_instructions.html.erb │ ├── reset_password_instructions.html.erb │ └── unlock_instructions.html.erb ├── bin ├── brakeman ├── bundle ├── dev ├── load_production_database ├── rails ├── rake ├── rubocop ├── setup ├── solargraph ├── solargraph-runtime ├── spring └── update ├── cloudflare ├── .dev.vars ├── intercode-email-forwarder.ts ├── tsconfig.json ├── worker-configuration.d.ts └── wrangler.jsonc ├── cms_content_sets ├── base │ ├── layouts │ │ └── Default.liquid │ ├── metadata.yml │ ├── notification_templates │ │ ├── event_proposals │ │ │ ├── new_proposal.liquid │ │ │ ├── proposal_submit_confirmation.liquid │ │ │ ├── proposal_updated.liquid │ │ │ └── unfinished_draft_reminder.liquid │ │ ├── events │ │ │ └── event_updated.liquid │ │ ├── orders │ │ │ ├── cancelled.liquid │ │ │ └── purchased.liquid │ │ ├── signup_requests │ │ │ ├── new_signup_request.liquid │ │ │ └── request_accepted.liquid │ │ ├── signups │ │ │ ├── hold_expired.liquid │ │ │ ├── new_signup.liquid │ │ │ ├── registration_policy_change_moved_signups.liquid │ │ │ ├── signup_confirmation.liquid │ │ │ ├── user_signup_moved.liquid │ │ │ ├── withdraw_confirmation.liquid │ │ │ └── withdrawal.liquid │ │ ├── tickets │ │ │ └── purchased.liquid │ │ └── user_activity_alerts │ │ │ └── alert.liquid │ └── partials │ │ ├── move_results_list.liquid │ │ ├── run_description.liquid │ │ └── signup_bucket_description.liquid ├── procon_import │ ├── forms │ │ ├── event_form.json │ │ ├── event_proposal_form.json │ │ ├── filler_event_form.json │ │ └── user_con_profile_form.json │ ├── layouts │ │ └── Default.liquid │ ├── metadata.yml │ └── partials │ │ ├── dates_card.liquid │ │ └── event_staff_card.liquid ├── rock_and_romance │ ├── layouts │ │ └── Default.liquid │ └── metadata.yml ├── single_event │ ├── forms │ │ ├── regular event form.json │ │ └── user_con_profile_form.json │ ├── layouts │ │ └── Default.liquid │ ├── metadata.yml │ ├── pages │ │ ├── conduct.liquid │ │ ├── root.liquid │ │ └── team-contact.liquid │ └── partials │ │ └── info_box.liquid ├── smoke_and_mirrors │ ├── files │ │ ├── All_Menus.pdf │ │ ├── CrownePlazaFloorplan.jpg │ │ ├── Indian_food_set.JPG │ │ ├── InterconFlyer.pdf │ │ ├── InterconSFacebook.jpg │ │ ├── crowneplaza.jpg │ │ └── neilSquare.png │ ├── layouts │ │ └── Intercon S Layout.liquid │ ├── metadata.yml │ ├── pages │ │ ├── About.liquid │ │ ├── Flyer.liquid │ │ ├── Volunteering.liquid │ │ ├── aboutintercon.liquid │ │ ├── aboutlarp.liquid │ │ ├── bios.liquid │ │ ├── buckets.liquid │ │ ├── calendar.liquid │ │ ├── comp-display.liquid │ │ ├── contacts.liquid │ │ ├── content-formatting.liquid │ │ ├── forum.liquid │ │ ├── forum │ │ │ └── propose.liquid │ │ ├── gmpolicies.liquid │ │ ├── hotel-menu.liquid │ │ ├── hotel.liquid │ │ ├── hotellayout.liquid │ │ ├── intercode2-presentation.liquid │ │ ├── irongm.liquid │ │ ├── larps.liquid │ │ ├── new-proposal.liquid │ │ ├── news.liquid │ │ ├── pricing.liquid │ │ ├── propcom.liquid │ │ ├── proposalfaq.liquid │ │ ├── proposalfollowup.liquid │ │ ├── role-descriptions.liquid │ │ ├── root.liquid │ │ ├── rules.liquid │ │ ├── signupfaq.liquid │ │ ├── social.liquid │ │ ├── social │ │ │ └── request.liquid │ │ ├── theme.liquid │ │ ├── whats-new-gms.liquid │ │ └── whats-new-player.liquid │ └── partials │ │ ├── 0-news.liquid │ │ ├── acceptingproposals.liquid │ │ ├── all-news.liquid │ │ ├── badgecheck.liquid │ │ ├── bio.liquid │ │ ├── conintro.liquid │ │ ├── copyright.liquid │ │ ├── google-analytics.liquid │ │ ├── gravatar80.liquid │ │ ├── new_events_list.liquid │ │ ├── proposal_date_info.liquid │ │ ├── proposal_form_registration_policy_instructions.liquid │ │ ├── proposals_intro.liquid │ │ ├── propose_early.liquid │ │ ├── runs_with_openings.liquid │ │ ├── signup_schedule.liquid │ │ ├── signup_text.liquid │ │ ├── site-css.liquid │ │ ├── user_event_proposals.liquid │ │ ├── user_resources.liquid │ │ ├── user_signups.liquid │ │ └── user_team_member_events.liquid ├── standard │ ├── forms │ │ ├── event_proposal_form.json │ │ ├── filler_event_form.json │ │ ├── regular_event_form.json │ │ ├── user_con_profile_form.json │ │ └── volunteer_event_form.json │ ├── graphql_queries │ │ └── getBioEligibleUserConProfiles.graphql │ ├── layouts │ │ └── Default.liquid │ ├── metadata.yml │ ├── pages │ │ ├── contacts.liquid │ │ ├── cost.liquid │ │ ├── new-proposal.liquid │ │ ├── root.liquid │ │ └── whos-who.liquid │ └── partials │ │ ├── news.liquid │ │ ├── runs_with_openings.liquid │ │ ├── user_event_proposals.liquid │ │ ├── user_signups.liquid │ │ └── user_team_member_events.liquid ├── the_last_seder │ ├── files │ │ └── 12-tls-logo-778.jpg │ ├── layouts │ │ └── Default.liquid │ ├── metadata.yml │ ├── pages │ │ ├── conduct.liquid │ │ ├── food.liquid │ │ ├── root.liquid │ │ └── team-contact.liquid │ └── partials │ │ └── info_box.liquid └── wanderlust │ ├── forms │ ├── Brainstorming session proposal form.json │ ├── Con Services Event Form.json │ ├── Filler event form.json │ ├── Forum event form.json │ ├── Larp event form.json │ ├── Larp proposal form.json │ ├── Moderated discussion proposal form.json │ ├── Panel proposal form.json │ ├── Presentation proposal form.json │ ├── Social Event Form.json │ ├── Social Event proposal form.json │ ├── User con profile form.json │ ├── Volunteer event form.json │ └── Workshop proposal form.json │ ├── graphql_queries │ ├── getBioEligibleUserConProfiles.graphql │ ├── getEventsByCategory.graphql │ └── getMeetups.graphql │ ├── layouts │ ├── Auto Refresh Blank Page.liquid │ └── Intercon W Layout.liquid │ ├── metadata.yml │ ├── notification_templates │ └── signups │ │ ├── new_signup.liquid │ │ └── signup_confirmation.liquid │ ├── pages │ ├── about.liquid │ ├── aboutintercon.liquid │ ├── aboutlarp.liquid │ ├── accessibility │ │ └── gm.liquid │ ├── acessibility.liquid │ ├── badgestore.liquid │ ├── beginners.liquid │ ├── bios.liquid │ ├── boardgames.liquid │ ├── buckets.liquid │ ├── calendar.liquid │ ├── comp-display-old.liquid │ ├── comp-display.liquid │ ├── conlogo.liquid │ ├── contacts.liquid │ ├── content-formatting.liquid │ ├── covid.liquid │ ├── flyer.liquid │ ├── food.liquid │ ├── food │ │ └── concessions.liquid │ ├── forum.liquid │ ├── forum │ │ └── propose.liquid │ ├── glossary.liquid │ ├── gmpolicies.liquid │ ├── hotel.liquid │ ├── hotel │ │ ├── faq.liquid │ │ ├── layout.liquid │ │ ├── menu.liquid │ │ └── renovation.liquid │ ├── intercode2-presentation.liquid │ ├── irongm.liquid │ ├── larps.liquid │ ├── nat-debugs-an-image-he-uploaded.liquid │ ├── new-proposal.liquid │ ├── news.liquid │ ├── open-roles.liquid │ ├── open-slots.liquid │ ├── pricing.liquid │ ├── propcom.liquid │ ├── proposalfaq.liquid │ ├── proposalfollowup.liquid │ ├── role-descriptions.liquid │ ├── root.liquid │ ├── rules.liquid │ ├── signupfaq.liquid │ ├── social.liquid │ ├── social │ │ └── request.liquid │ ├── statements │ │ ├── challenging-content.liquid │ │ └── queer-content.liquid │ ├── store-old.liquid │ ├── store.liquid │ ├── theme.liquid │ ├── times-wanted.liquid │ ├── vending-at-intercon.liquid │ ├── vendors-at-intercon.liquid │ ├── volunteering.liquid │ ├── whats-new-gms.liquid │ └── whats-new-player.liquid │ └── partials │ ├── 0-news.liquid │ ├── acceptingproposals.liquid │ ├── all-news.liquid │ ├── attendee_count.liquid │ ├── badgecheck.liquid │ ├── bio.liquid │ ├── boardgame_list.liquid │ ├── con_postponed_banner.liquid │ ├── conintro.liquid │ ├── copyright.liquid │ ├── countdown.liquid │ ├── discord_button.liquid │ ├── event_list_entry.liquid │ ├── forum_registration_policy_instructions.liquid │ ├── gravatar80.liquid │ ├── nat_image_debug.liquid │ ├── new_events_list.liquid │ ├── new_events_list_for_email.liquid │ ├── pre_schedule_text.liquid │ ├── proposal_date_info.liquid │ ├── proposal_form_registration_policy_instructions.liquid │ ├── proposals_intro.liquid │ ├── propose_early.liquid │ ├── run_availability_grid.liquid │ ├── runs_with_npc_slots.liquid │ ├── runs_with_openings.liquid │ ├── signup_schedule.liquid │ ├── signup_text.liquid │ ├── site-css.liquid │ ├── social_event_registration_policy_instructions.liquid │ ├── social_events.liquid │ ├── user_event_proposals.liquid │ ├── user_resources.liquid │ ├── user_signup.liquid │ ├── user_signup_list.liquid │ ├── user_team_member_events.liquid │ └── vax_check.liquid ├── codegen.yml ├── config.ru ├── config ├── application.rb ├── boot.rb ├── cable.yml ├── cloudwatch_schedule.rb ├── database.yml ├── environment.rb ├── environments │ ├── development.rb │ ├── production.rb │ ├── stage.rb │ └── test.rb ├── form_item_default_properties.json ├── form_types.json ├── inflections.json ├── initializers │ ├── active_record_log_subscriber.rb │ ├── active_storage.rb │ ├── ahoy.rb │ ├── application_controller_renderer.rb │ ├── assets.rb │ ├── backtrace_silencers.rb │ ├── business_time.rb │ ├── cadmus.rb │ ├── content_security_policy.rb │ ├── cookies_serializer.rb │ ├── date_formats.rb │ ├── devise.rb │ ├── doorkeeper.rb │ ├── doorkeeper_openid_connect.rb │ ├── filter_parameter_logging.rb │ ├── gc_auto_compact.rb │ ├── graphiql_rails.rb │ ├── graphql_debugging.rb │ ├── inflections.rb │ ├── json_logging.rb │ ├── liquid.rb │ ├── loofah.rb │ ├── mime_types.rb │ ├── money.rb │ ├── new_framework_defaults_7_2.rb │ ├── new_framework_defaults_8_0.rb │ ├── oj.rb │ ├── permissions_policy.rb │ ├── pg_search.rb │ ├── phonelib.rb │ ├── prevent_blank_recipients_interceptor.rb │ ├── rack_mini_profiler.rb │ ├── rack_profiler.rb │ ├── recaptcha.rb │ ├── rollbar.rb │ ├── secret_key_base.rb │ ├── sentry.rb │ ├── session_store.rb │ ├── shoryuken.rb │ ├── stripe.rb │ └── wrap_parameters.rb ├── locales │ ├── devise.en.yml │ ├── doorkeeper.en.yml │ ├── doorkeeper_openid_connect.en.yml │ └── en.yml ├── nocache-files.json ├── notifications.json ├── permission_names.json ├── puma.rb ├── routes.rb ├── schedule_grid_configs.json ├── secrets.yml ├── shoryuken.yml ├── sidekiq.yml ├── skylight.yml ├── spring.rb └── storage.yml ├── db ├── migrate │ ├── 000_create_active_storage_tables.active_storage.rb │ ├── 20120604131744_create_events.rb │ ├── 20120604142637_create_runs.rb │ ├── 20120604143822_devise_create_users.rb │ ├── 20120604200523_create_cons.rb │ ├── 20120604201100_scope_events_to_con.rb │ ├── 20120609181638_add_start_and_end_times_to_cons.rb │ ├── 20120616163017_create_pages.rb │ ├── 20120616164203_con_root_pages.rb │ ├── 20120616165151_add_name_to_cons.rb │ ├── 20120616165745_add_banner_image_to_cons.rb │ ├── 20120618132100_virtual_hosts_are_bad.rb │ ├── 20120727205929_create_user_con_profiles.rb │ ├── 20131023143926_rename_cons_to_conventions.rb │ ├── 20131227011316_subclass_events.rb │ ├── 20140112205637_create_team_members.rb │ ├── 20151003133150_remove_sti_from_events.rb │ ├── 20151031144823_create_signups.rb │ ├── 20151107232925_add_sessions_table.rb │ ├── 20151108010959_create_rooms.rb │ ├── 20151108011241_add_missing_foreign_keys.rb │ ├── 20151108020322_create_rooms_runs.rb │ ├── 20151108021933_add_user_id_to_signups.rb │ ├── 20151108041735_add_timezone_to_conventions.rb │ ├── 20151108133732_add_registration_policy_to_events.rb │ ├── 20151115201840_create_ticket_types.rb │ ├── 20151116213829_create_tickets.rb │ ├── 20151129142816_add_provided_by_event_to_tickets.rb │ ├── 20151129154850_remove_payment_columns_from_user_con_profiles.rb │ ├── 20160207182454_add_contact_info_to_user_con_profiles_too.rb │ ├── 20160207184126_remove_contact_info_from_users.rb │ ├── 20160207190435_link_team_members_to_user_con_profiles.rb │ ├── 20160310141909_add_legacy_password_md5_to_users.rb │ ├── 20160506223047_link_signups_to_user_con_profiles.rb │ ├── 20161112151816_add_maximum_event_signups_to_conventions.rb │ ├── 20161112202920_add_state_to_signups.rb │ ├── 20161112203319_add_counted_to_signups.rb │ ├── 20161113163044_add_requested_bucket_key_to_signups.rb │ ├── 20161127205353_add_registrations_frozen_to_conventions.rb │ ├── 20170208234244_create_cms_partials.rb │ ├── 20170219064321_remove_news_and_con_com_meetings_from_conventions.rb │ ├── 20170225162643_create_cms_files.rb │ ├── 20170521170228_rename_partial_fields_to_standard_names.rb │ ├── 20170521222419_rename_file_fields_to_standard_names.rb │ ├── 20170522175455_add_bio_to_user_con_profiles.rb │ ├── 20170526163733_add_show_nickname_in_bio_to_user_con_profiles.rb │ ├── 20170602200806_create_staff_positions.rb │ ├── 20170717141614_create_cms_navigation_items.rb │ ├── 20170721234402_create_forms.rb │ ├── 20170721234424_create_form_sections.rb │ ├── 20170721234716_create_form_items.rb │ ├── 20170721235511_scope_forms_to_conventions.rb │ ├── 20170724165907_create_event_proposals.rb │ ├── 20170724172123_add_event_proposal_form_to_conventions.rb │ ├── 20170829191902_add_admin_description_to_form_items.rb │ ├── 20170829204511_add_timeblock_preferences_to_event_proposals.rb │ ├── 20171014183340_add_default_status_for_events.rb │ ├── 20171014184727_add_participant_communications_to_events.rb │ ├── 20171014184903_remove_player_constraints_from_events.rb │ ├── 20171015182922_remove_notify_on_changes_from_events.rb │ ├── 20171018213324_rename_accepting_bids_to_accepting_proposals.rb │ ├── 20171021154612_remove_signups_allowed_from_conventions.rb │ ├── 20171029163258_add_maximum_tickets_to_conventions.rb │ ├── 20171029163343_add_publicly_available_and_counts_towards_convention_maximum_to_ticket_types.rb │ ├── 20171031202206_add_maximum_event_provided_tickets_to_ticket_types.rb │ ├── 20171111160337_create_cms_layouts.rb │ ├── 20171111160745_add_default_layout_to_conventions.rb │ ├── 20171111161320_add_cms_layout_to_pages.rb │ ├── 20171111234858_add_user_con_profile_form_to_conventions.rb │ ├── 20171112175130_change_address_to_single_field.rb │ ├── 20171112181739_add_additional_info_to_user_con_profiles.rb │ ├── 20171127182439_add_default_value_to_form_items.rb │ ├── 20171201155843_add_receive_whos_free_emails_to_user_con_profiles.rb │ ├── 20180122194924_add_gravatar_enabled_to_user_con_profiles.rb │ ├── 20180123225046_rename_bid_permissions.rb │ ├── 20180123225540_remove_precon_bids_allowed_from_conventions.rb │ ├── 20180130040510_create_maximum_event_provided_tickets_overrides.rb │ ├── 20180201184633_add_age_restrictions_and_content_warnings_to_events.rb │ ├── 20180204164156_relax_parent_constraints_on_cms_partials.rb │ ├── 20180204164355_fix_parent_indexes_on_cms_partials.rb │ ├── 20180207173614_add_admin_notes_to_cms_tables.rb │ ├── 20180209001048_create_event_proposal_changes.rb │ ├── 20180209005856_generalize_event_proposal_changes.rb │ ├── 20180209153345_add_ticket_name_to_conventions.rb │ ├── 20180209193547_index_notified_at_on_form_response_changes.rb │ ├── 20180212193535_remove_registrations_frozen_from_conventions.rb │ ├── 20180213195724_add_visible_to_staff_positions.rb │ ├── 20180216202555_add_allows_event_signups_to_ticket_types.rb │ ├── 20180220182000_add_event_form_to_conventions.rb │ ├── 20180301162045_add_additional_info_to_events.rb │ ├── 20180304162934_add_submitted_at_to_event_proposals.rb │ ├── 20180305002945_create_products.rb │ ├── 20180305003044_create_product_variants.rb │ ├── 20180305014004_create_orders.rb │ ├── 20180305014112_create_order_entries.rb │ ├── 20180312150839_add_timestamps_to_orders.rb │ ├── 20180403214703_create_cms_reference_join_tables.rb │ ├── 20180408151722_add_position_to_product_variants.rb │ ├── 20180502160657_make_can_play_concurrently_default_false.rb │ ├── 20180817153813_add_payment_options_to_products.rb │ ├── 20180820151612_create_doorkeeper_tables.rb │ ├── 20180826212515_remove_banner_image_from_conventions.rb │ ├── 20180922185941_add_admin_notes_to_event_proposals.rb │ ├── 20180922221147_add_admin_notes_to_events.rb │ ├── 20181010144914_add_reminded_at_to_event_proposals.rb │ ├── 20181011174128_create_user_activity_alerts.rb │ ├── 20181011174357_create_alert_destinations.rb │ ├── 20181015020539_add_event_mailing_list_domain_to_conventions.rb │ ├── 20181015021731_add_team_mailing_list_name_to_events.rb │ ├── 20181020012444_add_ical_secret_to_user_con_profiles.rb │ ├── 20181024143839_create_doorkeeper_openid_connect_tables.rb │ ├── 20181025162756_add_team_mailing_list_name_to_event_proposals.rb │ ├── 20181028182940_create_cms_variables.rb │ ├── 20181103145535_add_invariant_to_cms_partials.rb │ ├── 20181103150022_add_invariant_to_pages.rb │ ├── 20181103160827_create_cms_layout_reference_join_tables.rb │ ├── 20181108151904_add_private_signup_list_to_events.rb │ ├── 20181113145849_add_public_description_to_form_items.rb │ ├── 20181209164557_convert_receive_signup_email_to_string.rb │ ├── 20181216163057_create_cms_graphql_queries.rb │ ├── 20181217185216_switch_cms_variables_to_polymorphic_parent.rb │ ├── 20181217193826_create_root_sites.rb │ ├── 20181221201405_create_event_categories.rb │ ├── 20181222160432_remove_event_form_associations_from_conventions.rb │ ├── 20181227173933_create_permissions.rb │ ├── 20190116034950_add_needs_update_to_user_con_profiles.rb │ ├── 20190126155504_add_stripe_keys_to_conventions.rb │ ├── 20190127185603_add_clickwrap_agreement_to_conventions.rb │ ├── 20190127190135_add_accepted_clickwrap_agreement_to_user_con_profiles.rb │ ├── 20190127192813_add_skip_clickwrap_agreement_to_pages.rb │ ├── 20190208214318_add_show_event_list_to_conventions.rb │ ├── 20190209164632_create_organizations.rb │ ├── 20190209164652_add_organization_to_conventions.rb │ ├── 20190209164910_create_organization_roles.rb │ ├── 20190209165002_create_join_table_organization_roles_users.rb │ ├── 20190209165241_add_role_exclusive_arc_to_permissions.rb │ ├── 20190415164817_add_ticket_mode_to_conventions.rb │ ├── 20190419202156_add_legacy_password_sha1_to_users.rb │ ├── 20190420154557_un_hardcode_navbar_classes.rb │ ├── 20190422211940_add_admin_descriptions_for_user_con_profile_fields.rb │ ├── 20190502202300_unhardcode_registration_policy_presets.rb │ ├── 20190521212001_add_site_mode_to_conventions.rb │ ├── 20190601161948_add_signup_mode_to_conventions.rb │ ├── 20190605014656_create_signup_requests.rb │ ├── 20190622195919_add_signup_requests_open_to_conventions.rb │ ├── 20190711173547_add_convention_id_to_permissions.rb │ ├── 20190714174248_migrate_con_com_priv_to_staff_position.rb │ ├── 20190814120605_make_requested_bucket_key_nullable_for_signup_requests.rb │ ├── 20190815181731_migrate_scheduling_priv_to_staff_position.rb │ ├── 20190820154537_migrate_gm_liaison_priv_to_staff_position.rb │ ├── 20190821000035_migrate_outreach_priv_to_staff_position.rb │ ├── 20190821144208_migrate_mail_privs_to_staff_positions.rb │ ├── 20190821170923_migrate_staff_priv_to_staff_position.rb │ ├── 20190824154605_create_cms_content_groups.rb │ ├── 20190824155151_create_cms_content_group_associations.rb │ ├── 20190921202956_rename_age_restrictions_to_age_restrictions_description.rb │ ├── 20190921230626_grant_read_user_con_profile_birth_date.rb │ ├── 20190923155934_add_form_type_to_forms.rb │ ├── 20191001204405_add_title_vector_to_events.rb │ ├── 20191002003757_add_missing_event_category_colors.rb │ ├── 20191004200432_switch_to_simple_vector.rb │ ├── 20191010195351_add_foreign_key_constraint_to_active_storage_attachments_for_blob_id.active_storage.rb │ ├── 20191019225829_create_event_ratings.rb │ ├── 20191116152343_add_unaccent_extension.rb │ ├── 20191116152842_use_unaccent_for_title_vector.rb │ ├── 20191130174830_add_compacted_to_form_response_changes.rb │ ├── 20191205195033_create_notification_templates.rb │ ├── 20191215175849_load_new_notification_templates_and_partials.rb │ ├── 20191226202814_rename_alert_destinations_to_notification_destinations.rb │ ├── 20200121165316_add_body_sms_to_notification_templates.rb │ ├── 20200124155649_add_mobile_phone_to_user_con_profiles.rb │ ├── 20200125150313_add_allow_sms_to_user_con_profiles.rb │ ├── 20200128164623_create_departments.rb │ ├── 20200128165352_add_department_to_event_categories.rb │ ├── 20200128165503_add_proposal_description_to_event_categories.rb │ ├── 20200216221143_create_pg_search_documents.rb │ ├── 20200216222452_add_trigram_extension.rb │ ├── 20200216222934_add_content_vector_to_pg_search_documents.rb │ ├── 20200217182622_add_hidden_from_search.rb │ ├── 20200218010110_create_signup_changes.rb │ ├── 20200309152308_convert_all_serialized_columns_to_json_b.rb │ ├── 20200309160404_create_scheduled_value_functions.rb │ ├── 20200309201446_create_registration_policy_functions.rb │ ├── 20200312181248_create_email_routes.rb │ ├── 20200313042743_add_email_from_to_conventions.rb │ ├── 20200313212415_add_cc_addresses_and_email_aliases_to_staff_positions.rb │ ├── 20200314164542_add_catch_all_staff_position_and_email_mode_to_conventions.rb │ ├── 20200322234518_add_canceled_to_conventions.rb │ ├── 20200324163822_convert_price_to_pricing_structure_in_products_and_product_variants.rb │ ├── 20200328204324_add_provides_ticket_type_to_products.rb │ ├── 20200328214143_add_order_entry_id_to_tickets.rb │ ├── 20200408160310_create_ahoy_visits_and_events.rb │ ├── 20200411155258_create_coupons.rb │ ├── 20200411161111_create_coupon_applications.rb │ ├── 20200422160237_make_coupon_codes_case_insensitive_unique.rb │ ├── 20200515153931_canonicalize_convention_timezones.rb │ ├── 20200516164805_add_location_to_conventions.rb │ ├── 20200517155823_add_timezone_mode_to_conventions.rb │ ├── 20200601160341_add_hidden_to_conventions.rb │ ├── 20200712160144_add_language_to_conventions.rb │ ├── 20200807160757_make_ticket_type_name_not_nullable.rb │ ├── 20200830175919_make_event_title_non_nullable.rb │ ├── 20200930160120_remove_registrar_from_user_con_profiles.rb │ ├── 20201010180459_add_stripe_account_id_to_conventions.rb │ ├── 20201010181146_remove_stripe_keys_from_conventions.rb │ ├── 20201201184155_add_timespan_tsrange_to_runs.rb │ ├── 20210508172432_update_cms_content_to_bootstrap5_classes.rb │ ├── 20210530161658_update_user_signups_partials_by_content_hash.rb │ ├── 20210815202439_add_permission_fields_to_form_items.rb │ ├── 20210821174502_convert_icons_to_bootstrap.rb │ ├── 20210915155339_make_form_item_position_non_nullable.rb │ ├── 20211005145053_create_deprecated_graph_ql_usages.rb │ ├── 20211011191912_remove_caption_from_form_items_where_invalid.rb │ ├── 20211227171633_fix_nil_string_in_layout_types.rb │ ├── 20220102231745_add_open_graph_image_and_icon_image_to_conventions.rb │ ├── 20220109172815_create_assumed_identity_sessions.rb │ ├── 20220109173235_create_assumed_identity_request_logs.rb │ ├── 20220122172525_remove_file_from_cms_files.rb │ ├── 20220122174528_rename_active_storage_attachments.rb │ ├── 20220226170101_add_event_id_to_ticket_types.rb │ ├── 20220226170448_add_event_id_to_tickets.rb │ ├── 20220313171517_add_expires_at_to_signups.rb │ ├── 20220328152526_change_event_id_to_run_id_in_tickets.rb │ ├── 20220328155131_add_run_to_order_entries.rb │ ├── 20220418161949_add_hold_expired_notification_template.rb │ ├── 20220502182655_make_id_columns_bigints.rb │ ├── 20220503164309_add_primary_keys_on_join_tables.rb │ ├── 20220609161816_make_moar_id_columns_bigints.rb │ ├── 20220918173739_add_expose_in_to_form_items.rb │ ├── 20220924204825_fix_event_email_form_item_identifiers.rb │ ├── 20221120175702_add_event_ratings_foreign_keys.rb │ ├── 20230109012113_make_run_event_id_not_nullable.rb │ ├── 20230113184026_make_signup_run_id_not_nullable.rb │ ├── 20230113220828_make_event_convention_id_not_nullable.rb │ ├── 20230729164027_add_lottery_number_to_user_con_profiles.rb │ ├── 20230808164646_add_signup_and_withdraw_confirmation_templates.rb │ ├── 20231105161432_make_run_starts_at_non_nullable.rb │ ├── 20231126173530_add_service_name_to_active_storage_blobs.active_storage.rb │ ├── 20231126173531_create_active_storage_variant_records.active_storage.rb │ ├── 20231126173532_remove_not_null_on_active_storage_blobs_checksum.active_storage.rb │ ├── 20231126190837_add_ahoy5_index.rb │ ├── 20231130162442_update_all_cms_references.rb │ ├── 20231216024636_make_mepto_override_value_non_nullable.rb │ ├── 20240224192755_add_clickwrap_agreement_to_products.rb │ ├── 20240324173737_create_signup_ranked_choices.rb │ ├── 20240325174012_add_signup_automation_mode_to_conventions.rb │ ├── 20240331160734_add_default_currency_to_conventions.rb │ ├── 20240331173308_add_allowed_currency_codes_to_pay_what_you_want_prices.rb │ ├── 20240414172424_add_result_signup_request_to_signup_ranked_choice.rb │ ├── 20240417195945_add_unique_index_to_signup_ranked_choice_priority.rb │ ├── 20240427160255_create_ranked_choice_decisions.rb │ ├── 20240428174607_create_signup_rounds.rb │ ├── 20240504163701_add_ranked_choice_order_and_executed_at_to_signup_rounds.rb │ ├── 20240504165651_add_ranked_choice_allow_waitlist_to_user_con_profiles.rb │ ├── 20240505160246_create_ranked_choice_user_constraints.rb │ ├── 20240526181616_constrain_signup_round_maximum_event_signups_values.rb │ ├── 20240608175912_add_signup_round_to_ranked_choice_decisions.rb │ ├── 20240620014115_add_ranked_choice_ordering_boost_to_user_con_profiles.rb │ ├── 20240717150224_relax_ranked_choice_constraints.rb │ ├── 20240807155222_add_after_signup_ranked_choice_id_to_ranked_choice_decisions.rb │ ├── 20240916155847_add_disable_captcha_to_root_sites.rb │ ├── 20241031190016_convert_convention_locations_to_geo_json.rb │ ├── 20241111181051_update_signup_bucket_description_partials.rb │ ├── 20241111203124_update_event_updated_notification_headline.rb │ ├── 20241111212526_update_signup_bucket_description_partial_again.rb │ ├── 20250120173505_ensure_signup_rounds_on_all_conventions.rb │ ├── 20250202200327_add_prioritize_waitlist_to_signup_ranked_choices.rb │ ├── 20250203173940_add_meta_description_to_pages.rb │ ├── 20250324172627_enhance_notification_destinations_for_notification_templates.rb │ └── 20250324175507_add_default_destinations_to_existing_notification_templates.rb ├── seeds.rb └── structure.sql ├── doc-site ├── .gitignore ├── README.md ├── babel.config.js ├── blog │ ├── 2019-10-03-new-intercode-schedule-design │ │ ├── index.md │ │ ├── news_20191003_legend.png │ │ ├── news_20191003_popup.png │ │ └── news_20191003_run.png │ ├── 2020-01-27-sms-notifications.md │ ├── 2020-03-15-email-forwarding.md │ ├── 2022-01-18-graphql-cross-domain-security-issue-disclosure.md │ ├── 2022-12-02-database-export-security-disclosure.md │ ├── 2023-05-11-js-loading-strategy.md │ └── authors.yml ├── docs │ ├── concepts │ │ ├── content-management.md │ │ ├── conventions.md │ │ ├── events-and-runs.md │ │ ├── forms.md │ │ ├── gender-buckets.png │ │ ├── karaoke-buckets.png │ │ ├── no-preference-buckets.png │ │ ├── permissions.md │ │ ├── signups.mdx │ │ ├── store.md │ │ └── users-and-profiles.md │ └── intro.md ├── docusaurus.config.js ├── graphql-homepage.md ├── liquid-homepage.md ├── liquid-to-doc.js ├── liquid-variables.md ├── package.json ├── sidebars.js ├── src │ ├── components │ │ ├── HomepageFeatures.js │ │ └── HomepageFeatures.module.css │ ├── css │ │ └── custom.css │ └── pages │ │ ├── index.js │ │ └── index.module.css ├── static │ ├── .nojekyll │ └── img │ │ ├── docusaurus.png │ │ ├── favicon.ico │ │ ├── logo.svg │ │ ├── neilSquare.png │ │ ├── tutorial │ │ ├── docsVersionDropdown.png │ │ └── localeDropdown.png │ │ ├── undraw_docusaurus_mountain.svg │ │ ├── undraw_docusaurus_react.svg │ │ └── undraw_docusaurus_tree.svg └── tsconfig.json ├── doc └── README_FOR_APP ├── docker-compose.load_production_database.yml ├── docker-compose.test.yml ├── docker-compose.yml ├── eslint.config.mjs ├── fly.toml ├── globalDefines.mts ├── graphQLOperationsJSON.js ├── graphql.config.js ├── jest.config.js ├── lib ├── assets │ └── .gitkeep ├── devise │ └── strategies │ │ ├── legacy_md5_authenticatable.rb │ │ └── legacy_sha1_authenticatable.rb ├── intercode │ ├── disable_caching_for_specific_assets.rb │ ├── dynamic_cookie_domain.rb │ ├── import.rb │ ├── import │ │ ├── illyan.rb │ │ ├── illyan │ │ │ ├── importer.rb │ │ │ ├── password_migration.rb │ │ │ ├── table.rb │ │ │ ├── tables.rb │ │ │ └── tables │ │ │ │ └── people.rb │ │ ├── import_logger.rb │ │ ├── intercode1.rb │ │ ├── intercode1 │ │ │ ├── configuration.rb │ │ │ ├── date_helpers.rb │ │ │ ├── embedded_pdf_page.rb │ │ │ ├── form_importer.rb │ │ │ ├── html_content.rb │ │ │ ├── html_converter.rb │ │ │ ├── importer.rb │ │ │ ├── legacy_t_shirt_importer.rb │ │ │ ├── navigation_items.rb │ │ │ ├── php.rb │ │ │ ├── proposal_form_customizer.rb │ │ │ ├── registration_policy_factory.rb │ │ │ ├── registration_statuses.rb │ │ │ ├── staff_position_importer.rb │ │ │ ├── table.rb │ │ │ ├── tables.rb │ │ │ ├── tables │ │ │ │ ├── away.rb │ │ │ │ ├── bid_info.rb │ │ │ │ ├── bid_times.rb │ │ │ │ ├── bids.rb │ │ │ │ ├── bios.rb │ │ │ │ ├── con.rb │ │ │ │ ├── events.rb │ │ │ │ ├── gms.rb │ │ │ │ ├── pre_con_events.rb │ │ │ │ ├── pre_con_runs.rb │ │ │ │ ├── price_schedule.rb │ │ │ │ ├── rooms.rb │ │ │ │ ├── runs.rb │ │ │ │ ├── signup.rb │ │ │ │ ├── store_items.rb │ │ │ │ ├── store_order_entries.rb │ │ │ │ ├── store_orders.rb │ │ │ │ └── users.rb │ │ │ └── upload_file.rb │ │ ├── markdownifier.rb │ │ ├── procon.rb │ │ ├── procon │ │ │ ├── event_helpers.rb │ │ │ ├── importer.rb │ │ │ ├── table.rb │ │ │ ├── tables.rb │ │ │ ├── tables │ │ │ │ ├── attendances.rb │ │ │ │ ├── convention_staff_attendances.rb │ │ │ │ ├── conventions.rb │ │ │ │ ├── events.rb │ │ │ │ ├── people.rb │ │ │ │ └── proposed_events.rb │ │ │ └── user_helpers.rb │ │ └── table.rb │ ├── liquid │ │ ├── filters.rb │ │ ├── tags.rb │ │ └── tags │ │ │ ├── add_to_calendar_dropdown.rb │ │ │ ├── app_component_renderer.rb │ │ │ ├── assign_graphql_result.rb │ │ │ ├── cookie_consent.rb │ │ │ ├── event_admin_menu.rb │ │ │ ├── event_runs_section.rb │ │ │ ├── file_url_tag.rb │ │ │ ├── long_form_event_details.rb │ │ │ ├── map.rb │ │ │ ├── maximum_event_signups_preview.rb │ │ │ ├── new_event_proposal_button.rb │ │ │ ├── short_form_event_details.rb │ │ │ ├── spoiler.rb │ │ │ ├── withdraw_user_signup_button.rb │ │ │ └── youtube.rb │ └── virtual_host_constraint.rb └── tasks │ ├── .gitkeep │ ├── annotate_rb.rake │ ├── cache.rake │ ├── cleanup.rake │ ├── graphql.rake │ ├── import │ ├── illyan.rake │ ├── intercode1.rake │ └── procon.rake │ ├── refresh_certs.rake │ ├── release.rake │ ├── run_notifications.rake │ ├── sanitize_db.rake │ └── stage.rake ├── liquid_doc.json ├── locales ├── en.json └── es.json ├── log └── .gitkeep ├── nginx-assets.conf ├── package.json ├── postcss.config.cjs ├── public ├── .well-known │ └── apple-developer-merchantid-domain-association ├── 400.html ├── 403.html ├── 404.html ├── 406-unsupported-browser.html ├── 422.html ├── 500.html ├── favicon.ico ├── icon.png ├── icon.svg └── robots.txt ├── rds-global-bundle.pem ├── renovate.json ├── rollup.cliUtils.config.ts ├── schema.graphql ├── schema.json ├── script ├── buildGraphQLTypeData.js ├── buildTimezoneData.js ├── deduplicateTranslations.ts ├── diffTranslations.ts ├── genNginxNocache.js ├── mergeTranslations.ts ├── rails └── renderFormResponseChangeGroup.tsx ├── test ├── controllers │ ├── .gitkeep │ ├── authenticity_tokens_controller_test.rb │ ├── calendars_controller_test.rb │ ├── csv_exports_controller_test.rb │ ├── email_forwarders_controller_test.rb │ ├── graphiql_controller_test.rb │ ├── graphql_controller_test.rb │ ├── passwords_controller_test.rb │ ├── registrations_controller_test.rb │ ├── reports_controller_test.rb │ ├── single_page_app_controller_test.rb │ ├── sitemaps_controller_test.rb │ ├── sns_notifications_controller_test.rb │ ├── stripe_account_controller_test.rb │ ├── stripe_webhooks_controller_test.rb │ └── user_con_profiles_controller_test.rb ├── docker-ruby-test.sh ├── factories │ ├── cms_content_groups.rb │ ├── cms_files.rb │ ├── cms_graphql_queries.rb │ ├── cms_layouts.rb │ ├── cms_navigation_items.rb │ ├── cms_partials.rb │ ├── cms_variables.rb │ ├── conventions.rb │ ├── coupons.rb │ ├── doorkeeper_applications.rb │ ├── event_categories.rb │ ├── event_proposals.rb │ ├── event_ratings.rb │ ├── events.rb │ ├── forms.rb │ ├── maximum_event_provided_tickets_overrides.rb │ ├── order_entries.rb │ ├── orders.rb │ ├── organization_roles.rb │ ├── organizations.rb │ ├── pages.rb │ ├── permissions.rb │ ├── product_variant.rb │ ├── products.rb │ ├── ranked_choice_user_constraints.rb │ ├── rooms.rb │ ├── root_sites.rb │ ├── runs.rb │ ├── signup_ranked_choices.rb │ ├── signup_requests.rb │ ├── signup_rounds.rb │ ├── signups.rb │ ├── staff_positions.rb │ ├── team_members.rb │ ├── ticket_types.rb │ ├── tickets.rb │ ├── user_activity_alerts.rb │ ├── user_con_profiles.rb │ └── users.rb ├── files │ └── war_bond.png ├── graphql │ ├── intercode_schema_test.rb │ └── queries │ │ └── app_root_query_test.rb ├── helpers │ ├── events_helper_test.rb │ └── team_member_helper_test.rb ├── integration │ ├── .gitkeep │ └── notifications_integration_test.rb ├── javascript │ ├── BuiltInFormControls │ │ ├── ConventionDaySelect.test.tsx │ │ ├── GraphQLAsyncSelect.test.tsx │ │ ├── InPlaceEditor.test.tsx │ │ ├── ScheduledValueEditor.test.tsx │ │ ├── ScheduledValueTimespanRow.test.tsx │ │ ├── TimeSelect.test.tsx │ │ ├── TimezoneSelect.test.tsx │ │ ├── buildTestScheduledValueInput.tsx │ │ ├── graphQLAsyncSelect.queries.generated.ts │ │ └── graphQLAsyncSelect.queries.graphql │ ├── BuiltInForms │ │ └── EditEvent.test.tsx │ ├── ConventionAdmin │ │ └── ConventionForm.test.tsx │ ├── EventAdmin │ │ ├── formMockData.ts │ │ └── useEventForm.test.tsx │ ├── FormPresenter │ │ ├── Layouts │ │ │ └── FormBody.test.tsx │ │ └── useFormResponse.test.ts │ ├── RegistrationPolicy │ │ ├── RegistrationBucketRow.test.tsx │ │ ├── RegistrationPolicyEditor.test.tsx │ │ └── defaultPresets.ts │ ├── TicketTypeAdmin │ │ ├── TicketTypeForm.test.tsx │ │ └── __snapshots__ │ │ │ └── TicketTypeForm.test.tsx.snap │ ├── Timespan.test.ts │ ├── TimespanUtils.test.ts │ ├── formFromExportJSON.ts │ ├── setupTests.ts │ ├── tempPolyfills.js │ └── testUtils.tsx ├── jobs │ └── notify_event_proposal_changes_job_test.rb ├── liquid_drops │ ├── convention_drop_test.rb │ ├── event_drop_test.rb │ ├── run_drop_test.rb │ ├── signup_drop_test.rb │ ├── ticket_drop_test.rb │ ├── user_con_profile_drop_test.rb │ └── user_drop_test.rb ├── mailers │ ├── previews │ │ └── user_mailer_preview.rb │ └── user_mailer_test.rb ├── models │ ├── .gitkeep │ ├── cms_content_group_association_test.rb │ ├── cms_content_group_test.rb │ ├── cms_content_set_test.rb │ ├── cms_file_test.rb │ ├── cms_graphql_query_test.rb │ ├── cms_layout_test.rb │ ├── cms_navigation_item_test.rb │ ├── cms_partial_test.rb │ ├── cms_variable_test.rb │ ├── convention_test.rb │ ├── coupon_application_test.rb │ ├── coupon_test.rb │ ├── department_test.rb │ ├── email_route_test.rb │ ├── event_category_test.rb │ ├── event_proposal_test.rb │ ├── event_rating_test.rb │ ├── event_test.rb │ ├── form_item_test.rb │ ├── form_response_change_test.rb │ ├── form_section_test.rb │ ├── form_test.rb │ ├── helpers │ │ ├── cons_helper_test.rb │ │ └── pages_helper_test.rb │ ├── maximum_event_provided_tickets_override_test.rb │ ├── notification_destination_test.rb │ ├── notification_template_test.rb │ ├── order_entry_test.rb │ ├── order_test.rb │ ├── organization_role_test.rb │ ├── organization_test.rb │ ├── page_test.rb │ ├── permission_test.rb │ ├── product_test.rb │ ├── product_variant_test.rb │ ├── ranked_choice_user_constraint_test.rb │ ├── registration_policy │ │ └── unlimited_test.rb │ ├── registration_policy_test.rb │ ├── room_test.rb │ ├── root_site_test.rb │ ├── run_test.rb │ ├── signup_change_test.rb │ ├── signup_ranked_choice_test.rb │ ├── signup_request_test.rb │ ├── signup_round_test.rb │ ├── signup_test.rb │ ├── staff_position_test.rb │ ├── team_member_test.rb │ ├── ticket_test.rb │ ├── ticket_type_test.rb │ ├── user_activity_alert_test.rb │ ├── user_con_profile_test.rb │ └── user_test.rb ├── notifiers │ ├── event_proposals │ │ ├── new_proposal_notifier_test.rb │ │ └── proposal_submit_confirmation_notifier_test.rb │ └── user_activity_alerts │ │ └── alert_notifier_test.rb ├── policies │ ├── cms_content_policy_test.rb │ ├── convention_permissions_test_helper.rb │ ├── convention_policy_test.rb │ ├── doorkeeper │ │ └── application_policy_test.rb │ ├── event_category_policy_test.rb │ ├── event_policy_test.rb │ ├── event_proposal_policy_test.rb │ ├── event_rating_policy_test.rb │ ├── form_policy_test.rb │ ├── mailing_lists_policy_test.rb │ ├── maximum_event_provided_tickets_override_policy_test.rb │ ├── order_entry_policy_test.rb │ ├── order_policy_test.rb │ ├── organization_policy_test.rb │ ├── organization_role_policy_test.rb │ ├── organization_role_test_helper.rb │ ├── permission_policy_test.rb │ ├── product_policy_test.rb │ ├── room_policy_test.rb │ ├── root_site_policy_test.rb │ ├── run_policy_test.rb │ ├── signup_policy_test.rb │ ├── signup_request_policy_test.rb │ ├── staff_position_policy_test.rb │ ├── team_member_policy_test.rb │ ├── ticket_policy_test.rb │ ├── ticket_type_policy_test.rb │ ├── user_activity_alert_policy_test.rb │ ├── user_con_profile_policy_test.rb │ └── user_policy_test.rb ├── services │ ├── accept_event_proposal_service_test.rb │ ├── clear_cms_content_service_test.rb │ ├── clone_convention_service_test.rb │ ├── cms_content_storage_adapters │ │ ├── cms_layouts_test.rb │ │ ├── cms_partials_test.rb │ │ └── pages_test.rb │ ├── create_signup_request_service_test.rb │ ├── create_team_member_service_test.rb │ ├── event_change_registration_policy_service_test.rb │ ├── event_freeze_bucket_assignments_service_test.rb │ ├── event_signup_service_test.rb │ ├── event_vacancy_fill_service_test.rb │ ├── event_withdraw_service_test.rb │ ├── execute_ranked_choice_signup_round_service_test.rb │ ├── execute_ranked_choice_signup_service_test.rb │ ├── load_cms_content_set_service_test.rb │ ├── merge_users_service_test.rb │ ├── provide_event_ticket_service_test.rb │ └── submit_order_service_test.rb └── test_helper.rb ├── tsconfig.json ├── typed-scss-modules.config.ts ├── vendor └── assets │ ├── javascripts │ └── .gitkeep │ └── stylesheets │ └── .gitkeep ├── vite.config.mts ├── vitest.config.mts ├── wait-for-it.sh ├── workspaceConfiguration └── LoadTerminal.json └── yarn.lock /.browserslistrc: -------------------------------------------------------------------------------- 1 | Chrome 63 2 | Safari 12 3 | Firefox 60 4 | Opera 50 5 | Edge 18 6 | -------------------------------------------------------------------------------- /.husky/.gitignore: -------------------------------------------------------------------------------- 1 | _ 2 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | yarn run lint-staged 5 | -------------------------------------------------------------------------------- /.node-version: -------------------------------------------------------------------------------- 1 | 22.15.0 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | *.generated.ts 2 | -------------------------------------------------------------------------------- /.prettierrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | printWidth: 120, 3 | singleQuote: true, 4 | trailingComma: 'all', 5 | }; 6 | -------------------------------------------------------------------------------- /.profile.d/heroku-exec.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | [ -z "$SSH_CLIENT" ] && source <(curl --fail --retry 3 -sSL "$HEROKU_EXEC_URL") 3 | -------------------------------------------------------------------------------- /.ruby-version: -------------------------------------------------------------------------------- 1 | 3.4.3 2 | -------------------------------------------------------------------------------- /.solargraph.yml: -------------------------------------------------------------------------------- 1 | --- 2 | include: 3 | - "**/*.rb" 4 | exclude: 5 | - vendor/**/* 6 | - ".bundle/**/*" 7 | require: [] 8 | domains: [] 9 | reporters: 10 | - rubocop 11 | - require_not_found 12 | require_paths: 13 | - test 14 | max_files: 5000 15 | plugins: 16 | - solargraph-rails 17 | -------------------------------------------------------------------------------- /.swcrc: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/swcrc", 3 | "jsc": { 4 | "baseUrl": "./app/javascript", 5 | "parser": { 6 | "syntax": "typescript", 7 | // "jsx": true, 8 | "dynamicImport": true 9 | }, 10 | "transform": { 11 | "react": { 12 | "runtime": "automatic" 13 | } 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /.whitesource: -------------------------------------------------------------------------------- 1 | { 2 | "scanSettings": { 3 | "baseBranches": [] 4 | }, 5 | "checkRunSettings": { 6 | "vulnerableCheckRunConclusionLevel": "success", 7 | "displayMode": "diff" 8 | }, 9 | "issueSettings": { 10 | "minSeverityLevel": "LOW", 11 | "issueType": "DEPENDENCY" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /.yarn/sdks/integrations.yml: -------------------------------------------------------------------------------- 1 | # This file is automatically generated by @yarnpkg/sdks. 2 | # Manual changes might be lost! 3 | 4 | integrations: 5 | - vscode 6 | -------------------------------------------------------------------------------- /.yarn/sdks/prettier/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "prettier", 3 | "version": "3.4.2-sdk", 4 | "main": "./index.cjs", 5 | "type": "commonjs", 6 | "bin": "./bin/prettier.cjs" 7 | } 8 | -------------------------------------------------------------------------------- /.yarn/sdks/typescript/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "typescript", 3 | "version": "5.7.2-sdk", 4 | "main": "./lib/typescript.js", 5 | "type": "commonjs", 6 | "bin": { 7 | "tsc": "./bin/tsc", 8 | "tsserver": "./bin/tsserver" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env rake 2 | # Add your own tasks in files placed in lib/tasks ending in .rake, 3 | # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. 4 | 5 | require File.expand_path('../config/application', __FILE__) 6 | 7 | Intercode::Application.load_tasks 8 | 9 | Doorkeeper::Rake.load_tasks 10 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Reporting a Vulnerability 4 | 5 | To report a vulnerability in Intercode, please email webmaster@interactiveliterature.org. We'll reply to acknowledge the vulnerability and let you know any updates. 6 | -------------------------------------------------------------------------------- /__mocks__/fileMock.js: -------------------------------------------------------------------------------- 1 | module.exports = 'test-file-stub'; 2 | -------------------------------------------------------------------------------- /__mocks__/popper.js.js: -------------------------------------------------------------------------------- 1 | import PopperJs from 'popper.js'; 2 | 3 | // this avoids promise rejections because of Popper depending on createRange, which is not 4 | // available in jsdom 5 | 6 | export default class Popper { 7 | static placements = PopperJs.placements; 8 | 9 | constructor() { 10 | return { 11 | destroy: () => {}, 12 | scheduleUpdate: () => {}, 13 | }; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /__mocks__/styleMock.js: -------------------------------------------------------------------------------- 1 | module.exports = {}; 2 | -------------------------------------------------------------------------------- /app/assets/config/manifest.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/app/assets/config/manifest.js -------------------------------------------------------------------------------- /app/controllers/graphiql_controller.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class GraphiqlController < ApplicationController 3 | def show; end 4 | end 5 | -------------------------------------------------------------------------------- /app/controllers/health_controller.rb: -------------------------------------------------------------------------------- 1 | class HealthController < ApplicationController 2 | def healthz 3 | head :ok 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/controllers/json_failure_app.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class JSONFailureApp < Devise::FailureApp 3 | # never redirect 4 | def respond 5 | http_auth 6 | response.content_type = 'application/json' 7 | end 8 | 9 | def http_auth_body 10 | { error: i18n_message }.to_json 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /app/controllers/single_page_app_controller.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class SinglePageAppController < ApplicationController 3 | include CmsContentHelpers 4 | 5 | def root 6 | @page = current_cms_page(request.path) 7 | @event = event_for_path(request.path) 8 | @page_title = @page&.name 9 | 10 | render html: '', layout: 'application' 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /app/graphql/money_helper.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | module MoneyHelper 3 | def self.coerce_money_input(input) 4 | return nil unless input 5 | 6 | input = input.to_h.symbolize_keys 7 | Money.new(input[:fractional], input[:currency_code]) 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /app/graphql/mutations/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/app/graphql/mutations/.keep -------------------------------------------------------------------------------- /app/graphql/mutations/accept_clickwrap_agreement.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Mutations::AcceptClickwrapAgreement < Mutations::BaseMutation 3 | field :my_profile, Types::UserConProfileType, null: false 4 | 5 | def resolve 6 | user_con_profile.update!(accepted_clickwrap_agreement: true) 7 | { my_profile: user_con_profile } 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /app/graphql/mutations/create_page.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Mutations::CreatePage < Mutations::BaseMutation 3 | field :page, Types::PageType, null: false 4 | 5 | argument :page, Types::PageInputType, required: true 6 | 7 | authorize_create_cms_model :pages 8 | 9 | def resolve(**args) 10 | page = cms_parent.pages.create!(args[:page].to_h) 11 | 12 | { page: } 13 | end 14 | end 15 | -------------------------------------------------------------------------------- /app/graphql/mutations/create_room.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Mutations::CreateRoom < Mutations::BaseMutation 3 | field :room, Types::RoomType, null: false 4 | 5 | argument :room, Types::RoomInputType, required: true 6 | authorize_create_convention_associated_model :rooms 7 | 8 | def resolve(**args) 9 | room = convention.rooms.create!(args[:room].to_h) 10 | 11 | { room: } 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /app/graphql/mutations/delete_cms_layout.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Mutations::DeleteCmsLayout < Mutations::BaseMutation 3 | field :cms_layout, Types::CmsLayoutType, null: false 4 | 5 | argument :id, ID, required: false 6 | 7 | load_and_authorize_cms_model :cms_layouts, :id, :destroy 8 | 9 | def resolve(**_args) 10 | cms_layout.destroy! 11 | { cms_layout: } 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /app/graphql/mutations/delete_cms_partial.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Mutations::DeleteCmsPartial < Mutations::BaseMutation 3 | field :cms_partial, Types::CmsPartialType, null: false 4 | 5 | argument :id, ID, required: false 6 | 7 | load_and_authorize_cms_model :cms_partials, :id, :destroy 8 | 9 | def resolve(**_args) 10 | cms_partial.destroy! 11 | { cms_partial: } 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /app/graphql/mutations/delete_coupon.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Mutations::DeleteCoupon < Mutations::BaseMutation 3 | field :coupon, Types::CouponType, null: false 4 | 5 | argument :id, ID, required: false 6 | 7 | load_and_authorize_convention_associated_model :coupons, :id, :destroy 8 | 9 | def resolve(**_args) 10 | coupon.destroy! 11 | { coupon: } 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /app/graphql/mutations/delete_email_route.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Mutations::DeleteEmailRoute < Mutations::BaseMutation 3 | field :email_route, Types::EmailRouteType, null: false 4 | 5 | argument :id, ID, required: false 6 | 7 | load_and_authorize_model_with_id EmailRoute, :id, :destroy 8 | 9 | def resolve(**_args) 10 | email_route.destroy! 11 | 12 | { email_route: } 13 | end 14 | end 15 | -------------------------------------------------------------------------------- /app/graphql/mutations/delete_form.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Mutations::DeleteForm < Mutations::BaseMutation 3 | field :form, Types::FormType, null: false, camelize: false 4 | 5 | argument :id, ID, required: false 6 | 7 | load_and_authorize_convention_associated_model :forms, :id, :destroy 8 | 9 | def resolve(**_args) 10 | form.destroy! 11 | { form: } 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /app/graphql/mutations/delete_order_entry.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Mutations::DeleteOrderEntry < Mutations::BaseMutation 3 | field :order_entry, Types::OrderEntryType, null: false 4 | 5 | argument :id, ID, required: false 6 | 7 | load_and_authorize_model_with_id OrderEntry, :id, :update 8 | 9 | def resolve(**_args) 10 | order_entry.destroy! 11 | { order_entry: } 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /app/graphql/mutations/delete_organization_role.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Mutations::DeleteOrganizationRole < Mutations::BaseMutation 3 | argument :id, ID, required: false 4 | 5 | load_and_authorize_model_with_id OrganizationRole, :id, :destroy 6 | 7 | def resolve(*, id:) 8 | organization_role.destroy! 9 | {} 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /app/graphql/mutations/delete_page.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Mutations::DeletePage < Mutations::BaseMutation 3 | field :page, Types::PageType, null: false 4 | 5 | argument :id, ID, required: false 6 | 7 | load_and_authorize_cms_model :pages, :id, :destroy 8 | 9 | def resolve(**_args) 10 | page.destroy! 11 | { page: } 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /app/graphql/mutations/delete_room.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Mutations::DeleteRoom < Mutations::BaseMutation 3 | field :room, Types::RoomType, null: false 4 | 5 | argument :id, ID, required: false 6 | 7 | load_and_authorize_convention_associated_model :rooms, :id, :destroy 8 | 9 | def resolve(**_args) 10 | room.destroy! 11 | { room: } 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /app/graphql/mutations/delete_run.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Mutations::DeleteRun < Mutations::BaseMutation 3 | field :run, Types::RunType, null: false 4 | 5 | argument :id, ID, required: false 6 | 7 | load_and_authorize_model_with_id Run, :id, :destroy 8 | 9 | def resolve(**_args) 10 | run.destroy! 11 | { run: } 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /app/graphql/mutations/delete_team_member.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Mutations::DeleteTeamMember < Mutations::BaseMutation 3 | field :team_member, Types::TeamMemberType, null: false 4 | 5 | argument :id, ID, required: false 6 | 7 | load_and_authorize_model_with_id TeamMember, :id, :destroy 8 | 9 | def resolve(**_args) 10 | team_member.destroy! 11 | { team_member: } 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /app/graphql/mutations/drop_event.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Mutations::DropEvent < Mutations::BaseMutation 3 | field :event, Types::EventType, null: false 4 | 5 | argument :id, ID, required: false 6 | 7 | load_and_authorize_convention_associated_model :events, :id, :drop 8 | 9 | def resolve(**_args) 10 | DropEventService.new(event:).call! 11 | { event: } 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /app/graphql/sources/order_summary.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Sources::OrderSummary < GraphQL::Dataloader::Source 3 | def fetch(keys) 4 | OrderSummaryPresenter.preload_associations(keys) 5 | keys.map { |user_con_profile| OrderSummaryPresenter.new(user_con_profile:).order_summary } 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /app/graphql/sources/signup_count.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Sources::SignupCount < GraphQL::Dataloader::Source 3 | def fetch(keys) 4 | presenters_by_run_id = SignupCountPresenter.for_runs(keys) 5 | keys.map { |run| presenters_by_run_id[run.id] } 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /app/graphql/types/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/app/graphql/types/.keep -------------------------------------------------------------------------------- /app/graphql/types/authorized_application_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::AuthorizedApplicationType < Types::BaseObject 3 | field :name, String, null: false 4 | field :scopes, [String], null: false 5 | field :uid, ID, null: false 6 | 7 | def scopes 8 | object.scopes.to_a 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /app/graphql/types/base_enum.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::BaseEnum < GraphQL::Schema::Enum 3 | end 4 | -------------------------------------------------------------------------------- /app/graphql/types/base_input_object.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::BaseInputObject < GraphQL::Schema::InputObject 3 | end 4 | -------------------------------------------------------------------------------- /app/graphql/types/base_interface.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | module Types::BaseInterface 3 | include GraphQL::Schema::Interface 4 | end 5 | -------------------------------------------------------------------------------- /app/graphql/types/base_scalar.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::BaseScalar < GraphQL::Schema::Scalar 3 | end 4 | -------------------------------------------------------------------------------- /app/graphql/types/base_union.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::BaseUnion < GraphQL::Schema::Union 3 | end 4 | -------------------------------------------------------------------------------- /app/graphql/types/big_decimal_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::BigDecimalType < Types::BaseScalar 3 | def self.coerce_input(input_value, _context) 4 | return nil if input_value.nil? 5 | BigDecimal(input_value.to_s) 6 | end 7 | 8 | def self.coerce_result(ruby_value, _context) 9 | ruby_value&.to_s("F") 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /app/graphql/types/choice_count_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::ChoiceCountType < Types::BaseObject 3 | field :choice, Integer, null: false 4 | field :count, Integer, null: false 5 | field :state, Types::SignupStateType, null: false 6 | end 7 | -------------------------------------------------------------------------------- /app/graphql/types/cms_content_group_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::CmsContentGroupInputType < Types::BaseInputObject 3 | argument :contents, [Types::CmsContentInputType], required: false 4 | argument :name, String, required: false 5 | end 6 | -------------------------------------------------------------------------------- /app/graphql/types/cms_content_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::CmsContentInputType < Types::BaseInputObject 3 | argument :content_type, Types::CmsContentTypeIndicator, required: true, camelize: false 4 | argument :id, ID, required: false 5 | end 6 | -------------------------------------------------------------------------------- /app/graphql/types/cms_content_type_indicator.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::CmsContentTypeIndicator < Types::BaseEnum 3 | Types::CmsContentType.possible_types.each { |possible_type| value possible_type.graphql_name } 4 | end 5 | -------------------------------------------------------------------------------- /app/graphql/types/cms_graphql_query_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::CmsGraphqlQueryInputType < Types::BaseInputObject 3 | argument :admin_notes, String, required: false, camelize: false 4 | argument :identifier, String, required: false 5 | argument :query, String, required: false 6 | end 7 | -------------------------------------------------------------------------------- /app/graphql/types/cms_layout_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::CmsLayoutInputType < Types::BaseInputObject 3 | argument :admin_notes, String, required: false, camelize: false 4 | argument :content, String, required: false 5 | argument :name, String, required: false 6 | argument :navbar_classes, String, required: false, camelize: false 7 | end 8 | -------------------------------------------------------------------------------- /app/graphql/types/cms_navigation_item_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::CmsNavigationItemInputType < Types::BaseInputObject 3 | argument :navigation_section_id, ID, required: false, camelize: true 4 | argument :page_id, ID, required: false, camelize: true 5 | argument :position, Integer, required: false 6 | argument :title, String, required: false 7 | end 8 | -------------------------------------------------------------------------------- /app/graphql/types/cms_partial_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::CmsPartialInputType < Types::BaseInputObject 3 | argument :admin_notes, String, required: false, camelize: false 4 | argument :content, String, required: false 5 | argument :name, String, required: false 6 | end 7 | -------------------------------------------------------------------------------- /app/graphql/types/cms_variable_input.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::CmsVariableInput < Types::BaseInputObject 3 | argument :key, String, required: true 4 | argument :value_json, String, required: true, camelize: false 5 | end 6 | -------------------------------------------------------------------------------- /app/graphql/types/contact_email_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::ContactEmailType < Types::BaseObject 3 | field :email, String, null: false 4 | field :formatted_address, String, null: false 5 | field :metadata_json, Types::JSON, null: false, method: :metadata 6 | field :name, String, null: true 7 | end 8 | -------------------------------------------------------------------------------- /app/graphql/types/convention_filters_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::ConventionFiltersInputType < Types::BaseInputObject 3 | argument :name, String, required: false 4 | argument :organization_name, String, required: false, camelize: false 5 | end 6 | -------------------------------------------------------------------------------- /app/graphql/types/conventions_pagination_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::ConventionsPaginationType < Types::PaginationType 3 | entries_field Types::ConventionType 4 | end 5 | -------------------------------------------------------------------------------- /app/graphql/types/coupon_application_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::CouponApplicationType < Types::BaseObject 3 | field :coupon, Types::CouponType, null: false 4 | field :discount, Types::MoneyType, null: false 5 | field :id, ID, null: false 6 | field :order, Types::OrderType, null: false 7 | 8 | association_loaders CouponApplication, :coupon, :order 9 | end 10 | -------------------------------------------------------------------------------- /app/graphql/types/coupon_filters_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::CouponFiltersInputType < Types::BaseInputObject 3 | argument :code, String, required: false 4 | end 5 | -------------------------------------------------------------------------------- /app/graphql/types/coupons_pagination_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::CouponsPaginationType < Types::PaginationType 3 | entries_field Types::CouponType 4 | end 5 | -------------------------------------------------------------------------------- /app/graphql/types/date_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::DateType < Types::BaseScalar 3 | description "Date in ISO8601 format" 4 | 5 | def self.coerce_input(value, _ctx) 6 | return nil if value.nil? 7 | DateTime.iso8601(value) 8 | end 9 | 10 | def self.coerce_result(value, _ctx) 11 | value&.iso8601 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /app/graphql/types/department_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::DepartmentInputType < Types::BaseInputObject 3 | argument :name, String, required: false 4 | argument :proposal_description, String, required: false, camelize: false 5 | end 6 | -------------------------------------------------------------------------------- /app/graphql/types/department_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::DepartmentType < Types::BaseObject 3 | field :event_categories, [Types::EventCategoryType], null: false 4 | field :id, ID, null: false 5 | field :name, String, null: false 6 | field :proposal_description, String, null: true 7 | 8 | association_loaders Department, :event_categories 9 | end 10 | -------------------------------------------------------------------------------- /app/graphql/types/email_mode_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::EmailModeType < Types::BaseEnum 3 | value("forward", "Forward received emails to staff positions as configured") 4 | value("staff_emails_to_catch_all", "Forward all received staff emails to catch-all staff position") 5 | end 6 | -------------------------------------------------------------------------------- /app/graphql/types/email_route_filters_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::EmailRouteFiltersInputType < Types::BaseInputObject 3 | argument :forward_addresses, String, required: false, camelize: false 4 | argument :receiver_address, String, required: false, camelize: false 5 | end 6 | -------------------------------------------------------------------------------- /app/graphql/types/email_route_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::EmailRouteInputType < Types::BaseInputObject 3 | argument :forward_addresses, [String], required: false, camelize: false 4 | argument :receiver_address, String, required: false, camelize: false 5 | end 6 | -------------------------------------------------------------------------------- /app/graphql/types/email_route_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::EmailRouteType < Types::BaseObject 3 | field :forward_addresses, [String], null: true 4 | field :id, ID, null: false 5 | field :receiver_address, String, null: false 6 | end 7 | -------------------------------------------------------------------------------- /app/graphql/types/email_routes_pagination_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::EmailRoutesPaginationType < Types::PaginationType 3 | entries_field Types::EmailRouteType 4 | end 5 | -------------------------------------------------------------------------------- /app/graphql/types/event_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::EventInputType < Types::BaseInputObject 3 | argument :add_image_blob_ids, [ID], required: false, camelize: true 4 | argument :event_category_id, ID, required: false, camelize: true 5 | argument :form_response_attrs_json, String, required: false, camelize: false 6 | argument :remove_image_blob_ids, [ID], required: false, camelize: true 7 | end 8 | -------------------------------------------------------------------------------- /app/graphql/types/event_proposal_filters_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::EventProposalFiltersInputType < Types::BaseInputObject 3 | argument :event_category, [Integer, { null: true }], required: false, camelize: false 4 | argument :owner, String, required: false 5 | argument :status, [String, { null: true }], required: false 6 | argument :title, String, required: false 7 | end 8 | -------------------------------------------------------------------------------- /app/graphql/types/event_proposal_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::EventProposalInputType < Types::BaseInputObject 3 | argument :add_image_blob_ids, [ID], required: false, camelize: true 4 | argument :form_response_attrs_json, String, required: false, camelize: false 5 | argument :remove_image_blob_ids, [ID], required: false, camelize: true 6 | end 7 | -------------------------------------------------------------------------------- /app/graphql/types/event_proposals_pagination_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::EventProposalsPaginationType < Types::PaginationType 3 | entries_field Types::EventProposalType 4 | 5 | def self.authorized?(_value, context) 6 | Pundit.policy(context[:pundit_user], context[:convention]).view_event_proposals? 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /app/graphql/types/event_provided_ticket_list_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::EventProvidedTicketListType < Types::BaseObject 3 | field :provided_by_event, Types::EventType, null: false 4 | field :tickets, [Types::TicketType], null: false 5 | end 6 | -------------------------------------------------------------------------------- /app/graphql/types/event_with_choice_counts_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::EventWithChoiceCountsType < Types::BaseObject 3 | field :choice_counts, [Types::ChoiceCountType], null: false 4 | field :event, Types::EventType, null: false 5 | end 6 | -------------------------------------------------------------------------------- /app/graphql/types/events_pagination_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::EventsPaginationType < Types::PaginationType 3 | entries_field Types::EventType 4 | end 5 | -------------------------------------------------------------------------------- /app/graphql/types/form_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::FormInputType < Types::BaseInputObject 3 | argument :title, String, required: false 4 | end 5 | -------------------------------------------------------------------------------- /app/graphql/types/form_item_expose_in_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::FormItemExposeInType < Types::BaseEnum 3 | FormItem::EXPOSE_IN_VALUES.each { |possible_value| value possible_value } 4 | end 5 | -------------------------------------------------------------------------------- /app/graphql/types/form_item_role_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::FormItemRoleType < Types::BaseEnum 3 | FormItem::ROLE_VALUES.each { |possible_value| value possible_value } 4 | end 5 | -------------------------------------------------------------------------------- /app/graphql/types/form_section_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::FormSectionInputType < Types::BaseInputObject 3 | argument :title, String, required: false 4 | end 5 | -------------------------------------------------------------------------------- /app/graphql/types/form_type_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::FormTypeType < Types::BaseEnum 3 | Form::FORM_TYPE_CONFIG.each { |key, config| value key, config["description"].capitalize } 4 | end 5 | -------------------------------------------------------------------------------- /app/graphql/types/grouped_signup_count_type.rb: -------------------------------------------------------------------------------- 1 | class Types::GroupedSignupCountType < Types::BaseObject 2 | field :bucket_key, String, null: true 3 | field :count, Integer, null: false 4 | field :counted, Boolean, null: false 5 | field :requested_bucket_key, String, null: true 6 | field :state, Types::SignupStateType, null: false 7 | field :team_member, Boolean, null: false 8 | end 9 | -------------------------------------------------------------------------------- /app/graphql/types/liquid_assign.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::LiquidAssign < Types::BaseObject 3 | field :cms_variable_value_json, String, null: true, camelize: false 4 | field :drop_class_name, String, null: false, camelize: false 5 | field :name, String, null: false 6 | end 7 | -------------------------------------------------------------------------------- /app/graphql/types/mailing_lists_result_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::MailingListsResultType < Types::BaseObject 3 | field :emails, [Types::ContactEmailType], null: false 4 | field :metadata_fields, [String], null: false 5 | end 6 | -------------------------------------------------------------------------------- /app/graphql/types/mailing_lists_waitlists_result_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::MailingListsWaitlistsResultType < Types::BaseObject 3 | field :emails, [Types::ContactEmailType], null: false 4 | field :metadata_fields, [String], null: false 5 | field :run, Types::RunType, null: false 6 | end 7 | -------------------------------------------------------------------------------- /app/graphql/types/money_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::MoneyInputType < Types::BaseInputObject 3 | argument :currency_code, String, required: true, camelize: false 4 | argument :fractional, Integer, required: true 5 | end 6 | -------------------------------------------------------------------------------- /app/graphql/types/money_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::MoneyType < Types::BaseObject 3 | field :currency_code, String, null: false 4 | field :fractional, Integer, null: false 5 | 6 | def currency_code 7 | object.currency.iso_code 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /app/graphql/types/notification_event_key.rb: -------------------------------------------------------------------------------- 1 | class Types::NotificationEventKey < Types::BaseEnum 2 | description <<~MARKDOWN 3 | An event that can trigger a notification. 4 | MARKDOWN 5 | 6 | Notifier::NOTIFIER_CLASSES_BY_EVENT_KEY.each_key { |event_key| value event_key.tr("/", "_").upcase, value: event_key } 7 | end 8 | -------------------------------------------------------------------------------- /app/graphql/types/notification_source_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::NotificationSourceType < Types::BaseUnion 3 | possible_types Types::UserActivityAlertType 4 | 5 | def self.resolve_type(object, _context) 6 | case object 7 | when UserActivityAlert 8 | Types::UserActivityAlertType 9 | end 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /app/graphql/types/notification_template_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::NotificationTemplateInputType < Types::BaseInputObject 3 | argument :body_html, String, required: false, camelize: false 4 | argument :body_sms, String, required: false, camelize: false 5 | argument :body_text, String, required: false, camelize: false 6 | argument :subject, String, required: false, camelize: false 7 | end 8 | -------------------------------------------------------------------------------- /app/graphql/types/order_filters_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::OrderFiltersInputType < Types::BaseInputObject 3 | argument :id, ID, required: false, camelize: false 4 | argument :status, [String], required: false 5 | argument :user_name, String, required: false, camelize: false 6 | end 7 | -------------------------------------------------------------------------------- /app/graphql/types/order_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::OrderInputType < Types::BaseInputObject 3 | argument :payment_amount, Types::MoneyInputType, required: false, camelize: false 4 | argument :payment_note, String, required: false, camelize: false 5 | end 6 | -------------------------------------------------------------------------------- /app/graphql/types/order_quantity_by_status_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::OrderQuantityByStatusType < Types::BaseObject 3 | field :quantity, Integer, null: false 4 | field :status, String, null: false 5 | end 6 | -------------------------------------------------------------------------------- /app/graphql/types/order_status_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::OrderStatusType < Types::BaseEnum 3 | value("pending", "Order has not yet been submitted") 4 | value("unpaid", "Order is submitted but not yet paid") 5 | value("paid", "Order has been submitted and paid") 6 | value("cancelled", "Order has been cancelled") 7 | end 8 | -------------------------------------------------------------------------------- /app/graphql/types/orders_connection_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::OrdersConnectionType < GraphQL::Types::Relay::BaseConnection 3 | edge_type Types::OrderType.edge_type 4 | field :total_count, Integer, null: false 5 | 6 | def total_count 7 | object.nodes.count 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /app/graphql/types/orders_pagination_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::OrdersPaginationType < Types::PaginationType 3 | entries_field Types::OrderType 4 | end 5 | -------------------------------------------------------------------------------- /app/graphql/types/organization_role_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::OrganizationRoleInputType < Types::BaseInputObject 3 | argument :name, String, required: false 4 | end 5 | -------------------------------------------------------------------------------- /app/graphql/types/pagination_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::PaginationType < Types::BaseObject 3 | implements Types::PaginationInterface 4 | 5 | def self.entries_field(entry_type) 6 | field :entries, [entry_type], null: false 7 | 8 | define_method :entries do 9 | object.to_a 10 | end 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /app/graphql/types/pay_what_you_want_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::PayWhatYouWantInputType < Types::BaseInputObject 3 | argument :allowed_currency_codes, [String], required: false 4 | argument :maximum_amount, Types::MoneyInputType, required: false 5 | argument :minimum_amount, Types::MoneyInputType, required: false 6 | argument :suggested_amount, Types::MoneyInputType, required: false 7 | end 8 | -------------------------------------------------------------------------------- /app/graphql/types/pay_what_you_want_value_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::PayWhatYouWantValueType < Types::BaseObject 3 | field :allowed_currency_codes, [String], null: true 4 | field :maximum_amount, Types::MoneyType, null: true 5 | field :minimum_amount, Types::MoneyType, null: true 6 | field :suggested_amount, Types::MoneyType, null: true 7 | end 8 | -------------------------------------------------------------------------------- /app/graphql/types/payment_mode_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::PaymentModeType < Types::BaseEnum 3 | description "How should an order be paid for?" 4 | 5 | value("now", deprecation_reason: "Please use payment_intent instead") 6 | value("later") 7 | value("free") 8 | value("payment_intent") 9 | end 10 | -------------------------------------------------------------------------------- /app/graphql/types/permission_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::PermissionType < Types::BaseObject 3 | field :id, ID, null: false 4 | field :model, Types::PermissionedModelType, null: false 5 | field :permission, String, null: false 6 | field :role, Types::PermissionedRoleType, null: false 7 | end 8 | -------------------------------------------------------------------------------- /app/graphql/types/permissioned_model_type_indicator.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::PermissionedModelTypeIndicator < Types::BaseEnum 3 | Types::PermissionedModelType.possible_types.each { |possible_type| value possible_type.graphql_name } 4 | end 5 | -------------------------------------------------------------------------------- /app/graphql/types/permissioned_role_type_indicator.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::PermissionedRoleTypeIndicator < Types::BaseEnum 3 | Types::PermissionedRoleType.possible_types.each { |possible_type| value possible_type.graphql_name } 4 | end 5 | -------------------------------------------------------------------------------- /app/graphql/types/pricing_strategy_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::PricingStrategyType < Types::BaseEnum 3 | value("fixed", "Fixed price") 4 | value("scheduled_value", "Price that changes over time") 5 | value("pay_what_you_want", "Pay-what-you-want price") 6 | end 7 | -------------------------------------------------------------------------------- /app/graphql/types/ranked_choice_decisions_pagination_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::RankedChoiceDecisionsPaginationType < Types::PaginationType 3 | description "A paginated table of RankedChoiceDecisions." 4 | 5 | entries_field Types::RankedChoiceDecisionType 6 | end 7 | -------------------------------------------------------------------------------- /app/graphql/types/receive_signup_email_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::ReceiveSignupEmailType < Types::BaseEnum 3 | value "ALL_SIGNUPS", "Receive email for all signup activity" 4 | value "NON_WAITLIST_SIGNUPS", "Receive email for signup activity affecting confirmed signups" 5 | value "NO", "Do not receive signup email" 6 | end 7 | -------------------------------------------------------------------------------- /app/graphql/types/refund_status_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::RefundStatusType < Types::BaseEnum 3 | value "NOT_REFUNDED", "No refund was attempted" 4 | value "REFUNDED", "A refund was successfully provided" 5 | value "ALREADY_REFUNDED", "A refund was requested, but the charge had already been refunded" 6 | end 7 | -------------------------------------------------------------------------------- /app/graphql/types/registration_policy_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::RegistrationPolicyInputType < Types::BaseInputObject 3 | argument :buckets, [Types::RegistrationPolicyBucketInputType], required: false 4 | argument :prevent_no_preference_signups, Boolean, required: false, camelize: false 5 | end 6 | -------------------------------------------------------------------------------- /app/graphql/types/room_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::RoomInputType < Types::BaseInputObject 3 | argument :name, String, required: false 4 | end 5 | -------------------------------------------------------------------------------- /app/graphql/types/room_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::RoomType < Types::BaseObject 3 | field :id, ID, null: false 4 | field :name, String, null: true 5 | field :runs, [Types::RunType], null: false 6 | 7 | association_loaders Room, :runs 8 | end 9 | -------------------------------------------------------------------------------- /app/graphql/types/root_site_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::RootSiteInputType < Types::BaseInputObject 3 | argument :default_layout_id, ID, required: false, camelize: true 4 | argument :root_page_id, ID, required: false, camelize: true 5 | argument :site_name, String, required: false, camelize: false 6 | end 7 | -------------------------------------------------------------------------------- /app/graphql/types/root_site_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::RootSiteType < Types::BaseObject 3 | implements Types::CmsParent 4 | include CmsParentImplementation 5 | 6 | field :host, String, null: false 7 | field :id, ID, null: false 8 | field :site_name, String, null: false, camelize: false 9 | field :url, String, null: false 10 | 11 | def id 12 | "singleton" 13 | end 14 | end 15 | -------------------------------------------------------------------------------- /app/graphql/types/run_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::RunInputType < Types::BaseInputObject 3 | argument :room_ids, [ID], required: false, camelize: true 4 | argument :schedule_note, String, required: false, camelize: false 5 | argument :starts_at, Types::DateType, required: false, camelize: false 6 | argument :title_suffix, String, required: false, camelize: false 7 | end 8 | -------------------------------------------------------------------------------- /app/graphql/types/runs_pagination_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::RunsPaginationType < Types::PaginationType 3 | entries_field Types::RunType 4 | end 5 | -------------------------------------------------------------------------------- /app/graphql/types/scheduled_money_value_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::ScheduledMoneyValueInputType < Types::BaseInputObject 3 | argument :timespans, [Types::TimespanWithMoneyValueInputType], required: true 4 | end 5 | -------------------------------------------------------------------------------- /app/graphql/types/scheduled_money_value_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::ScheduledMoneyValueType < Types::BaseObject 3 | field :timespans, [Types::TimespanWithMoneyValueType], null: false 4 | end 5 | -------------------------------------------------------------------------------- /app/graphql/types/scheduled_value_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::ScheduledValueInputType < Types::BaseInputObject 3 | argument :timespans, [Types::TimespanWithValueInputType], required: true 4 | end 5 | -------------------------------------------------------------------------------- /app/graphql/types/scheduled_value_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::ScheduledValueType < Types::BaseObject 3 | field :timespans, [Types::TimespanWithValueType], null: false 4 | end 5 | -------------------------------------------------------------------------------- /app/graphql/types/scheduling_ui_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::SchedulingUiType < Types::BaseEnum 3 | EventCategory::SCHEDULING_UIS.each { |scheduling_ui| value(scheduling_ui) } 4 | end 5 | -------------------------------------------------------------------------------- /app/graphql/types/search_result_entry_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::SearchResultEntryType < Types::BaseObject 3 | field :highlight, String, null: true 4 | field :model, Types::SearchableModelType, null: false 5 | field :rank, Float, null: false 6 | field :title, String, null: true 7 | end 8 | -------------------------------------------------------------------------------- /app/graphql/types/search_result_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::SearchResultType < Types::BaseObject 3 | field :entries, [Types::SearchResultEntryType], null: false 4 | field :total_entries, Int, null: false 5 | end 6 | -------------------------------------------------------------------------------- /app/graphql/types/show_schedule_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::ShowScheduleType < Types::BaseEnum 3 | value("no") 4 | value("priv") 5 | value("gms") 6 | value("yes") 7 | end 8 | -------------------------------------------------------------------------------- /app/graphql/types/signup_change_filters_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::SignupChangeFiltersInputType < Types::BaseInputObject 3 | argument :action, [String], required: false 4 | argument :event_title, String, required: false, camelize: false 5 | argument :name, String, required: false 6 | end 7 | -------------------------------------------------------------------------------- /app/graphql/types/signup_changes_pagination_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::SignupChangesPaginationType < Types::PaginationType 3 | entries_field Types::SignupChangeType 4 | end 5 | -------------------------------------------------------------------------------- /app/graphql/types/signup_count_by_state_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::SignupCountByStateType < Types::BaseObject 3 | field :count, Int, null: false 4 | field :state, Types::SignupStateType, null: false 5 | end 6 | -------------------------------------------------------------------------------- /app/graphql/types/signup_filters_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::SignupFiltersInputType < Types::BaseInputObject 3 | argument :bucket, [String], required: false 4 | argument :email, String, required: false 5 | argument :name, String, required: false 6 | argument :state, [String], required: false 7 | end 8 | -------------------------------------------------------------------------------- /app/graphql/types/signup_mode_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::SignupModeType < Types::BaseEnum 3 | value("self_service", "Attendees can sign themselves up for events") 4 | value("moderated", "Attendees can request signups and signup changes but con staff must approve them") 5 | end 6 | -------------------------------------------------------------------------------- /app/graphql/types/signup_request_filters_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::SignupRequestFiltersInputType < Types::BaseInputObject 3 | argument :state, [Types::SignupRequestStateType], required: false 4 | end 5 | -------------------------------------------------------------------------------- /app/graphql/types/signup_requests_pagination_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::SignupRequestsPaginationType < Types::PaginationType 3 | entries_field Types::SignupRequestType 4 | end 5 | -------------------------------------------------------------------------------- /app/graphql/types/signups_pagination_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::SignupsPaginationType < Types::PaginationType 3 | entries_field Types::SignupType 4 | end 5 | -------------------------------------------------------------------------------- /app/graphql/types/site_mode_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::SiteModeType < Types::BaseEnum 3 | value("convention", "Site behaves as a convention with multiple events") 4 | value("single_event", "Site behaves as a single standalone event") 5 | value("event_series", "Site behaves as a series of standalone events") 6 | end 7 | -------------------------------------------------------------------------------- /app/graphql/types/ticket_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::TicketInputType < Types::BaseInputObject 3 | argument :provided_by_event_id, ID, required: false, camelize: true 4 | argument :ticket_type_id, ID, required: false, camelize: true 5 | end 6 | -------------------------------------------------------------------------------- /app/graphql/types/ticket_mode_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::TicketModeType < Types::BaseEnum 3 | value("disabled", "Tickets are neither sold nor required in this convention") 4 | value("required_for_signup", "A valid ticket is required to sign up for events in this convention") 5 | value("ticket_per_event", "Each event in this convention sells tickets separately") 6 | end 7 | -------------------------------------------------------------------------------- /app/graphql/types/ticket_type_parent_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::TicketTypeParentType < Types::BaseUnion 3 | possible_types Types::ConventionType, Types::EventType 4 | 5 | def self.resolve_type(object, _context) 6 | case object 7 | when Convention 8 | Types::ConventionType 9 | when Event 10 | Types::EventType 11 | end 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /app/graphql/types/timespan_with_money_value_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::TimespanWithMoneyValueInputType < Types::BaseInputObject 3 | argument :finish, Types::DateType, required: false 4 | argument :start, Types::DateType, required: false 5 | argument :value, Types::MoneyInputType, required: true 6 | end 7 | -------------------------------------------------------------------------------- /app/graphql/types/timespan_with_money_value_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::TimespanWithMoneyValueType < Types::BaseObject 3 | field :finish, Types::DateType, null: true 4 | field :start, Types::DateType, null: true 5 | field :value, Types::MoneyType, null: false 6 | end 7 | -------------------------------------------------------------------------------- /app/graphql/types/timespan_with_value_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::TimespanWithValueInputType < Types::BaseInputObject 3 | argument :finish, Types::DateType, required: false 4 | argument :start, Types::DateType, required: false 5 | 6 | # Add additional typed value fields here as appropriate 7 | argument :string_value, String, required: false, camelize: false 8 | end 9 | -------------------------------------------------------------------------------- /app/graphql/types/timespan_with_value_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::TimespanWithValueType < Types::BaseObject 3 | field :finish, Types::DateType, null: true 4 | field :start, Types::DateType, null: true 5 | field :value, String, null: false 6 | end 7 | -------------------------------------------------------------------------------- /app/graphql/types/timezone_mode_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::TimezoneModeType < Types::BaseEnum 3 | value("convention_local", "Display dates and times using convention’s local time zone") 4 | value("user_local", "Display dates and times using user’s local time zone") 5 | end 6 | -------------------------------------------------------------------------------- /app/graphql/types/uncamelized_field.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::UncamelizedField < Types::BaseField 3 | # We don't camelize fields in the Intercode API (this could change later) 4 | def initialize(*args, camelize: false, **kwargs, &block) 5 | super 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /app/graphql/types/user_con_profiles_pagination_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::UserConProfilesPaginationType < Types::PaginationType 3 | entries_field Types::UserConProfileType 4 | end 5 | -------------------------------------------------------------------------------- /app/graphql/types/user_filters_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::UserFiltersInputType < Types::BaseInputObject 3 | argument :email, String, required: false 4 | argument :first_name, String, required: false, camelize: false 5 | argument :last_name, String, required: false, camelize: false 6 | argument :name, String, required: false 7 | argument :privileges, [String], required: false 8 | end 9 | -------------------------------------------------------------------------------- /app/graphql/types/users_pagination_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::UsersPaginationType < Types::PaginationType 3 | entries_field Types::UserType 4 | end 5 | -------------------------------------------------------------------------------- /app/graphql/types/winning_user_con_profile_input_type.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Types::WinningUserConProfileInputType < Types::BaseInputObject 3 | argument :convention_id, ID, required: false, camelize: true 4 | argument :user_con_profile_id, ID, required: false, camelize: true 5 | end 6 | -------------------------------------------------------------------------------- /app/helpers/authenticity_tokens_helper.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | module AuthenticityTokensHelper 3 | end 4 | -------------------------------------------------------------------------------- /app/helpers/calendars_helper.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | module CalendarsHelper 3 | end 4 | -------------------------------------------------------------------------------- /app/helpers/csv_exports_helper.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | module CsvExportsHelper 3 | end 4 | -------------------------------------------------------------------------------- /app/helpers/graphiql_helper.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | module GraphiqlHelper 3 | end 4 | -------------------------------------------------------------------------------- /app/helpers/passwords_helper.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | module PasswordsHelper 3 | end 4 | -------------------------------------------------------------------------------- /app/helpers/registrations_helper.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | module RegistrationsHelper 3 | end 4 | -------------------------------------------------------------------------------- /app/helpers/single_page_app_helper.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | module SinglePageAppHelper 3 | end 4 | -------------------------------------------------------------------------------- /app/helpers/sitemaps_helper.rb: -------------------------------------------------------------------------------- 1 | module SitemapsHelper 2 | end 3 | -------------------------------------------------------------------------------- /app/helpers/stripe_account_helper.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | module StripeAccountHelper 3 | end 4 | -------------------------------------------------------------------------------- /app/helpers/user_con_profiles_helper.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | module UserConProfilesHelper 3 | end 4 | -------------------------------------------------------------------------------- /app/javascript/@types/assets.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.svg' { 2 | const content: string; 3 | export default content; 4 | } 5 | -------------------------------------------------------------------------------- /app/javascript/@types/globals.d.ts: -------------------------------------------------------------------------------- 1 | interface Window { 2 | intercodeAssetsHost?: string; 3 | sentryFrontendDSN?: string; 4 | rollbarClientAccessToken?: string; 5 | __intercodeAssetURL: (filename: string) => string; 6 | } 7 | -------------------------------------------------------------------------------- /app/javascript/@types/i18next.d.ts: -------------------------------------------------------------------------------- 1 | import 'react-i18next'; 2 | import en from '../../../locales/en.json'; 3 | 4 | declare module 'i18next' { 5 | interface CustomTypeOptions { 6 | allowObjectInHTMLChildren: true; 7 | returnNull: false; 8 | resources: { translation: typeof en }; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /app/javascript/Authentication/AuthenticationForms.tsx: -------------------------------------------------------------------------------- 1 | import SignInForm from './SignInForm'; 2 | import SignUpForm from './SignUpForm'; 3 | 4 | export { SignInForm, SignUpForm }; 5 | -------------------------------------------------------------------------------- /app/javascript/ClickwrapAgreement/mutations.graphql: -------------------------------------------------------------------------------- 1 | mutation AcceptClickwrapAgreement { 2 | acceptClickwrapAgreement(input: {}) { 3 | my_profile { 4 | id 5 | accepted_clickwrap_agreement 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /app/javascript/ClickwrapAgreement/queries.graphql: -------------------------------------------------------------------------------- 1 | query ClickwrapAgreementQuery { 2 | convention: conventionByRequestHost { 3 | id 4 | name 5 | clickwrap_agreement_html 6 | 7 | my_profile { 8 | id 9 | accepted_clickwrap_agreement 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /app/javascript/CmsAdmin/queries.graphql: -------------------------------------------------------------------------------- 1 | query CmsAdminBaseQuery { 2 | convention: conventionByRequestHostIfPresent { 3 | id 4 | } 5 | 6 | currentAbility { 7 | can_create_cms_navigation_items 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /app/javascript/DateTimeFormats.ts: -------------------------------------------------------------------------------- 1 | import { ParseKeys, ParseKeysByKeyPrefix } from 'i18next'; 2 | 3 | export type DateTimeFormatKey = ParseKeysByKeyPrefix; 4 | -------------------------------------------------------------------------------- /app/javascript/EventRatings/mutations.graphql: -------------------------------------------------------------------------------- 1 | mutation RateEvent($eventId: ID!, $rating: Int!) { 2 | rateEvent(input: { eventId: $eventId, rating: $rating }) { 3 | event { 4 | id 5 | my_rating 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /app/javascript/EventsApp/EventPage/valueIsPresent.ts: -------------------------------------------------------------------------------- 1 | export function valueIsPresent(value: unknown): boolean { 2 | if (value == null) { 3 | return false; 4 | } 5 | 6 | if (typeof value === 'string' && value.trim() === '') { 7 | return false; 8 | } 9 | 10 | if (typeof value === 'boolean') { 11 | return true; 12 | } 13 | 14 | return !!value; 15 | } 16 | -------------------------------------------------------------------------------- /app/javascript/EventsApp/MySignupQueue/signup-queue.module.css: -------------------------------------------------------------------------------- 1 | .skip { 2 | background-color: hsl(from var(--bs-gray) h s l / calc(alpha * 0.2)); 3 | } 4 | 5 | .skip.waitlist { 6 | background-color: hsl(from var(--bs-yellow) h s l / calc(alpha * 0.2)); 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/EventsApp/ScheduleGrid/LayoutConstants.ts: -------------------------------------------------------------------------------- 1 | export const PIXELS_PER_HOUR = 100; 2 | export const PIXELS_PER_LANE = 32; 3 | export const LANE_GUTTER_HEIGHT = 2; 4 | -------------------------------------------------------------------------------- /app/javascript/EventsApp/buildEventUrl.ts: -------------------------------------------------------------------------------- 1 | import parameterize from '../parameterize'; 2 | 3 | export default function buildEventUrl(event: { id: string; title?: string | null }): string { 4 | return `/events/${event.id}-${parameterize(event.title ?? '')}`; 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/EventsApp/eventIdRegexp.ts: -------------------------------------------------------------------------------- 1 | const eventIdRegexp = '[0-9a-z\\-]+'; 2 | 3 | export default eventIdRegexp; 4 | -------------------------------------------------------------------------------- /app/javascript/FormPresenter/ItemDisplays/FormItemDisplayMode.ts: -------------------------------------------------------------------------------- 1 | export type FormItemDisplayMode = 'admin' | 'public'; 2 | -------------------------------------------------------------------------------- /app/javascript/FormPresenter/ItemInputs/FieldRequiredFeedback.tsx: -------------------------------------------------------------------------------- 1 | export type FieldRequiredFeedbackProps = { 2 | valueInvalid: boolean; 3 | }; 4 | 5 | export default function FieldRequiredFeedback({ valueInvalid }: FieldRequiredFeedbackProps): JSX.Element { 6 | if (!valueInvalid) { 7 | return <>; 8 | } 9 | 10 | return
This field is required.
; 11 | } 12 | -------------------------------------------------------------------------------- /app/javascript/LiquidDocs/escapeRegExp.ts: -------------------------------------------------------------------------------- 1 | // https://codereview.stackexchange.com/questions/153691/escape-user-input-for-use-in-js-regex 2 | export default function escapeRegExp(string: string): string { 3 | return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string 4 | } 5 | -------------------------------------------------------------------------------- /app/javascript/LiquidDocs/findLiquidTagName.ts: -------------------------------------------------------------------------------- 1 | import { YardClass } from './DocData'; 2 | 3 | export default function findLiquidTagName(liquidTag: YardClass): string | undefined { 4 | const tagNameTag = liquidTag.tags.find((tag) => tag.tag_name === 'liquid_tag_name'); 5 | return tagNameTag?.text; 6 | } 7 | -------------------------------------------------------------------------------- /app/javascript/NavigationBar/MenuIcon.tsx: -------------------------------------------------------------------------------- 1 | export type MenuIconProps = { 2 | icon: string; 3 | colorClass?: string; 4 | }; 5 | 6 | function MenuIcon({ icon, colorClass }: MenuIconProps): JSX.Element { 7 | return ( 8 |
9 | 10 |
11 | ); 12 | } 13 | 14 | export default MenuIcon; 15 | -------------------------------------------------------------------------------- /app/javascript/NotificationAdmin/getNotificationEventKey.tsx: -------------------------------------------------------------------------------- 1 | import { NotificationEventKey } from 'graphqlTypes.generated'; 2 | 3 | export function getNotificationEventKey(categoryKey: string, eventKey: string): NotificationEventKey { 4 | return `${categoryKey.toUpperCase()}_${eventKey.toUpperCase()}` as NotificationEventKey; 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/OAuth/mutations.graphql: -------------------------------------------------------------------------------- 1 | mutation RevokeAuthorizedApplication($uid: ID!) { 2 | revokeAuthorizedApplication(input: { uid: $uid }) { 3 | clientMutationId 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/OAuth/queries.graphql: -------------------------------------------------------------------------------- 1 | query OAuthAuthorizationPromptQuery($queryParams: Json!) { 2 | currentUser { 3 | id 4 | } 5 | oauthPreAuth(queryParams: $queryParams) 6 | } 7 | 8 | query OAuthAuthorizedApplicationsQuery { 9 | myAuthorizedApplications { 10 | uid 11 | name 12 | scopes 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/javascript/OutletWithLoading.tsx: -------------------------------------------------------------------------------- 1 | import { PageLoadingIndicator } from '@neinteractiveliterature/litform'; 2 | import { Suspense } from 'react'; 3 | import { Outlet } from 'react-router'; 4 | 5 | export default function OutletWithLoading() { 6 | return ( 7 | }> 8 | 9 | 10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /app/javascript/RoomsAdmin/queries.graphql: -------------------------------------------------------------------------------- 1 | fragment RoomAdminRoomFields on Room { 2 | id 3 | name 4 | 5 | runs { 6 | id 7 | } 8 | } 9 | 10 | query RoomsAdminQuery { 11 | convention: conventionByRequestHost { 12 | id 13 | rooms { 14 | id 15 | ...RoomAdminRoomFields 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/javascript/RootSiteAdmin/mutations.graphql: -------------------------------------------------------------------------------- 1 | #import "./queries.graphql" 2 | 3 | mutation UpdateRootSite($siteName: String, $defaultLayoutId: ID, $rootPageId: ID) { 4 | updateRootSite( 5 | input: { root_site: { site_name: $siteName, defaultLayoutId: $defaultLayoutId, rootPageId: $rootPageId } } 6 | ) { 7 | root_site { 8 | id 9 | ...RootSiteFields 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /app/javascript/Store/Cart/queries.graphql: -------------------------------------------------------------------------------- 1 | #import "../orderFields.graphql" 2 | 3 | query CartQuery { 4 | convention: conventionByRequestHost { 5 | id 6 | name 7 | 8 | my_profile { 9 | id 10 | name_without_nickname 11 | 12 | current_pending_order { 13 | id 14 | ...CartOrderFields 15 | } 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/javascript/Store/OrderAdmin/new.tsx: -------------------------------------------------------------------------------- 1 | import { useNavigate } from 'react-router'; 2 | import NewOrderModal from './NewOrderModal'; 3 | 4 | function NewOrderRoute() { 5 | const navigate = useNavigate(); 6 | 7 | return navigate('..')} visible />; 8 | } 9 | 10 | export const Component = NewOrderRoute; 11 | -------------------------------------------------------------------------------- /app/javascript/Store/ProductAdmin/queries.graphql: -------------------------------------------------------------------------------- 1 | #import "../adminProductFields.graphql" 2 | 3 | query AdminProductsQuery { 4 | convention: conventionByRequestHost { 5 | id 6 | products { 7 | id 8 | ...AdminProductFields 9 | } 10 | ticket_types { 11 | id 12 | description 13 | } 14 | } 15 | 16 | currentAbility { 17 | can_update_products 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/javascript/Store/couponFields.graphql: -------------------------------------------------------------------------------- 1 | 2 | 3 | fragment CouponFields on Coupon { 4 | id 5 | code 6 | fixed_amount { 7 | fractional 8 | currency_code 9 | } 10 | percent_discount 11 | provides_product { 12 | id 13 | name 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/javascript/Tables/FreeTextFilter.tsx: -------------------------------------------------------------------------------- 1 | import { Column } from '@tanstack/react-table'; 2 | import CommitableInput from '../BuiltInFormControls/CommitableInput'; 3 | 4 | function FreeTextFilter({ column }: { column: Column }): JSX.Element { 5 | return ; 6 | } 7 | 8 | export default FreeTextFilter; 9 | -------------------------------------------------------------------------------- /app/javascript/Tables/HtmlCell.tsx: -------------------------------------------------------------------------------- 1 | import { CellContext } from '@tanstack/react-table'; 2 | 3 | export default function HtmlCell({ 4 | getValue, 5 | }: CellContext) { 6 | return
; 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/Tables/MoneyCell.tsx: -------------------------------------------------------------------------------- 1 | import { CellContext } from '@tanstack/react-table'; 2 | import formatMoney from '../formatMoney'; 3 | import { Money } from '../graphqlTypes.generated'; 4 | 5 | function MoneyCell({ 6 | getValue, 7 | }: CellContext): JSX.Element { 8 | return <>{formatMoney(getValue())}; 9 | } 10 | 11 | export default MoneyCell; 12 | -------------------------------------------------------------------------------- /app/javascript/humanize.ts: -------------------------------------------------------------------------------- 1 | export default function humanize(str: string): string { 2 | const stringWithoutSeparators = str.replace(/[_-]/g, ' ').replace(/ +/g, ' '); 3 | if (stringWithoutSeparators === '') { 4 | return ''; 5 | } 6 | 7 | return `${stringWithoutSeparators[0].toUpperCase()}${stringWithoutSeparators.slice(1).toLowerCase()}`; 8 | } 9 | -------------------------------------------------------------------------------- /app/javascript/packs/application.ts: -------------------------------------------------------------------------------- 1 | import 'regenerator-runtime/runtime'; 2 | 3 | import components from './components'; 4 | import mountReactComponents from '../mountReactComponents'; 5 | 6 | mountReactComponents(components); 7 | -------------------------------------------------------------------------------- /app/javascript/packs/applicationEntry.ts: -------------------------------------------------------------------------------- 1 | import './setPublicPath'; 2 | import 'vite/modulepreload-polyfill'; 3 | import('../styles/application.scss'); 4 | 5 | import(/* webpackChunkName: 'bootstrap-js' */ 'bootstrap'); 6 | import('./application'); 7 | -------------------------------------------------------------------------------- /app/javascript/packs/applicationStyles.ts: -------------------------------------------------------------------------------- 1 | import './setPublicPath'; 2 | 3 | // Style-only entry point. Used as part of applicationEntry, but also usable standalone. 4 | 5 | import(/* webpackChunkName: 'applicationStylesheet' */ '../styles/application.scss'); 6 | -------------------------------------------------------------------------------- /app/javascript/packs/setPublicPath.ts: -------------------------------------------------------------------------------- 1 | function intercodeAssetURL(filename: string) { 2 | if (window.intercodeAssetsHost) { 3 | return `//${window.intercodeAssetsHost}/packs/${filename}`; 4 | } else { 5 | return `/packs/${filename}`; 6 | } 7 | } 8 | 9 | // eslint-disable-next-line no-underscore-dangle 10 | window.__intercodeAssetURL = intercodeAssetURL; 11 | -------------------------------------------------------------------------------- /app/javascript/parameterize.ts: -------------------------------------------------------------------------------- 1 | export default function parameterize(str: string): string { 2 | return str.replace(/[^A-Za-z0-9-]/g, '-').toLocaleLowerCase(); 3 | } 4 | -------------------------------------------------------------------------------- /app/javascript/scrollToLocationHash.ts: -------------------------------------------------------------------------------- 1 | export default function scrollToLocationHash(): void { 2 | const { hash } = window.location; 3 | if (hash && hash.startsWith('#')) { 4 | const id = hash.substr(1); 5 | const element = document.getElementById(id) || (document.getElementsByName(id) || [])[0]; 6 | if (element) { 7 | element.scrollIntoView(); 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /app/javascript/styles/_buckets.scss: -------------------------------------------------------------------------------- 1 | @each $color, $value in $bucket-colors { 2 | .text-#{$color} { 3 | color: $value; 4 | } 5 | 6 | .bg-#{$color} { 7 | background-color: $value; 8 | } 9 | 10 | .btn-#{$color} { 11 | @include button-variant($value, $value); 12 | } 13 | 14 | .btn-outline-#{$color} { 15 | @include button-outline-variant($value); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/javascript/styles/_color_variants.scss: -------------------------------------------------------------------------------- 1 | @each $color, $value in $color-variants { 2 | .bg-#{$color} { 3 | background-color: $value; 4 | } 5 | } 6 | 7 | @each $color, $value in $theme-colors { 8 | .text-hover-#{$color}:hover { 9 | color: $value !important; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /app/javascript/styles/_glow.scss: -------------------------------------------------------------------------------- 1 | @each $color, $value in $theme-colors { 2 | .glow-#{$color} { 3 | box-shadow: 0 0 5px $value; 4 | } 5 | 6 | .glow-inset-#{$color} { 7 | box-shadow: inset 0 0 5px $value; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /app/javascript/styles/_print.scss: -------------------------------------------------------------------------------- 1 | @media print { 2 | .no-print { 3 | display: none; 4 | } 5 | } 6 | 7 | .page-break-after { 8 | page-break-after: always; 9 | 10 | &:last-child { 11 | page-break-after: inherit; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/javascript/styles/_spin.scss: -------------------------------------------------------------------------------- 1 | // ported from font-awesome 4 2 | 3 | @keyframes spin { 4 | 0% { 5 | transform: rotate(0deg); 6 | } 7 | 100% { 8 | transform: rotate(359deg); 9 | } 10 | } 11 | 12 | .spin, 13 | .spin::before, 14 | .spin::after { 15 | animation: spin 2s infinite linear; 16 | } 17 | -------------------------------------------------------------------------------- /app/javascript/styles/_toast.scss: -------------------------------------------------------------------------------- 1 | .toast-container { 2 | position: absolute; 3 | top: 65px; 4 | right: 10px; 5 | } 6 | 7 | .toast { 8 | // just make all toasts as wide as possible 9 | width: $toast-max-width; 10 | } 11 | -------------------------------------------------------------------------------- /app/javascript/styles/bucket_availability_display.module.scss.d.ts: -------------------------------------------------------------------------------- 1 | // Generated by typed-scss-modules 2 | export declare const bucketAvailabilityCell: string; 3 | export declare const bucketAvailabilityDisplay: string; 4 | export declare const bucketAvailabilityDisplayCompact: string; 5 | export declare const bucketAvailabilityOpenSlot: string; 6 | -------------------------------------------------------------------------------- /app/javascript/styles/dev-mode-graphiql.scss: -------------------------------------------------------------------------------- 1 | @import './bootstrap_custom'; 2 | 3 | $code-font-size: 16px; 4 | 5 | body { 6 | margin: 0; 7 | padding: 0; 8 | } 9 | 10 | .graphiql-container { 11 | width: 100vw; 12 | height: 100vh; 13 | } 14 | -------------------------------------------------------------------------------- /app/javascript/styles/event_list.module.scss: -------------------------------------------------------------------------------- 1 | .event-card-header { 2 | // display: grid; 3 | // grid-template-columns: 1fr min-content; 4 | } 5 | 6 | .event-card-event-title { 7 | overflow-wrap: break-word; 8 | } 9 | -------------------------------------------------------------------------------- /app/javascript/styles/event_list.module.scss.d.ts: -------------------------------------------------------------------------------- 1 | // Generated by typed-scss-modules 2 | export declare const eventCardEventTitle: string; 3 | -------------------------------------------------------------------------------- /app/javascript/styles/event_ratings.module.scss: -------------------------------------------------------------------------------- 1 | .rate-event-control { 2 | text-align: center; 3 | overflow: hidden; 4 | transition: width 0.5s ease-out; 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/styles/event_ratings.module.scss.d.ts: -------------------------------------------------------------------------------- 1 | // Generated by typed-scss-modules 2 | export declare const rateEventControl: string; 3 | -------------------------------------------------------------------------------- /app/javascript/styles/liquid_docs.module.scss: -------------------------------------------------------------------------------- 1 | .liquid-docs-browser { 2 | position: fixed; 3 | left: 0; 4 | bottom: 0; 5 | width: 100vw; 6 | height: 40vh; 7 | z-index: 1000; 8 | background-color: #ffffff; 9 | } 10 | 11 | .liquid-docs-spacer { 12 | height: 40vh; 13 | } 14 | -------------------------------------------------------------------------------- /app/javascript/styles/liquid_docs.module.scss.d.ts: -------------------------------------------------------------------------------- 1 | // Generated by typed-scss-modules 2 | export declare const liquidDocsBrowser: string; 3 | export declare const liquidDocsSpacer: string; 4 | -------------------------------------------------------------------------------- /app/javascript/styles/page_admin_dropdown.module.scss.d.ts: -------------------------------------------------------------------------------- 1 | // Generated by typed-scss-modules 2 | export declare const pageAdminDropdown: string; 3 | -------------------------------------------------------------------------------- /app/javascript/styles/run_capacity_graph.module.scss.d.ts: -------------------------------------------------------------------------------- 1 | // Generated by typed-scss-modules 2 | export declare const bucketCapacity: string; 3 | export declare const runCapacity: string; 4 | -------------------------------------------------------------------------------- /app/javascript/styles/spoiler.module.scss.d.ts: -------------------------------------------------------------------------------- 1 | // Generated by typed-scss-modules 2 | export declare const spoiler: string; 3 | export declare const spoilerHidden: string; 4 | export declare const spoilerHover: string; 5 | -------------------------------------------------------------------------------- /app/javascript/useValueUnless.ts: -------------------------------------------------------------------------------- 1 | export default function useValueUnless(getValue: () => T, unlessCondition: unknown): T | undefined { 2 | if (unlessCondition) { 3 | return undefined; 4 | } 5 | 6 | return getValue(); 7 | } 8 | -------------------------------------------------------------------------------- /app/jobs/application_job.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class ApplicationJob < ActiveJob::Base 3 | include Rollbar::ActiveJob 4 | 5 | queue_as :default 6 | 7 | discard_on ActiveJob::DeserializationError do |job, error| 8 | ErrorReporting.warn( 9 | "Skipping job because of ActiveJob::DeserializationError (#{error.message})", 10 | arguments: job.arguments 11 | ) 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /app/jobs/receive_sns_email_delivery_job.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class ReceiveSnsEmailDeliveryJob < ApplicationJob 3 | def perform(message) 4 | ReceiveSnsEmailDeliveryService.new(message: message).call! 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /app/jobs/remind_draft_event_proposals_job.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class RemindDraftEventProposalsJob < ApplicationJob 3 | def perform 4 | RemindDraftEventProposals.new.call! 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /app/jobs/send_user_activity_alerts_job.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class SendUserActivityAlertsJob < ApplicationJob 3 | def perform(user_con_profile, event) 4 | SendUserActivityAlertsService.new(user_con_profile: user_con_profile, event: event).call! 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /app/jobs/sync_email_forwarding_for_domain_job.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class SyncEmailForwardingForDomainJob < ApplicationJob 3 | def perform(domains) 4 | mappings_by_domain = EmailForwardingRouter.all_mappings_for_domains(Array(domains)).by_domain 5 | 6 | return if ENV["FORWARDEMAIL_API_KEY"].blank? 7 | SyncForwardEmailService.new(mappings_by_domain:).call! 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /app/jobs/sync_team_mailing_list_job.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class SyncTeamMailingListJob < ApplicationJob 3 | def perform(event) 4 | SyncTeamMailingListService.new(event: event).call! 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /app/liquid_drops/money_drop.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | # An amount of money 3 | class MoneyDrop < Liquid::Drop 4 | # @api 5 | attr_reader :money 6 | 7 | def initialize(money) 8 | @money = money 9 | end 10 | 11 | delegate :format, :fractional, :currency, :symbol, :decimal_mark, to: :money 12 | 13 | # @api 14 | def to_number 15 | money.to_d 16 | end 17 | end 18 | -------------------------------------------------------------------------------- /app/liquid_drops/pay_what_you_want_value_drop.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | # A set of rules for a pay-what-you-want pricing structure 3 | class PayWhatYouWantValueDrop < Liquid::Drop 4 | # @api 5 | attr_reader :value 6 | 7 | def initialize(value) 8 | @value = value 9 | end 10 | 11 | delegate :minimum_amount, :maximum_amount, :suggested_amount, to: :value 12 | end 13 | -------------------------------------------------------------------------------- /app/mailers/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/app/mailers/.gitkeep -------------------------------------------------------------------------------- /app/models/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/app/models/.gitkeep -------------------------------------------------------------------------------- /app/models/application_record.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class ApplicationRecord < ActiveRecord::Base 3 | self.abstract_class = true 4 | end 5 | -------------------------------------------------------------------------------- /app/models/registration_policy/error.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class RegistrationPolicy::Error 3 | attr_reader :message 4 | 5 | def initialize(message) 6 | @message = message 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /app/policies/cms_content_group_policy.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class CmsContentGroupPolicy < ApplicationPolicy 3 | include CmsContentPolicy 4 | end 5 | -------------------------------------------------------------------------------- /app/policies/cms_file_policy.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class CmsFilePolicy < ApplicationPolicy 3 | include CmsContentPolicy 4 | end 5 | -------------------------------------------------------------------------------- /app/policies/cms_graphql_query_policy.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class CmsGraphqlQueryPolicy < ApplicationPolicy 3 | include CmsContentPolicy 4 | end 5 | -------------------------------------------------------------------------------- /app/policies/cms_layout_policy.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class CmsLayoutPolicy < ApplicationPolicy 3 | include CmsContentPolicy 4 | end 5 | -------------------------------------------------------------------------------- /app/policies/cms_navigation_item_policy.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class CmsNavigationItemPolicy < ApplicationPolicy 3 | include CmsContentPolicy 4 | end 5 | -------------------------------------------------------------------------------- /app/policies/cms_partial_policy.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class CmsPartialPolicy < ApplicationPolicy 3 | include CmsContentPolicy 4 | end 5 | -------------------------------------------------------------------------------- /app/policies/cms_variable_policy.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class CmsVariablePolicy < ApplicationPolicy 3 | include CmsContentPolicy 4 | end 5 | -------------------------------------------------------------------------------- /app/policies/coupon_application_policy.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class CouponApplicationPolicy < ApplicationPolicy 3 | delegate :order, to: :record 4 | 5 | def manage? 6 | OrderPolicy.new(authorization_info, order).manage_coupons? 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /app/policies/page_policy.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class PagePolicy < ApplicationPolicy 3 | include CmsContentPolicy 4 | end 5 | -------------------------------------------------------------------------------- /app/policies/queries/nil_safe_cache.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Queries::NilSafeCache 3 | def initialize 4 | @values = {} 5 | end 6 | 7 | def get(key) 8 | return @values[key] if @values.key?(key) 9 | @values[key] = yield 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /app/policies/queries/query_manager.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Queries::QueryManager 3 | def self.query_methods 4 | instance_methods(false) 5 | end 6 | 7 | attr_reader :user 8 | 9 | def initialize(user:) 10 | @user = user 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /app/presenters/concerns/form_markdown.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | module FormMarkdown 3 | def render_markdown(content) 4 | MarkdownPresenter 5 | .new('', cadmus_renderer: cadmus_renderer) 6 | .render(content, sanitize_content: false, filter_liquid_tags: false) 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /app/presenters/concerns/sort_buckets.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | module SortBuckets 3 | def sort_buckets(buckets) 4 | buckets.sort_by do |bucket| 5 | [ 6 | bucket.slots_limited? ? 0 : 1, 7 | bucket.anything? ? 1 : 0, 8 | bucket.not_counted? ? 1 : 0, 9 | (bucket.name || '').downcase 10 | ] 11 | end 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /app/services/cms_content_loaders/cms_graphql_queries.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class CmsContentLoaders::CmsGraphqlQueries < CmsContentLoaders::Base 3 | private 4 | 5 | def storage_adapter 6 | @storage_adapter ||= CmsContentStorageAdapters::CmsGraphqlQueries.new(cms_parent, content_set) 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /app/services/cms_content_loaders/cms_partials.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class CmsContentLoaders::CmsPartials < CmsContentLoaders::Base 3 | private 4 | 5 | def storage_adapter 6 | @storage_adapter ||= CmsContentStorageAdapters::CmsPartials.new(cms_parent, content_set) 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /app/services/cms_content_loaders/conflict_policy.rb: -------------------------------------------------------------------------------- 1 | class CmsContentLoaders::ConflictPolicy 2 | def action_for(_existing_item, _new_item, _attrs) 3 | raise "CmsContentLoader::ConflictPolicy subclasses must implement #action_for(existing_item, new_item, attrs)" 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/services/cms_content_loaders/notification_templates.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class CmsContentLoaders::NotificationTemplates < CmsContentLoaders::Base 3 | private 4 | 5 | def storage_adapter 6 | @storage_adapter ||= CmsContentStorageAdapters::NotificationTemplates.new(cms_parent, content_set) 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /app/services/concerns/skippable_advisory_lock.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | module SkippableAdvisoryLock 3 | attr_reader :skip_locking 4 | 5 | def with_advisory_lock_unless_skip_locking(name, &) 6 | if skip_locking 7 | yield 8 | else 9 | ActiveRecord::Base.with_advisory_lock(name, transaction: true, &) 10 | end 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /app/services/content_cloners/convention_cloner.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class ContentCloners::ConventionCloner < ContentCloners::ContentClonerBase 3 | def clone(convention) 4 | convention.organization ||= source_convention.organization 5 | convention.save! 6 | 7 | @id_maps[:conventions] = { source_convention.id => convention } 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /app/services/content_cloners/departments_cloner.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class ContentCloners::DepartmentsCloner < ContentCloners::ContentClonerBase 3 | def clone(convention) 4 | @id_maps[:departments] = clone_with_id_map(source_convention.departments, convention.departments) 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /app/services/content_cloners/rooms_cloner.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class ContentCloners::RoomsCloner < ContentCloners::ContentClonerBase 3 | def clone(convention) 4 | @id_maps[:rooms] = clone_with_id_map(source_convention.rooms, convention.rooms) 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /app/services/content_cloners/ticket_types_cloner.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class ContentCloners::TicketTypesCloner < ContentCloners::ContentClonerBase 3 | def clone(convention) 4 | @id_maps[:ticket_types] = clone_with_id_map(source_convention.ticket_types, convention.ticket_types) 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /app/services/drop_event_service.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class DropEventService < CivilService::Service 3 | attr_reader :event 4 | 5 | def initialize(event:) 6 | @event = event 7 | end 8 | 9 | private 10 | 11 | def inner_call 12 | event.runs.destroy_all 13 | event.update!(status: 'dropped') 14 | 15 | success 16 | end 17 | end 18 | -------------------------------------------------------------------------------- /app/services/run_notifications_service.rb: -------------------------------------------------------------------------------- 1 | class RunNotificationsService < CivilService::Service 2 | private 3 | 4 | def inner_call 5 | [NotifyEventProposalChangesJob, NotifyEventChangesJob, RemindDraftEventProposalsJob].each(&:perform_later) 6 | success 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /app/views/doorkeeper/applications/_delete_form.html.erb: -------------------------------------------------------------------------------- 1 | <%- submit_btn_css ||= 'btn btn-link' %> 2 | <%= form_tag oauth_application_path(application), method: :delete do %> 3 | <%= submit_tag t('doorkeeper.applications.buttons.destroy'), 4 | onclick: "return confirm('#{ t('doorkeeper.applications.confirmations.destroy') }')", 5 | class: submit_btn_css %> 6 | <% end %> 7 | -------------------------------------------------------------------------------- /app/views/doorkeeper/applications/edit.html.erb: -------------------------------------------------------------------------------- 1 |
2 |

<%= t('.title') %>

3 |
4 | 5 | <%= render 'form', application: @application %> 6 | -------------------------------------------------------------------------------- /app/views/doorkeeper/applications/new.html.erb: -------------------------------------------------------------------------------- 1 |
2 |

<%= t('.title') %>

3 |
4 | 5 | <%= render 'form', application: @application %> 6 | -------------------------------------------------------------------------------- /app/views/doorkeeper/authorizations/error.html.erb: -------------------------------------------------------------------------------- 1 |
2 |

<%= t('doorkeeper.authorizations.error.title') %>

3 |
4 | 5 |
6 |
<%= @pre_auth.error_response.body[:error_description] %>
7 |
8 | -------------------------------------------------------------------------------- /app/views/doorkeeper/authorizations/show.html.erb: -------------------------------------------------------------------------------- 1 | 4 | 5 |
6 | <%= params[:code] %> 7 |
8 | -------------------------------------------------------------------------------- /app/views/doorkeeper/authorized_applications/_delete_form.html.erb: -------------------------------------------------------------------------------- 1 | <%- submit_btn_css ||= 'btn btn-link' %> 2 | <%= form_tag oauth_authorized_application_path(application), method: :delete do %> 3 | <%= submit_tag t('doorkeeper.authorized_applications.buttons.revoke'), onclick: "return confirm('#{ t('doorkeeper.authorized_applications.confirmations.revoke') }')", class: submit_btn_css %> 4 | <% end %> 5 | -------------------------------------------------------------------------------- /app/views/graphiql/show.html.erb: -------------------------------------------------------------------------------- 1 |
5 | -------------------------------------------------------------------------------- /app/views/layouts/application.html.erb: -------------------------------------------------------------------------------- 1 | <%= cms_rendering_context.render_app_root_content(effective_cms_layout(request.path), { 2 | 'content_for_head' => render('layouts/head'), 3 | 'event' => @event, 4 | 'page' => @page, 5 | 'browser_warning' => browser_warning 6 | }) %> 7 | -------------------------------------------------------------------------------- /app/views/layouts/liquid_docs.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | <%= render partial: 'layouts/head' %> 5 | 6 | 7 |
8 | <%= yield %> 9 |
10 | 11 | 12 | -------------------------------------------------------------------------------- /app/views/layouts/mailer.text.erb: -------------------------------------------------------------------------------- 1 | <%= yield %> -------------------------------------------------------------------------------- /app/views/notifications/notification.html.erb: -------------------------------------------------------------------------------- 1 | <%= @body_html %> 2 | -------------------------------------------------------------------------------- /app/views/reports/per_event.html.erb: -------------------------------------------------------------------------------- 1 | <% @events.each do |event| %> 2 | <%= render 'reports/per_event_single', event: event %> 3 | <% end %> 4 | -------------------------------------------------------------------------------- /app/views/reports/per_user.html.erb: -------------------------------------------------------------------------------- 1 | <% @user_con_profiles.each do |user_con_profile| %> 2 | <%= render 'reports/per_user_single', user_con_profile: user_con_profile %> 3 | <% end %> 4 | -------------------------------------------------------------------------------- /app/views/reports/single_user_printable.html.erb: -------------------------------------------------------------------------------- 1 | <%= render 'reports/per_user_single', user_con_profile: @subject_profile %> 2 | <% @events.each do |event| %> 3 | <%= render 'reports/per_event_single', event: event %> 4 | <% end %> 5 | -------------------------------------------------------------------------------- /app/views/user_mailer/confirmation_instructions.html.erb: -------------------------------------------------------------------------------- 1 |

2 | Welcome <%= @resource.email %>! 3 |

4 |

You can confirm your account email through the link below:

5 |

6 | <%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @resource.confirmation_token) %> 7 |

8 | -------------------------------------------------------------------------------- /app/views/user_mailer/unlock_instructions.html.erb: -------------------------------------------------------------------------------- 1 |

2 | Hello <%= @resource.email %>! 3 |

4 |

Your account has been locked due to an excessive amount of unsuccessful log in attempts.

5 |

Click the link below to unlock your account:

6 |

7 | <%= link_to 'Unlock my account', unlock_url(@resource, :unlock_token => @resource.unlock_token) %> 8 |

9 | -------------------------------------------------------------------------------- /bin/brakeman: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | require "rubygems" 3 | require "bundler/setup" 4 | 5 | ARGV.unshift("--ensure-latest") 6 | 7 | load Gem.bin_path("brakeman", "brakeman") 8 | -------------------------------------------------------------------------------- /bin/bundle: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) 3 | load Gem.bin_path('bundler', 'bundle') 4 | -------------------------------------------------------------------------------- /bin/dev: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | exec "./bin/rails", "server", *ARGV 3 | -------------------------------------------------------------------------------- /bin/rails: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | APP_PATH = File.expand_path("../config/application", __dir__) 3 | require_relative "../config/boot" 4 | require "rails/commands" 5 | -------------------------------------------------------------------------------- /bin/rake: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | require_relative "../config/boot" 3 | require "rake" 4 | Rake.application.run 5 | -------------------------------------------------------------------------------- /bin/rubocop: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | require "rubygems" 3 | require "bundler/setup" 4 | 5 | # explicit rubocop config increases performance slightly while avoiding config confusion. 6 | ARGV.unshift("--config", File.expand_path("../.rubocop.yml", __dir__)) 7 | 8 | load Gem.bin_path("rubocop", "rubocop") 9 | -------------------------------------------------------------------------------- /cloudflare/.dev.vars: -------------------------------------------------------------------------------- 1 | EMAIL_FORWARDERS_API_TOKEN="abc123" 2 | -------------------------------------------------------------------------------- /cloudflare/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["ES2020"], 4 | "types": ["./worker-configuration.d.ts"] 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /cloudflare/wrangler.jsonc: -------------------------------------------------------------------------------- 1 | { 2 | "name": "intercode-email-forwarder", 3 | "main": "intercode-email-forwarder.ts", 4 | "compatibility_date": "2025-04-18", 5 | "send_email": [{ "name": "SEND_EMAIL" }], 6 | "observability": { 7 | "enabled": true, 8 | "head_sampling_rate": 1, 9 | }, 10 | "vars": { 11 | "INTERCODE_URL": "https://www.neilhosting.net", 12 | }, 13 | } 14 | -------------------------------------------------------------------------------- /cms_content_sets/base/layouts/Default.liquid: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {{ content_for_head }} 5 | 6 | {{ content_for_navbar }} 7 | 8 |
9 | {{ content_for_layout }} 10 |
11 | 12 | 13 | -------------------------------------------------------------------------------- /cms_content_sets/base/metadata.yml: -------------------------------------------------------------------------------- 1 | default_layout_name: Default 2 | -------------------------------------------------------------------------------- /cms_content_sets/base/partials/run_description.liquid: -------------------------------------------------------------------------------- 1 | --- 2 | admin_notes: Given a run, displays either the name of the event or that plus its start time (if there are multiple runs) 3 | --- 4 | {%- if run.event.runs.size > 1 -%} 5 | {{ run.event.title }} on {{ run.starts_at | date: "%A, %B %-d, %Y at %l:%M%P" }} 6 | {%- else -%} 7 | {{ run.event.title }} 8 | {%- endif -%} 9 | -------------------------------------------------------------------------------- /cms_content_sets/procon_import/layouts/Default.liquid: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {{ content_for_head }} 5 | 6 | {{ content_for_navbar }} 7 | 8 |
9 | {{ content_for_layout }} 10 |
11 | 12 | 13 | -------------------------------------------------------------------------------- /cms_content_sets/procon_import/metadata.yml: -------------------------------------------------------------------------------- 1 | default_layout_name: Default 2 | navigation_items: [] 3 | -------------------------------------------------------------------------------- /cms_content_sets/rock_and_romance/metadata.yml: -------------------------------------------------------------------------------- 1 | inherit: 2 | - standard 3 | default_layout_name: Default 4 | root_page_slug: root 5 | -------------------------------------------------------------------------------- /cms_content_sets/single_event/layouts/Default.liquid: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {{ content_for_head }} 5 | 6 | {{ content_for_navbar }} 7 | 8 |
9 | {{ content_for_layout }} 10 |
11 | 12 | 13 | -------------------------------------------------------------------------------- /cms_content_sets/single_event/metadata.yml: -------------------------------------------------------------------------------- 1 | --- 2 | inherit: 3 | - base 4 | navigation_items: 5 | - item_type: link 6 | title: Team and Contact Info 7 | page_slug: team-contact 8 | - item_type: link 9 | title: Code of Conduct 10 | page_slug: conduct 11 | root_page_slug: root 12 | default_layout_name: Default 13 | variables: {} 14 | -------------------------------------------------------------------------------- /cms_content_sets/single_event/pages/conduct.liquid: -------------------------------------------------------------------------------- 1 | --- 2 | name: Code of Conduct 3 | invariant: false 4 | skip_clickwrap_agreement: true 5 | --- 6 |

Code of Conduct

7 | 8 | Edit this page and enter your code of conduct. 9 | -------------------------------------------------------------------------------- /cms_content_sets/smoke_and_mirrors/files/All_Menus.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/cms_content_sets/smoke_and_mirrors/files/All_Menus.pdf -------------------------------------------------------------------------------- /cms_content_sets/smoke_and_mirrors/files/CrownePlazaFloorplan.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/cms_content_sets/smoke_and_mirrors/files/CrownePlazaFloorplan.jpg -------------------------------------------------------------------------------- /cms_content_sets/smoke_and_mirrors/files/Indian_food_set.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/cms_content_sets/smoke_and_mirrors/files/Indian_food_set.JPG -------------------------------------------------------------------------------- /cms_content_sets/smoke_and_mirrors/files/InterconFlyer.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/cms_content_sets/smoke_and_mirrors/files/InterconFlyer.pdf -------------------------------------------------------------------------------- /cms_content_sets/smoke_and_mirrors/files/InterconSFacebook.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/cms_content_sets/smoke_and_mirrors/files/InterconSFacebook.jpg -------------------------------------------------------------------------------- /cms_content_sets/smoke_and_mirrors/files/crowneplaza.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/cms_content_sets/smoke_and_mirrors/files/crowneplaza.jpg -------------------------------------------------------------------------------- /cms_content_sets/smoke_and_mirrors/files/neilSquare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/cms_content_sets/smoke_and_mirrors/files/neilSquare.png -------------------------------------------------------------------------------- /cms_content_sets/smoke_and_mirrors/pages/Flyer.liquid: -------------------------------------------------------------------------------- 1 | --- 2 | name: Flyer 3 | invariant: false 4 | --- 5 |

Download PDF

6 | 7 | -------------------------------------------------------------------------------- /cms_content_sets/smoke_and_mirrors/pages/buckets.liquid: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bucket System Description 3 | invariant: true 4 | --- 5 |

Game Signup Bucket System

6 | {% include "proposal_form_registration_policy_instructions" %} -------------------------------------------------------------------------------- /cms_content_sets/smoke_and_mirrors/pages/hotel-menu.liquid: -------------------------------------------------------------------------------- 1 | --- 2 | name: Hotel Menu 3 | invariant: false 4 | --- 5 |

Download PDF

6 | 7 | -------------------------------------------------------------------------------- /cms_content_sets/smoke_and_mirrors/pages/hotellayout.liquid: -------------------------------------------------------------------------------- 1 | --- 2 | name: Hotel Layout 3 | admin_notes: '' 4 | invariant: false 5 | --- 6 |

Crowne Plaza Providence-Warwick

7 |
8 |
9 | 10 |
11 |
-------------------------------------------------------------------------------- /cms_content_sets/smoke_and_mirrors/pages/news.liquid: -------------------------------------------------------------------------------- 1 | --- 2 | name: News 3 | admin_notes: '' 4 | invariant: false 5 | --- 6 |

{{convention.name}} News

7 | {% include 'all-news' %} -------------------------------------------------------------------------------- /cms_content_sets/smoke_and_mirrors/partials/gravatar80.liquid: -------------------------------------------------------------------------------- 1 | --- 2 | name: gravatar80 3 | invariant: false 4 | --- 5 | {{ display_user_con_profile.bio_name}}'s Icon 6 | -------------------------------------------------------------------------------- /cms_content_sets/standard/layouts/Default.liquid: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {{ content_for_head }} 5 | 6 | {{ content_for_navbar }} 7 | 8 |
9 | {{ content_for_layout }} 10 |
11 | 12 | 13 | -------------------------------------------------------------------------------- /cms_content_sets/standard/partials/news.liquid: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/cms_content_sets/standard/partials/news.liquid -------------------------------------------------------------------------------- /cms_content_sets/the_last_seder/files/12-tls-logo-778.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/cms_content_sets/the_last_seder/files/12-tls-logo-778.jpg -------------------------------------------------------------------------------- /cms_content_sets/the_last_seder/metadata.yml: -------------------------------------------------------------------------------- 1 | --- 2 | inherit: 3 | - single_page 4 | navigation_items: 5 | - item_type: link 6 | title: Food 7 | page_slug: food 8 | - item_type: link 9 | title: Team and Contact Info 10 | page_slug: team-contact 11 | - item_type: link 12 | title: Code of Conduct 13 | page_slug: conduct 14 | root_page_slug: root 15 | default_layout_name: Default 16 | variables: {} 17 | -------------------------------------------------------------------------------- /cms_content_sets/wanderlust/pages/buckets.liquid: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bucket System Description 3 | skip_clickwrap_agreement: false 4 | hidden_from_search: false 5 | --- 6 |

Game Signup Bucket System

7 | {% include "proposal_form_registration_policy_instructions" %} -------------------------------------------------------------------------------- /cms_content_sets/wanderlust/pages/conlogo.liquid: -------------------------------------------------------------------------------- 1 | --- 2 | name: con logo test 3 | skip_clickwrap_agreement: false 4 | hidden_from_search: true 5 | --- 6 |
7 |
8 | 9 |
10 |
-------------------------------------------------------------------------------- /cms_content_sets/wanderlust/pages/flyer.liquid: -------------------------------------------------------------------------------- 1 | --- 2 | name: Flyer 3 | skip_clickwrap_agreement: false 4 | hidden_from_search: false 5 | --- 6 |

Download PDF

7 | 8 | -------------------------------------------------------------------------------- /cms_content_sets/wanderlust/pages/hotel/menu.liquid: -------------------------------------------------------------------------------- 1 | --- 2 | name: Hotel Menu 3 | skip_clickwrap_agreement: false 4 | hidden_from_search: false 5 | --- 6 |

Download PDF

7 | 8 | -------------------------------------------------------------------------------- /cms_content_sets/wanderlust/pages/hotel/renovation.liquid: -------------------------------------------------------------------------------- 1 | --- 2 | name: Hotel Room Renovations 3 | skip_clickwrap_agreement: false 4 | hidden_from_search: false 5 | --- 6 |

Download PDF

7 | 8 | -------------------------------------------------------------------------------- /cms_content_sets/wanderlust/pages/nat-debugs-an-image-he-uploaded.liquid: -------------------------------------------------------------------------------- 1 | --- 2 | name: Nat debugs an image he uploaded 3 | skip_clickwrap_agreement: false 4 | hidden_from_search: true 5 | --- 6 |

Straight up file_url:

7 | 8 | {% file_url "interconu-web-480.png" %} 9 | 10 |

file_url in a partial:

11 | 12 | {% include 'nat_image_debug' %} 13 | 14 |

conintro:

15 | 16 | {% include 'conintro' %} -------------------------------------------------------------------------------- /cms_content_sets/wanderlust/pages/news.liquid: -------------------------------------------------------------------------------- 1 | --- 2 | name: News 3 | admin_notes: '' 4 | skip_clickwrap_agreement: false 5 | hidden_from_search: false 6 | --- 7 |

{{convention.name}} News

8 | {% include 'all-news' %} -------------------------------------------------------------------------------- /cms_content_sets/wanderlust/pages/open-slots.liquid: -------------------------------------------------------------------------------- 1 | --- 2 | name: Larps with openings 3 | skip_clickwrap_agreement: true 4 | hidden_from_search: false 5 | layout_name: Auto Refresh Blank Page 6 | --- 7 |
8 |

There's still openings in all these great games!

9 | 10 | {% include "run_availability_grid" %} 11 |
-------------------------------------------------------------------------------- /cms_content_sets/wanderlust/pages/store.liquid: -------------------------------------------------------------------------------- 1 | --- 2 | name: Intercon V Store 3 | skip_clickwrap_agreement: false 4 | hidden_from_search: false 5 | --- 6 | -------------------------------------------------------------------------------- /cms_content_sets/wanderlust/partials/gravatar80.liquid: -------------------------------------------------------------------------------- 1 | --- 2 | invariant: false 3 | --- 4 | {{ display_user_con_profile.bio_name}}'s Icon 5 | -------------------------------------------------------------------------------- /cms_content_sets/wanderlust/partials/nat_image_debug.liquid: -------------------------------------------------------------------------------- 1 | --- 2 | invariant: false 3 | --- 4 | {% file_url "interconu-web-480.png" %} -------------------------------------------------------------------------------- /config.ru: -------------------------------------------------------------------------------- 1 | # This file is used by Rack-based servers to start the application. 2 | 3 | require ::File.expand_path('../config/environment', __FILE__) 4 | run Intercode::Application 5 | -------------------------------------------------------------------------------- /config/boot.rb: -------------------------------------------------------------------------------- 1 | ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) 2 | 3 | require "bundler/setup" # Set up gems listed in the Gemfile. 4 | require "bootsnap/setup" # Speed up boot time by caching expensive operations. 5 | -------------------------------------------------------------------------------- /config/cable.yml: -------------------------------------------------------------------------------- 1 | development: 2 | adapter: async 3 | 4 | test: 5 | adapter: test 6 | 7 | production: 8 | adapter: redis 9 | url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %> 10 | channel_prefix: intercode_production 11 | -------------------------------------------------------------------------------- /config/environment.rb: -------------------------------------------------------------------------------- 1 | # Load the Rails application. 2 | require_relative "application" 3 | 4 | # Initialize the Rails application. 5 | Rails.application.initialize! 6 | -------------------------------------------------------------------------------- /config/inflections.json: -------------------------------------------------------------------------------- 1 | { 2 | "acronym": [ 3 | "GM", 4 | "GMs", 5 | "JSON", 6 | "LARP", 7 | "LARPs", 8 | "NPC", 9 | "NPCs", 10 | "OAuth", 11 | "PC", 12 | "PCs", 13 | "RPG", 14 | "RPGs" 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /config/initializers/ahoy.rb: -------------------------------------------------------------------------------- 1 | class Ahoy::Store < Ahoy::DatabaseStore 2 | def authenticate(data) 3 | # disables automatic linking of visits and users 4 | end 5 | end 6 | 7 | # set to true for JavaScript tracking 8 | Ahoy.api = false 9 | 10 | # GDPR compliance 11 | Ahoy.mask_ips = true 12 | Ahoy.cookies = :none 13 | 14 | # Don't spam the logs 15 | Ahoy.logger = nil 16 | -------------------------------------------------------------------------------- /config/initializers/application_controller_renderer.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # ActiveSupport::Reloader.to_prepare do 4 | # ApplicationController.renderer.defaults.merge!( 5 | # http_host: 'example.org', 6 | # https: false 7 | # ) 8 | # end 9 | -------------------------------------------------------------------------------- /config/initializers/assets.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Version of your assets, change this if you want to expire all your assets. 4 | Rails.application.config.assets.version = "1.0" 5 | 6 | # Add additional assets to the asset load path. 7 | # Rails.application.config.assets.paths << Emoji.images_path 8 | -------------------------------------------------------------------------------- /config/initializers/business_time.rb: -------------------------------------------------------------------------------- 1 | Holidays 2 | .between(1.month.ago, 2.years.from_now, :ecbtarget, :observed) 3 | .map do |holiday| 4 | BusinessTime::Config.holidays << holiday[:date] 5 | # Implement long weekends if they apply to the region, eg: 6 | # BusinessTime::Config.holidays << holiday[:date].next_week if !holiday[:date].weekday? 7 | end 8 | -------------------------------------------------------------------------------- /config/initializers/cadmus.rb: -------------------------------------------------------------------------------- 1 | Cadmus.page_model = 'Page' 2 | Cadmus.partial_model = 'CmsPartial' 3 | Cadmus.layout_model = 'CmsLayout' 4 | CadmusNavbar.navigation_item_model = 'CmsNavigationItem' 5 | 6 | Cadmus::Tags::PageUrl.define_page_path_method { |page_name, _parent| "/pages/#{page_name}" } 7 | -------------------------------------------------------------------------------- /config/initializers/cookies_serializer.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Specify a serializer for the signed and encrypted cookie jars. 4 | # Valid options are :json, :marshal, and :hybrid. 5 | Rails.application.config.action_dispatch.cookies_serializer = :json 6 | -------------------------------------------------------------------------------- /config/initializers/date_formats.rb: -------------------------------------------------------------------------------- 1 | Time::DATE_FORMATS[:long_with_weekday] = '%A, %B %-d, %Y at %l:%M%P' 2 | Time::DATE_FORMATS[:date_only] = '%B %-d, %Y' 3 | Time::DATE_FORMATS[:date_only_with_weekday] = '%A, %B %-d, %Y' 4 | Time::DATE_FORMATS[:long_weekday_with_time] = '%A at %l:%M%P' 5 | Time::DATE_FORMATS[:short_weekday_with_time] = '%a %l:%M%P' 6 | -------------------------------------------------------------------------------- /config/initializers/gc_auto_compact.rb: -------------------------------------------------------------------------------- 1 | GC.auto_compact = ENV["RUBY_GC_AUTO_COMPACT"].present? 2 | 3 | STDERR.puts "Ruby GC auto-compact is #{GC.auto_compact ? "enabled" : "disabled"}." 4 | -------------------------------------------------------------------------------- /config/initializers/graphiql_rails.rb: -------------------------------------------------------------------------------- 1 | # GraphiQL::Rails.config.csrf = :per_form 2 | -------------------------------------------------------------------------------- /config/initializers/loofah.rb: -------------------------------------------------------------------------------- 1 | Loofah::HTML5::SafeList::ACCEPTABLE_CSS_FUNCTIONS.merge Set.new(%w[ 2 | calc rgb rgba hsl hsla opacity 3 | rotate rotate3d rotateX rotateY rotateZ 4 | scale scale3d scaleX scaleY scaleZ 5 | translate translate3d translateX translateY translateZ 6 | ]) 7 | -------------------------------------------------------------------------------- /config/initializers/mime_types.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Add new mime types for use in respond_to blocks: 4 | # Mime::Type.register "text/richtext", :rtf 5 | 6 | Mime::Type.register 'text/calendar', :ics 7 | -------------------------------------------------------------------------------- /config/initializers/oj.rb: -------------------------------------------------------------------------------- 1 | Oj.optimize_rails 2 | Oj.default_options = { mode: :compat } 3 | -------------------------------------------------------------------------------- /config/initializers/phonelib.rb: -------------------------------------------------------------------------------- 1 | Phonelib.default_country = "US" 2 | -------------------------------------------------------------------------------- /config/initializers/prevent_blank_recipients_interceptor.rb: -------------------------------------------------------------------------------- 1 | class PreventBlankRecipientsInterceptor 2 | def self.delivering_email(message) 3 | return if message.to.present? 4 | 5 | message.perform_deliveries = false 6 | Rails.logger.debug 'Not delivering email because recipients are blank' 7 | end 8 | end 9 | 10 | ActionMailer::Base.register_interceptor(PreventBlankRecipientsInterceptor) 11 | -------------------------------------------------------------------------------- /config/initializers/rack_mini_profiler.rb: -------------------------------------------------------------------------------- 1 | if defined?(Rack::MiniProfiler) 2 | Rack::MiniProfiler.config.start_hidden = true 3 | Rack::MiniProfiler.config.collapse_results = false 4 | Rack::MiniProfiler.config.position = 'bottom-left' 5 | end 6 | -------------------------------------------------------------------------------- /config/initializers/rack_profiler.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | if Rails.env.development? && ENV['RACK_MINI_PROFILER'] 4 | require 'rack-mini-profiler' 5 | 6 | # initialization is skipped so trigger it 7 | Rack::MiniProfilerRails.initialize!(Rails.application) 8 | end 9 | -------------------------------------------------------------------------------- /config/initializers/recaptcha.rb: -------------------------------------------------------------------------------- 1 | Recaptcha.configuration.hostname = ->(hostname) do 2 | ( 3 | Rails.application.config.action_mailer.default_url_options[:host].gsub(/:\d+\z/, '') == hostname || 4 | Convention.where(domain: hostname).any? 5 | ) 6 | end 7 | -------------------------------------------------------------------------------- /config/initializers/sentry.rb: -------------------------------------------------------------------------------- 1 | if ENV["SENTRY_DSN"].present? 2 | Sentry.init do |config| 3 | config.dsn = ENV.fetch("SENTRY_DSN") 4 | config.release = "intercode-#{ENV.fetch("REVISION")}" if ENV["REVISION"].present? 5 | 6 | config.traces_sample_rate = ENV.fetch("SENTRY_TRACES_SAMPLE_RATE", "0").to_f 7 | config.profiles_sample_rate = ENV.fetch("SENTRY_PROFILES_SAMPLE_RATE", "0").to_f 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /config/initializers/session_store.rb: -------------------------------------------------------------------------------- 1 | # We set the cookie domain dynamically with a Rack middleware. 2 | # See lib/intercode/dynamic_cookie_domain.rb for how this works. 3 | 4 | Rails.application.config.session_store :active_record_store, 5 | key: '_intercode_session', 6 | domain: :all, 7 | same_site: :lax, # attempt to work around https://bugzilla.mozilla.org/show_bug.cgi?id=1465402 8 | expire_after: 2.weeks 9 | -------------------------------------------------------------------------------- /config/initializers/stripe.rb: -------------------------------------------------------------------------------- 1 | Rails.configuration.stripe = { 2 | publishable_key: ENV['STRIPE_PUBLISHABLE_KEY'], 3 | secret_key: ENV['STRIPE_SECRET_KEY'] 4 | } 5 | 6 | Stripe.api_key = Rails.configuration.stripe[:secret_key] 7 | -------------------------------------------------------------------------------- /config/nocache-files.json: -------------------------------------------------------------------------------- 1 | [ 2 | "/packs/application.js", 3 | "/packs/application-styles.js" 4 | ] 5 | 6 | -------------------------------------------------------------------------------- /config/shoryuken.yml: -------------------------------------------------------------------------------- 1 | groups: 2 | default: 3 | concurrency: 5 4 | queues: 5 | - default 6 | mailers: 7 | concurrency: 5 8 | queues: 9 | - mailers 10 | ahoy: 11 | concurrency: 5 12 | queues: 13 | - ahoy 14 | cloudwatch_scheduler: 15 | concurrency: 1 16 | queues: 17 | - cloudwatch_scheduler 18 | timeout: 2 19 | -------------------------------------------------------------------------------- /config/sidekiq.yml: -------------------------------------------------------------------------------- 1 | :queues: 2 | - mailer 3 | - default 4 | -------------------------------------------------------------------------------- /config/skylight.yml: -------------------------------------------------------------------------------- 1 | ignored_endpoints: 2 | - BundleHashController#show 3 | -------------------------------------------------------------------------------- /config/spring.rb: -------------------------------------------------------------------------------- 1 | %w[ 2 | .ruby-version 3 | .rbenv-vars 4 | tmp/restart.txt 5 | tmp/caching-dev.txt 6 | ].each { |path| Spring.watch(path) } 7 | -------------------------------------------------------------------------------- /db/migrate/20120604142637_create_runs.rb: -------------------------------------------------------------------------------- 1 | class CreateRuns < ActiveRecord::Migration[5.1] 2 | def change 3 | create_table :runs do |t| 4 | t.references :event 5 | t.timestamp :starts_at 6 | t.string :title_suffix 7 | t.text :schedule_note 8 | t.references :updated_by 9 | 10 | t.timestamps 11 | end 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /db/migrate/20120604201100_scope_events_to_con.rb: -------------------------------------------------------------------------------- 1 | class ScopeEventsToCon < ActiveRecord::Migration[5.1] 2 | def change 3 | change_table :events do |t| 4 | t.references :con 5 | end 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /db/migrate/20120609181638_add_start_and_end_times_to_cons.rb: -------------------------------------------------------------------------------- 1 | class AddStartAndEndTimesToCons < ActiveRecord::Migration[5.1] 2 | def change 3 | change_table :cons do |t| 4 | t.datetime :starts_at 5 | t.datetime :ends_at 6 | end 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /db/migrate/20120616163017_create_pages.rb: -------------------------------------------------------------------------------- 1 | class CreatePages < ActiveRecord::Migration[5.1] 2 | def change 3 | create_table :pages do |t| 4 | t.text :name 5 | t.string :slug 6 | t.text :content 7 | t.integer :parent_id 8 | t.string :parent_type 9 | 10 | t.timestamps 11 | end 12 | 13 | add_index :pages, [:parent_type, :parent_id, :slug], unique: true 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /db/migrate/20120616164203_con_root_pages.rb: -------------------------------------------------------------------------------- 1 | class ConRootPages < ActiveRecord::Migration[5.1] 2 | def change 3 | change_table :cons do |t| 4 | t.references :root_page 5 | end 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /db/migrate/20120616165151_add_name_to_cons.rb: -------------------------------------------------------------------------------- 1 | class AddNameToCons < ActiveRecord::Migration[5.1] 2 | def change 3 | change_table :cons do |t| 4 | t.string :name 5 | end 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /db/migrate/20120616165745_add_banner_image_to_cons.rb: -------------------------------------------------------------------------------- 1 | class AddBannerImageToCons < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :cons, :banner_image, :string 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20131227011316_subclass_events.rb: -------------------------------------------------------------------------------- 1 | class SubclassEvents < ActiveRecord::Migration[5.1] 2 | def change 3 | add_reference :events, :user, index: true 4 | add_column :events, :type, :string 5 | add_column :events, :status, :string 6 | remove_column :events, :special_event_flags, :text 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /db/migrate/20151107232925_add_sessions_table.rb: -------------------------------------------------------------------------------- 1 | class AddSessionsTable < ActiveRecord::Migration[5.1] 2 | def change 3 | create_table :sessions do |t| 4 | t.string :session_id, null: false 5 | t.text :data 6 | t.timestamps 7 | end 8 | 9 | add_index :sessions, :session_id, unique: true 10 | add_index :sessions, :updated_at 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /db/migrate/20151108010959_create_rooms.rb: -------------------------------------------------------------------------------- 1 | class CreateRooms < ActiveRecord::Migration[5.1] 2 | def change 3 | create_table :rooms do |t| 4 | t.references :convention, index: true, foreign_key: true 5 | t.string :name 6 | 7 | t.timestamps null: false 8 | end 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /db/migrate/20151108020322_create_rooms_runs.rb: -------------------------------------------------------------------------------- 1 | class CreateRoomsRuns < ActiveRecord::Migration[5.1] 2 | def change 3 | create_table :rooms_runs, id: false do |t| 4 | t.references :room, null: false, index: true, foreign_key: true 5 | t.references :run, null: false, index: true, foreign_key: true 6 | end 7 | 8 | add_index :rooms_runs, [:run_id, :room_id], unique: true 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /db/migrate/20151108021933_add_user_id_to_signups.rb: -------------------------------------------------------------------------------- 1 | class AddUserIdToSignups < ActiveRecord::Migration[5.1] 2 | def change 3 | add_reference :signups, :user, index: true, foreign_key: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20151108041735_add_timezone_to_conventions.rb: -------------------------------------------------------------------------------- 1 | class AddTimezoneToConventions < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :conventions, :timezone_name, :string 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20151108133732_add_registration_policy_to_events.rb: -------------------------------------------------------------------------------- 1 | class AddRegistrationPolicyToEvents < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :events, :registration_policy, :text 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20151115201840_create_ticket_types.rb: -------------------------------------------------------------------------------- 1 | class CreateTicketTypes < ActiveRecord::Migration[5.1] 2 | def change 3 | create_table :ticket_types do |t| 4 | t.references :convention, index: true, foreign_key: true 5 | t.text :name 6 | t.text :description 7 | t.column :pricing_schedule, :text 8 | 9 | t.timestamps null: false 10 | end 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /db/migrate/20151129142816_add_provided_by_event_to_tickets.rb: -------------------------------------------------------------------------------- 1 | class AddProvidedByEventToTickets < ActiveRecord::Migration[5.1] 2 | def change 3 | add_reference :tickets, :provided_by_event, index: true 4 | add_foreign_key :tickets, :events, column: :provided_by_event_id 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /db/migrate/20160310141909_add_legacy_password_md5_to_users.rb: -------------------------------------------------------------------------------- 1 | class AddLegacyPasswordMd5ToUsers < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :users, :legacy_password_md5, :text 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20161112151816_add_maximum_event_signups_to_conventions.rb: -------------------------------------------------------------------------------- 1 | class AddMaximumEventSignupsToConventions < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :conventions, :maximum_event_signups, :text 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20161112202920_add_state_to_signups.rb: -------------------------------------------------------------------------------- 1 | class AddStateToSignups < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :signups, :state, :string, null: false, default: 'confirmed', index: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20161112203319_add_counted_to_signups.rb: -------------------------------------------------------------------------------- 1 | class AddCountedToSignups < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :signups, :counted, :boolean 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20161113163044_add_requested_bucket_key_to_signups.rb: -------------------------------------------------------------------------------- 1 | class AddRequestedBucketKeyToSignups < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :signups, :requested_bucket_key, :string 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20161127205353_add_registrations_frozen_to_conventions.rb: -------------------------------------------------------------------------------- 1 | class AddRegistrationsFrozenToConventions < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :conventions, :registrations_frozen, :boolean, default: false, null: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20170208234244_create_cms_partials.rb: -------------------------------------------------------------------------------- 1 | class CreateCmsPartials < ActiveRecord::Migration[5.1] 2 | def change 3 | create_table :cms_partials do |t| 4 | t.references :convention, null: false 5 | t.string :identifier, null: false 6 | t.text :content 7 | 8 | t.timestamps 9 | end 10 | 11 | add_index :cms_partials, [:convention_id, :identifier], unique: true 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /db/migrate/20170219064321_remove_news_and_con_com_meetings_from_conventions.rb: -------------------------------------------------------------------------------- 1 | class RemoveNewsAndConComMeetingsFromConventions < ActiveRecord::Migration[5.1] 2 | def change 3 | remove_column :conventions, :news, :text 4 | remove_column :conventions, :con_com_meetings, :text 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /db/migrate/20170522175455_add_bio_to_user_con_profiles.rb: -------------------------------------------------------------------------------- 1 | class AddBioToUserConProfiles < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :user_con_profiles, :bio, :text 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20170526163733_add_show_nickname_in_bio_to_user_con_profiles.rb: -------------------------------------------------------------------------------- 1 | class AddShowNicknameInBioToUserConProfiles < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :user_con_profiles, :show_nickname_in_bio, :boolean 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20170602200806_create_staff_positions.rb: -------------------------------------------------------------------------------- 1 | class CreateStaffPositions < ActiveRecord::Migration[5.1] 2 | def change 3 | create_table :staff_positions do |t| 4 | t.references :convention, foreign_key: true 5 | t.text :name 6 | t.text :email 7 | 8 | t.timestamps 9 | end 10 | 11 | create_join_table :staff_positions, :user_con_profiles 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /db/migrate/20170721234402_create_forms.rb: -------------------------------------------------------------------------------- 1 | class CreateForms < ActiveRecord::Migration[5.1] 2 | def change 3 | create_table :forms do |t| 4 | t.text :title 5 | 6 | t.timestamps 7 | end 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /db/migrate/20170721234424_create_form_sections.rb: -------------------------------------------------------------------------------- 1 | class CreateFormSections < ActiveRecord::Migration[5.1] 2 | def change 3 | create_table :form_sections do |t| 4 | t.references :form, foreign_key: true 5 | t.text :title 6 | t.integer :position 7 | 8 | t.timestamps 9 | end 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /db/migrate/20170721234716_create_form_items.rb: -------------------------------------------------------------------------------- 1 | class CreateFormItems < ActiveRecord::Migration[5.1] 2 | def change 3 | create_table :form_items do |t| 4 | t.references :form_section, foreign_key: true 5 | t.integer :position 6 | t.text :identifier 7 | t.text :item_type 8 | t.text :properties 9 | 10 | t.timestamps 11 | end 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /db/migrate/20170721235511_scope_forms_to_conventions.rb: -------------------------------------------------------------------------------- 1 | class ScopeFormsToConventions < ActiveRecord::Migration[5.1] 2 | def change 3 | add_reference :forms, :convention, foreign_key: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20170724172123_add_event_proposal_form_to_conventions.rb: -------------------------------------------------------------------------------- 1 | class AddEventProposalFormToConventions < ActiveRecord::Migration[5.1] 2 | def change 3 | add_reference :conventions, :event_proposal_form, foreign_key: { to_table: :forms } 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20170829191902_add_admin_description_to_form_items.rb: -------------------------------------------------------------------------------- 1 | class AddAdminDescriptionToFormItems < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :form_items, :admin_description, :text 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20170829204511_add_timeblock_preferences_to_event_proposals.rb: -------------------------------------------------------------------------------- 1 | class AddTimeblockPreferencesToEventProposals < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :event_proposals, :timeblock_preferences, :text 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20171014183340_add_default_status_for_events.rb: -------------------------------------------------------------------------------- 1 | class AddDefaultStatusForEvents < ActiveRecord::Migration[5.1] 2 | def change 3 | reversible do |dir| 4 | dir.up { execute "UPDATE events SET status = 'active' WHERE status IS NULL" } 5 | end 6 | 7 | change_column :events, :status, :string, null: false, default: 'active' 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /db/migrate/20171014184727_add_participant_communications_to_events.rb: -------------------------------------------------------------------------------- 1 | class AddParticipantCommunicationsToEvents < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :events, :participant_communications, :text 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20171014184903_remove_player_constraints_from_events.rb: -------------------------------------------------------------------------------- 1 | class RemovePlayerConstraintsFromEvents < ActiveRecord::Migration[5.1] 2 | def change 3 | remove_column :events, :player_constraints, :text 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20171015182922_remove_notify_on_changes_from_events.rb: -------------------------------------------------------------------------------- 1 | class RemoveNotifyOnChangesFromEvents < ActiveRecord::Migration[5.1] 2 | def change 3 | remove_column :events, :notify_on_changes, :boolean 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20171018213324_rename_accepting_bids_to_accepting_proposals.rb: -------------------------------------------------------------------------------- 1 | class RenameAcceptingBidsToAcceptingProposals < ActiveRecord::Migration[5.1] 2 | def change 3 | rename_column :conventions, :accepting_bids, :accepting_proposals 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20171021154612_remove_signups_allowed_from_conventions.rb: -------------------------------------------------------------------------------- 1 | class RemoveSignupsAllowedFromConventions < ActiveRecord::Migration[5.1] 2 | def change 3 | remove_column :conventions, :signups_allowed, :string, default: 'not_yet', null: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20171029163258_add_maximum_tickets_to_conventions.rb: -------------------------------------------------------------------------------- 1 | class AddMaximumTicketsToConventions < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :conventions, :maximum_tickets, :integer 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20171031202206_add_maximum_event_provided_tickets_to_ticket_types.rb: -------------------------------------------------------------------------------- 1 | class AddMaximumEventProvidedTicketsToTicketTypes < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :ticket_types, :maximum_event_provided_tickets, :integer, null: false, default: 0 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20171111160337_create_cms_layouts.rb: -------------------------------------------------------------------------------- 1 | class CreateCmsLayouts < ActiveRecord::Migration[5.1] 2 | def change 3 | create_table :cms_layouts do |t| 4 | t.references :parent, polymorphic: true 5 | t.text :name 6 | t.text :content 7 | t.text :navbar_classes 8 | 9 | t.timestamps 10 | end 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /db/migrate/20171111160745_add_default_layout_to_conventions.rb: -------------------------------------------------------------------------------- 1 | class AddDefaultLayoutToConventions < ActiveRecord::Migration[5.1] 2 | def change 3 | add_reference :conventions, :default_layout, foreign_key: { to_table: :cms_layouts } 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20171111161320_add_cms_layout_to_pages.rb: -------------------------------------------------------------------------------- 1 | class AddCmsLayoutToPages < ActiveRecord::Migration[5.1] 2 | def change 3 | add_reference :pages, :cms_layout, foreign_key: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20171111234858_add_user_con_profile_form_to_conventions.rb: -------------------------------------------------------------------------------- 1 | class AddUserConProfileFormToConventions < ActiveRecord::Migration[5.1] 2 | def change 3 | add_reference :conventions, :user_con_profile_form, foreign_key: { to_table: 'forms' } 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20171112181739_add_additional_info_to_user_con_profiles.rb: -------------------------------------------------------------------------------- 1 | class AddAdditionalInfoToUserConProfiles < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :user_con_profiles, :additional_info, :text 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20171127182439_add_default_value_to_form_items.rb: -------------------------------------------------------------------------------- 1 | class AddDefaultValueToFormItems < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :form_items, :default_value, :text 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20171201155843_add_receive_whos_free_emails_to_user_con_profiles.rb: -------------------------------------------------------------------------------- 1 | class AddReceiveWhosFreeEmailsToUserConProfiles < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :user_con_profiles, :receive_whos_free_emails, :boolean, null: false, default: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20180122194924_add_gravatar_enabled_to_user_con_profiles.rb: -------------------------------------------------------------------------------- 1 | class AddGravatarEnabledToUserConProfiles < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :user_con_profiles, :gravatar_enabled, :boolean, null: false, default: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20180123225046_rename_bid_permissions.rb: -------------------------------------------------------------------------------- 1 | class RenameBidPermissions < ActiveRecord::Migration[5.1] 2 | def change 3 | rename_column :user_con_profiles, :bid_committee, :proposal_committee 4 | rename_column :user_con_profiles, :bid_chair, :proposal_chair 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /db/migrate/20180123225540_remove_precon_bids_allowed_from_conventions.rb: -------------------------------------------------------------------------------- 1 | class RemovePreconBidsAllowedFromConventions < ActiveRecord::Migration[5.1] 2 | def change 3 | remove_column :conventions, :precon_bids_allowed, :boolean 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20180201184633_add_age_restrictions_and_content_warnings_to_events.rb: -------------------------------------------------------------------------------- 1 | class AddAgeRestrictionsAndContentWarningsToEvents < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :events, :age_restrictions, :text 4 | add_column :events, :content_warnings, :text 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /db/migrate/20180207173614_add_admin_notes_to_cms_tables.rb: -------------------------------------------------------------------------------- 1 | class AddAdminNotesToCmsTables < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :pages, :admin_notes, :text 4 | add_column :cms_partials, :admin_notes, :text 5 | add_column :cms_layouts, :admin_notes, :text 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /db/migrate/20180209153345_add_ticket_name_to_conventions.rb: -------------------------------------------------------------------------------- 1 | class AddTicketNameToConventions < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :conventions, :ticket_name, :string, null: false, default: 'ticket' 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20180209193547_index_notified_at_on_form_response_changes.rb: -------------------------------------------------------------------------------- 1 | class IndexNotifiedAtOnFormResponseChanges < ActiveRecord::Migration[5.1] 2 | def change 3 | add_index :form_response_changes, :notified_at 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20180212193535_remove_registrations_frozen_from_conventions.rb: -------------------------------------------------------------------------------- 1 | class RemoveRegistrationsFrozenFromConventions < ActiveRecord::Migration[5.1] 2 | def change 3 | remove_column :conventions, :registrations_frozen, :boolean, null: false, default: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20180213195724_add_visible_to_staff_positions.rb: -------------------------------------------------------------------------------- 1 | class AddVisibleToStaffPositions < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :staff_positions, :visible, :boolean 4 | 5 | reversible do |dir| 6 | dir.up { StaffPosition.update_all(visible: true) } 7 | end 8 | 9 | add_index :staff_positions, :visible 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /db/migrate/20180216202555_add_allows_event_signups_to_ticket_types.rb: -------------------------------------------------------------------------------- 1 | class AddAllowsEventSignupsToTicketTypes < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :ticket_types, :allows_event_signups, :boolean, default: true, null: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20180301162045_add_additional_info_to_events.rb: -------------------------------------------------------------------------------- 1 | class AddAdditionalInfoToEvents < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :events, :additional_info, :text 4 | 5 | reversible do |dir| 6 | dir.up { Event.update_all(additional_info: '{}') } 7 | end 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /db/migrate/20180304162934_add_submitted_at_to_event_proposals.rb: -------------------------------------------------------------------------------- 1 | class AddSubmittedAtToEventProposals < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :event_proposals, :submitted_at, :datetime 4 | 5 | reversible do |dir| 6 | dir.up { EventProposal.where.not(status: 'draft').update_all('submitted_at = created_at') } 7 | end 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /db/migrate/20180312150839_add_timestamps_to_orders.rb: -------------------------------------------------------------------------------- 1 | class AddTimestampsToOrders < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :orders, :submitted_at, :timestamp 4 | add_column :orders, :paid_at, :timestamp 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /db/migrate/20180408151722_add_position_to_product_variants.rb: -------------------------------------------------------------------------------- 1 | class AddPositionToProductVariants < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :product_variants, :position, :integer 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20180817153813_add_payment_options_to_products.rb: -------------------------------------------------------------------------------- 1 | class AddPaymentOptionsToProducts < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :products, :payment_options, :text 4 | 5 | reversible do |dir| 6 | dir.up do 7 | Product.update_all(payment_options: %w[stripe pay_at_convention]) 8 | end 9 | end 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /db/migrate/20180826212515_remove_banner_image_from_conventions.rb: -------------------------------------------------------------------------------- 1 | class RemoveBannerImageFromConventions < ActiveRecord::Migration[5.2] 2 | def change 3 | remove_column :conventions, :banner_image, :string 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20180922185941_add_admin_notes_to_event_proposals.rb: -------------------------------------------------------------------------------- 1 | class AddAdminNotesToEventProposals < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :event_proposals, :admin_notes, :text 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20180922221147_add_admin_notes_to_events.rb: -------------------------------------------------------------------------------- 1 | class AddAdminNotesToEvents < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :events, :admin_notes, :text 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20181010144914_add_reminded_at_to_event_proposals.rb: -------------------------------------------------------------------------------- 1 | class AddRemindedAtToEventProposals < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :event_proposals, :reminded_at, :datetime 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20181011174357_create_alert_destinations.rb: -------------------------------------------------------------------------------- 1 | class CreateAlertDestinations < ActiveRecord::Migration[5.2] 2 | def change 3 | create_table :alert_destinations do |t| 4 | t.references :alert, polymorphic: true, null: false 5 | t.references :staff_position, foreign_key: true 6 | t.references :user_con_profile, foreign_key: true 7 | 8 | t.timestamps 9 | end 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /db/migrate/20181015020539_add_event_mailing_list_domain_to_conventions.rb: -------------------------------------------------------------------------------- 1 | class AddEventMailingListDomainToConventions < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :conventions, :event_mailing_list_domain, :text 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20181015021731_add_team_mailing_list_name_to_events.rb: -------------------------------------------------------------------------------- 1 | class AddTeamMailingListNameToEvents < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :events, :team_mailing_list_name, :text 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20181024143839_create_doorkeeper_openid_connect_tables.rb: -------------------------------------------------------------------------------- 1 | class CreateDoorkeeperOpenidConnectTables < ActiveRecord::Migration[5.2] 2 | def change 3 | create_table :oauth_openid_requests do |t| 4 | t.references :access_grant, null: false, foreign_key: { to_table: :oauth_access_grants } 5 | t.string :nonce, null: false 6 | end 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /db/migrate/20181028182940_create_cms_variables.rb: -------------------------------------------------------------------------------- 1 | class CreateCmsVariables < ActiveRecord::Migration[5.2] 2 | def change 3 | create_table :cms_variables do |t| 4 | t.references :convention, foreign_key: true, null: false 5 | t.string :key, limit: 100, null: false 6 | t.text :value 7 | t.index [:convention_id, :key], unique: true 8 | 9 | t.timestamps 10 | end 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /db/migrate/20181108151904_add_private_signup_list_to_events.rb: -------------------------------------------------------------------------------- 1 | class AddPrivateSignupListToEvents < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :events, :private_signup_list, :boolean, null: false, default: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20181113145849_add_public_description_to_form_items.rb: -------------------------------------------------------------------------------- 1 | class AddPublicDescriptionToFormItems < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :form_items, :public_description, :text 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20181216163057_create_cms_graphql_queries.rb: -------------------------------------------------------------------------------- 1 | class CreateCmsGraphqlQueries < ActiveRecord::Migration[5.2] 2 | def change 3 | create_table :cms_graphql_queries do |t| 4 | t.references :parent, polymorphic: true 5 | t.text :identifier 6 | t.text :admin_notes 7 | t.text :query 8 | 9 | t.timestamps 10 | end 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /db/migrate/20190116034950_add_needs_update_to_user_con_profiles.rb: -------------------------------------------------------------------------------- 1 | class AddNeedsUpdateToUserConProfiles < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :user_con_profiles, :needs_update, :boolean, null: false, default: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190127185603_add_clickwrap_agreement_to_conventions.rb: -------------------------------------------------------------------------------- 1 | class AddClickwrapAgreementToConventions < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :conventions, :clickwrap_agreement, :text 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190127190135_add_accepted_clickwrap_agreement_to_user_con_profiles.rb: -------------------------------------------------------------------------------- 1 | class AddAcceptedClickwrapAgreementToUserConProfiles < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :user_con_profiles, :accepted_clickwrap_agreement, :boolean, null: false, default: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190127192813_add_skip_clickwrap_agreement_to_pages.rb: -------------------------------------------------------------------------------- 1 | class AddSkipClickwrapAgreementToPages < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :pages, :skip_clickwrap_agreement, :boolean, null: false, default: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190208214318_add_show_event_list_to_conventions.rb: -------------------------------------------------------------------------------- 1 | class AddShowEventListToConventions < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :conventions, :show_event_list, :string, default: "no", null: false 4 | 5 | reversible do |dir| 6 | dir.up do 7 | execute "UPDATE conventions SET show_event_list = 'yes'" 8 | end 9 | end 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /db/migrate/20190209164632_create_organizations.rb: -------------------------------------------------------------------------------- 1 | class CreateOrganizations < ActiveRecord::Migration[5.2] 2 | def change 3 | create_table :organizations do |t| 4 | t.text :name 5 | 6 | t.timestamps 7 | end 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /db/migrate/20190209164652_add_organization_to_conventions.rb: -------------------------------------------------------------------------------- 1 | class AddOrganizationToConventions < ActiveRecord::Migration[5.2] 2 | def change 3 | add_reference :conventions, :organization, foreign_key: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190209164910_create_organization_roles.rb: -------------------------------------------------------------------------------- 1 | class CreateOrganizationRoles < ActiveRecord::Migration[5.2] 2 | def change 3 | create_table :organization_roles do |t| 4 | t.references :organization, foreign_key: true 5 | t.text :name 6 | 7 | t.timestamps 8 | end 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /db/migrate/20190209165002_create_join_table_organization_roles_users.rb: -------------------------------------------------------------------------------- 1 | class CreateJoinTableOrganizationRolesUsers < ActiveRecord::Migration[5.2] 2 | def change 3 | create_join_table :organization_roles, :users do |t| 4 | # t.index [:organization_role_id, :user_id] 5 | # t.index [:user_id, :organization_role_id] 6 | end 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /db/migrate/20190415164817_add_ticket_mode_to_conventions.rb: -------------------------------------------------------------------------------- 1 | class AddTicketModeToConventions < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :conventions, :ticket_mode, :string, default: 'disabled', null: false 4 | 5 | reversible do |dir| 6 | dir.up { execute "UPDATE conventions SET ticket_mode = 'required_for_signup'" } 7 | end 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /db/migrate/20190419202156_add_legacy_password_sha1_to_users.rb: -------------------------------------------------------------------------------- 1 | class AddLegacyPasswordSha1ToUsers < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :users, :legacy_password_sha1, :text 4 | add_column :users, :legacy_password_sha1_salt, :text 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /db/migrate/20190521212001_add_site_mode_to_conventions.rb: -------------------------------------------------------------------------------- 1 | class AddSiteModeToConventions < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :conventions, :site_mode, :string, null: false, default: 'convention' 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190601161948_add_signup_mode_to_conventions.rb: -------------------------------------------------------------------------------- 1 | class AddSignupModeToConventions < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :conventions, :signup_mode, :string, null: false, default: 'self_service' 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190622195919_add_signup_requests_open_to_conventions.rb: -------------------------------------------------------------------------------- 1 | class AddSignupRequestsOpenToConventions < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :conventions, :signup_requests_open, :boolean, null: false, default: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190814120605_make_requested_bucket_key_nullable_for_signup_requests.rb: -------------------------------------------------------------------------------- 1 | class MakeRequestedBucketKeyNullableForSignupRequests < ActiveRecord::Migration[5.2] 2 | def change 3 | change_column_null :signup_requests, :requested_bucket_key, true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20191019225829_create_event_ratings.rb: -------------------------------------------------------------------------------- 1 | class CreateEventRatings < ActiveRecord::Migration[6.0] 2 | def change 3 | create_table :event_ratings do |t| 4 | t.references :user_con_profile, null: false 5 | t.references :event, null: false 6 | t.integer :rating 7 | 8 | t.index [:user_con_profile_id, :event_id], unique: true 9 | t.timestamps 10 | end 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /db/migrate/20191116152343_add_unaccent_extension.rb: -------------------------------------------------------------------------------- 1 | class AddUnaccentExtension < ActiveRecord::Migration[6.0] 2 | def up 3 | execute 'CREATE EXTENSION IF NOT EXISTS unaccent' 4 | end 5 | 6 | def down 7 | execute 'DROP EXTENSION unaccent' 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /db/migrate/20191130174830_add_compacted_to_form_response_changes.rb: -------------------------------------------------------------------------------- 1 | class AddCompactedToFormResponseChanges < ActiveRecord::Migration[6.0] 2 | def change 3 | add_column :form_response_changes, :compacted, :boolean, null: false, default: false 4 | add_index :form_response_changes, :compacted 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /db/migrate/20191226202814_rename_alert_destinations_to_notification_destinations.rb: -------------------------------------------------------------------------------- 1 | class RenameAlertDestinationsToNotificationDestinations < ActiveRecord::Migration[6.0] 2 | def change 3 | rename_table :alert_destinations, :notification_destinations 4 | rename_column :notification_destinations, :alert_id, :source_id 5 | rename_column :notification_destinations, :alert_type, :source_type 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /db/migrate/20200121165316_add_body_sms_to_notification_templates.rb: -------------------------------------------------------------------------------- 1 | class AddBodySmsToNotificationTemplates < ActiveRecord::Migration[6.0] 2 | def change 3 | add_column :notification_templates, :body_sms, :text 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20200125150313_add_allow_sms_to_user_con_profiles.rb: -------------------------------------------------------------------------------- 1 | class AddAllowSmsToUserConProfiles < ActiveRecord::Migration[6.0] 2 | def change 3 | add_column :user_con_profiles, :allow_sms, :boolean, null: false, default: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20200128164623_create_departments.rb: -------------------------------------------------------------------------------- 1 | class CreateDepartments < ActiveRecord::Migration[6.0] 2 | def change 3 | create_table :departments do |t| 4 | t.references :convention, null: false, foreign_key: true 5 | t.text :name 6 | t.text :proposal_description 7 | 8 | t.timestamps 9 | end 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /db/migrate/20200128165352_add_department_to_event_categories.rb: -------------------------------------------------------------------------------- 1 | class AddDepartmentToEventCategories < ActiveRecord::Migration[6.0] 2 | def change 3 | add_reference :event_categories, :department, null: true, foreign_key: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20200128165503_add_proposal_description_to_event_categories.rb: -------------------------------------------------------------------------------- 1 | class AddProposalDescriptionToEventCategories < ActiveRecord::Migration[6.0] 2 | def change 3 | add_column :event_categories, :proposal_description, :text 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20200216222452_add_trigram_extension.rb: -------------------------------------------------------------------------------- 1 | class AddTrigramExtension < ActiveRecord::Migration[6.0] 2 | def up 3 | execute 'CREATE EXTENSION IF NOT EXISTS pg_trgm' 4 | end 5 | 6 | def down 7 | execute 'DROP EXTENSION pg_trgm' 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /db/migrate/20200217182622_add_hidden_from_search.rb: -------------------------------------------------------------------------------- 1 | class AddHiddenFromSearch < ActiveRecord::Migration[6.0] 2 | def change 3 | add_column :pg_search_documents, :hidden_from_search, :boolean, null: false, default: false 4 | add_column :pages, :hidden_from_search, :boolean, null: false, default: false 5 | 6 | add_index :pg_search_documents, :hidden_from_search 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /db/migrate/20200312181248_create_email_routes.rb: -------------------------------------------------------------------------------- 1 | class CreateEmailRoutes < ActiveRecord::Migration[6.0] 2 | def change 3 | create_table :email_routes do |t| 4 | t.text :receiver_address, null: false, index: { unique: true } 5 | t.text :forward_addresses, null: false, array: true 6 | t.timestamps 7 | end 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /db/migrate/20200313212415_add_cc_addresses_and_email_aliases_to_staff_positions.rb: -------------------------------------------------------------------------------- 1 | class AddCcAddressesAndEmailAliasesToStaffPositions < ActiveRecord::Migration[6.0] 2 | def change 3 | change_table :staff_positions do |t| 4 | t.text :cc_addresses, array: true, null: false, default: [] 5 | t.text :email_aliases, array: true, null: false, default: [] 6 | end 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /db/migrate/20200314164542_add_catch_all_staff_position_and_email_mode_to_conventions.rb: -------------------------------------------------------------------------------- 1 | class AddCatchAllStaffPositionAndEmailModeToConventions < ActiveRecord::Migration[6.0] 2 | def change 3 | add_reference :conventions, :catch_all_staff_position, 4 | null: true, foreign_key: { to_table: 'staff_positions' } 5 | add_column :conventions, :email_mode, :string, null: false, default: 'forward' 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /db/migrate/20200322234518_add_canceled_to_conventions.rb: -------------------------------------------------------------------------------- 1 | class AddCanceledToConventions < ActiveRecord::Migration[6.0] 2 | def change 3 | add_column :conventions, :canceled, :boolean, null: false, default: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20200411161111_create_coupon_applications.rb: -------------------------------------------------------------------------------- 1 | class CreateCouponApplications < ActiveRecord::Migration[6.0] 2 | def change 3 | create_table :coupon_applications do |t| 4 | t.references :coupon, null: false, foreign_key: true 5 | t.references :order, null: false, foreign_key: true 6 | 7 | t.timestamps 8 | end 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /db/migrate/20200516164805_add_location_to_conventions.rb: -------------------------------------------------------------------------------- 1 | class AddLocationToConventions < ActiveRecord::Migration[6.0] 2 | def change 3 | add_column :conventions, :location, :jsonb 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20200517155823_add_timezone_mode_to_conventions.rb: -------------------------------------------------------------------------------- 1 | class AddTimezoneModeToConventions < ActiveRecord::Migration[6.0] 2 | def change 3 | add_column :conventions, :timezone_mode, :string 4 | 5 | up_only do 6 | execute %(UPDATE conventions SET timezone_mode = 'convention_local') 7 | end 8 | 9 | change_column_null :conventions, :timezone_mode, false 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /db/migrate/20200601160341_add_hidden_to_conventions.rb: -------------------------------------------------------------------------------- 1 | class AddHiddenToConventions < ActiveRecord::Migration[6.0] 2 | def change 3 | add_column :conventions, :hidden, :boolean, null: false, default: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20200712160144_add_language_to_conventions.rb: -------------------------------------------------------------------------------- 1 | class AddLanguageToConventions < ActiveRecord::Migration[6.0] 2 | def change 3 | add_column :conventions, :language, :string 4 | 5 | up_only do 6 | execute "UPDATE conventions SET language = 'en'" 7 | end 8 | 9 | change_column_null :conventions, :language, false 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /db/migrate/20200807160757_make_ticket_type_name_not_nullable.rb: -------------------------------------------------------------------------------- 1 | class MakeTicketTypeNameNotNullable < ActiveRecord::Migration[6.0] 2 | def change 3 | change_column_null :ticket_types, :name, false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20200830175919_make_event_title_non_nullable.rb: -------------------------------------------------------------------------------- 1 | class MakeEventTitleNonNullable < ActiveRecord::Migration[6.0] 2 | def change 3 | change_column_null :events, :title, false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20200930160120_remove_registrar_from_user_con_profiles.rb: -------------------------------------------------------------------------------- 1 | class RemoveRegistrarFromUserConProfiles < ActiveRecord::Migration[6.0] 2 | def change 3 | remove_column :user_con_profiles, :registrar, :boolean, null: false, default: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20201010180459_add_stripe_account_id_to_conventions.rb: -------------------------------------------------------------------------------- 1 | class AddStripeAccountIdToConventions < ActiveRecord::Migration[6.0] 2 | def change 3 | add_column :conventions, :stripe_account_id, :text 4 | add_column :conventions, :stripe_account_ready_to_charge, :boolean, null: false, default: false 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /db/migrate/20201010181146_remove_stripe_keys_from_conventions.rb: -------------------------------------------------------------------------------- 1 | class RemoveStripeKeysFromConventions < ActiveRecord::Migration[6.0] 2 | def change 3 | remove_column :conventions, :stripe_publishable_key, :text 4 | remove_column :conventions, :stripe_secret_key, :text 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /db/migrate/20210915155339_make_form_item_position_non_nullable.rb: -------------------------------------------------------------------------------- 1 | class MakeFormItemPositionNonNullable < ActiveRecord::Migration[6.1] 2 | def change 3 | change_column_null :form_items, :position, false 4 | change_column_null :form_sections, :position, false 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /db/migrate/20211011191912_remove_caption_from_form_items_where_invalid.rb: -------------------------------------------------------------------------------- 1 | class RemoveCaptionFromFormItemsWhereInvalid < ActiveRecord::Migration[6.1] 2 | def up 3 | execute <<~SQL 4 | UPDATE form_items SET properties = (properties - 'caption') 5 | WHERE item_type in ('static_text', 'event_email', 'registration_policy') 6 | SQL 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /db/migrate/20220102231745_add_open_graph_image_and_icon_image_to_conventions.rb: -------------------------------------------------------------------------------- 1 | class AddOpenGraphImageAndIconImageToConventions < ActiveRecord::Migration[7.0] 2 | def change 3 | add_column :conventions, :open_graph_image, :text 4 | add_column :conventions, :favicon, :text 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /db/migrate/20220122172525_remove_file_from_cms_files.rb: -------------------------------------------------------------------------------- 1 | class RemoveFileFromCmsFiles < ActiveRecord::Migration[7.0] 2 | def change 3 | remove_column :cms_files, :file, :string, null: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20220226170448_add_event_id_to_tickets.rb: -------------------------------------------------------------------------------- 1 | class AddEventIdToTickets < ActiveRecord::Migration[7.0] 2 | def change 3 | add_reference :tickets, :event, null: true, foreign_key: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20220313171517_add_expires_at_to_signups.rb: -------------------------------------------------------------------------------- 1 | class AddExpiresAtToSignups < ActiveRecord::Migration[7.0] 2 | def change 3 | add_column :signups, :expires_at, :timestamp, null: true 4 | add_index :signups, :expires_at 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /db/migrate/20220328155131_add_run_to_order_entries.rb: -------------------------------------------------------------------------------- 1 | class AddRunToOrderEntries < ActiveRecord::Migration[7.0] 2 | def change 3 | add_reference :order_entries, :run, null: true, foreign_key: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20220918173739_add_expose_in_to_form_items.rb: -------------------------------------------------------------------------------- 1 | class AddExposeInToFormItems < ActiveRecord::Migration[7.0] 2 | def change 3 | add_column :form_items, :expose_in, :text, array: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20220924204825_fix_event_email_form_item_identifiers.rb: -------------------------------------------------------------------------------- 1 | class FixEventEmailFormItemIdentifiers < ActiveRecord::Migration[7.0] 2 | def change 3 | reversible do |dir| 4 | dir.up { execute "UPDATE form_items SET identifier = 'event_email' WHERE item_type = 'event_email'" } 5 | end 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /db/migrate/20221120175702_add_event_ratings_foreign_keys.rb: -------------------------------------------------------------------------------- 1 | class AddEventRatingsForeignKeys < ActiveRecord::Migration[7.0] 2 | def change 3 | add_foreign_key :event_ratings, :user_con_profiles 4 | add_foreign_key :event_ratings, :events 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /db/migrate/20230109012113_make_run_event_id_not_nullable.rb: -------------------------------------------------------------------------------- 1 | class MakeRunEventIdNotNullable < ActiveRecord::Migration[7.0] 2 | def change 3 | change_column_null :runs, :event_id, false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20230113184026_make_signup_run_id_not_nullable.rb: -------------------------------------------------------------------------------- 1 | class MakeSignupRunIdNotNullable < ActiveRecord::Migration[7.0] 2 | def change 3 | change_column_null :signups, :run_id, false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20230113220828_make_event_convention_id_not_nullable.rb: -------------------------------------------------------------------------------- 1 | class MakeEventConventionIdNotNullable < ActiveRecord::Migration[7.0] 2 | def change 3 | change_column_null :events, :convention_id, false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20231105161432_make_run_starts_at_non_nullable.rb: -------------------------------------------------------------------------------- 1 | class MakeRunStartsAtNonNullable < ActiveRecord::Migration[7.0] 2 | def change 3 | change_column_null :runs, :starts_at, false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20231126173532_remove_not_null_on_active_storage_blobs_checksum.active_storage.rb: -------------------------------------------------------------------------------- 1 | # This migration comes from active_storage (originally 20211119233751) 2 | class RemoveNotNullOnActiveStorageBlobsChecksum < ActiveRecord::Migration[6.0] 3 | def change 4 | return unless table_exists?(:active_storage_blobs) 5 | 6 | change_column_null(:active_storage_blobs, :checksum, true) 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /db/migrate/20231126190837_add_ahoy5_index.rb: -------------------------------------------------------------------------------- 1 | class AddAhoy5Index < ActiveRecord::Migration[7.1] 2 | def change 3 | add_index :ahoy_visits, %i[visitor_token started_at] 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20231216024636_make_mepto_override_value_non_nullable.rb: -------------------------------------------------------------------------------- 1 | class MakeMeptoOverrideValueNonNullable < ActiveRecord::Migration[7.1] 2 | def change 3 | change_column_null :maximum_event_provided_tickets_overrides, :override_value, false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20240224192755_add_clickwrap_agreement_to_products.rb: -------------------------------------------------------------------------------- 1 | class AddClickwrapAgreementToProducts < ActiveRecord::Migration[7.1] 2 | def change 3 | add_column :products, :clickwrap_agreement, :text 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20240325174012_add_signup_automation_mode_to_conventions.rb: -------------------------------------------------------------------------------- 1 | class AddSignupAutomationModeToConventions < ActiveRecord::Migration[7.1] 2 | def change 3 | add_column :conventions, :signup_automation_mode, :string 4 | 5 | reversible { |dir| dir.up { Convention.update_all(signup_automation_mode: "none") } } 6 | 7 | change_column_null :conventions, :signup_automation_mode, true 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /db/migrate/20240331160734_add_default_currency_to_conventions.rb: -------------------------------------------------------------------------------- 1 | class AddDefaultCurrencyToConventions < ActiveRecord::Migration[7.1] 2 | def change 3 | add_column :conventions, :default_currency_code, :string 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20240417195945_add_unique_index_to_signup_ranked_choice_priority.rb: -------------------------------------------------------------------------------- 1 | class AddUniqueIndexToSignupRankedChoicePriority < ActiveRecord::Migration[7.1] 2 | def change 3 | add_index :signup_ranked_choices, %i[user_con_profile_id state priority], unique: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20240504163701_add_ranked_choice_order_and_executed_at_to_signup_rounds.rb: -------------------------------------------------------------------------------- 1 | class AddRankedChoiceOrderAndExecutedAtToSignupRounds < ActiveRecord::Migration[7.1] 2 | def change 3 | change_table :signup_rounds, bulk: true do |t| 4 | t.text :ranked_choice_order 5 | t.timestamp :executed_at 6 | end 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /db/migrate/20240504165651_add_ranked_choice_allow_waitlist_to_user_con_profiles.rb: -------------------------------------------------------------------------------- 1 | class AddRankedChoiceAllowWaitlistToUserConProfiles < ActiveRecord::Migration[7.1] 2 | def change 3 | add_column :user_con_profiles, :ranked_choice_allow_waitlist, :boolean, null: false, default: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20240608175912_add_signup_round_to_ranked_choice_decisions.rb: -------------------------------------------------------------------------------- 1 | class AddSignupRoundToRankedChoiceDecisions < ActiveRecord::Migration[7.1] 2 | def change 3 | add_reference :ranked_choice_decisions, :signup_round, null: false, foreign_key: true # rubocop:disable Rails/NotNullColumn 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20240620014115_add_ranked_choice_ordering_boost_to_user_con_profiles.rb: -------------------------------------------------------------------------------- 1 | class AddRankedChoiceOrderingBoostToUserConProfiles < ActiveRecord::Migration[7.1] 2 | def change 3 | add_column :user_con_profiles, :ranked_choice_ordering_boost, :integer 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20240916155847_add_disable_captcha_to_root_sites.rb: -------------------------------------------------------------------------------- 1 | class AddDisableCaptchaToRootSites < ActiveRecord::Migration[7.2] 2 | def change 3 | add_column :root_sites, :disable_captcha, :boolean, null: false, default: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20250202200327_add_prioritize_waitlist_to_signup_ranked_choices.rb: -------------------------------------------------------------------------------- 1 | class AddPrioritizeWaitlistToSignupRankedChoices < ActiveRecord::Migration[8.0] 2 | def change 3 | add_column :signup_ranked_choices, :prioritize_waitlist, :boolean, default: false, null: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20250203173940_add_meta_description_to_pages.rb: -------------------------------------------------------------------------------- 1 | class AddMetaDescriptionToPages < ActiveRecord::Migration[8.0] 2 | def change 3 | add_column :pages, :meta_description, :text 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/seeds.rb: -------------------------------------------------------------------------------- 1 | # This file should contain all the record creation needed to seed the database with its default values. 2 | # The data can then be loaded with the rake db:seed (or created alongside the db with db:setup). 3 | # 4 | # Examples: 5 | # 6 | # cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }]) 7 | # Mayor.create(name: 'Emanuel', city: cities.first) 8 | -------------------------------------------------------------------------------- /doc-site/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [require.resolve('@docusaurus/core/lib/babel/preset')], 3 | }; 4 | -------------------------------------------------------------------------------- /doc-site/blog/2019-10-03-new-intercode-schedule-design/news_20191003_legend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/doc-site/blog/2019-10-03-new-intercode-schedule-design/news_20191003_legend.png -------------------------------------------------------------------------------- /doc-site/blog/2019-10-03-new-intercode-schedule-design/news_20191003_popup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/doc-site/blog/2019-10-03-new-intercode-schedule-design/news_20191003_popup.png -------------------------------------------------------------------------------- /doc-site/blog/2019-10-03-new-intercode-schedule-design/news_20191003_run.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/doc-site/blog/2019-10-03-new-intercode-schedule-design/news_20191003_run.png -------------------------------------------------------------------------------- /doc-site/docs/concepts/forms.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 7 3 | --- 4 | 5 | # Forms 6 | 7 | TODO 8 | -------------------------------------------------------------------------------- /doc-site/docs/concepts/gender-buckets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/doc-site/docs/concepts/gender-buckets.png -------------------------------------------------------------------------------- /doc-site/docs/concepts/karaoke-buckets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/doc-site/docs/concepts/karaoke-buckets.png -------------------------------------------------------------------------------- /doc-site/docs/concepts/no-preference-buckets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/doc-site/docs/concepts/no-preference-buckets.png -------------------------------------------------------------------------------- /doc-site/docs/concepts/permissions.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 5 3 | --- 4 | 5 | # Permissions 6 | 7 | TODO 8 | -------------------------------------------------------------------------------- /doc-site/docs/concepts/store.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 6 3 | --- 4 | 5 | # Store 6 | 7 | TODO 8 | -------------------------------------------------------------------------------- /doc-site/src/components/HomepageFeatures.module.css: -------------------------------------------------------------------------------- 1 | .features { 2 | display: flex; 3 | align-items: center; 4 | padding: 2rem 0; 5 | width: 100%; 6 | } 7 | 8 | .featureSvg { 9 | height: 200px; 10 | width: 200px; 11 | } 12 | -------------------------------------------------------------------------------- /doc-site/static/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/doc-site/static/.nojekyll -------------------------------------------------------------------------------- /doc-site/static/img/docusaurus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/doc-site/static/img/docusaurus.png -------------------------------------------------------------------------------- /doc-site/static/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/doc-site/static/img/favicon.ico -------------------------------------------------------------------------------- /doc-site/static/img/neilSquare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/doc-site/static/img/neilSquare.png -------------------------------------------------------------------------------- /doc-site/static/img/tutorial/docsVersionDropdown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/doc-site/static/img/tutorial/docsVersionDropdown.png -------------------------------------------------------------------------------- /doc-site/static/img/tutorial/localeDropdown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/doc-site/static/img/tutorial/localeDropdown.png -------------------------------------------------------------------------------- /doc/README_FOR_APP: -------------------------------------------------------------------------------- 1 | Use this README file to introduce your application and point to useful places in the API for learning more. 2 | Run "rake doc:app" to generate API documentation for your models, controllers, helpers, and libraries. 3 | -------------------------------------------------------------------------------- /globalDefines.mts: -------------------------------------------------------------------------------- 1 | import { execSync } from 'child_process'; 2 | 3 | export const globalDefines = { 4 | COMMIT_HASH: JSON.stringify(execSync('git rev-parse --short HEAD').toString()), 5 | }; 6 | -------------------------------------------------------------------------------- /graphql.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | schema: 'schema.graphql', 3 | documents: 'app/javascript/**/*.{js,jsx,ts,tsx,graphql}', 4 | }; 5 | -------------------------------------------------------------------------------- /lib/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/lib/assets/.gitkeep -------------------------------------------------------------------------------- /lib/intercode/import.rb: -------------------------------------------------------------------------------- 1 | module Intercode 2 | module Import 3 | extend ActiveSupport::Autoload 4 | 5 | autoload :ImportLogger 6 | autoload :Markdownifier 7 | autoload :Table 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /lib/intercode/import/illyan.rb: -------------------------------------------------------------------------------- 1 | require 'intercode/import' 2 | 3 | module Intercode 4 | module Import 5 | module Illyan 6 | extend ActiveSupport::Autoload 7 | 8 | autoload :Importer 9 | autoload :PasswordMigration 10 | autoload :Table 11 | autoload :Tables 12 | end 13 | end 14 | end 15 | -------------------------------------------------------------------------------- /lib/intercode/import/illyan/table.rb: -------------------------------------------------------------------------------- 1 | class Intercode::Import::Illyan::Table < Intercode::Import::Table 2 | def table_name 3 | self.class.name.demodulize.downcase.to_sym 4 | end 5 | 6 | private 7 | 8 | def row_id(row) 9 | row[:id] 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /lib/intercode/import/illyan/tables.rb: -------------------------------------------------------------------------------- 1 | module Intercode::Import::Illyan::Tables 2 | extend ActiveSupport::Autoload 3 | 4 | autoload :People 5 | end 6 | -------------------------------------------------------------------------------- /lib/intercode/import/procon.rb: -------------------------------------------------------------------------------- 1 | require 'intercode/import' 2 | 3 | module Intercode 4 | module Import 5 | module Procon 6 | extend ActiveSupport::Autoload 7 | 8 | autoload :EventHelpers 9 | autoload :Importer 10 | autoload :Table 11 | autoload :Tables 12 | autoload :UserHelpers 13 | end 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /lib/intercode/import/procon/table.rb: -------------------------------------------------------------------------------- 1 | class Intercode::Import::Procon::Table < Intercode::Import::Table 2 | def table_name 3 | self.class.name.demodulize.downcase.to_sym 4 | end 5 | 6 | private 7 | 8 | def row_id(row) 9 | row[:id] 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /lib/intercode/import/procon/tables.rb: -------------------------------------------------------------------------------- 1 | module Intercode::Import::Procon::Tables 2 | extend ActiveSupport::Autoload 3 | 4 | autoload :Attendances 5 | autoload :Conventions 6 | autoload :ConventionStaffAttendances 7 | autoload :Events 8 | autoload :People 9 | autoload :ProposedEvents 10 | end 11 | -------------------------------------------------------------------------------- /lib/tasks/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/lib/tasks/.gitkeep -------------------------------------------------------------------------------- /lib/tasks/annotate_rb.rake: -------------------------------------------------------------------------------- 1 | # This rake task was added by annotate_rb gem. 2 | 3 | # Can set `ANNOTATERB_SKIP_ON_DB_TASKS` to be anything to skip this 4 | if Rails.env.development? && ENV["ANNOTATERB_SKIP_ON_DB_TASKS"].nil? 5 | require "annotate_rb" 6 | 7 | AnnotateRb::Core.load_rake_tasks 8 | end 9 | -------------------------------------------------------------------------------- /lib/tasks/cache.rake: -------------------------------------------------------------------------------- 1 | namespace :cache do 2 | desc 'Clear the Rails cache' 3 | task clear: :environment do 4 | Rails.cache.clear 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /lib/tasks/cleanup.rake: -------------------------------------------------------------------------------- 1 | desc 'Clean authentication/authorization tables' 2 | task cleanup: :environment do 3 | CleanupDbService.new.call! 4 | end 5 | -------------------------------------------------------------------------------- /lib/tasks/graphql.rake: -------------------------------------------------------------------------------- 1 | require 'graphql/rake_task' 2 | GraphQL::RakeTask.new(schema_name: 'IntercodeSchema') 3 | 4 | namespace :graphql do 5 | desc 'Dump GraphQL schema and run graphql:codegen and graphql:build_type_data' 6 | task update: 'graphql:schema:dump' do 7 | Process.exec('yarn run graphql:update') 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /lib/tasks/run_notifications.rake: -------------------------------------------------------------------------------- 1 | desc 'Enqueue all notification jobs' 2 | task run_notifications: :environment do 3 | RunNotificationsService.new.call! 4 | end 5 | -------------------------------------------------------------------------------- /log/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/log/.gitkeep -------------------------------------------------------------------------------- /postcss.config.cjs: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-var-requires */ 2 | 3 | module.exports = { 4 | plugins: [ 5 | require('autoprefixer'), 6 | ...(process.env.NODE_ENV === 'production' ? [require('cssnano')({ preset: 'default' })] : []), 7 | ], 8 | }; 9 | -------------------------------------------------------------------------------- /public/403.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Forbidden 5 | 6 | 7 |

Access Denied

8 |

You do not have permission to access this resource.

9 | 10 | 11 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/public/favicon.ico -------------------------------------------------------------------------------- /public/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/public/icon.png -------------------------------------------------------------------------------- /public/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # See https://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file 2 | -------------------------------------------------------------------------------- /script/genNginxNocache.js: -------------------------------------------------------------------------------- 1 | fs=require('fs'); 2 | 3 | for (const fname of JSON.parse(fs.readFileSync("config/nocache-files.json"))) { 4 | process.stdout.write(`location ${fname} { 5 | add_header "Cache-Control" "no-cache"; 6 | add_header "Access-Control-Allow-Origin" "*"; 7 | }\n` 8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /script/rails: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application. 3 | 4 | APP_PATH = File.expand_path('../../config/application', __FILE__) 5 | require File.expand_path('../../config/boot', __FILE__) 6 | require 'rails/commands' 7 | -------------------------------------------------------------------------------- /test/controllers/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/test/controllers/.gitkeep -------------------------------------------------------------------------------- /test/controllers/authenticity_tokens_controller_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class AuthenticityTokensControllerTest < ActionDispatch::IntegrationTest 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /test/controllers/calendars_controller_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class CalendarsControllerTest < ActionDispatch::IntegrationTest 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /test/controllers/csv_exports_controller_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class CsvExportsControllerTest < ActionDispatch::IntegrationTest 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /test/controllers/email_forwarders_controller_test.rb: -------------------------------------------------------------------------------- 1 | require "test_helper" 2 | 3 | class EmailForwardersControllerTest < ActionDispatch::IntegrationTest 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /test/controllers/graphiql_controller_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class GraphiQLControllerTest < ActionDispatch::IntegrationTest 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /test/controllers/passwords_controller_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class PasswordsControllerTest < ActionDispatch::IntegrationTest 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /test/controllers/registrations_controller_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class RegistrationsControllerTest < ActionController::TestCase 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /test/controllers/reports_controller_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class ReportsControllerTest < ActionDispatch::IntegrationTest 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /test/controllers/single_page_app_controller_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class SinglePageAppControllerTest < ActionDispatch::IntegrationTest 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /test/controllers/sitemaps_controller_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class SitemapsControllerTest < ActionDispatch::IntegrationTest 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /test/controllers/sns_notifications_controller_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class SnsNotificationsControllerTest < ActionDispatch::IntegrationTest 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /test/controllers/stripe_account_controller_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class StripeAccountControllerTest < ActionDispatch::IntegrationTest 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /test/controllers/stripe_webhooks_controller_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class StripeWebhooksControllerTest < ActionDispatch::IntegrationTest 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /test/docker-ruby-test.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -x 4 | set -e 5 | 6 | ./wait-for-it.sh postgres:5432 7 | 8 | echo "Setting up Intercode" 9 | RAILS_ENV=development bin/rake db:create db:migrate db:test:prepare 10 | 11 | bin/rails test 12 | -------------------------------------------------------------------------------- /test/factories/doorkeeper_applications.rb: -------------------------------------------------------------------------------- 1 | # Read about factories at https://github.com/thoughtbot/factory_bot 2 | 3 | FactoryBot.define do 4 | factory :doorkeeper_application, class: Doorkeeper::Application do 5 | sequence(:name) { |n| "Application #{n}" } 6 | redirect_uri { 'https://butt.holdings' } 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /test/factories/product_variant.rb: -------------------------------------------------------------------------------- 1 | # Read about factories at https://github.com/thoughtbot/factory_bot 2 | 3 | FactoryBot.define do 4 | factory :product_variant do 5 | sequence(:name) { |n| "Variant #{n}" } 6 | product 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /test/files/war_bond.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/test/files/war_bond.png -------------------------------------------------------------------------------- /test/graphql/intercode_schema_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class IntercodeSchemaTest < ActiveSupport::TestCase 4 | it 'generates a schema definition without throwing an exception' do 5 | definition = IntercodeSchema.to_definition 6 | assert_match /type Query/, definition 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /test/helpers/events_helper_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class EventsHelperTest < ActionView::TestCase 4 | end 5 | -------------------------------------------------------------------------------- /test/helpers/team_member_helper_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class TeamMemberHelperTest < ActionView::TestCase 4 | end 5 | -------------------------------------------------------------------------------- /test/integration/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/test/integration/.gitkeep -------------------------------------------------------------------------------- /test/javascript/BuiltInFormControls/graphQLAsyncSelect.queries.graphql: -------------------------------------------------------------------------------- 1 | query FakeQuery($name: String) { 2 | convention: conventionByRequestHost { 3 | id 4 | user_con_profiles_paginated(filters: { name: $name }) { 5 | entries { 6 | id 7 | name_without_nickname 8 | } 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /test/javascript/setupTests.ts: -------------------------------------------------------------------------------- 1 | import './tempPolyfills'; 2 | import '@testing-library/jest-dom/vitest'; 3 | -------------------------------------------------------------------------------- /test/javascript/tempPolyfills.js: -------------------------------------------------------------------------------- 1 | 2 | global.requestAnimationFrame = (cb) => { 3 | setTimeout(cb, 0); 4 | }; 5 | 6 | export default global.requestAnimationFrame; 7 | -------------------------------------------------------------------------------- /test/jobs/notify_event_proposal_changes_job_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class NotifyEventProposalChangesJobTest < ActiveJob::TestCase 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /test/liquid_drops/user_drop_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | describe UserDrop do 4 | let(:user) { create(:user) } 5 | let(:user_drop) { UserDrop.new(user) } 6 | 7 | %w[email first_name last_name].each do |field| 8 | it "returns the #{field} of the user" do 9 | assert_equal user.public_send(field), user_drop.public_send(field) 10 | end 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /test/mailers/previews/user_mailer_preview.rb: -------------------------------------------------------------------------------- 1 | # Preview all emails at http://localhost:3000/rails/mailers/user_mailer 2 | class UserMailerPreview < ActionMailer::Preview 3 | end 4 | -------------------------------------------------------------------------------- /test/mailers/user_mailer_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class UserMailerTest < ActionMailer::TestCase 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /test/models/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/test/models/.gitkeep -------------------------------------------------------------------------------- /test/models/cms_content_set_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | describe CmsContentSet do 4 | it 'loads metadata from content sets' do 5 | content_set = CmsContentSet.new(name: 'rock_and_romance') 6 | assert_equal ['standard'], content_set.metadata[:inherit] 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /test/models/helpers/cons_helper_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class ConsHelperTest < ActionView::TestCase 4 | end 5 | -------------------------------------------------------------------------------- /test/models/helpers/pages_helper_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class PagesHelperTest < ActionView::TestCase 4 | end 5 | -------------------------------------------------------------------------------- /vendor/assets/javascripts/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/vendor/assets/javascripts/.gitkeep -------------------------------------------------------------------------------- /vendor/assets/stylesheets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neinteractiveliterature/intercode/5f9409161e7c91dc421861867a8437a77abe3f4b/vendor/assets/stylesheets/.gitkeep --------------------------------------------------------------------------------