Per-craft freeform fields, each wired end-to-end (form + detail display) so none are stored invisibly: - Artist: deliverables, turnaround - Graffiti: surfaces, max_size - Musician: set_length, tech_rider - Judge: travel, certifications - Organizer: insurance, permits - Tattoo: deposit, minimum - Trainer: modalities - Barber: duration - Filmer/Editor/Photographer: turnaround, deliverables (filmer adds drone) - Builder: lead_time, warranty Data-driven crafts declare them via CraftProfileForm's extraFields (now with labelKey); the bespoke pages add matching state/inputs/prefill/save. src/lib/craftFields.ts (CRAFT_DETAIL_FIELDS) maps each tag to a display label, rendered on the shared detail page; toggle tags render as a localized Yes. Labels are translated (EN/ES); placeholders stay as examples.
64 lines
2.3 KiB
TypeScript
64 lines
2.3 KiB
TypeScript
import type { LabProfileType } from '@/hooks/useLabProfiles';
|
|
|
|
/** One craft-specific freeform field shown on the Lab detail page. */
|
|
export interface CraftDetailField {
|
|
tag: string;
|
|
labelKey: string;
|
|
}
|
|
|
|
/**
|
|
* Craft-specific freeform fields to surface on a provider's detail page.
|
|
*
|
|
* Keep this in sync with the `extraFields` declared in `becomeRoles.tsx` (and
|
|
* the bespoke become pages): a field with no entry here is stored but invisible.
|
|
* Toggle tags (value `"true"`) render as a localized "Yes".
|
|
*/
|
|
export const CRAFT_DETAIL_FIELDS: Partial<Record<LabProfileType, CraftDetailField[]>> = {
|
|
artist: [
|
|
{ tag: 'deliverables', labelKey: 'labUi.craftFields.deliverables' },
|
|
{ tag: 'turnaround', labelKey: 'labUi.craftFields.turnaround' },
|
|
],
|
|
graffiti: [
|
|
{ tag: 'surfaces', labelKey: 'labUi.craftFields.surfaces' },
|
|
{ tag: 'max_size', labelKey: 'labUi.craftFields.maxSize' },
|
|
],
|
|
musician: [
|
|
{ tag: 'set_length', labelKey: 'labUi.craftFields.setLength' },
|
|
{ tag: 'tech_rider', labelKey: 'labUi.craftFields.techRider' },
|
|
],
|
|
judge: [
|
|
{ tag: 'travel', labelKey: 'labUi.craftFields.travel' },
|
|
{ tag: 'certifications', labelKey: 'labUi.craftFields.certifications' },
|
|
],
|
|
organizer: [
|
|
{ tag: 'insurance', labelKey: 'labUi.craftFields.insurance' },
|
|
{ tag: 'permits', labelKey: 'labUi.craftFields.permits' },
|
|
],
|
|
tattoo: [
|
|
{ tag: 'deposit', labelKey: 'labUi.craftFields.deposit' },
|
|
{ tag: 'minimum', labelKey: 'labUi.craftFields.minimum' },
|
|
],
|
|
trainer: [
|
|
{ tag: 'modalities', labelKey: 'labUi.craftFields.modalities' },
|
|
],
|
|
barber: [
|
|
{ tag: 'duration', labelKey: 'labUi.craftFields.duration' },
|
|
],
|
|
filmer: [
|
|
{ tag: 'turnaround', labelKey: 'labUi.craftFields.turnaround' },
|
|
{ tag: 'deliverables', labelKey: 'labUi.craftFields.deliverables' },
|
|
{ tag: 'drone', labelKey: 'labUi.craftFields.drone' },
|
|
],
|
|
editor: [
|
|
{ tag: 'turnaround', labelKey: 'labUi.craftFields.turnaround' },
|
|
{ tag: 'deliverables', labelKey: 'labUi.craftFields.deliverables' },
|
|
],
|
|
photographer: [
|
|
{ tag: 'turnaround', labelKey: 'labUi.craftFields.turnaround' },
|
|
{ tag: 'deliverables', labelKey: 'labUi.craftFields.deliverables' },
|
|
],
|
|
builder: [
|
|
{ tag: 'lead_time', labelKey: 'labUi.craftFields.leadTime' },
|
|
{ tag: 'warranty', labelKey: 'labUi.craftFields.warranty' },
|
|
],
|
|
};
|