Skip to content

Commit eaae377

Browse files
authored
Merge pull request framer#312 from framer/notion-formula
Notion: add formula support
2 parents a525943 + 9b757ad commit eaae377

2 files changed

Lines changed: 109 additions & 13 deletions

File tree

plugins/notion/src/api.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ export const supportedCMSTypeByNotionPropertyType = {
8080
files: ["file", "image", "array"],
8181
relation: ["multiCollectionReference", "collectionReference"],
8282
unique_id: ["string", "number"],
83+
formula: ["string", "number", "boolean", "date", "link", "color"],
8384
} satisfies Partial<Record<NotionProperty["type"], readonly ManagedCollectionField["type"][]>>
8485

8586
// Naive implementation to be authenticated, a token could be expired.

plugins/notion/src/data.ts

Lines changed: 108 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -129,9 +129,53 @@ export async function syncCollection(
129129
if (fieldEntry) {
130130
fieldData[field.id] = fieldEntry
131131
} else {
132-
console.warn(
133-
`Skipping item at index ${index} because it doesn't have a valid value for field ${field.name}`
134-
)
132+
switch (field.type) {
133+
case "string":
134+
case "formattedText":
135+
fieldData[field.id] = {
136+
value: "",
137+
type: field.type,
138+
}
139+
break
140+
case "enum": {
141+
const firstCase = field.cases[0]
142+
if (!firstCase) {
143+
console.warn(
144+
`Skipping item “${item.id}” because enum field “${field.name}” has no cases.`
145+
)
146+
continue
147+
}
148+
fieldData[field.id] = {
149+
value: firstCase.id,
150+
type: "enum",
151+
}
152+
break
153+
}
154+
case "boolean":
155+
fieldData[field.id] = {
156+
value: false,
157+
type: "boolean",
158+
}
159+
break
160+
case "number":
161+
fieldData[field.id] = {
162+
value: 0,
163+
type: "number",
164+
}
165+
break
166+
case "image":
167+
case "file":
168+
case "link":
169+
case "date":
170+
case "color":
171+
case "collectionReference":
172+
case "multiCollectionReference":
173+
fieldData[field.id] = {
174+
value: null,
175+
type: field.type,
176+
}
177+
break
178+
}
135179
}
136180
}
137181

@@ -408,21 +452,13 @@ export function getFieldDataEntryForProperty(
408452
}
409453
case "select": {
410454
if (field.type !== "enum") return null
411-
412-
if (!property.select) {
413-
const firstCase = field.cases[0]?.id
414-
return firstCase ? { type: "enum", value: firstCase } : null
415-
}
455+
if (!property.select) return null
416456

417457
return { type: "enum", value: property.select.id }
418458
}
419459
case "status": {
420460
if (field.type !== "enum") return null
421-
422-
if (!property.status) {
423-
const firstCase = field.cases[0]?.id
424-
return firstCase ? { type: "enum", value: firstCase } : null
425-
}
461+
if (!property.status) return null
426462

427463
return { type: "enum", value: property.status.id }
428464
}
@@ -533,6 +569,65 @@ export function getFieldDataEntryForProperty(
533569

534570
return { type: "string", value: phoneNumber }
535571
}
572+
case "formula": {
573+
const formula = property.formula
574+
575+
let value = null
576+
switch (formula.type) {
577+
case "string":
578+
value = formula.string
579+
break
580+
case "number":
581+
value = formula.number
582+
break
583+
case "boolean":
584+
value = formula.boolean
585+
break
586+
case "date":
587+
value = formula.date
588+
break
589+
}
590+
591+
if (value === null) return null
592+
593+
switch (field.type) {
594+
case "string":
595+
case "color":
596+
case "link":
597+
if (typeof value === "object") return null
598+
599+
return {
600+
type: field.type,
601+
value: String(value),
602+
}
603+
case "number": {
604+
const number = Number(value)
605+
if (isNaN(number)) return null
606+
607+
return {
608+
type: "number",
609+
value: number,
610+
}
611+
}
612+
case "date": {
613+
if (formula.type !== "date" || !formula.date?.start) return null
614+
615+
const date = new Date(formula.date.start)
616+
617+
return {
618+
type: "date",
619+
value: date.toISOString(),
620+
}
621+
}
622+
case "boolean":
623+
return {
624+
type: "boolean",
625+
value: Boolean(value),
626+
}
627+
default:
628+
return null
629+
}
630+
}
536631
}
537632

538633
return null

0 commit comments

Comments
 (0)