wwwlayermeshusa/src/blocks/FDServiceCalculatorBlock/config.ts

197 lines
6.5 KiB
TypeScript

import type { Block } from 'payload'
export const FDServiceCalculatorBlock: Block = {
slug: 'fdServiceCalculator',
imageURL: '/block-thumbnails/fd-vps-calculator.png',
imageAltText: 'FD Tjänstekalkylator',
interfaceName: 'FDServiceCalculatorBlock',
labels: { singular: 'FD Tjänstekalkylator', plural: 'FD Tjänstekalkylatorer' },
fields: [
// ─── Presentation ──────────────────────────────────────────────────────
{
name: 'heading',
type: 'text',
label: 'Rubrik',
defaultValue: 'Beräkna din kostnad',
},
{
name: 'description',
type: 'text',
label: 'Beskrivning (valfri)',
},
{
name: 'summaryHeading',
type: 'text',
label: 'Rubrik — kostnadsöversikt',
defaultValue: 'Kostnadsöversikt',
},
{
name: 'totalLabel',
type: 'text',
label: 'Total-etikett',
defaultValue: 'Totalt per månad',
},
{
name: 'totalSuffix',
type: 'text',
label: 'Suffix under totalen',
defaultValue: 'exkl. moms',
},
{
type: 'row',
fields: [
{ name: 'orderCtaText', type: 'text', label: 'Beställ-knapp text', defaultValue: 'Beställ' },
{ name: 'orderCtaLink', type: 'text', label: 'Beställ-länk', defaultValue: '/kontakt' },
],
},
{
type: 'row',
fields: [
{ name: 'contactCtaText', type: 'text', label: 'Kontakt-knapp text', defaultValue: 'Frågor? Kontakta oss' },
{ name: 'contactCtaLink', type: 'text', label: 'Kontakt-länk', defaultValue: '/kontakt' },
],
},
{
name: 'sectionBackground',
type: 'select',
label: 'Bakgrundsfärg',
defaultValue: 'white',
options: [
{ label: 'Vit', value: 'white' },
{ label: 'Grå', value: 'gray' },
{ label: 'Navy (mörkt)', value: 'navy' },
],
},
// ─── Option groups (e.g. OS selector, tier picker) ─────────────────────
{
name: 'optionGroups',
type: 'array',
label: 'Alternativgrupper',
admin: {
description: 'T.ex. "Operativsystem" med Linux/Windows, eller "Nivå" med Standard/Premium. Visas som knappar.',
},
fields: [
{ name: 'groupLabel', type: 'text', label: 'Gruppnamn', required: true },
{
name: 'options',
type: 'array',
label: 'Alternativ',
minRows: 2,
fields: [
{ name: 'label', type: 'text', label: 'Alternativtext', required: true },
{
name: 'price',
type: 'number',
label: 'Pris (kr/mån)',
defaultValue: 0,
admin: { description: '0 för gratis (t.ex. Linux)' },
},
],
},
],
},
// ─── Resource sliders (e.g. CPU, RAM, Storage) ─────────────────────────
{
name: 'resources',
type: 'array',
label: 'Resurser (reglage)',
admin: {
description: 'Varje rad blir ett +/- reglage. T.ex. CPU-kärnor, RAM (GB), Lagring (GB).',
},
fields: [
{
type: 'row',
fields: [
{ name: 'label', type: 'text', label: 'Namn', required: true },
{ name: 'unit', type: 'text', label: 'Enhet', required: true, defaultValue: 'GB', admin: { width: '25%' } },
],
},
{
type: 'row',
fields: [
{ name: 'pricePerUnit', type: 'number', label: 'Pris per enhet (kr)', required: true },
{ name: 'defaultValue', type: 'number', label: 'Startvärde', defaultValue: 0 },
],
},
{
type: 'row',
fields: [
{ name: 'min', type: 'number', label: 'Min', defaultValue: 0 },
{ name: 'max', type: 'number', label: 'Max', defaultValue: 1000 },
{ name: 'step', type: 'number', label: 'Steg', defaultValue: 1 },
],
},
{
name: 'summaryTemplate',
type: 'text',
label: 'Sammanfattningsmall (valfri)',
admin: {
description: 'Använd {value} och {unit} som variabler. T.ex. "SSD NVMe ({value} {unit})".',
},
},
],
},
// ─── Toggle add-ons ────────────────────────────────────────────────────
{
name: 'addons',
type: 'array',
label: 'Tillvalstjänster',
admin: {
description: 'Kunden kan slå på/av dessa med en toggle.',
},
fields: [
{ name: 'label', type: 'text', label: 'Tjänstnamn', required: true },
{ name: 'price', type: 'number', label: 'Pris (kr/mån)', required: true },
{
name: 'description',
type: 'text',
label: 'Kort beskrivning (valfri)',
},
],
},
// ─── Fixed fees ────────────────────────────────────────────────────────
{
name: 'fixedFees',
type: 'array',
label: 'Fasta avgifter',
admin: {
description: 'Alltid inkluderade i totalen. Kunden kan inte välja bort dessa.',
},
fields: [
{ name: 'label', type: 'text', label: 'Avgiftsnamn', required: true },
{ name: 'amount', type: 'number', label: 'Belopp (kr/mån)', required: true },
],
},
// ─── Discount ──────────────────────────────────────────────────────────
{
type: 'collapsible',
label: 'Kampanjrabatt',
admin: { initCollapsed: true },
fields: [
{
name: 'discountPercent',
type: 'number',
label: 'Rabatt (%)',
min: 0,
max: 100,
admin: { description: 'Appliceras på alla resurser och tillval. 0 = ingen rabatt.' },
},
{
name: 'discountLabel',
type: 'text',
label: 'Rabattetikett (visas som badge)',
admin: {
description: 'T.ex. "{percent}% rabatt på alla resurser". Använd {percent} som variabel.',
condition: (_, siblingData) => (siblingData?.discountPercent ?? 0) > 0,
},
},
],
},
],
}