メインコンテンツへスキップ
アプリには2つのカスタムオブジェクトが必要です: ドキュメントテンプレート (書き込み内容) と ドキュメント (生成された結果). 定義してみましょう CLI で各エンティティファイルをScaffold — 有効な UUID と適切な フォルダーを生成します。
yarn twenty dev:add object
以下に完成したファイルを示します。
すべての *_UNIVERSAL_IDENTIFIER 定数は src/constants/universal-identifiers.ts にあり、使用される場所で import されます。 下のスニペット は、簡潔にインポートするためにそれらを省略します。あなた自身のファイルに保存します。

テンプレートオブジェクト

テンプレートには name{{placeholders}} を含む body、そして Person 向けか Company 向けかを示す target があります。 bodyRICH_TEXT フィールドです。したがって、20 はリッチテキストエディタを提供します。
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 },
      ] },
  ],
});
SELECT オプション valuesUPPER_CASE (PersonではなくPERSON) でなければなりません。そして defaultValue は余分な引用符で包まれています: “‘PERSON’``` 。label`は ユーザーが見るものです。

ドキュメントオブジェクト

生成されたドキュメントには、レンダリングされた contentstatus が保存されます。 DRAFT / ジェネレータstatusで選択し、同じ方法で を定義します。 フルファイル: document.object.ts.

リレーションとリンクする

各ドキュメントは、それがから来たテンプレートを指す必要があります。 リレーションは 双方向 で、それぞれ独自のフィールドファイルで両側を定義します。
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',
  },
});
反対側(template-documents-relation.field.ts)は、逆方向を指す「ドキュメント」という名前の RelationType.ONE_TO_MANY フィールドです。 フルパターンについては Relations を参照してください。

二十日で見る

yarn tin dev が実行されている場合は、 Settings → Data model を開きます。 両方のオブジェクト がアプリでタグ付けされて表示されます。
ドキュメントとドキュメントテンプレートを表示するデータモデルの設定
1つのテンプレートを作成してテストするには、セールスプロポーザルという名前を付けてください。ターゲットPersonに設定し、いくつかのプレースホルダーを持つ本体を貼り付けてください:
Dear {{name.firstName}} {{name.lastName}},

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

Best,
The Team
プレースホルダー ボディを持つ販売提案テンプレートの記録
このステップの後: documentTemplatedocument オブジェクト、 リレーションによってリンクされているオブジェクト、 そして生成するテンプレートが 1 つあります。 次に、それを埋めるロジック。

次へ: ドキュメントの生成 →

テンプレートを満たすロジック機能を記述します。