Vai al contenuto principale
La nostra app ha bisogno di due oggetti personalizzati: modelli di documenti (cosa scrivere) e documenti (il risultato generato). Le definiamo. Scaffold each entity file with the CLI — genera un UUID valido e la cartella giusta per te:
yarn twenty dev:add object
Di seguito mostriamo i file finiti.
Ogni costante *_UNIVERSAL_IDENTIFIER vive in src/constants/universal-identifiers.ts ed è importata dove utilizzata. Gli snippet qui sotto omettono quelle importazioni per brevità — tenerli nei propri file.

L’oggetto del modello

Un modello ha un name, un body con {{placeholders}}, e un target che dice se è scritto per una persona o un’azienda. Il body è un campo RICH_TEXT, quindi Twenty gli dà un editor completo di testo ricco.
import { defineObject, FieldType } from 'twenty-sdk/define';

export default defineObject({
  universalIdentifier: DOCUMENT_TEMPLATE_OBJECT_UNIVERSAL_IDENTIFIER,
  nameSingular: 'documentTemplate',
  namePlural: 'documentTemplates',
  labelSingular: 'Document template',
  labelPlural: 'Document templates',
  icon: 'IconFileText',
  labelIdentifierFieldMetadataUniversalIdentifier:
    TEMPLATE_NAME_FIELD_UNIVERSAL_IDENTIFIER,
  fields: [
    { universalIdentifier: TEMPLATE_NAME_FIELD_UNIVERSAL_IDENTIFIER,
      type: FieldType.TEXT, name: 'name', label: 'Name', icon: 'IconAbc' },
    { universalIdentifier: TEMPLATE_BODY_FIELD_UNIVERSAL_IDENTIFIER,
      type: FieldType.RICH_TEXT, name: 'body', label: 'Body', icon: 'IconFileText',
      description: 'Use {{placeholders}} like {{name.firstName}} or {{jobTitle}}.' },
    { universalIdentifier: TEMPLATE_TARGET_FIELD_UNIVERSAL_IDENTIFIER,
      type: FieldType.SELECT, name: 'target', label: 'Target', icon: 'IconTarget',
      defaultValue: `'PERSON'`,
      options: [
        { id: TEMPLATE_TARGET_OPTION_PERSON_UNIVERSAL_IDENTIFIER,
          value: 'PERSON', label: 'Person', color: 'blue', position: 0 },
        { id: TEMPLATE_TARGET_OPTION_COMPANY_UNIVERSAL_IDENTIFIER,
          value: 'COMPANY', label: 'Company', color: 'green', position: 1 },
      ] },
  ],
});
L’opzione SELECT values deve essere UPPER_CASE (PERSON, non person), e il defaultValue è racchiuso in virgolette extra: `'PERSON'`. Il label è quello che vedono gli utenti .

L’oggetto del documento

Il documento generato memorizza il content renderizzato e un status. Definisci allo stesso modo, con una selezione status di DRAFT / GENERATED. File completo: document.object.ts.

Collegarli con una relazione

Ogni documento deve riportare il modello da cui proveniva. Le relazioni sono bidirezionali — si definiscono entrambi i lati, ciascuno nel proprio file di campo.
import { defineField, FieldType, OnDeleteAction, RelationType } from 'twenty-sdk/define';

// The "many" side: each document belongs to one template.
export default defineField({
  universalIdentifier: DOCUMENT_TEMPLATE_FIELD_UNIVERSAL_IDENTIFIER,
  objectUniversalIdentifier: DOCUMENT_OBJECT_UNIVERSAL_IDENTIFIER,
  type: FieldType.RELATION,
  name: 'template',
  label: 'Template',
  relationTargetObjectMetadataUniversalIdentifier:
    DOCUMENT_TEMPLATE_OBJECT_UNIVERSAL_IDENTIFIER,
  relationTargetFieldMetadataUniversalIdentifier:
    TEMPLATE_DOCUMENTS_FIELD_UNIVERSAL_IDENTIFIER,
  universalSettings: {
    relationType: RelationType.MANY_TO_ONE,
    onDelete: OnDeleteAction.SET_NULL,
    joinColumnName: 'templateId',
  },
});
L’altro lato (template-documents-relation.field.ts) è un campo RelationType.ONE_TO_MANY chiamato documents che punta il senso opposto. Vedi Relations per il modello completo.

Vedere in venti

Con yarn venti dev in esecuzione, apri Impostazioni → Modello dati. Entrambi gli oggetti appariranno, etichettati con la tua app.
Impostazioni del modello di dati che mostrano i modelli di documenti e documenti
Crea un modello da testare con — chiamalo Proposta vendite, imposta Obiettivo su Persona, e incolla un corpo con alcuni segnaposti:
Dear {{name.firstName}} {{name.lastName}},

As {{jobTitle}} at {{company.name}}, we think you'll love our product.

Best,
The Team
Un record modello di proposta di vendita con corpo segnaposto
Dopo questo passaggio: hai oggetti documentTemplate e document, collegati da una relazione e un modello da cui generare. Successivamente, la logica che lo riempie.

Successivo: generare documenti →

Scrivi la funzione logica che riempie il modello.