Changelog
Ce qui est nouveau.
Chaque amélioration apportée à la plateforme, à mesure qu'elle est livrée.
· kamo-shared-library
Le domaine fournisseur de paie derrière le moteur de la carte de temps
Ajoute la colonne vertébrale de la persistance pour connecter les cartes de temps d'une organisation à un système de paie tiers: la connexion et sa configuration par or crypté, la subvention OAuth, le lien membre-fournisseur-employé, la carte de code gagnant, et les deux enregistrements d'appendices (tentes d'expédition et problèmes de synchronisation) qui font une synchronisation explicable par la suite. Resté à l'intérieur de la carte com.kamo.z.shared.hr.timecard plutôt qu'un nouvel emballage sur but: un nouveau paquet à partage doit être ajouté à trois éléments distincts explicites «EnableJpaRepositories liste, et omettre un environnement de service - ou, dans KamoInitializer, il fait errer la course tout en signalant BUILD SUCCESS. Notes sur la forme: - PayrollProviderType reutilise le vocabulaire de jeton déjà documenté sur (ADP-WFN, PAYCHEX, GUSTO, ...). Une deuxième orthographe pour le même fournisseur diviserait l'historique des exportations sans erreur n'importe où. ADP-RUN et QUICKBOOKS sont conservés parce que l'écran d'exportation des états de paie les a offerts depuis qu'il a été expédié, de sorte que des rangées en direct peuvent les transporter. - Les liaisons des employés sont à clé par le fournisseur, et non par la connexion, de sorte que la commutation le fournisseur et le changement de retour ne jettent pas les travaux de cartographie. DEUX contraintes uniques: l'un empêche un membre détenant deux liaisons, l'autre s'arrête deux membres revendiquant un employé fournisseur - que l'un empêche une double rémunération. - PayrollDispatch et PayrollSyncIssue sont des WORM. Une transmission des états de paie la tentative est un événement monétaire; "nous l'avons envoyé, puis nous l'avons envoyé à nouveau" est le fait qu'un les besoins de réconciliation. - Les pouvoirs sont en concurrence dans UN blob crypté config'json plutôt qu'une colonne par l'ajout d'un fournisseur n'est donc pas un changement de schéma qui réarnd tous les services. RoleRightType gagne MANAGE-PAYROLL-PROVIDER (199) - NE PAS NE PAS l'héritage MANAGE-PAYROLL (40), qui ne porte rien aujourd'hui et qui est déjà détenu par nombre inconnu de membres; le réutiliser permettrait de payer des états de paie à des tiers les références à chaque détenteur de droits de visualisation de taux sur le coffre qui l'a livrée. PlatformOAuthProviderType gagne les sept fournisseurs de paie où Kamo en détient un inscription des partenaires (ids 11 à 17). Dayforce, Workday et UKG émettent des références par client et ne reçoivent délibérément aucune constante: l'écran de la plate-forme rend une carte pour chaque constante, donc une pour eux serait une forme qu'aucun opérateur ne pourrait être remplir. Corrige également une affirmation rassis dans BillingDelegationModeTest: commit 9276487 APPLICATION DES RÉQUISA HOMOLOGATION autorise les groupes (l'exclusion a fait la voie d'homologation impossible à atteindre) mais a laissé l'essai affirmant l'ancien comportement, de sorte que la suite a été rouge sur la base depuis. Schema appliqué et vérifié à Yugabyte avant cette poussée.
· kamo-internal
Un mur à "maintenant", et une carte qui explique un coup de poing annulé
Personne ne peut enregistrer le temps qu'ils n'ont pas encore travaillé. Traîner un bord, coulissant un une travée entière, en poussant avec les touches de flèche, l'aimant, le bloc de clic droit et le manuel ajouter diagrammes tout arrêt à la minute en cours sur la ligne d'aujourd'hui, et a Le futur jour n'accepte rien du tout. La partie d'aujourd'hui qui ne s'est pas produite est hachute, parce que "tu ne peux pas traîner une pilule ici" doit être visible AVANT quelqu'un contrôle, pas en règle générale. Le serveur a déjà refusé un poinçon inséré ou corrigé par rapport maintenant, qui est exactement pourquoi le client avait besoin de ceci: sans le mur, la traînée a réussi, pilule s'est assis là en regardant mis en scène, et l'ensemble du sauvetage a échoué à la fin avec un un message sur un coup de poing que le membre n'a pas pu trouver. L'aimant obtient la même paroi. Un poinçon laissé à l'avenir par un mauvais dispositif l'horloge était une cible d'encliquetage légitime, donc un bord pouvait être tiré vers l'avant sur elle Et atterrir quelque part le sauvetage refuserait. Et la carte de confirmation reste maintenant ouverte quand un coup de poinçon END EST OUT la seule avant, que TimecardService a commencé à faire ce matin pour toute inversion à l'intérieur d'un minute. Sans cela, le membre appuie sur un bouton, regarde l'état encliquetant vers l'arrière à exactement où il a commencé, et conclut raisonnablement que le bouton est cassé. En qui indique que la carte laisse tomber son cueilleur et sa copie d'action, montre une phrase et un bouton, et cesse de rejeter sur la toile de fond - le clic errant que de sorte suit souvent une confirmation ne doit pas clore la seule explication de ce qui s'est passé.
· kamo-internal
Donner le soutien et les fenêtres sociales au compositeur de la discussion des membres
Un ticket d'assistance et un DM social sont la même chose qu'une discussion de membre. session de presse avec des messages à ce sujet - mais on leur a répondu par une simple champ texte. Un agent peut recevoir une capture d'écran d'un client et n'a eu aucun moyen pour renvoyer un en arrière: pas de bouton d'attachement, pas de glisser-déposer, pas de pâte, pas d'emoji, et un des contributions qui ne passeraient pas au-delà d'une ligne. Les deux rendent maintenant le compositeur de la discussion des membres, donc la machine de téléchargement, le bacs de fixation, panneau de transfert, le somptueuse de l'emoji et Enter-to-send sont une mise en œuvre dans les trois. Reçus et envoyés des pièces jointes les bulles via la même puce AttachmentChip. Deux choses que la fenêtre de soutien à l'onglet a forcé à l'air libre : - Les brouillons sont garés par conversation (useDraft Parkking). Un compositeur sert plusieurs billets et les messages d'envoi à celui qui est à l'écran, donc un brouillon de gauche Dans la boîte, il y a les mots d'un client visant un autre. Jeter après un envoi prend la clé avec laquelle l'envoi a commencé, ou en changeant des onglets en cours de vol essuyerait la réponse étant dactylographiée à quelqu'un d'autre. - Des pièces jointes sont également tenues par séance. Une liste forfaitaire met en place celle d'un client fichier dans la barquette d'un autre et le télécharger là; uploadAll now s'adresse à la session pour laquelle les fichiers ont été mis en scène, quel que soit l'onglet en vue lorsqu'ils atterrissent. Les réponses sociales sont plafonnées dans un fichier de 10 Mo: un message porte un seul MediaObjSocialRef, donc une deuxième pièce jointe pourrait être stockée et jamais relayée, 10 Mo est le plafond de fournisseur le plus serré que nous envoyons. le renvoyer dans le Le compositeur bat sa perte en silence. Un envoi raté est maintenant signalé séparément d'un téléchargement raté - les fichiers sont Le message n'est pas le cas, et le projet est toujours là pour essayer à nouveau.
· kamo-internal
Le cadran de vitesse répertorie les extensions du département de l'org
L'onglet a été expédié six entrées inventées - Équipe des ventes sur 1001, une salle de conférence sonnerie en permanence - donc le clou de numéroter a atteint tout ce qu'il est advenu de répondre que extension, et les badges BLF ont signalé la présence à laquelle rien n'était abonné. Il lit actuellement /api/sécurité/départements et énumère tous les départements dont l'ordre a à l'aide d'une extension, triée par titre, avec le numéro extérieur en dessous l'une est fixée. Le chargement, les états vides et les états d'erreur réarmés remplacent les tuiles qui ne pourrait jamais être vide. L'EEG est org-arg-arg et n'a pas besoin de droit, et il s'enfuit une fois l'onglet ouvert pour la première fois.
· kamo-internal
L'élargissement de la discussion, le social, l'ai-chat et la composition des fenêtres à la taille du support
La fenêtre du ticket d'assistance s'ouvre à 460px pendant le chat des membres, le chat social, le chat d'IA Et le compositeur d'e-mails s'est tous assis à 360-420. Même quai, même type de contenu - ils Partage maintenant la fenêtre de support par défaut 460px (et un plancher 420px pour le resizable les uns), donc une rangée de fenêtres d'outils ouvertes s'aligne au lieu d'un pas d'escalier.
· kamo-internal
Montrer des messages invisibles sur chaque file d'attente, pas seulement les messages joints
Le badge et la teinte de rang étaient déjà là - ils n'étaient tout simplement jamais peuplés pour la majeure partie de la liste. getUnreadFor lire seulement la carte en direct par session non lu, qui est dérivé de la rangée d'adhérents du téléspectateur, de sorte qu'un ticket qu'ils n'avaient pas L'adhésion ne pourrait jamais s'allumer. Sur cette file d'attente qui est la plupart, et le les billets non attribués que personne n'a ramassé sont à la fois la majorité et les rangées qui la plupart ont besoin du drapeau. Il préfère maintenant la carte en direct, qui fait autorité pour les conversations le spectateur est en cours et met à jour au-dessus de STOMP le moment où ils lisent ou une réponse atterrit, et tombe Retour au nombre per-til du serveur pour tout le reste. Les deux ne peuvent pas être fusionnée aveuglément: la carte en direct ne transporte que des sessions qui n'ont pas encore été lues les messages, donc "lire une seconde" et "n'ont jamais compté" sont indiscernables dans C'est pourquoi la petite série de conversations ouvertes au cours de cette visite, qui conserve une rangée que le membre lit actuellement depuis le reste allumé jusqu'au prochain rechargement. La liste se relit également lorsque le support en attente de comptage se déplace. Pour une conversation que le téléspectateur n'a pas rejoint il n'y a pas de chaîne en direct qui ne serait jamais corriger l'instantané - le sujet non lu n'atteint que les gens dans la session, qui sur une file d'attente n'est personne - et en attenteCount est le seul signal qui atteint chaque membre support de l'ordre.
· MediaService
Le timbre invisible compte sur la liste des titres, et garde la file d'attente en direct
getTickets charge maintenant en nombre de messages invisibles par rangée pour l'appelant, à côté les files d'attente des visiteurs qu'il charge déjà de cette façon, et getTicketDetail calcule le sien avant la marque du lecteurAsRead land - afin que la fenêtre puisse montrer ce qui est arrivé pendant ils étaient absents plutôt qu'un nombre d'un certain nombre, l'ouverture de celui-ci déjà mis à zéro. Ferme également l'intervalle de signal qui a laissé la virage de la file d'attente. Un message à l'appui la conversation déplace la file d'attente pour chaque membre support de l'orge, pas Seules les personnes au cours de cette session - qui sont exactement qui sont celles qui sont celles qui sont non lues Le sujet n'atteint PAS. L'émission en attente déjà renvoyée lorsqu'un compte en instance a visiteur de casier public envoyé et lorsqu'un agent marqué est libellé comme suit; un membre répondant de à l'intérieur de l'application était le trou, donc une conversation de soutien dans l'application pourrait gagner les messages sans rien dire à l'écran d'un agent de regarder à nouveau. SupportUnseenCountSqlTest brosse la forme de la requête. Chaque clause y est la porteuse et aucun d'entre eux n'est visible dans une construction passagère: se tromper et la file d'attente continue de rendre, juste avec des comptes qui sont discrètement faux.
· kamo-shared-library
Compter des messages invisibles pour un spectateur qui n'est pas dans la conversation
Un read a toujours été dérivé de la ligne MediaSessionMember du téléspectateur, donc Une conversation qu'ils n'avaient pas eue de comte du tout n'a pas produit de comte. Sur une file d'attente de soutien c'est-à-dire la plupart d'entre eux - 27 des 37 billets en direct ne sont pas attribués, et 26 d'entre eux avoir exactement un membre de la session, la personne qui a demandé de l'aide. Ceux-ci sont précisément les rangées qui ont le plus besoin d'être signalées, et ce sont celles qui structurellement ne pouvait pas porter de drapeau: personne ne les avait rejoints, donc il n'y avait pas Le lecteur pour qu'ils ne soient pas lus. countUnseenBySessionForViewer répond à la question qu'une file d'attente pose à la place. Le La gauche de la participation à l'adhésion est l'ensemble de l'astuce: sans rang d'adhérents, il n'y a pas de Lecteur de lecture, donc chaque message entrant compte, qui est la vérité - le spectateur n'a vu aucun d'entre eux. Une requête par page, correspondant à la façon dont les files d'appel des visiteurs sont à côté il est déjà chargé en vrac. Les événements du système sont exclus. Un changement de statut ou une réaffectation est la comptabilité sur la conversation, et compter illumine des rangées où personne n'a en fait dit n'importe quoi - pire que pas d'insigne du tout sur un écran dont le travail est de décider ce qui a besoin d'une réponse. SupportTicketDTO.unseenCount est peuplé sur la liste et les détails se lit et gauche null partout ailleurs, parce que "non vu" est un fait à propos d'un spectateur et d'un nombre inventé pour un appelant qui n'a pas posé de question à propos de quelqu'un serait tout simplement faux.
· kamo-internal
Supprimer, aimants, un menu de clic droit, et une horloge qui demande laquelle
Six ajouts au graphe de période et à l'horloge nav. DELETE enlève la pilule focalisée. Backspace aussi, parce que sur un Mac la clé étiqueter "supprimer" l'espace arrière et l'offre uniquement Supprimer signifie que le raccourci est n'existent pas sur un ordinateur portable. Il vide les deux coups de travé, donc la suppression d'un repas laisse le travail de part et d'autre de celui-ci continu, ce qui signifie pour le Un repas ne s'est pas produit. Étape comme toute autre édition; rien n'est écrit jusqu'à épargner. Une GUIDELINE suit le pointeur à travers chaque rangée, avec la minute qu'il est allumé dans un puce en haut. Son travail est de dire où un clic atterrirait, et c'est le la même minute tous les jours de la période. Mesuré sur un élément de piste plutôt que le conteneur, dont la boîte comprend le nom du jour et le total des colonnes, en utilisant il signalerait une minute par leur largeur, que le membre ne peut pas voir Le DROIT-CLICK n'importe où le jour ouvre un menu qui laisse tomber un bloc de 15 minutes de temps de travail, de repas ou de pause où se trouvait le pointeur. Deux poinçons, pas un: une portée est une paire, et un ouvre-porte solitaire dessèche une pilule en courant jusqu'à minuit. Notez qu'un repas Bloc OPENS avec MEAL-OUT - un repas est enregistré comme étant hors du travail et retour In, et faire reculer cette paire retourne le jour. MAGNETS: un bord traîné dans les cinq minutes suivant un autre coup de poinçon sur son minute exacte, contournant délibérément l'intervalle d'une minute que la pince garde. Que L'écarte arrête un bord qui traverse son voisin; ici toute l'intention est pour les deux de se rencontrer, et un bord qui ne peut atterrir qu'une minute de temps ne peut jamais combler un fossé. Cinq minutes à un zoom de quinze jours, c'est quelques pixels, donc sans aimant "Fait fin à cette pause quand le prochain commence" est une tâche que personne ne peut accomplir avec un pointeur. Et quand l'aimant atterrit deux travées du même bord de trois, ils MERGE dans le même geste: l'horloge et l'horloge qui partagent maintenant un arrêt de minute être vrai, et les deux sont annulés. Différents types ne se confondent jamais - un changement de fin exactement quand un repas commence n'est pas une fois, ce sont les deux choses qui en fait C'est arrivé. Cela nécessitait le tri dans le couple de GraphPunches pour lier le brise-lamh sur l'original minute: deux bords confondus doivent garder leur ordre chronologique ou un appariement les permutants, produit une portée de rayons zéro et un ouvre-porte égaré, et le piluge disparaît en ce moment, les deux se rencontrent. TROIS COULEURS DE PILLE, et distincts par plus de teinte et travaillent solidement dans la marque primaire, repas rubanné dans l'ambre HRS, casse finement rayé en violet. Couleur à elle seule, les plus de 8 % d'hommes ayant un déficit rouge-vert et ne parviennent pas à tout le monde projecteur; quelqu'un devrait être en mesure de dire un repas non rémunéré à partir d'une pause dans un Imprimer en noir et blanc. LES SKC DE NAVE QUI ONT CONCERNÉCULES. "Clock out" est trois actes différents, et ce qui est suroffre dépend de l'endroit où le membre est présent: travailler, ils peuvent mettre fin à changer, aller à un repas ou faire une pause; lors d'un repas ou d'une pause, le retour est le défaut et fin du changement est toujours là parce que les gens partent directement depuis le déjeuner. L'effondrement de cela dans un bouton est la façon dont quelqu'un termine sa journée quand ils avaient l'intention d'aller déjeuner - une heure non rémunérée, ils ne reviennent pas et un Exception manquante sur le chemin. La carte re-peau à l'action sélectionnée en les mêmes trois couleurs utilisées par le graphique, dit combien de temps ils sont dans leur L'état actuel, et le point de nav rapporte maintenant lequel des trois états c'est le cas. Un état absent du serveur est lu comme "le booléen est tout ce que nous avons", pas en tant qu'Od: le lire comme OFF offrirait "l'heure de l'intérieur" à quelqu'un à mi-chemin pour le la longueur de la fenêtre de déploiement.
· SecurityService
Relage du vide de poinçon
Passthrough pour POST /punches/-id-/vided, la clé de suppression de l'éditeur et la clé de suppression de l'éditeur des machines à l'origine de la fusion de deux travées adjacentes. Même autorité que/correcte, et pour la même raison: un EMPLOI peut annuler leur son propre coup de poing, parce qu'un membre qui ne peut pas dire "que le double tap n'a jamais eu lieu" Je n'ai pas moyen de corriger un procès-verbal dont ils sont les seuls témoins. Ce qu'ils ne peuvent pas faire, c'est faire en sorte qu'il en compte - le vide atterrit sur une carte de temps qui se déplace encore à travers le la chaîne d'approbation, et la raison est obligatoire sur chaque voie. L'acteur est estampillé de la SESSION, jamais du corps; un acteur fourni par le corps est un signature fournie par un corps sur le salaire de quelqu'un d'autre. Deux essais, tirant dans des directions opposées, parce que ce service fonctionne anyRequest().permitAll() avec authentification à main motrice: il doit refuser un le poinçon de collègue sans jamais atteindre le relais, et il doit admettre le soumettre eux-mêmes ne disposant aucun droit.
· kamo-shared-library
Un poinçon peut être annulé sans être supprimé
Quatre colonnes annulables et une deuxième transition de écriture sur TimecardPunch. A void dit que le coup de poing n'aurait jamais dû avoir existé - un double tapotement sur l'horloge, un pause abandonnée, ou la couture entre deux périodes, l'éditeur de cartes de temps vient de fusionnée en une seule. Ce n'est pas une correction ("Cela s'est produit, à un autre time", qui laisse une ligne de remplacement) ni une suppression: remplacéByPunchId signifie "lire cette autre ligne à la place", et ici il n'y a pas d'autre ligne. La querelle survit, vidé, avec son auteur et sa raison à côté. Un salaire l'enregistrement que l'on peut faire oublier un coup de poing est exactement l'inadéquation qui change la charge que représente pour l'employeur l'affaire Anderson c. Mt. Clemens Pottery, donc le seul chose qu'un vide supprime est l'effet du poinçon sur le calcul. l'exécutionWorm() permet l'annulationAttes dans les mêmes conditions que la sous-est du tout à une valeur, une fois - et refuse un vide sans raison. La non-propulsante est en place délibérément impossible: réinsérer un poinçon signifie insérer un, ce qui laisse sa propre ligne et sa propre explication. n'est pas un commodité. La variante non filtrée est erronée pour décider de l'état d'horloge: a La ligne remplacée est maintenue son ORIGINAL instantané, donc un cavernement corrigé vers l'arrière laisse la ligne morte en dernier lieuAtUtc, et une rangée annulée reste la dernière jusqu'à ce que quelque chose de nouveau soit perforé. Soit on répond : « Es-tu sur l'horloge ? d'un procès-verbal qui n'existe plus. Séquence par la règle de changement d'entité: shared-lib installé localement, KI migration écrite et RUN contre 192.168.4.22:5433 avec les quatre ALTER n'est appliquée, et ce n'est qu'alors que ce service ne peut être fait pour qu'un service ne puisse être mis en place. Schéma non migré.
· InitializerService
Les colonnes vides sur hr-timecard-punch
Rétroviseurs de quatre nouvelles colonnes annulaires sur l'entité TimecardPunch. Un vide est ni suppression ni correction: il dit que le coup de poing n'aurait jamais dû exister - un double claquement sur l'horloge, une rupture abandonnée, ou la couture entre deux travées l'éditeur a fusionné en un seul. SUPERSED-BY-PUNCH-ID ne peut pas l'exprimer, parce que cette colonne signifie "lecture de cette autre ligne à la place" et qu'il n'y a pas d'autre ligne. Tous les quatre sont NULLABLEs, ce qui rend cela sûr sur une table peuplée: CockroachDB rejette ADD COLUMN ... NON NON NEUF à une table non vide et roule le une déclaration entière en retour, donc un marqueur vide NOT NULL serait connecté comme un AVERTIL, a sauté, et tranquillement absent. Ils vont PREMIER chez ce coureur, en avance sur les indices et les REVOKE il est déjà porte, pour la raison de l'existence de l'Ordond(0): le moment partagé-l mappe une colonne, chaque coureur qui charge l'entité de poinçon l'émission dans son SELECT, et a colonne-ajouter en retard n'est jamais en cours - un lecteur antérieur meurt sur "colonne n'existe pas" et enlève l'initialiseur. Exécuter contre 192.168.4.22:5433, tous les quatre appliqués.
· kamo-internal
Montrer le panneau d'intégration du marché lorsqu'il n'existe pas de marchés CRM
/chefs rendus de la grille de plomb avec une barre d'onglet de marché vide et désactivée pour un org qui n'avait jamais configuré un marché de la CRM. Il montre maintenant le même panneau d'intégration / des spectacles de commerce pour les marchés du commerce manquants - extraits à MarketOnboardingEmptyState de sorte que les deux restent identiques - pilotés par le plomb CRM les marchés des paramètres et des clients, et non des marchés du commerce, et en pointant sur l'onglet Marchés et champs CRM. Les étapes et les paramètres CTA ne sont montrés qu'aux membres qui peuvent gérer le CRM. Paramètres; tout le monde obtient la copie de rétro-retour existante.
· kamo-internal
Le graphique de la période, et une carte de temps que vous éditez en tant que brouillon
Remplace le délai d'un jour sur le toute la période de paie, et change ce à quoi on se sent édrait. Les pilules ne portent pas de texte. Ils avaient l'habitude de porter leur propre époque, et une étiquette est 60px de large, aussi long que ce qu'il décrive était - donc une pause de dix minutes et une Un service de quatre heures a tiré la même pilule, et la propriété d'un calendrier a été le tableau n'est pas (variante moyenne de la largeur) était la propriété qu'il avait jetée. Les deux fois maintenant vivent dans une infobulle qui nomme le début, la fin et l'intervalle entre et suit l'arête en étant traînée avec une lecture qui met à jour comme il mouvements. Les coins sont de 2,5px: assez pour enlever la dureté mécanique, pas Suffisamment pour arrondir une pilule de cinq minutes en lozenge. L'en-tête des heures toutes les heures, tourne chacun un quart de tour dans le sens inverse des aiguilles d'une montre Alors tous les vingt-quatre pas. Quatre étiquettes à six heures d'intervalle ne peuvent indiquer à qui que ce soit si une pilule commence à 9 ou à 10, ce qui est la seule question que l'en-tête est là pour répondre maintenant que les pilules ne sont pas étiquetées. Chaque jour de la période passe, y compris les jours qui ne se sont pas encore produits. Un graphique qui ne fait qu'attiser des jours avec des données ne peut pas montrer un coup de poing manquant, et le manque de poing est la chose la plus courante mal avec une carte de temps: l'écart est le la recherche, et une découverte nécessite une querelle doit apparaître. Les jours durent plutôt Qu'est-ce que l'on s'est mordu - "pas encore" et "personne n'a rien enregistré" sont différents Faits. Des traînées claquent à la minute. L'encliquetage de cinq minutes ne pouvait pas exprimer 9:02, donc un une horloge qui était de deux minutes ne pouvait pas être corrigée et chaque fois corrigé a acquis une rondeur qui se lisait comme une estimation. L'arrondissement est une politique de paie le moteur s'applique avec un rapport de neutralité derrière lui; un curseur ne doit pas appliquer un deuxième, invisible. Les touches fléchées nulgent d'une minute, Shift par quinze, Alt prend une fin d'elle-même - un pointeur ne peut pas exprimer une minute sur une piste où un minute est sous un pixel. Et l'édition est maintenant un projet. Traînée utilisée pour ouvrir le dialogue de raisons obligatoires à chaque libération: fixer un jour avec trois faux coups de poing signifie écrire trois explications, chacune une variante de "l'horloge était erronée", et une protection réelle sous la section Anderson c. Mt. Clemens Pottery transformé en boîte de personnes dactylographiées "correction" pour le faire disparaître. Une protection que tout le monde apprend à vaincre ne protège personne. Les éditants sont désormais librement organisés et une explication est recueillie sur sauvegarder - toujours obligatoire, toujours enregistré sur chaque punch le coup de ski de la touche, mais demanda une fois, quand quelqu'un sait vraiment ce qu'il a fait. Rien n'est écrit Jusque-là. Appuyant les changements: - app/lib/timecardGraph.ts prend en compte chaque décision prise par le graphe et l'appariement, clamage, claquement, déplacement instantané de sécurité DST - comme fonction pure, parce qu'un décision sur un record de salaire qui ne peut être vérifié qu'en faisant glisser quelque chose avec une souris est une décision que personne ne vérifie. 34 essais. - fetchRange retombe à une lecture par jour sur un 404 de sorte que l'onglet n'est pas cassé pour Quiconque le charge entre le déploiement du service de sécurité et celui-ci. - les allers-retours sur le terrain à l'autre à l'heure traversée de l'horloge murale locale. Il a rendu un UTC trancher en une entrée date-time local et analyser le résultat en tant que local, donc chaque visite sur le terrain a déplacé l'heure par la zone décalée en silence.
· SecurityService
Relayer la plage de la période de l'éditeur
Passage pour GET/members/-id-/gamer, le graphe de période lu. transmis uniquement lorsqu'ils sont présents afin que TimecardService puisse résoudre le salaire du membre période - l'avancement "de l'" et "à" se lierrait à des cordes vierges en aval et vaincre silencieusement ce défaut pour chaque org avec un calendrier de rémunération. L'identité est vérifiée avec resolveRole et pas de droit, exactement comme le fait le jour déjà. Les deux exigences s'enclenchent dans des directions opposées et une porte à droite un seul d'entre eux: il ne doit pas devenir un moyen de lire les heures d'un collègue, et il doit admettre le sujet lui-même en NE RIEN, parce qu'un membre dans la Le niveau RESTI-RIESTIRTED n'a aucun droit et a toujours le droit à son le propre dossier. TimecardRangeAuthTest couvre les deux directions plus le bâtiment de la requête, parce que ce service fonctionne anyRequest().permitAll() avec aiguilles à la main une cartographie qui oublie son contrôle est accessible à partir de l'internet public à travers La wildcard d'APIService est en avant.
· kamo-internal
Élever une conversation de soutien quand quelqu'un y répond
Fermer une fenêtre de soutien ne laisse pas la conversation, mais elle a été traitée comme si c'était le cas. ChatNotificationListener est revenu tôt sur chaque SUPPORT-TICKET notification - correctement, puisqu'un ticket ne doit pas ouvrir une fenêtre de discussion en clair, mais il a laissé son soutien sans réouverture en direct. Quiconque a fermé son panel, la plupart souvent la personne qui a demandé de l'aide une fois qu'elle avait demandé, tout simplement n'a jamais vu le réponse. Il ouvre maintenant la fenêtre de support à la place, adressée par le ticket id le la notification transporte; l'outil stocke des dedupes sur ticketId, donc une fenêtre déjà en place est ciblé plutôt que dupliqué. AutoOpenUnreadSupportChats est la moitié durable, pour une réponse qui est arrivée pendant Ils ont été signés - la poussée en direct est la NATS centrale sans rejeu. Délibérément distinct de AssignedTicketOpener: que l'on répond "ce travail est maintenant le vôtre", Celui-ci répond "quelqu'un vous a dit quelque chose", et pour un demandeur le premier Il ne se passe jamais du tout. Les deux reconnaissent par le même enregistrement auto-ouvert Un chemin de chat utilise, donc un deuxième appareil ne rejoue pas ce que le premier a montré. ChatsList prend maintenant ticketId directement de la trame d'activité. Synthèse d'un la ligne de soutien sans une ligne a produit une ligne qui ne pouvait pas être ouverte, de sorte que la liste avait pour jeter le cadre et relire toute la page pour l'obtenir.
· MediaService
Une conversation, plusieurs mains - joindre sur ouverte, nommez chaque message, rouvrez sur une réponse
Un ticket d'assistance est travaillé par quiconque aide, et pas seulement par qui que ce soit. actuellement estampillé avec. La cession décide qui est offert et à qui liste il apparaît; il n'a jamais été censé être une serrure sur la conversation. L'ouverture d'un billet se joint à sa session médiatique. Avant, un agent qui a ouvert un Un ticket de la file d'attente qui ne leur a pas été attribué pouvait taper dedans - rien a rejeté le message - mais ils n'étaient pas membres de la session, de sorte que La conversation n'est jamais apparue dans leur Chats -, le soutien, aucune réponse n'est jamais parvenue et le demandeur "est mon agent ici" ne les comptait pas. Ils étaient parler dans une pièce où ils n'étaient pas. Qui peut adhérer est la même population que peut déjà voir le ticket dans la file d'attente: les gens déjà dans la conversation, plus ACCEPTATION-SUPPORT-TICKETS ou MANAGE-SUPPORT dans l'org attribué. Tout le monde est maintenant refusé - ce point d'extrémité précédemment servi n'importe quel billet sur la plate-forme pour tout membre authentifié qui pourrait deviner un UUID, entre les organisations, et le join gate aurait élargi cela depuis la lecture d'une conversation d'un étranger à être écrit dedans. Chaque message porte maintenant un nom. nderName a été lu tout droit Member.usernameAlias, un surnom facultatif qui n'est pas réglé sur presque tous les membres, de sorte qu'il a sérialisé comme nul et le chat a rendu des messages sans attribution à tous. C'est le pire dans un ticket d'assistance, où plus d'un agent peut être réponder et le client n'a pas d'autre moyen de dire qui leur parle. MemberDisplayNames, déjà utilisé ailleurs dans ce contrôleur, retombe à le vrai nom. La même lecture brute était la mention de l'agent attribué, le ticket les acteurs de l'histoire, les acteurs de l'événement système, le avis de disponibilité des agents et tableau des rapports. Une fenêtre fermée ne signifie plus une réponse perdue. La notification de message entrant porte le ticket id, afin que le client puisse soulever la conversation qu'il dit vous sur, et /sessions/support/auto-open est la moitié durable pour une réponse qui Arrivé pendant que vous étiez déconnecté - le correspondant du message de assignés-nonoubutés, qui ne couvraient que le travail changeant de mains et donc jamais a tiré pour la personne qui a demandé de l'aide. Tests: ChatListNativeAliasCaseTest brosse la colonne des requêtes d'alimentation alias, que rien d'autre ne peut attraper - le mode de défaillance est un nul silencieux, pas un une erreur de type ou une exception. SupportAutoOpenHqlTest parse la nouvelle requête contre le modèle d'entité réelle, puisque Spring Data ne valide qu'un «Query au démarrage» et Celui-ci vit dans la bibliothèque partagée, où une faute de frappe prend tout service.
· kamo-internal
Onglets de liaison, un membre de travail et un onglet complet
Chaque onglet sur /account/view/'id' est un vrai itinéraire maintenant '/members, /history et le le repos sont des liens que quelqu'un peut envoyer, signet, ou atterrir. Vieux liens redirecteurs à l'appariement. Chaque onglet charge ses propres données, donc l'ouverture d'un compte n'est plus attend sur les données de chaque onglet avant d'en montrer l'une. Add Member a ouvert un toast "à venir". Il ouvre maintenant le même cueilleur le Responsable les utilisations sur le terrain, la fouille de chaque membre de l'organisation plutôt que le seul personnel la personne qui paie pour un compte n'est souvent pas sur la masse des salaires. Les gens déjà sur le compte rester visible mais inconçu avec la raison, parce qu'un nom qui est Il se passe simplement de côté d'une recherche se lit comme un cueilleur cassé. En tant queprimacle et enlever travailler aussi, supprimer derrière une confirmation qui dit ce qu'elle fait et ne supprime pas. Le tableau et la marque de sélecteur sont le genre de personne chaque ligne. Sans cela a membre et un membre de l'équipe lisent à l'identique et la liste implique discrètement tout le monde Cela fonctionne ici. Les lignes membres rendent également tout à l'heure et non: le type revendiquée des clés le point d'extrémité n'a jamais été envoyé, de sorte que chaque nom a montré "---" et rien ne pouvait être supprimé la ligne id, les besoins d'appel de retrait étaient l'un des champs inventés. Le panel historique du point de vue principal devient EntityHistoryPanel, partagé avec le nouveau Compte Historique de compte: mêmes filtres, même radio-messagerie, mêmes états vides. Qu'est-ce qui reste avec chaque appelant n'est que l'endroit d'où provient l'alimentation et ce que signifie ses ids.
· InitializerService
Créer un compte-nent-hISTORIE
Rétrovise l'entité comptable historique dans la bibliothèque kamo-shared. Écrit explicitement plutôt que de la laisser à ddl-auto parce que la valeur par défaut est importante: ID et DATE-CREATED Porter des bases de données par défaut donc un insert SQL simple fonctionne sans les nommer, qui Le DDL généré par Hibernate ne l'est pas. Aucune clé étrangère, à dessein - la diagraphie dépasse ce qu'elle décrit. Un compte peut être fusionné et un membre peut quitter l'org sans que la suppression n'est défaillante ou l'enregistrement de ce qu'ils ont disparu avec eux.
· SecurityService
Encrits de l'historique des comptes, lignes de membres réelles, répertoire de tous les membres
Le point de vue du compte rendu peut maintenant dire ce qui est arrivé à un compte rendu et qui y est. - Chaque mutation sur le compte enregistre l'historique de l'historique: créer, éditer le champ, soft supprimer, fusionner (qui déplace la chronologie du perdant sur le survivant plutôt que de le laisser tomber), les adresses, les notes et le membre ajouter/les voies primaires. Les clients de l'Egle/souris/history et/history/filters reflètent les critères d'évaluation en plomb une demande, car un composant du site interne lit les deux. - getCustomerLes membres retournent ce qu'une ligne membre doit être rendue: l'affichage nom, avatar, titre du poste, et isTeamMember. Les deux types de personnes appartiennent à un compte - celui qui paie n'est souvent pas sur les états de paie - et sans le drapeau les deux sont lues à l'identique. - mise à jourCustomerLes membres acceptent les ids en tant que chaînes (un passé unique-rowid() MAX-SAFE-INTEGER n'est pas arrondi au contraire), efface l'élément principal lorsque le la ligne enlevée est la leur, et ne mutifie plus l'orphelinSmod-mappé la collection à côté du dépôt écrit. - La recherche d'annuaire prend tout son champ, sur chaque membre de l'ordre plutôt que la liste du personnel, et chaque ligne dit quel genre c'est le genre. Le cliquet d'extrémité apprend refus Sans autre chose: il charge la session et retourne 401 sans un, ou 403 sans le droit, donc un manipulateur qui s'ouvre avec lui a fait strictement plus que résoudre un appelant. Vingt rubriques à l'inclusion n'ont été listées que Parce que le scanner ne pouvait pas voir le garde qui était déjà là.
· kamo-shared-library
Une piste d'audit pour les comptes et un annuaire qui comprend des non-fonctionnaires
COMPOUNT-HISTORY enregistre ce qu'il advient d'un compte comme le cas de LEAD-HISTORY enregistre ce qui arrive à une sonde - délibérément les mêmes colonnes, parce que l'intérieur le site rend maintenant à la fois à travers un composant et une deuxième forme aurait été forcée un deuxième. - AccountHistory - repository - AccountHistoryService: snapshot/diff sur un champ registre, plus des événements ponctuels pour les choses qui ne sont pas des éditions de terrain (un membre l'adhésion, l'arrivée d'une avance ou d'un ordre, d'une fusion). L'enregistrement n'est jamais lancé: un audit écrire qui échoue ne doit pas entraîner l'opération d'audit. - AccountHistoryFieldRegistry est le seul endroit où un champ suivi est déclaré. Les totaux de course sont délibérément absents - ils se déplacent comme un effet secondaire des ordres, qui ont déjà leurs propres événements. - LeadService écrit maintenant la moitié d'un lien principal du compte. Fixer une issue à une le compte est un acte en deux délais, et l'enregistrer dans un seul moyen, selon ce que La page que vous regardez est celle qui ne le mentionne pas. Une avance a bougé entre Les comptes écrits aux deux. - Dossiers de services ORDER-PLACÉE / Dircotonnée / D'UNLINKE / ÉTAT-ÉTAT-ÉLÉRIMENTS contre le compte d'achat. Silencieux lorsqu'une commande n'a pas d'acheteur. - - la recherche d'annuaire uniquement sur le personnel élargi à chaque membre d'un groupe, pour les cueilleurs qui ne choisissent pas un collègue. Conformé avec TeamMemberRepo.search Terminage pour le mandat, y compris Équipe prise en charge de l'équipe qui garde le titre de l'emploi et le département consultable pour le personnel Seul ne peut parler au nom de lignes ayant un statut professionnel, Ainsi, les membres sans passage d'un membre au lieu d'être interprétés comme "non employés". - Membre.getPhoneExtension: getPhone() aplati au numéro, en laissant l'extension inaccessible de l'extérieur de la classe.
· kamo-internal
Confirmez une horloge en-cignotante avant d'écrire le poinçon
L'horloge navée a perché directement le clic. Tous les autres contrôles dans cette barre est idempotent ou trivia infaut; un coup de poing est un record de salaire qui, par la suite seul un administrateur HR ayant une raison écrite obligatoire peut corriger - et le bouton se trouve un pixel de Logout. Il élève maintenant TimecardPunchConfirm Dialog, construit selon le standard de NewSupportRequestPopup et délibérément pas une copie de celui-ci: cette carte est une alerte qui interrompt, il respire, refuse sa toile de fond et tire ses boutons en retard. Celui-ci a été demandé par un clic, donc il brasse à la fois et se ferme sur Escape et sur le fond. Vert pour, ambre pour l'extérieur, parce que les deux résultats doivent être raconté à part avant qu'un mot ne soit lu. Sa pièce centrale est une horloge rottant vers la SECOND, et la copie dit carrément que le temps enregistré est le moment de confirmation plutôt que le moment sur l'écran en décidant - le point étant que l'hésitation est libre et rien n'est écrit jusqu'à ce que vous le disiez. La première coche est alignée sur la deuxième frontière, donc la lecture concorde avec toutes les autres horloges de l'écran du membre au lieu de Atterrir où que le clic le clic le fasse. Comportement qui a changé avec : - la clé d'idémpotency est frappée lorsque le dialogue OPENS et réutilisé pour un nouvel essai. Les clés de per-déposer sont le bogue qui empêche: une demande qui est temporisée pourrait bien être ont atterri, et se réessayer sous une nouvelle clé est un deuxième coup de poing sur un record de salaire. - l'action est gelée à l'heure ouverte, donc une enquête des années 60 retournant l'horloge en dessous la carte (un coup de poing de leur téléphone) ne peut pas changer la question à mi-réponse. - le flip optimiste a disparu. Il existait parce que le coup de poing a tiré le clic; le membre regarde maintenant une carte qui reste jusqu'à ce que le serveur réponde, donc a Deviné, l'état ne serait qu'une chance de montrer le mauvais. - un coup de poing raté maintient la carte ouverte et le dit. En renversant silencieusement une icône est aucun moyen d'apprendre un coup de poing qui ne s'est pas produit - cette surface quelques jours plus tard en tant qu'exception de frappe manquante sur la carte de temps. - la commutation d'identité (god-mode sudo, commutateur de session) laisse tomber une confirmation ouverte, qui, autrement, écrirait le coup de poing du membre précédent contre le nouveau.
· kamo-internal
Filtre d'état segmenté à la place du sélection
En attente/complète/Tous sont trois pairs courts qui s'adaptent sur une ligne, donc a d) Contamirait deux d'entre eux derrière un clic et a dépensé une étiquette et un 170px bien de ne rien dire. Un choix fermé ne peut pas non plus répondre "m. Tout?" sans l'ouvrir. SegmentedFilter est partagé: exclusive ToggleButtonGroup, accent pris en tant que CSS var de sorte que chaque surface conserve son identité, et la numérité qui n'est pas exclusive les mains de mode à l'arrière lorsque le segment sélectionné est re-cliqué est jeté - a le filtre a toujours une valeur. La formation attribuée l'obtient aussi, en --marque de formation: les deux panneaux partagent une barrette, et l'un d'eux le fait de conserver une liste déroulante se lirait comme deux produits différents.
· kamo-internal
Faites glisser une navigation surpeuplée au lieu d'écraser ses options
L'épinglage d'options plus qu'une nava peut montrer que les carreaux sont écrasés par forme: les deux bandes étaient des boîtes brutes de trop-plein et les carreaux sont des enfants flex. flex-rétrécissent de leur propre, de sorte que la barre supérieure les déformait (et cachassait son barre de défilement droit, déglutition d'options sans signe qu'elles existaient) tandis que rail a dessiné une barre de défilement de 12px sur sa propre pente. Les deux navs rendent maintenant leurs options mobiles par l'intermédiaire de NavOverflowScroller: carrelage ne gardent leur empreinte, leurs flèches d'extrémité et un fléchissement de bord en douceur que sur le le côté qui a encore quelque chose à atteindre, et la bande peut être paged, tenue, rougir, jeté avec de l'élan, ou traîné. L'option de la page actuelle est la suivante: redessiné à l'arrivée, et chrome fixe de la barre supérieure non partage plus longtemps le déficit avec celui qui peut l'absorber. Traîner une option et glisser la bande sont le même geste sur un surpeuplement nav, donc une nav surpeuplée se réarrange derrière une courte prise. Qui tient Relève la souris du dnd-kit plutôt que d'utiliser son «retard» contrainte: la contrainte de retard s'active sur le temporisateur seul et dnd-kit supprime le clic de toute presse qui atteint l'activation, qui aurait ont arrêté chaque clic légèrement lent sur une option de navigation.
· kamo-marketing
Indexer les pages de détail de la collection dans 19 langues supplémentaires
La synchronisation terminée, donc les pages de détail de 2 400 dollars qui n'étaient pas indexées pour avoir La copie publique anglaise a maintenant de vraies traductions et peut être indexée. Mesurée dans l'ensemble des 21 localités: chaque terre comprise entre 0,0 % et 8,8 % de la collecte valeurs identiques à l'anglais, sauf sw et ta à exactement 100,0 % n'ont pas de fournisseur, donc TranslateService a renvoyé le texte source et l'exécution L'anglais a écrit l'anglais sous l'apparence du succès. COLLECTION-CONTENT-LOCALES est donc dérivé, non listé: tous les cas de publicité Ensemble de non-prescteur. sw garde son noindex sur les pages de détail uniquement son paquet de base est authentique Swahili, donc ses pages statiques restent indexées - et ta n'obtient aucune directive sur les robots, parce qu'elle est déjà canonique à l'anglais l'origine et l'empilement de l'index sur le dessus enverrait deux signaux contradictoires concernant un contenu.
· kamo-shared-library
Ruplage par membre en retard pour la matrice de conformité
La matrice de l'aperçu des ressources humaines est consacrée à la base de données sur les résultats de la ligne de gestion des ressources humaines, mais sur le rapport, le rapport, le rapport, le rapport d'information, le document intitulé « les rouages de formation livrés avec ce champ codé en dur à 0 - une branche qui pourrait jamais être pris, donc ces deux domaines ne pouvaient jamais montrer qu'ambre ou vert et "tried worst-first" dégénère. L'histogramme (de statut, de statut) ne peut pas y répondre: il ne porte pas de dueAt. Donc chaque le référentiel gagne un nombre groupé dont le prédicat est caractère-pour-caracter le Un dans countOverdueForOrg, plus GROUP par équipeMemberId. Le partage du prédicat est Qu'est-ce qui rend les chiffres par membre somme au nombre d'orges figurant ci-dessus eux. Méthodes de demande uniquement. Aucune modification d'entité, pas de DDL, la version reste 1.5.0. Les appelants ne cessent de posséder l'ensemble ouvert, et les deux ne sont PAS les mêmes: laissez-passer légal ÉTATS-OPEN, cartes d'accès à la formation - ÉTATS REMINABLES. AVAITING-GRADING est ouvert mais ne doit rien au membre, et le compter qu'il est en retard reproduireait le droit L'AVAITING-OTHERS bug du module qui a dit aux membres à temps qu'ils avaient des semaines de retard. pour toujours.
· kamo-internal
Construire l'onglet Vue d'ensemble en tant que rapport sur les quatre autres
Console de notification pleine largeur: lecture de mât, piliers à quatre onglets, le registre des besoins d'attention, la matrice de conformité de la main-d'œuvre et une activité le rail. En lecture seule - chaque action est un lien profond vers l'onglet propriétaire.
· kamo-internal
Vue d'ensemble du registre de l'attention, de la matrice de conformité et du rail d'
useMemberNames sources /api/security/members/names plutôt que le mémoire deviné .../forme de l'org-config: l'org-config ne revient jamais une liste de membres (confirmée par la lecture) LegalPackageDialog.tsx et TrainingAssignDialog.tsx, qui ne sont analysés que les départements/les titres d'emploi à partir de celui-ci), tandis que /members/names est le point d'extrémité déjà construit pour la résolution d'id-to-name et Il a déjà utilisé la même manière par mortgageAppsApi.memberNames().
· kamo-internal
Vue d'ensemble de l'entête de mât et des piliers des quatre ongle
· kamo-internal
Vue d'ensemble du crochet de données et des primitives visuelles partagées
useHrOverview fait la fréquentation et les résumés des documents avec allSettled so one service mort ne dégrade que ses propres sections; il saute entièrement pour sections visibleVoirSection() indique que le membre ne peut pas voir. Le primitives (CountUp, ProgressRing, StackedBar, StatePip, Figure, SectionShell) sont les éléments de base partagés que les sections d'aperçu rendent avec, toutes les mouvements gardés à l'aideReducedMotion et EASE-HOUSE.

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