Skip to main content
Fiecare obiect din Twenty vine cu metadate de sistem pe care nu le declari niciodată tu însuți, cum ar fi un set de câmpuri și o vizualizare principală de listă cu coloanele sale. Serverul le creează pe toate atunci când obiectul este provizionat, iar setul crește pe măsură ce Twenty evoluează. Deoarece nu îl declari, nu există nicio constantă universalIdentifier pe care să o imporți. În schimb, serverul derivează fiecare identificator într-un mod determinist, iar twenty-sdk expune aceeași derivare astfel încât manifestul tău să poată rezolva exact valoarea pe care o folosește serverul.

Câmpuri de sistem

Câmpurile scalare prezente pe fiecare obiect, niciunul dintre ele nu este declarat de tine cu defineField(): id, createdAt, updatedAt, deletedAt, createdBy, updatedBy, position, searchVector 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:

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

Câmpuri de relație de sistem

getSystemRelationFieldUniversalIdentifier este disponibil începând cu versiunea 2.23 a twenty-sdk și necesită un server Twenty pe versiunea 2.23 sau o versiune ulterioară.
Pe lângă câmpurile scalare de sistem de mai sus, serverul mai pune la dispoziție patru câmpuri de relație de sistem pentru fiecare obiect: timelineActivities, attachments, noteTargets și taskTargets, fiecare indicând către obiectul de relație standard corespunzător. Aceste câmpuri nu sunt rezolvate cu getFieldUniversalIdentifier: identificatorul lor este derivat independent de nume, din obiectul care găzduiește câmpul și obiectul către care indică acest câmp. Astfel, redenumirea unui obiect nu modifică niciodată identificatorii câmpurilor sale de relație. Folosește getSystemRelationFieldUniversalIdentifier pentru a le rezolva:
  • objectUniversalIdentifier este obiectul care găzduiește câmpul.
  • relationTargetObjectUniversalIdentifier este obiectul către care indică câmpul.
Direcția este codificată prin ordinea argumentelor. Pentru a rezolva partea inversă (de ex. attachment.targetRocket, câmpul morfic pe care serverul îl creează pe obiectul de relație standard), inversează-le pe cele două:
Ca și în cazul câmpurilor de sistem scalare, id-ul rezolvat funcționează oriunde este așteptat un fieldMetadataUniversalIdentifier.

Vizualizări de sistem

getSystemViewUniversalIdentifier și getSystemViewFieldUniversalIdentifier sunt disponibile începând cu versiunea 2.26 a twenty-sdk și necesită un server Twenty pe versiunea 2.26 sau o versiune ulterioară.
Serverul provizionează, de asemenea, o vizualizare de sistem pe fiecare obiect: vizualizarea principală de listă (All {objectLabelPlural}, indexată prin ViewKey.INDEX), cu câte o coloană pentru fiecare câmp afișabil. La fel ca în cazul câmpurilor de relație de sistem, identificatorii lor sunt derivați fără nume, astfel încât redenumirea unui obiect sau a unui câmp nu îi schimbă niciodată. Folosește getSystemViewUniversalIdentifier pentru a rezolva vizualizarea:
  • objectMetadataApplicationUniversalIdentifier este aplicația care deține obiectul, ceea ce reprezintă spațiul de nume pentru vizualizare.
  • objectUniversalIdentifier este obiectul pe care îl listează vizualizarea.
  • viewKey este cheia vizualizării de sistem, astăzi ViewKey.INDEX.
ID-ul rezolvat funcționează oriunde este așteptat un viewUniversalIdentifier, cum ar fi o intrare în bara laterală NavigationMenuItemType.VIEW. Pentru a deschide pur și simplu lista principală a unui obiect, preferă NavigationMenuItemType.OBJECT cu targetObjectUniversalIdentifier: nu are nevoie de derivare. getSystemViewFieldUniversalIdentifier rezolvă o singură coloană dintr-o vizualizare de sistem, pornind de la vizualizare și câmpul pe care îl afișează:
Observă primul argument: o coloană este plasată în spațiul de nume al aplicației care deține câmpul pe care îl afișează, nu al celei care deține vizualizarea. Un câmp pe care aplicația ta îl adaugă la un obiect standard își obține coloana derivată sub aplicația ta, pe o vizualizare deținută de Twenty.
Vizualizările de sistem și coloanele lor sunt deținute de server: rezolvă-le identificatorii pentru a le referenția, niciodată pentru a le declara. key pe defineView() este depreciat și ignorat, astfel încât o vizualizare din manifest nu poate revendica niciodată cheia INDEX, iar serverul provizionează deja o coloană pentru fiecare câmp pe care îl adaugi, deci declararea propriului tău defineViewField() pentru același câmp într-o vizualizare de sistem intră în conflict cu aceasta.

Obiecte standard Twenty

Pentru un obiect Twenty standard (Person, Company, Opportunity, …), nu trebuie să derivezi nimic: identificatorii sunt constante pre-calculate pe care le poți importa direct, atât pentru câmpuri, cât și pentru vizualizări.
Apelează la utilitarele de mai sus 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().