Aller au contenu
KAMOUniverse

Changelog

Ce qui est nouveau.

Chaque amélioration apportée à la plateforme, à mesure qu'elle est livrée.

  1. · EmailService

    Lire un événement par id

    La page chef d'avance tient un événement de rappel id et veut le rouvrir dans la même dialoger le calendrier utilise, de sorte qu'il doit être capable de récupérer l'événement seul. Champ d'application exactement comme la liste - les calendriers propres du membre plus le l'organisation - donc un id appartenant au calendrier de quelqu'un d'autre lit comme absent plutôt que comme interdit.

  2. · kamo-internal

    Les notes flottantes deviennent une deuxième classe de fenêtre de tête hexagonale

    Hex se dirige maintenant deux types de fenêtres: les fenêtres de l'outil pop-up ils C'est toujours le cas, et des notes flottantes. Réduit au minimum remplacer l'ancien roll-up - a redémarrage des feuilles tombales entièrement et atterrit dans la tête hexagonale dock portant sa propre couleur de note, où le popover s'ouvre/prot rapproché et Jetez-le exactement lorsque ils conduisent une fenêtre d'outil. L'intégration est le contrat d'événement, rien de plus: les têtes sont prises en compte par Window id, donc les notes prennent un espace de noms 'flottant'-bas-note:-id' à l'intérieur de ce id espace partagé et réponse 'tool:focus' / 'tool:'tol:close' pour le leur. Il n'y a délibérément pas de veto sur le veto - que le veto protège embouteillé, et une auto-sauvire collant économise et bouffonne sur non monte. En outre : - Toute la barre de titre traîne. Le titre est une étiquette plutôt qu'une entrée, qui était ce qui volait chaque pixel, mais le coin supérieur gauche; double-clic en le renommant, le double-clic en tout le reste maximise. - Maximiser en plein écran, à partir du bouton ou d'un double-clic. - Une note est vivante dans un endroit ou dans l'autre, jamais les deux. Alors qu'ils flottent, sa carte en /notes est assombrie et inerte (seuls le rétablissement reste en direct) et Le détachement de l'éditeur ferme l'éditeur. "Ouvrir dans les notes" Remarquez en arrière et fermez le collant. - La serrure à maillon profond était un seul booléen, donc une note a rendu un la deuxième fois n'a jamais rouvert. Il est mis à la clé par id now. - Un capotage gauche minimisé réapparaît la tête après un rechargement, et un L'héritage «collapsed» migre pour minimiser plutôt que disparaître.

  3. · kamo-internal

    Un contrôle qui ouvre réellement ce qui a produit l'événement

    La description du rappel était "Ouvrir le plomb: /leads/view/123" comme texte, et Le texte dans une zone de texte ne peut pas être cliqué - le dialogue d'événement édite sa description dans l'une, de sorte que la voie n'aurait jamais pu être un lien là-bas. La destination est sur le deepLink de l'événement depuis l'ajout de la colonne; est la prime qui l'utilise. Le dialogue l'offre en dehors du genre de l'événement, le La vue de l'ordre du jour le présente sous la description, et les deux passent par le routeur plutôt que de charger un document, parce que l'un ou l'autre peut être ouvert sur n'importe quelle page et a la navigation abattrait tout ce que le membre a pris. Clés à partir de deepLink plutôt que de les appels en particulier, donc tout ce qui produit Les événements prennent ensuite le contrôle sans toucher à ce dialogue. L'étiquette se lit comme suit : « Ouvert lead" lorsque l'origine est un rappel et "ouvert" sinon.

  4. · kamo-internal

    Retours sur le calendrier, et un marqueur sur la liste

    Deux façons de voir un appel que vous avez promis de faire sans ouvrir la tête. Sur le calendrier, un rappel obtient son propre élément de ligne plutôt que d'être comme n'importe lequel Un autre rendez-vous - un appel que vous devez quelqu'un est un autre type d'obligation lors d'une réunion à laquelle vous avez accepté d'assister, et un point de vue qui les rend identiques vous fait lire tous les titres pour les distinguer. La vue du mois s'effondre un jour appelle dans une ligne en lisant combien il y a, parce qu'une cellule s'adapte à environ trois Des puces et une matinée chargée d'appels pousseraient autrement chaque réunion sous un "4 plus". La vue de la semaine le nomme "Lead Callback" et met l'avance dans le survol, puisque le bloc est de quelques caractères de large à ce zoom. Le jour et l'ordre du jour Les vues ont de la place pour les deux et montrent les deux. Sur la liste des pistes, un lead avec un appel exceptionnel porte un marqueur de téléphone dans le Cellule de coupe, colorée par la pression: gris un jour ou plus, jaune-auto Aujourd'hui, rouge une fois que le temps est écoulé avec personne qui a marqué qu'il a contacté. En retard les impulsions, qui est l'état qui vaut la peine d'être attrapé en faisant défiler. Plus d'un appel un plomb montre un compte. L'urgence est lue en jours calendaires plutôt qu'en heures, car c'est ce qui suit. "aujourd'hui" signifie pour la personne qui lit la liste: un appel de 9 heures du matin n'est pas urgent à 17 heures aujourd'hui, bien qu'il soit à seize heures, et un appel de 9 heures aujourd'hui est urgent à 8 heures du matin, mais il est dans une heure.

  5. · SecurityService

    Résumé de la liste des pistes

    Les réponses qui dirigent ont un appel qui attend toujours, et quand le plus tôt est dû, pour l'organisation de l'appelant en une seule demande. Son propre critère d'évaluation plutôt qu'un champ sur le lead: les rappels changent sur leur propre calendrier, donc les replier dans la charge utile de plomb signifierait soit une jonction sur chaque requête en plomb, soit un marqueur rassis.

  6. · kamo-shared-library

    Inoncitation de rappels pour toute une organisation en une seule demande

    Nourrir le marqueur de rappel par ligne de la liste des pistes. La grille maintient chaque plomb le membre peut voir, donc demander par plomb serait une demande par ligne pour rendre un colonne; c'est la même question posée une fois. Seule une méthode de dépôt - aucune entité ou aucune colonne ne change, donc rien ici n'est armé contre le schéma.

  7. · kamo-internal

    Un centre de notification, sur chaque page

    Les rappels n'avaient nulle part où arriver. La pop-up du calendrier était une alerte claire dans le le coin supérieur de la page qui se trouvait être ouverte, il a disparu sur une minuterie, et tout ce qui a été soulevé alors que le membre était ailleurs était simplement perdu - la douille publie, et une publication, personne n'est abonnée pour réussir et disparaît. Ainsi, les notifications sont maintenant stockées aussi bien que publiées, et le navigateur lit à la fois à travers un contexte monté au-dessus de l'arbre entier. Ce qui arrive pendant que vous êtes ici est poussé; ce qui est arrivé alors que vous n'étiez pas revendiqué sur le suivant une fois, de sorte que deux onglets s'ouvrant ensemble ne soulèvent pas les deux le même tas. Le pont se trouve dans un coin de la fenêtre, sur n'importe quelle page en dessous. Les cartes empile plutôt que de lister - quatre rappels atterrissant ensemble, ce qui est ce qu'a L'événement de l'entreprise plus votre propre réunion, prendrait autrement la main droite Un tiers de l'écran - et les fans planant les ventilent. Chaque carte mène avec la chose chaque notification dans ce produit a en commun: une horloge. Il décompte jusqu'à la événement, offre maintenant, plus tard ou pas du tout, et draine un rail comme ses propres courses d'accueil qui s'arrête pendant que vous le lisez. Swipe-toi juste pour être débarrassé de ça. Tout le reste est derrière les deux menus: snooze par cinq, dix, quinze, trente, une heure, ou jusqu'à cinq minutes avant le début de la chose; couper ce genre de notification pure et simple; ouvrir les paramètres. Les actions fournies par le producteur se déroulent, Ainsi, un rappel offre le numéro de chef de file et une réunion offre son lien de jonction. Liens passer par le routeur, jamais une charge de document - le pont peut tirer à tout moment et une navigation ici détruirait un projet inédits. La cloche dans la nav supérieure est fixe chrome pour la même raison l'horloge de conformité est : une cloche peut dépérir et on ne dit rien d'autre qu'il n'est pire. Derrière il y a l'histoire, filtré par nature ou non, avec ne pas être distillé où un membre remarque le bruit. L'onglet vous le dit aussi. TabAttention a déjà cligné le titre et a infugvé le favicon pour le chat, les pistes et le soutien; les notifications non lues l'accompagnent, y adhèrent, au-dessus du chat parce qu'ils sont chronométrés - un rappel qu'un appel est dû en cinq minutes s'arrête être utile dans cinq minutes. Les sons sont synthétisés plutôt que chargés, de sorte que la première notification d'une session n'est pas le silencieux sur une connexion lente. Les notifications de bureau ne sont levées que lorsque l'onglet est caché, et qu'une autorisation est demandée au moment où le membre se retourne l'allumage plutôt que sur le chargement de la page, qui est le motif des navigateurs supprimer et les gens nient réflexivement.

  8. · SecurityService

    Un rappel qui ramène à l'avance

    Le rappel a déjà atteint le calendrier du membre, en tant qu'événement intitulé "Lead Callback" avec leur commentaire dans la description. Rien ne disait dont l'appel était, Rien n'a dit quel nombre à composer, et rien n'a ramené à la tête - donc un membre en regardant leur calendrier devait aller trouver l'avant à la main, qui est le Consultez l'entrée de calendrier pour les sauvegarder. Il porte maintenant le nom de l'avance dans le titre, leur numéro à l'emplacement, et un un lien profond relatif au site en arrière avec l'avance sur l'événement et dans sa description. La description répète délibérément les coordonnées: un calendrier est lu où le CRM ne l'est pas, et un rappel sur lequel vous ne pouvez pas agir sans ouvrir un autre l'application est un rappel d'aller chercher quelque chose. La page chef d'orchestre compose maintenant un rappel dans le dialogue de l'événement du calendrier, donc le Une demande peut être accompagnée d'un événement entier - titre, invités, rappels, couleur - et ce Passe tout cela à travers. Chaque champ, sauf l'instant, est facultatif; un appelant qui n'envoie que les trois d'origine obtiennent toujours un titrage, correctement lié entrée construite à partir du plomb. Le règlement d'un rappel retire sa notification ainsi que l'annulation de son événement. Sinon, un appel passé à deux minutes laisse une carte encore pour le demander, et un envie de renouer qui revient demain pour demander à nouveau.

  9. · InitializerService

    Tableaux de notification des membres et colonnes d'origine d'un événement

    Deux moitiés d'une caractéristique. Un rappel programmé sur une piste est mis en miroir sur le le calendrier du membre de planification, et le point du miroir est de revenir à la le son, donc calendar-events porte le type source-type, source-id et deep-link, et le La notification qui en est ressortie porte les trois mêmes. Ordre 0: CalendrierEvent mappere les trois nouvelles colonnes à partir du moment où cette construction commence, donc chaque coureur qui charge un événement les émet dans son SELECT et ddl-auto ne peut pas encore les avoir ajoutés. Commandé en retard, il n'exécuterait jamais. Appliqué et vérifié par rapport à Yugabyte 2026-08-13.

  10. · kamo-shared-library

    Centre de notification des membres et origine d'un événement

    Ajouter Notification et adhésion de membrePréférence: une ligne par membre par membre notification, parce que lire, rejeté et snoozé sont des réponses par personne et un la ligne partagée n'a nulle part où les mettre. Les préférences couvrent les deux moitiés séparément. - des muets, des heures de calme et de non-dérangement sont appliquées lorsque la notification est les notifications sonores, de volume et de bureau sont des propriétés du navigateur. L'événement gagne SOURCE-TYPE, SOURCE-ID et DEEP-LINK, donc un événement réalisé par un Le service peut ramener à tout ce qui est en son genre. Un rappel principal en miroir sur un Un calendrier était précédemment intitulé "Lead Callback" et n'a pointé nulle part, donc un membre En le regardant, il fallait aller trouver l'avance à la main. CalendrierEventReminderRepository gagne des résultats par événement et fait la propriété calendrier avec un rappel dû, qui est ce qui permet à la livraison ventilateur de sortie demander si un événement appartient à l'organisation sans demande par rappel. Schéma appliqué par KamoInitializer's MemberNotificationMigration et vérifié dans Yugaoctet avant que ce n'est atterrti.

  11. · kamo-internal

    Détacher les notes en bâtonnets flottants resizables

    Chaque note dans la liste (et l'éditeur) obtient un contrôle de détachement qui le fait apparaître sur une superposition à l'échelle de l'écran. N'importe quel nombre peut flotter à la fois; chacun peut être traînés n'importe où, redimensionnés de n'importe quel bord ou coin jusqu'à un plancher de 220x170, Il est enroulé jusqu'à sa barre de titre, recoloré et édité en place. Le placement, la taille, l'empilement et la couleur persistent dans le DB par membre Les préférences ui stockent sous une clé «flottant Notes», le même mécanisme Utilisations de la disposition de la navigation. Ce magasin, pas la sessionStorage, est le point: les stickies doivent survivre à la signature et à l'entrée, et se déconnecter la session de gros. Notes : - Le texte collant est toujours proche de l'achoir, de sorte que chaque fond sélecteur est conservé au-dessus d'un rapport de contraste de 7:1 contre celui-ci par un essai unitaire. La palette ne peut dérive illisible plus tard. - L'édition en ligne n'est proposée que pour les notes dont l'état lexical stocké ne porte pas de formatage; quoi que ce soit de plus riche s'ouvre en lecture seule plutôt que d'être aplati par un aller-retour en texte clair. - note.color était auparavant un hexagone tombé dans un créneau de classeNom, où il n'a rien rendu du tout. Il s'agit maintenant d'une palette id résolu à une ligne fond, et une carte colorée épingle son texte foncé de sorte que le mode foncé ne peut pas Peindre en blanc sur pastel. - La superposition est portalisée vers le corps; la boîte de contenu de la coque est overflow:auto et le clipperinerait autrement.

  12. · EmailService

    Un entier pour le badge de courrier, et compter ce que vaut le chemin d'index

    Trois choses, tout sur le fait de savoir plutôt que de supposer. Le badge non lue de la pavé a récupéré l'ensemble de l'arbre de pliage et a choisi INBOX à partir de le résultat - l'appel le plus cher fait par le backend mail, pour rendre un numéro. MailReader a porté UnreadCount pour exactement cela depuis qu'il a été écrit (a ÉTAT unique sur les fournisseurs IMAP, un champ en ligne sur le graphique) et rien l'a exposé sur HTTP. Maintenant, c'est le cas. C'est un chemin de repli qui ne fait que s'enfuir quand la douille non lu a échoué, donc elle est rare et a été coûteuse précisément quand Les choses allaient déjà mal. L'inscription sur l'index indique maintenant pourquoi elle a servi ou non, comme et l'actionneur expose les métriques de manière à les compteurs peuvent être lus. Le rapport entre lesserv et les mods et les mouvements est le nombre qui dit si ce chemin gagne sa complexité, et il n'est pas responsable en lisant la code: un dossier invalide son propre point de contrôle dès que quelqu'un lit un message C'est donc le taux de succès est un fait sur la façon dont les membres se déplacent dans leur courrier. Le la preuve qu'il rapporte maintenant est un enum plutôt qu'un booléen, de sorte que chaque refus est attribués au lieu de grouper ensemble, et les tests affirment la raison spécifique un test qui acceptait tout refus permettrait à ces seaux de dériver dans le non-sens. Corrige aussi un test fasselé que j'ai regardé échouer trois fois cet après-midi et qui est Pas le mien: ImapIdleRegistryTest a sonné une maquette avec la temporisation de Mockito() pour voir le async close atterrir, et sur une machine chargée qui expire alors que la fermeture est simplement en file d'attente derrière la création de threads. Il échoue comme "l'interactions zéro", qui dit comme un registre brisé et est vraiment un CPU occupé. Il attend maintenant sur une serrure qui se réveille l'instant de fermeture() est entré, en faisant correspondre le test de frottement deux méthodes vers le bas, et le fil de stationnement est interrompu dans un bloc et un échec utilisé pour fuir un fil de sommeil non-daémon pendant trente secondes et tout ralentir après y compris la prochaine tentative au même test. Trois suites complètes Connexion: 257 passa, trois fois plus.

  13. · kamo-internal

    Marque chrome autour d'un tableau de rédaction dans la salle de signature

    Le bureau a été teinté de la couleur de l'orge et est devenu sombre dans les deux thèmes. qui placent la marque sous le document et qui ont laissé le chrome neutre Exactement à l'envers. Inversé: - CHROME est la primaire de l'orge de chaque côté de la page: en-tête, dossier rail et quai. Chaque marque dessus est blanche, à travers une échelle symbolique (-legal-on-chrome / -dim / -fauche / -line) de sorte que trois régions ne peuvent pas chacune inventer leur propre idée de "texte secondaire sur la marque". - THE DESK est un tableau de rédaction - gris très clair régné avec un degré de 45 degrés un réseau axonométrique, en pentes CSS pures (pas d'actif, pas de demande, échelles à toute prise de vue). attachement d'arrière-plan: local lie le réseau à l'aide de contenu par défilement pour voyager avec les pages. Il n'est délibérément PAS dérivée de -colore-primaire: une org de marque blanche avec un primaire pâle serait laver la surface sur laquelle repose le document, et la page doit lire comme papier sur un plan de travail, jamais comme du papier sur la marque. Le réseau est ce qui sépare le bord de la page du fond, de sorte qu'aucune bordure n'est tracée. - L'ombre de page est maintenant deux jets - un large doux pour lift, un ombre serré un pour le bord de la feuille. Un seul flou sur une surface lumineuse se lit comme un smudge au lieu d'une page. - Un noeud de dépilage complet est solide BLANC avec la couleur de l'orge à l'intérieur, retourner le nœud et le rail exactement lorsque le membre range les travaux. Vert Il y aurait une troisième couleur qui lutterait contre la marque pour un sens. - L'attestation a été déplacée sur le même panneau qu'une feuille blanche avec la même lift, parce que la déclaration est aussi un instrument et tombant dans une plaine Le panneau est lus comme ayant quitté la pièce. UNE VERROYTIQUE, TOUJOURS. Une étape de document est propriétaire de la barre inférieure - il est le seul à connaître s'il montre une fileuse, une porte de consentement, une surface de signalisation ou une signature capturée - donc le magicien passe son contrôle arrière et Next DOWN au lieu d'empiler une deuxième barre sous la première, et de dessiner le quai elle-même uniquement à l'étape d'attestation. GuideBar a obtenu un ton de marque et un ton la fente de départ pour cela: sur la marque, il peint le chrome, laisse tomber la bordure et l'ombre qui couperait la pièce en deux, inverserait son anneau et son texte en blanc, et sa pilule se lit dans la couleur de l'ordonnance. Son halo AllDone était un dicgé en dur Signature-app bleu, invisible sur un quai coloré. Les points de chargement, d'échec, de consentement et d'augmentation du nombre de portes gardent maintenant le bureau. sous eux et le quai en dessous, donc la pièce ne perd jamais un mur à mi-course et Back est joignable à partir d'un écran que le membre ne peut pas non plus partir.

  14. · EmailService

    Prouvez un dossier inchangé avec HIGHESTMODSEQ, puis le servez à partir de l'index

    Retourne la liste de messages adossé à l'index, en corrigeant la chose qui la rende dangereuse plutôt qu'en retournant le drapeau. L'ancien chèque comparait le nombre de messages et UIDNEXT. Les deux sont aveugles à un drapeau se déplaçant, et rien n'indexe un message quand quelqu'un le lit sur son téléphone, donc un dossier passant ce chèque peut être servi avec l'état lu de chaque message gelé au moment où il est arrivé - une boîte de réception montrant le courrier lu comme non lu. C'est Pourquoi il a été expédié avec désactivation. CONDSTORE a le nombre qui bouge. HIGHESTMODSEQ est à l'échelle du dossier et avances sur n'importe quoi: une arrivée, un épisode, un drapeau de n'importe quel client n'importe où. Donc "à modseq N les nouveaux messages K ont été indexés" plus un nouveau modseq de N est une preuve que rien n'a changé depuis, y compris les drapeaux. Vérifié sur la serveur en direct avant de construire sur lui /usr/libexec/dovecot/imap (2.3.20) transporté CONSTORE, QRESYNC et LIST-STATUS. L'UIDVALIDITÉ est vérifiée à côté, depuis un serveur qui change il a renuméroté le dossier et rien indexé sous le une valeur ancienne décrit le même courrier. L'ÉTAT de Jakarta Mail ne demande jamais que les cinq articles classiques, donc le le formulaire élargi est délivré directement et la réponse parsed ici - à l'épreuve, contre les données filaires littérales, parce que ce nombre est l'ensemble de l'argument de la sécurité. Le point de contrôle vit à Redis, pas dans un tableau. C'est un marqueur de synchronisation dont la bonne le comportement sur la perte est "oublier et relire", de sorte qu'une entité de bibliothèque partagée, a la migration et un khano-Initializer courir n'auraient pas à payer le prix. Pas de travail de remblayage, délibérément. Lorsque la preuve échoue, la demande est lue à partir de l'IPQA exactement comme avant et mains le résultat à indexer, de sorte que les dossiers se remplissent comme ils sont examinés - le même ordre dans lequel être rapide compte, et rien que peuvent s'enfuir dans chaque boîte aux lettres de la plate-forme. Cela explique également pourquoi cette aurait été inutile auparavant: l'indice contenait 31 lignes au total. Deux ordres sont importants et les deux échouent dans une seule direction. Le modseq stocké est Celui lu avant l'attraper, jamais après, donc un changement d'atterrissage à mi-montée s'arrête le point de contrôle derrière la réalité et les coûts un gaspillage se patrie - l'inverse s'apparier un modseq à l'aspect courant avec du courrier rassis. Et les lignes déjà dans l'index n'ont que leurs drapeaux mis à jour, jamais leur corps, parce qu'une rangée l'indexeur complet a écrit porte la recherche de texte est construite à partir de, et sa reconstruction à partir d'une enveloppe serait abandonnent discrètement les messages de recherche tout en rendant la liste plus rapide.

  15. · kamo-shared-library

    Carte est-elle à laquelle il est répondu, maintenant que la colonne existe

    KamoInitializer a été ajouté le 2026-08-13 - vérifiés en Yugabyte: booléen, par défaut faux, pas de nuls). La cartographie est sûre maintenant et n'était pas avant - fullTextSearch est un SELECT natif - dont les lignes Hibernate s'hydratent dans cette classe, donc une colonne la table manque de ruptures de la recherche par courrier électronique elle-même, pas seulement des écrits. C'est pourquoi cela s'est passé Il est arrivé il y a quelques heures. SearchIndexService l'enregistre à partir d'ici, donc les messages nouvellement indexés portent tous les trois drapeaux IMAP au lieu de deux.

  16. · EmailService

    Servir un dossier listant à partir de l'index quand il peut prouver qu'il est en cours

    Les lignes derrière une liste de messages sont déjà dans Postgres et l'index des métadonnées détient l'expéditeur, le sujet, la date, la taille, la fixation et les drapeaux pour chaque message qu'il a vus. La lecture d'une page à partir de là est une requête; la lire à partir d'IMAP est un SELECT plus une ELEUX D'une enveloppe de cinquante PETCH et fait que le serveur construit l'index de boîte aux lettres à la réponse. Ce qui a empêché quiconque l'utilise n'est pas la vitesse mais la confiance. L'indice est rempli par un un indexeur de poussée qui ne court que lorsque quelqu'un a la boîte aux lettres ouverte, donc c'est autorisés à être arbitrairement rassis, et rien ne distingue un dossier courant de a une rugosité. Un STATUS les distingue. C'est la question la moins chère à laquelle l'IDAF répond SELECT, pas de données de message - et il retourne le nombre de messages du dossier et son prochain UID. L'indice n'est utilisé que lorsque les deux correspondent à ce qu'il contient: les captures de comptage Tout ce qui a été ajouté ou retiré, et maxUid 1 - UIDNEXT capte le cas d'un décompte ne peut pas voir où beaucoup sont arrivés qu'ils ont été supprimés. UIDNEXT ne fait que de l'avant, donc un appendice l'index manqué le laisse bloqué au-dessus de l'indice UID le plus élevé Le sait. Tous les autres résultats retombent à IMAP: un dossier manquant, un serveur qui décodeur STATUS, un index vide, une erreur de base de données. Le pire résultat disponible est le un comportement qui existait avant cela. Un dossier qui échoue au test se guérit lui-même lorsque le message suivant arrive et est indexé. Hors par défaut à l'arrière - parce que la réponse le marqueur dépend de search-index.is-answer, qui n'existe pas jusqu'à ce que KamoInitializer a couru. Le fait de le faire est alors un acte délibéré plutôt qu'un effet indésirable d'un déploiement. Le prédicat de l'accord est où être faux montre quelqu'un le mauvais mail, donc il est pur, privé et testé dans cette direction - chaque cas demande si il peut utiliser l'index quand il ne doit pas.

  17. · InitializerService

    Ajouter est-répondre à l'index de recherche par courrier

    Ajout de l'indice, donc l'indice enregistre les trois Drapeaux IMAP au lieu de deux. La liste de messages tire un repère de réponse de ceci. l'une, et la liste indexée dans EmailService ne peut être activée jusqu'à ce que le la colonne existe. Ordre 0, pour la raison habituelle: SearchIndexEntity cartographie la colonne à partir du moment la bibliothèque partagée qui la transporte est construite, de sorte que chaque coureur qui charge cette entité l'émet dans son SELECT et ddl-auto ne peut pas l'ajouter pour nous. Un coureur d'ordre tardif n'exécuterait jamais - un précédent mourrait sur "la colonne n'existe pas" et Prenez la course avec. Nullable avec une valeur par défaut FALSE et un remblai de lignes existantes. Ne pas lire en retour à partir des serveurs de courrier: faux est déjà bon pour l'écrasante majorité des messages, et le chemin de lecture refuse de servir n'importe quel dossier, il ne peut pas prouver qu'il est d'accord avec le serveur autour, donc une ligne qui est rassis ici est une ligne il ne sera pas utilisation. La réindexation le corrige.

  18. · kamo-shared-library

    Indiquer si un message a été répondu à l'index de courrier

    e-mail-metadata.search-index est-il - lu et est éteint depuis qu'il a été créé, mais jamais le troisième drapeau IMAP, «Résaparlé. C'était inoffensif alors que le index n'a fourni que la recherche en texte intégral, ce qui ne s'en soucie pas. Il cesse d'être inoffensif maintenant que l'index peut servir une page d'un dossier directement: la liste de messages tire son repère de réponse de ce drapeau, donc une ligne servis à partir d'un index sans qu'il déclare, silencieusement et maliquait, que le Un membre n'a jamais répondu à ce message. La colonne est ajoutée par KamoInitializer's et n'existe pas jusqu'à ce que cela ait couru - c'est pourquoi la voie de lecture qui en a besoin est derrière un drapeau qui est par défaut.

  19. · kamo-internal

    L'indicateur d'horlogement porte la même impulsion que la conformité légale

    L'horloge de poinçon a respiré une lueur radiale rouge tandis que les obligations insignent trois des pixels à sa gauche pulsaient deux anneaux expansibles. Les deux contrôles demandent membre pour aller faire quelque chose, et deux animations différentes qui se ferment ensemble, lire comme deux systèmes sans rapport - chacun a appris séparément. Une animation en anneau sert maintenant les deux, donc l'image clé est renommée à partir du Les obligations sont à l'origine de ses obligations. La réduction des mouvements les dégrade toujours différemment, parce qu'ils ne perdent pas le même montant: le nombre de badges et le la couleur d'erreur dit toujours "tu dois quelque chose", donc ces anneaux s'arrêtent tout simplement; rien other sur l'écran dit "vous êtes hors de l'horloge", de sorte que l'on tient un seul l'anneau s'ouvre à une intensité constante et la chute la plus en retard.

  20. · kamo-internal

    À l'écran n'est pas la même chose que lire

    Une conversation de soutien a été marquée lire l'instant où sa fenêtre chargée, donc celle-ci une sorte de fenêtre qui ne doit PAS compter comme lue - le genre qui s'élève, d'un une affectation, une réaffectation ou une réponse à l'arrivée - a ouvert la plaquette avant la Un membre avait regardé quoi que ce soit. isFoced ne peut pas distinguer ceux-ci: il est dérivé de l'ordre z, et une fenêtre qui Le plus ouvert est au plus haut par la construction. Le bas de la coque et le bas de page de l'enveloppe sont les seuls signaux dans le système qui signifient qu'une personne a fait quelque chose, donc le fournisseur maintenant les annonce comme outil: userFocus à partir du seul endroit, les deux terrains. De là, la règle décrite par le membre: ouvert délibérément lu dès qu'il charge élevé par lui-même non lu jusqu'à ce que Lire par le fait de les touch, les deux timbres réaffecté à vous non-livraison à nouveau, aucun nouveau message n'est requis Deux timbres, parce qu'il y a deux façons d'être non lu et que chacun doit être déminé: markAsRead avance le pointeur de lecture au-delà des messages du demandeur, et Le transfert à l'affectation est à la retraite. AssignedTicketOpener ne timbre plus le le transfert quand il soulève une fenêtre - c'était le bug en miniature, un reconnaître que l'agent avait vu quelque chose qu'il n'avait pas vu. Son par-onglet La garde porte plutôt le poids. TicketChat obéit à la fenêtre plutôt que de décider pour lui-même, y compris pour les messages qui arrivent pendant qu'il est ouvert: une réponse atterrissant dans une conversation Un membre est en train de lire, un atterrissage derrière ne pas l'être.

  21. · MediaService

    Non lu signifie que le demandeur a parlé, ou le billet est devenu le vôtre

    Le badge comptait "les tickets en direct que personne n'a pris, plus ceux que je tiens" en aveugle, et il n'est tombé que lorsqu'un ticket a atteint le statut de terminal. Donc Il s'est assis à cinq sur une liste qui n'a rien marqué, et l'ouverture d'une conversation a déménagé Ni l'un ni l'autre. Il compte maintenant ce qu'il dit: conversations avec quelque chose en eux pour ce membre à lire. Les deux moitiés de l'ancien prédicat ont disparu. Non lu est une requête native partagée avec la liste des billets, donc le nombre et les lignes marquées sont le même fait plutôt que deux approximations qui ont dérivé deux fois. Retirer un transfert diffuse maintenant le badge. C'est l'une des deux façons d'un conversations cesse d'être non lu, et sans l'émission le nombre est resté inchangé pour le cas sans nouveaux messages, ce qui est précisément le cas Un timbre de transfert existe pour. Les tests de la badge se déplacent avec: ils ne s'énervent plus deux moitiés de la LGQ, mais affirment ce que le nombre signifie - une conversation que l'autre partie a écrite en compte, un juste remis les comptes même avec rien de nouveau, et chaque ticket compte une fois Mais il convient de bien les qualifier.

  22. · kamo-shared-library

    Une définition d'une conversation de soutien non lus

    L'insigne de l'embout et la liste des billets ont été séparés à deux reprises en répondant différentes questions. findUnreadStateForViewer est la seule réponse à la fois maintenant lire, Ils ne peuvent donc pas être en désaccord à nouveau. Non lire signifie que l'autre côté de la conversation parlait et que vous n'avez pas regardé. Pour l'agent affecté qui est spécifiquement le REQUESTOR speaking - a La note d'un collègue sur le même ticket n'est pas quelque chose à laquelle l'agent doit une réponse. Il ne soulève donc pas de drapeau. Pour le demandeur, il s'agit de toute personne du côté du soutien. Toute personne sinon n'est pas une partie à la conversation et ne voit rien, c'est pourquoi la requête est portée par le rôle plutôt que par l'orgge: une demande d'orge croisée est répondue par un agent dans un rég de la personne qui l'a élevé, donc ni l'autre partie n'est identifie les deux. Le transfertUnread est la deuxième façon de ne pas être lu, sans aucun nouveau message. Etre donné une conversation est en soi la chose que vous n'avez pas vue, donc un les terres de récession non lues, mais vieillies, son dernier message, sinon un billet a été déplacé Le matin, il reste invisible jusqu'à ce que le client parle à nouveau. Agences d'ouverture déjà assurées exactement: rayé de chaque (re)mission, n'estampillée qu'une fois que l'agent l'a vraiment mis à l'écran. Reliure est éligible. Un demandeur répondant à quelque chose d'un agent le cas le plus remarquable mérite d'être relevé, et celui qui serait sinon être silencieusement abandonnée; seulement FERMÉ et VOIDE le mettre fin.

  23. · kamo-internal

    Donner au rail expansé une barre de défilement au lieu de flèches d'extrémité

    Les flèches haut/bas existent parce qu'un rail effondré est 80px de tuile sans la place à dépenser pour n'importe quoi d'autre. Élargé, le rail est de 248px et les options lire comme une liste - là, les flèches sont le pire instrument: ils disent seulement "plus de cette façon", où une barre de défilement dit combien plus et où en elle vous sont déjà, et ils flottent au-dessus de deux rangées au lieu de s'asseoir à côté eux. Donc le cygneur prend maintenant un 'affordance', et NavPri demande la barre de défilement chaque fois que le rail est large (dillé en fonction de l'expansion persistante ou un hero-peek vivant). Tout le reste dans la bande est inchangé dans les deux modes: attrap-and-throw, la roue, le toucher et le défilement de l'option de la page actuelle en vue. Deux détails, les forces de l'interrupteur: - le bord mou se démarque, parce qu'un masque peint la barre de défilement d'un élément ainsi que son contenu, et un évanouissement sur les extrémités de la barre, il s'agit à accompagner ressemble à une faute de rendu; - attrap-to-slide ignore maintenant une presse qui atterrit sur le gout. Chrome délivre le pointeur là, donc sans qu'une traînée du pouce se déplaçât la barrette deux fois - le navigateur en le faisant défiler dans un sens et le manipateur du pan l'autre.

  24. · kamo-internal

    Utiliser les vrais logos des fournisseurs de paie sur les cartes de fournisseur

    Ajout des 10 actifs du vendeur et les place à la place de la plaquette les espaces réservés. Ce sont des Words, pas des icônes carrées comme le fournisseur de courrier électronique, et leur les rapports d'aspect vont de 0,72:1 (force de jour, plus grand que large) à 6,2:1 (Paychex). La tuile carrée 44px des cartes d'e-mails écraserait la plupart d'entre elles et rétrécissait la large à un frottis illisible, et une bordure dessinée autour d'un mot-couchage se lit comme un erreur plutôt qu'un cadre. Donc la marque rend maintenant à un heIGHT fixe avec une largeur automatique et sa propre Le rapport d'aspect, plafonné, Paychex ne peut pas dominer une carte. Une hauteur constante sur dix formes différentes, c'est ce qui rend la grille délibérée. Chaque actif Les dimensions de la boîte de la boîte sont enregistrées à côté de son chemin parce que l'image suivante/l'image ont besoin qu'ils réservent la bonne case - lui remettre un carré pour un actif de 6:1 réintroduit exactement la distorsion que cela évite. Sur la carte, le logo prend sa propre ligne au-dessus de la puce de nom et d'état, au lieu de plutôt que d'être assis à côté d'eux comme une icône. Le logo est marqué décoratif chaque fois que le nom du fournisseur est rendu à côté, Donc un lecteur d'écran lit le nom une fois plutôt que deux fois; la tuile de la marque reste pour GENERIC-CSV, qui est un état de connexion plutôt qu'un fournisseur et a pas d'actif.

  25. · kamo-shared-library

    Porter si un billet est l'un des articles que le badge de soutien compte

    L'insigne de l'incarpain et la liste des billets répondaient à différentes questions et Personne ne pouvait le dire. L'insigne compte des éléments en attente d'attention - à une majorité écrasante Les billets que personne n'a encore pris en charge, ce qui est un fait à propos du TICKET. La liste un message de discussion non lu marqué, un fait sur sa CONVERSATION. Donc l'insigne lue "5" sur une liste qui ne marquait rien, et les deux nombres n'avaient pas de visible relation. BesoinsAttention porte le test d'adhésion de la badge par ligne, de sorte que la liste peut marquer exactement ce que l'insigne compte. InvisibleCount reste: "Quelque personne a dit quelque chose que vous n'avez pas lu" vaut toujours la peine d'être montré, et ce n'est pas la même chose Ce n'est que "personne ne s'en occupe".

  26. · kamo-internal

    Mise en place et carte des personnes aux états de paie sur les inscriptions

    Remplace l'onglet "SSR" par l'onglet Vue d'ensemble de l'espace réservé par la réalité. L'onglet est maintenant "Construction de fournisseur" et l'écran est "Payroll Provider Setup", suivant le écran du fournisseur de courrier électronique sur lequel il est modélisé - la touche d'onglet reste "écorce" de sorte que le le menu des paramètres, la carte de lancement et tous les signets existants continuent à fonctionner. Construit afin qu'un administrateur des ressources humaines sans formation technique puisse répondre à trois questions sans poser à personne: est-ce connecté, est-ce synchronisé, et est-ce C'est une chose qui ne va pas bien maintenant. - Les cartes de fournisseur indiquent ce que chaque fournisseur peut effectivement faire AVANT que l'organisme engage, donc choisir est une comparaison plutôt qu'une supposition, et une capacité absente est visible en plomb au lieu de découvrir le jour de la paie. - Le formulaire d'accréditation est rendu du schéma de terrain du BACKEND. Ajout d'un le champ vers un fournisseur est un changement de Java au lieu d'une nouvelle composante React - le L'écran de courrier électronique écrit un composant par fournisseur et en a douze. - Les secrets ne sont jamais renvoyés au navigateur, seulement un drapeau "c'est fixé", et un drapeau la case vierge signifie inchangé plutôt que clair. - Le panel de santé mène avec les deux façons d'y parvenir silencieusement Les salaires - personnes non mappées et codes gagnants non carnœments - parce que les deux sont invisible à l'époque et ne font que poser une plainte pour traitement. - Une course partielle est sa propre couleur. "412 personnes sur 415" n'est pas un succès et non un échec, et le rendre comme l'un ou l'autre cache trois personnes non rémunérées. - Exécuter les noms de détail de la personne et du fix, et non d'une trace de pile. Codes d'émission sont disponibles du serveur en tant que jetons stables et sont localisés ici. L'inscription gagne la colonne de la cartographie des états de paie, parce que l'inscription de quelqu'un et dire à la paie qui ils sont un emploi. Auto-match propose un courrier électronique exact l'égalité et une confirmation humaine - un nom n'est pas une identité, et un lien erroné envoie les heures d'une personne au salaire d'une autre personne. Un prestataire déjà revendiqué record reste visible mais incontrôlable. Cet écran n'avait pas non plus de traductions et a rendu un membre brut à 19 chiffres. ids; les deux fixes, avec la recherche de nom d'affichage extraite à un crochet puisque chaque l'écran de carte temporelle présente le même écart. La plate-forme perfectionnement gagne les sept fournisseurs de paie où Kamo en détient un l'enregistrement des partenaires. Délibérément, pas de carte pour Dayforce, Workday ou UKG: ils d'émettre des identifiants par client, et l'écran rend une carte pour chaque enum constant, donc un pour eux serait un formulaire qu'aucun opérateur ne pourrait remplir. Le miroir RoleRightType gagne 197, 198 et 199 - les deux premiers côté du serveur et étaient déjà absents ici, donc checkRight n'avait rien de dactylographié.

  27. · InitializerService

    Index et REVOKE les tableaux des états de paie

    Ce que Hibernate ne peut pas exprimer pour les nouvelles tables hr-timecard-payroll-. Deux REVOKE. PayrollDispatch et PayrollSyncIssue refuse les mises à jour et les supprime dans Java par l'intermédiaire de l'action de l'entité, mais les appels d'entité ne font l'objet d'un tir que pour les lignes Charge dans un contexte de persistance - JPQL bulk, supprimer AllInBatch() et SQL natif marchez tout droit devant eux. Une tentative de transmission de la paie est un événement monétaire, et les preuves d'une synchronisation complète doivent survivre pour être la preuve. Deux indices partiels, que l'entité ne peut pas porter parce qu'ils ont des prédicats: la liste de travail du balayage (orgs avec synchronisation activée et une synchronisation due, une petite minorité de lignes) et erreurs de synchronisation par membre (lignes ERROR, surpassées par INFO grossièmement de la taille du fichier). Appliqué et vérifié contre Yugabyte.

  28. · kamo-internal

    Calibre une pièce jointe par ce que l'API du fournisseur porte réellement

    Le compositeur tenait chaque DM social à un appartement de 10 MB, qui est la photo de Telegram limite appliquée à quatre fournisseurs qui ne la partagent pas. Chacun a maintenant sa propre plafond, et à l'intérieur d'un fournisseur chaque type de média obtient le sien où l'API les divisant: Télégramme photo de 10 MB, document/vidéo/audio de 50 MB (sendPhoto vs sendDocument) Messager 25 Mo, le même pour toutes sortes Instagram 8 MB image, 25 MB vidéo/audio/fichier Discord 8 MB (le plafond de téléchargement du robot) X pas de fixations du tout inconnu 8 Mo, le plus serré de ce qui précède Ce sont les limites de l'API chaque adaptateur post à, PAS de l'application grand public du même nom. Les deux diffèrent et c'est important : l'application Messager a soulevé le fichier le partage à 100 Mo tandis que son API Send est documenté à 25 Mo, et c'est l'API numéro qui décide si le client reçoit le fichier. Découpage à l'application figure aurait le compositeur accepter quelque chose que Meta refuse alors, longtemps après l'agent a été informé qu'il était sorti. X n'obtient pas de trombone plutôt qu'un trompage qui refuse tout : XAdapter sendImage et sendMedia tombent tous les deux à envoyerText et le téléchargement des médias était hors de b) Le champ d'application de la v1 - donc un fichier joint n'irait nulle part pendant que la légende arrivait seul. Ses propres capacités de fournisseur disent la même chose. AttachmentPolicy croît 'maxBytesByClass' pour cela, caractérisé par une nouvelle valeur de quatre AttachmentClass (image/vidéo/audio/fichier) qui correspond à la répartition par les fournisseurs les critères d'évaluation et la manière dont MediaService achemine les médias sortants. SVG est un fichier dans les deux.

  29. · DaemonService

    Synchronisation des états de paie nocturne

    Lecteurs de TimecardService (qui se synchronise) toute organisation dont la synchronisation suivante est due. Cron vit ici plutôt que dans TimecardService parce que ce déploiement est RollingUpdate avec maxSurge 1, donc deux gousses se chevauchent à chaque déploiement et a «Mécanisation programmée incendie deux fois - ce qui, pour une synchronisation des états de paie, signifie deux poussées de les mêmes heures. DaemonService est réplicas 1, stratégie Recreate. Prévue à 3:00, quarante minutes après les balayages de la carte de temps: ceux qui s'ouvrent change et détecte les exceptions, et envoyer des heures à un fournisseur de paie avant ils ont couru transmettraient des nombres qui sont sur le point de changer. Refuse à rouler sur un mlos vierges.internal-auth-secret plutôt que d'enregistrer un faux un succès - une synchronisation de paie qui ne court jamais exactement comme une fonction qui n'a rien trouvé à faire, et la différence est une période de paie d'heures qui n'a jamais atteignit le fournisseur.

  30. · SecurityService

    Limite d'autorisation pour la mise en place des prestataires de services de paie

    Relaise la nouvelle surface et fait respecter qui peut Atteindre ça. TimecardService détient le moteur et pas de session; cela tient la et décide. SecurityService exécute anyRequest().permitAll() avec Authsée à la main, donc un manipulateur qui oublie sa garde n'est pas faiblement contrôlée - il est incontrôlé et accessible à partir de l'Internet public. Cartographié sous le préfixe actuel /api/sécurité/payroll à l'usage: kamo-interne l'atteint par une route BFF à portée de main, et un nouveau préfixe 404 dans le un navigateur alors que chaque service est sain et que chaque construction est verte. Quatre niveaux: - MANAGE-PAYROLL-PROVIDER (199) écrit des justificatifs d'identité et se connecte ou se déconnecte OAuth. C'est la capacité de décider quand les heures d'ouverture d'une organisation sont transmis, c'est pourquoi il a son droit à part entière. - GUEL-ROIT-SETTINGS (45) indique la connexion et sa santé. - MANAGE-TIMECARDS (183) couvre la cartographie et la synchronisation des employés. - FINALISE-PAY-PERIODS (198) transmet un lot engagé - le même niveau que engager l'exportation, parce qu'il s'agit du même acte. Test Connection se situe avec l'écriture correcte plutôt que la lecture: c'est un l'appel sortant effectué avec les justificatifs d'identité stockés, et laisser à quiconque peut voir page le feu leur donne un moyen de sonder le fournisseur de paie de l'organisation. L'échange OAuth ne fait PAS avancer une id. TimecardService le fait sortir de l'état signé par le HMAC, de sorte qu'un code obtenu pour un locataire ne peut pas être échangé contre un autre, même par un appelant qui détient le droit dans les deux cas. Ajouter des ajouts à TimecardServiceClient, qui n'avait obtenu/post que.

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