الانتقال إلى المحتوى الرئيسي
يحتاج تطبيقنا إلى عنصرين مخصصين: قوالب وثيقة (ما يجب كتابته) و وثائق (النتيجة المنشأة). دعونا نعرفهم. سكاف كل ملف كيان مع CLI - يخلق مجلد UUID صالح و الصحيح لك:
yarn twenty dev:add object
نعرض أدناه الملفات المكتملة.
كل *_UNIVERSAL_IDENTIFIER يعيش باستمرار في src/constants/universal-Identiers.ts ويتم استيراده حيثما استخدم. كتل الكود أسفل أغفل تلك الواردات للإيجاز، أبقيها في ملفاتك.

عنصر القالب

يحتوي القالب على name، و body يتضمن {{placeholders}}، و target يحدد ما إذا كان مكتوبًا لشخص أو لشركة. ‘body’ هو حقل ‘RICH_TEXT’ لذا فإن عشرون يمنحه محرر نص ثري كامل.
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 القيم UPER_CASE (PERSON، وليس person)، و defaultValue مغلقاً في اقتباسات إضافية: PERSON". إن label` هو ما يراه المستخدمون.

كائن المستند

الوثيقة التي تم إنشاؤها تخزن “المحتوى” و “الحالة”. قم بتعريفه بنفس الطريقة، مع اختيار ‘الحالة’ من ‘DRAFT / 'GENERATED. الملف الكامل: 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 يسمى documents الذي يشير إلى الاتجاه المعاكس. انظر Relations للاطلاع على النمط الكامل.

مشاهدته في العشرين

مع تشغيل ‘yarn 20 inenty dev’، افتح الإعدادات → البيانات النموذجية. يظهر كلا العنصرين ، وسم مع التطبيق الخاص بك.
إعدادات نموذج البيانات التي تظهر قوالب المستندات والمستندات
قم بإنشاء قالب واحد لاختباره - اسمه اقتراح المبيعات، وقم بتعيين الهدف إلى Person، وقم بلصق جسم مع بعض العناصر النائبة:
Dear {{name.firstName}} {{name.lastName}},

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

Best,
The Team
سجل قالب مقترح المبيعات مع الهيئة النائبة
بعد هذه الخطوة: لديك كائنات ‘documentTemplate’ و ‘document’، مرتبطة بـ علاقة، و قالب واحد لتوليد منها. وبعد ذلك، المنطق الذي يعبئه

التالي: توليد الوثائق →

اكتب الدالة المنطقية التي تملأ القالب.