Salt la conținutul principal
Aplicația noastră are nevoie de două obiecte personalizate: șabloane de documente (ce să scrie) și documente (rezultatul generat). Să le definim. Scaffold fiecare fișier de entitate cu CLI - generează un UUID valid și dosarul corect pentru tine:
yarn twenty dev:add object
Mai jos arătăm fișierele terminate.
Fiecare ”*_UNIVERSAL_IDENTIFIER” trăieşte în src/constants/universal-identificfiers.ts şi este importat unde este folosit. Fragmentele de mai jos omit acele importuri pentru încurcare - le păstrează-le în propriile fișiere.

Obiectul şablonului

Un şablon are un name, un body cu {{placeholders}}, şi un target care spune dacă este scris pentru o Persoană sau o companie. body este un câmp RICH_TEXT, deci douăzeci îi dă un editor complet bogat.
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 },
      ] },
  ],
});
Opţiunea SELECT valori trebuie să fie UPPER_CASE (PERSON", nu persoană), şi valoarea implicităeste împachetată în ghilimele suplimentare: `` 'PERSON''.label` este ceea ce văd utilizatorii .

Obiectul documentului

Documentul generat stochează conținutul și status. Definiţi-l în acelaşi mod, cu status selectează din DRAFT / GENERATED. Fişier complet: document.object.ts.

Conectarea lor cu o relație

Fiecare document ar trebui să indice modelul de la care a venit. Relațiile sunt bidirecționale — definiți ambele părți, fiecare în propriul fișier de câmp.
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',
  },
});
Cealaltă parte (template-documents-relation.field.ts) este un câmp RelationType.ONE_TO_MANY numit documents care arată invers. Vezi Relations pentru întregul model.

Vezi în Douăzeci

Cu yarn douăzeci de rulează, deschide Setări → Modelul de date. Ambele obiecte apar, etichetate cu aplicația ta.
Setările modelului de date care afișează documente și șabloane de documente
Creați un șablon pentru a testa cu - denumiți Propunere de vânzări, setați Ținta Person, și lipiți un corp cu câțiva substituenți:
Dear {{name.firstName}} {{name.lastName}},

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

Best,
The Team
Un model de înregistrare a propunerii de vânzare cu organismul substituent
După acest pas: aveţi obiecte documentTemplate şi document, legate de o relaţie, şi un şablon din care să se genereze. Apoi, logica care o umple.

Următorul: generarea de documente →

Scrieți funcția logică care completează șablonul.