├── static ├── .nojekyll ├── CNAME └── img │ ├── favicon.ico │ ├── promo │ ├── HR.png │ ├── EventStore.png │ ├── VendorHall.png │ ├── ExpressMode.png │ ├── AttendeeRegistration.png │ └── VouchersDiscountsAddons.png │ ├── ConCatHero.png │ ├── ConCatLogo.ico │ ├── docusaurus.png │ ├── cashier │ ├── add_scanner.png │ ├── badgeTypePrinter.png │ ├── select_printer.png │ └── barcodes │ │ ├── 05_usb_com.png │ │ ├── 02_low_volume.PNG │ │ ├── 03_disable_all.PNG │ │ ├── 01_factory_reset.PNG │ │ ├── 04_enable_pdf417.PNG │ │ └── TEEMI_2D_Barcode_Scanner_Manual.pdf │ ├── tutorial │ ├── fulfillOrder.png │ ├── badgeDesigner.png │ ├── localeDropdown.png │ ├── productDiscount.png │ ├── docsVersionDropdown.png │ ├── productOptionAssign.png │ ├── productOptionCreate.png │ ├── surchargeAddTaxRate.png │ ├── badgeDesigner-prePrintedCanvas.png │ └── emailTemplates │ │ ├── parseErrorPreview.png │ │ ├── waterfallExample.png │ │ ├── disableExampleEditor.png │ │ ├── validTemplateEditor.png │ │ ├── validTemplatePreview.png │ │ ├── disableExampleOverview.png │ │ ├── variableMissingEditor.png │ │ ├── volunteerConfirmEditor.png │ │ ├── volunteerConfirmListEntry.png │ │ ├── volunteerConfirmOverview.png │ │ ├── volunteerConfirmVariables.png │ │ ├── volunteerConfirmActiveOverride.png │ │ └── volunteerConfirmOverriddenListEntry.png │ ├── gif │ └── transfer-registration.gif │ └── undraw_docusaurus_tree.svg ├── declarations.d.ts ├── .vscode └── settings.json ├── docs ├── api │ ├── _category_.json │ ├── errors │ │ ├── _category_.json │ │ ├── logicerrorcodes.mdx │ │ └── errors.mdx │ ├── endpoints │ │ ├── v0 │ │ │ ├── _category_.json │ │ │ ├── _registrationModel.mdx │ │ │ ├── _volunteerModel.mdx │ │ │ ├── roles.mdx │ │ │ ├── registration.mdx │ │ │ ├── volunteers.mdx │ │ │ └── users.mdx │ │ ├── _category_.json │ │ └── legacy │ │ │ ├── _category_.json │ │ │ └── users.mdx │ ├── gettingstarted │ │ ├── _category_.json │ │ ├── scopes.md │ │ ├── gettingstarted.md │ │ └── oauth.md │ └── intro.md └── guides │ ├── dealers │ ├── _category_.json │ ├── tickets.md │ └── managment.md │ ├── orders │ ├── _category_.json │ └── orders.md │ ├── products │ ├── _category_.json │ ├── productimages.md │ ├── addons.md │ ├── discounts.md │ ├── surcharges.md │ ├── options.md │ └── products.md │ ├── templates │ ├── _category_.json │ └── templates.md │ ├── usernotes │ ├── _category_.json │ └── usernotes.md │ ├── registration │ ├── _category_.json │ ├── cashier │ │ ├── _category_.json │ │ ├── scanner.md │ │ └── cashier.md │ ├── attendance │ │ ├── _category_.json │ │ └── attendance.md │ ├── transfer.md │ ├── raffle.md │ └── badge_designer.md │ ├── volunteers │ ├── _category_.json │ └── volunteers.md │ ├── intro.md │ └── convention_checklist.md ├── babel.config.js ├── src ├── css │ ├── _variables.scss │ └── custom.scss ├── components │ ├── splitcolumn.module.scss │ ├── HomepageFeatures │ │ ├── styles.module.css │ │ └── index.tsx │ ├── MaterialIcon.tsx │ ├── RESTList.tsx │ ├── card.module.scss │ ├── SplitColumn.tsx │ ├── Card.tsx │ ├── RESTElement.tsx │ ├── Highlight.tsx │ ├── restlist.module.scss │ ├── EndpointResponse.tsx │ ├── EndpointRequest.tsx │ ├── bigbutton.module.scss │ ├── restelement.module.scss │ ├── ExampleBox.tsx │ ├── BigButton.tsx │ ├── endpointrequest.module.scss │ ├── featurelist.module.scss │ ├── attribute.module.scss │ ├── Attribute.tsx │ └── FeatureList.tsx ├── pages │ ├── policy │ │ ├── policy.module.scss │ │ └── dmca.tsx │ ├── pricing.module.scss │ ├── index.module.scss │ ├── index.tsx │ └── pricing.tsx └── theme │ └── MDXComponents.tsx ├── tsconfig.json ├── .gitignore ├── sidebars.js ├── README.md ├── package.json └── docusaurus.config.js /static/.nojekyll: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/CNAME: -------------------------------------------------------------------------------- 1 | concat.app -------------------------------------------------------------------------------- /declarations.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.scss'; -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.tabSize": 2 3 | } -------------------------------------------------------------------------------- /docs/api/_category_.json: -------------------------------------------------------------------------------- 1 | { 2 | "label": "API Reference", 3 | "position": 5 4 | } 5 | -------------------------------------------------------------------------------- /docs/api/errors/_category_.json: -------------------------------------------------------------------------------- 1 | { 2 | "label": "Errors", 3 | "position": 3 4 | } 5 | -------------------------------------------------------------------------------- /docs/api/endpoints/v0/_category_.json: -------------------------------------------------------------------------------- 1 | { 2 | "label": "v0", 3 | "position": 2 4 | } 5 | -------------------------------------------------------------------------------- /docs/guides/dealers/_category_.json: -------------------------------------------------------------------------------- 1 | { 2 | "label": "Dealers", 3 | "position": 4 4 | } 5 | -------------------------------------------------------------------------------- /docs/guides/orders/_category_.json: -------------------------------------------------------------------------------- 1 | { 2 | "label": "Orders", 3 | "position": 4 4 | } 5 | -------------------------------------------------------------------------------- /docs/api/endpoints/_category_.json: -------------------------------------------------------------------------------- 1 | { 2 | "label": "Endpoints", 3 | "position": 4 4 | } 5 | -------------------------------------------------------------------------------- /docs/guides/products/_category_.json: -------------------------------------------------------------------------------- 1 | { 2 | "label": "Products", 3 | "position": 3 4 | } 5 | -------------------------------------------------------------------------------- /docs/guides/templates/_category_.json: -------------------------------------------------------------------------------- 1 | { 2 | "label": "Email Templates", 3 | "position": 4 4 | } -------------------------------------------------------------------------------- /docs/guides/usernotes/_category_.json: -------------------------------------------------------------------------------- 1 | { 2 | "label": "User Notes", 3 | "position": 5 4 | } 5 | -------------------------------------------------------------------------------- /docs/api/endpoints/legacy/_category_.json: -------------------------------------------------------------------------------- 1 | { 2 | "label": "Legacy API", 3 | "position": 1 4 | } 5 | -------------------------------------------------------------------------------- /docs/guides/registration/_category_.json: -------------------------------------------------------------------------------- 1 | { 2 | "label": "Registration", 3 | "position": 2 4 | } 5 | -------------------------------------------------------------------------------- /docs/guides/volunteers/_category_.json: -------------------------------------------------------------------------------- 1 | { 2 | "label": "Volunteers", 3 | "position": 4 4 | } 5 | -------------------------------------------------------------------------------- /docs/api/gettingstarted/_category_.json: -------------------------------------------------------------------------------- 1 | { 2 | "label": "Getting Started", 3 | "position": 2 4 | } 5 | -------------------------------------------------------------------------------- /docs/guides/registration/cashier/_category_.json: -------------------------------------------------------------------------------- 1 | { 2 | "label": "Cashier", 3 | "position": 1 4 | } 5 | -------------------------------------------------------------------------------- /static/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/favicon.ico -------------------------------------------------------------------------------- /static/img/promo/HR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/promo/HR.png -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [require.resolve('@docusaurus/core/lib/babel/preset')], 3 | }; 4 | -------------------------------------------------------------------------------- /docs/guides/registration/attendance/_category_.json: -------------------------------------------------------------------------------- 1 | { 2 | "label": "Attendance Tiers", 3 | "position": 1 4 | } 5 | -------------------------------------------------------------------------------- /static/img/ConCatHero.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/ConCatHero.png -------------------------------------------------------------------------------- /static/img/ConCatLogo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/ConCatLogo.ico -------------------------------------------------------------------------------- /static/img/docusaurus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/docusaurus.png -------------------------------------------------------------------------------- /static/img/promo/EventStore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/promo/EventStore.png -------------------------------------------------------------------------------- /static/img/promo/VendorHall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/promo/VendorHall.png -------------------------------------------------------------------------------- /static/img/cashier/add_scanner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/cashier/add_scanner.png -------------------------------------------------------------------------------- /static/img/promo/ExpressMode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/promo/ExpressMode.png -------------------------------------------------------------------------------- /static/img/tutorial/fulfillOrder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/tutorial/fulfillOrder.png -------------------------------------------------------------------------------- /static/img/cashier/badgeTypePrinter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/cashier/badgeTypePrinter.png -------------------------------------------------------------------------------- /static/img/cashier/select_printer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/cashier/select_printer.png -------------------------------------------------------------------------------- /static/img/tutorial/badgeDesigner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/tutorial/badgeDesigner.png -------------------------------------------------------------------------------- /static/img/tutorial/localeDropdown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/tutorial/localeDropdown.png -------------------------------------------------------------------------------- /static/img/tutorial/productDiscount.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/tutorial/productDiscount.png -------------------------------------------------------------------------------- /static/img/gif/transfer-registration.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/gif/transfer-registration.gif -------------------------------------------------------------------------------- /static/img/promo/AttendeeRegistration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/promo/AttendeeRegistration.png -------------------------------------------------------------------------------- /static/img/cashier/barcodes/05_usb_com.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/cashier/barcodes/05_usb_com.png -------------------------------------------------------------------------------- /static/img/promo/VouchersDiscountsAddons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/promo/VouchersDiscountsAddons.png -------------------------------------------------------------------------------- /static/img/tutorial/docsVersionDropdown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/tutorial/docsVersionDropdown.png -------------------------------------------------------------------------------- /static/img/tutorial/productOptionAssign.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/tutorial/productOptionAssign.png -------------------------------------------------------------------------------- /static/img/tutorial/productOptionCreate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/tutorial/productOptionCreate.png -------------------------------------------------------------------------------- /static/img/tutorial/surchargeAddTaxRate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/tutorial/surchargeAddTaxRate.png -------------------------------------------------------------------------------- /static/img/cashier/barcodes/02_low_volume.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/cashier/barcodes/02_low_volume.PNG -------------------------------------------------------------------------------- /static/img/cashier/barcodes/03_disable_all.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/cashier/barcodes/03_disable_all.PNG -------------------------------------------------------------------------------- /src/css/_variables.scss: -------------------------------------------------------------------------------- 1 | $brand-primary: #0670ad !default; 2 | $brand-accent: #ebecf0 !default; 3 | $brand-dark: #253858 !default; 4 | $brand-mid: #42526e !default; -------------------------------------------------------------------------------- /static/img/cashier/barcodes/01_factory_reset.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/cashier/barcodes/01_factory_reset.PNG -------------------------------------------------------------------------------- /static/img/cashier/barcodes/04_enable_pdf417.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/cashier/barcodes/04_enable_pdf417.PNG -------------------------------------------------------------------------------- /src/components/splitcolumn.module.scss: -------------------------------------------------------------------------------- 1 | .splitcolumn { 2 | display: grid; 3 | grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); 4 | grid-gap: 1rem; 5 | } -------------------------------------------------------------------------------- /static/img/tutorial/badgeDesigner-prePrintedCanvas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/tutorial/badgeDesigner-prePrintedCanvas.png -------------------------------------------------------------------------------- /static/img/tutorial/emailTemplates/parseErrorPreview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/tutorial/emailTemplates/parseErrorPreview.png -------------------------------------------------------------------------------- /static/img/tutorial/emailTemplates/waterfallExample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/tutorial/emailTemplates/waterfallExample.png -------------------------------------------------------------------------------- /static/img/tutorial/emailTemplates/disableExampleEditor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/tutorial/emailTemplates/disableExampleEditor.png -------------------------------------------------------------------------------- /static/img/tutorial/emailTemplates/validTemplateEditor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/tutorial/emailTemplates/validTemplateEditor.png -------------------------------------------------------------------------------- /static/img/tutorial/emailTemplates/validTemplatePreview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/tutorial/emailTemplates/validTemplatePreview.png -------------------------------------------------------------------------------- /static/img/tutorial/emailTemplates/disableExampleOverview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/tutorial/emailTemplates/disableExampleOverview.png -------------------------------------------------------------------------------- /static/img/tutorial/emailTemplates/variableMissingEditor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/tutorial/emailTemplates/variableMissingEditor.png -------------------------------------------------------------------------------- /static/img/tutorial/emailTemplates/volunteerConfirmEditor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/tutorial/emailTemplates/volunteerConfirmEditor.png -------------------------------------------------------------------------------- /static/img/cashier/barcodes/TEEMI_2D_Barcode_Scanner_Manual.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/cashier/barcodes/TEEMI_2D_Barcode_Scanner_Manual.pdf -------------------------------------------------------------------------------- /static/img/tutorial/emailTemplates/volunteerConfirmListEntry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/tutorial/emailTemplates/volunteerConfirmListEntry.png -------------------------------------------------------------------------------- /static/img/tutorial/emailTemplates/volunteerConfirmOverview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/tutorial/emailTemplates/volunteerConfirmOverview.png -------------------------------------------------------------------------------- /static/img/tutorial/emailTemplates/volunteerConfirmVariables.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/tutorial/emailTemplates/volunteerConfirmVariables.png -------------------------------------------------------------------------------- /static/img/tutorial/emailTemplates/volunteerConfirmActiveOverride.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/tutorial/emailTemplates/volunteerConfirmActiveOverride.png -------------------------------------------------------------------------------- /static/img/tutorial/emailTemplates/volunteerConfirmOverriddenListEntry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConventionCatCorp/concat-docs/HEAD/static/img/tutorial/emailTemplates/volunteerConfirmOverriddenListEntry.png -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | // This file is not used in compilation. It is here just for a nice editor experience. 3 | "extends": "@tsconfig/docusaurus/tsconfig.json", 4 | "compilerOptions": { 5 | "baseUrl": "." 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/components/HomepageFeatures/styles.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 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Dependencies 2 | /node_modules 3 | 4 | # Production 5 | /build 6 | 7 | # Generated files 8 | .docusaurus 9 | .cache-loader 10 | 11 | # Misc 12 | .DS_Store 13 | .env.local 14 | .env.development.local 15 | .env.test.local 16 | .env.production.local 17 | 18 | npm-debug.log* 19 | yarn-debug.log* 20 | yarn-error.log* 21 | -------------------------------------------------------------------------------- /docs/guides/dealers/tickets.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 2 3 | --- 4 | 5 | # Tickets 6 | 7 | Attendees can enter specific time slots of when they are allowed to enter the dealer’s location, and acquire QR codes from ConCat before the convention. 8 | 9 | The QR codes can then be scanned by volunteers, and allow the attendee to enter the dealer’s den at the specified time slot, or later. 10 | -------------------------------------------------------------------------------- /src/components/MaterialIcon.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | interface Props { 4 | name: string; 5 | title?: string; 6 | } 7 | 8 | export default function MaterialIcon({ name, title }: Props) { 9 | return ( 10 | 15 | {name} 16 | 17 | ); 18 | } 19 | -------------------------------------------------------------------------------- /src/components/RESTList.tsx: -------------------------------------------------------------------------------- 1 | import React, { ReactNode } from 'react'; 2 | 3 | import styles from './restlist.module.scss'; 4 | 5 | interface Props { 6 | children: ReactNode; 7 | } 8 | 9 | export default function RESTList({ children }: Props) { 10 | return ( 11 |
12 |
Endpoints
13 |
14 | {children} 15 |
16 |
17 | ) 18 | } -------------------------------------------------------------------------------- /src/components/card.module.scss: -------------------------------------------------------------------------------- 1 | @import '@site/src/css/_variables.scss'; 2 | 3 | .card { 4 | border: 1px solid darken($brand-accent, 5%); 5 | border-radius: 0.25rem; 6 | padding: 1rem; 7 | width: 25rem; 8 | 9 | header { 10 | font-size: 1.2rem; 11 | font-weight: bold; 12 | text-transform: uppercase; 13 | color: $brand-mid; 14 | margin-bottom: 0.35rem; 15 | } 16 | } 17 | 18 | [data-theme='dark'] { 19 | .card header { 20 | color: $brand-accent; 21 | } 22 | } -------------------------------------------------------------------------------- /src/components/SplitColumn.tsx: -------------------------------------------------------------------------------- 1 | import React, { ReactNode } from 'react'; 2 | 3 | import styles from './splitcolumn.module.scss'; 4 | 5 | interface Props { 6 | children: ReactNode[]; 7 | childStyle?: React.CSSProperties; 8 | } 9 | 10 | export default function SplitColumn({ children, childStyle }: Props) { 11 | return ( 12 |
13 | {children.map((child, idx) => ( 14 |
{child}
15 | ))} 16 |
17 | ); 18 | } -------------------------------------------------------------------------------- /src/pages/policy/policy.module.scss: -------------------------------------------------------------------------------- 1 | @import '@site/src/css/_variables.scss'; 2 | 3 | .main { 4 | padding: 1.25rem 1rem 1rem 2rem; 5 | 6 | h1 { 7 | margin-bottom: 0.1rem; 8 | } 9 | 10 | li > p:first-child { 11 | margin-bottom: 0; 12 | } 13 | } 14 | 15 | .subtitle { 16 | font-size: 0.85rem; 17 | color: gray; 18 | 19 | padding-bottom: 0.25rem; 20 | border-bottom: 1px solid $brand-mid; 21 | margin-bottom: 1rem; 22 | } 23 | 24 | @media screen and (max-width: 966px) { 25 | .main { 26 | padding: 1.1rem; 27 | } 28 | } -------------------------------------------------------------------------------- /src/components/Card.tsx: -------------------------------------------------------------------------------- 1 | import clsx from "clsx"; 2 | import React, { ReactNode } from "react"; 3 | 4 | import styles from './card.module.scss'; 5 | 6 | interface Props { 7 | children: ReactNode; 8 | className?: string; 9 | header: string; 10 | } 11 | 12 | export default function Card({ children, className, header }: Props) { 13 | return ( 14 |
15 |
16 | {header} 17 |
18 |
19 | {children} 20 |
21 |
22 | ) 23 | } -------------------------------------------------------------------------------- /src/components/RESTElement.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import styles from './restelement.module.scss'; 4 | 5 | interface Props { 6 | method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'; 7 | path: string; 8 | anchor: string; 9 | } 10 | 11 | export default function RESTElement({ anchor, method, path }: Props) { 12 | return ( 13 |
14 | 15 |
{method}
16 |
{path}
17 |
18 |
19 | ); 20 | } -------------------------------------------------------------------------------- /src/components/Highlight.tsx: -------------------------------------------------------------------------------- 1 | import React, { ReactNode } from 'react'; 2 | 3 | interface Props { 4 | children: ReactNode; 5 | color: string; 6 | title?: string; 7 | } 8 | 9 | export default function Highlight({ children, color, title }: Props) { 10 | return ( 11 | 22 | {children} 23 | 24 | ); 25 | } 26 | -------------------------------------------------------------------------------- /src/components/restlist.module.scss: -------------------------------------------------------------------------------- 1 | .restlist { 2 | background-color: rgb(40, 42, 54); 3 | border: 1px solid rgb(220, 220, 220); 4 | border-radius: 10px; 5 | 6 | header { 7 | background-color: rgb(244, 244, 244); 8 | border-radius: 7px 7px 0 0; 9 | padding: 5px 5px 5px 10px; 10 | color: black; 11 | font-size: 12px; 12 | text-transform: uppercase; 13 | } 14 | 15 | >div { 16 | padding: 5px 10px 5px 10px; 17 | } 18 | } 19 | 20 | [data-theme='dark'] { 21 | .restlist { 22 | border: 1px solid rgb(48, 48, 48); 23 | 24 | header { 25 | background-color: rgb(85, 85, 85); 26 | color: white; 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/components/EndpointResponse.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import CodeBlock from '@theme/CodeBlock'; 3 | 4 | import styles from './endpointrequest.module.scss'; 5 | 6 | interface Props { 7 | children: string; 8 | } 9 | 10 | export default function EndpointResponse({ children }: Props) { 11 | return ( 12 |
13 |
14 | Response 15 | 16 | application/json 17 | 18 |
19 | 20 | {children} 21 | 22 |
23 | ); 24 | } -------------------------------------------------------------------------------- /docs/guides/products/productimages.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 4 3 | hide_table_of_contents: true 4 | --- 5 | 6 | # Product Images 7 | 8 | Images are a great way to show off your products and their features. You can create a gallery of images for your product, or just upload a single image. Only the first image will be used as the main image for the product. 9 | 10 | Uploaded images are currently limited by the following constraints: 11 | - Images must be no larger than 1MB in size. 12 | - Images must be in PNG format. 13 | - Images should be at least 512x512 pixels in size, and rectangular in shape. 14 | 15 | Product Images can be uploaded or deleted from edit page of a product. See the Modifying a Product section for instructions. 16 | 17 | :::note Upcoming Change 18 | Product Images are not currently shown for registration products or on the cart page. This will be supported in the future. 19 | ::: -------------------------------------------------------------------------------- /src/components/EndpointRequest.tsx: -------------------------------------------------------------------------------- 1 | import React, { ReactNode } from 'react'; 2 | import CodeBlock from '@theme/CodeBlock'; 3 | 4 | import styles from './endpointrequest.module.scss'; 5 | 6 | interface Props { 7 | children: string; 8 | method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'; 9 | path: string; 10 | contentType?: string; 11 | } 12 | 13 | export default function EndpointRequest({ contentType = 'application/json', method, path, children }: Props) { 14 | return ( 15 |
16 |
17 | {method} {path} 18 | 19 | {contentType} 20 | 21 |
22 | 23 | {children} 24 | 25 |
26 | ); 27 | } -------------------------------------------------------------------------------- /sidebars.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Creating a sidebar enables you to: 3 | - create an ordered group of docs 4 | - render a sidebar for each doc of that group 5 | - provide next/previous navigation 6 | 7 | The sidebars can be generated from the filesystem, or explicitly defined here. 8 | 9 | Create as many sidebars as you want. 10 | */ 11 | 12 | // @ts-check 13 | 14 | /** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ 15 | const sidebars = { 16 | // By default, Docusaurus generates a sidebar from the docs folder structure 17 | tutorialSidebar: [{type: 'autogenerated', dirName: 'guides'}], 18 | apiSidebar: [{type: 'autogenerated', dirName: 'api'}], 19 | 20 | // But you can create a sidebar manually 21 | /* 22 | tutorialSidebar: [ 23 | { 24 | type: 'category', 25 | label: 'Tutorial', 26 | items: ['hello'], 27 | }, 28 | ], 29 | */ 30 | }; 31 | 32 | module.exports = sidebars; 33 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Website 2 | 3 | This website is built using [Docusaurus 2](https://docusaurus.io/), a modern static website generator. 4 | 5 | ### Installation 6 | 7 | ``` 8 | $ yarn 9 | ``` 10 | 11 | ### Local Development 12 | 13 | ``` 14 | $ yarn start 15 | ``` 16 | 17 | This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. 18 | 19 | ### Build 20 | 21 | ``` 22 | $ yarn build 23 | ``` 24 | 25 | This command generates static content into the `build` directory and can be served using any static contents hosting service. 26 | 27 | ### Deployment 28 | 29 | Using SSH: 30 | 31 | ``` 32 | $ USE_SSH=true yarn deploy 33 | ``` 34 | 35 | Not using SSH: 36 | 37 | ``` 38 | $ GIT_USER= yarn deploy 39 | ``` 40 | 41 | If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. 42 | -------------------------------------------------------------------------------- /src/components/bigbutton.module.scss: -------------------------------------------------------------------------------- 1 | @import '@site/src/css/_variables.scss'; 2 | 3 | .big-button { 4 | display: inline-flex; 5 | width: 100%; 6 | margin-bottom: 1rem; 7 | padding: 0.5rem; 8 | position: relative; 9 | border: 2px solid transparent; 10 | border-radius: var(--ifm-pagination-nav-border-radius); 11 | transition: all 250ms ease-in-out; 12 | 13 | &:hover { 14 | border: 2px solid $brand-primary; 15 | box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.25); 16 | transform: translateY(-3px); 17 | } 18 | } 19 | 20 | .big-button :global(.material-symbols-outlined) { 21 | margin-right: 0.5rem; 22 | font-size: 36px; 23 | } 24 | 25 | .big-button-link { 26 | font-weight: bold; 27 | text-decoration: none !important; 28 | } 29 | 30 | .big-button-link::after { 31 | position: absolute; 32 | top: 0; 33 | right: 0; 34 | bottom: 0; 35 | left: 0; 36 | z-index: 1; 37 | content: ""; 38 | } 39 | 40 | .big-button-subtext { 41 | font-size: 14px; 42 | } -------------------------------------------------------------------------------- /src/components/restelement.module.scss: -------------------------------------------------------------------------------- 1 | .restelement { 2 | display: flex; 3 | font-family: 'Consolas', monospace; 4 | font-size: 14px; 5 | 6 | a { 7 | display: flex; 8 | flex: 1; 9 | color: rgb(175, 175, 175); 10 | } 11 | 12 | a:hover { 13 | color: rgb(220, 220, 220); 14 | 15 | .rest-post { 16 | color: rgb(107, 197, 116); 17 | } 18 | 19 | .rest-get { 20 | color: rgb(127, 150, 221); 21 | } 22 | 23 | .rest-delete { 24 | color: rgb(211, 117, 117); 25 | } 26 | 27 | .rest-patch { 28 | color: rgb(211, 147, 117); 29 | } 30 | } 31 | 32 | a, a:visited, a:hover, a:active { 33 | text-decoration: none; 34 | } 35 | 36 | div:first-child { 37 | flex: 0.1; 38 | text-align: right; 39 | margin-right: 1rem; 40 | min-width: 4rem; 41 | } 42 | } 43 | 44 | .rest-get { 45 | color: rgb(97, 120, 181); 46 | } 47 | 48 | .rest-post { 49 | color: rgb(84, 163, 92); 50 | } 51 | 52 | .rest-delete { 53 | color: rgb(163, 84, 84); 54 | } 55 | 56 | .rest-patch { 57 | color: rgb(163, 124, 66); 58 | } -------------------------------------------------------------------------------- /src/components/ExampleBox.tsx: -------------------------------------------------------------------------------- 1 | import React, { ReactNode } from 'react'; 2 | import CodeBlock from '@theme/CodeBlock'; 3 | 4 | import styles from './endpointrequest.module.scss'; 5 | 6 | interface Props { 7 | children: string; 8 | method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'; 9 | header: string; 10 | headerSubText?: string; 11 | codeBlockType?: string; 12 | } 13 | 14 | export default function EndpointRequest( 15 | { header, headerSubText, method, children, codeBlockType = 'language-json' }: Props, 16 | ) { 17 | return ( 18 |
19 |
20 | {method && ( 21 | <> 22 | {method}{' '} 23 | 24 | )} 25 | {header} 26 | {headerSubText && ( 27 | 28 | {headerSubText} 29 | 30 | )} 31 |
32 | 33 | {children} 34 | 35 |
36 | ); 37 | } -------------------------------------------------------------------------------- /docs/guides/intro.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | hide_table_of_contents: true 4 | --- 5 | 6 | # Introduction 7 | 8 | Welcome to ConCat! We've created some helpful guides to help you get started with our platform and get your 9 | event up and running. 10 | 11 | 12 | 13 | Onboarding checklist for working with us to get your event setup. 14 | 15 | 16 | Creating and managing registration tier products, assigning add-ons, discounts, and more. 17 | 18 | 19 | 20 | ---- 21 | 22 | :::info Contributing 23 | All of our documentation is written in [Markdown](https://en.wikipedia.org/wiki/Markdown) and available for 24 | anyone to make suggestions and contributions over on our [GitHub](https://github.com/ConventionCatCorp/concat-docs). 25 | If you notice any discrepancies, outdated information, or anything else that needs to be updated, just click the `Edit this page` link at the bottom of each page. 26 | ::: 27 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "concat-docs", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "docusaurus": "docusaurus", 7 | "start": "docusaurus start", 8 | "build": "docusaurus build", 9 | "swizzle": "docusaurus swizzle", 10 | "deploy": "docusaurus deploy", 11 | "clear": "docusaurus clear", 12 | "serve": "docusaurus serve", 13 | "write-translations": "docusaurus write-translations", 14 | "write-heading-ids": "docusaurus write-heading-ids", 15 | "typecheck": "tsc" 16 | }, 17 | "dependencies": { 18 | "@docusaurus/core": "2.4.0", 19 | "@docusaurus/preset-classic": "2.4.0", 20 | "@mdx-js/react": "^1.6.22", 21 | "clsx": "^1.1.1", 22 | "docusaurus-plugin-sass": "^0.2.2", 23 | "prism-react-renderer": "^1.2.1", 24 | "react": "^17.0.1", 25 | "react-dom": "^17.0.1", 26 | "sass": "^1.52.3" 27 | }, 28 | "devDependencies": { 29 | "@docusaurus/module-type-aliases": "^2.0.0-rc.1", 30 | "@tsconfig/docusaurus": "^1.0.4", 31 | "typescript": "^4.5.2" 32 | }, 33 | "browserslist": { 34 | "production": [ 35 | ">0.5%", 36 | "not dead", 37 | "not op_mini all" 38 | ], 39 | "development": [ 40 | "last 1 chrome version", 41 | "last 1 firefox version", 42 | "last 1 safari version" 43 | ] 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /docs/api/errors/logicerrorcodes.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 2 3 | displayed_sidebar: apiSidebar 4 | --- 5 | 6 | # Logic Error Codes 7 | 8 | 9 | The record you're trying to delete has other dependent records. 10 | 11 | 12 | 13 | The vendor has already paid, so cannot be changed to a different status. Refund the vendor's payment before changing the status. 14 | 15 | 16 | 17 | Target user is already associated with the target record. You can't add the same user to the same record twice. 18 | 19 | 20 | 21 | The vendor has already paid, so cannot be deleted. Refund the vendor's payment before deleting the application. 22 | 23 | 24 | 25 | The payment was declined by the credit card processor. 26 | 27 | 28 | 29 | The email address is already in use. 30 | 31 | 32 | 33 | You cannot add compensation to your own user. 34 | -------------------------------------------------------------------------------- /src/components/BigButton.tsx: -------------------------------------------------------------------------------- 1 | import Link from '@docusaurus/Link'; 2 | import Admonition from '@theme/Admonition'; 3 | import React from "react"; 4 | 5 | import styles from './bigbutton.module.scss'; 6 | import MaterialIcon from './MaterialIcon'; 7 | 8 | interface Props { 9 | children?: React.ReactNode; 10 | to?: string; 11 | href?: string; 12 | icon: string; 13 | title: string; 14 | } 15 | 16 | export default function BigButton({ href, to, title, children, icon }: Props) { 17 | if ((href && to) || (!href && !to)) { 18 | return ( 19 | 20 | This component should have a link using href OR to, not both. 21 | 22 | ) 23 | } 24 | 25 | return ( 26 |
27 | 28 |
29 | {href ? ( 30 | 31 | {title} 32 | 33 | ) : ( 34 | 35 | {title} 36 | 37 | )} 38 | {children && ( 39 |
40 | {children} 41 |
42 | )} 43 |
44 |
45 | ); 46 | } -------------------------------------------------------------------------------- /src/pages/pricing.module.scss: -------------------------------------------------------------------------------- 1 | @import '@site/src/css/_variables.scss'; 2 | 3 | .main { 4 | padding: 1.25rem 1rem 1rem 2rem; 5 | 6 | h3 { 7 | margin: 2.5rem 0 1rem !important; 8 | } 9 | } 10 | 11 | .price-card { 12 | header { 13 | text-align: center; 14 | } 15 | 16 | .pricing { 17 | div { 18 | font-size: 2rem; 19 | text-align: center; 20 | margin-bottom: -0.75rem; 21 | 22 | small { 23 | font-size: 1rem; 24 | } 25 | } 26 | } 27 | 28 | .buttons a { 29 | width: 100%; 30 | } 31 | 32 | hr { 33 | opacity: 0.5; 34 | border-width: 0.5px; 35 | } 36 | 37 | ul { 38 | list-style: none; 39 | padding: 0; 40 | margin: 0; 41 | margin-left: 1rem; 42 | 43 | li { 44 | display: inline-flex; 45 | width: 100%; 46 | height: 26px; 47 | 48 | :global(.material-symbols-outlined) { 49 | margin-right: 1rem; 50 | width: 24px; 51 | height: 24px; 52 | } 53 | 54 | &.feature-on { 55 | :global(.material-symbols-outlined) { 56 | color: $brand-primary; 57 | } 58 | } 59 | } 60 | } 61 | } 62 | 63 | @media screen and (max-width: 966px) { 64 | .main { 65 | padding: 1.1rem; 66 | } 67 | 68 | .price-card { 69 | ul { 70 | margin-left: 0; 71 | 72 | li :global(.material-symbols-outlined) { 73 | margin-right: 0.5rem; 74 | } 75 | } 76 | } 77 | } -------------------------------------------------------------------------------- /src/theme/MDXComponents.tsx: -------------------------------------------------------------------------------- 1 | // Import the original mapper 2 | import MDXComponents from '@theme-original/MDXComponents'; 3 | import Highlight from '@site/src/components/Highlight'; 4 | import { Attribute, ParentAttribute } from '@site/src/components/Attribute'; 5 | import MaterialIcon from '@site/src/components/MaterialIcon'; 6 | import RESTElement from '@site/src/components/RESTElement'; 7 | import RESTList from '@site/src/components/RESTList'; 8 | import EndpointRequest from '@site/src/components/EndpointRequest'; 9 | import EndpointResponse from '@site/src/components/EndpointResponse'; 10 | import ExampleBox from '@site/src/components/ExampleBox'; 11 | import SplitColumn from '@site/src/components/SplitColumn'; 12 | import BigButton from '@site/src/components/BigButton'; 13 | import Card from '@site/src/components/Card'; 14 | import Link from '@docusaurus/Link'; 15 | import Admonition from '@theme/Admonition'; 16 | 17 | export default { 18 | // Re-use the default mapping 19 | ...MDXComponents, 20 | // Map the "highlight" tag to our component! 21 | // `Highlight` will receive all props that were passed to `highlight` in MDX 22 | Admonition: Admonition, 23 | highlight: Highlight, 24 | attribute: Attribute, 25 | parentAttribute: ParentAttribute, 26 | materialIcon: MaterialIcon, 27 | link: Link, 28 | restElement: RESTElement, 29 | restList: RESTList, 30 | endpointRequest: EndpointRequest, 31 | endpointResponse: EndpointResponse, 32 | exampleBox: ExampleBox, 33 | splitColumn: SplitColumn, 34 | card: Card, 35 | bigButton: BigButton, 36 | }; 37 | -------------------------------------------------------------------------------- /src/pages/index.module.scss: -------------------------------------------------------------------------------- 1 | @import '@site/src/css/_variables.scss'; 2 | 3 | .heroBanner { 4 | padding: 4rem 0; 5 | text-align: center; 6 | position: relative; 7 | overflow: hidden; 8 | background-color: $brand-accent; 9 | box-shadow: 0 0 10px #000; 10 | 11 | h1 { 12 | color: $brand-dark; 13 | 14 | span { 15 | color: $brand-primary; 16 | } 17 | } 18 | } 19 | 20 | .heroImg { 21 | position: absolute; 22 | top: -25%; 23 | width: 40%; 24 | right: 0; 25 | } 26 | 27 | @media screen and (max-width: 966px) { 28 | .heroBanner { 29 | padding: 2rem; 30 | } 31 | 32 | .heroImg { 33 | display: none; 34 | } 35 | } 36 | 37 | .buttons { 38 | display: flex; 39 | align-items: center; 40 | justify-content: center; 41 | 42 | >:global(.button) { 43 | margin: 0 0.5rem; 44 | } 45 | } 46 | 47 | :global(.footer__copyright) { 48 | text-align: left; 49 | font-size: 12px; 50 | } 51 | 52 | [data-theme='dark'] { 53 | .heroBanner { 54 | background-color: $brand-dark; 55 | box-shadow: 0 0 10px $brand-mid; 56 | 57 | h1 { 58 | color: $brand-accent; 59 | 60 | span { 61 | color: lighten($brand-primary, 25%); 62 | } 63 | } 64 | 65 | a:first-of-type { 66 | border-color: $brand-primary; 67 | background-color: darken($brand-accent, 10%); 68 | color: $brand-dark; 69 | } 70 | 71 | a:not(:first-of-type) { 72 | background-color: transparent; 73 | color: $brand-accent; 74 | border-color: transparent; 75 | 76 | &:hover { 77 | background-color: darken($brand-accent, 50%); 78 | } 79 | } 80 | } 81 | } -------------------------------------------------------------------------------- /docs/guides/products/addons.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | hide_table_of_contents: true 4 | --- 5 | 6 | # Addons 7 | 8 | Addons are a way to offer bundles of products to your attendees. A common use case is to include promotional items for attendees who have purchased a higher tier of Attendance Type. Any product in the system can be added as an addon to another product. 9 | 10 | ### Creating an Addon 11 | 12 | You can add an unlimited number of products as addons to any product, using the following steps: 13 | 14 |
    15 |
  1. 16 | 17 | In Housekeeping, navigate to the product page for the product you want to add addons to. 18 | 19 |
  2. 20 |
  3. 21 | 22 | Click the green plus (add) button next to the "Addons" section. 23 | 24 |
  4. 25 |
  5. 26 | 27 | Search for the product you want to add as an addon and select it from the dropdown. 28 | 29 |
  6. 30 |
  7. 31 | 32 | Check the "Addon is complimentary" checkbox, then click "Create Add-on". 33 | 34 |
  8. 35 |
36 | 37 | ### Upsell Addons 38 | 39 | Upsell addons are a way to offer additional promotional items, limited-seating event tickets, or other products in addition to an existing purchase. These are shown after an attendee has added a product to their cart, but before they checkout. 40 | 41 | To add an upsell addon, follow the steps above and leave the checkbox for "Addon is complimentary" unchecked. -------------------------------------------------------------------------------- /docs/guides/registration/attendance/attendance.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | hide_table_of_contents: true 4 | --- 5 | 6 | # Attendance Tiers 7 | 8 | Attendance Tiers are the different levels of registration that are available for your attendees to select from when 9 | they register. On other platforms, these are sometimes referred to as "tiers", "packages", or "ticket types". 10 | 11 | Within ConCat, Attendance Tiers are treated as a special type of Product and can be customized in the same way. 12 | 13 | ### Creating an Attendance Tier 14 | 15 | To create a new Attendance Tier, follow the instructions on [Creating a Product](/docs/guides/products#creating-a-product) and select the Registration category at Step 2. 16 | 17 | Attendance Tiers created in this way will be available for registration on the registration page if Make Product Publicly Visible is checked, otherwise it will only be visible for selection through Housekeeping. 18 | 19 | ### Upgrade Paths for Attendance Tiers 20 | 21 | Once your Attendance Tier is created, you can set up Upgrade Paths. This allows your attendees to upgrade their Attendance Tier to a higher tier seemlessly, charging users just the price difference. 22 | 23 | ### About Attendance Tier Addons 24 | 25 | Utilizing [Product Addons](/docs/guides/products/addons) is a great way to keep track of bundled swag like T-Shirts. There are a few specific notes when using addons with Attendance Tiers: 26 | 27 | * Any addons that are marked complimentary will be added to the attendees cart automatically upon checkout. 28 | * Non-complimentary addons will be displayed after the attendee finishes configuring their registration. -------------------------------------------------------------------------------- /docs/guides/usernotes/usernotes.md: -------------------------------------------------------------------------------- 1 | # User Notes 2 | 3 | User Notes allows you to add additional informaton to user profiles in order to assist operations. 4 | 5 | There are 8 types of user notes: **Commendation**, **Reprimand**, **Request**, **Restriction**, **Ban**, **Cashier**, **Feedback**, and **Misc**. 6 | 7 | ## Cashier 8 | 9 | Cashier notes are notes that will specifically be shown when an attendee is checking in at registration. This is most useful for any special handling that may be required for specific attendees. 10 | 11 | ## Bans 12 | 13 | Bans prevent users from performing specific actions, and will display a generic error message. 14 | 15 | Bans can be issued with or without an account. With an account, the associated account receives the ban and will be restricted from the respective actions. Without an account, a full legal name (first and last) must be provided. 16 | 17 | If a user banned from registration attempts to register, a review will be requested. These reviews will appear in the dashboard to be approved or denied. 18 | :::info Note 19 | A user triggers a review when the first letter of their first name and last name match. 20 | ::: 21 | 22 | ## Restriction 23 | 24 | Restriction notes will show a notice that the user has a restriction on their account on internal lists like the user search and volunteer list. These are effectively "shadow bans" as the user is never aware of or shown any information about it. 25 | 26 | ## Reprimand, Request, Commendation, Feedback, and Misc 27 | 28 | These notes hold no special properties and simply show up when viewing a user's notes tab. We provide multiple categories to assist with organization of general notes like these. -------------------------------------------------------------------------------- /docs/guides/registration/transfer.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 2 3 | hide_table_of_contents: true 4 | --- 5 | 6 | # Transfer Registration 7 | 8 | 9 |
10 |

11 | If an attendee is unable or no longer wants to attend they can choose to transfer their registration to another user instead of requesting a refund. 12 |

13 |

Steps

14 |
    15 |
  1. 16 | Click "Register for EVENTNAME" in the left navigation bar. 17 |
  2. 18 |
  3. 19 | Using the three-dots menu bar (more_horiz), click "Transfer Registration". 20 |
  4. 21 |
  5. 22 | Enter the email address of the attendee you want to receive the registration. 23 |
  6. 24 |
  7. 25 | Enter your password to confirm the transfer. 26 |
  8. 27 |
  9. 28 | Click "Transfer Registration". 29 |
  10. 30 |
31 |
32 |
33 | 34 |
35 |
36 | 37 | :::info Note 38 | In order to transfer a registration, the attendee transferring the registration must have already paid and the target attendee must have registered but not yet paid. 39 | ::: 40 | 41 | :::note Limitations 42 | * It is not currently possible to transfer a registration through the Housekeeping interface. 43 | * If an attendance tier is no longer selectable, it is not currently possible to transfer that registration to another attendee. 44 | ::: -------------------------------------------------------------------------------- /docs/api/intro.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | displayed_sidebar: apiSidebar 4 | --- 5 | 6 | # API Introduction 7 | 8 | Welcome! 👋 9 | 10 | If you're new to our APIs, we'd recommend the extra 10 minutes to go through our getting started and best practices guide. Otherwise, feel free to skip ahead to the section you're after, or reach out to us if there's something we've missed! 11 | 12 | We currently don't have any SDKs available, but we'll give you everything you need to send requests over HTTP directly to our REST-compliant API. 13 | 14 | ### Latest Version 15 | The latest version of the API is **v0**. 16 | 17 | :::caution Beta Notice 18 | The v0 API is in **beta** and is subject to change, including without limitation any breaking changes to the API. All API changes will be documented on the API Release Notes page. 19 | ::: 20 | 21 | ### Guidelines, Do's & Don'ts 22 | 23 | #### What can I do with the ConCat APIs? 24 | 25 | You're free to make anything that's helpful, creative, and follows the guidelines below. 26 | 27 | #### What am I not allowed to do? 28 | 29 | To ensure the best experience for our event customers, please avoid the following: 30 | 31 | ##### 1. Abusing the Platform or Customers 32 | 33 | Abuse refers to the act of misusing the APIs, bypassing rate-limits, gaining unapproved access to unauthorized scopes, unauthorized modification or destruction of data, misrepresentation of your integration / application, overburdening the platform, harming or harassing event customers, or sharing your authentication credentials. 34 | 35 | ##### 2. Misuse our Trademarks, Logos, or Brand 36 | 37 | You are free to use ConCat's Trademarks and Logos to identify and promote your use of the platform or API services, subject to the conditions outlined in our Master SaaS Agreement. -------------------------------------------------------------------------------- /docs/guides/volunteers/volunteers.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | --- 4 | 5 | # Volunteers 6 | 7 | Attendees have the option to fill out a volunteer application form, listing out their availability, their preferred contacts methods, and what departments they are interested in helping. 8 | 9 | :::info Note 10 | The volunteer form can be modified. Contact support for assistance. 11 | ::: 12 | 13 | An application can have these distinct states to a department: 14 | * __Interested__: User is interested in participating in this department. 15 | * __Previous Experience__: User has previously helped in a department. 16 | * __Avoid__: User does not want to be part of this department. 17 | * __Requested (Internal)__: A department lead has requested this user to be assigned to their department. 18 | * __Assigned (Internal)__: The volunteer has been assigned by an admin to the department. 19 | 20 | ## Human Resources 21 | Adminstators with the `hr` role can manage the volunteer settings, manage departments, and assign volunteers to departments. 22 | 23 | ## Departments 24 | Each department can be assigned leads, look at un-approved volunteer applications, and request applications to be assigned to their department. 25 | 26 | Departments leads must also be assigned the `user` role to have access to their housekeeping pages. 27 | 28 | ### Department Leads 29 | 30 | These leads can use a mass email system to contact all of their assigned volunteers easily and reliably. 31 | 32 | ## Staff 33 | Adminstators can also assign volunteers as staff if they require particular permissions. This can be customized to your needs with Roles. 34 | 35 | ## Compensation 36 | 37 | If you would like, Registration can be set up a [Product Discount](/docs/guides/products/discounts) for volunteers on particular attendance tiers. -------------------------------------------------------------------------------- /src/components/endpointrequest.module.scss: -------------------------------------------------------------------------------- 1 | .endpointrequest { 2 | //background-color: rgb(40, 42, 54); 3 | border: 1px solid rgb(220, 220, 220); 4 | height: fit-content; 5 | overflow: hidden; 6 | margin-bottom: 1rem; 7 | 8 | header { 9 | background-color: rgb(244, 244, 244); 10 | padding: 10px 10px 10px 15px; 11 | color: black; 12 | font-size: 13px; 13 | 14 | .pull-right { 15 | float: right; 16 | } 17 | } 18 | 19 | &:first-child { 20 | border-radius: 10px 10px 0 0; 21 | margin-bottom: 0; 22 | 23 | header { 24 | border-radius: 7px 7px 0 0; 25 | } 26 | } 27 | 28 | + .endpointrequest { 29 | border-radius: 0; 30 | border-top: 0; 31 | } 32 | 33 | &:last-child { 34 | border-bottom-left-radius: 10px; 35 | border-bottom-right-radius: 10px; 36 | } 37 | } 38 | 39 | .theme-code-block { 40 | margin-bottom: 0 !important; 41 | background-color: rgb(246, 248, 250); 42 | border-radius: 0; 43 | } 44 | 45 | [data-theme='dark'] { 46 | .endpointrequest { 47 | border: 1px solid rgb(48, 48, 48); 48 | 49 | header { 50 | background-color: rgb(69, 69, 69); 51 | color: white; 52 | } 53 | } 54 | 55 | .theme-code-block { 56 | background-color: rgb(40, 42, 54); 57 | } 58 | } 59 | 60 | .rest-post, .rest-get, .rest-patch, .rest-delete { 61 | background-color: gray; 62 | padding: 3px 10px; 63 | border-radius: 15px; 64 | margin-right: 5px; 65 | } 66 | 67 | .rest-post { 68 | background-color: rgb(93, 210, 104); 69 | text-transform: uppercase; 70 | } 71 | 72 | .rest-get { 73 | background-color: rgb(83, 119, 226); 74 | color: white; 75 | text-transform: uppercase; 76 | } 77 | 78 | .rest-delete { 79 | background-color: rgb(201, 90, 90); 80 | text-transform: uppercase; 81 | } 82 | 83 | .rest-patch { 84 | background-color: rgb(226, 126, 50); 85 | text-transform: uppercase; 86 | } -------------------------------------------------------------------------------- /src/components/featurelist.module.scss: -------------------------------------------------------------------------------- 1 | @import '@site/src/css/_variables.scss'; 2 | 3 | .feature-list { 4 | list-style: none; 5 | margin: 2.5rem auto; 6 | width: 90%; 7 | } 8 | 9 | .feature { 10 | background-color: lighten($brand-accent, 2%); 11 | border-radius: 8px; 12 | border-top: 1px solid lighten($brand-accent, 2%); 13 | border-left: 1px solid lighten($brand-accent, 2%); 14 | cursor: pointer; 15 | margin: 1rem 0; 16 | padding: 0.5rem; 17 | 18 | transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1); 19 | 20 | &:not(.feature-selected):hover { 21 | background-color: darken($brand-accent, 2%); 22 | } 23 | } 24 | 25 | .feature-selected { 26 | background-color: $brand-primary; 27 | color: $brand-accent; 28 | cursor: default; 29 | box-shadow: 2px 2px 4px $brand-mid; 30 | border-top: 1px solid rgba($brand-mid, 0.5); 31 | border-left: 1px solid rgba($brand-mid, 0.5); 32 | 33 | .feature-details { 34 | color: $brand-accent; 35 | margin-bottom: 0.75rem; 36 | 37 | :global(.material-symbols-outlined) { 38 | background-color: $brand-accent; 39 | color: $brand-primary; 40 | } 41 | } 42 | 43 | .feature-description { 44 | font-size: 14px; 45 | } 46 | } 47 | 48 | .feature-details { 49 | align-items: center; 50 | color: $brand-dark; 51 | display: inline-flex; 52 | 53 | :global(.material-symbols-outlined) { 54 | font-size: 24px; 55 | width: 35px; 56 | height: 35px; 57 | margin-right: 1rem !important; 58 | padding: 0.35rem; 59 | border-radius: 5px; 60 | background-color: $brand-primary; 61 | color: $brand-accent; 62 | } 63 | } 64 | 65 | .feature-container { 66 | margin-bottom: 5rem; 67 | } 68 | 69 | .feature-image { 70 | margin-top: 2rem; 71 | margin-right: 1rem; 72 | } 73 | 74 | @media screen and (max-width: 966px) { 75 | .feature-list { 76 | margin-left: 0 !important; 77 | } 78 | 79 | .feature-container { 80 | margin-bottom: 0; 81 | } 82 | 83 | .feature-image { 84 | display: none; 85 | } 86 | } -------------------------------------------------------------------------------- /src/pages/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import clsx from 'clsx'; 3 | import Layout from '@theme/Layout'; 4 | import Link from '@docusaurus/Link'; 5 | import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; 6 | import styles from './index.module.scss'; 7 | import SplitColumn from '../components/SplitColumn'; 8 | import FeatureList from '../components/FeatureList'; 9 | 10 | function HomepageHeader() { 11 | const {siteConfig} = useDocusaurusContext(); 12 | return ( 13 |
14 |
15 | 16 |
17 |

18 | Manage your event, not a spreadsheet. 19 |

20 |

21 | Simple event management for events of all sizes. Whether you're just 22 | starting out or already established, we're right there with you. 23 |

24 |
25 | 28 | View Pricing 29 | 30 | 33 | Learn More 34 | 35 |
36 |
37 |
38 | 39 |
40 |
41 |
42 |
43 | ); 44 | } 45 | 46 | export default function Home(): JSX.Element { 47 | const {siteConfig} = useDocusaurusContext(); 48 | return ( 49 | 52 | 53 |
54 | 55 |
56 |
57 | ); 58 | } 59 | -------------------------------------------------------------------------------- /src/components/HomepageFeatures/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import clsx from 'clsx'; 3 | import styles from './styles.module.css'; 4 | 5 | type FeatureItem = { 6 | title: string; 7 | image: string; 8 | description: JSX.Element; 9 | }; 10 | 11 | const FeatureList: FeatureItem[] = [ 12 | { 13 | title: 'Easy to Use', 14 | image: '/img/undraw_docusaurus_mountain.svg', 15 | description: ( 16 | <> 17 | Docusaurus was designed from the ground up to be easily installed and 18 | used to get your website up and running quickly. 19 | 20 | ), 21 | }, 22 | { 23 | title: 'Focus on What Matters', 24 | image: '/img/undraw_docusaurus_tree.svg', 25 | description: ( 26 | <> 27 | Docusaurus lets you focus on your docs, and we'll do the chores. Go 28 | ahead and move your docs into the docs directory. 29 | 30 | ), 31 | }, 32 | { 33 | title: 'Powered by React', 34 | image: '/img/undraw_docusaurus_react.svg', 35 | description: ( 36 | <> 37 | Extend or customize your website layout by reusing React. Docusaurus can 38 | be extended while reusing the same header and footer. 39 | 40 | ), 41 | }, 42 | ]; 43 | 44 | function Feature({title, image, description}: FeatureItem) { 45 | return ( 46 |
47 |
48 | {title} 49 |
50 |
51 |

{title}

52 |

{description}

53 |
54 |
55 | ); 56 | } 57 | 58 | export default function HomepageFeatures(): JSX.Element { 59 | return ( 60 |
61 |
62 |
63 | {FeatureList.map((props, idx) => ( 64 | 65 | ))} 66 |
67 |
68 |
69 | ); 70 | } 71 | -------------------------------------------------------------------------------- /docs/api/gettingstarted/scopes.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 3 3 | displayed_sidebar: apiSidebar 4 | --- 5 | 6 | # Scopes 7 | 8 | Scopes are used to limit the amount of information that is returned from the API. The scope of a given token can be decreased at any time, but it cannot be increased and any removed scopes cannot be recovered without re-authenticating. 9 | 10 | ## Service integration scopes 11 | 12 | Service integrations are granted a set of scopes at the time of creation. Approved scopes cannot be changed without updating the integration in Housekeeping. The following scopes are available for use with service integrations: 13 | 14 | | Scope | Description | 15 | | --- | --- | 16 | | `user:read` | Read-only access to user data | 17 | | `user:roles:update` | Access to updating user roles data | 18 | | `registration:read` | Read-only access to registration data | 19 | | `volunteer:read` | Read-only access to volunteer data | 20 | 21 | ## OBO scopes 22 | 23 | On Behalf Of (OBO) integrations are granted a set of scopes at the time of authentication by the end-user. Scopes can be dropped when they are no longer required by passing a subset of approved scopes in the token refresh flow. Additional scopes can be requested by re-authenticating the end-user. 24 | 25 | The following scopes are available for use with OBO integrations: 26 | 27 | | Scope | Description | Additional Info | 28 | | --- | --- | --- | 29 | | `pii:basic` | Read-only access to user's basic account data | | 30 | | `pii:email` | Read-only access to user's email address | | 31 | | `pii:phone` | Read-only access to user's phone number | | 32 | | `pii:address` | Read-only access to user's address | | 33 | | `pii:finance:read` | Read-only access to user's order history | | 34 | | `con:read` | Read-only access to user's attendee registration | | 35 | | `admin:ticket:read` | Read-only access to all QuikTicket™ tickets | Requires administrator permission | 36 | | `admin:ticket:scan` | Mark a QuikTicket™ ticket as scanned | Requires administrator permission | -------------------------------------------------------------------------------- /docs/guides/products/discounts.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 2 3 | hide_table_of_contents: true 4 | --- 5 | 6 | # Discounts 7 | 8 | Discounts allow you to offer early-bird or staff / volunteer discounts to your attendees on any product. Discounts can also be set to expire on a given date or run indefinitely. 9 | 10 | ### Creating a Discount 11 | 12 | You can create an unlimited number of discounts, using the following steps: 13 | 14 | 15 |
    16 |
  1. 17 | 18 | In Housekeeping, navigate to the product page for the product you want to add a discount to. 19 | 20 |
  2. 21 |
  3. 22 | 23 | Click the green plus (add) button next to the "Discounts" section. 24 | 25 |
  4. 26 |
  5. 27 | 28 | Enter the discounted price. This is the price that attendees will pay if they purchase the product, not how much the discount is. 29 | 30 |
  6. 31 |
  7. 32 | 33 | (Optional) If you want to limit the discount to a single or set of roles, search for them and select them from the dropdown. 34 | 35 |
  8. 36 |
  9. 37 | 38 | (Optional) By default, discounts will become active immediately, but you can customize both the Available From and Available Until dates. 39 | 40 |
  10. 41 |
  11. 42 | 43 | Click "Create Discount Price". 44 | 45 |
  12. 46 |
47 |
48 | 49 |
50 |
51 | 52 | ### Deleting a Discount 53 | 54 | You can delete a discount by clicking the red trash can (delete) next to the discount. 55 | 56 | :::note 57 | Deleting a discount will cause any unpaid orders to reflect the non-discounted price, unless another matching discount exists. Paid orders will not be affected. 58 | ::: -------------------------------------------------------------------------------- /docs/guides/registration/cashier/scanner.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 2 3 | --- 4 | 5 | # Scanner 6 | 7 | Convention Cat's supported scanner is the [TEEMI 2D Barcode Scanner](https://www.amazon.com/gp/product/B074KH88Z7/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&th=1). The scanner behaves as a keyboard, and within the United States, it may scan attendees driver license to output into the search bar, to more quickly find the user, and verify their information. 8 | 9 | The scanner only works with Google Chrome or Microsoft Edge. Firefox does not suppport the web serial API, which is required for the scanner to work. 10 | 11 | 12 | # Configuring the TEEMI 13 | 14 | Scan the following barcodes with the TEEMI scanner to configure it to be used with the ConCat search bar: 15 | 16 |
17 |
    18 |
  1. 19 | Factory reset the scanner to the base settings. 20 |
    21 | 22 |
  2. 23 |
  3. 24 | Reduce the noise of the beeps. 25 |
    26 | 27 |
  4. 28 |
  5. 29 | Disable all barcode scan types. 30 |
    31 | 32 |
  6. 33 |
  7. 34 | Enable PDF417 to be scanned. (Used by driver's licenses) 35 |
    36 | 37 |
  8. 38 |
  9. 39 | Eanble USB COM mode. This will allow the scanner to interface with the computer as a serial interface, instead of a keyboard, and allow for faster input of the driver's license information once scanned. 40 |
    41 | 42 |
  10. 43 |
44 |
45 | 46 | The full scanner manual can be found [here](/img/cashier/barcodes/TEEMI_2D_Barcode_Scanner_Manual.pdf). 47 | 48 | # Configuring the cashier interface 49 | 50 | Once the scanner is configured, you can now configure the cashier interface to use the scanner. Open the cashier interface, and click on the top left printer icon to configure devices. 51 | 52 | 53 | 54 | Configure the Scanner, by clicking "Add Manually" and then "Scanner with Web Serial", and follow the browser's prompts to add the device. 55 | 56 | -------------------------------------------------------------------------------- /docs/guides/dealers/managment.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | --- 4 | 5 | # Dealers 6 | 7 | Attendees can apply to be dealers, by specifying information about their business, what products they intend to sell, and what amenities they need during the convention. 8 | 9 | Amenities are products that need to be created within the dealer product category. Such amenities are usually products such as the table size, the need for electricity, or the need to be in an 18+ section. 10 | 11 | Dealer applications then need to be approved by a vendor administrator, at which point the vendor will be sent an email, and the products will be added to their cart. 12 | 13 | After the vendor pays for their amenities, the vendor will be promoted to an Approved (Paid)” status. 14 | 15 | :::info Note 16 | Dealers are still expected to pay for their registration. If you'd like to offer a discount or registration for free, you can do so via a [Product Discount](/docs/guides/products/discounts) 17 | ::: 18 | 19 | # Dealer Areas 20 | 21 | Dealers may apply to more than one dealer area (if only one exists then they will not be given the option). Each dealer area have a different product category, which gives the dealer different choices of table types to pick from. This category **must** be created before creating the dealer area. 22 | 23 | # Creating a Vendor Category 24 | 25 | You can manage Vendor Categories directly from the Dealers tab. 26 | 27 | Head to the "Products" tab, you'll see any existing Vendor Categories. Create one with the "Create Category" button at the top. 28 | 29 | Visible products will be displayed as table types that the dealer can choose. 30 | 31 | Hidden products that are set as "Addons" to the visible products will be displayed as additional optional choices for dealers to pick. 32 | 33 | ## Dealer Assistants 34 | 35 | Dealers are allowed to request for assistants, which when approved, will be also given a “Dealer” status on their badge. 36 | 37 | Once they have been approved and pay for their table, Dealers can head to the "Vendor" tab (where they applied) and select the "Manage Assistants" button in order to add and manage their assistants. They will need to know the assistant's username. 38 | 39 | ## Seating Preferences 40 | 41 | Dealers can also request to be next to other vendors. By selecting the "Seating Preferences" button on the Vendor tab, dealers can view their Vendor ID to share with others in order to request shared seating. -------------------------------------------------------------------------------- /docs/api/errors/errors.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 3 3 | displayed_sidebar: apiSidebar 4 | --- 5 | 6 | # Errors 7 | 8 | ConCat uses conventional HTTP response codes to indicate the success or failure of a request. 9 | 10 | Typically, response codes in the `2xx` range indicate success, `4xx` range indicate an error with the data provided in a request, while `5xx` codes indicate a error with the platform. 11 | 12 | Some `4xx` codes may indicate a problem with your integration or application, such as a rate-limit error, instead of an issue with the provided data. 13 | 14 | ### Base Format 15 | 16 | ```json 17 | { 18 | "errors": { 19 | "server": {}, 20 | "access": {}, 21 | "logic": {}, 22 | "resource": {}, 23 | "usage": {}, 24 | "authentication": {}, 25 | "validation": {}, 26 | "rateLimit": {}, 27 | "internal": {} 28 | } 29 | } 30 | ``` 31 | 32 | ### Server Errors 33 | 34 | Server Errors indicate a problem with the ConCat platform that is not related to the data provided in the request. Usually these will accompany a 500 - Internal Server Error HTTP status code. 35 | 36 | #### Attributes 37 | 38 | A tracing hash of the error to provide to support. 39 | 40 | 41 | #### Example 42 | ```json 43 | { 44 | "errors": { 45 | "server": { 46 | "hash": "base64-encoded-hash" 47 | } 48 | } 49 | } 50 | ``` 51 | 52 | ### Access Errors 53 | 54 | Access Errors indicate an API authentication or permission restriction preventing the request. Usually these will accompany a 403 - Forbidden HTTP status code. 55 | 56 | #### Attributes 57 | 58 | 59 | A human-readable message describing the error. 60 | 61 | 62 | 63 | A list of permissions that are required to access the resource. May be empty or not provided if the error is not related to permissions. 64 | 65 | 66 | ### Logic Errors 67 | 68 | Logic Errors indicate an issue with the data provided in the request or some other business logic error. Usually these will accompany a 400 - Bad Request HTTP status code. 69 | 70 | #### Attributes 71 | 72 | 73 | A code indicating the specific logic error. See Logic Error Codes for possible values. 74 | 75 | 76 | 77 | A human-readable message describing the error. 78 | -------------------------------------------------------------------------------- /docs/guides/convention_checklist.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 5 3 | --- 4 | 5 | # Checklist 6 | 7 | Simple checklist to help conventions ensure that they have everything they need to get started with a convention. 8 | 9 | ## Before opening for registration 10 | 11 |
12 |
Discuss policy about refunds
13 |
Discuss refund policy for attendees who do not attend the convention
14 |
Discuss if the end of the pre-registration period (Or if the registration can remain open all the way up to the convention)
15 |
Discuss pre-registration discount date ranges
16 |
Update the registration flags settings. (Settings > Reg flags)
17 |
    18 |
  • Verify that the convnetion is okay with having user's accounts redacted after the convention is over (The 'nukeme' setting)
  • 19 |
20 |
Add additional addons for swag pickup for Sponsor+ registration levels. It is recommended that only a single "Swag" bag product is added, as the cashiers will have to individually mark each item as picked up.
21 |
Check your Stripe payoff schedule. ConCat recommends to have daily automatic transfers.
22 |
23 | 24 | ## Before first day of registration 25 | 26 |
27 |
Go over the cashier interface.
28 |
Verify that the convention has a badge design that needs to be printed. (Settings > Badge Designer)
29 |
Verify that the printer works with the cashier station.
30 |
Verify that driver license's scanner is working.
31 |
Have a method to collect payments at the convention. ConCat does not yet have a method to directly collect payments, but orders can be mark as paid from an external 'cash' or 'card' method.
32 |
Verify that all dealers have paid for registration. (Check Attendee Statistics > Dealers)
33 |
Verify that the correct label sizes have been bought for the printer.
34 |
35 | 36 | ## After the event 37 | 38 |
39 |
Go over any outstanding refund requests.
40 |
Discuss with ConCat if a mass refund needs to be performed for attendees who did paid, but did not attend.
41 |
Discuss with ConCat if user information needs to be redacted.
42 |
Discuss with ConCat for creating a new convention for the next year.
43 |
44 | 45 | -------------------------------------------------------------------------------- /src/components/attribute.module.scss: -------------------------------------------------------------------------------- 1 | .attribute, .attribute-parent { 2 | margin-top: 0.5rem; 3 | padding-bottom: 0.5rem; 4 | margin-left: 1.3rem; 5 | } 6 | 7 | .attribute { 8 | scroll-margin-top: calc(var(--ifm-navbar-height) + 0.5rem); 9 | 10 | &:hover { 11 | .attribute-link { 12 | opacity: 1; 13 | } 14 | } 15 | } 16 | 17 | .attribute:not(:last-child) { 18 | border-bottom: 1px solid rgb(45, 45, 45); 19 | } 20 | 21 | details .attribute:not(:last-child) { 22 | border-bottom: 1px solid rgb(75, 100, 120); 23 | } 24 | 25 | .attribute-info, .attribute-info-perms { 26 | font-size: 14px; 27 | 28 | small { 29 | font-size: 12px; 30 | } 31 | } 32 | 33 | .attribute-info-perms { 34 | code { 35 | margin-left: 1.5rem; 36 | } 37 | 38 | :global(.material-symbols-outlined) { 39 | color: #ddac30; 40 | position: absolute; 41 | font-size: 18px; 42 | margin-top: 4px; 43 | cursor: default; 44 | } 45 | } 46 | 47 | .attribute-link { 48 | cursor: pointer; 49 | position: absolute; 50 | margin-left: -1.7rem; 51 | margin-top: 0.1rem; 52 | opacity: 0; 53 | transition: opacity var(--ifm-transition-fast); 54 | } 55 | 56 | .attribute-permissions { 57 | margin-top: 0.5rem; 58 | } 59 | 60 | .attribute-deprecated { 61 | display: inline-block; 62 | margin-left: 0.5rem; 63 | 64 | span { 65 | background-image: repeating-linear-gradient( 66 | -70deg, 67 | #00000020 0px, 68 | #00000020 10px, 69 | #ffb30120 10px, 70 | #ffb10120 20px 71 | ); 72 | } 73 | } 74 | 75 | .attribute-optional, .attribute-required { 76 | float: right; 77 | } 78 | 79 | .attribute-required { 80 | color: #ddac30; 81 | } 82 | 83 | .attribute-optional { 84 | font-style: italic; 85 | } 86 | 87 | .attribute-parent { 88 | > .attribute { 89 | border-bottom: 0; 90 | margin-left: 0; 91 | } 92 | 93 | border-bottom: 1px solid rgb(45, 45, 45); 94 | } 95 | 96 | .attribute-children { 97 | display: none; 98 | 99 | &.attribute-children-visible { 100 | display: block; 101 | border: 1px solid rgb(45, 45, 45); 102 | } 103 | 104 | .attribute-link :global(.material-symbols-outlined) { 105 | background-color: white; 106 | } 107 | 108 | > .attribute { 109 | margin-left: 1rem; 110 | 111 | &:last-child { 112 | border-bottom: 0 !important; 113 | } 114 | } 115 | 116 | .attribute-optional, .attribute-required { 117 | margin-right: 1rem; 118 | } 119 | 120 | .attribute-children { 121 | margin-right: 1rem; 122 | } 123 | } 124 | 125 | .attribute-showhide-children { 126 | border: 1px solid rgb(45, 45, 45); 127 | border-radius: 0.5rem; 128 | padding: 0.15rem 0.55rem 0.15rem 0.5rem; 129 | width: fit-content; 130 | font-size: 12px; 131 | cursor: pointer; 132 | 133 | &.attribute-children-visible { 134 | border-bottom-left-radius: 0; 135 | border-bottom-right-radius: 0; 136 | margin-bottom: -1px; 137 | } 138 | } 139 | 140 | [data-theme='dark'] { 141 | .attribute-children .attribute-link :global(.material-symbols-outlined) { 142 | background-color: #1b1b1d; 143 | } 144 | } -------------------------------------------------------------------------------- /src/components/Attribute.tsx: -------------------------------------------------------------------------------- 1 | import React, { FunctionComponent, ReactNode, useCallback, useState } from 'react'; 2 | import MaterialIcon from './MaterialIcon'; 3 | 4 | import styles from './attribute.module.scss'; 5 | import Highlight from './Highlight'; 6 | import clsx from 'clsx'; 7 | 8 | interface Props { 9 | children: ReactNode; 10 | id: string; 11 | name: string; 12 | type: string; 13 | optional?: boolean; 14 | response?: boolean; 15 | deprecated?: boolean; 16 | permissions?: string[]; 17 | } 18 | 19 | export function Attribute({ 20 | children, name, id, type, response = false, optional = false, deprecated = false, permissions = [], 21 | }: Props) { 22 | const hasPermissions = permissions.length > 0; 23 | 24 | return ( 25 |
26 |
27 | 28 | 29 | 30 |
31 |
32 | {hasPermissions && ( 33 | 34 | )} 35 | {name} 36 | 37 | {type} 38 | {optional && (optional)} 39 | {deprecated && ( 40 |
41 | 42 | Deprecated 43 | 44 |
45 | )} 46 | {(!optional && !response) && ( 47 |
48 | Required 49 |
50 | )} 51 | {(optional && response) && ( 52 |
53 | nullable 54 |
55 | )} 56 |
57 |
58 |
59 | {children} 60 | {permissions.length > 0 && ( 61 |
62 | Required Scope(s): {permissions.join(', ')} 63 |
64 | )} 65 |
66 |
67 | ); 68 | } 69 | 70 | interface ParentProps extends Props { 71 | children: ReactNode[]; 72 | } 73 | 74 | export function ParentAttribute(props: ParentProps): JSX.Element { 75 | const [childState, setChildState] = useState(false); 76 | const toggleChildren = useCallback(() => setChildState(!childState), [childState]); 77 | 78 | return ( 79 |
80 | 81 |
82 | {childState ? 'Hide' : 'Show'} child attributes 83 |
84 |
85 | {props.children[1]} 86 |
87 |
88 | ) 89 | } -------------------------------------------------------------------------------- /docs/api/gettingstarted/gettingstarted.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | displayed_sidebar: apiSidebar 4 | --- 5 | 6 | # Getting Started 7 | 8 | :::caution 9 | The ConCat APIs are in **early access**, are subject to change, and are available to event customers and select external partners only. 10 | 11 | If you're interested in integrating with ConCat, please reach out to **developers@concat.systems** with your use-case. 12 | ::: 13 | 14 | There are two ways to integrate with the ConCat APIs: On Behalf Of (OBO) a user, or as a service. Service-level integration is the preferred method and will allow modification of data in the future, whereas OBO integration will remain read-only and intended for primarily authentication purposes. 15 | 16 | ## Which method should I use? 17 | 18 | #### On Behalf Of (OBO) a user 19 | The OBO method is intended primarily for authenticating a user to a third-party service and providing metadata about the user, such as their name, email address, and any roles or permissions they have. 20 | 21 | OBO requires the service to redirect the user to an authentication page displaying the requested permission scopes, a basic description of the service, and the ability to grant or deny access. 22 | 23 | #### As a service 24 | The as a service method is intended for allowing a third-party service to retrieve and modify data within the ConCat platform. This is useful for micro-services that need to perform automated actions based on webhooks, or that need to perform actions that require elevated permissions. 25 | 26 | Permissions for a service integration are granted by an event customer at the time the integration is created. There is no additional approval or authentication step. If your service requires additional permissions, you will need to contact the event customer to request them. 27 | 28 | ## Registering as a developer 29 | 30 | Developer registration is by invitation only. To register as a developer, please reach out to **developers@concat.systems** with the following: 31 | 32 | * Your name 33 | * Your company name, website, and contact information 34 | * A display name for your application 35 | * A short description of your use-case 36 | * A list of our event customers you are interested in, or are already working with *(optional)* 37 | 38 | Upon approval, you will be given a unique API ID and secret key. You can use these to authenticate your requests to the ConCat APIs in both OBO and as a service methods. 39 | 40 | ## Authenticating requests 41 | 42 | All requests to the ConCat APIs **must** be done through a HTTPS connection, with a minimum TLS protocol of v1.2 or newer. A time-limited authentication Bearer token must be obtained and provided in the Authorization header of each request. 43 | 44 | :::info 45 | The Authorization header should always be provided even if the request is not authenticated. This helps us prevent abuse of the APIs, and collect usage statistics to improve the service. 46 | ::: 47 | 48 | ## Revoking access 49 | If there's no activity by your integration for a year or more, we reserve the right to revoke your API credentials to prevent abuse. You can reach back out to us to re-activate at any time. 50 | 51 | If you're no longer planning to use the ConCat APIs, we ask that you reach out to us to let us know. We'll revoke your API credentials and remove your integration from our systems. 52 | 53 | ### Handling revocations 54 | In the event your integration is revoked, you'll receive a revocation email and will no longer be able to authenticate to the APIs. You **must** delete all associated event data stored by your application within 30 days of receiving the revocation email. -------------------------------------------------------------------------------- /docs/api/endpoints/v0/_registrationModel.mdx: -------------------------------------------------------------------------------- 1 | 2 | The date the registration record was created. 3 | 4 | 5 | The date the registration record was last updated. 6 | 7 | 8 | User input field about the badge name. 9 | 10 | 11 | Current status of the registration. Either "paid" or "unpaid". 12 | 13 | 14 | The name of the product the user purchashed when "paid", or intent to purchase when "unpaid". 15 | 16 | 17 | The display name of the product. 18 | 19 | 20 | The unique identifier for the product. 21 | 22 | 23 | A set of options, customized by the event, that contain arbitrary data provided by the volunteer. 24 | <> 25 | 26 | The name of the option as defined by the event. 27 | 28 | 29 |
The type of the option as defined by the event.
30 |
31 | Possible values: select, multi, text, number. 32 |
33 |
34 | 35 | The value of the option. 36 | 37 | 38 |
39 | 40 | Flag information 41 | <> 42 | 43 | The unique identifier of the flag. 44 | 45 | 46 | The flag short name. 47 | 48 | 49 | 50 | 51 | User information 52 | <> 53 | 54 | The unique identifier of the user. 55 | 56 | 57 | The first name of the user. 58 | 59 | 60 | The last name of the user. 61 | 62 | 63 | The username of the user. 64 | 65 | 66 | The preferred name of the user. If provided, this should be used instead of the first and last name, except where legally required. 67 | 68 | 69 | The phone number of the user in E.164 format. 70 | 71 | 72 | The email address of the user. 73 | 74 | 75 | -------------------------------------------------------------------------------- /docs/guides/registration/cashier/cashier.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | --- 4 | 5 | # Cashier UI 6 | 7 | Cashier Mode is a special interface designed to optimize the workflow of checking users into the convention and giving out badges. 8 | 9 | Cashiers can use a handheld barcode scanner (PDF417) to scan driver’s licenses for faster check-ins. 10 | 11 | The interface is specifically tailored for faster check-ins, such as pinpointing mismatched information with the driver’s license, pointing out if the user is underage, missing payments, if they are a guardian, if there are any notes/bans on the user’s profile, if the badge contains banned words, etc... 12 | 13 | Much like the user search in Housekeeping, the search box will automatically navigate to the matched user if only one search result is found. Otherwise, the cashier will need to pick from a list of matching users. 14 | 15 | ## Banned Words and Updating Registrations 16 | 17 | You may see an alert that a user has a banned word in their name. If the cashier deems it appropriate they can go ahead and print the badge anyways (no filter is perfect), but in most cases it may not be appropriate and the cashier needs to update the registration. 18 | 19 | Registration Updating is done by going to Actions -> Update registration. You can change any details about the attendee's registration including the tier. The badge preview and warnings will update appropriately. 20 | 21 | ## Product Delivery 22 | 23 | If a guest has physical products to pickup at registation, they will be displayed under **Undelivered products** 24 | 25 | ## Configure Registration Station 26 | 27 | Within the settings of the registration station, there are multiple options that can be configured. 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 |
OptionExplanation
Enable payment acceptanceIf enabled, this registration station will be able to accept payments. This will allow cashiers to take payments for any balance due on an attendee's account. Otherwise, cashiers will be informed they should direct the attendee to a different registration station.
Require ID barcode scanIf enabled, this registration station require an ID barcode to be scanned before a badge can be printed. Otherwise, cashiers will be informed they should direct the attendee to a different registration station.
Enable staff check-inIf enabled, this registration station will be able to print staff and volunteer badges. This affects printing badges for anyone with an approved volunteer application. Otherwise, cashiers will be informed they should direct the attendee to a different registration station.
Print separate staff badgeIf enabled, this registration station will print two badges, one with the attendee's chosen attendance type, and one with the "STAFF" text. Otherwise, a combination badge will be printed with the attendee's chosen attendance type and the "STAFF" text together, separated by a slash.
Print separate vendor badgeIf enabled, this registration station will print two badges, one with the attendee's chosen attendance type, and one with the "VENDOR" text. Otherwise, a combination badge will be printed with the attendee's chosen attendance type and the "VENDOR" text together, separated by a slash.
55 | 56 | ## Badge type printer preferences 57 | 58 | You can configure which badge type is printed on which printer by selecting the badge type from the menu and using the arrows to move between the two printers listed. 59 | 60 | -------------------------------------------------------------------------------- /docs/guides/orders/orders.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | hide_table_of_contents: true 4 | --- 5 | 6 | # Orders 7 | 8 | An order is a collection of products (such as an event registration, vendor table, or event store purchase) a given attendee wants to purchase. Order are created automatically when an attendee has a product added to their cart. 9 | 10 | Orders can be viewed through the "**Orders**" page in Housekeeping, or through the orders tab on an attendee's profile. 11 | 12 | ### Order states 13 | 14 | Orders can be in one of two states: **unpaid** and **paid**. Orders will transition from the unpaid to paid state whenever payment is made in full, a voucher meets or exceeds the order total, or the order is manually marked as paid via the "**Orders**" page. 15 | 16 | Unpaid orders currently do not expire, but can be edited and cancelled at any time through the housekeeping interface. 17 | 18 | ### Creating an order 19 | 20 | Most of the time, an order is created automatically when an attendee adds a product to their cart. However, if you need to manually add a product to an attendee's cart, but they don't have an existing unpaid order, you can create one using the following steps: 21 | 22 |
    23 |
  1. 24 | 25 | Navigate to your event website, then click "Housekeeping" from the left-hand sidebar. 26 | 27 |
  2. 28 |
  3. 29 | 30 | Click "User Search" from the left-hand sidebar, then click the "Orders" tab. 31 | 32 |
  4. 33 |
  5. 34 | 35 | Click "Create New Order". 36 | 37 |
  6. 38 |
  7. 39 | 40 | Click "Show Details" on the newly created order to open it in the "Orders" page. Click the plus (add) icon next to "Pending Payment" to add a product to the order. 41 | 42 |
  8. 43 |
44 | 45 | ### Modifying an order 46 | 47 | While an order is **unpaid**, you can add, modify, or remove products and vouchers on the order. You can also mark the order as paid, or cancel the order. 48 | 49 | :::note Limitations 50 | It is not currently possible to: 51 | * Override the line item price of a product 52 | * Change the reference ID for an attendance type product 53 | * Add an existing voucher to an order 54 | * Request shipping details that differ from the attendee's address 55 | ::: 56 | 57 | ### Order fulfillment 58 | 59 | 60 |
61 |

62 | If a paid order contains a fulfillable product, the order will be shown in yellow on the order list as "Pending Fulfillment". Fulfillable products are any products outside of the registration and vendor / dealer categories, with the exception of QuikTicket™-enabled products. 63 |

64 |

To fulfill an order, follow the steps below:

65 |
    66 |
  1. 67 | 68 | Navigate to the order you want to fulfill. 69 | 70 |
  2. 71 |
  3. 72 | 73 | Click "Mark as Fulfilled". 74 | 75 |
  4. 76 |
  5. 77 | 78 | Click the checkbox next to each product you want to fulfill. 79 | 80 |
  6. 81 |
  7. 82 | 83 | Click "Fulfill Order". 84 | 85 |
  8. 86 |
87 |
88 |
89 | 90 |
91 |
92 | 93 | :::note Limitations 94 | It is not currently possible to select all items in an order to be fulfilled. Additionally, the attendee will not receive a confirmation email when an order is fulfilled. 95 | ::: -------------------------------------------------------------------------------- /docs/guides/registration/raffle.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 4 3 | --- 4 | 5 | # Raffles 6 | 7 | For events with limited space, raffles allow to have a lottery for your attendee registration. All registrations will be given a virtual raffle ticket, in which the event organizer can choose when to run the raffle at a later date. 8 | 9 | Each ticket has 5 different states: 10 | * waiting - The user is waiting for the raffle to run 11 | * winner - The raffle has run, and the user is allowed to purchase a registration 12 | * redeemed - The user has won, and used their ticket to purchase a registration 13 | * rescinded - The user has lost, and no longer allowed to re-enter the raffle 14 | * deleted - The user has lost, and is allowed to re-enter the raffle for the next round 15 | 16 | # Creating a raffle 17 | 18 |
    19 |
  1. 20 | 21 | Navigate to your event website, then click "Housekeeping" from the left-hand sidebar. 22 | 23 |
  2. 24 |
  3. 25 | 26 | Click "Raffles" from the left-hand sidebar, under the "Product Management" section. 27 | 28 |
  4. 29 |
  5. 30 | 31 | Click "Create New Raffle". 32 | 33 |
  6. 34 |
  7. 35 | 36 | Enter a name for the raffle. You can also allow staff and volunteers to bypass the raffle by relevant checkbox. 37 | 38 |
  8. 39 |
  9. 40 |
    41 |
    Use the wizard to configure the weight configuration.
    42 |
    To operate a raffle with equal chances, select "Add Static Weight" and enter a value of "1".
    43 |
    44 |
  10. 45 |
  11. 46 | 47 | Under "Associated Products", search for and select the products that will be included in the raffle. 48 | 49 |
  12. 50 |
  13. 51 | 52 | Click "Create Raffle". 53 | 54 |
  14. 55 |
56 | 57 | # Running the raffle 58 | 59 |
    60 |
  1. 61 | 62 | Navigate to the raffle you want to draw. 63 | 64 |
  2. 65 |
  3. 66 | 67 | Click the "Entrants" tab, then "Run Raffle". 68 | 69 |
  4. 70 |
  5. 71 |
    72 |
    73 | Enter the number of winners to draw, what should happen to existing winners (if any), and what should happen to any entrants who do not win in this draw. 74 |
    75 | 76 | If you plan to run multiple draws, leave the "non-winners" option as "Do Nothing". 77 | 78 |
    79 |
  6. 80 |
  7. 81 | 82 | (Optional) If you plan to run multiple draws and want to accept new entries in between draws, uncheck "Close the raffle to new entries". 83 | 84 |
  8. 85 |
  9. 86 | 87 | (Optional) You can perform a test run of the raffle to verify the raffle logic by checking "Perform a test run". 88 | 89 |
  10. 90 |
  11. 91 | 92 | Click "Run Raffle Draw". This could take a few minutes depending how many entries there are. 93 | 94 |
  12. 95 |
96 | 97 | # Ticket points 98 | 99 | Ticket points are a way to increase the odds for entrants who don't win a previous draw for the same raffle. 100 | 101 | To run a raffle that supports ticket points, you will need to add a "**Ticket Points**" node to the weight configuration. When you perform a draw, check the "**Give non-winners a ticket point**" checkbox to give any entrants who do not win a ticket point. -------------------------------------------------------------------------------- /docs/guides/products/surcharges.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 5 3 | hide_table_of_contents: true 4 | --- 5 | 6 | # Surcharges 7 | 8 | Surcharges can be used to add additional flat-rate or percentage-based fees to a product, such as sales tax, shipping, and handling fees. 9 | 10 | :::caution Important 11 | In some jurisdictions, charging processing fees to your customers may be prohibited by law. It is your responsibility to act in accordance with applicable law. 12 | ::: 13 | 14 | ### Creating a Surcharge 15 | 16 | 17 |
    18 |
  1. 19 | 20 | Navigate to your event website, then click "Housekeeping" from the left-hand sidebar. 21 | 22 |
  2. 23 |
  3. 24 | 25 | Click "Surcharges" from the left-hand sidebar, then click "Create New Surcharge". 26 | 27 |
  4. 28 |
  5. 29 | 30 | Enter an internal name and display name for your surcharge. 31 | 32 |
  6. 33 |
  7. 34 |
    35 |
    Select the type of surcharge you want to create.
    36 |
      37 |
    • 38 | Surcharge - Fixed Amount - A fixed amount that is added to the line item price of the product. 39 |
    • 40 |
    • 41 | Surcharge - Percentage - A percentage that is calculated from the base line item price of a product. 42 |
    • 43 |
    • 44 | Tax Rate - A Government tax rate that is calculated from the base line item price of a product and added to the order total. 45 |
    • 46 |
    47 |
    48 |
  8. 49 |
  9. 50 | 51 | Enter the amount or percentage rate of the surcharge. 52 | 53 |
  10. 54 |
  11. 55 | 56 | Click "Create Surcharge". 57 | 58 |
  12. 59 |
60 |
61 | 62 |
63 |
64 | 65 | ### Associating a Surcharge with a Product 66 | 67 | After a surcharge has been created, you'll need to associate it with a product using the following steps: 68 | 69 | 70 |
    71 |
  1. 72 | 73 | In Housekeeping, navigate to the product's page. 74 | 75 |
  2. 76 |
  3. 77 | 78 | Click the green plus (add) button next to the "Surcharges" section. 79 | 80 |
  4. 81 |
  5. 82 | 83 | Search for the surcharges you want to add and select them from the dropdown. 84 | 85 |
  6. 86 |
  7. 87 | 88 | Click "Assign Surcharges". 89 | 90 |
  8. 91 |
92 |
93 | 94 |
95 |
96 | 97 | ### Passing Platform Fees to Customers 98 | 99 | By default, the platform fees charged by ConCat are absorbed into your pricing and subtracted from the order total when the payment is processed. You can choose to pass the platform fees to the customer instead by checking the "Pass Platform Fees to Customer" checkbox on a product's page. 100 | 101 | When you pass platform fees to the customer, the platform fees are added on top of the attendee's order total and will be visible on the checkout and order history pages. 102 | 103 | You can change this setting at any time, but it will only apply to orders processed after the change was made. -------------------------------------------------------------------------------- /docs/guides/products/options.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 3 3 | hide_table_of_contents: true 4 | --- 5 | 6 | # Product Options 7 | 8 | Product options allow you to request additional information from attendees when they purchase a product, such as a T-Shirt size, or a color. Product options are generic and can be used with any product. 9 | 10 | ### Types of Product Options 11 | 12 | 29 | 30 | ### Creating a Product Option 31 | 32 | 33 |
    34 |
  1. 35 | 36 | Navigate to your event website, then click "Housekeeping" from the left-hand sidebar. 37 | 38 |
  2. 39 |
  3. 40 | 41 | Click "Options" from the left-hand sidebar, then click "Create New Option". 42 | 43 |
  4. 44 |
  5. 45 |
    46 |
    Enter a name for your option, and select the type of option you want to create.
    47 |
    48 | Note: The chosen name will be displayed to the attendee when they customize a product with this option. 49 |
    50 |
    51 |
  6. 52 |
  7. 53 | 54 | Customize the option based on the type of option you selected. Fields that are optional are marked with a (Optional) label. 55 | 56 |
  8. 57 |
  9. 58 | 59 | Click "Create". 60 | 61 |
  10. 62 |
63 |
64 | 65 |
66 |
67 | 68 | ### Associating a Product Option with a Product 69 | 70 | After a product option has been created, you'll need to associate it with a product using the following steps: 71 | 72 | 73 |
    74 |
  1. 75 | 76 | In Housekeeping, navigate to the product's page. 77 | 78 |
  2. 79 |
  3. 80 | 81 | Click the green plus (add) button next to the "Options" section. 82 | 83 |
  4. 84 |
  5. 85 | 86 | Search for the product options you want to add and select them from the dropdown. 87 | 88 |
  6. 89 |
  7. 90 | 91 | (Optional) If you want to require the attendee to select or fill in a value for this option, check the "Mark Selected Options as Required" checkbox. 92 | 93 |
  8. 94 |
  9. 95 | 96 | Click "Assign Options". 97 | 98 |
  10. 99 |
100 |
101 | 102 |
103 |
104 | 105 | :::note Note 106 | Disassociating a product option from a product will not remove the attendee selected / entered value, or modify the line item price, on any existing orders. 107 | ::: -------------------------------------------------------------------------------- /docs/api/endpoints/v0/_volunteerModel.mdx: -------------------------------------------------------------------------------- 1 | 2 | The date the volunteer record was created. 3 | 4 | 5 | The date the volunteer record was last updated. 6 | 7 | 8 | Set of contact methods provided by the volunteer. 9 | <> 10 | 11 | The name of the contact method. 12 | 13 | 14 | Whether this contact method is the preferred way of contacting the volunteer. 15 | 16 | 17 | An arbitrary string identifier for the contact method. 18 | 19 | 20 | 21 | 22 | Set of departments where the volunteer has expressed a preference or has an assignment. 23 | <> 24 | 25 | The unique identifier of the department. 26 | 27 | 28 |
The flags indicating the volunteer's preference or assignment for the department.
29 |
30 | Possible values: experience, interest, avoid, assignment, request 31 |
32 |
33 | 34 | The name of the department. 35 | 36 | 37 |
38 | 39 | The user object for the volunteer. 40 | <> 41 | 42 | The unique identifier of the user. 43 | 44 | 45 | The first name of the user. 46 | 47 | 48 | The last name of the user. 49 | 50 | 51 | The username of the user. 52 | 53 | 54 | The preferred name of the user. If provided, this should be used instead of the first and last name, except where legally required. 55 | 56 | 57 | The phone number of the user in E.164 format. 58 | 59 | 60 | The email address of the user. 61 | 62 | 63 | 64 | 65 | A set of options, customized by the event, that contain arbitrary data provided by the volunteer. 66 | <> 67 | 68 | The name of the option as defined by the event. 69 | 70 | 71 |
The type of the option as defined by the event.
72 |
73 | Possible values: select, multi, text, number. 74 |
75 |
76 | 77 | The value of the option. 78 | 79 | 80 |
-------------------------------------------------------------------------------- /docs/guides/registration/badge_designer.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 3 3 | --- 4 | 5 | # Badge Designer 6 | 7 | 8 |
9 |

10 | The badge designer allows you to customize the badge layout and styling, using a layer style positioning of elements, to enable compatibility with a wide array of printing hardware and design needs. 11 |

12 |

13 | You can select from a variety of user-generated content, such as real name, badge ID, badge name, and attendance tier. 14 |

15 |
16 |
17 | 18 |
19 |
20 | 21 | :::info 22 | Using the badge designer currently requires the `system:settings:update` and `system:badgedesign:read` permission. Creating / updating badge designs additionally requires the `system:badgedesign:update` permission. 23 | ::: 24 | 25 | ### Creating a new design 26 | 27 | To facilitate designing and testing new layouts, you can create an unlimited number of badge designs, using the following steps: 28 | 29 |
    30 |
  1. 31 | 32 | Navigate to your event website, then click "Housekeeping" from the left-hand sidebar. 33 | 34 |
  2. 35 |
  3. 36 | 37 | Click "Settings" from the left-hand sidebar, then "Badge Designer" from the top menu. 38 | 39 |
  4. 40 |
  5. 41 | 42 | Click the green plus (add) button. 43 | 44 |
  6. 45 |
  7. 46 | 47 | Enter a name for the design in the "Display Name" field. 48 | 49 |
  8. 50 |
  9. 51 |
    52 | Under "Details" choose the artboard size for your design, in inches: 53 |
      54 |
    • 55 | X and Y: The margin of the artboard from the left and top (respectively). 56 |
    • 57 |
    • 58 | Width and Height: The maximum width and height of the customizable artboard. 59 |
    • 60 |
    61 |
    62 |
  10. 63 |
  11. 64 | Customize the design by adding additional nodes (layer groups) and text. 65 |
  12. 66 |
  13. 67 | Once you've finished your design, click "Save". 68 |
  14. 69 |
70 | 71 | ### Exporting / importing designs 72 | 73 | You can easily export or import a design by opening an existing design or following the instructions above to create a new design, and selecting "**Export**" or "**Import**" from the top menu bar. 74 | 75 | Badge design files are stored in JSON format and can be freely shared. 76 | 77 | ### Pre-printed canvas 78 | 79 | 80 |
81 |

82 | If you have your badges pre-printed with background art through a third-party service, you can enable this option add an additional artboard behind the design. 83 |

84 |

85 | This is useful for checking the positioning of your design elements to avoid overprinting, and quickly previewing the design across different background art. 86 |

87 |

88 | Use of this feature requires uploading at least one Badge Art image to the system. 89 |

90 |
91 |
92 | 93 |
94 |
95 | 96 | ### Limitations 97 | 98 | * Static content (such as fixed text and background images), rear-side / double-sided printing, and use of Product Options is not yet supported. 99 | * Currently only printer hardware connected through the operating system print dialog is supported. Direct print support for Zebra printers will be supported in the future. 100 | * Due to browser limitations, you may need to pre-configure the print dialog to use the correct Paper Size, Scaling, and to disable Headers and Footers. -------------------------------------------------------------------------------- /src/pages/pricing.tsx: -------------------------------------------------------------------------------- 1 | import Layout from "@theme/Layout"; 2 | import React from "react"; 3 | import Card from "../components/Card"; 4 | import MaterialIcon from "../components/MaterialIcon"; 5 | import SplitColumn from "../components/SplitColumn"; 6 | 7 | import styles from './pricing.module.scss'; 8 | 9 | export default function Pricing(): JSX.Element { 10 | return ( 11 | 14 |
15 | 16 |
17 |

Pricing

18 |

19 | ConCat offers a feature-packed event management experience for a hard to believe price that 20 | scales as your event grows. 21 |

22 |

23 | We offer a fixed price per registered attendee & hotel reservations, and a small percentage for all other transactions, 24 | such as vendor tables and the event store. 25 |

26 |

No Module Costs

27 |

28 | There's no per-module costs for the additional modules included with ConCat. That means you 29 | get vendor management, volunteer management, hotel management, and our event store at no extra cost! 30 |

31 |

No Hidden Costs

32 |

33 | You don't like hidden costs and neither do we. That's why the only prices you'll pay are 34 | the ones you see here. We also don't require free badges for our engineers or support staff. 35 |

36 |

Payments by Stripe

37 |

38 | We integrate with Stripe Connect to securely accept credit cards, Apple Pay, Google Pay, and bank transfers in more 39 | than 135 countries. 40 |

41 |
42 | 43 |
44 |
$1.00 per attendee*
45 |
$1.00 per hotel room
46 |
1% all other transactions*
47 |
* Stripe fees not included.
48 |
49 |
50 |
    51 |
  • 52 | 53 | Cloud Hosted 54 |
  • 55 |
  • 56 | 57 | Unlimited Attendees 58 |
  • 59 |
  • 60 | 61 | Unlimited Products 62 |
  • 63 |
  • 64 | 65 | Volunteer Management 66 |
  • 67 |
  • 68 | 69 | Vendor Management 70 |
  • 71 |
  • 72 | 73 | Basic Support 74 |
  • 75 |
  • 76 | 77 | Free concat.app Subdomain 78 |
  • 79 |
  • 80 | 81 | Free Custom Domain 82 |
  • 83 |
84 |
85 | 93 |
94 |
95 |
96 |
97 | ); 98 | } -------------------------------------------------------------------------------- /src/css/custom.scss: -------------------------------------------------------------------------------- 1 | @import '@site/src/css/_variables.scss'; 2 | 3 | /** 4 | * Any CSS included here will be global. The classic template 5 | * bundles Infima by default. Infima is a CSS framework designed to 6 | * work well for content-centric websites. 7 | */ 8 | 9 | /* You can override the default Infima variables here. */ 10 | :root { 11 | --ifm-color-primary: #2e5585; 12 | --ifm-color-primary-dark: #29784c; 13 | --ifm-color-primary-darker: #277148; 14 | --ifm-color-primary-darkest: #205d3b; 15 | --ifm-color-primary-light: #33925d; 16 | --ifm-color-primary-lighter: #359962; 17 | --ifm-color-primary-lightest: #3cad6e; 18 | --ifm-code-font-size: 95%; 19 | } 20 | 21 | /* For readability concerns, you should choose a lighter palette in dark mode. */ 22 | [data-theme='dark'] { 23 | --ifm-color-primary: #25a0c2; 24 | --ifm-color-primary-dark: #21af90; 25 | --ifm-color-primary-darker: #1fa588; 26 | --ifm-color-primary-darkest: #1a8870; 27 | --ifm-color-primary-light: #29d5b0; 28 | --ifm-color-primary-lighter: #32d8b4; 29 | --ifm-color-primary-lightest: #4fddbf; 30 | } 31 | 32 | .docusaurus-highlight-code-line { 33 | background-color: rgba(0, 0, 0, 0.1); 34 | display: block; 35 | margin: 0 calc(-1 * var(--ifm-pre-padding)); 36 | padding: 0 var(--ifm-pre-padding); 37 | } 38 | 39 | [data-theme='dark'] .docusaurus-highlight-code-line { 40 | background-color: rgba(0, 0, 0, 0.3); 41 | } 42 | 43 | /* 44 | * Reset the line-number counter for each .prism-code scope 45 | */ 46 | .prism-code { 47 | counter-reset: line-number; 48 | } 49 | 50 | /* 51 | * Notice the chained .language-ts class name to .prism-code 52 | * You can chain more languages in order to add line numbers 53 | */ 54 | .prism-code .token-line::before { 55 | counter-increment: line-number; 56 | content: counter(line-number); 57 | margin-right: calc(var(--ifm-pre-padding) * 0.5); 58 | text-align: right; 59 | display: inline-block; 60 | position: sticky; 61 | min-width: 1.25rem; 62 | left: 0; 63 | color: rgba(0, 0, 0, 0.3); 64 | background-color: rgb(246, 248, 250); 65 | height: 100%; 66 | margin-left: -1rem; 67 | padding-left: calc(var(--ifm-pre-padding) * 1); 68 | padding-right: calc(var(--ifm-pre-padding) * 1); 69 | } 70 | 71 | [data-theme='dark'] .prism-code .token-line::before { 72 | background-color: rgb(40, 42, 54); 73 | color: rgba(255, 255, 255, 0.3); 74 | } 75 | 76 | div[class^="announcementBar_"] > div { 77 | cursor: default; 78 | color: white; 79 | 80 | .material-symbols-outlined { 81 | cursor: default; 82 | font-size: 24px; 83 | position: relative; 84 | top: 6px; 85 | margin-top: -7px; 86 | } 87 | } 88 | 89 | h2, h3 { 90 | border-bottom: 1px solid rgb(65, 65, 65); 91 | margin-top: calc(var(--ifm-h3-vertical-rhythm-top) * var(--ifm-leading) * 2) !important; 92 | } 93 | 94 | details { 95 | margin-top: 1.5rem !important; 96 | } 97 | 98 | .navbar__logo { 99 | width: 32px; 100 | } 101 | 102 | i.material-symbols-outlined { 103 | font-size: 16px; 104 | margin-right: 0; 105 | position: relative; 106 | top: 3px; 107 | 108 | &.medium { 109 | font-size: 24px; 110 | margin-top: -5px; 111 | top: 7px; 112 | } 113 | } 114 | 115 | .numbered-list { 116 | counter-reset: item; 117 | list-style-type: none; 118 | 119 | > li { 120 | display: flex; 121 | margin-bottom: 1rem; 122 | } 123 | 124 | > li:before { 125 | content: counter(item); 126 | counter-increment: item; 127 | margin-right: 1rem; 128 | background-color: $brand-accent; 129 | padding: 0.2rem; 130 | border-radius: 100%; 131 | width: 25px; 132 | height: 25px; 133 | font-size: 14px; 134 | text-align: center; 135 | flex-shrink: 0; 136 | } 137 | 138 | > li li { 139 | margin-top: 0; 140 | margin-bottom: 0.25rem; 141 | } 142 | 143 | .theme-admonition { 144 | margin-top: 0.5rem; 145 | margin-bottom: 0.5rem; 146 | } 147 | } 148 | 149 | img.bordered-img { 150 | box-shadow: 0 0 5px #000; 151 | border-radius: 10px; 152 | margin-bottom: 1rem; 153 | } 154 | 155 | [data-theme='dark'] { 156 | .numbered-list { 157 | > li:before { 158 | background-color: $brand-dark; 159 | } 160 | } 161 | 162 | .bordered-img { 163 | box-shadow: 0 0 5px #fff; 164 | position: relative; 165 | } 166 | } -------------------------------------------------------------------------------- /src/components/FeatureList.tsx: -------------------------------------------------------------------------------- 1 | import clsx from "clsx"; 2 | import React, { ReactNode, useCallback, useState } from "react"; 3 | import MaterialIcon from "./MaterialIcon"; 4 | import SplitColumn from "./SplitColumn"; 5 | 6 | import styles from './featurelist.module.scss'; 7 | 8 | interface Feature { 9 | name: string; 10 | icon: string; 11 | id: string; 12 | description: ReactNode; 13 | img?: string; 14 | } 15 | 16 | const features: Feature[] = [ 17 | { 18 | description: `No event management platform is complete without a means to register for an event. With 19 | product images, scheduled pricing, and add-on support, you can customize each attendance tier to 20 | meet your needs!`, 21 | icon: "badge", 22 | id: "attendee-reg", 23 | img: "AttendeeRegistration.png", 24 | name: "Attendee Registration", 25 | }, 26 | { 27 | description: `With the event store you can provide attendees the ability to purchase additional promotional items 28 | ahead of your event, as well as free and paid tickets to panel events with limited seating through 29 | QuikTicket™.`, 30 | icon: "shopping_basket", 31 | id: "event-store", 32 | img: "EventStore.png", 33 | name: "Event Store", 34 | }, 35 | { 36 | description: `Staff and Volunteers are the backbone of any successful event, so we included both a 37 | staff application and assignment module to make HR a breeze for you and your attendees.`, 38 | icon: "groups", 39 | id: "volunteer-mgmt", 40 | img: "HR.png", 41 | name: "Staff and Volunteer Management", 42 | }, 43 | { 44 | description: `Whether you have one or many vendor halls, we'll help you take vendors from 45 | application to approval. With customizable product categories to identify what items your 46 | vendors plan to sell, customizable table types and pricing, and an API to retrieve a list 47 | of approved vendors.`, 48 | icon: "storefront", 49 | id: "vendor-mgmt", 50 | img: "VendorHall.png", 51 | name: "Vendor Hall Management", 52 | }, 53 | { 54 | description: `Add-Ons allow you to include items like promotional items with another product or attendance 55 | type, or to offer it as a paid optional addition. Vouchers and Discounts offer the flexability 56 | to provide either a redeemable code, one-time discount, or a multi-use discount based on role 57 | or time.`, 58 | icon: "redeem", 59 | id: "addons-vouchers-discounts", 60 | img: "VouchersDiscountsAddons.png", 61 | name: "Add-Ons, Vouchers, and Discounts" 62 | }, 63 | { 64 | description: `With Express Mode you can create a fully customized layout to meet your event's 65 | specific needs, including multiple pages, product options, customizable CSS! No extra costs, 66 | all of our customization features are entirely free!`, 67 | icon: "bolt", 68 | id: "express-mode", 69 | img: "ExpressMode.png", 70 | name: "Express Mode" 71 | } 72 | ]; 73 | 74 | export default function FeatureList(): JSX.Element { 75 | const [activeFeature, setActiveFeature] = useState("attendee-reg"); 76 | const feature: Feature = features.find(({ id }) => activeFeature === id); 77 | 78 | return ( 79 | 80 |
81 |
    82 | {features.map(({ 83 | description, icon, id, name, 84 | }) => { 85 | const isActive = activeFeature === id; 86 | const classes = clsx(styles.feature, isActive ? styles['feature-selected'] : undefined); 87 | 88 | return ( 89 |
  • setActiveFeature(id)} 93 | > 94 |
    95 | 96 | {name} 97 |
    98 | {isActive && ( 99 |
    100 | {description} 101 |
    102 | )} 103 |
  • 104 | ); 105 | })} 106 |
107 |
108 | {feature && ( 109 |
110 | 111 |
112 | )} 113 |
114 | ) 115 | } 116 | -------------------------------------------------------------------------------- /docusaurus.config.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | // Note: type annotations allow type checking and IDEs autocompletion 3 | 4 | const lightCodeTheme = require('prism-react-renderer/themes/github'); 5 | const darkCodeTheme = require('prism-react-renderer/themes/dracula'); 6 | 7 | /** @type {import('@docusaurus/types').Config} */ 8 | const config = { 9 | title: 'ConCat', 10 | tagline: 'Manage events. Not spreadsheets.', 11 | url: 'https://concat.app', 12 | baseUrl: '/', 13 | onBrokenLinks: 'throw', 14 | onBrokenMarkdownLinks: 'warn', 15 | favicon: 'img/ConCatLogo.ico', 16 | organizationName: 'ConventionCatCorp', // Usually your GitHub org/user name. 17 | projectName: 'concat-docs', // Usually your repo name. 18 | deploymentBranch: 'deployment', 19 | trailingSlash: false, 20 | 21 | plugins: [require.resolve('docusaurus-plugin-sass')], 22 | 23 | presets: [ 24 | [ 25 | 'classic', 26 | /** @type {import('@docusaurus/preset-classic').Options} */ 27 | ({ 28 | docs: { 29 | sidebarPath: require.resolve('./sidebars.js'), 30 | editUrl: 'https://github.com/ConventionCatCorp/concat-docs/tree/main/', 31 | }, 32 | theme: { 33 | customCss: [require.resolve('./src/css/custom.scss')], 34 | }, 35 | }), 36 | ], 37 | ], 38 | 39 | stylesheets: [ 40 | 'https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@48,500,0,0', 41 | ], 42 | 43 | themeConfig: 44 | /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ 45 | ({ 46 | navbar: { 47 | title: 'ConCat', 48 | logo: { 49 | alt: 'ConCat', 50 | src: 'img/ConCatLogo.svg', 51 | }, 52 | items: [ 53 | { 54 | label: 'Pricing', 55 | position: 'left', 56 | to: '/pricing', 57 | }, 58 | { 59 | type: 'doc', 60 | docId: 'guides/intro', 61 | position: 'left', 62 | label: 'Documentation', 63 | }, 64 | { 65 | type: 'doc', 66 | docId: 'api/intro', 67 | position: 'left', 68 | label: 'API Reference', 69 | }, 70 | { 71 | href: 'https://github.com/ConventionCatCorp/concat-docs', 72 | label: 'GitHub', 73 | position: 'right', 74 | }, 75 | ], 76 | }, 77 | footer: { 78 | style: 'dark', 79 | links: [ 80 | { 81 | title: 'Using ConCat', 82 | items: [ 83 | { 84 | label: 'Getting Started', 85 | to: '/docs/guides/intro', 86 | }, 87 | { 88 | label: 'Pricing', 89 | to: '/pricing', 90 | }, 91 | { 92 | label: 'API Reference', 93 | to: '/docs/api/intro', 94 | }, 95 | ], 96 | }, 97 | { 98 | title: 'Community', 99 | items: [ 100 | { 101 | label: 'Twitter', 102 | href: 'https://twitter.com/ConCatEvents', 103 | }, 104 | ], 105 | }, 106 | { 107 | title: 'Policies', 108 | items: [ 109 | { 110 | label: 'Privacy Policy', 111 | to: '/policy/privacy', 112 | }, 113 | { 114 | label: 'Terms of Service', 115 | to: '/policy/terms', 116 | }, 117 | { 118 | label: 'DMCA Takedown Policy', 119 | to: '/policy/dmca', 120 | } 121 | ] 122 | } 123 | ], 124 | copyright: `Copyright © ${new Date().getFullYear()} Convention Cat Event Systems, Inc.`, 125 | }, 126 | prism: { 127 | additionalLanguages: ['http', 'csp', 'css', 'hpkp', 'hsts', 'javascript', 'json', 'markup', 'uri'], 128 | theme: lightCodeTheme, 129 | darkTheme: darkCodeTheme, 130 | }, 131 | }), 132 | }; 133 | 134 | const branch = process.env.CF_PAGES_BRANCH; 135 | if (branch != null && branch != 'main') { 136 | config.themeConfig.announcementBar = { 137 | id: 'prerelease-banner', 138 | content: 139 | 'construction This is a preview version of the ConCat documentation. Information may be incomplete or inaccurate. Please report any issues on GitHub. (Branch: ' + branch + ')', 140 | backgroundColor: '#ac1b1b', 141 | textColor: '#091E42', 142 | isCloseable: false, 143 | }; 144 | } 145 | 146 | module.exports = config; 147 | -------------------------------------------------------------------------------- /docs/api/endpoints/v0/roles.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 3 3 | displayed_sidebar: apiSidebar 4 | hide_table_of_contents: true 5 | --- 6 | 7 | # Roles 8 | 9 | 10 |
11 | Roles are a way to group users together. They can be used to grant permissions to a group of users, or to identify a group of users for other purposes, such as identifying staff members or those who have signed an NDA. 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | ### List roles 22 | 23 |
24 |

Returns all role objects.

25 |

Authentication

26 |
27 | Service Integration with user:read scope. 28 |
29 |
30 |

Response

31 | 32 | The roles that match the search. 33 | <> 34 | 35 | The unique identifier of the role. 36 | 37 | 38 | The unique name of the role. 39 | 40 | 41 | 42 | 43 | A cursor for pagination across multiple pages of results. If this attribute is present, there are more results available. Use this value in the nextPage parameter for the next request. 44 | 45 |
46 |
47 | 48 | {`curl https://reg.cces.dev/api/v0/roles \\ 49 | -H "Authorization: Bearer "`} 50 | 51 | 52 | {`{ 53 | "data": [ 54 | { 55 | "id": "1234", 56 | "name": "staff" 57 | }, 58 | ], 59 | "nextPage": null 60 | }`} 61 | 62 |
63 | 64 | 65 | ### List user roles 66 | 67 | 68 |
69 |

70 | List the roles given to the specified user. 71 |

72 |

Authentication

73 |
74 | Service Integration with user:read scope. 75 |
76 |
77 |

Response

78 | 79 | The roles of the user. 80 | <> 81 | 82 | The unique identifier of the role. 83 | 84 | 85 | The name of the role. 86 | 87 | 88 | Whatever the role was given to the user globally, or just for the current convention. 89 | 90 | 91 | 92 |
93 |
94 | 95 | {`{ 96 | "data": [ 97 | { 98 | "id": "1234", 99 | "name": "admin", 100 | "scope": "global", 101 | } 102 | ] 103 | }`} 104 | 105 |
106 | 107 | 108 | ### Add role to an user 109 | 110 | 111 |
112 |

113 | Gives the user the specified role. This request will fail if the user already has the role. 114 |

115 |

Authentication

116 |
117 | Service Integration with user:roles:update scope. 118 |
119 |
120 |

Request

121 | 122 | Whatever the role will be given to the user for the current convention, or across all conventions in the organization. Values can be "convention" or "global". 123 | 124 |
125 |
126 |
127 | 128 | {`{ 129 | "scope": "convention" 130 | }`} 131 | 132 |
133 | 134 | 135 | ### Remove role from an user 136 | 137 | 138 | 139 |
140 |

141 | Removes the user from the specified role. This request will fail if the user is not in the role. 142 |

143 |

Authentication

144 |
145 | Service Integration with user:roles:update scope. 146 |
147 |
148 |
149 |
150 | 151 |
152 | -------------------------------------------------------------------------------- /docs/api/endpoints/v0/registration.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 4 3 | displayed_sidebar: apiSidebar 4 | hide_table_of_contents: true 5 | --- 6 | 7 | import RegistrationModel from './_registrationModel.mdx'; 8 | 9 | # Registrations 10 | 11 | 12 |
13 | This object represents event registrations within a convention. 14 |
15 | 16 | 17 | 18 | 19 |
20 | 21 | ### Get Registration 22 | 23 | 24 |
25 |

26 | Gets a single user registration by the giver user id. 27 |

28 |

Authentication

29 |
30 | Service Integration with registration:read scope. 31 |
32 |
33 |

Request

34 | 35 |
36 |
37 | 38 | 39 | {`{ 40 | "createdAt": "2022-02-23T00:30:47.468Z", 41 | "updatedAt": "2022-09-21T01:04:51.456Z", 42 | "badgeName": "Joe", 43 | "status": "paid", 44 | "productName": "Patron", 45 | "productDisplayName": null, 46 | "productId": "172", 47 | "options": [ 48 | { 49 | "name": "Species", 50 | "type": "text", 51 | "value": "Mega Bunny" 52 | }, 53 | { 54 | "name": "Shirt Size", 55 | "type": "select", 56 | "value": "M" 57 | } 58 | ], 59 | "flags": [ 60 | { 61 | "id": "1", 62 | "shortName": "fursuits" 63 | } 64 | ], 65 | "user": { 66 | "id": "1234", 67 | "firstName": "John", 68 | "lastName": "Doe", 69 | "username": "jdoe", 70 | "preferredName": "Johnny", 71 | "phone": "+15555555555", 72 | "email": "johnny.test@concat.systems" 73 | } 74 | }`} 75 | 76 |
77 | 78 | 79 | ### Search registrations 80 | 81 | 82 |
83 |

84 | Search for registrations. A maximum of 100 results will be returned per request. If additional results are available, they can be retrieved using the nextPage parameter from the previous response. 85 |

86 |

Authentication

87 |
88 | Service Integration with registration:read scope. 89 |
90 |
91 |

Request

92 | 93 | A cursor for pagination across multiple pages of results. Don't include this attribute on the first call. Use the nextPage parameter from the previous response for each subsequent request. 94 | 95 | 96 | The maximum number of results to return, between 1 and 100. Defaults to 100. 97 | 98 | 99 | Filters to apply to the search. 100 | <> 101 | 102 | The ID of the user to filter by. 103 | 104 | 105 | 106 |
107 |

Response

108 | 109 | The registrations that match the search. 110 | <> 111 | 112 | 113 | 114 | 115 | A cursor for pagination across multiple pages of results. If this attribute is present, there are more results available. Use this value in the nextPage parameter for the next request. 116 | 117 |
118 |
119 | 120 | {`{ 121 | "nextPage": "eyBsYXN0SWQ6IDEwMDAgfQ==", 122 | "limit": 100, 123 | "filter": { 124 | "userIds": ["1", "2", "3"], 125 | }, 126 | }`} 127 | 128 | 129 | {`{ 130 | "data": [ 131 | { 132 | "createdAt": "2022-02-23T00:30:47.468Z", 133 | "updatedAt": "2022-09-21T01:04:51.456Z", 134 | "badgeName": "Joe", 135 | "status": "paid", 136 | "productName": "Patron", 137 | "productDisplayName": null, 138 | "productId": "172", 139 | "options": [ 140 | { 141 | "name": "Species", 142 | "type": "text", 143 | "value": "Mega Bunny" 144 | }, 145 | { 146 | "name": "Shirt Size", 147 | "type": "select", 148 | "value": "M" 149 | } 150 | ], 151 | "flags": [ 152 | { 153 | "id": "1", 154 | "shortName": "fursuits" 155 | } 156 | ], 157 | "user": { 158 | "id": "1234", 159 | "firstName": "John", 160 | "lastName": "Doe", 161 | "username": "jdoe", 162 | "preferredName": "Johnny", 163 | "phone": "+15555555555", 164 | "email": "johnny.test@concat.systems" 165 | } 166 | }, 167 | ], 168 | "nextPage": null 169 | }`} 170 | 171 |
172 | -------------------------------------------------------------------------------- /docs/api/endpoints/legacy/users.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | displayed_sidebar: apiSidebar 4 | hide_table_of_contents: true 5 | --- 6 | 7 | # Users 8 | 9 | 10 |
11 | This object represents an end-user within an event organization. Users can be attendees, vendors, performers, staff, etc. 12 |
13 | 14 | 15 | 16 |
17 | 18 | ### Retrieve Current User 19 | Returns the user object for the currently authenticated user. 20 | 21 | 22 |
23 |

Authentication

24 |
25 | On Behalf Of (OBO) with pii:basic scope. Other permissions are required to access additional information, such as PII and order history. 26 |
27 |
28 |

Response

29 | 30 | The ID of the user, represented as a string. 31 | 32 | 33 | The date the user was born, in ISO 8601 format. 34 | 35 | 36 | The user's legal first name, as it appears on their ID. 37 | 38 | 39 | The ID of the user. 40 | 41 | 42 | The user's legal last name, as it appears on their ID. 43 | 44 | 45 | Whether the user has opted in to the newsletter. 46 | 47 | 48 | An optional preferred name for the user. This will be displayed first on the user's profile. 49 | 50 | 51 | The user's username. 52 | 53 | 54 | Returns true if the user has verified their email. 55 | 56 | 57 | Returns true if the user has verified their identity. 58 | 59 | 60 | Returns true if the user is an assigned volunteer. 61 | 62 | 63 | The permissions granted to the user. 64 | 65 | 66 | Publicly accessible URL to the user's profile picture. 67 | 68 | 69 | Returns true if the user is assigned as the lead of a department. 70 | 71 |
72 | Scope Restricted Attributes 73 |
74 | 75 | City, town, or village of the user's address. 76 | 77 | 78 | Two-letter ISO 3166-1 alpha-2 country code. 79 | 80 | 81 | First line of the user's address. (e.g. 1234 Main St) 82 | 83 | 84 | Optional second line of the user's address. (e.g. Suite 100, Apt 2B) 85 | 86 | 87 | State or province of the user's address. 88 | 89 | 90 | ZIP or postal code of the user's address. 91 | 92 | 93 | The user's email address. 94 | 95 | 96 | Phone number in international format. (e.g. +15555555555) 97 | 98 |
99 |
100 |
101 |
102 | 103 | {`curl https://reg.cces.dev/api/users/current \\ 104 | -H "Authorization: Bearer "`} 105 | 106 | 107 | {`{ 108 | "sub": "1234", 109 | "addressCity": "New York", 110 | "addressCountry": "US", 111 | "addressLine1": "123 Main St", 112 | "addressLine2": "Suite 100", 113 | "addressState": "NY", 114 | "addressZipcode": "10001", 115 | "bornAt": "1990-01-01T00:00:00.000Z", 116 | "email": "aperson@example.com", 117 | "firstName": "John", 118 | "id": 1234, 119 | "lastName": "Doe", 120 | "newsletter": true, 121 | "phone": "+15555555555", 122 | "preferredName": "Jonathan", 123 | "username": "aperson", 124 | "emailVerified": true, 125 | "identityVerified": true, 126 | "isVolunteer": true, 127 | "permissions": [], 128 | "profilePictureUrl": "https://www.gravatar.com/avatar/example", 129 | "isDepartmentLead": false 130 | }`} 131 | 132 |
133 | -------------------------------------------------------------------------------- /docs/guides/products/products.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | hide_table_of_contents: true 4 | --- 5 | 6 | # Products 7 | 8 | ### Creating a Product 9 | 10 | You can create an unlimited number of products, using the following steps: 11 | 12 |
    13 |
  1. 14 | 15 | Navigate to your event website, then click "Housekeeping" from the left-hand sidebar. 16 | 17 |
  2. 18 |
  3. 19 | 20 | Click "Products" from the left-hand sidebar, then click "View Products" next to the category you want to create the product in. 21 | 22 |
  4. 23 |
  5. 24 | Click "Create New Product". 25 |
  6. 26 |
  7. 27 |
    28 | Enter basic information for your Product: 29 |
      30 |
    • 31 | Name - This is the name of your Product (like "T-Shirt" or "Bobblehead"). If you'd like to use a different name externally, you can do so in the "Display Name" field. 32 |
    • 33 |
    • 34 | Description - A brief description of the product and its functionality. 35 |
    • 36 |
    • 37 | Base Price - The price that will be charged for this product, before any add-ons or discounts are applied. 38 |
    • 39 |
    • 40 | Stock Control - Whether or not you want to control the number of this product that can be purchased. This is useful for physical products where you have a fixed inventory available. 41 |
    • 42 |
    • 43 | Pass Platform Fee to Customer - By default, our platform fees are absorbed into the cost of each product and are paid by the event, but as the organizer, you can choose to pass these fees to your attendees. 44 |
    • 45 |
    • 46 | Make Product Publicly Visible - By default, your new product will not be shown in the Event Store, but you can make it visible by checking this box. This can be used for special products you don't want available for direct purchase, such as promotional items for higher tier Attendance Types. 47 |
    • 48 |
    49 |
    50 |
  8. 51 |
  9. 52 |
    53 | (Optional) Customize advanced options: 54 |
      55 |
    • 56 | Available From - The date that this product will be available for purchase. 57 |
    • 58 |
    • 59 | Available Until - The date that this product will no longer be available for purchase. 60 |
    • 61 |
    • 62 | Minimum Purchase Age - The minimum age that attendees must be to purchase this product. 63 |
    • 64 |
    • 65 | Maximum Purchase Age - The maximum age that attendees can be to purchase this product. 66 |
    • 67 |
    • 68 | Restrict Product to User Roles - Only users with the specified role(s) can purchase this product. 69 |
    • 70 |
    • 71 | Restrict Product to Grants - Only users that have already purchased and have a grant for the specified product(s) can purchase this product. 72 |
    • 73 |
    74 |
    75 |
  10. 76 |
  11. 77 | Click "Create Product", and your Product will be created! 78 |
  12. 79 |
  13. 80 |
    81 | (Optional) Customize your Product: 82 |
    83 | 84 | 85 | Adding a product image is a great way to show your attendees how awesome your product looks. 86 | 87 | 88 | Addons are other products that are offered alongside as an additional purchase, or are included for free, with the product. 89 | 90 | 91 | Discounted pricing can be available for a set period of time, or to a specific user role (such as Staff or Volunteers). 92 | 93 | 94 | Product Options enable you to add custom fields (required or optional) for your attendees to fill out when they purchase the product (such as "T-Shirt Size", "Company Name", or "Extra Donation"). 95 | 96 | 97 | Surcharges are additional fees that are added to the base price of the product as either a flat fee or a percentage of the base price. 98 | 99 | 100 |
    101 |
  14. 102 |
103 | 104 | ### Modifying a Product 105 | 106 | You can modify a product at any time by clicking the edit (edit) icon in the Product Information section of the tier. 107 | 108 | Other sections (Product Images, Addons, Discounts, Product Options, and Surcharges) can be modified at any time. 109 | 110 | To modify a Product, you can use the following steps: 111 | 112 |
    113 |
  1. 114 | Navigate to your event website, then click "Housekeeping" from the left-hand sidebar. 115 |
  2. 116 |
  3. 117 | Click "Products" from the left-hand sidebar, then click "View Products" next to the category that contains the product you want to edit. 118 |
  4. 119 |
  5. 120 | Click on "View / Edit Details" for the Product you'd like to modify. 121 |
  6. 122 |
  7. 123 | 124 | Click the edit (edit) icon in 125 | the Product Information section of the product. 126 | 127 |
  8. 128 |
  9. 129 | Updated the details you'd like to change, and click "Update Product". 130 |
  10. 131 |
132 | 133 | ### Removing a Product 134 | :::caution 135 | Deleting a product using the delete (delete) icon will archive it and prevent any further changes. Archived products cannot be restored at this time. 136 | ::: 137 | 138 | To remove a product from sale, follow steps 1 through 3 above, then click the delete (delete) icon in the Product Information section of the product. 139 | 140 | When a product is archived it will be removed from any unpaid orders, but already paid orders will not be affected. If you want to remove the archived product from a paid order, follow the steps in the Manage Orders section. -------------------------------------------------------------------------------- /docs/guides/templates/templates.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | hide_table_of_contents: true 4 | --- 5 | 6 | # Email Template Overrides 7 | 8 | ConCat sends attendees emails for various actions taken in the application, for example when they successfully pay for an order, or when they change their email address. These templates can be overriden for a better level of customization, and some can be disabled outright. 9 | 10 | ### List templates 11 | 12 | These templates can be overridden at the organization or convention level, depending on how you want to customize these messages. First, view the templates you can modify: 13 | 14 |
    15 |
  1. 16 | 17 | Navigate to your event website, then click "Housekeeping" from the left-hand sidebar. 18 | 19 |
  2. 20 |
  3. 21 | 22 | Click "Settings" from the left-hand sidebar, then click the "Email Templates" tab. 23 | 24 |
  4. 25 |
26 | 27 | You can now view all available templates, a brief description of what they are used for, and some information about their states as badges: 28 | 29 |
    30 |
  • 31 | 32 | Default - The email template is not being overridden, and is using the default ConCat provided template. 33 | 34 |
  • 35 |
  • 36 | 37 | Overridden - The email template is being overridden by a custom template. 38 | 39 |
  • 40 |
  • 41 | 42 | Disabled - The email template is disabled and will not be sent. 43 | 44 |
  • 45 |
46 | 47 | #### Regarding `register` 48 | 49 | You may notice that `register` (sent out to confirm someones email address when they first sign up for an account) is unable to be modified by default. We consider this template critical and do not allow it to be overridden without contacting support first. Reach out to support if you would like to modify this template. 50 | 51 | ### Configuring overrides 52 | 53 | Upon selecting "Modify" on the template you wish to inspect, you can view a rendered example email of the template, alongside a "Current" badge next to whichever configuration is active. 54 | 55 | Templates can only have two potential overrides, this being an organization level or a convention level override. The default template cannot be deleted. 56 | 57 |
    58 |
  • 59 | 60 | Convention overrides are applied solely to this current convention. This will not persist to the next year or any other conventions within your organization. 61 | 62 |
  • 63 |
  • 64 | 65 | Organization overrides are applied to the entire organization, and will persist throughout all conventions. 66 | 67 |
  • 68 |
69 | 70 | Existing overrides have two buttons: Edit and Delete. 71 | 72 | ### Creating and modifying overrides 73 | 74 | Writing template overrides is done in a templating language called [Handlebars](https://handlebarsjs.com/). If you're familiar with it, editting templates will be a cinch. 75 | 76 | If not, in short, Handlebars combines HTML with a bracket notation used to access certain variables, ``{{likeThis}}``. 77 | 78 | 79 |
80 |

Let's take a look at an example. At my convention, I want volunteers to join a Telegram group. I created a redirect on my marketing domain for `/volunteertg` to the group, and now I want to make sure that everyone that applied to volunteer gets the link.

81 |

When I navigate to my list of templates, I find the one I want to modify. volunteerConfirm seems good to me.

82 |
83 | 84 |
85 | 86 | 87 | Selecting modify, I'm presented with an overview of current overrides for the template. 88 | 89 | 90 | 91 | 92 |
93 | In the overview you're able to view the default template and any overrides. The green "Active" tag will be shown next to whichever will be sent out to users. Right now, that's the default template. I only want this template to apply for this convention, so I'm going to select "Create Override" next to Convention Level Override. 94 | I start with the default template and can modify it as I please. A preview is automatically generated below, and the variables available for you to use are provided on the right. 95 |
96 | 97 |
98 | 99 | ### Disabling Templates 100 | 101 | 102 | Some templates will show an option to be disabled. This will prevent an email from being sent at all when this template would normally be triggered. Templates will have a red "Disable Template", shown on the right. 103 | 104 | 105 | Once disabled, you'll see this message in place of the rendered example. 106 |
107 | 108 | 109 | ### Variables 110 | 111 |
112 |
113 | The power of Handlebars comes from the variables. We provide a list of the available variables for that particular template and their type. 114 | You access these via bracket statements, with dots to access inner variables. For example, to access the convention's long name from above, I would write {{convention.name.long}}. Convention and User information is available for all templates, and additional variables are available as necessary. 115 |
116 |
117 | 118 |
119 |
120 | 121 | ### Errors 122 | 123 | While editing, you may see errors come up. These are to ensure you're not including variables that don't exist, and that your template isn't broken. You cannot submit templates that contain errors. 124 | 125 | #### Missing Variables 126 | 127 | This means you used a variable that does not exist within the context of the template. Check your spelling or remove it. 128 | 129 | 130 | 131 | #### Parse Error 132 | 133 |
134 | Something went wrong when the server tried to parse your template. Please read the error message and check the offending element. It's likely you left an open bracket ({{) or something of the sort. 135 |
136 | 137 |
138 | 139 | ### Priority Order 140 | 141 | Template overrides are respected in the following order: 142 | 143 | **Convention > Organization > Default** 144 | 145 | 146 |
147 |

Convention overrides always take priority, then any set at the organization level, and finally if there are none present the default is chosen.

148 |

For clarity, the active configuration is always highlighted as "Current" in the template's overview screen.

149 |
150 | 151 |
-------------------------------------------------------------------------------- /docs/api/endpoints/v0/volunteers.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 2 3 | displayed_sidebar: apiSidebar 4 | hide_table_of_contents: true 5 | --- 6 | 7 | import VolunteerModel from './_volunteerModel.mdx'; 8 | 9 | # Volunteers 10 | 11 | 12 |
13 | This object represents a volunteer application within a convention. 14 |
15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | ### Search for volunteers 23 | 24 |
25 |

Paginate through the volunteer list.

26 |

Authentication

27 |
28 | Service Integration with volunteer:read scope. 29 |
30 |
31 |

Request

32 | 33 | A cursor for pagination across multiple pages of results. Don't include this attribute on the first call. Use the nextPage parameter from the previous response for each subsequent request. 34 | 35 | 36 | The maximum number of results to return, between 1 and 100. Defaults to 100. 37 | 38 |
39 |

Response

40 | 41 |
42 |
43 | 44 | {`{ 45 | "nextPage": "eyBsYXN0SWQ6IDEwMDAgfQ==", 46 | "limit": 100, 47 | }`} 48 | 49 | 50 | {`{ 51 | "data": [ 52 | { 53 | "createdAt": "2020-01-01T00:00:00Z", 54 | "updatedAt": "2020-01-01T00:00:00Z", 55 | "contactMethods": [ 56 | { 57 | "name": "discord", 58 | "isPrimary": true, 59 | "value": "Username#1234" 60 | }, 61 | ], 62 | "departments": [ 63 | { 64 | "id": "1234", 65 | "states": ["experience", "interest"], 66 | "name": "Registration" 67 | }, 68 | ], 69 | "user": { 70 | "id": "1234", 71 | "firstName": "John", 72 | "lastName": "Doe", 73 | "username": "jdoe", 74 | "preferredName": "Johnny", 75 | "phone": "+15555555555", 76 | "email": "johnny.test@concat.systems", 77 | }, 78 | "options": [ 79 | { 80 | "name": "jump", 81 | "type": "select", 82 | "value": "How high?" 83 | }, 84 | ], 85 | }, 86 | ], 87 | "nextPage": null, 88 | }`} 89 | 90 |
91 | 92 | 93 | ### Retrieve a user's volunteer record 94 | 95 |
96 |

Returns the volunteer object for the specified user.

97 |

Authentication

98 |
99 | Service Integration with volunteer:read scope. 100 |
101 |
102 |

Response

103 | 104 |
105 |
106 | 107 | {`curl https://reg.cces.dev/api/v0/users/{id}/volunteer \\ 108 | -H "Authorization: Bearer "`} 109 | 110 | 111 | {`{ 112 | "createdAt": "2020-01-01T00:00:00Z", 113 | "updatedAt": "2020-01-01T00:00:00Z", 114 | "contactMethods": [ 115 | { 116 | "name": "discord", 117 | "isPrimary": true, 118 | "value": "Username#1234" 119 | }, 120 | ], 121 | "departments": [ 122 | { 123 | "id": "1234", 124 | "states": ["experience", "interest"], 125 | "name": "Registration" 126 | }, 127 | { 128 | "id": "5678", 129 | "states": ["avoid"], 130 | "name": "HR" 131 | } 132 | ], 133 | "user": { 134 | "id": "1234", 135 | "firstName": "John", 136 | "lastName": "Doe", 137 | "username": "jdoe", 138 | "preferredName": "Johnny", 139 | "phone": "+15555555555", 140 | "email": "johnny.test@concat.systems", 141 | }, 142 | "options": [ 143 | { 144 | "name": "jump", 145 | "type": "select", 146 | "value": "How high?" 147 | }, 148 | ] 149 | }`} 150 | 151 |
152 | 153 | 154 | ### Retrieve list of departments 155 | 156 |
157 |

Returns the list of volunteer departments.

158 |

Authentication

159 |
160 | Service Integration with volunteer:read scope. 161 |
162 |
163 |

Response

164 | 165 | The unique identifier of the department record. 166 | 167 | 168 | The date the volunteer record was created. 169 | 170 | 171 | The date the volunteer record was last updated. 172 | 173 | 174 | Department is publicly visible to all users applying for a position. 175 | 176 | 177 | List of users who are assigned as leads for this department 178 | <> 179 | 180 | The unique identifier of the user. 181 | 182 | 183 | The first name of the user. 184 | 185 | 186 | The last name of the user. 187 | 188 | 189 | The username of the user. 190 | 191 | 192 | The preferred name of the user. If provided, this should be used instead of the first and last name, except where legally required. 193 | 194 | 195 | The phone number of the user in E.164 format. 196 | 197 | 198 | The email address of the user. 199 | 200 | 201 | 202 |
203 |
204 | 205 | {`curl https://reg.cces.dev/api/v0/volunteers/departments \\ 206 | -H "Authorization: Bearer "`} 207 | 208 | 209 | {`[ 210 | { 211 | "id": "1", 212 | "email": "support@concat.org", 213 | "name": "Information Technology", 214 | "publiclyVisible": true, 215 | "leads": [ 216 | { 217 | "id": "1234", 218 | "firstName": "Bob", 219 | "lastName": "Smith", 220 | "username": "bobsmith", 221 | "preferredName": "Sphere", 222 | "phone": "+11112223333", 223 | "email": "bob@concat.org" 224 | } 225 | ] 226 | } 227 | ]`} 228 | 229 |
230 | 231 | -------------------------------------------------------------------------------- /src/pages/policy/dmca.tsx: -------------------------------------------------------------------------------- 1 | import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; 2 | import Admonition from '@theme/Admonition'; 3 | import Layout from "@theme/Layout"; 4 | import React from "react"; 5 | 6 | import styles from './policy.module.scss'; 7 | 8 | export default function Terms(): JSX.Element { 9 | const { siteConfig } = useDocusaurusContext(); 10 | return ( 11 | 14 |
15 |

DMCA Takedown Policy

16 |
17 | Effective date: July 14, 2022 18 |
19 |

20 | Convention Cat Event Systems, Inc. ("ConCat") respects the intellectual property rights of others 21 | and expects the same from all users of its services. 22 |

23 | 24 |

25 | Title II of the Digital Millennium Copyright Act, 17 U.S.C. Section 512(c)(3) provides for the 26 | right of the copyright owner to notify and inform ConCat of alleged copyright infringement by its users, 27 | and outlines the required elements of a valid DMCA notification. 28 |

29 | 30 |

Designated Agent

31 |

32 | Notification of alleged infringement should be sent to our Designated Agent, using one of the following 33 | methods (in order of expedience): 34 |

35 |
    36 |
  • By Email: dmca@concat.systems
  • 37 |
  • 38 |

    39 | By Mail:
    40 | Attn: DMCA Compliance Agent
    41 | Convention Cat Event Systems, Inc.
    42 | 270 S 171st
    43 | Burien, WA 98148 44 |

    45 |

    46 | 47 | 48 | We strongly recommend that DMCA notices sent by mail are sent via Certified Mail, 49 | with Return Receipt Requested. 50 | 51 | 52 |

    53 |
  • 54 |
55 |

56 | A copy of this Designated Agent Information can be retrieved from the US Copyright Office  57 | DMCA Designated Agent Directory website. 58 |

59 |

DMCA Handling Process

60 |
    61 |
  1. 62 |

    ConCat Receives Notice and Removes Content

    63 |

    64 | Assuming ConCat has received a valid DMCA notice, ConCat will acknowledge the notice within 24 hours 65 | and will forward a copy of the notice to the reported user(s). 66 |

    67 |

    68 | ConCat will subsequently disable access to the allegedly infringing content outlined in the DMCA notice. 69 |

    70 |

    71 | If the notice omits any of the required information under the DMCA, ConCat will send a rejection notice 72 | to both parties stating the omitted information and requesting the Copyright Owner submit a new notice. 73 |

    74 |
  2. 75 |
  3. 76 |

    Reported User May Send A Counter Notification

    77 |

    78 | 79 | We strongly recommend users consult with a lawyer about their options before filing a counter 80 | notification. 81 | 82 |

    83 |

    84 | ConCat will review the counter notification and, if it is deemed sufficiently detailed, will forward 85 | it to the Copyright Owner. 86 |

    87 |

    88 | If there is no response from the Copyright Owner within ten (10) business days of the receipt of the 89 | counter notification, ConCat will restore access to the reported content. 90 |

    91 |
  4. 92 |
  5. 93 |

    Copyright Owner May File Legal Action

    94 |

    95 | If upon the receipt of a counter notification, the Copyright Owner wishes to keep the content 96 | disabled, they will need to initiate a legal action seeking a court order to restrain the user 97 | from engaging in infringing activity relating to content on ConCat. 98 |

    99 |
  6. 100 |
  7. 101 |

    No Counter Notification is Received

    102 |

    103 | If a counter notification is not received within ten (10) business days of the receipt of the 104 | original DMCA notice, ConCat will permanently delete the allegedly infringing content. 105 |

    106 |
  8. 107 |
  9. 108 |

    Reported User May Be Suspended

    109 |

    110 | ConCat may, in appropriate circumstances, suspend or terminate a user's access to ConCat services 111 | in the event of repeated infringement of copyright or other intellectual property rights. 112 |

    113 |
  10. 114 |
115 |

DMCA Notice Requirements

116 |

117 | As outlined in 17 U.S.C. Section 512(c)(3), in order to be effective a notice of claimed 118 | infringement must include the following: 119 |

120 |
    121 |
  • A description or link to the copyrighted work that has allegedly been infringed.
  • 122 |
  • A description of the material you claim is infringing and, if possible, a link to that material.
  • 123 |
  • Your legal name, title (if acting as an agent), address, telephone number, and email address.
  • 124 |
  • 125 | The following statement: 126 | 127 | "I have a good faith belief that use of the copyrighted materials described in this notice as 128 | allegedly infringing is not authorized by the copyright owner, its agent, or the law. I have 129 | taken fair use into consideration." 130 | 131 |
  • 132 |
  • 133 | The following statement: 134 | 135 | "I swear, under penalty of perjury, that the information in this notification is accurate and 136 | that I am authorized to act on behalf of the owner of a right that is allegedly infringed" 137 | 138 |
  • 139 |
  • 140 | A physical or digital signature of the owner, or a person authorized to act on behalf of the owner, 141 | of the copyright or of an exclusive right that is allegedly infringed. 142 |
  • 143 |
144 |

145 | We will review your notice will take the actions outlined above as we deem appropriate under the DMCA. 146 |

147 |

DMCA Counter Notification Requirements

148 | 149 |

150 | ConCat strongly recommends that you consult with a lawyer about your specific case and options before 151 | taking any action that might impact your rights. 152 |

153 |

154 | This guide is not legal advice and shouldn't be taken as such. 155 |

156 |
157 |

158 | If you are unable to come to an agreement with the copyright owner, or believe that your content has 159 | been disabled in error, you can submit a counter notification within ten (10) business days of the 160 | original notice with the following information: 161 |

162 |
    163 |
  • Your legal name, title (if acting as an agent), address, telephone number, and email address.
  • 164 |
  • A description or link to the content to which access has been disabled and the location where it appeared.
  • 165 |
  • 166 | The following statement: 167 | 168 | "I swear, under penalty of perjury, that I have a good faith belief that the content was disabled 169 | as a result of a mistake or misidentification of the content to be disabled." 170 | 171 |
  • 172 |
  • 173 | One of the following statements (as appropriate): 174 |
      175 |
    • 176 | If within the United States,  177 | 178 | "I consent to the jurisdiction of the Federal District Court for the judicial district in 179 | which my provided address is located." 180 | 181 |
    • 182 |
    • 183 | If outside the United States,  184 | 185 | "I consent to the jurisdiction of the Federal District Court for the District of Delaware 186 | in which Convention Cat Event Systems, Inc. is located." 187 | 188 |
    • 189 |
    190 |
  • 191 |
  • 192 | The following statement: 193 | 194 | "I will accept service of process from the person who provided the original notification or 195 | an agent of such person." 196 | 197 |
  • 198 |
  • Your physical or digital signature.
  • 199 |
200 |
201 |
202 | ); 203 | } 204 | -------------------------------------------------------------------------------- /docs/api/endpoints/v0/users.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | displayed_sidebar: apiSidebar 4 | hide_table_of_contents: true 5 | --- 6 | 7 | # Users 8 | 9 | 10 |
11 | This object represents an end-user within an event organization. Users can be attendees, vendors, performers, staff, etc. 12 |
13 | 14 | 15 | 16 | 17 |
18 | 19 | ### Get user 20 | 21 | 22 |
23 |

24 | Search for users using a variety of filters. A maximum of 100 results will be returned per request. If additional results are available, they can be retrieved using the nextPage parameter from the previous response. 25 |

26 |

Authentication

27 |
28 | Service Integration with user:read scope. 29 |
30 |
31 |

Response

32 | 33 | The unique identifier of the user. 34 | 35 | 36 | The email address of the user. 37 | 38 | 39 | The preferred name of the user. If provided, this should be used instead of the first and ast name, except where legally required. 40 | 41 | 42 | The first name of the user. 43 | 44 | 45 | The last name of the user. 46 | 47 | 48 | The username of the user. 49 | 50 | 51 | Whether the user has verified their email address. 52 | 53 | 54 | The phone number of the user in E.164 format. 55 | 56 | 57 | The address of the user. If PII is not required to register, the child attributes will be null. 58 | <> 59 | 60 | The city of the address. 61 | 62 | 63 | The two-letter country code of the address. 64 | 65 | 66 | The first line of the address. 67 | 68 | 69 | The second line of the address, such as an apartment number, if applicable. 70 | 71 | 72 | The state or province of the address. 73 | 74 | 75 | The ZIP or postal code of the address. 76 | 77 | 78 | 79 |
80 |
81 | 82 | {`{ 83 | "id": "1234", 84 | "email": "johnny.test@concat.systems", 85 | "preferredName": "JT", 86 | "firstName": "John", 87 | "lastName": "Test", 88 | "username": "jtest", 89 | "verified": true, 90 | "phone": "+15555555555", 91 | "address": { 92 | "addressCity": "San Francisco", 93 | "addressCountry": "US", 94 | "addressLine1": "123 Main St", 95 | "addressLine2": "Apt 1", 96 | "addressState": "CA", 97 | "addressZipcode": "94105" 98 | } 99 | }`} 100 | 101 |
102 | 103 | 104 | 105 | ### Search users 106 | 107 | 108 |
109 |

110 | Search for users using a variety of filters. A maximum of 100 results will be returned per request. If additional results are available, they can be retrieved using the nextPage parameter from the previous response. 111 |

112 |

Authentication

113 |
114 | Service Integration with user:read scope. 115 |
116 |
117 |

Request

118 | 119 | A cursor for pagination across multiple pages of results. Don't include this attribute on the first call. Use the nextPage parameter from the previous response for each subsequent request. 120 | 121 | 122 | The maximum number of results to return, between 1 and 100. Defaults to 100. 123 | 124 | 125 | Filters to apply to the search. 126 | <> 127 | 128 | The ID of the role to filter by. 129 | 130 | 131 | 132 |
133 |

Response

134 | 135 | The users that match the search. 136 | <> 137 | 138 | The unique identifier of the user. 139 | 140 | 141 | The email address of the user. 142 | 143 | 144 | The preferred name of the user. If provided, this should be used instead of the first and ast name, except where legally required. 145 | 146 | 147 | The first name of the user. 148 | 149 | 150 | The last name of the user. 151 | 152 | 153 | The username of the user. 154 | 155 | 156 | Whether the user has verified their email address. 157 | 158 | 159 | The phone number of the user in E.164 format. 160 | 161 | 162 | The address of the user. If PII is not required to register, the child attributes will be null. 163 | <> 164 | 165 | The city of the address. 166 | 167 | 168 | The two-letter country code of the address. 169 | 170 | 171 | The first line of the address. 172 | 173 | 174 | The second line of the address, such as an apartment number, if applicable. 175 | 176 | 177 | The state or province of the address. 178 | 179 | 180 | The ZIP or postal code of the address. 181 | 182 | 183 | 184 | 185 | 186 | 187 | A cursor for pagination across multiple pages of results. If this attribute is present, there are more results available. Use this value in the nextPage parameter for the next request. 188 | 189 |
190 |
191 | 192 | {`{ 193 | "nextPage": "eyBsYXN0SWQ6IDEwMDAgfQ==", 194 | "limit": 100, 195 | "filter": { 196 | "roleId": 12, 197 | }, 198 | }`} 199 | 200 | 201 | {`{ 202 | "data": [ 203 | { 204 | "id": "1234", 205 | "email": "johnny.test@concat.systems", 206 | "preferredName": "JT", 207 | "firstName": "John", 208 | "lastName": "Test", 209 | "username": "jtest", 210 | "verified": true, 211 | "phone": "+15555555555", 212 | "address": { 213 | "addressCity": "San Francisco", 214 | "addressCountry": "US", 215 | "addressLine1": "123 Main St", 216 | "addressLine2": "Apt 1", 217 | "addressState": "CA", 218 | "addressZipcode": "94105" 219 | }, 220 | }, 221 | ], 222 | "nextPage": null 223 | }`} 224 | 225 |
226 | -------------------------------------------------------------------------------- /static/img/undraw_docusaurus_tree.svg: -------------------------------------------------------------------------------- 1 | docu_tree -------------------------------------------------------------------------------- /docs/api/gettingstarted/oauth.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 2 3 | displayed_sidebar: apiSidebar 4 | --- 5 | 6 | # Obtaining a Bearer Token 7 | 8 | :::info 9 | Using OAuth in On Behalf Of (OBO) mode requires a user to interact with your application and the ConCat API in order to obtain a token. Any changes to your application scopes will require the user to re-authenticate. Service integrations do not require a user to authenticate, and application scopes can be modified at any time. 10 | ::: 11 | 12 | ## On Behalf Of (OBO) 13 | When using the OBO method, the user will be redirected to an authentication page displaying the requested permission scopes, a basic description of your app, and the ability to grant or deny access. 14 | 15 | After receiving authorization, the user will be redirected back to your application with a token. You can use this token to authenticate your future requests to the ConCat APIs by exchanging it for a bearer token and a refresh token. The bearer token will expire after a set amount of time, but the refresh token will never expire until used or the user revokes access. 16 | 17 | ### Step 1. Requesting Authorization 18 | You'll need to create an OAuth authorization URL in order to redirect the user to ConCat for authorization. This will include your client ID, requested scopes, and a return redirect URL. 19 | 20 | The authorization URL is made up of the base URL of the event organization's instance, followed by `/oauth/authorize`, and the following query parameters: 21 | 22 | #### Query Parameters 23 |
24 | 25 | The client ID that identifies your application. 26 | 27 | 28 | The type of response that you want ConCat to return. The only supported value is "code". 29 | 30 | 31 | The URL that ConCat will redirect to after authorization. This must be the same URL that you provided when registering your application, otherwise the user will receive an invalid request error. 32 | 33 | 34 | The scope(s) that you want to request access to. This must be a URL-encoded list of scopes, separated by spaces. 35 | 36 | 37 | An optional string that ConCat will return with the authorization response. This string can be used to verify that the request originated from your application. 38 | 39 |
40 | 41 | An example authorization URL will look something like this: 42 | 43 | 44 | https://reg.mybigevent.org/oauth/authorize?client_id=123&response_type=code&redirect_uri=https%3A%2F%2Fexample.com%2Foauth%2Fcallback&state=xyz&scope=pii%3Abasic 45 | 46 | 47 | ### Step 2. Redirecting the User 48 | 49 |
50 |
51 |

52 | Once you've generated the authorization URL, you'll need to redirect the user to ConCat. 53 |

54 |

55 | This can be done via a HTTP or JavaScript redirect, by presenting the link to the user as a button or a hyperlink, or in a pop-up window. The authorization page must never be displayed in an iframe. 56 |

57 |

58 | ConCat will display a consent screen to the user. This screen will include a description of your application, and a list of requested permissions. The user can then either grant or deny access. At this time, the user cannot partially grant access to certain scopes. 59 |

60 |
61 |
62 | ConCat OAuth Consent Screen 63 |
64 |
65 | 66 | :::caution 67 | The user must have access to all of the requested scopes in order to grant access. If the user does not have access to all of the requested scopes, they will receive an invalid request error. 68 | ::: 69 | 70 | #### Sensitive Scopes 71 | 72 | Sensitive scopes are scopes that allow access to administrative endpoints or provide access to information of other users. These scopes should be requested with care and limited to only the scopes required to provide the desired functionality. 73 | 74 | When a user is presented with a consent screen, sensitive scopes will be highlighted in red along with the text: `This is an administrative permission`. The `Authorize Application` button will also be highlighted red. 75 | 76 | Admin OAuth Consent Screen 77 | 78 |
79 | 80 | :::danger 81 | Abuse or misuse of sensitive scopes will result in your application being suspended. If a bearer or refresh token with a sensitive scope is lost or compromised, contact ConCat Support **immediately** for assistance. 82 | ::: 83 | 84 | ### Step 3. Exchanging for Token 85 | 86 | The user will be redirected back to your application's `redirect_uri` with query parameters containing a `code` and optional `state` attribute. You can use this code to exchange it for a bearer token and a refresh token. 87 | 88 | 89 | https://thebest.app/oauth/callback?code=123&state=xyz 90 | 91 | 92 |
93 |
94 |

95 | This code can be exchanged for a bearer token and a refresh token. The bearer token will expire after a set amount of time, but the refresh token will never expire until used or the user revokes access. 96 |

97 |

98 | The response will return an access token, the length of time until the token expires, the valid scopes, and a refresh token. The refresh token can be used to obtain a new bearer token once the old one expires. 99 |

100 |
101 |
102 | 103 | {`curl https://reg.mybigevent.org/api/oauth/token \\ 104 | -X POST \\ 105 | -H "Content-Type: application/x-www-form-urlencoded" \\ 106 | -d "client_id=123" \\ 107 | -d "client_secret=abc" \\ 108 | -d "code=123" \\ 109 | -d "grant_type=authorization_code" \\ 110 | -d "redirect_uri=https%3A%2F%2Fexample.com%2Foauth%2Fcallback" \\ 111 | -d "scope=pii%3Abasic"`} 112 | 113 | 114 | {`{ 115 | "access_token": "...", 116 | "expires_in": 3600, 117 | "scope": "pii:basic", 118 | "refresh_token": "...", 119 | "token_type": "Bearer", 120 | }`} 121 | 122 |
123 |
124 | 125 | :::caution 126 | If your app no longer requires access to all of the scopes originally requested, you can provide a subset of scopes in the `scope` parameter when refreshing the token. However, no additional scopes can be granted this way, and any scopes removed cannot be re-added later without a new authorization request. 127 | ::: 128 | 129 | ### Step 4. Refreshing the Token 130 | 131 |
132 |
133 |

134 | If the bearer token expires, you can use the refresh token to obtain a new bearer token. A refresh token will not expire until used or the user revokes access. 135 |

136 |

137 | The scope parameter is optional, but if you provide it, you must provide a subset of the scopes originally requested. This can be used to remove scopes that are no longer required by your application for security. If scope is not provided, the scopes valid for the previous bearer token will be used. 138 |

139 |

140 | The response will return an access token, the length of time until the token expires, the valid scopes, and a new refresh token. The refresh token can be used to obtain a new bearer token once the old one expires. 141 |

142 |
143 |
144 | 145 | {`curl https://reg.mybigevent.org/api/oauth/token \\ 146 | -X POST \\ 147 | -H "Content-Type: application/x-www-form-urlencoded" \\ 148 | -d "client_id=123" \\ 149 | -d "client_secret=abc" \\ 150 | -d "refresh_token=123" \\ 151 | -d "grant_type=refresh_token" \\ 152 | -d "redirect_uri=https%3A%2F%2Fexample.com%2Foauth%2Fcallback"`} 153 | 154 | 155 | {`{ 156 | "access_token": "...", 157 | "expires_in": 3600, 158 | "scope": "pii:basic", 159 | "refresh_token": "...", 160 | "token_type": "Bearer", 161 | }`} 162 | 163 |
164 |
165 | 166 | ### Step 5. Authenticating with the Token 167 | 168 | All requests to the ConCat APIs **must** be done through a HTTPS connection, with a minimum TLS protocol of v1.2 or newer. ConCat uses a HTTP Authorization header to authenticate API requests. The Authorization header must be in the following format: 169 | 170 | ``` 171 | Authorization: Bearer 172 | ``` 173 | 174 | :::info 175 | The above header **should** always be included in your request, even if the request is not authenticated. This helps us prevent abuse of the APIs, and collect usage statistics to improve the service. 176 | ::: 177 | 178 | ## Service Integration 179 | 180 | When using the service integration method, the application ID and secret are exchanged for a time-limited bearer token with a set of requested application scopes. The requested application scopes can be any subset of the scopes approved for use by the application, allowing multiple bearer tokens to be issued with limited scopes and use cases. 181 | 182 | ### Step 1. Requesting a token 183 | 184 | 185 |
186 |

187 | To receive an access token, the application can exchange its ID and secret for a limited-time bearer token. The bearer token will expire after a set amount of time and must be re-requested using this flow when it expires. 188 |

189 |

190 | The response will return an access token, the length of time until the token expires, and the valid scopes. In order to change the scopes of the token, a new token must be requested with the updated scopes. 191 |

192 | 193 | Attempting to request OBO-only scopes will result in an error. 194 | 195 |
196 |
197 | 198 | {`curl https://reg.mybigevent.org/api/oauth/token \\ 199 | -X POST \\ 200 | -H "Content-Type: application/x-www-form-urlencoded" \\ 201 | -d "client_id=123" \\ 202 | -d "client_secret=abc" \\ 203 | -d "grant_type=client_credentials" \\ 204 | -d "scope=user%3Aread"`} 205 | 206 | 207 | {`{ 208 | "access_token": "...", 209 | "expires_in": 3600, 210 | "scope": "user:read", 211 | "token_type": "Bearer", 212 | }`} 213 | 214 |
215 |
216 | 217 | ### Step 2. Authenticating with the Token 218 | 219 | All requests to the ConCat APIs **must** be done through a HTTPS connection, with a minimum TLS protocol of v1.2 or newer. ConCat uses a HTTP Authorization header to authenticate API requests. The Authorization header must be in the following format: 220 | 221 | ``` 222 | Authorization: Bearer 223 | ``` 224 | 225 | :::info 226 | The above header **should** always be included in your request, even if the request is not authenticated. This helps us prevent abuse of the APIs, and collect usage statistics to improve the service. 227 | ::: --------------------------------------------------------------------------------