Changelog
Ce qui est nouveau.
Chaque amélioration apportée à la plateforme, à mesure qu'elle est livrée.
· kamo-shared-library
Page et filtrer les devis d'un compte dans la base de données
Un compte rendu a besoin de chaque devis sur toutes ses pistes. Chargement pour rendre une page dégrade chaque mois le compte est utilisé, et tout total indiqué ne couvrirait que ce qui a été récupéré - donc la prise de paging, le filtrage et le tri se produisent en SQL. La requête est native parce que la citation ne contient qu'un leadId souple sans association à rejoindre à travers; il rejoint lead.uid et commerce-quotes.lead-id et des champs d'application sur leads.account-uid. Tirer les pistes du compte dans une liste IN ne survivrait pas à un grand livre d'affaires. Chaque filtre est un prédicat à protection nulle, donc une requête sert la grille non filtrée et n'importe quel combinaison de filtres plutôt que d'une méthode par permutation. Les clés de tri sont listées sous la liste d'autorisation: la valeur atteint un ordre d'origine native, donc l'acceptation d'un le nom de champ arbitraire du client serait un point d'injection. La projection de la liste a également obtenu les gains envoyésAvec, acceptéAt, la version et l'option/la ligne compte une vue d'ensemble est lue pour "quelle est-elle depuis longtemps sortie, a-t-elle atterri", ce qui a été le précédent. les domaines ne pouvaient pas répondre.
· kamo-signer-monorepo
Montrer l'agent affecté sur la copie du client
Correspond à l'avant-première du personnel: le papier à en-tête nomme l'org, ce nom la personne à demander.
· kamo-internal
Montrez l'agent affecté sur l'aperçu
Un panneau "Votre contact" au-dessus du pied de page - nom, titre, téléphone et courrier électronique - donc le client Sait qui s'interroger sur le prix. Absent entièrement lorsque le plomb n'est pas attribué.
· SecurityService
Résoudre l'agent aux côtés du client, à partir d'une seule recherche de haut niveau
Les deux blocs sortent de la même sonde, de sorte que les contrôleurs vont chercher une fois et dérivent chacun plutôt que de frapper le service deux fois par rendu. Org-sesque dans les deux le champ d'application provient de la propre organisation du lien de partage.
· kamo-shared-library
Nom de l'agent affecté par le plomb sur le document
L'en-tête identifie l'ordre, mais un client ayant une question sur les besoins de prix la personne qui est propriétaire de la relation. La citation porte maintenant l'agent assigné à l'avance nom, titre du poste, courrier électronique de travail et téléphone de travail. Coordonnées de travail uniquement: un devis porte l'identité professionnelle de l'agent, jamais un Un numéro personnel qui se trouve sur le dossier de leur membre. Le titre d'emploi préfère jobTitleOfficial, qui est ce que l'orge a choisi d'imprimer, avant le lien JobTitle. Une du plomb non attribuée, ou un agent sans rien enregistré, ne donne aucun bloc plutôt qu'un "Votre contact" en direction de l'espace vide. La résolution du nom réutilise - le même chemin LeadContrôleur les utilisations déjà pour l'agent de prêt affecté, de sorte que le devis nomme l'agent exactement comme le reste de l'avis de départ.
· kamo-internal
Réaffecter l'agent à la possibilité d'un agent
Le dialogue de l'approbateur gagne un picker d'agent, tiré du même pool le backend valide contre. La colonne Agent de la grille montre maintenant qui HOLDS l'opportunité, avec une légende jaune-autorisée "Arrêté de ..." alors que ce n'est plus l'agent qui Le demandeur reste au procès-verbal et dans l'histoire dans les deux cas. La commande en tête-à-tête suit également le support. Il éteignait le demandeur, qui, après une réaffectation, aurait proposé le dialogue d'extension à l'agent qui ne la possède plus et le cachette de celui qui le fait - et les portes du backend ce point d'extrémité sur le titulaire, de sorte que l'offre aurait pris fin dans un 403.
· SecurityService
Réaffecter l'agent de détention et envoyer un courriel à tous les personnes qu'il affecte
Un approbateur peut maintenant offrir une occasion à un autre agent. Le demandeur est Jamais réécrit et appliquer PrimaryAgent enregistre le mouvement comme sa propre ligne d'histoire avec les deux noms, donc six mois plus tard, le compte-rendu montre qu'il a agi plutôt que lire comme si le nouvel agent l'avait demandé. Propriété de l'extension, en-tête principal la commande et le masque de détail suivent tous le support maintenant; le filtre "Agent" correspond à la correspondance SEULE fin d'une réaffectation, parce que le cacher à l'agent qui l'a trouvé et de l'agent qui le détient sont à la fois de mauvaises réponses. Neuf notifications couvrent le cycle de vie. Les demandes de demande et de prorogation sont allées toute personne qui peut les décider - les deux droits de décision, puisqu'un membre qui ne peut que Le refus, autrement, n'apprendreait jamais qu'il existe une demande de refus. Décisions et éditions au porteur, au demandeur d'origine lorsque cela diffère, et à chaque collègue sur une commission split; une édition envoie en outre à qui il a été déplacé, parce que la perte un partage de commission silencieusement, c'est exactement ce à quoi servent ces courriels. Deux choses sont porteuses dans la façon dont l'envoi est séquencé: - Résolution et rendu se produisent EAGERLY, à l'intérieur de la transaction de l'appelant, tandis que l'entité conserve toujours les valeurs dont il s'agit par e-mail. approuverExtension() clear les champs d'extension immédiatement après, donc une lecture ultérieure décrirait "non un temps supplémentaire" sur un courriel dont le sujet est le montant du temps accordé. - L'ENENDE attend et annonce une décision qu'un échec ultérieur roule en arrière laisserait les agents tenant un courriel pour un l'approbation qui n'a jamais eu lieu, et après l'achèvement plutôt que après l'engagement signifie la connexion de la base de données est libérée avant le démarrage du HTTP sortant. Les valeurs de la table détaillée s'échappent au point où elles entrent dans la carte: les noms des membres sont texte libre d'englobèg, le tableau est injecté sous forme de HTML brut, et le moteur s'échappe Rien. Un éditeur qui ne change rien n'envoie pas de courrier, et une réservation de PENDING n'envoie pas de "mise à jour" - personne n'a encore été informé qu'il existe. 60 essais.
· EmailService
Échantillons de prévisualisation des neuf notifications d'opportunité
Sans bras ici, l'éditeur admin Email Templates rend chaque espace réservé blanc, donc n'importe qui personnaliser ces neuf serait d'éditer un squelette vide. Un bras pour les neuf: ils partagent une variable fixée par conception, donc une seule carte d'échantillon rend chacun d'eux fidèlement. Carte.ofEntries parce que map.of plafonnes à dix les paires et l'ensemble est plus grand que cela.
· InitializerService
Agent primaire résignable sur une possibilité réservée
PRIMARY-AGENT-MEMBER-ID est celui qui en offre maintenant; DEMANDE - BY-MEMBER-ID est laissé intact pour toujours. Annuleux sans remblai à l'exclusion des moyens nuls "jamais réaffecté", et la copie du demandeur dans les rangées existantes détruirait cette distinction sur chaque réserve qui est antérieure à la colonne. Appliqué contre la production le 2026-08-04; colonne et indice vérifiés présents.
· kamo-shared-library
Agent primaire résignable et neuf modèles de notification
Un ordonnateur peut offrir une opportunité - et la commission avec lui - à un autre agent. Est qui le détient maintenant; jamais écrit à nouveau, parce que qui a trouvé l'accord est un fait sur le passé et il effacerait le seul enregistrement que l'agent d'origine l'a apporté. Null signifie "jamais réaffecté", qui est une déclaration différente de "réaffectée Retour à la demandeuse" - de sorte que les rangées existantes sont laissées seules plutôt que remblayées. effectiveAgentMemberId() est le titulaire, et c'est ce qui décide maintenant qui peut demander une extension et qui traite l'en-tête principal comme le propriétaire. Autrefois possibilité déménager, le demandeur d'origine est un nom dans l'histoire, et non une réclamation à ce sujet. Neuf modèles canoniques couvrent le cycle de vie: une demande ou une demande d'extension va à tous ceux qui peuvent en décider; toute approbation, tout déni, éditer, décision d'extension, l'expiration et la fermeture va à l'agent qui la détenait, l'agent qui a demandé si c'est maintenant quelqu'un d'autre, et chaque collègue d'une commission s'est séparé. Ils partagent une coquille générée de sorte que la disposition ne peut pas dériver entre eux, et un ensemble de variables pour qu'un modèle puisse référencer n'importe quoi sans un changement Java apparié - ce qui compte parce qu'une variable manquante rend comme une chaîne vide avec seulement un WARN, et expédie un courriel en lisant "réservé jusqu'à ".
· kamo-internal
Commission globale, défauts de paiement du marché et absence d'unités pré-possées
Trois changements dans la façon dont la commission est saisie. Rien n'est plus présélectionné. Pourcentage/montant et temps/récurrence commencer à désactiver sur chaque division de commission, de sorte que chacun indique son type parce que Quelqu'un l'a dit. Un "pourcentage" présélectionné est indiscernable d'un avis le choix, et la différence entre 15 % d'une vente et 15 euros est la totalité du paiement. Soumettre reste handicapé jusqu'à ce qu'une ligne commencée soit terminée. L'ordonnateur approuve désormais une commission VERT-LATAIRE - ce que l'organisation paie sur le vente à l'agent demandeur et au groupe avec lequel ils partagent, à partir duquel Les fentes par collègue sont sculptées. Il apparaît dans les dialogues d'approbation et d'édition et en tant que une colonne sur la liste réservée, et un marché peut être soumis à un défaut qui la remplit avant le remplissage. Les défauts du marché ne remplissent qu'un APPROBATION. Ensemencer un éditeur du marché laisser un rabais qui était à propos du timbre des dattes sur une commission que personne n'a accepté, et serait rendre "pas de commission" impossible à garder. Le déblocage d'un chiffre pré-rempli envoie maintenant un explicitement clairement la Commission, suivie de ce que la forme est OUVERTURE plutôt que ce qui est stocké - sinon la suppression d'une valeur par défaut pré-rempli n'envoie rien et le Serveur le met utilement en retour direct. En outre, un défaut du marché à moitié rempli bloque maintenant l'épargne au lieu d'être abandonné et signalé comme succès; la colonne de la commission n'invente plus "un temps" lorsque pas de cadence n'a été fixée; les montants fractionnés dans l'infoilde utilisent le même formatage monétaire que la colonne; et Add Market efface les champs de cotation dont il héritait de la dernière édité au marché.
· SecurityService
Accepter une commission globale à l'approbation, ensemencée du marché
L'ordonnateur indique désormais ce que l'organisation paie sur la vente à la demande agent et leur groupe. Omettre son approbation et le défaut de paiement du marché de l'avance s'applique c'est ce qui fait que le marché fixe un défaut de paiement plutôt qu'une suggestion: UI honores. La Commission met en place les trois domaines et ne les fusionne jamais sur le plan des champs avec ce qui est stocké. La fusion semble inoffensive et n'est pas: un éditeur ne portant qu'un le type de partage changerait un stocké de 15 de 15% à quinze, re-dénommer un paiement que personne ne voulait toucher. Un défaut de marché invalide ou à demi-configuré est enregistré et ignoré plutôt que Jet de rôle. Un défaut est la commodité, pas la loi, et l'un sauvegardé par un autre chemin avec un chiffre absurde ne doit pas se transformer en une panne de marché inéventable - la L'ordonnateur peut toujours taper une commission dans, et l'approbation sans une commission est légitime. clearLa Commission est honorée avant tout, y compris la défaillance du marché: un agréeur qui supprime un chiffre pré-rempli a pris une décision, et discrètement le remettre l'inverserait. 49 tests, y compris les voies claires, le garde de fusion, et les deux cas de mauvaise défaillance.
· InitializerService
Colonnes de la Commission pour les opportunités réservées et les défauts de paiement du marché
Six colonnes annulables: la commission globale s'est mise d'accord sur une possibilité réservée, et la défaillance du marché qui le pré-remplit à l'approbation. NUMERIC(19,4) pour correspondre à la Table fractionnée - l'argent est exact la virgule ou les conflits de commission suivent. Appliqué contre la production le 2026-08-04; les six personnes en présence.
· kamo-shared-library
La commission globale sur une vente et les défaillances du marché pour celle-ci
Une occasion réservée indique maintenant ce que l'organisation paie à l'agent demandeur et le groupe qu'ils partagent avec - le pot le per-collègre Les divisions sont découpées. Un marché des plombs est en rupture avec un défaut qui le pré-remplit lorsque une autorisation est accordée. Chaque colonne est annulable sans défaut. Une réserve que personne n'a approuvé une commission convenue et un marché qui n'a pas été configuré n'a pas de défaut; écrire un zéro dans l'un ou l'autre placerait un chiffre que personne n'a choisi sur un record de paiement. Trois champs de demande n'auraient pas été suffisants. Un champ nul et nul sont la même chose après la désérialisation, et l'absence signifie déjà deux autres les choses ici - "utiliser la valeur par défaut du marché" sur approbation, "le laisser seul" sur une édition. Donc la Commission dit clairement que la Commission est levée à haute voix; sans elle, un alyseur qui supprime un La commission obtient le silence, et sur l'approbation de la valeur par défaut, ils viennent de revenir. LeadIdentity prend les défauts du marché et findIdentities JOINTSEURS GUES. Écrit comme le chemin implicite l.market.x, Hibernate émet un INNER adhérer et chaque avance sans chute du marché de la projection entièrement, qui aurait été présentée comme "Le plomb non nommé" sur exactement les lignes que personne ne regarde deux fois.
· kamo-internal
Rendu les coordonnées du client sur l'aperçu, à partir du chef de file
La suppression des champs du destinataire de la citation est restée vierge "Préparé" en blanc, parce que clientName n'est jamais venu que d'un compte lié et les devis relevés en plomb n'en ont pas. L'aperçu imprime maintenant le bloc que le serveur assemble à partir du plomb. L'entreprise s'en rend compte lorsqu'il y en a un, un devis à une entreprise est adressé à l'entreprise, avec le contact Nom sous et puis adresse, téléphone et e-mail, chacun omis lorsque le lead n'est pas le porter.
· kamo-signer-monorepo
Montrer les coordonnées du client sur la copie du client
L'entreprise dirige le bloc lorsqu'il y en a un - une citation à une entreprise est adressée à la avec le contact nommé en dessous. Matsse le personnel en prévisualise exactement.
· SecurityService
Résoudre le chef de file du destinataire pour les avis du personnel et des clients
Org-sescousé dans les deux endroits. Sur la page publique, le champ d'application vient du lien de partage propre organisation, donc un jeton ne peut jamais faire surface d'une tête appartenant à un autre locataire.
· kamo-shared-library
Mettez les détails du client sur le document, lisez la tête
Lâcher les champs du destinataire de la citation a laissé le document sans rien dire sur le client: clientName uniquement provenant d'un Compte lié, dont les devis relevés sont élevés n'en ont pas, donc "Préparé pour" en blanc imprimé. Le destinataire est maintenant assemblé à partir du nom principal, de l'entreprise, de l'adresse, du téléphone, du courrier électronique. C'est une recherche plutôt qu'une adhésion parce que la citation ne garde délibérément qu'un doux leadId donc le module lead reste déployable de manière indépendante, de sorte que les contrôleurs le résolvent et passer le bloc. Un plomb à moitié rempli est le cas normal, et non l'exception: les pistes arrivent des fournisseurs avec quelle que soit la source capturée. L'adresse s'effondre à une ligne et saute ce qui est Manquant, donc une avance ne tenant qu'une ville imprime "Londres" plutôt que ", Londres, ". Une avance qui ne peut pas être lu ne donne aucun bloc au lieu de lancer - une citation dont le plomb était supprimé devrait être encore rendu.
· kamo-internal
Déplacer les citations hors du commerce et mettre la tête
Les citations étaient assises dans le cadre du commerce, à côté des commandes et des chariots plutôt que de côté de la client pour lesquels ils sont. Ils vivent maintenant en tête: un onglet de citations directement après le plomb du client Les données n'ont été présentées que lorsque le marché les le permet. La page de citations autonome est passée au lieu de rester sous la direction d'un drapeau, la première est déjà passée. fournit l'en-tête, l'identité du client, ses communications et ses documents, de sorte qu'un deuxième mise en page d'enregistrement en plus de ce dupliqué le chrome et scindé l'historique du client dans deux. La sélection d'une citation glisse la liste et l'éditeur, et l'en-tête principal Ne quitte jamais l'écran. Les onglets des communications et des documents sont abandonnés pour la même raison. Les marchés gagnent un changement de devis enable et les termes par défaut avec lesquels leurs guillemets commencent. Sans EDIT-QUOTE-TERMS, le champ des termes est désactivé ET omis de la charge utile; Serveille aussi un serveur, puisqu'une entrée désactivée est la présentation, et non l'application. Les ids sous-tabed perdent des "citations"; son critère de régression affirme maintenant la propriété générale - chaque tabuler au-delà du premier maintient son propre index - de sorte qu'il garde toujours le bogue rebondi sans nommer un onglet qui n'existe plus.
· SecurityService
Exposer les paramètres de cotation par marché; faire respecter les conditions d'octroi
la configuration du marché indique maintenant à l'avis de son point de vue sur l'idée d'offrir un onglet de devis et quelle formulation a Une nouvelle citation commence par, et les points d'extrémité du marché vont aller-retour dans les deux domaines. Les termes éditents sont désamarrés côté serveur pour les appelants sans EDIT-QUOTE-TERMS. Désactiver un PATCH fait à la main ne doit pas pouvoir réécrire l'ordre de l'ordre. la formulation juridique.
· kamo-shared-library
Les citations appartiennent aux pistes, configurées par marché
Les citations étaient un artefact de la tuyauline de commerce, qui les plaçait plutôt à côté des ordres et des chariots. que les clients qu'ils sont à côté du client. Ils traînent maintenant à l'avance: le marché décide si ses pistes peuvent porter des citations du tout, et les termes par défaut, chaque citation dans ce Le marché commence par. Par marché plutôt que par orgg parce qu'un bureau hypothécaire émet des estimations de prêts sous TRID et n'a aucune utilité pour un devis générique, alors qu'un marché des services y vit. Les termes portent l'engagement juridique de l'organisme, partant de la formulation du marché sur une seule Citation est sa propre subvention - EDIT-QUOTE-TERMS. Un champ de conditions nulles signifiait déjà "leave inchangée sur la mise à jour, qui permet au contrôleur de le ranger pour les appelants sans la C'est vrai. Dupte également le nom/adresse/téléphone du destinataire propre de la citation: le plomb est déjà à la les coordonnées des clients, et les snapshoting les dupliquaient un enregistrement édité ailleurs qui dériver de là. Schéma appliqué par KamoInitializer avant cet engagement; colonnes vérifiées.
· SecurityService
Réserver, approuver et auditifier les demandes d'autorisation
REST sur la surface arrière/lesemeurs/possibilités/réservi et l'opportunité de la réserve contrôle dans l'en-tête principal, plus le service qui possède les invariants. Droits, appliqués explicitement parce que ce service est autoriséTous Un contrôle manquant est un contrôle manquant, et non un défaut de défaillance: VUES-POSULÉTÉS À L'INTÉCORDONIE CREATE-OPPORTUNITIES demandant plus de temps par vous-même EDIT-OPPORTUNITÉ approuvant, édition, clôture, décision sur une prolongation DÉLETE-OPPORTUNITÉS DE NUME, que l'UI met derrière elle une confirmation Le refus est terminal mais pas destructeur : la réserve, ses divisions et son tout Historique reste lisible sur l'onglet Nied. C'est le but de nier plutôt que la suppression. Détails intéressant la conservation: - Le point de terminaison en tête-à-tête est lisible avec CREATE seul, puisque le bouton doit Savoir quel état rendre - mais un appelant sans VUE qui n'est pas la détention agent obtient une projection rétrécie. La commission scinde et justifie que Il existe un souci de protection qui ne sont pas divulgués par la porte élargie. Reconstruit en tant que permit-list, donc un champ ajouté plus tard ne peut pas fuir par omission. - La liste masque le contact et l'entreprise sur les leads non attribués pour les membres sans VISUER UNASSIGNED-LEADS, Contamineur face à l'appel d'offres. Qui a affirmé ce qui n'est pas le secret, la perspective l'est. - L'extension est fermée sur le fait d'être l'agent qui détient la réserve, sans dieu contournement: la tenue d'une réserve est un fait d'identité, et non un droit, et un la prolongation est déposée sous le nom du demandeur. - Une réserve caduque qui obtient des redémarrages prolongés plutôt que de reprendre, donc RéservéJus-arrêts et réservationSuptronsAyantJours de détention et de mise à jour() de ré-dermis la fin dès le début, et un départ étalé effacerait silencieusement la subvention. - Le pool de mise en place de la commission est constitué de VOIELEADS et de tous les propriétaires/administrateurs de subventions; identique à ce que le critère de sélection offre. Calculer à partir du tableau des droits seul a fait de l'offre déroulante un propriétaire le backend puis rejeté. - L'expiration est un balayage programmé pour que les onglets puissent pagner sur une colonne réelle, mais tous les DTO reports daysRester par rapport à l'horloge de la base de données, donc les lectures sont correctes entre balayages. 36 tests couvrent le cycle de vie, l'arithmétique des dates et les règles de répartition.
· InitializerService
Tableaux pour les réservations d'opportunités
Miroirs LeadOpportunityReservation, LeadOpportunityCommissionSplit et dans la bibliothèque kamo-shared. ddl-auto: mise à jour les créer à partir des entités de toute façon; la DDL explicite est la convention de la maison et rend la forme retransvisable ici plutôt que seulement inférable à partir d'annotations. Appliqué contre la production le 2026-08-04 - les trois tableaux et chaque index existent, owned de l'utilisateur de l'application.
· kamo-shared-library
Entités pour les réservations d'opportunités assorties de délais
Un agent saisit une créance exclusive sur la fermeture d'une avance pour une fenêtre délimitée; l'approbation de l'agrément, l'édite ou le nie, et les collègues peuvent se voir offrir une part de la commission. Trois tableaux: la réserve, sa commission scinde, et un b) Annexer la piste d'audit. Points de conception qui portent la charge: - Les références du plomb, de l'organisation et des membres sont des colonnes d'identification simples sans étranger. clés, en correspondance LEAD-HISTORY et LEAD-TASK. La piste doit dépasser le plomb suppression et baratte de membre sans pouvoir bloquer ou cascader. - dbNow() utilise CAST(now(now() AS timestamp). CockroachDB nue maintenant() est TIMESTAMPT, que Hibernate 6 se matérialise en tant qu'intempérant qui ne peut être jeté à la déclaration LocalDateTime et le raccourci ::timestamp est mêlé par la requête native la lecture de l'analyseur par ancêtre ':' comme préfixe de paramètre. Ni l'un ni l'autre n'apparaissent au moment de la compilation. - La liste paged utilise JpaSpecificationExecutor plutôt que JPQL avec (:param IS NULL OU ...) gardes, parce que CockroachDB rejette une liaison non typée paramètre dans un test nu de IS NULL. - LeadIdentity est une projection, et non l'entité chef de file: Cartes de plomb quatre associations qui par défaut à l'EARGER, et inscrire 100 réserves par entité Des centaines de sélections pour les données que la grille ne montre jamais. - Les ordres de calendrier de l'historique (dateCreated DESC, id DESC). CockroachDB est maintenant() est l'horodatage de transaction, de sorte que les lignes écrites par une édition le partagent exactement; sans le tie-break, un resufflage de piste d'audit se retire entre les chargements de pages. Pas de stéréotypes ici - le service propriétaire déclare les haricots, donc pas d'autre service paie pour l'analyse du dépôt.
· kamo-internal
Adresser le devis à une personne; le résumé cesse de coûter la taille de l'en-tête
Déplacer le résumé de la colonne de droite fixer la largeur mais l'a racheté en tant que renouer bande sous le titre. Il se situe maintenant dans l'écart qui existait déjà entre le titre et les actions rapides, donc ça ne coûte pas du tout de l'espace. Cet écart est fini, donc moins montre en ligne Et le reste reste reste à l'écart - un ordre porte douze et s'enfermerait actions. Il reste visible à chaque largeur plutôt que de disparaître sur des écrans étroits. Le devis gagne également son destinataire: qui est-il destiné, éventuellement son adresse et leur téléphone. Ceux-ci mènent la première section parce que c'est la première chose que vous décidez, et quand une le compte est lié au champ de nom montre à quoi il retomberait autrement. Le Le bloc "Préparé" de l'avant rend les trois et reflète ce qui est tapé plutôt que ce qui a été sauvé pour la dernière fois.
· kamo-shared-library
Répondre à une citation à quelqu'un qui n'est pas encore un compte
Le destinataire était dérivé uniquement d'un Compte lié, de sorte que tout devis obtenu pour une prospect - qui est la plupart d'entre eux - a imprimé une ligne "Préparée" en blanc et la ligne finie Un document n'a pas indiqué à quoi il sert. La citation porte désormais le nom, l'adresse et le téléphone du destinataire à part entière. Qu'est-ce que le personnel a typé les gains sur le compte lié: ils ont dit ce qui devrait être imprimé, et un Un compte renommé plus tard ne doit pas réécrire silencieusement une citation qui a déjà été envoyée. Adresse est libre parce que les formats postaux ne sont pas assez uniformes pour être divisés en champs qui Travaille à l'échelle internationale, et il est imprimé tel qu'il est écrit. Une révision porte le destinataire forward - même offre, même personne. Schéma appliqué par KamoInitializer avant cet engagement; colonnes vérifiées présentes.
· kamo-internal
Ouvrir le profil d'un membre à partir de leur rangée
Ajoute une quatrième action au quai de l'hover de la rangée, en se liant à - C'est un vrai NextLink plutôt qu'un gestionnaire de clics, donc le milieu-clic et "ouvrir dans un nouvel onglet" se comporte et le garde-pain sans navigation dure reste satisfait; le panneau se ferme sur la navigation afin que son écluse de défilement de la carrosserie ne survivant du changement de route. L'action est fermée comme le fait que la destination se présente: le membre met en place page vous redirige vers votre propre profil à moins que vous ne déteniez MANAGE-MEMBERS, MANUI-MÉMOMBRE-SÉCURITÉ, CONFIGURE-SYSTEME, ÉDUCRE-ÉMOMBRE-EVEL, ALLOW-PROMOTING-MEMBERS ou - (ou dieu / plate-forme admin). Sans l'un de ceux-ci, l'icône est cachée plutôt que offerte en tant que mort fin. Votre propre ligne le montre toujours.
· kamo-internal
Ne pas construire lorsqu'un composant appelle un message clé/ne définit pas
next-intl rend in extensible le chemin de touche pour une clé manquante, et les messages/est gitignored ici - rempli à l'image-build time from kamo-translation-dictionary - donc un renom que atterrit dans un seul des deux navires de base comme charabie visible avec rien pour l'attraper. C'est ainsi que les champs de contact des départements sont venus pour rendre sur l'écran des paramètres, et comment la formation démographique de l'HMDA (39 étiquettes) a été expédiée par rapport à un espace de noms qui seulement contenu «lar». scripts/check-i18n-keys.mjs résout l'espace de noms de chaque reliure de traducteur, puis vérifie chaque clé littérale, le préfixe statique de chaque clé modélisée, et les valeurs passent contre les «titulaires» dans le message dans les deux sens, étant donné qu'une unité de soins deexistait non fourni Un argument lance MissingValueError et une donnée non utilisée laisse tomber silencieusement des données. Il comprend L'UTI s'enchevêtre et les sous-messages pluriels, et traite « tag » comme un espace réservé uniquement pour t.rich/t.markup. Les dossiers de 1737 en vertu du paragraphe 1.4s. Câblé en test de 'npm' et dans le Dockerfile en avant de la construction, avec --exigez-messages là donc un dictionnaire vobillant synchronisé échoue fort au lieu de transformer le garde en no-op. La dactylographie t() contre le type d'en- a été essayée en premier et rejetée: une importation JSON élargit les valeurs à "string", donc next-intl ne peut pas inférer les espaces réservés et rejette les appels corrects comme t('...gamer', 'start, fin, total'); il a également triplé l'heure de contrôle de type (81s - 249s) et aurait dû être modifiée à 150 dollars pour le code non-buggy. Paramètres du site d'appel pour ce qu'il a trouvé: - a supprimé une option «default:» passé à t() dans les composants de chat et LanguageButton; next-intl n'a pas une telle option de repli, donc c'était du poids mort. - trade lowStock a passé le nombre de véhicules pour les "disponibles", MultiFileUploader pour "list", et le volume maître audio-vidéo pour « pourcentage » et les trois ont été lancés à l'heure du format. - DnsSetupStudio a passé un « domaine » que son sous-titre n'a pas utilisé.
· kamo-internal
Options de ping/épingle nav des navs et du pavé de lancement
Les membres pourraient proposer une option entre la barre latérale et la barre supérieure, mais jamais enlever un des navs entièrement. Ajoute un troisième placement - AUCUNE, "inçonné" et deux façons de l'atteindre, les deux conduisant le même menu partagé: - cliquez avec le bouton droit sur une option mobile dans NavPri/NavTop: le menu d'emplacement s'ouvre à - la commande de coin sur chaque panne du pavé de lancement domestique: une puce tranquille qui se lit où l'option se trouve actuellement et s'étend sur le survol, ouvrant le même menu L'impardage n'est jamais une impasse. Le pavé de lancement domestique rend maintenant de chaque gracieuse option plutôt que l'union des deux navs, de sorte qu'une option non couverte conserve Paner qui le repousse; la palette de commandes fait la même chose, et chaque changement soulève un toast d'un toast d'un écrasement où l'option s'est déroulée. La disposition de la navigation la page des paramètres croît une colonne non épinglée. Le résolveur garde son invariant - chaque option fermée dans exactement un seau Et un NON explicite maintenant frappe un ordre de zone rassis, donc un décrochement survit à un blob écrit avant. Les configurations stockées auhéritage n'ont pas d'entrées et de résolution exactement comme avant; Reset to Standard ne peut jamais laisser quoi que ce soit non étalé. Couverts par de nouveaux tests pour la résolutionNavLayout, qui n'en avait pas.
· kamo-internal
Cacher les départements vides, déplacer le filtre d'état dans le répertoire
- Les départements qui ne sont pas membres ne sont plus en service. Le critère d'évaluation du département retourne chaque département dans l'orge y compris les départements vides, de sorte que la liste était montrer des sections qui ne pourraient jamais contenir personne. Le par département "non l'espace réservé aux membres s'accompagne, étant inaccessible aujourd'hui. - Le filtre All/Online/Offline se déplace à partir de l'en-tête du panneau vers le bas en dessous la bande de tabulation, donc il est assis dans la zone du Répertoire avec la liste it filtres au lieu d'apparaître pour filtrer l'ensemble du panneau (il n'a jamais été appliqué à Chats ou accès mobile). - L'état vide ne suggère que d'ajuster la recherche/filtre lorsqu'il est effectivement appliqué; un org avec aucun membre n'a rien à ajuster.

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