diff --git a/.rubocop.yml b/.rubocop.yml index 18bbf68e0fa..d849575e65d 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -56,6 +56,12 @@ Metrics/AbcSize: Exclude: - db/migrate/**/*.rb +Metrics/ClassLength: + Enabled: false + +Metrics/BlockLength: + Enabled: false + Metrics/MethodLength: CountAsOne: ['array', 'heredoc'] Max: 20 # default is 10 diff --git a/CLAUDE.md b/CLAUDE.md index c599d51b7d6..c27b50630f2 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -25,6 +25,7 @@ Intercode is a convention management system built with: - **TypeScript**: Run `yarn run tsc --noEmit` after making changes - **Ruby**: Run the relevant test suite before committing +- **GraphQL schema**: Whenever a change touches `app/graphql` (types, mutations, sources, etc.) in a way that changes the schema — new/changed/removed fields, arguments, or descriptions — run `bin/rails graphql:update` and commit the resulting changes to `schema.graphql`, `schema.json`, and the generated frontend files (`app/javascript/graphqlTypes.generated.ts`, `*.generated.ts` files, `app/graphql/graphql_operations_generated.json`, `app/javascript/possibleTypes.json`, `app/javascript/enumTypes.json`). These are checked-in generated files, not build artifacts — a PR that changes the schema without regenerating them leaves them stale for whoever touches the schema next. ## Deployment Model diff --git a/app/graphql/types/event_proposal_type.rb b/app/graphql/types/event_proposal_type.rb index efc54d3bb5a..b759ef77024 100644 --- a/app/graphql/types/event_proposal_type.rb +++ b/app/graphql/types/event_proposal_type.rb @@ -1,32 +1,46 @@ # frozen_string_literal: true class Types::EventProposalType < Types::BaseObject + description "A proposal for a new event, submitted by a convention attendee for review" + include FormResponseAttrsFields authorize_record - field :id, ID, null: false + field :id, ID, null: false, description: "The ID of this event proposal" - field :form, Types::FormType, null: true + field :form, Types::FormType, null: true, description: "The form used for this event proposal" - field :admin_notes, String, null: true do + field :admin_notes, String, null: true, description: "Admin-only notes about this event proposal" do authorize_action :read_admin_notes end - field :convention, Types::ConventionType, null: false - field :created_at, Types::DateType, null: false - field :length_seconds, Integer, null: true - field :registration_policy, Types::RegistrationPolicyType, null: true - field :status, String, null: false - field :submitted_at, Types::DateType, null: true - field :title, String, null: true - field :updated_at, Types::DateType, null: false - - field :event, Types::EventType, null: true - field :event_category, Types::EventCategoryType, null: false - field :form_response_changes, [Types::FormResponseChangeType], null: false - field :images, [Types::ActiveStorageAttachmentType], null: false - field :owner, Types::UserConProfileType, null: false - - association_loaders EventProposal, :convention, :owner, :event, :event_category + field :convention, Types::ConventionType, null: false, description: "The convention this event proposal belongs to" + field :created_at, Types::DateType, null: false, description: "When this event proposal was created" + field :length_seconds, Integer, null: true, description: "The proposed length of the event in seconds" + field :registration_policy, + Types::RegistrationPolicyType, + null: true, + description: "The proposed registration policy for this event" + field :status, String, null: false, description: "The status of this event proposal (draft, submitted, etc.)" + field :submitted_at, Types::DateType, null: true, description: "When this event proposal was submitted for review" + field :title, String, null: true, description: "The proposed title of the event" + field :updated_at, Types::DateType, null: false, description: "When this event proposal was last updated" + + field :event, Types::EventType, null: true, description: "The event created from this proposal, if it was accepted" + field :event_category, Types::EventCategoryType, null: false, description: "The category of this event proposal" + field :form_response_changes, + [Types::FormResponseChangeType], + null: false, + description: "The history of changes to this event proposal's form response" + field :images, + [Types::ActiveStorageAttachmentType], + null: false, + description: "Images attached to this event proposal" + field :owner, + Types::UserConProfileType, + null: false, + description: "The convention attendee who submitted this proposal" + + association_loaders EventProposal, :convention, :owner, :event, :event_category, :registration_policy def form event_category = dataloader.with(Sources::ActiveRecordAssociation, EventProposal, :event_category).load(object) diff --git a/app/graphql/types/event_type.rb b/app/graphql/types/event_type.rb index 7f41fca6dac..4b5d2e4e59d 100644 --- a/app/graphql/types/event_type.rb +++ b/app/graphql/types/event_type.rb @@ -111,7 +111,7 @@ class Types::EventType < Types::BaseObject field :event_category, Types::EventCategoryType, null: false, description: "The category of this event" - association_loaders Event, :event_category, :team_members, :ticket_types, :convention + association_loaders Event, :event_category, :team_members, :ticket_types, :convention, :registration_policy def form event_category = dataloader.with(Sources::ActiveRecordAssociation, Event, :event_category).load(object) @@ -139,12 +139,16 @@ def maximum_event_provided_tickets_overrides # rubocop:disable Naming/PredicateMethod def slots_limited - object.registration_policy.slots_limited? + policy = registration_policy + dataloader.with(Sources::ActiveRecordAssociation, RegistrationPolicy, :buckets).load(policy) + policy.slots_limited? end # rubocop:enable Naming/PredicateMethod def total_slots - object.registration_policy.total_slots + policy = registration_policy + dataloader.with(Sources::ActiveRecordAssociation, RegistrationPolicy, :buckets).load(policy) + policy.total_slots end def short_blurb_html diff --git a/app/graphql/types/registration_policy_type.rb b/app/graphql/types/registration_policy_type.rb index b2e42b33ca5..9ca26607b27 100644 --- a/app/graphql/types/registration_policy_type.rb +++ b/app/graphql/types/registration_policy_type.rb @@ -45,4 +45,46 @@ class Types::RegistrationPolicyType < Types::BaseObject field :total_slots_including_not_counted, Integer, null: true do # rubocop:disable GraphQL/ExtractType description "The sum of total slots across all buckets, including not-counted buckets." end + + association_loaders RegistrationPolicy, :buckets + + def minimum_slots + buckets + object.minimum_slots + end + + def minimum_slots_including_not_counted + buckets + object.minimum_slots_including_not_counted + end + + def only_uncounted # rubocop:disable Naming/PredicateMethod + buckets + object.only_uncounted? + end + + def preferred_slots + buckets + object.preferred_slots + end + + def preferred_slots_including_not_counted + buckets + object.preferred_slots_including_not_counted + end + + def slots_limited # rubocop:disable Naming/PredicateMethod + buckets + object.slots_limited? + end + + def total_slots + buckets + object.total_slots + end + + def total_slots_including_not_counted + buckets + object.total_slots_including_not_counted + end end diff --git a/app/javascript/EventAdmin/mutations.generated.ts b/app/javascript/EventAdmin/mutations.generated.ts index 4e43912ca89..04b42776db8 100644 --- a/app/javascript/EventAdmin/mutations.generated.ts +++ b/app/javascript/EventAdmin/mutations.generated.ts @@ -18,7 +18,9 @@ export type BucketKeyMappingInput = { export type CreateEventInput = { /** A unique identifier for the client performing the mutation. */ clientMutationId?: string | null | undefined; + /** The event attributes */ event: EventInput; + /** Signed blob IDs for images to attach to this event */ signedImageBlobIds?: Array | null | undefined; }; @@ -26,8 +28,11 @@ export type CreateEventInput = { export type CreateFillerEventInput = { /** A unique identifier for the client performing the mutation. */ clientMutationId?: string | null | undefined; + /** The event attributes */ event: EventInput; + /** The initial run to create for this event */ run?: RunInput | null | undefined; + /** Signed blob IDs for images to attach to this event */ signedImageBlobIds?: Array | null | undefined; }; diff --git a/app/javascript/EventProposals/mutations.generated.ts b/app/javascript/EventProposals/mutations.generated.ts index 128672bc4d7..d3123af8162 100644 --- a/app/javascript/EventProposals/mutations.generated.ts +++ b/app/javascript/EventProposals/mutations.generated.ts @@ -42,7 +42,9 @@ export type SubmitEventProposalInput = { export type UpdateEventProposalInput = { /** A unique identifier for the client performing the mutation. */ clientMutationId?: string | null | undefined; + /** The event proposal attributes to update */ event_proposal: EventProposalInput; + /** The ID of the event proposal to update */ id?: string | number | null | undefined; }; diff --git a/app/javascript/graphqlTypes.generated.ts b/app/javascript/graphqlTypes.generated.ts index 6cf430cceb0..5621e10c2f1 100644 --- a/app/javascript/graphqlTypes.generated.ts +++ b/app/javascript/graphqlTypes.generated.ts @@ -235,7 +235,9 @@ export type ActiveStorageAttachmentResized_UrlArgs = { export type AddOrderEntryToCurrentPendingOrderInput = { /** A unique identifier for the client performing the mutation. */ clientMutationId?: InputMaybe; + /** The order entry to add. */ order_entry: OrderEntryInput; + /** The amount to charge, if this is a pay-what-you-want product. */ pay_what_you_want_amount?: InputMaybe; }; @@ -244,6 +246,7 @@ export type AddOrderEntryToCurrentPendingOrderPayload = { __typename: 'AddOrderEntryToCurrentPendingOrderPayload'; /** A unique identifier for the client performing the mutation. */ clientMutationId?: Maybe; + /** The order entry that was added or updated. */ order_entry: OrderEntry; }; @@ -1850,7 +1853,9 @@ export type CreateEventCategoryPayload = { export type CreateEventInput = { /** A unique identifier for the client performing the mutation. */ clientMutationId?: InputMaybe; + /** The event attributes */ event: EventInput; + /** Signed blob IDs for images to attach to this event */ signedImageBlobIds?: InputMaybe>; }; @@ -1859,6 +1864,7 @@ export type CreateEventPayload = { __typename: 'CreateEventPayload'; /** A unique identifier for the client performing the mutation. */ clientMutationId?: Maybe; + /** The newly-created event */ event: Event; }; @@ -1866,7 +1872,9 @@ export type CreateEventPayload = { export type CreateEventProposalInput = { /** A unique identifier for the client performing the mutation. */ clientMutationId?: InputMaybe; + /** The ID of an existing event proposal to copy compatible form values from */ cloneEventProposalId?: InputMaybe; + /** The ID of the event category the new proposal belongs to */ eventCategoryId?: InputMaybe; }; @@ -1875,6 +1883,7 @@ export type CreateEventProposalPayload = { __typename: 'CreateEventProposalPayload'; /** A unique identifier for the client performing the mutation. */ clientMutationId?: Maybe; + /** The newly-created event proposal */ event_proposal: EventProposal; }; @@ -1882,8 +1891,11 @@ export type CreateEventProposalPayload = { export type CreateFillerEventInput = { /** A unique identifier for the client performing the mutation. */ clientMutationId?: InputMaybe; + /** The event attributes */ event: EventInput; + /** The initial run to create for this event */ run?: InputMaybe; + /** Signed blob IDs for images to attach to this event */ signedImageBlobIds?: InputMaybe>; }; @@ -1892,6 +1904,7 @@ export type CreateFillerEventPayload = { __typename: 'CreateFillerEventPayload'; /** A unique identifier for the client performing the mutation. */ clientMutationId?: Maybe; + /** The newly-created event */ event: Event; }; @@ -3102,36 +3115,55 @@ export type EventInput = { removeImageBlobIds?: InputMaybe>; }; +/** A proposal for a new event, submitted by a convention attendee for review */ export type EventProposal = { __typename: 'EventProposal'; + /** Admin-only notes about this event proposal */ admin_notes?: Maybe; + /** The convention this event proposal belongs to */ convention: Convention; + /** When this event proposal was created */ created_at: Scalars['Date']['output']; current_user_form_item_viewer_role: FormItemRole; current_user_form_item_writer_role: FormItemRole; + /** The event created from this proposal, if it was accepted */ event?: Maybe; + /** The category of this event proposal */ event_category: EventCategory; + /** The form used for this event proposal */ form?: Maybe
; form_response_attrs_json?: Maybe; form_response_attrs_json_with_rendered_markdown?: Maybe; + /** The history of changes to this event proposal's form response */ form_response_changes: Array; + /** The ID of this event proposal */ id: Scalars['ID']['output']; + /** Images attached to this event proposal */ images: Array; + /** The proposed length of the event in seconds */ length_seconds?: Maybe; + /** The convention attendee who submitted this proposal */ owner: UserConProfile; + /** The proposed registration policy for this event */ registration_policy?: Maybe; + /** The status of this event proposal (draft, submitted, etc.) */ status: Scalars['String']['output']; + /** When this event proposal was submitted for review */ submitted_at?: Maybe; + /** The proposed title of the event */ title?: Maybe; + /** When this event proposal was last updated */ updated_at: Scalars['Date']['output']; }; +/** A proposal for a new event, submitted by a convention attendee for review */ export type EventProposalForm_Response_Attrs_JsonArgs = { itemIdentifiers?: InputMaybe>; }; +/** A proposal for a new event, submitted by a convention attendee for review */ export type EventProposalForm_Response_Attrs_Json_With_Rendered_MarkdownArgs = { itemIdentifiers?: InputMaybe>; }; @@ -3467,6 +3499,7 @@ export type Mutation = { __typename: 'Mutation'; acceptClickwrapAgreement: AcceptClickwrapAgreementPayload; acceptSignupRequest: AcceptSignupRequestPayload; + /** Adds an order entry to the current user's pending order, creating one if necessary. */ addOrderEntryToCurrentPendingOrder: AddOrderEntryToCurrentPendingOrderPayload; attachImageToEvent: AttachImageToEventPayload; attachImageToEventProposal: AttachImageToEventProposalPayload; @@ -3485,9 +3518,12 @@ export type Mutation = { createCouponApplication: CreateCouponApplicationPayload; createDepartment: CreateDepartmentPayload; createEmailRoute: CreateEmailRoutePayload; + /** Create a new event */ createEvent: CreateEventPayload; createEventCategory: CreateEventCategoryPayload; + /** Create a new event proposal, optionally cloning form values from an existing one */ createEventProposal: CreateEventProposalPayload; + /** Create a new filler event (a single-run event with no signup process, e.g. an ongoing activity) */ createFillerEvent: CreateFillerEventPayload; /** Create a new form in a convention. */ createForm: CreateFormPayload; @@ -3617,6 +3653,7 @@ export type Mutation = { updateEvent: UpdateEventPayload; updateEventAdminNotes: UpdateEventAdminNotesPayload; updateEventCategory: UpdateEventCategoryPayload; + /** Update an event proposal */ updateEventProposal: UpdateEventProposalPayload; updateEventProposalAdminNotes: UpdateEventProposalAdminNotesPayload; updateForm: UpdateFormPayload; @@ -6730,7 +6767,9 @@ export type UpdateEventProposalAdminNotesPayload = { export type UpdateEventProposalInput = { /** A unique identifier for the client performing the mutation. */ clientMutationId?: InputMaybe; + /** The event proposal attributes to update */ event_proposal: EventProposalInput; + /** The ID of the event proposal to update */ id?: InputMaybe; }; @@ -6739,6 +6778,7 @@ export type UpdateEventProposalPayload = { __typename: 'UpdateEventProposalPayload'; /** A unique identifier for the client performing the mutation. */ clientMutationId?: Maybe; + /** The updated event proposal */ event_proposal: EventProposal; }; diff --git a/schema.graphql b/schema.graphql index 6f23ef02e8d..b884d1389e6 100644 --- a/schema.graphql +++ b/schema.graphql @@ -124,7 +124,15 @@ input AddOrderEntryToCurrentPendingOrderInput { A unique identifier for the client performing the mutation. """ clientMutationId: String + + """ + The order entry to add. + """ order_entry: OrderEntryInput! + + """ + The amount to charge, if this is a pay-what-you-want product. + """ pay_what_you_want_amount: MoneyInput } @@ -136,6 +144,10 @@ type AddOrderEntryToCurrentPendingOrderPayload { A unique identifier for the client performing the mutation. """ clientMutationId: String + + """ + The order entry that was added or updated. + """ order_entry: OrderEntry! } @@ -2117,7 +2129,15 @@ input CreateEventInput { A unique identifier for the client performing the mutation. """ clientMutationId: String + + """ + The event attributes + """ event: EventInput! + + """ + Signed blob IDs for images to attach to this event + """ signedImageBlobIds: [ID!] } @@ -2129,6 +2149,10 @@ type CreateEventPayload { A unique identifier for the client performing the mutation. """ clientMutationId: String + + """ + The newly-created event + """ event: Event! } @@ -2140,7 +2164,15 @@ input CreateEventProposalInput { A unique identifier for the client performing the mutation. """ clientMutationId: String + + """ + The ID of an existing event proposal to copy compatible form values from + """ cloneEventProposalId: ID + + """ + The ID of the event category the new proposal belongs to + """ eventCategoryId: ID } @@ -2152,6 +2184,10 @@ type CreateEventProposalPayload { A unique identifier for the client performing the mutation. """ clientMutationId: String + + """ + The newly-created event proposal + """ event_proposal: EventProposal! } @@ -2163,8 +2199,20 @@ input CreateFillerEventInput { A unique identifier for the client performing the mutation. """ clientMutationId: String + + """ + The event attributes + """ event: EventInput! + + """ + The initial run to create for this event + """ run: RunInput + + """ + Signed blob IDs for images to attach to this event + """ signedImageBlobIds: [ID!] } @@ -2176,6 +2224,10 @@ type CreateFillerEventPayload { A unique identifier for the client performing the mutation. """ clientMutationId: String + + """ + The newly-created event + """ event: Event! } @@ -4036,26 +4088,92 @@ input EventInput { removeImageBlobIds: [ID!] } +""" +A proposal for a new event, submitted by a convention attendee for review +""" type EventProposal { + """ + Admin-only notes about this event proposal + """ admin_notes: String + + """ + The convention this event proposal belongs to + """ convention: Convention! + + """ + When this event proposal was created + """ created_at: Date! current_user_form_item_viewer_role: FormItemRole! current_user_form_item_writer_role: FormItemRole! + + """ + The event created from this proposal, if it was accepted + """ event: Event + + """ + The category of this event proposal + """ event_category: EventCategory! + + """ + The form used for this event proposal + """ form: Form form_response_attrs_json(itemIdentifiers: [String!]): Json form_response_attrs_json_with_rendered_markdown(itemIdentifiers: [String!]): Json + + """ + The history of changes to this event proposal's form response + """ form_response_changes: [FormResponseChange!]! + + """ + The ID of this event proposal + """ id: ID! + + """ + Images attached to this event proposal + """ images: [ActiveStorageAttachment!]! + + """ + The proposed length of the event in seconds + """ length_seconds: Int + + """ + The convention attendee who submitted this proposal + """ owner: UserConProfile! + + """ + The proposed registration policy for this event + """ registration_policy: RegistrationPolicy + + """ + The status of this event proposal (draft, submitted, etc.) + """ status: String! + + """ + When this event proposal was submitted for review + """ submitted_at: Date + + """ + The proposed title of the event + """ title: String + + """ + When this event proposal was last updated + """ updated_at: Date! } @@ -4471,6 +4589,10 @@ type Mutation { """ input: AcceptSignupRequestInput! ): AcceptSignupRequestPayload! + + """ + Adds an order entry to the current user's pending order, creating one if necessary. + """ addOrderEntryToCurrentPendingOrder( """ Parameters for AddOrderEntryToCurrentPendingOrder @@ -4577,6 +4699,10 @@ type Mutation { """ input: CreateEmailRouteInput! ): CreateEmailRoutePayload! + + """ + Create a new event + """ createEvent( """ Parameters for CreateEvent @@ -4589,12 +4715,20 @@ type Mutation { """ input: CreateEventCategoryInput! ): CreateEventCategoryPayload! + + """ + Create a new event proposal, optionally cloning form values from an existing one + """ createEventProposal( """ Parameters for CreateEventProposal """ input: CreateEventProposalInput! ): CreateEventProposalPayload! + + """ + Create a new filler event (a single-run event with no signup process, e.g. an ongoing activity) + """ createFillerEvent( """ Parameters for CreateFillerEvent @@ -5260,6 +5394,10 @@ type Mutation { """ input: UpdateEventCategoryInput! ): UpdateEventCategoryPayload! + + """ + Update an event proposal + """ updateEventProposal( """ Parameters for UpdateEventProposal @@ -8936,7 +9074,15 @@ input UpdateEventProposalInput { A unique identifier for the client performing the mutation. """ clientMutationId: String + + """ + The event proposal attributes to update + """ event_proposal: EventProposalInput! + + """ + The ID of the event proposal to update + """ id: ID } @@ -8948,6 +9094,10 @@ type UpdateEventProposalPayload { A unique identifier for the client performing the mutation. """ clientMutationId: String + + """ + The updated event proposal + """ event_proposal: EventProposal! } diff --git a/schema.json b/schema.json index 0f1d8c4a793..1340c4bfc2c 100644 --- a/schema.json +++ b/schema.json @@ -1495,7 +1495,7 @@ }, { "name": "order_entry", - "description": null, + "description": "The order entry to add.", "type": { "kind": "NON_NULL", "name": null, @@ -1511,7 +1511,7 @@ }, { "name": "pay_what_you_want_amount", - "description": null, + "description": "The amount to charge, if this is a pay-what-you-want product.", "type": { "kind": "INPUT_OBJECT", "name": "MoneyInput", @@ -1545,7 +1545,7 @@ }, { "name": "order_entry", - "description": null, + "description": "The order entry that was added or updated.", "type": { "kind": "NON_NULL", "name": null, @@ -9032,7 +9032,7 @@ }, { "name": "event", - "description": null, + "description": "The event attributes", "type": { "kind": "NON_NULL", "name": null, @@ -9048,7 +9048,7 @@ }, { "name": "signedImageBlobIds", - "description": null, + "description": "Signed blob IDs for images to attach to this event", "type": { "kind": "LIST", "name": null, @@ -9090,7 +9090,7 @@ }, { "name": "event", - "description": null, + "description": "The newly-created event", "type": { "kind": "NON_NULL", "name": null, @@ -9130,7 +9130,7 @@ }, { "name": "cloneEventProposalId", - "description": null, + "description": "The ID of an existing event proposal to copy compatible form values from", "type": { "kind": "SCALAR", "name": "ID", @@ -9142,7 +9142,7 @@ }, { "name": "eventCategoryId", - "description": null, + "description": "The ID of the event category the new proposal belongs to", "type": { "kind": "SCALAR", "name": "ID", @@ -9176,7 +9176,7 @@ }, { "name": "event_proposal", - "description": null, + "description": "The newly-created event proposal", "type": { "kind": "NON_NULL", "name": null, @@ -9216,7 +9216,7 @@ }, { "name": "event", - "description": null, + "description": "The event attributes", "type": { "kind": "NON_NULL", "name": null, @@ -9232,7 +9232,7 @@ }, { "name": "run", - "description": null, + "description": "The initial run to create for this event", "type": { "kind": "INPUT_OBJECT", "name": "RunInput", @@ -9244,7 +9244,7 @@ }, { "name": "signedImageBlobIds", - "description": null, + "description": "Signed blob IDs for images to attach to this event", "type": { "kind": "LIST", "name": null, @@ -9286,7 +9286,7 @@ }, { "name": "event", - "description": null, + "description": "The newly-created event", "type": { "kind": "NON_NULL", "name": null, @@ -16198,13 +16198,13 @@ { "kind": "OBJECT", "name": "EventProposal", - "description": null, + "description": "A proposal for a new event, submitted by a convention attendee for review", "interfaces": [], "possibleTypes": null, "fields": [ { "name": "admin_notes", - "description": null, + "description": "Admin-only notes about this event proposal", "type": { "kind": "SCALAR", "name": "String", @@ -16216,7 +16216,7 @@ }, { "name": "convention", - "description": null, + "description": "The convention this event proposal belongs to", "type": { "kind": "NON_NULL", "name": null, @@ -16232,7 +16232,7 @@ }, { "name": "created_at", - "description": null, + "description": "When this event proposal was created", "type": { "kind": "NON_NULL", "name": null, @@ -16280,7 +16280,7 @@ }, { "name": "event", - "description": null, + "description": "The event created from this proposal, if it was accepted", "type": { "kind": "OBJECT", "name": "Event", @@ -16292,7 +16292,7 @@ }, { "name": "event_category", - "description": null, + "description": "The category of this event proposal", "type": { "kind": "NON_NULL", "name": null, @@ -16308,7 +16308,7 @@ }, { "name": "form", - "description": null, + "description": "The form used for this event proposal", "type": { "kind": "OBJECT", "name": "Form", @@ -16386,7 +16386,7 @@ }, { "name": "form_response_changes", - "description": null, + "description": "The history of changes to this event proposal's form response", "type": { "kind": "NON_NULL", "name": null, @@ -16410,7 +16410,7 @@ }, { "name": "id", - "description": null, + "description": "The ID of this event proposal", "type": { "kind": "NON_NULL", "name": null, @@ -16426,7 +16426,7 @@ }, { "name": "images", - "description": null, + "description": "Images attached to this event proposal", "type": { "kind": "NON_NULL", "name": null, @@ -16450,7 +16450,7 @@ }, { "name": "length_seconds", - "description": null, + "description": "The proposed length of the event in seconds", "type": { "kind": "SCALAR", "name": "Int", @@ -16462,7 +16462,7 @@ }, { "name": "owner", - "description": null, + "description": "The convention attendee who submitted this proposal", "type": { "kind": "NON_NULL", "name": null, @@ -16478,7 +16478,7 @@ }, { "name": "registration_policy", - "description": null, + "description": "The proposed registration policy for this event", "type": { "kind": "OBJECT", "name": "RegistrationPolicy", @@ -16490,7 +16490,7 @@ }, { "name": "status", - "description": null, + "description": "The status of this event proposal (draft, submitted, etc.)", "type": { "kind": "NON_NULL", "name": null, @@ -16506,7 +16506,7 @@ }, { "name": "submitted_at", - "description": null, + "description": "When this event proposal was submitted for review", "type": { "kind": "SCALAR", "name": "Date", @@ -16518,7 +16518,7 @@ }, { "name": "title", - "description": null, + "description": "The proposed title of the event", "type": { "kind": "SCALAR", "name": "String", @@ -16530,7 +16530,7 @@ }, { "name": "updated_at", - "description": null, + "description": "When this event proposal was last updated", "type": { "kind": "NON_NULL", "name": null, @@ -19220,7 +19220,7 @@ }, { "name": "addOrderEntryToCurrentPendingOrder", - "description": null, + "description": "Adds an order entry to the current user's pending order, creating one if necessary.", "type": { "kind": "NON_NULL", "name": null, @@ -19781,7 +19781,7 @@ }, { "name": "createEvent", - "description": null, + "description": "Create a new event", "type": { "kind": "NON_NULL", "name": null, @@ -19847,7 +19847,7 @@ }, { "name": "createEventProposal", - "description": null, + "description": "Create a new event proposal, optionally cloning form values from an existing one", "type": { "kind": "NON_NULL", "name": null, @@ -19880,7 +19880,7 @@ }, { "name": "createFillerEvent", - "description": null, + "description": "Create a new filler event (a single-run event with no signup process, e.g. an ongoing activity)", "type": { "kind": "NON_NULL", "name": null, @@ -23081,7 +23081,7 @@ }, { "name": "updateEventProposal", - "description": null, + "description": "Update an event proposal", "type": { "kind": "NON_NULL", "name": null, @@ -37758,7 +37758,7 @@ }, { "name": "event_proposal", - "description": null, + "description": "The event proposal attributes to update", "type": { "kind": "NON_NULL", "name": null, @@ -37774,7 +37774,7 @@ }, { "name": "id", - "description": null, + "description": "The ID of the event proposal to update", "type": { "kind": "SCALAR", "name": "ID", @@ -37808,7 +37808,7 @@ }, { "name": "event_proposal", - "description": null, + "description": "The updated event proposal", "type": { "kind": "NON_NULL", "name": null,