197 lines
6.5 KiB
TypeScript
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,
|
|
},
|
|
},
|
|
],
|
|
},
|
|
],
|
|
}
|