Skip to main content
Todo objeto no Twenty vem com metadados de sistema que você nunca declara explicitamente, como um conjunto de campos e uma visualização principal de lista com suas colunas. O servidor cria tudo isso quando o objeto é provisionado, e o conjunto cresce conforme o Twenty cresce. Como você não o declara, não existe nenhuma constante universalIdentifier para você importar. Em vez disso, o servidor deriva cada identificador de forma determinística, e o twenty-sdk expõe a mesma derivação para que seu manifesto possa resolver o valor exato que o servidor usa.

Campos do sistema

Os campos escalares presentes em todo objeto, nenhum dos quais você declara com defineField(): id, createdAt, updatedAt, deletedAt, createdBy, updatedBy, position, searchVector 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:

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:
  • 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
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.

Campos de relação do sistema

getSystemRelationFieldUniversalIdentifier está disponível a partir da versão 2.23 do twenty-sdk e requer um servidor Twenty na versão 2.23 ou posterior.
Além dos campos escalares de sistema acima, o servidor também provisiona quatro campos de relação de sistema em cada objeto: timelineActivities, attachments, noteTargets e taskTargets, cada um apontando para o objeto de relação padrão correspondente. Dessa forma, esses campos não são resolvidos com getFieldUniversalIdentifier: seu identificador é derivado de forma independente de nome, a partir do objeto que hospeda o campo e do objeto para o qual o campo aponta. Dessa forma, renomear um objeto nunca altera os identificadores de seus campos de relação. Use getSystemRelationFieldUniversalIdentifier para resolvê-los:
  • objectUniversalIdentifier é o objeto que hospeda o campo.
  • relationTargetObjectUniversalIdentifier é o objeto para o qual o campo aponta.
A direção é codificada pela ordem dos argumentos. Para resolver o lado inverso (por exemplo, attachment.targetRocket, o campo morph que o servidor cria no objeto de relação padrão), inverta os dois:
Assim como acontece com campos de sistema escalares, o id resolvido funciona em qualquer lugar em que um fieldMetadataUniversalIdentifier é esperado.

Visualizações de sistema

getSystemViewUniversalIdentifier e getSystemViewFieldUniversalIdentifier estão disponíveis a partir da versão 2.26 do twenty-sdk e requerem um servidor Twenty na versão 2.26 ou posterior.
O servidor também provisiona uma visualização de sistema em cada objeto: a visualização principal de lista (All {objectLabelPlural}, com chave ViewKey.INDEX), com uma coluna por campo exibível. Assim como os campos de relação de sistema, seus identificadores são derivados sem usar nomes, então renomear um objeto ou um campo nunca os altera. Use getSystemViewUniversalIdentifier para resolvê‑la:
  • objectMetadataApplicationUniversalIdentifier é o aplicativo proprietário do objeto, que define o namespace da visualização.
  • objectUniversalIdentifier é o objeto que a visualização lista.
  • viewKey é a chave da visualização de sistema, hoje ViewKey.INDEX.
O id resolvido funciona em qualquer lugar em que um viewUniversalIdentifier seja esperado, como uma entrada de barra lateral NavigationMenuItemType.VIEW. Para simplesmente abrir a lista principal de um objeto, prefira NavigationMenuItemType.OBJECT com targetObjectUniversalIdentifier: isso não precisa de derivação. getSystemViewFieldUniversalIdentifier resolve uma única coluna em uma visualização de sistema, a partir da visualização e do campo que ela exibe:
Observe o primeiro argumento: uma coluna é colocada em namespace pelo aplicativo proprietário do campo que ela exibe, não pelo que é proprietário da visualização. Um campo que seu app adiciona a um objeto padrão tem sua coluna derivada sob o seu aplicativo, em uma visualização de propriedade do Twenty.
As visualizações de sistema e suas colunas são de propriedade do servidor: resolva seus identificadores para referenciá‑las, nunca para declará‑las. key em defineView() está obsoleto e é ignorado, portanto uma visualização de manifesto nunca pode reivindicar a chave INDEX, e o servidor já provisiona uma coluna para cada campo que você adiciona, então declarar seu próprio defineViewField() para esse mesmo campo em uma visualização de sistema entra em conflito com ela.

Objetos Padrão do Twenty

Para um objeto padrão do Twenty (Person, Company, Opportunity, …), você não precisa derivar nada: os identificadores são constantes pré‑computadas que você pode importar diretamente, tanto para campos quanto para visualizações.
Use os helpers acima quando o objeto for 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().