Direkt zum Inhalt
KAMOUniverse

Changelog

Was ist neu?

Jede Verbesserung an der Plattform, wie sie geliefert wird.

  1. · kamo-shared-library

    Eine Domain wird durch den Bete nach Beweisen beansprucht, nicht durch Eingabe

    Drei Regeln, und sie machen nur gemeinsam Sinn. **Eine Domain zu benennen behauptet nichts.** Ein FQDN war hier weltweit einzigartig, also erste Organisation, die "acme.com" eingegeben "acme.com" ausgesperrt jede andere - einschließlich die Firma, die tatsächlich acme.com besitzt, die dann überhaupt keinen Platz hatte. Jemand, der nichts bewiesen hat, darf jemandem, der eine Domain verweigern kann kann. Doppelte Reihen zwischen Organisationen sind jetzt legal; eine Wiederholung innerhalb von ONE Organisation ist immer noch abgelehnt, weil das ein Fehler ohne Bedeutung ist als eine konkurrierende Forderung. **Nur eine verifizierte Domain-Routen.** findByDomain benötigt jetzt ownership_verified auf der Top-Level-Reihe, so ein Host geht an die Organisation, die Kontrolle bewiesen seine DNS und nicht an diejenigen, die es zuerst getippt. Ohne diese Paarung die erste Regel wäre eine offene Tür: behaupten somebank.com und warten. Ein Alias erbt seine Die Überprüfung der Eltern - die TXT-Anfechtung wird immer nur für den Scheitelpunkt ausgestellt - und die von der expliziten Eltern beitreten gelesen wird, nie als d.parent.ownershipVerifiziert, die Hibernate als innere Verbindung über die gesamte Abfrage aussendet und jeden fallen lassen würde apex Reihe. **Verifizierung nimmt die Domain von allen anderen.** setOwnershipVerified widerruft das gleiche FQDN, wo auch immer es gehalten wird, so gibt es höchstens einen Halter an einem Zeit. Dies ist keine Höflichkeit: zwei verifizierte Zeilen sind beide routable, und die resolver würde den Datenverkehr an die zuerst zurückgegeben. Eine Organisation, die eine Domain im vergangenen Jahr überprüft und hat seitdem ließ es verfallen würde erhalten Sie die Post von wem sie jetzt besitzen. Die DNS-Überprüfung des Verlierers geht mit ihm, weil es einen Hostnamen beschreibt, der nicht mehr auf sie zeigt. Das Erlauben von Duplikaten bricht dann jede Suche, die eine Zeile angenommen, und eine von das war kein Crash, sondern eine Entführung: upsertDomain abgestimmt auf der Domain NAME und dann neu zugewiesen, was es der rufenden Organisation gefunden, so ein upsert hätte stillschweigend die Domäne einer anderen Organisation von ihr weggenommen. Es ist Organisation-kopiert jetzt. Der Rest - findeByDomain, updateSslInfoByDomain, transferDomainOwnership - ging durch einen einzigen InhaberOf(), die die bevorzugt geprüfte Zeile und sonst nimmt die niedrigste ID, so dass eine Domain-Besitzer kann Wechseln zwischen zwei Anfragen. Links als optionale Bindungen, die sie geworfen hätten **************** auf Daten, die das Schema jetzt erlaubt.

  2. · SecurityService

    Tragen Sie die pro-Mitglieder-Typ Home-Screen-Standards

    Lesen Sie auf POST/PUT /security-Modelle und PUT /master-Modell, und emittiert von /Applied-Modell-Einstellungen, damit die Shell entscheiden kann, wo ein Mitglied auf "/" landet. Ein separater AnwendungHomeScreenDefaults Anruf statt drei weitere positionelle Argumente auf einer Service-Methode, die bereits fünfzehn dauert. Abwesende Schlüssel sind übrig allein statt zurückgesetzt, so ein Kunde, der ein Sicherheitsmodell postet, ohne zu wissen über dieses Feld kann nicht still und leise Hand jedes Mitglied des Modells ihre Startrampe zurück - oder nehmen Sie es mit. /Angewandtes Modell normalisiert sich sowohl auf dem Weg nach draußen als auch in. REQUIRES_CHILD_ORG_ OWNERSHIP hält einen Home-Bildschirm zurück, also eine Null-Spalte in einer Zeile, die davor geschrieben wurde versendet, oder etwas unerkannt, liest sich wie die Startrampe. Der Kunde Fallback ist der gleiche Wert, so dass die beiden nicht widersprechen können.

  3. · kamo-shared-library

    Ein Sicherheitsmodell besagt, wo jeder Mitgliedstyp auf "/" landet

    Drei Spalten zum ChildOrgSecurityModel - DEFAULT_MEMBER_HOME_SCREEN, **************** DEFAULT_ORG_OWNER_HOME_SCREEN. Jeder hält HOME_SCREEN_DEFAULT oder REQUIRES_CHILD_ORG_OWNERSHIP; der zweite hält die Launchpad, bis dieses Mitglied eine eigene Organisation besitzt. Drei statt eins, weil die drei Mitgliedstypen drei verschiedene Jobs sind: das gleiche Modell routinemäßig will ein einfaches Mitglied in die Schaffung ihrer eigenen gedrängt Organisation, während seine Teammitglieder und Eigentümer gehen direkt an die Arbeit. Die Spaltung Spiegel APPLIES_TO_MEMBERS / _TEAM_MEMBERS / _OWNERS genau. VARCHAR, kein ordinal enum - ein ordinal relabelt jede gespeicherte Zeile am Tag a dritte Option wird überall außer am Ende eingefügt. setHomeScreenDefaults ist ein gezielter Setter in Form von setAllowRootSubdomains anstatt drei weitere Positionsparameter auf updateModel, das bereits einnimmt fünfzehn. Null bedeutet "den einen in Ruhe lassen", also ein Anrufer, der sich mit einem der Die drei können die anderen nicht stillschweigend zurücksetzen. normalizeHomeScreenDefault versagt OPEN und wird dafür getestet: nur die genaue Zeichenkette schaltet die Anforderung ein, weil die Alternative den Homescreen eines Mitglieds nimmt weg und ein Tippfehler oder ein abgestandener Kunde darf das nie aus Versehen tun können.

  4. · InitializerService

    Die drei pro-Mitglieder-Typ Home-Screen-Säulen auf einem Sicherheitsmodell

    CHILD_ORG_SECURITY_MODELS gewinnt DEFAULT_MEMBER_HOME_SCREEN, DEFAULT_TEAM_MEMBER_HOME_SCREEN und DEFAULT_ORG_OWNER_HOME_SCREEN. Jeder hält HOME_SCREEN_DEFAULT (die Startrampe) oder REQUIRES_CHILD_ORG_OWNERSHIP, welche verhält es, bis dieses Mitglied eine eigene Organisation besitzt. Die DEFAULT-Klausel ist das tragende Teil, nicht der ADD COLUMN. Die Säulen sind NOT NULL und der Nachlass ist nicht leer, so dass die Standardeinstellung ist, was jeder Verfülle bestehendes Sicherheitsmodell in der gleichen Aussage - und es ist absichtlich die freizügiger Wert, weil die Versäumnis in die andere Richtung würde die Startrampe wegnehmen von jedem Mitglied jedes Modells in dem Moment, in dem dies lief. Bestellung(0) aus dem üblichen Grund: die Shared-Bibliothek Entität, die diese Felder trägt, ist von jedem Java-Service geladen, so dass ein früherer Läufer würde auf "Spalte nicht sterben exist", bevor eine spät angeordnete Migration jemals erreicht wurde. Die SET NOT NULL Anweisungen reparieren den Fall, in dem Hibernate's ddl-auto erstellt wurde die Spalten zuerst, von der Spalte des Entity-Definition, ohne die Beschränkung. Jedem geht sein eigenes Null-Clearing UPDATE voraus, weil SET NOT NULL abgelehnt wird während jede Zeile noch eine Null hält - die Test-Pins, die Bestellung.

  5. · kamo-internal

    Eine Liste von dem, was der Scan gefunden, neben dem, was Sie verwenden

    Die Markenabteilung von /network/create wird zu drei Bändern mit der gleichen Form: was Ihre Website auf der linken Seite hat, was Ihre Organisation auf der rechten Seite verwendet. Logos. Früher gab es ZWEI Schienen über die gleichen Kandidaten, eine pro Slot, rangiert anders - so schien eine Firma mit vier Logos acht zu haben, und die Die Frage wurde in die falsche Richtung gestellt. Ein Mitglied schaut nicht auf eine Schiene und fragt "welche davon mein vollständiges Logo ist"; sie schauen auf ihre eigene Marke und sagen, "dass man ist die volle". So ist es eine Liste der Logos der Website, jede Zeile trägt beide Reiseziele - Vollständig, Set als Einfacher - und jede Zeile mit Vector oder Image markiert, denn das ist die eine Sache über eine Logo-Datei, die Sie nicht sehen können, indem Sie es ansehen und die eine Sache, die der einfache Schlitz kümmert sich um. Markiert, nie gefiltert: sich verstecken Raster aus dem einfachen Schlitz versteckt das eigene Logo des Unternehmens auf genau den Websites der scan funktionierte am besten an. Die Liste tritt mit oben/unten Pfeilen und sagt, wie viele es gibt sind, so "ist mein Logo hier" ist verantwortlich, indem Sie schauen. Die Hintergründe sind zurück. Der Zwölf-Schritte-Assistent sammelte Anmeldetapeten und die einseitige Neufassung ließ sie fallen; der Scan fand bereits den Helden eines Unternehmens Bilder und dann bietet nirgendwo, es zu setzen. Gleiche Band: gescannte Bilder auf der links, Upload und die laufende Reihenfolge auf der rechten Seite, mit der Wasserzeichen-Wahl unten einmal gibt es etwas zu stempeln. Die Farben werden eher angenommen als angeboten. Ein fertiger Scan setzt das Paar, das es gefunden hat, und die Pflücker bleiben live. Die Wachen sind das ganze Risiko, also sind sie rein und getestet in scanAutoApply.ts: einmal pro Scan-Ergebnis, und nie über eine Farbe der Schöpfer hat berührt - auch für einen späteren Scan einer anderen Website. Auch hier: - "Wer ist das für" ist ganz abwesend, Überschrift enthalten, bis es etwas drin, um zu antworten. Es war die Wiedergabe einer leeren Karte, bevor ein Typ war ausgewählt, und wieder für Modelle, die jede Compliance-Frage selbst zu regeln. - Die Live-Vorschau zeigt das FULL-Logo, oben links im Inhaltsbereich über der Mock Text, wo ein Anmeldebildschirm setzt es. Die Bar darüber ist die Navigation bar und zeigt die Marke - und die beiden Slots sind leicht zu mischen, so dass die Vorschau ist der einzige Ort, an dem ein Schöpfer sagen kann, welcher er gefüllt hat. - "Compact Logo" ist "Simple Logo" überall, wo es gelesen wird, hier und in der Getting Begann Zauberer. Interne Kennungen werden in Ruhe gelassen. - "Short Name" ist "Organisationsname (Kurzfassungsversion) ". - Website sagt klar, dass Sie nicht brauchen, anstatt die Abwesenheit von einem roten Sternchen, um die Botschaft zu tragen.

  6. · kamo-internal

    Ein pro-Mitglied-Typ Standard-Home-Bildschirm

    Ein Sicherheitsmodell sagt jetzt, wo jeder seiner drei Mitgliedstypen landet, wenn sie offen "/". Zwei Werte: HOME_SCREEN_DEFAULT ist die Launchpad, die jeder immer hat hatte, und REQUIRES_CHILD_ORG_OWNERSHIP hält es zurück, bis das Mitglied besitzt eine Organisation ihrer eigenen "/" geht an /network/create statt, und die Organisation-Netzwerk-Link verlässt die obere Leiste, bis sie eine haben. Drei Spalten statt einer, Spiegelung von APPLIES_TO_MEMBERS / _TEAM_MEMBERS / _OWNERS, weil das gleiche Modell routinemäßig will ein einfaches Mitglied in geschoben die eigene Organisation zu schaffen, während die Teammitglieder und -besitzer zur Arbeit gehen. Die Regel ist rein und getestet in app/lib/homeScreenGate.ts: welche Spalte gilt, und was zählt als Eigentümer einer Organisation (ein Eigentümer der org sie sind bereits innen hat nicht eins erstellt - der gleiche Ausschluss FirstOrgCta macht). Es scheitert OPEN bei jedem Schritt. Nur der genaue String schließt das Tor; eine Null-Spalte, ein unerkannter Wert, ein fehlgeschlagenes Anwendungsmodell-Steffer und ein unerreichbares My-Networks alle lesen sich als "Nein", weil jemandes Home-Bildschirm weg auf der Stärke der eine Anfrage, die nicht beantwortet wurde, ist nicht etwas zu tun. Ein Kontext, montiert über den Navi und der Seite, anstatt der Haken in beiden Orte: NavTop und die Startrampe benötigen die gleiche Antwort auf jeder Seite laden, und zwei Exemplare würden zwei Rundreisen kosten und könnten für die Länge von einem widersprechen. Die Startrampe wartet bewusst nicht darauf - hält jedes Mitglieds zu Hause Seite hinter einem / angewandten-Modell holen, um eine Handvoll von ihnen einen kurzen Blitz zu ersparen ist der falsche Handel.

  7. · kamo-internal

    Erstellen Sie My Free Org wird zu einem dreistufigen Widget

    Das Widget eingebettet die gesamte CreateOrgForm - fünf Abschnitte, die Marke Vorschau, das Bereitschaftsmessgerät - das ist etwa 1.400px in einer Scheibe von etwa 756px. HomeGrids Reihen sind minmax(Einheit, Auto), und dass "Auto" ein Sicherheitsventil ist statt einer Decke, so dass eine Scheibe, deren Inhalt nicht schrumpfen kann, wächst die Zeile: die "Widget" als eine lange Form auf der Seite gemacht. Es ist jetzt der schnelle Weg, als der es immer beschrieben wurde. Drei Schritte - Typ, Name und Adresse, Rezension - nur die Felder fragen, die tatsächlich blockieren eine Erstellung und Senden alles andere genau wie zu WizardFormData hat es immer für einen Schöpfer, der Übersprungen diese Schritte. Branding, Apps und Compliance werden anschließend in der new org's Getting Started Assistent. /network/create ist unverändert und fragt immer noch nach alles im Vorfeld. Der Typschritt ist eine SUCHE, kein Kartengitter. Im dichten Layout des Widgets das Raster ist eine Karte pro Reihe, so dass ein Mieter mit dreißig Zweigtypen achtzehn hundert Pixel von Karten - die Strecke, wieder, und es wird schlimmer, wie die Plattform wächst. Suche macht den Schritt zu einer festen Höhe bei vier Arten oder dreihundert. Auch hier: - WidgetFrame nimmt eine optionale maxHeightPx, und dieses Widget geht seine eigene paneHeightPx(halbe Ruhige), also ist die Pane die Größe, die das Mitglied ihr gab und scrollt anstatt zu wachsen. Optional, so dass kein anderes Widget das Verhalten ändert. WidgetComponentProps gewinnt HalfRows, um das zu ermöglichen. - Die Alias-Vorschau liest jetzt KamoCRM.com/o/<alias" auf beiden Oberflächen, die zeigen es, durch einen Helfer anstelle von jedem Gebäude die Schnur selbst. DISPLAY NUR - Routing ist per Hostname und es gibt keine /o/ Route, so workspaceUrl und /api/org/current sind absichtlich unberührt und ein Start landet noch auf intern.<host'. Eine eigene Domain zeigt sich immer noch als sich selbst. - Der /branch-type/cretable holen und sein Parsing-Gebögen bewegen sich zu einem gemeinsamen Modul und Haken, da beide Typ-Pickers es brauchen und es trägt auch die Eltern subdomain-branch Kontext. Das rechnet mit einer Live-Verdoppelung: OrgTypePicker gebaut BranchTypeData zweimal und die beiden Kopien hatten bereits auf Array-Zerzung gedriftet. - workspaceUrl bewegt sich aus CreateOrgForm, so dass das Widget einen Arbeitsbereich bauen kann Link, ohne das gesamte Seitenformular zu importieren. - next/link für den "Öffnungen die ganze Seite" Sprung. check-Client-Navigation verpasst die Rohanker, weil sein Regex <a und href auf einer Zeile benötigt. Wachen, tsc und 4.339 Tests grün; Wörterbuch-Tasten zuerst geschoben.

  8. · kamo-internal

    Erste Startkarte auf der Seite Einstellungen

    Fügt eine essentielle-Gruppenkarte, die mit /settings/wizard verknüpft ist, passend zu der makeCard idiom von seinen Geschwistern verwendet. Wörterbuch-Tasten bereits gedrängt ********************

  9. · kamo-internal

    Ein SEND TO AI Schalter auf das Berichtsformular

    Rechts ausgerichtet auf der "Was berichten Sie?"-Reihe, aus jedes Mal das Fenster öffnet - es beginnt eine Sitzung auf einer Maschine mit Cluster-Anmeldeinformationen, und ein Schalter, der seine letzte Position erinnerte würde schließlich etwas niemand senden soll senden. Vorlage mit ihm auf Hände den Bericht direkt über: In Progress, und gelesen von dem Betreiber, der es gesendet. Gezeichnet nur für einen Inhaber von MANAGE_SYSTEM_BUGS, gelesen von der serveraufgelösten PlatformRightsContext - checkRight ist das TENANT Rechterücken und kann nicht antworten für eine Plattform überhaupt, so fragen, es hätte den Schalter von jedem versteckt Plattform-Administrator. Das ist Chrom so oder so: SecurityService Endpunkt sitzt unter einer Klasse-Ebene @RequirePlatformRight und lehnt jeden anderen mit einem 403. Die Anfrage enthält eine Bug-ID und NOTHING ELSE. Das Formular hat keine Eingabebox, nein Modell-Picker und kein Screenshot-Picker, so dass der Server wählt alle von ihnen; Montage einer Nutzlast hier hätte diese Möglichkeiten in den Browser gestellt, wo die Mitglied mit dem Recht könnte sie bearbeiten. Die Hand-off läuft nach den Uploads, nicht neben ihnen - der Versand liest was auch immer im Moment angebracht ist, in dem es läuft, und eine Sitzung früh begonnen würde sein Arbeit aus einem halben Bericht. Ein Versand, der nicht gelingt, gilt immer noch seinen Status, so der Bericht ist In Progress durch die Zeit, die Taste wieder gedrückt wird und ein Reporter kann nur eine bearbeiten, die noch neu ist: das Fenster erinnert sich, was es zuletzt geschrieben hat und überspringt die redundante re-save, oder der Retry würde berichten, dass ein gespeicherter Bericht könnte nicht gespeichert werden und nie wieder versuchen, die Sache, die tatsächlich gescheitert.

  10. · SecurityService

    Senden Sie an AI direkt aus dem Bericht Formular

    Ein Inhaber von MANAGE_SYSTEM_BUGS erhält einen SEND TO AI-Schalter im Report Bug Fenster, und Vorlage mit ihm auf Hände den Bericht zu einer Sitzung ohne die Triage-Dialog dazwischen. Der neue Endpunkt nimmt KEINÖRPER, und das ist der Punkt. Das Formular hat keine Aufforderung Box, kein Modell-Picker und kein Screenshot-Picker, so die Anleitung, das Modell, der Aufwand, die Screenshots und der Status sind jeder von ihnen hier gewählt . ein Anrufer hinter dem Gate kann nichts ausdrücken, was der Dialog nicht könnte, was macht der Schalter streng schmaler als die Oberfläche, für die er steht. Dann geht es durch Versand() unverändert, also die Drosselklappe, die Audit-Reihe geschrieben vor der Netzwerk-Anruf, und der Screenshot Eigentumsprüfung sind die gleichen, nicht eine zweite kopieren, um im Gleichschritt zu halten. Bewacht durch die Klassenebene **************** der Dialog sitzt schon unter. Die Konsole verbirgt den Schalter vor allen anderen, aber das ist verchromt: ein Bericht mit der Flagge von einem Mitglied ohne das Recht eingereicht wird abgelehnt mit einem 403 hier und erreicht keine Sitzung. "Bereits betrachtet" ist eine Tatsache pro Person und kann nicht für jedermann geschrieben werden PlatformRightsResolver antwortet: "Halbt dieses Mitglied", niemals "wer hält es". So wird die Lektüre für den Operator aufgezeichnet, der um den Versand gebeten hat, bevor Netzwerk-Anruf statt nachher (es kann zwei Minuten dauern und es kann fehle), und IN_PROGRESS ist es, was den Bericht von der NEUEN Abzeichen jedes anderen Managers entfernt.

  11. · kamo-internal

    Erste Konfigurations-Assistenten unter /settings/wizard

    Dreht die neun bewegte Assistent Schritte in einen Redakteur über die Organisation der Mitglied ist bereits angemeldet. Jeder Schritt sät jetzt seinen Wert von lebender Org Daten (useOrgContext, GET /api/security/org/{id], /api/security/features, oder useAppliedModel gegebenenfalls) und spart auf den Endpunkt, der bereits besitzt dass Einstellung auf "Save & weiter"; "Skip this step" zeichnet Fortschritte ohne Schreiben. - orgSettingsSave.ts: Pro-Step-Nutzlasttypen (StepSavePayloads) und generisches saveStep(key, orgId, value) Versand, getippt ohne "never"/'any'. - orgDetails.ts: gemeinsames Holen Sie für die Org-Felder die dünne Theke Die Organisationsklasse trägt nicht (Kontakt, Etiketten, Beschreibung, etc.). - wizardSteps.tsx / StepRail.tsx / page.tsx: die Schritttabelle, die immer- Anklickbare Schiene und die Shell (BrandScanProvider, inert während der Saves). - IdentityStep Tropfen ************ steuert - das sind jetzt Einstellungen - Domains/Behavior & Labeling Gebiet. - HintergrundsStep verfolgt bestehende + neue Slots zusammen, seit /backgrounds/commit ersetzt die gesamte Bestellung und Verpflichtung nur neu Dateien hätten die vorhandene Diashow einer Organisation gelöscht. - complianceWizard.ts: erweitert getComplianceStepUi's Parameter fünf Felder, die es tatsächlich liest, so dass der Compliance-Schritt kann es mit Verwenden Sie die Einstellungen vonAppliedModel anstelle einer create-time BranchTypeData. - api.ts: exportierte buildCustomLabels zur Wiederverwendung durch den Etikettensparer.

  12. · kamo-internal

    Der /Copilot Held und beide Scancodes tragen auch die Chamäleon-Marke

    waren die letzten beiden Standorte, und keiner konnte nur nehmen Sie die neue src unverändert, weil Das Kunstwerk ist eine transparente 127x102 Silhouette, wo das Raster ein undurchsichtiges Quadrat war. CopilotHero. "objectFit: cover" würde die Schnauze von beiden Seiten des Platzes zu schneiden tile, so dass die Marke ist in einem inset Wrapper enthalten . die Polsterbox, so dass der Einlage nicht auf der Platte selbst leben kann. Auch die Platte gewinnt eine durchscheinende Füllung: es verwendet, um die Ikone zu sein, und eine unbesetzte verlässt die Grenze und der Tropfenschatten, der nichts umreißt. QrFrame, beide Codes. Zwei Korrekturen: - Die Markierung ist weiß, und ein QR-Code ist auf weiß gedruckt. Wie ausgeliefert war es ein unsichtbares Logo sitzt in einem Loch aus dem Code gestanzt. "Hellness(0)" auf der emittiert <image" treibt es auf schwarz und lässt die Knockouts transparent. Es hat um CSS zu sein - imageSettings gibt ein <image href" und eine externe SVG verwiesen so ist ein isoliertes Dokument, das keine Farbe vererbt. - 48x39, nicht 48x48. qrcode.react Hardcodes bewahrenAspectRatio="none" darauf Element, so dass die Box IST das Seitenverhältnis und ein Quadrat ein gequetscht die Marke. Die schmalere Box schrumpft auch das ausgegrabene Loch auf 2,9% des Codes, unter dem 3.5% es war vorher und weit in welcher Ebene M verlieren und noch scannen kann. Verifiziert durch QRCodeSVG mit diesen exakten Requisiten und rasterisieren: die Marke liest klar in der Mitte und die Ausgrabung löscht kein Fundemuster. Beide Codes, nicht nur Installieren - sie sind ein gemeinsamer Rahmen auf einer gemeinsamen weißen Platte, und QrFrames eigene Dokus sagen, dass sie dem Styling beider Anrufseiten einzeln widerstehen.

  13. · kamo-internal

    Tauschen Sie die mobile App-Marke für das Chamäleon SVG in der Schiene und zu Hause

    raster. Beide zeichnen nun das KamoMobileApp-Artwork als Vektor. Eingecheckt als SVG, denn das ist, was die Marke ist: eine einzige weiße Silhouette mit transparente Knockouts. Durch svgo bei 2-Dekulf-Präzision zuerst übergeben, die ist verlustfrei für die Geometrie dieser Spur, sondern nimmt die Datei von 675 KB bis 106 KB (-23 KB) über den Draht einmal komprimiert) - der Export trug sechs Dezimalstellen auf jedem 5k Spurensegmente. Zwei Dinge übertragen sich NICHT vom Raster: - Die Box. Die AnsichtBox ist 127x102, also eine quadratische Breite/Höhe, die sie zerquetstet. Jeder von die drei Call-Sites bekommt eine 127:102-Box, um die optische Höhe der Glyphe zu halten wo die gepolsterten PNG's waren. - next/image-Optimierung. "unoptimisiert" auf allen dreien: /_next/image kann nicht resample Vektor, so ohne ihn ist die Anfrage eine Rundreise, die die gleichen Bytes zurückgibt. CopilotHero und das QR-Zentrum verwenden icon.png immer noch in ihren eigenen Größen; das Raster bleibt.

  14. · kamo-internal

    Erstellen Sie mein kostenloses Org Widget

    Schiffe die gleiche CreateOrgForm die /network/create Seite macht, in seiner Widget-Layout, als Home-Launch-Pad Widget (org.create) gated on CREATE_FREE_ORG_WIDGET. Zuletzt registriert: Es ist eine ständige Einladung, nicht eine zeitkritische Scheibe. Kein Tor - eine Organisation zu schaffen ist nicht eine App, und die fünf Rechte sind die ganze Entscheidung. Spiegelt auch CREATE_FREE_ORG_WIDGET und seine vier Politik Kinder in die von Hand gewartete TS-Rechtshierarchie (205 - 210 Kanten), die WigetPolicy.test.ts fünf-rechts-Form Behauptungen erfordern für jeden registrierte Widget.

  15. · KlusterServices

    Öffnen Senden Sie zur KI in einem VS-Code-Sitzung Registerkarte, nicht ein Konsolen-Fenster

    Eine Sendung startet jetzt eine HINTERGRUND-Sitzung und übergibt VS-Code seine Session-ID, anstatt das CLI in einem Terminalfenster zu betreiben: Die Eingabe der Aufforderung an die URI statt ist eine Falle: die Verlängerung Anrufe setInputText und sendet nie, und die Synthese einer Rückkehr ist unmöglich, während die KDE Schließfach hält seinen X-Grab. Eine Sitzung, die ALREADY RUNNING ist nichts mehr um sich zu unterwerfen, was die Handoff-Arbeit mit niemandem an der Maschine macht. Vier Dinge, die eher gemessen als begründet sind: - cwd muss realpath(workspaceFolders[0]) sein, NICHT der gemeine Elternteil, der verwendet wurde vor. Der Panel-Host verwurzelt sich auf den ersten Ordner und listet nur die Sitzungen findet es dort, so dass eine Sitzung woanders gestartet ist unsichtbar für das Fenster, das es öffnen soll, öffnet der Handoff einen leeren Tab. Die andere Reservisten bleiben stattdessen durch --add-dir erreichbar. --add-dir ist VARIADIC und wurde die Aufforderung essen, so Sitzungen kam mit einem leerer Komponist. Die Verzeichnisliste geht jetzt zuerst, geschlossen durch die Flags danach. - Ein Start kann keinen Griff ausdrucken, oder einer mit der Aufschrift "(idle - senden Sie eine Aufforderung zum Starten) ". Beides bedeutet, dass die Nachricht nie angekommen ist, also werden beide eher angehalten und neu verhandelt als vor dem Bediener als leerer Tab geöffnet. - Das Gremium kann keinen Hintergrund-Agenten besitzen, und ein fertiges bleibt Resident, so ein Beobachter stoppt es, sobald die Arbeit getan ist. Wiedereröffnung der Registerkarte dann wieder die Sitzung in der Regel, ganze Konversation intakt. Bestätigung ist nun das Transkript, das von Session-ID adressiert wird, das die JSON-escaped-needle Suche, die gelieferte Depeschen als Ausfälle gemeldet.

  16. · kamo-internal

    /network/create ist eine Seite; die zwölf Schritte bewegen sich zu /settings/wizard

    CreateOrgForm.tsx ist eine Komponente mit zwei Layouts (Seite/Widget), gebaut aus Task 7/8 CreateOrgFields Modell, Feldgruppen und OrgBrandPreview. page.tsx ist jetzt nur die volle Breite Schale um ihn herum. Die neun Schritt-Dateien des alten Assistenten plus Stepper/StepIcons bewegen sich zu app/settings/wizard, wo Task 12 sie in die Erste Konfiguration neu verdrahtet Wizard; BranchTypeStep, MemberInfoStep, ReviewStep, StepNavigation, CancelModal und sessionStorage-Backed useWizardForm Hook sind direkt ausgeschieden, da eine einseitige Erstellung hat keine Schritte, um zwischen und nichts mehr zu navigieren, um einen Entwurf zu speichern. Jeder relative Import in den verschobenen Dateien, die auf ../ui/*, ../brandscan/*, ../../types, ../../validation, ../appSelections, ../.complianceWizard oder ../../hooks/* wird umgeschrieben das absolute @/App/Netzwerk/Bild/... Form, da Komponenten/ui und Komponenten/Markenscan bleiben Put (die überlebenden Feldkomponenten verwenden sie immer noch) und beheben Sie nur ein Verzeichnis aus dem Schritte "alte Lage. hooks/useWizardForm.ts wird gestutzt statt gelöscht: __tests__/submitWizard.test.ts importiert freshWizardData von ihm und muss grün und unedited bleiben, so dass die Datei hält, dass ein Export (und die INITIAL_DATA, die es braucht) und lässt alles andere, was keinen Anrufer mehr hat, fallen. Zwei Korrekturen, die in der Überprüfung vor der Verdrahtung der Feldkomponenten gefunden wurden: - CreateOrgForm's onChange ist jetzt referentiell stabil über Renders (requestScan lesen durch ein Ref statt einer useCallback-Abhängigkeit) - OrgTypePicker und IdentityFields jede Liste aufChange in einem useEffect Dependency Array und fordern Sie Scans eigene Identitätsänderungen auf jeder abgeschlossenen Marke scan, der beide Effekte auf jeden Scan und nicht nur auf reale Eingabeänderungen nachgefeuert hätte. - DropZone nimmt eine echte deaktivierte Requisite (tabIndex=-1, gehütete Handler, native deaktiviert auf seiner Datei Eingabe- und Fallback-Taste) anstatt sich nur auf den Zeiger-Ereignissen-none eines Vorfahren zu verlassen, der tut nichts für Tastatur-Aktivierung; verdrahtet durch BrandFields 'Logo-Slots so eine gesperrte Form tatsächlich sperrt Tastatur-Nutzer zu. /network/create?fresh=1 wird schlicht /network/create in FirstOrgCta.tsx und network/page.tsx: das einseitige Formular beginnt von initialCreateOrgFields() auf jedem Reittier, anstatt eine SessionStorage Entwurf, so dass die param hat nichts mehr zu tun.

  17. · kamo-internal

    Wiederverwendbare Feldgruppen und die Live-Markenvorschau

    Extrahiert die Eingänge von BranchTypeStep, BasicsStep, LogoStep, ColorsStep, AppsStep und AgeRestrictionsStep in fünf gesteuerte Feldkomponenten (OrgTypePicker, IdentityFields, BrandFields, AppSwitches, ComplianceFields) dass sowohl /network/create-as-one-page als auch das Launchpad-Widget machen können, Verlassen der Schritt Rahmung (Header, Überspringen Taste, Navigation) hinter. Adds OrgBrandPreview, eine Live-Marke Miniatur angetrieben von previewPalette(), die Muster-Checks jede Schöpfer-autorisierte Farbe, bevor es einen Stil erreicht Attribut und fällt zurück auf die Plattform CSS-Variablen. IdentityFields und OrgTypePicker wurden Mitte-Task für die eingestellt **************** Ergänzung Landung in parallel: OrgTypePicker erfasst jetzt die Subdomain-Zweigstelle des Elternteils context neben dem Zweigtyp, und IdentityFields consults consults webAliasPossible() anstatt es neu zu tilgen, bietet die Web-alias Pfad nur, wenn sie wirklich verfügbar ist. Aufgabe 8 des ************ Plans.

  18. · kamo-internal

    Erstere Konfiguration Wizard-Button mit Aufmerksamkeitsrand

    Fügt den Einstiegspunkt der Launchpad in den Setup-Assistenten: ein nur für Besitzer, Rechte-gated Pille mit der Aufschrift "Getting Started Configuration Wizard (x/9 steps complete) ", platziert zuerst in der Pillenreihe vor My Widgets. Renders null bis der Org-Besitzer + rechts + geladen-summary + nicht fertige Tor löst, so dass es nie für einen Besitzer, dessen Organisation bereits fertig Setup. Die Grenze trägt ein kontinuierliches Konik-Gradienz Glanz plus eine Atembox-Schatten in der Organisation --Farbe-Primary, und stoppt animieren (während der Aufenthalt sichtbar zweifarbig) unter bevorzugt-reduzierte-Bewegung.

  19. · kamo-internal

    Getting Started Assistent Schritt Modell und Client

    Fügt das Client-seitige Schrittmodell (app/lib/orgSetupWizard.ts) hinzu, eine dünne API Client für GET/PUT/DELETE /api/security/org-setup-wizard (app/lib/orgSetupWizardApi.ts), und der useOrgSetupWizard Haken, dass die wizard Seite und der Launchpad-Button werden beide auf bauen. Reine Logik lebt in app/lib statt neben der Seite, weil App/Settings/** und app/hooks/** sind nicht in vitest's include allowlist. isWizardFinished wird ausschließlich durch die abgeschlossene Verriegelung des Servers entschieden, nicht durch Zählen abgeschlossener Schritte, so dass die Launchpad-Taste bleibt für eine Organisation, die bereits beendet, auch nach der Schrittliste wächst. normalizeSummary ist total über unbekannte Eingabe und Drops Schrittschlüssel der Client erkennt nicht. useOrgSetupWizard hält "loaded" getrennt von "summary" so die Launchpad-Taste macht nichts, bis die wirkliche Antwort ist bekannt.

  20. · SecurityService

    Fügen Sie Fortschritts-Service und Endpunkte hinter dem Getting Started Assistent

    Org-scoped GET/PUT/DELETE unter /api/security/org-setup-wizard track welche der neun Erste Schritte eine Organisation abgeschlossen hat. Eine Lektüre schafft nie eine Zeile, und completedAt ist ein gespeicherter Riegelsatz einmal, wenn der letzte herausragende Schritt landet - es überlebt beide nicht-kompensieren einen Schritt und die Schrittliste wächst später, so dass eine fertige Organisation Launchpad-Taste nie wieder auftaut.

  21. · kamo-internal

    Die maximierte Palette zoomt in das von Ihnen ausgesuchte Gespräch

    Das Wechseln von Gesprächen in der maximierten Ansicht war ein 8px-Schub und ein 180ms Fade nah genug an nichts, dass die Scheibe aussah, als hätte sie einfach neu gestrichen. Es jetzt liest sich als irgendwo ankommend: das eingehende Gespräch kommt von 6% unter Größe mit einem kurzen Anstieg und landet in der Scheibe, undurchsichtig früh, so dass es lesbar ist, während es ist immer noch in Bewegung, auf einer Kurve, die die meisten seiner Reisen vor und dann abrechnet. Die Form wird vom z-Stack und nicht vom gewählten Teil diktiert. Ein Klick auf eine Navigator-Reihe fokussiert das neue Fenster, so dass das eingehende über das ausgehende gemalt ist, und das entscheidet beide Hälften: - Die eingehende kann INTO die Scheibe wachsen, aber nie vorbei. Die maximierte Schale ist ein Element der Größe des Ansichtsports und nichts hier pins das Dokument Überlauf, so eine Ankunft, die überschreitet 1 Farben außerhalb des Blickports. - Der Ausgang hält volle Größe und verblasst nur. Während die eingehende ist noch Untermaß deckt es nicht die Scheibe und der Ausgang ist das einzige, was dahinter es, so schrumpfend, dass auch würde eine Rand der Kulisse um ein MAXIMIZED Fenster zu öffnen ein Flimmern, nicht Tiefe. Es ist frei zu verblassen, weil das Eintreffen undurchsichtig darüber ist lange bevor es weg ist. Diese Deckungsregel ist arithmetisch, nicht Geschmack, so ist es ein Test: die ausgehende verblassen muss überdauern die eingehenden. Zwei weitere Pin die Einschränkungen, die unsichtbar sind, bis sie Pause - die Ankunft skaliert nie nach 1, und es endet innerhalb der Swap-Phase, die scheidet die Rolle zurück und würde sie sonst mitten im Flug neu ins Visier nehmen. Reduzierte Bewegung hält die schlichte Crossfade. Behebt übrigens eine kleinere Sache: Früher war die Ankunft 200ms in einer 180ms-Phase, so wurde es die Siege Ziel 20ms übergeben, bevor es fertig.

  22. · kamo-internal

    Drei-Solon-Widgets und pro-Widget Mindestgrößen

    Widens WidgetWidth to 1 | 2 | 3 | 'full' und lässt sich von einem WidgetDefinition erklären minWidth/minHeight. widgetMinSize(definition) konvertiert, in einen PaneSize-Boden (oder Null, wenn nichts deklariert wird), geben beides Achsen eines Bodens, auch wenn nur einer deklariert ist - die nicht deklarierte Achse Etagen in eigener Standardgröße. Fäden, dass Boden aus der Registrierung durch jeden Verbraucher, dass Größen oder verkleinert die Größe eines Pane: Verwenden Sie HomePanes' sizeOf/setSize, PaneChrome's drag UND Tastatur-Resize-Pfade (alle drei Klemmanrufe), SortableCard, das Zuhause Seite sortable-grid Widget render Website, und die Einstellungen-Seite Layout Vorschau. Das Pinned-Widget-Band in page.tsx ist absichtlich unberührt es macht immer bei WidgetDefaultSize und liest nie gespeichert Präferenzen, so dass ein deklarierter Standard bereits seine eigene Etage erfüllt. Kein Widget in der Registry erklärt Breite 3 oder ein Minimum noch; das ist spätere Arbeit. Das erweitert nur den Wortschatz und verdrahtet die Maschinen.

  23. · kamo-internal

    Berühren Sie ein zurückgezeichnetes Logo von Hand, und laden Sie die konvertierte Datei

    Vier Dinge auf dem Raster-zu-Vektoren-Konverter und dem einfachen Logo-Slot. **Die Scrollleiste auf den Raster-Optionen ist dreimal breiter.** 4px war ein hartes Ziel für landen auf, und die Regeln waren Webkit-nur, so Firefox hatte noch nie eine gestylte Bar überhaupt scrollbarWidth/scrollbarColor tragen jetzt die gleiche Absicht dort. **Ein Quell, der bereits einen transparenten Hintergrund hat, wird in Ruhe gelassen.** Der Eyedropper wurde benutzt um gerne eine Farbe für ein transparentes Pixel zurückzugeben: eine Leinwand speichert vormultipliiertes Alpha, also jeder von ihnen liest sich zurück als (0, 0, 0), und die Auswahl einer sagte der Pipeline den Hintergrund war schwarz. Es ging dann und löschte die dunklen Teile des Logos. Jetzt auf Transparenz klicken sagt so statt Kommissionierung. Die passende serverseitige Korrektur ist im Vectorservice. **Ein Zauberstab und eine Bürste, die jeweils hinzufügen oder entfernen können.** Automatische Entfernung bekommt zwei Dinge falsch oft genug, um mit streiten zu müssen: ein Hintergrund, der in einen geschlossenen Teil der Lecks undicht Design und ein Stück des Designs, das die Farbe des Hintergrunds teilt und dazu passt. Die wand nimmt eine ganze zusammenhängende Region mit einem Klick; die Bürste nimmt, was immer gezogen wird. Jede Operation löst sich gegen die ORIGINAL Ernte, nie den aktuellen Cut-out. Das ist, was macht "+" überhaupt möglich - sobald der Umzug das Alpha einer Region auf Null gesetzt hat, gibt es keine Region mehr zu finden, aber das Original hat immer noch die Farbe. Es macht auch die Ops wiederspielbar, so Nudging eine Einstellung danach wiederholt Entfernung, ohne die Korrekturen zu verwerfen. Edits malen lokal für sofortiges Feedback; nur das abgeklärte Ergebnis überquert den Draht, und nur das Alpha Maske, als 8-Bit-Grauhöhle PNG von ein paar hundert Bytes. **Ein Download-Button neben dem einfachen Logo**, damit das Mitglied die SVG den Konverter behalten kann oft die einzige Vektorkopie ihres Logos, die jemand hat, und ansonsten nur erreichbar aus einem Eimer können sie nicht stöbern. Die Erweiterung kommt vom Schnüffeln der Bytes, nicht die gespeicherter Name: Dieser Slot schreibt jeden Upload auf einen festen logo.svg-Schlüssel unabhängig vom Typ, also theme.kamocrm.com bedient PNG Bytes von einem .svg Namen für jede Org, die ein Logo vor dieser gesetzt Der Konverter existierte. Geholt in einen Klecks statt verbunden, weil ein Kreuz-Ursprung .<a download' wird ignoriert und würde die Datei öffnen, anstatt sie zu speichern.

  24. · kamo-internal

    Einseitiges Feld-Set und die Standardeinstellungen, die die fallengelassenen Schritte ersetzen

    CreateOrgFields ist das, was die neue einseitige /network/create Form tatsächlich verlangt für: einen Zweigtyp, Name, Alias, die App-Schalter und eine Handvoll optional Felder. zuWizardFormData füllt alles aus, was der Zwölf-Schritte-Assistenten verwendet hat sammeln, aber diese Seite nie zeigt, mit genau dem, was überspringt jeder von denen Schritte zum Senden (bindPhone/bindEmail true, Leerkontakt/Etiketten, Wasserzeichen FULL, Markenquellen COMPANY) so ein Org hier erstellt ist ununterscheidbar von man machte den alten Weg von jemandem, der nur das ausfüllte, was erforderlich war. mitBranchType hält auch parentAliasId auf eine Option der gewählten Modell tatsächlich bietet (ROOT zuerst, wenn erlaubt, sonst der erste Brauch des Modells alias) - der Zwölf-Schritte-Zauberer tat dies in einem BasicsStep-Effekt des Schöpfers nie gesehen Feuer, und ohne ein Äquivalent hier erstellenOrgReadiness Blöcke für immer auf einem Feld diese Seite fragt nie nach einem Zweigtyp, dessen einzige Eltern-Option ist ROOT.

  25. · kamo-shared-library

    Erstellen Sie meine kostenlosen Org Widget-Rechte und Erste-Getting-Getting-Wäuberer Fortschritt

    Fügt RoleRightType 288-292 hinzu (CREATE_FREE_ORG_WIDGET und seine vier ADDED/OPTIONAL/ REQUIRED/MOVABLE Politik Kinder), abgehängt CREATE_CHILD_ORG (131). Addiert OrgSetupWizardStep, das neunstufige enum zur Unterstützung der Getting Started Konfiguration Wizard, und ************ org_setup_wizard_progress Tabelle aus Task 2. Auch Updates RoleRightHierarchyTest's pinned taxonomy Form (278/205/35/38 - 283/210/36/37): CREATE_CHILD_ORG war eine eigenständige Wurzel und gewinnt ihre erste Kind hier, bewegt es in die WurzelnWithChildren Eimer, passend zu dieser Datei eigene feste Konvention zur Aufzeichnung jedes Widget-Liefendanten in diesem Test.

  26. · kamo-internal

    Pro-Panne Mindestgröße, angewendet auf lesen sowie auf Drag

    Fäden ein optionales "min?: PaneSize | null" durch clampPaneSize, die beiden resize-delta Helfer, und die beiden Präferenz Lese-/Schreibfunktionen in der reines Launchpad Pane Modell. Rückwärtskompatibel: Jeder vorhandene Anrufer lässt das Argument weg und hält das heutige Verhalten aufrecht, da clampPaneSize fällt zurück zum netzweiten ************-Boden, wenn nein pro Pane wird minimal geliefert. Der Boden wird auf resolvePaneSize's STORED Wert durchgesetzt, nicht nur in der Drag-Handler, so dass die Präferenz eines Mitglieds aufgezeichnet, bevor eine Pane hatte eine Minimum (oder bevor es angehoben wurde) wird wieder nach oben gezogen auf gelesen.

  27. · SecurityService

    Setzen Sie ein Echtzeit-Budget auf Resend-Resing-Reifikation

    Der Endpunkt hatte keinerlei Grenze. Die *** der Registerbildschirm gefordert, bevor die Aktivierung seiner Resend-Taste wurde nie hier gelesen . Anfrage Körper ist drei Felder von JSON und nichts auf dem Server gesucht eine Nutzlast - so dass die Steuerung einen Button, nicht die Anfrage und ein Skript eingesperrt hat Das Posten direkt an dieser URL war bereits unbegrenzt. VerificationResendRateLimiter ersetzt es durch ein Budget, das der Server besitzt: eine 60er Abklingzeit als einzelne SET NX genommen, so dass Renn-Repliken nicht beides gewinnen, 5/Stunde und 15/Tag pro Adresse und 20/Stunde pro öffentliche IP. Geprüft VOR der org und Benutzer-Nachahmung und Keyed auf der SUBMITTED-Adresse, so ein probe Kosten Budget, ob das Konto existiert oder nicht und die 429 nicht werden die Konto-Bestätigung Orakel, dass der Endpunkt ist vorsichtig "wenn dies Konto existiert" Antwort existiert zu vermeiden. Das IP-Fenster wird für eine nicht-öffentliche Adresse übersprungen: Unbestimmt darf nicht Zusammenbruch in einen gemeinsamen Schlüssel für jeden Registranten. Redis-backed, weil dieser Dienst läuft Repliken, und scheitert offen auf einem Redis Ausfall. Eine Ablehnung antwortet 429 mit Retry-After und RetryAfts, so dass die Bildschirm kann sich gegen diese Uhr herunterzählen, anstatt an seiner eigenen zu raten.

  28. · InitializerService

    Erstellen Sie org_setup_wizard_progress für den Being Started-Assistenten

  29. · kamo-internal

    Das org's Jahr festgelegt ist optional, und unset renders als abwesend

    Nichts auf dem Server benötigte es jemals - die Spalte ist nullbar, die Erstellung Parser Karten einen leeren Wert zu Null, und patchOrganization gilt nur die Tasten ein PUT-Gremium erwähnt, also "yearEst": Null ist eine absichtliche klare. Das einzige Tor war dieser Assistenten validateBasics, die den gesamten Basics-Schritt bis zu einem Jahr blockiert wurde ausgewählt. Viele echte Kunden haben keine Antwort (eine neue LLC, eine Division gesponnen aus Mitte des Jahres, wer einfach nicht weiß), so dass das Tor nur gelehrt, eins erfinden. Drop it; das Feld behält sein sternfreies Label und gewinnt das gleiche "Optional". FieldHint hat jedes andere optionale Feld auf dem Schritt bereits. Behebt den Grund, warum niemand bemerkte, dass das Feld bereits Ende zu Ende war: org DTO parsed yearEst mit einem nackten ************ und Nötigung läuft VOR Optionalität, so Number(null) === 0 und jede oder eine oder eine Jahr kam als im Jahr Null gegründet. Es blieb unsichtbar, weil Display Websites Wache auf Wahrhaftigkeit und 0 ist unklar - es wäre als "Est aufgetaucht. 0" bei die erste Seite, die stattdessen auf .!= null" gecheckt hat. Vorprozess null und "" zurück zu undefiniert, normalisieren die gleiche Weise in Organization.fromJSON, und erweitern die Netzwerk / Thema DTOs, um die Null, die tatsächlich ankommt zuzugeben. Die beiden Anzeigeseiten, die verwendet wurden, werden .{org.yearEst &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& falsy-and render ist, was eine nackte 0 in die Schublade gemalt haben würde. Die Einstellungen-Formular leitet jetzt die speichern durch parseYEst, so dass eine leere Box löscht der Wert absichtlich und nicht durch JSON.stringify Drehen von NaN in null.

  30. · kamo-internal

    Zeigen Sie einem Mitglied nur die Tabs, die ihnen gehören

    Drei Mitglieder-Einstellungsflächen waren offen für Menschen, die sie nichts bedeuten können für. Jedes Gate ist auf dem MEMBER TYPE oder den Org-Apps, nie auf checkRecht checkRight kehrt für jedes Recht im aktiven Gott-Modus und die Seite kannAnfrageOtherMemberAccount ORs in Rechten, die nichts mit der Betreff ************ unter ihnen). getMemberType() Standardmäßig auf 'MEMBER', so dass jeder von ihnen nicht geschlossen auf eine Sitzung, deren Typ hat sich noch nicht geklärt. Pläne & Billing: nur Teammitglieder. Der Plan, die Abonnements, die Rechnungen, die Zahlungsmethoden und der Sitzplatz gehören alle zum Unternehmen; ein einfaches Mitglied hält keine von ihnen, so dass die Registerkarte zeigte ihnen das Geld des Unternehmens. Gated on der VIEWER, so dass ein Eigentümer, der die Seite eines anderen öffnet, die administrative Weg. Die /Einsatz-Karte ist auf die gleiche Weise gated - eine Karte, die eine Registerkarte, die eine Registerkarte, die will not render ist schlimmer als keine Karte, genau wie Kommissionen daneben. Klingeltöne & Warnungen: Begrenzung auf dem gleichen Zustand wie NavTop-Telefon-Symbol, das ist jetzt eine Funktion (hasPhoneAccess) anstatt zwei Kopien des gleichen &&. Der Subtab ist nichts anderes als die Konfiguration des Telefons, das Symbol öffnet welcher Klingelton, welches Gerät, wie laut - so wurde ein Mitglied ohne Telefon Handed Controls, die nichts ändern können, was sie jemals hören werden. Audio, Video und Event Sounds sind unberührt: das sind die Tagungsgeräte und die App eigenen Benachrichtigungsgeräusche, die jedes Mitglied hat. Legal & Compliance: Teammitglieder und eine Org mit den Docs und HR-Apps. Anstatt die neuen Bedingungen inline, falten sie in legale BadgeAppliesTo, welcher NavTop-Button und der Zählanbieter hinter seiner Plakette bereits share. Dieser Button ist ein Link direkt zu diesem Tab, so dass eine vierte Kopie der Bedingung würde es überleben sein eigenes Ziel und lassen Sie das Mitglied auf ihre Profil ohne Erklärung; der Anbieter geht ruhig auf den gleichen Zustand anstatt ein STOMP-Abonnement und eine 60-Sekunden-Umfrage für eine Zählung zu halten, ist 0 durch Konstruktion.

Euer Universum wartet.

Fügen Sie Produkte hinzu, wann immer Sie möchten – keine Migration, keine neuen Anmeldungen.

Für immer kostenlos – keine Kreditkarte erforderlich