Salt la conținutul principal
Fiecare obiect din Twenty este livrat cu un set de câmpuri de sistem pe care nu le declari tu însuți. Acestea sunt create automat de server atunci când obiectul este provizionat: id, createdAt, updatedAt, deletedAt, createdBy, updatedBy, position, searchVector Deoarece nu declari aceste câmpuri cu defineField(), nu există niciun universalIdentifier constant pe care să-l imporți. Deci cum faci referire la createdAt ca o coloană într-o vizualizare?

Problema

Începând cu Twenty 2.19, identificatorul universal al unui câmp de sistem este derivat deterministic de server din trei intrări: identificatorul universal al aplicației, identificatorul universal al obiectului și numele câmpului. Inventarea unui id și hardcodarea lui nu va funcționa: acesta nu se potrivește cu nimic de pe server, iar sincronizarea respinge referința rămasă în aer:
Dev sync failed: viewField: INVALID_VIEW_DATA: Field metadata not found

Soluția

getFieldUniversalIdentifier este disponibil începând cu twenty-sdk 2.21.
Folosește getFieldUniversalIdentifier pentru a obține exact aceeași valoare pe care o folosește serverul. Aceasta primește cele trei intrări și returnează identificatorul universal al câmpului:
import { getFieldUniversalIdentifier } from 'twenty-sdk/define';

const createdAtFieldId = getFieldUniversalIdentifier({
  applicationUniversalIdentifier: APPLICATION_UNIVERSAL_IDENTIFIER,
  objectUniversalIdentifier: MY_OBJECT_UNIVERSAL_IDENTIFIER,
  name: 'createdAt',
});
  • applicationUniversalIdentifier este identificatorul aplicației tale, cel pe care îl transmiți către defineApplication().
  • objectUniversalIdentifier este identificatorul obiectului căruia îi aparține câmpul.
  • name este numele câmpului de sistem, una dintre valorile listate mai sus.

Exemplu: o coloană createdAt într-o vizualizare

Cazul tipic este adăugarea unei coloane createdAt la o vizualizare a unuia dintre obiectele tale personalizate. Calculează id-ul câmpului și fă referire la el ca la orice alt fieldMetadataUniversalIdentifier:
src/views/example-view.ts
import {
  defineView,
  getFieldUniversalIdentifier,
} from 'twenty-sdk/define';

const APPLICATION_UNIVERSAL_IDENTIFIER =
  '0b04e15c-27b2-4741-9046-b32e07469072';
const MY_OBJECT_UNIVERSAL_IDENTIFIER =
  'c782b61c-70fd-4c88-9cd6-4e61ab8d7591';

export default defineView({
  universalIdentifier: '70f10d44-144a-4da8-8c6f-3ec2422138c0',
  name: 'All records',
  objectUniversalIdentifier: MY_OBJECT_UNIVERSAL_IDENTIFIER,
  icon: 'IconList',
  position: 0,
  fields: [
    {
      universalIdentifier: '75a90bc4-d901-4df4-85e0-af29db5e0104',
      fieldMetadataUniversalIdentifier: getFieldUniversalIdentifier({
        applicationUniversalIdentifier: APPLICATION_UNIVERSAL_IDENTIFIER,
        objectUniversalIdentifier: MY_OBJECT_UNIVERSAL_IDENTIFIER,
        name: 'createdAt',
      }),
      position: 0,
      isVisible: true,
      size: 200,
    },
  ],
});
Același id calculat funcționează oriunde este așteptat un fieldMetadataUniversalIdentifier: câmpuri de vizualizare, filtre, sortări, grupări și widget-uri de tip page-layout.
Calculează id-ul, nu îl hardcoda. Deoarece serverul derivă valoarea din id-ul aplicației, id-ul obiectului și numele câmpului, apelarea getFieldUniversalIdentifier menține referința corectă chiar dacă aceste intrări se schimbă și evită divergența dacă metoda de derivare evoluează vreodată.

Obiecte standard Twenty

Pentru un obiect Twenty standard (Person, Company, Opportunity, …), nu trebuie să derivezi nimic: identificatorii câmpurilor de sistem sunt constante pre-calculate pe care le poți importa direct.
import { STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS } from 'twenty-sdk/define';

// STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.company.fields.createdAt.universalIdentifier
// STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.person.fields.updatedAt.universalIdentifier
Apelează la getFieldUniversalIdentifier atunci când obiectul este unul pe care aplicația ta îl definește cu defineObject(), unde nu există o astfel de constantă.
name este un câmp implicit, nu un câmp de sistem. Acesta își păstrează propriul identificator universal hardcodat și nu este obținut prin getFieldUniversalIdentifier. În obiectele pe care le definești, fă referire la câmpul name prin identificatorul pe care i l-ai dat în defineObject().