Saltar para o conteúdo principal
Todo objeto no Twenty é fornecido com um conjunto de campos de sistema que você nunca declara manualmente. Eles são criados automaticamente pelo servidor quando o objeto é provisionado: id, createdAt, updatedAt, deletedAt, createdBy, updatedBy, position, searchVector Como você não declara esses campos com defineField(), não existe nenhuma constante universalIdentifier para você importar. Então, como você referencia createdAt como uma coluna em uma visualização?

O Problema

Desde o Twenty 2.19, o identificador universal de um campo de sistema é derivado deterministicamente pelo servidor a partir de três entradas: o identificador universal do aplicativo, o identificador universal do objeto e o nome do campo. Inventar um id e deixá-lo hardcoded não funciona: ele não corresponde a nada no servidor, e a sincronização rejeita a referência pendente:
Dev sync failed: viewField: INVALID_VIEW_DATA: Field metadata not found

A Solução

getFieldUniversalIdentifier está disponível a partir do twenty-sdk 2.21.
Use getFieldUniversalIdentifier para resolver exatamente o mesmo valor que o servidor usa. Ela recebe as três entradas e retorna o identificador universal do campo:
import { getFieldUniversalIdentifier } from 'twenty-sdk/define';

const createdAtFieldId = getFieldUniversalIdentifier({
  applicationUniversalIdentifier: APPLICATION_UNIVERSAL_IDENTIFIER,
  objectUniversalIdentifier: MY_OBJECT_UNIVERSAL_IDENTIFIER,
  name: 'createdAt',
});
  • applicationUniversalIdentifier é o identificador do seu app, aquele que você passa para defineApplication().
  • objectUniversalIdentifier é o identificador do objeto ao qual o campo pertence.
  • name é o nome do campo de sistema, um dos valores listados acima.

Exemplo: uma coluna createdAt em uma visualização

O caso típico é adicionar uma coluna createdAt a uma visualização de um dos seus objetos personalizados. Resolva o id do campo e referencie-o como qualquer outro 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,
    },
  ],
});
O mesmo id resolvido funciona em qualquer lugar onde se espera um fieldMetadataUniversalIdentifier: campos de visualização, filtros, ordenações, agrupamentos e widgets de layout de página.
Resolva o id, não o deixe hardcoded. Como o servidor deriva o valor a partir do id do aplicativo, do id do objeto e do nome do campo, chamar getFieldUniversalIdentifier mantém a sua referência correta mesmo que essas entradas mudem, e evita divergências se a derivação evoluir no futuro.

Objetos Padrão do Twenty

Para um objeto padrão do Twenty (Person, Company, Opportunity, …), você não precisa derivar nada: os identificadores de campos de sistema são constantes pré-computadas que você pode importar diretamente.
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
Use getFieldUniversalIdentifier quando o objeto é um que seu app define com defineObject(), em que não existe tal constante.
name é um campo padrão, não um campo de sistema. Ele mantém seu próprio identificador universal hardcoded e não é resolvido por meio de getFieldUniversalIdentifier. Em objetos que você define, referencie o campo name pelo identificador que você atribuiu a ele em defineObject().