diff --git a/admin/src/collections/Campaigns.ts b/admin/src/collections/Campaigns.ts index fb0f6c1cc..41d3fbf56 100644 --- a/admin/src/collections/Campaigns.ts +++ b/admin/src/collections/Campaigns.ts @@ -68,6 +68,36 @@ export const campaignsCollection = buildAuditedCollection({ description: 'Visible in the fundraising page.', multiline: true, }, + link_website: { + title: 'Website Link', + dataType: 'string', + validation: { required: false }, + description: 'The link to the website (optional)', + }, + link_instagram: { + title: 'Instagram Link', + dataType: 'string', + validation: { required: false }, + description: 'The link to the Instagram profile (optional)', + }, + link_tiktok: { + title: 'TikTok Link', + dataType: 'string', + validation: { required: false }, + description: 'The link to the TikTok profile (optional)', + }, + link_facebook: { + title: 'Facebook Link', + dataType: 'string', + validation: { required: false }, + description: 'The link to the Facebook profile (optional)', + }, + link_x: { + title: 'X (formerly Twitter) Link', + dataType: 'string', + validation: { required: false }, + description: 'The link to the X profile (optional)', + }, amount_collected_chf: { dataType: 'number', name: 'Collected amount in CHF', @@ -104,6 +134,29 @@ export const campaignsCollection = buildAuditedCollection({ enumValues: campaignStatusEnumValues, validation: { required: true }, }, + public: { + dataType: 'boolean', + name: 'Public', + description: 'Listed on campaign overview', + defaultValue: false, + }, + featured: { + dataType: 'boolean', + name: 'Featured', + description: 'Featured on campaign overview', + defaultValue: false, + }, + slug: { + dataType: 'string', + name: 'Url Slug', + validation: { + required: true, + matches: /^[a-z0-9]+(?:-[a-z0-9]+)*$/, + matchMessage: 'Slug must contain only lowercase letters, numbers, and hyphens', + }, + description: + 'URL-friendly version of the title. Must be unique and contain only lowercase letters, numbers, and hyphens.', + }, metadata_description: { dataType: 'string', name: 'Metadata Description', diff --git a/shared/src/types/campaign.ts b/shared/src/types/campaign.ts index cf0d11dfa..90c98ef8c 100644 --- a/shared/src/types/campaign.ts +++ b/shared/src/types/campaign.ts @@ -12,12 +12,20 @@ export type Campaign = { second_description?: string; third_description_title?: string; third_description?: string; + link_website?: string; + link_instagram?: string; + link_tiktok?: string; + link_facebook?: string; + link_x?: string; amount_collected_chf: number; // automatically updated by incoming payments. contributions: number; // automatically updated by incoming payments. goal?: number; goal_currency?: Currency; end_date: Timestamp; status: CampaignStatus; + public?: boolean; + featured?: boolean; + slug?: string; // optional, for nicer url instead of firestore id metadata_description?: string; metadata_ogImage?: string; metadata_twitterImage?: string; @@ -27,3 +35,8 @@ export enum CampaignStatus { Active = 'active', Inactive = 'inactive', } + +export type Link = { + name: string; + url: string; +};