Changelog
Ce qui est nouveau.
Chaque amélioration apportée à la plateforme, à mesure qu'elle est livrée.
· kamo-shared-library
Un domaine est revendiqué en le prouvant, et non en le tapant
Trois règles, et elles n'ont de sens qu'ensemble. Un FQDN était globalement unique ici, donc le FQDN était unique ici, donc le FQDN n'a rien à voir avec le n'importe quel domaine. la première organisation à entrer sur "acme.com" a verrouillé une autre la société qui possède effectivement acme.com, qui n'avait alors aucun moyen d'y mettre. Quelqu'un qui a prouvé rien ne doit pas être en mesure de nier un domaine à quelqu'un qui peut. Les lignes dupliquées entre les organisations sont désormais légales; une répétition dans ONE l'organisation est toujours refusée, parce que c'est une erreur sans sens plutôt qu'une créance concurrente. "Seuls les routes de domaine vérifiées." findByDomain maintenant nécessite la possession. sur la ligne de haut niveau, donc un hôte va à l'organisation qui a prouvé le contrôle de son DNS plutôt qu'à celui qui l'a tapé en premier. Sans cet appariement le premier la règle serait une porte ouverte: revendiquez somebank.com et attendez. Un pseudonyme hérite de son la vérification par les parents - le défi TXT n'est jamais lancé que pour le sommet - et qui est lu sur le parent explicite joindre, jamais aussi d.parent.ownershipVerified, que Hibernate émet en tant que jointure intérieure sur l'ensemble de la requête et laisserait tomber tous les rangée d'apex. "La vérification enlève le domaine à tous les autres. le même FQDN où qu'il soit tenu, il y a donc au plus un titulaire à un temps. Ce n'est pas une courtoisie: deux lignes vérifiées sont à la fois routables, et le Un résolveur transmettrait le trafic à la base de données qui est retournée en premier. Une organisation qui a vérifié un domaine l'année dernière et qui, depuis, a laissé tomber continuer à recevoir le courrier de celui qui le possède maintenant. Vérification DNS du perdant Cela va de pair, parce qu'il décrit un nom d'hôte qui ne pointe plus sur eux. Autoriser les doublons coupe ensuite chaque consultation qui a supposé une ligne, et l'une de Il ne s'agissait pas d'un accident mais d'un détournement: upsertDomain correspondait sur le domaine NOM et puis réaffecté tout ce qu'il a trouvé à l'organisation appelante, donc un upsert aurait discrètement retiré le domaine d'une autre organisation. C'est L'organisation a été levé maintenant. Le reste et findByDomain, updateSslInfoDomamain, transferDomainOwnership - a subi par un seul détenteurOf(), qui préfère le une ligne vérifiée et prend d'autres manières l'identifiant le plus bas, de sorte que le propriétaire d'un domaine ne peut pas changement entre deux demandes. Laissés en tant que reliures facultatives qu'ils auraient jetées - sur les données que le schéma permet maintenant.
· SecurityService
Porter les valeurs par défaut de type membre
Lire sur POST/PUT/types de sécurité et PUT/master-modèle, et émis à partir de / Paramètres du modèle appliqué afin que le réservoir puisse décider où un membre atterrit sur "/". Appeler indépendammentAccueil d'écranScreenDefaults au lieu de trois autres postes arguments sur une méthode de service qui prend déjà quinze. Il ne reste plus de clés en l'absence de clés seul plutôt que réinitialisé, donc un client qui affiche un modèle de sécurité sans le savoir sur ce champ ne peut pas remettre silencieusement chaque membre du modèle leur rampe de lancement dos - ou l'enlever. /le modèle appliqué se normalise aussi bien sur la sortie que sur le point d'être. REQUISES-ENFANTS-ORG OWNERSHIP refuse un écran d'accueil, donc une colonne nulle sur une ligne écrite avant cette Expédié, ou quoi que ce soit non reconnu, se lit comme le bavardage. Le client est propre Le repli est la même valeur, de sorte que les deux ne peuvent pas être en désaccord.
· kamo-shared-library
Un modèle de sécurité indique où chaque type de membre atterrit sur "/"
Trois colonnes sur ChildOrgSecurityModel - DEFAULT-MEMBER-HOME-SCREEN, DÉFAULT-ORG-OWNER-HOME-SCREEN. Chaque mise en attente HOME-SCREEN-DEFAULT ou REQUISE-L'ENFANT-ORG-OWNERSHIP; le second retient le le bloc de lancement jusqu'à ce que ce membre possède une organisation qui lui est propre. Trois plutôt qu'un parce que les trois types de membres sont trois emplois différents: le même modèle veut régulièrement qu'un membre clair soit poussé à créer son propre pendant que les membres de son équipe et les propriétaires vont directement au travail. La scission Rétroviseurs APPLIES-T-MEMBRES / TEAM-MEMBRES / 'OWNERS' 'OWNERS' VARCHAR, non un enum ordinal et un ordinal remarque chaque ligne stockée le jour a Une troisième option est insérée n'importe où sauf la fin. setHomeScreenDefaults est un setter ciblé sous la forme de setAllowRootSubdomains plutôt que trois paramètres de position supplémentaires sur la mise à jourModèle, qui prend déjà Quinze. Null signifie "laisser celui-ci seul", donc un appelant qui sait à propos de l'un des les trois ne peuvent pas réinitialiser silencieusement les autres. normalizeHomeScreenDefault échoue à OPEN et est testé pour elle: seule la chaîne exacte Allume l'exigence, car l'alternative prend l'écran d'accueil d'un membre et une personne typo ou un client rassis ne doivent jamais pouvoir le faire par accident.
· InitializerService
Les trois colonnes d'écran d'origine par type de membre sur un modèle de sécurité
FEUILLE DE FALEFURE DEFAULT-MEMBER-HOME-SCREEN, DEFAULT-ÉMOMINE-MEMME-SCREEN et DEFAULT-ORG-OWNER-HOME-SCREEN. Chaque prise de cassure HOME-SCREEN-DEFAULT (le pavé de lancement) ou REQUIRES-CHILD-ORG-OWNERSHIP, qui Ne le refuse jusqu'à ce que ce membre soit propriétaire d'une organisation propre. La clause DEFAULT est la partie portante, et non l'AJOUTER COLUMON. Les colonnes sont NON NULL et la succession n'est pas vide, donc la valeur par défaut est ce qui recette chaque le modèle de sécurité existant dans la même déclaration - et c'est délibérément le valeur permissive, parce que la défaut de l'autre façon permettrait d'enlever le pas de tir de chaque membre de chaque modèle le moment où cela a été fait. Ordonnance(0) pour la raison habituelle: l'entité de bibliothèque partagée qui porte ces champs est chargé par chaque service Java, donc un coureur plus ancien mourrait sur "colonne n'est pas existent" avant qu'une migration ordonnée tardive n'ait jamais été atteinte. Les instructions SET NOT NULL réparent le cas où le ddl-auto d'Hibernate a été créé. les colonnes d'abord, à partir de la colonne de l'entitéDefinition, sans la contrainte. Chacun est précédé de sa propre MISE À JOUR, parce que SET NOT NULL est refusé alors que n'importe quelle ligne maintient encore une nure, les broches de test qui commandent.
· kamo-internal
Une liste de ce que le scan a trouvé, en plus de ce que vous utilisez
La section de marque de /network/créate devient trois bandes de la même forme: ce que votre site web a à gauche, ce que votre organisation utilise à droite. Logos. Il y avait DEUX rails sur les mêmes candidats, un par créneau, classé différemment, donc une entreprise avec quatre logos semble en avoir huit, et le La question a été posée dans le mauvais sens. Un membre ne regarde pas un rail et demande "dont d'entre eux est mon logo complet"; ils regardent leur propre marque et disent "que l'un d'eux est le plus complet". Donc c'est une liste des logos du site, chaque ligne portant les deux destinations - Set en Full, Set as Simple - et chaque ligne marqué Vecteur ou Image, Parce que c'est la seule chose à propos d'un fichier de logo que vous ne pouvez pas voir en le regardant Et la seule chose dont le simple créneau sert. Marqué, jamais filtré: se cacher les trames de la fente simple cachaient le logo de la société sur exactement les sites Le scanner fonctionnait mieux. La liste s'accompagne de flèches haut/bas et dit combien d'argent là-bas Soient, donc "mon logo ici" est responsable en regardant. Les arrière-plans sont de retour. Le magicien en douze étapes a collecté des fonds d'écran de connexion et la réécriture d'une page les a abandonnés; le scan trouvait déjà le héros d'une entreprise imagerie, puis n'offrent nulle part où le mettre. Même bande: image numérisée sur le gauche, téléchargement et ordre de marche à droite, avec le choix du filigrane ci-dessous Une fois qu'il y a quelque chose à taper. Les couleurs sont adoptées plutôt que proposées. Un scan terminé définit la paire qu'il a trouvée, et les cueilleurs restent en direct. Les gardes sont tout le risque, donc ils sont purs et testés en scanAutoApply.ts: une fois par résultat de balayage, et jamais sur une couleur Le créateur a touché - y compris pour un balayage ultérieur d'un site différent. Ici également : - "Quic c'est pour" est absent entièrement, en tête incluse, jusqu'à ce qu'il y ait quelque chose qu'il y a à répondre. Il rendait une carte vide avant qu'un type ne soit cueillis, et encore une fois pour des modèles qui règlent eux-mêmes chaque question de conformité. - L'aperçu en direct montre le logo FULL, en haut à gauche de la zone de contenu au-dessus de la simulacre de texte, où un écran de connexion le met. La barre au-dessus est la navigation la barre et affiche la marque et les deux fentes sont faciles à mélanger, donc la prévisualisation est le seul endroit où un créateur peut dire lequel ils ont rempli. - "Logo compact" est "Logo simple" partout où il est lu, ici et dans le Getting Premier magicien. Les identificateurs internes sont laissés seuls. - "Nom court" est "Nom d'organisation (version abrégée)". - Le site web dit clairement que vous n'en avez pas besoin, plutôt que de quitter l'absence d'un astérisque rouge pour porter le message.
· kamo-internal
Un écran d'accueil par type d'organe
Un modèle de sécurité indique maintenant où chacun de ses trois membres frappe les terres lorsqu'ils ouvert "/". Deux valeurs: HOME-SCREEN-DEFAULT est le pavé de lancement que tout le monde a toujours a, et a NÉCÉGANT-ORG-OWNERSHIP ne le retienne pas jusqu'à ce que ce membre possède un l'organisation de leur propre ''/' va à /-work/créate instead, et le Lien réseau d'organisation quitte la barre supérieure jusqu'à ce qu'ils en aient une. Trois colonnes au lieu d'une, en miroir APPLIES-TO-MEMBERS / TEAM-MEMBERS / Les propriétaires, parce que le même modèle veut régulièrement un membre clair poussé dans créer leur propre organisation pendant que les membres et les propriétaires de son équipe vont au travail. La règle est pure et testée dans app/lib/homeScreenGate.ts: quelle colonne s'applique, et ce qui compte comme étant propriétaire d'une organisation (un propriétaire de l'organisme qu'elle est déjà à l'intérieur n'a pas créé un - la même exclusion que la première revendication fait). Il échoue OUVERT à chaque étape. Seule la chaîne exacte ferme la porte; une colonne nulle, un Valeur non reconnue, un modèle appliqué échoué et un ma réseau inaccessible tout lire comme "non", parce que retirer l'écran de la maison de quelqu'un sur la force de une demande qui n'a pas répondu n'est pas quelque chose à faire. Un contexte, monté au-dessus des navs et de la page, plutôt que le crochet dans les deux Lieux: NavTop et le pavé de lancement ont besoin de la même réponse à chaque page load, et Deux exemplaires coûteraient deux allers-retours et ne seraient pas d'accord pour la longueur de l'un d'entre eux. Le pas de tir ne l'attend pas délibérément - tenant le domicile de chaque membre page derrière un modèle /applied-fook pour épargner une poignée d'entre eux un bref flash est le mauvais commerce.
· kamo-internal
Créer monorg sans org devient un widget en trois étapes
Le widget a intégré l'ensemble de CreateOrgForm et cinq sections, la marque avant-première, le mètre de préparation - qui est d'environ 1 400px à l'intérieur d'une vitre d'environ 756px. Les rangées de HomeGrid sont minmax (unité, automobile), et que « automatique» est une soupape de sécurité plutôt qu'un plafond, donc une vitre dont la teneur ne peut pas se rétrécir croît de la ligne: "widget" rendu un long formulaire en bas de la page. C'est maintenant le chemin rapide qu'il a toujours été décrit comme. Trois étapes: type, nom et adresser, examiner et ne demander que les champs qui bloquent réellement un création et un envoi Tout le reste exactement ce qui est de WizardFormData l'a toujours envoyé pour un créateur qui qui ont sauté ces mesures. L'image de marque, les applications et la conformité sont terminées par la suite dans le New org's Getting Started wizard. /network/create est inchangé et demande toujours Tout cela en premier. L'étape de type est une RECHERCHE, pas une grille de carte. Dans la disposition dense du widget, la grille est une carte par rangée, donc un locataire avec trente types de succursales est de dix-huit cents pixels de cartes - l'étirement, encore une fois, et il s'aggrave au fur et à mesure que la plate-forme grandit. La recherche fait de l'étape une hauteur fixe à quatre types ou trois cents. Ici également: - WidgetFrame prend un maxHeightPx optionnel, et ce widget passe le sien paneHeightPx (demifRows), donc la vitre est la taille que le membre lui a donnée et fait défiler plutôt que de croître. Facultatif, donc aucun autre widget ne change de comportement. WidgetComponentProps gagne la moitié des rouleaux pour rendre cela possible. - L'analyseur de l'analyseur indique maintenant KamoCRM.com/o/alias sur les deux surfaces qui montrent par l'intermédiaire d'un assistant au lieu de chacun de construire la corde elle-même. D'AFFICHAGE SEULEMENT - routage est par nom d'hôte et il n'y a pas /o/ route, donc l'espace de travailUrl et /api/org/courant sont délibérément intacts et un lancement continue de s'abattre interne.. Un domaine personnalisé se manifeste toujours comme lui-même. - Le transfert/système de branche/fréquences et son passage d'analyse à un module partagé et crochet, puisque les deux types-cueilleurs en ont besoin et il porte aussi les parents contexte sous-domain-branche. Qui règle une duplication en temps réel: OrgTypePicker construit BranchTypeDatas deux fois et les deux exemplaires ont déjà dérivé sur la coercition de la structure. - l'espace de travailSord" se déplace de CreateOrgForm afin que le widget puisse construire un espace de travail un lien sans importer l'intégralité du formulaire de page. - next/link for the "open the full page jump". check-client-navigation manquée l'ancre brute parce que son regex a besoin de 'a et href sur une ligne. Gardes, tsc et 4 039 tests verts; les touches de dictionnaire pousséent en premier.
· kamo-internal
Carte de démarrage sur la page de destination Paramètres
Ajoute une carte de groupe essentielle reliant/réglage/souzard, en faisant correspondre le makeCard idiome utilisé par ses frères et sœurs. Les clés du dictionnaire déjà poussées -
· kamo-internal
Un rapport d'ENE ENVOYER sur le formulaire de rapport
Alignement à droite sur le "Que faites-vous rapporter?", à chaque fois que la fenêtre s'ouvre - il commence une session sur une machine tenant les justificatifs d'identité de cluster, et un changer qui se souvient de sa dernière position finirait par envoyer quelque chose que personne destinés à envoyer. Soumettre avec elle la main, le rapport immédiatement: En cours, et lu par l'opérateur qui l'a envoyé. Dessiné uniquement pour un détenteur de MANAGE-SYSTEM-BUGS, lu à partir du serveur résolu PlateformeRightsContexte et checkRight est le rachis des droits TENANT et ne peut pas répondre pour une plate-forme droit, donc demander qu'il ait caché le commutateur de tous administrateur de plate-forme. C'est chromé dans les deux cas : le point de terminaison de SecurityService se situe Dans un niveau de classe «RequirePlatformRight et refuse n'importe qui d'autre avec un 403. La demande porte un bogue id et RIEN AILLE. Le formulaire n'a pas de boîte à caviardage, non un sélecteur de modèle et aucun sélecteur de captures d'écran, de sorte que le serveur les choisit tous; assembler une charge utile aurait mis ces choix dans le navigateur, où le Un membre qui détient la droite pourrait les éditer. Le transfert court après les téléchargements, pas à côté d'eux - l'expédition se lit comme suit: quel que soit le montant qui est joint au moment où il est organisé, et une session commencée à prendre à l'avance serait travailler à partir d'un demi-rapport. Une expédition qui échoue continue d'appliquer son statut, de sorte que Le rapport est en cours d'avancement au moment où le bouton est à nouveau enfoncé et un journaliste peut seulement éditer un seul qui est encore nouveau: la fenêtre se souvient de ce qu'elle a écrit en dernier et saute la ré-épargne redondante, ou l'essai indiquerait qu'un rapport sauvegardé pourrait ne pas être sauvés et ne jamais tenter de nouveau ce qui a réellement échoué.
· SecurityService
Envoyer immédiatement à AI le formulaire de rapport
Un titulaire de MANAGE-SYSTEM-BUGS obtient un passage à l'aide de l'allumage du rapport Bug et en soumettant le rapport en main une session sans la Triage dialogue entre les deux. Le nouveau critère d'évaluation prend PAS de CORPS, et c'est le point. Le formulaire n'a pas de formulaire rapide boite, pas de sélecteur de modèle et pas de sélecteur de capture d'écran, donc l'instruction, le modèle, l'effort, les captures d'écran et le statut sont chacun d'entre eux choisis ici. un appelant devant la porte ne peut pas exprimer quoi que ce dialogue ne puisse pas, ce qui fait l'interrupteur étant strictement plus étroit que la surface pour laquelle il se trouve. Il va alors par expédition() inchangé, de sorte que la vilepeur des gaz, la ligne d'audit écrite avant le L'appel réseau, et le contrôle de la capture d'écran sont les mêmes, pas une seconde copie à suivre pour rester en marche. Garantie par le niveau de classe et le dialogue S'assied déjà. La console cache le changement de tout le monde, mais que est chromé: un rapport soumis avec le drapeau par un membre sans le droit est refusé avec un 403 ici et n'a pas de session. "Déjà vu" est un fait par membre et ne peut pas être écrit pour tout le monde PlatformRightsResolver répond "ce membre le tient-il", jamais "qui le tient". Donc la lecture est enregistrée pour l'opérateur qui a demandé l'expédition, avant le l'appel réseau plutôt qu'après (il peut prendre deux minutes et il peut échouer), et IN-PROGRESS est ce qui emporte le rapport sur le badge NEW de chaque autre gestionnaire.
· kamo-internal
Entrer et commencer Configuration Wizard au /settings/wizard
Transforme les neuf marches d'ordinaux déplacés en un éditeur sur l'organisation Un membre est déjà signé. Chaque étape enseignait maintenant sa valeur d'origestion vivante données (useOrgContext, GET/api/security/org/-id-, /api/security/features, ou useAppliedModel le cas échéant) et sauve du point d'extrémité qui est déjà propriétaire que le réglage sur "Sauvegarder et continuer"; "Skip this step" enregistre les progrès sans écrire. - orgSettingsSave.ts: types de charges utiles par étape (Entrées de paiement) et a saveEngins (clé, orgId, valeur) dispatch, typé sans "jamais"/- n'importe quel". - orgDetails.ts: analyse commune pour les champs d'orge le théming mince La classe d'organisation ne porte pas de contact (contact, étiquettes, description, etc.). - wizardSteps.tsx / StepRail.tsx / page.tsx: la table des pas, le rail cliquable, et le réservoir (BrandScanProvider, inerte pendant les sauvegardes). - IdentitéPassez des chutes les contrôles, c'est le cadre de domaine/le chef d'étagère et le territoire de l'étiquetage maintenant. - Contextes Étapes des chenilles existantes et nouvelles slots ensemble, depuis /domagérines/engagement remplace l'ensemble de la commande et de l'engagement uniquement de nouveaux les fichiers auraient supprimé le diaporama existant d'une organisation. - complianceWizard.ts: get getComplianceStepUi paramètre à la cinq champs qu'il lit en fait, donc l'étape de Conformité peut l'appeler avec useAppliedModel est un système de création de BranchTypeData. - api.ts: construction exportéeCustomLabels pour réutilisation par l'économiseur d'étiquettes.
· kamo-internal
Le héros /copilot et les deux codes de balayage portent également la marque caméléon.
étaient les deux derniers sites, et ni l'un ni l'autre n'ont pu prendre le nouveau src inchangé, parce que l'illustration est une silhouette transparente 127x102 où la trame était un carré opaque. CopilotHero. "objectFit: cover" arracher le museau des deux côtés du carré carrelé, de sorte que la marque est «contenir» à l’intérieur d’une enveloppe encastrée. la boîte de rembourrage, de sorte que l'encart ne peut pas vivre sur la plaque elle-même. La plaque gagne également un remplissage translucide: il était utilisé pour être l'icône, et un non rempli quitte la frontière et l'ombre qui n' trace rien. QrFrame, les deux codes. Deux corrections: - La marque est blanche et un code QR est imprimé sur blanc. Comme il était expédié, il était un Logo invisible assis dans un trou tiré du code. « luminosité(0) sur le L'image émise le pousse au noir et laisse les knock-outs transparents. Il a à être CSS et imageSettings render a 'image href', et un SVG externe référencé Il en est ainsi un document isolé qui n'hérite d'aucune couleur. - 48x39, pas 48x48. qrcode.react durs preserveAspectRatio-"une" sur celui-ci élément, donc la boîte est le rapport d'aspect et un carré a écrasé la marque. Le Une boîte plus étroite rétrécit également le trou excavé à moins de 2,9 % du code, sous 3,5 %. c'était avant et loin à l'intérieur du niveau M que peut perdre et encore scanner. Vérifié en rendant QRCodeSVG avec ces accessoires exacts et en le traître: la marque lit clairement au centre et l'excavation efface le modèle de non-récipteur. Les deux codes, pas seulement Install - ils sont un cadre partagé sur une plaque blanche partagée, et les propres documents de QrFrame disent de résister au style à l'un ou l'autre site d'appel individuellement.
· kamo-internal
Échanger la marque de l'application mobile pour le SVG caméléon dans le rail et à la maison
matrassée. Les deux dessinent maintenant l'œuvre de KamoMobileApp comme vecteur. Vérifié sous le nom de SVG parce que c'est ce que la marque est: une seule silhouette blanche avec des knock-outs transparents. Passé par le svgo à la précision 2 décimale d'abord, qui est perte pour la géométrie de cette trace mais prend le fichier de 675 KB à 106 KB (- 23 KB sur le fil une fois comprimé) - l'exportation transportait six décimales sur chacune des Séblage de traces de 5 000 dollars. Deux choses NE NE circulent PAS de la trame : - La boîte. La viewBox est de 127x102, de sorte qu'une largeur carrée/hauteur l'écrase. Chacun des les trois sites d'appels reçoivent une boîte de 127:102 dimension pour maintenir la hauteur optique du glyphe où étaient les PNG rembourrés. - Optimisation suivante/image. « non optimisé » sur les trois: /-next/image ne peut pas reéchantillonner vecteur, sans lui la demande est un aller-retour qui remet les mêmes octets. CopilotHero et le centre QR utilisent toujours icon.png à leurs propres tailles; la trame reste.
· kamo-internal
Créer mon widget sans org
Expédie la même CreateOrgForm la page /network/créate rend, dans son La disposition du widget, en tant que widget home-launchpad (org.create) gated on CREATE-FREE-ORG-WIDGET. Enregistré dernier: il s'agit d'une invitation permanente, pas une vitre critique. Pas de porte - la création d'une organisation n'est pas une application, et les cinq droits sont l'ensemble de la décision. Mirime également CREATE-FREE-ORG-WIDGET et ses quatre politiques en faveur des enfants la hiérarchie des droits TS entretenues à la main (205 - 210 arêtes), qui widgetPolicy.test.ts a besoin d'exigences de cinq formes de droite pour chaque widget enregistré.
· KlusterServices
Ouvrir l'envoi à AI dans un onglet de session VS Code, pas une fenêtre Konsole
Une dispatche commence maintenant une session BACKGROUND et tend le code VS à son id de session, au lieu d'exécuter le CLI dans une fenêtre terminale: Passer l'invite à l'URI à la place est un piège: l'extension appelle setInputText et ne jamais envoyer, et synthétiser un retour est impossible alors que le Le casier KDE maintient son grappin en X. Une session qui est déjà à juste titre n'a plus rien de se soumettre, c'est ce qui fait que le transfert fonctionne avec personne à la machine. Quatre choses mesurées plutôt que raisonnées: - cwd doit être realpath (workspaceFolders[0)), PAS le parent commun utilisé avant. L'hôte du panneau s'enracine lui-même au premier dossier et ne répertorie que le les sessions qu'il y trouve, donc une session commencée n'importe où ailleurs est invisible pour la fenêtre qu'il est censé ouvrir dans - le handoff ouvre une languette vide. L'autre les dépôts restent accessibles par --add-dir à la place. - -add-dir est VARIADIC et mangeait l'invite, donc les séances ont été mises en place avec un compositeur vide. La liste d'annuaires va maintenant d'abord, fermée par les drapeaux après. - Un lancement ne peut pas imprimer une poignée, ou une action marquée "(inid - envoyer une invite au démarrage)". Les deux signifient que le message n'est jamais arrivé, donc les deux sont arrêtés et rejugés plutôt que l'ouverture devant l'opérateur sous la forme d'une languette vide. - Le panel ne peut pas être propriétaire d'un agent de fond, et un fin un reste résident, de sorte que un observateur l'arrête une fois le travail terminé. La réouverture de l'onglet reprend ensuite le normalement, toute la conversation est intacte. La confirmation est maintenant la transcription adressée par l'identifiant de la session, qui enlève la Recherche à aiguilles en échappées par JSON qui a signalé la livraison d'expéditions comme des échecs.
· kamo-internal
/network/créate est une page; les douze étapes passent à /settings/wizard
CreateOrgForm.tsx est un composant avec deux mises en page (page/widget), construit à partir des Task 7/8 CreateOrgFields, field groups et OrgBrandPreview. page.tsx n'est plus que le modèle de champ, un obus à pleine largeur autour d'elle. Les fichiers de neuf étapes de l'ancien magicien plus Stepper/stepIcons déplacent à app/settings/wizard, où la tâche 12 les rejoigne dans la configuration de mise en route Wizard; BranchTypeStep, MemberInfoStep, ReviewStep, StepNavigation, CancelModal et the sessionSingledsWizardForm hook est purement et simplement retiré, puisqu'une création d'une page a aucune mesure de navigation entre les deux et rien n'a été laissé pour sauver un projet de texte. Chaque importation relative dans les fichiers déplacés qui pointaient ../ui/, ../brandscan/, .././types, .././validation, ../../appSelections, ../../complianceWizard or ././././h./-s/- est réécrit à la forme absolue "/app/network/..., puisque les composants/ui et les composants/marquencscans stay mettre (les composants de champ survivants les utilisent toujours) et ne résoudre qu'un répertoire à partir du Ancien emplacement des pas. hooks/useWizardForm.ts est paré plutôt que supprimé: freshWizardData de it et doit rester vert et non édité, donc le fichier conserve cette exportation (et l'INIAL-DATA dont elle a besoin) et laisse tomber tout ce qui n'a plus d'appelant. Deux corrections d'exactitude trouvées dans l'examen avant de câbler les composants de champ: - CreateOrgForm's onChange est maintenant referlistement stable à travers les rendus (requestScan read through a ref au lieu d'une dépendance useCallback) - OrgTypePicker et IdentityFields chaque liste surChange dans un réseau de dépendances d'effet d'utilisation, et les changements d'identité de la demandeScan sur chaque marque achevée scanner, qui aurait reflué sur les deux effets sur chaque balayage plutôt que sur les changements réels d'entrée. - Dropzone prend un support réellement désactivé (tabIndex-1, manipulateurs gardés, natif désactivé dans son dossier un bouton d'entrée et de repli) au lieu de compter uniquement sur un pointeur-événement-none d'un ancêtre, qui ne fait rien pour l'activation du clavier; câblé à travers les fentes de logo de BrandFields, donc une forme verrouillée En fait, les utilisateurs du clavier se verrouille aussi. /network/create?fresh-1 devient clair /network/créate dans FirstOrgCta.tsx et network/page.tsx: le formulaire d'une page commence à partir de l'initialeCreateOrgFields() sur chaque monture au lieu de restaurer un sessionStorage, donc le param n'a plus rien à faire.
· kamo-internal
Groupes de terrain réutilisables et aperçu de la marque en direct
Extraire les entrées de BranchTypeStep, BasicsStep, LogoStep, ColorsStep, AppsStep et AgeRestrictionsStep dans cinq composantes de terrain contrôlées (OrgTypePicker, IdentityFields, BrandFields, AppSwitches, ComplianceFields) que les deux /network/create-as-one-page et le widget de lance peuvent rendre, laisser le cadrage en marche (en-tête, bouton de saut, navigation) derrière. Ajouts OrgBrandPreview, une miniature de marque live pilotée par previewPalette(), qui Scelle-carte toute couleur auteure du créateur avant qu'elle n'atteigne un style attribut et retombe aux variables CSS de la plate-forme. IdentityFields et OrgTypePicker ont été ajustés à mi-tâche pour la - atterrissage supplémentaire en parallèle: OrgTypePicker capture désormais la sous-domaine de l'orge parent au même titre que le type de branche, et IdentityFields consulte webAliasPossible() au lieu de le re-dernier, offrant le chemin de course de criblage web Ce n'est que lorsqu'elle est réellement disponible. Tâche 8 du plan.
· kamo-internal
Bouton de traitement de configuration de démarrage avec une frontière d'attention
Ajoute le point d'entrée du rampe de lancement dans l'assistant de configuration: un propriétaire, à droits protégés pilule qui dit "Getting Started Configuration Wizard (x/9 step complete)", placée d'abord dans la rangée de pilule avant My Widgets. Rend nul jusqu'au capteur - droit la porte non finie se résout, de sorte qu'il ne clignote jamais pour un propriétaire dont l'organisation déjà achevée. La frontière est porteuse d'un gradient de confort continu croupière plus une ombre de boîte à respiration dans la propre organisation - colorier-primé, et arrête d'animer (tout en restant visiblement deux tonalités) sous-prépare-réduite-mouvement.
· kamo-internal
Getting Started magicizard step model et client
Ajoute le modèle de l'étape côté client (app/lib/orgSetupWizard.ts), une API fine client pour GET/PUT/DELETE /api/security/org-setup-wizard (app/lib/orgSetupWizardApi.ts), et l'utilisationOrgSetupWizard crochet que le La page de l'assistant et le bouton du pavé de lancement s'appuieront tous les deux. Vœurs de la logique pure dans app/lib plutôt que à côté de la page parce que app/settings/- et app/hooks/- ne sont pas dans l'enchiente de l'auto-letti la liste. isWizardFinished est décidé uniquement par la selure du serveurAt, non en comptant les étapes terminées, donc le bouton du pavé de lancement reste parti pour un l'organisation qui a déjà pris fin même après l'augmentation de la liste des étapes. normalizeSumary est total par rapport à l'entrée inconnue et drops pas------------------------------------------------ UtilisorgSetupWizard garde «loaded» séparé de Le bouton du lanceur ne rend rien jusqu'à la vraie réponse est connue.
· SecurityService
Ajouter le service de progression et les critères d'évaluation de l'assistant Getting Started
GET/PUT/DELETE sous /api/sécurité/org-setup-wizard track, dont les neuf Mise en route des étapes qu'une organisation a achevé. Une lecture ne crée jamais une ligne, et finishedA est un ensemble de serrure stocké une fois lorsque la dernière étape exceptionnelle atterrit - il survit à la fois de l'achèvement d'une étape et de la liste des étapes qui se creusent plus tard, de sorte que l'organisation achevée Le bouton de lancement ne réapparaît jamais.
· kamo-internal
Le panneau maximisé zoome dans la conversation que vous avez choisie
Changer les conversations dans la vue maximisée était un nudge de 8px et un évanouissement de 180 ms. assez près de rien que la vitre ressemblait à elle simplement repeinte. Il est maintenant se lit comme arrivant quelque part: la conversation entrante passe de 6 % de moins de taille avec une courte montée et des terres dans la vitre, opaques tôt donc il est lisible pendant qu'il est toujours en mouvement, sur une courbe qui passe la majeure partie de son voyage vers l'avant puis s'installe. La forme est dictée par la pile z plutôt que choisie. Cliquer sur une ligne de navigation focaliser la nouvelle fenêtre, de sorte que l'entrée est peinte OVER la sortie, et qui décide les deux moitiés: - L'arrivée peut pousser dans la vitre mais jamais au-delà. La coque maximisée est un élément fixe de la taille de la fenêtre et rien ici ne fourre entre le document débordement, donc une arrivée qui dépasse 1 peint à l'extérieur de la fenêtre. - La sortie tient en taille réelle et ne s'estompe que. Alors que la mise à zéro est toujours sous-échelle, il ne couvre pas la vitre et la sortie est la seule chose derrière C'est donc rétrécissant que nous ouvriraient aussi un bord de fond autour d'une fenêtre MAXIM-ÉLÉ un scintillement, pas la profondeur. Il est libre de s'estomper parce que l'arrivée est opaque dessus bien avant qu'il ne soit parti. Cette règle de couverture est arithmétique, pas de goût, donc c'est un test: l'onde de sortie doit au-delà des entrées. Deux autres pin les contraintes qui sont invisibles jusqu'à ce qu'ils casser - l'arrivée ne dépasse jamais 1, et elle finit à l'intérieur de la phase de swap, qui Retire ce rôle et, autrement, le rebloquerait en plein vol. Le mouvement réduit maintient le Un berceau en couche. Corrige d'ailleurs une chose plus petite: l'arrivée était de 200 ms à l'intérieur d'une phase de 180 ms, Il a donc été remis à la cible de peuplement 20 ms avant qu'il ne soit terminé.
· kamo-internal
Widgets à trois colonnes et tailles minimales par widget
Élargir WidgetWidth à 1 x 2 x 3 x ' 'plein' et laissez une WidgetDefinition declare minWidth/minHeight. widgetMinSize (définition) convertit qui dans un plancher de taille PaneS (ou nul lorsque rien n'est déclaré), donnant les deux a des axes a un plancher même lorsque un seul est déclaré - l'axe non déclaré les planchers à sa propre taille par défaut. Fils qui ressortent du registre par l'intermédiaire de tous les consommateurs qui se taille ou redimensionne un volet: utilisationPlagePnes de tailleOf/setSize, PorteChrome's drag and AND les chemins de redimensionnement du clavier (tous les trois appels de serrage), SortableCard, la maison Le site de rendu de widget de grille triable de page, et la disposition des paramètres de la page avant-première. La bande de widgets épinglés de page.tsx n'est pas touchée à dessein. il rend toujours au widgetDefaultSize et ne lit jamais stocké préférences, donc un défaut déclaré satisfait déjà à son propre plancher. Aucun widget dans le registre ne déclare encore la largeur 3 ou un minimum; c'est-à-dire travaux ultérieurs. Cela ne fait qu'élargir le vocabulaire et câble les machines.
· kamo-internal
Relucher un logo tracé à la main, et télécharger le fichier converti
Quatre choses sur le convertisseur de tronc à vecteur et le simple créneau de logo. «La barre de défilement sur les options de trame est trois fois plus large.» 4px était une cible difficile pour Land on, et les règles étaient uniquement en ligne, donc Firefox n'avait jamais eu un bar de style du tout. scroulebarLivre/scrollbarColor y a maintenant la même intention. «Une source qui a déjà un fond transparent est laissée seule. pour renvoyer avec joie une couleur pour un pixel transparent: une toile stocke l'alpha prémultiplié, donc Chacun d'entre eux lit en retour comme (0, 0, 0), et choisir un a raconté à l'oléoduc le fond était noir. Il est ensuite allé et a supprimé les parties sombres du logo. Cliquer sur la transparence dès maintenant le dit au lieu de cueillir. La fixation côté serveur correspondante est dans le service vectoriel. Une baguette et une brosse, chacune capable d'ajouter ou de supprimer. assez souvent pour avoir besoin de se disputer avec: un contexte qui s'est répandu dans une partie fermée de la un design, et une pièce du design qui partage la couleur de fond et l'accompagne. Le baguette prend une région entière en un seul clic; la brosse prend tout ce qui est traîné. Chaque opération se résout contre la culture d'ORIGINE, jamais la coupure actuelle. C'est ce que rend "-" possible - une fois que l'enlèvement a mis à zéro l'alpha d'une région, il n'y a plus de région à trouver, mais l'original a encore la couleur. Il rend aussi les opérations rejouables, donc le fait de ne pas supprimer un réglage après re-sauvage sans rejeter les corrections. Éditer la peinture localement pour un retour instantané; seul le résultat décanté traverse le fil, et seulement l'alpha masque, sous la forme d'un PNG gris de 8 bits de quelques centaines d'octets. "Un bouton de téléchargement à côté du simple logo", de sorte que le membre peut garder le SVG le convertisseur produits - souvent la seule copie vectorielle de leur logo que n'importe qui a, et autrement accessible uniquement à partir d'un seau, ils ne peuvent pas parcourir. L'extension vient de renifler les octets, pas le nom stocké: qui écrit chaque emplacement téléchargé sur une clé logo.svg fixe quel que soit le type, donc theme.kamocrm.com sert des octets PNG à partir d'un nom .svg pour n'importe quel org qui a établi un logo avant cela Convertisseur existait. Faché dans un blob plutôt que lié, parce qu'une origine croisée Un téléchargement est ignoré et ouvrirait le fichier au lieu de le sauvegarder.
· kamo-internal
Champ d'une page et les valeurs par défaut qui remplacent les étapes supprimées
CreateOrgFields est ce que le nouveau formulaire une page unique/réseau/créer le formulaire demande réellement pour: un type de branche, un nom, un alias, l'application commutateur et une poignée de toWizardFormData remplit tout ce que l'assistant en douze étapes utilisé pour collecter mais cette page ne montre jamais, en utilisant exactement ce que sauter chacun de ces pas utilisés pour envoyer (bindPhone/bindEmail true, contact blanc/labels, filigrane COMPANY COMPANY) donc un org créé ici est indiscernable L'un a fait le vieux chemin par quelqu'un qui n'a rempli que ce qui était nécessaire. avecBranchType maintient également parentAliasId pointé sur une option que le modèle offre effectivement (ROOT d'abord quand il est autorisé, sinon la première coutume du modèle alias) - le magicien en douze étapes a fait cela dans un effet BasicsStep le créateur Jamais vu le feu, et sans un équivalent ici créerOrgReadiness blocs pour toujours sur un champ cette page ne demande jamais à tout type de branche dont seul L'option mère est ROOT.
· kamo-shared-library
Créer des droits de widg de widg de My Free Org et des progrès de l'assistant débuté
Ajoute de la formule RoleRightType 288-292 (CREATE-FREE-ORG-WIDGET et ses quatre AJOUTES/OPTIONNELLES/ Politique REQUISE/MOTABLE pour les enfants), suspendus au-dessus de CREATE-CHILD-ORG (131). Ajouts OrgSetupWizardStep, l'enum en encoche de neuf étapes soutenant la configuration de démarrage Wizard, et - cartographier table des progrès de l'ordre de la tâche 2. Mises à jour également de la forme de taxonomie épinglée de RoleRightHierarchyTest (278/205/35/38) 283/210/36/37) : CREATE-CHILD-ORG était une racine autonome et gagne sa première enfant ici, le déplacer dans les racinesSon d'EntrentEntrents, en faisant correspondre ce fichier une convention établie pour l'enregistrement de chaque envoi de widget dans cet essai.
· kamo-internal
Taille minimale par vitre, appliquée en lecture ainsi qu'à la traînée
Fils optionnel: PanierTaille et nulle à travers la lampe PananeSize, les deux les auxiliaires de resize-delta, et les deux fonctions de lecture/écriture de préférences dans le modèle de vitre de lance pur. Compatible vers l'arrière: chaque appelant existant omet l'argument et maintient le comportement d'aujourd'hui, puisque clampPaneSize tombe Retour à l'échelle du plancher dans l'ensemble de la grille lorsque Le minimum par vitre est fourni. La surface est appliquée sur la valeur STORED de la résolutionPaneSize, pas seulement dans la valeur de STORED de la solutionPaneSize. les manutentionnaires de la traînée, donc la préférence d'un membre enregistrée avant qu'une vitre ait un minimum (ou avant qu'il ne soit relevé) est relevé en arrière en lecture.
· SecurityService
Mettre un budget en temps réel sur la resendabilité
Le critère d'évaluation n'avait aucune limite d'aucune sorte. L'écran du registre exigé avant d'autoriser son bouton de resenvoyer n'a jamais été lu ici - le le corps de demande est trois domaines de JSON et rien sur le serveur n'a cherché a charge utile - donc la commande a fermé un bouton, pas la demande, et un script Afficher immédiatement cette URL était déjà illimité. VerificationResendRateLimiter le remplace par un budget dont le serveur est propriétaire: a Rechargement des années 60 pris en tant que SET NX unique, de sorte que les répliques de course ne peuvent pas les deux win, 5/heure et 15/jour par adresse, et 20/heure par IP publique. Vérifié AVANT la recherche de l'ordre et de l'utilisateur et mise à la clé de l'adresse SUBMITTED, donc a sonder le budget des coûts, que le compte existe ou non et que le 429 ne le soit pas devenir l'oracle de la présence de compte que le critère d'évaluation est prudent "si ce la réponse existe à l'égard du compte. La fenêtre IP est sautée pour une adresse non publique: indéterminé ne doit pas s'effondrer en une clé partagée pour chaque déclarant. Redisparti parce que Ce service gère des répliques, et échoue à l'ouverture d'une panne de Redis. Un rejet répond 429 avec Retry-After et retryAfterSeconds, donc le l'écran peut compter contre cette horloge plutôt que deviner le sien.
· InitializerService
Créer l'assistant d'org-setup-wizard-progress pour l'assistant débutant
· kamo-internal
L'année établie est facultative et sans fin n'est pas prise en l'absence d'absent.
Rien sur le serveur ne l'exigeait - la colonne est annulable, la création parer cartographie une valeur vide à nulle, et patchOrganization ne s'applique que les clés a L'organe PUT mentionne, donc "yearEst": null est un clair délibéré. La seule porte était la validation de ce magicienBasics, qui a bloqué l'étape entière des Principes d'évaluation jusqu'à un an. a été cueillie. Beaucoup de vrais clients n'ont pas de réponse (une nouvelle LLC, une division filée au milieu de l'année, quiconque ne sait tout simplement pas), donc la porte vient de leur apprendre à inventer un. Larguez-le; le champ conserve son étiquette sans astérisque et gagne la même chose "Facultatif." FieldHint tous les autres champs optionnels de l'étape ont déjà. Corre la raison pour laquelle personne n'a remarqué que le champ était déjà nul fin à la fin: org DTO parsed yearEst avec un narre et AVANT l'option de la force, de sorte que le nombre (noll) 0 et chaque organisme sans L'année est arrivée comme fondée l'année zéro. Il est resté invisible parce que l'affichage Les sites gardent la vérité et 0 est faussant - il aurait fait surface comme "Est. 0" à le premier site qui a vérifié - null - à la place. Prétraitement nul et "" retour à non défini, normaliser de la même manière dans l'Organisation. les DTO de réseau/thème pour admettre la nulle qui arrive effectivement. Les deux sites d'exposition qui ont utilisé le site de l'adresse suivante: falsy-et render est ce qui aurait peint un 0 nu dans le tiroir. Le les paramètres forment maintenant acheminer l'épargne via parseYearEst, donc une case vierge s'écoule la valeur à ce sujet et non pas en passant par JSON.stringify à transformer NaN en nul.
· kamo-internal
Montrez à un membre uniquement les onglets qui sont à leur voir
Trois revêtements de composition de membres étaient ouverts aux personnes, ils ne peuvent rien dire. pour. Chaque porte est sur le TYPE MEMBRE ou les applications de l'organisation, jamais sur checkRight checkRetours vrais pour chaque droit en mode dieu actif, et la page canViewAutre membreComptabilise des droits qui n'ont rien à voir avec Objet, parmi lesquels). obtenirMemberType() par défaut de "MEMBER", de sorte que chacun d'entre eux échoue fermé sur une session dont le type n'a pas encore résolu. Plans et facturation: membres de l'équipe uniquement. Le plan, les abonnements, les factures, les modes de paiement et le siège appartiennent tous à l'entreprise; un membre clair n'a d'équivalent en compte, donc l'onglet leur montrait l'argent de l'entreprise. Relâchés sur le VUE, donc un propriétaire qui ouvre la page de quelqu'un d'autre garde l'administration chemin. La carte /settings est fermée de la même manière - une carte qui ouvre une onglet qui ne rendra pas la carte, c'est pire que pas de carte, exactement comme les Commissions à côté. Sonnettes et Alertes: sur la même condition que l'icône du téléphone de NavTop, qui est maintenant une fonction (hasPhoneAccess) plutôt que deux exemplaires de la même . Le sous-tablet n'est rien d'autre que la configuration du téléphone que l'icône s'ouvre quelle sonnerie, quel appareil, combien fort - donc un membre sans téléphone était des contrôles remis qui ne peuvent pas changer quoi que ce soit qu'ils entendront jamais. Audio, vidéo et les sons d'événements ne sont pas modifiés: ce sont les appareils de réunion et les siens de l'application les sons de notification, ce que chaque membre a. Juridique et conformité: les membres de l'équipe, et un organisme avec les applications Docs et HR. Plutôt que d'intégrer les nouvelles conditions, elles se replient sur legalBadgeAppliesTo, dont le bouton de signature de NavTop et le fournisseur de comptage derrière son badge déjà Part. Ce bouton est un lien droit vers cet onglet, donc une quatrième copie du l'état lui permettrait de vivre sa propre destination et de laisser tomber le membre sur leur profil sans explication; le fournisseur se tassement dans la même condition au lieu d'avoir un abonnement STOMP et un vote de 60 secondes pour un compte qui est 0 par construction.

Votre univers vous attend.
Commencez gratuitement en quelques minutes. Ajoutez des produits quand vous êtes prêt. Pas de migration, pas de nouvelles connexions.
Gratuit pour toujours — aucune carte de crédit requise