Changelog
Ce qui est nouveau.
Chaque amélioration apportée à la plateforme, à mesure qu'elle est livrée.
· kamo-internal
Dessiner les départements comme un diagramme d'orgg avec un cueilleur de parents
L'onglet départementaux était une liste plate, donc un og avec Opérations et Customer Success . L'intégration n'avait aucun moyen de le dire et n'avait aucun moyen de le voir. Ajouter/édité obtient un département des parents sélectionné, placé avec le nom parce que la filiation est structurel plutôt qu'opérationnel. Il offre l'arborescence dans l'ordre et désactive le département lui-même plus tout sous lui -- ce sont exactement les choix Le serveur rejette, et offrir un choix qui échoue toujours est pire que de ne pas l'offrir. La liste devient un rachis de la colonne vertébrale. Une colonne ferroviaire par niveau, chacune exactement une icône puce large, donc le coude d'une rangée atterrit au centre de la puce de sa société mère au lieu de c'est; un dernier enfant s'arrête au coin plutôt que de courir, qui est ce que rend la fin d'une branche visible sans compter les indentations. Les cellules ne sont pas verticales. rembourrage - les rails doivent atteindre les deux bords ou la ligne se brise à chaque rangée. La profondeur lit à travers la teinte et le poids de type, pas la taille de la puce, puisque les puces uniformes sont ce que rendre la géométrie ferroviaire exacte. Les têtes de colonne deviennent des étiquettes d'opérateur sur une barre givrée, remplacer le blue-50/indigo-50/gris-900 codifié en dur qui a ignoré le jeton de marque. La construction d'arbres vit dans le départementTree.ts donc les cas maladroits ont un endroit où être test: un parent supprimé de sous-un enfant rend au niveau supérieur plutôt qu'à un niveau supérieur la disparition, et un cycle qui a atteint le tableau rend au lieu de suspendre la page. Les sauvegardes n'abandonnent maintenant pas l'explication du serveur. Le corps 4xx était en train de tomber en faveur de la ligne de statut, qui aurait tourné "un département ne peut pas être son propre parent" dans "Mauvaise demande".
· kamo-shared-library
Laisser un département siéger dans un service de tutelle
Les départements étaient une liste plate, donc un diagramme d'orge avec Opérations et succès clients L'intégration n'avait aucun moyen de le dire. Le Département acquiert un autoréférencement facultatif parent; nul signifie toujours niveau supérieur, qui est ce que chaque rangé existant reste. La colonne FK columneDefinition - "UUID". À gauche, Hibernate copie définition de la clé primaire référencée -- UUID DEFAULT gen'random'uuid() -- sur le FK, donc un ddl-auto écrase un DEPTS remplit chaque rangée avec un parent aléatoire ne correspond pas à un département et à l'ADD CONSTRAINT qui suit échoue. L'affectation des parents est validée dans le service, pas seulement le cueilleur: monoparent; cycles (le retour à partir du parent proposé ne doit pas atteindre le département étant déporté), un parent dans une autre organisation, et une id inconnue sont tous refusés. La suppression d'un département fait la promotion de ses enfants à l'égard de ses propres parents plutôt que les échouer derrière un pointage pendant. - Prenez maintenant leur demande DTO au lieu de huit les arguments de position, c'est ce qui rendait l'ajout d'un neuvième évitable.
· kamo-internal
Caussez les champs To/Cc/Bcc à trois rangées, puis faites défiler
Les champs de destinataire dans la fenêtre de l'outil de composition étaient une seule ligne nowrap qui devait être traînés latéralement pour lire, et la fenêtre est de 360px de large et non resizable, donc un tiers l'adresse était déjà hors de vue. Ils s'enroulent maintenant: le champ croît d'une rangée à la fois en jetons remplir la largeur, s'arrête à trois rangs, et défile verticalement celle avec un mince la barre de défilement. L'ajout d'une puce suit l'entrée vers le bas de sorte que le caret reste visible. Le capot de rangée est un pixel max-hauteur, calculé à partir de la hauteur de la puce mesurée de sorte qu'il est toujours coupe sur une limite de rangée - un compositeur maximisé et une police de navigateur à l'échelle l'éteint. L'étiquette et le bouton de contact broche à la première rangée plutôt que de flotter au milieu d'un bloc à trois rangs. Dompure l'accessoire de mode sans signification et le coup de rouleau horizontal pour lequel il existait.
· kamo-internal
Rendre la création d'une orge survivable et offrir chaque option de marque à l'avant
L'assistant pourrait échouer un client d'une manière que rien à l'écran n'explique, et il a demandé un fraction de ce que les paramètres, le comportement et l'étiquetage exposent. Fiabilité de la création: - Les téléchargements de logos et de fonds ont été téléchargés à /api/imagerie/upload avec assocType "ORG-LOGO" - pas un ImageAssocType, sur un critère d'évaluation dont l'ascType est une ordinale numérique. L'analyseur syntaxique Il a avalé l'échec et les a classés comme MY-DOCS, de sorte que la marque n'a jamais existé en silence. Ils sont maintenant utiliser les points d'extrémité de marque d'orgueigne réels, un appel par créneau de logo. - Le téléphone/e-mail du créateur PUT ne pourrait que 403 : ce point d'extrémité exige l'orge de session à égal l'ordre du membre, et la session est toujours sur le parent. Il s'est déplacé sur la charge utile de création. - Les avertissements post-création ont été recueillis, transmis à /setup/dns en tant que paramie de la requête, et lus par Rien. /setup/dns les rend maintenant. - Le sous-dévisif n'a jamais été revalidé, ce qui a permis de dévier le nom après avoir atteint Review. a Titre NULL et alias. - derivedConfigType lire les plages d'âge du type de branche au lieu de celle sélectionnée, l'apposition d'appose KIDS-CLUB sur des entreprises adultes - qui désactive le recouvrement du courrier électronique et du compte téléphonique. - Les variantes de couleur n'ont jamais été obtenues, les entrées téléphoniques n'ont pas été liées à VARCHAR(20), une périssée. la tranche d'âge 403'd sur soumission, et un domaine pris est apparu comme un 500 nus. Comportement - Étiquetage de la parité - tout sauf les deux identifiants hypothécaires: site web, adresse électronique de contact d'entreprise, identité de marque blanche, les sept profils sociaux, les huit étiquettes personnalisées avec leurs drapeaux hérites de la mère, langue et monnaie par défaut, enorgage privé la visibilité, le filigrane de fond, les trois sélecteurs de base de marque et les quatre fentes de logo. Deux nouvelles étapes (étiquettes, Préférences); le fuseau horaire passe aux Préférences à côté de ses frères et sœurs. Tous les mandrins sur la charge utile de création, pas les appels de suivi: PATCH /org/-id-/branch-titles a le même contrôle de session-org qui a cassé la mise à jour du membre, et une transaction signifie les réponses soit toutes les terres, soit n'en ont pas. Orientation et skippabilité: Chaque entrée a un texte d'aide au sol de ce que la valeur fait réellement. Uniquement les types et les éléments de base les champs requis, et qui est maintenant indiqué sur l'en-tête de marche, dans le pass, sur la barre nav, et dans la barre latérale - avec "Skip for now" à chaque étape optionnelle. En outre: les réglages ne détruisent plus les extensions de téléphone d'orgg sur économiser, /api/generate-background n'est pas un mandataire facturable non authentifié, et l'org-by-id proxy cesse de corrompre int64 ids.
· kamo-internal
Envoyez le bouton de retour de l'éditeur d'où le membre est venu
L'éditeur de papier peint était une impasse - pas d'issue, mais le nav rail. Les deux entrées Points (le puce de la barre supérieure d'origine et le raccourci d'en-tête du profil du membre) sont maintenant timbres leur origine sur le href, et l'éditeur résout cela en une pilule du dos dans le Sera rangée: retour à domicile au tableau de bord, un profil revient au membre dont il était la page, en utilisant l'id timide imbiblé plutôt que de supposer qu'il est le Propriétaire du papier peint. Une URL nue sans timbre retombe sur le profil de ce membre. fromId est vérifié par rapport à la forme opaque-id de sorte qu'une URL artisanale ne peut pas tourner la un bouton dans une redirection arbitraire. Le lire a besoin d'utiliserSearchParams, donc la page prend la limite de Suspense requise par le routeur d'App.
· kamo-internal
Montrer une boîte aux lettres primaire sous le nom de profil de son membre
Une boîte aux lettres détenue comme la principale principale de quelqu'un est l'adresse de cette personne, donc la suggérer en tant que "bureau de vente" - tout ce qu'il était étiqueté quand il était provisionné - nomme la boîte aux lettres à la place de la personne. La ligne auto-complet et le destinataire La carte lisait le même champ, donc les deux avaient tort ensemble. Le répertoire prend maintenant le nom de premier cycle avant le nom d'affichage de la boîte aux lettres, et Ad attribuéeManouage pour une boîte aux lettres personnelle, dont le seul cessionnaire est son propriétaire. Les alias et les boîtes aux lettres partagées n'appartiennent à personne en particulier et ne les conservent. leur propre nom. La préférence est une liste par source, donc un backend qui n'a pas Pourtant, le champ a été expédié retombe simplement pour displayName.
· EmailService
Nommer une boîte aux lettres primaire après le membre qui la détient
Une boîte aux lettres que quelqu'un détient comme principale est l'adresse de cette personne, donc le présenter sous quelque boîte aux lettres que soit l'étiquette au moment du déchet "Sales Desk" pour une boîte qui est simplement celle de Jane Doe - inconnome la personne dans le composer automatiquement et sur la carte destinataire. listeMailboxes porte maintenant - pour le membre avec l'affectation primaire, que l'annuaire d'adresses d'orge préfère à la le nom de la boîte aux lettres. Seul le titulaire principal compte: une boîte aux lettres quelqu'un n'a pas accès à leur propre nom, et les paramètres table continue de rendre displayName dans les deux sens. La résolution du nom sort de AccessibleMailboxService pour un assistant partagé Les deux surfaces ne peuvent donc pas être en désaccord sur ce que l'on appelle un membre.
· kamo-internal
Enregistrer les pages de commission dans les paramètres nav et page de destination
Les onglets existaient, mais rien ne leur était lié. l'exemple de mise en garde déjà dans ce repo: une vraie page sans carte, pas d'onglet et pas d'entrée de la navigation, accessible uniquement en tapant l'URL. Comptabilité et finances est sa propre section et sa propre rubrique nav plutôt que deux autres écrits sous Mon Compte. Les sous-options ne portent pas leur propre porte, donc pliage ces aurait forcé la porte du compte ouvert aux détenteurs de fonds uniquement et les aurait montrés quatre liens qu'ils ne peuvent pas utiliser - le même raisonnement qui empêche le phi-compliance out de le sujet de sécurité. Avec les onglets financiers dans leur propre section, le Mon Compte gate retourne à CONFIGURE-SYSTEM seul. La carte personnelle des commissions est subordonnée au fait que le téléspectateur est membre de l'équipe. en miroir de la porte de la languette. Une carte qui ouvre un onglet qui ne rendra pas est pire que pas de carte.
· kamo-internal
Onglet des commissions des membres et les deux onglets du compte financier
Appenclement des membres (auto-auto, membres de l'équipe uniquement): équilibre et grand livre, mandaté les possibilités, la mise en place des paiements et les retraits. Racleurs de la fixation des comptes Stripe et le processeur de la Commission. L'onglet membre est fermé estSelf et le membre TYPE, jamais sur un droit. checkRetourne vrai pour tout en mode Dieu actif, et la page canViewAutres membresCompte RUPs en droits indépendants, y compris - donc une porte basée sur la droite ici montrerait une le solde du membre et les coordonnées bancaires de toute personne détenant l'une d'entre elles. "Mes paiements" et non "Ma banque". Les membres n'ont presque jamais de compte Stripe et ne peuvent joindre l'un s'ils le font : OAuth read-write refuse les comptes contrôlés par un autre plate-forme. La plate-forme de leur employeur crée un compte de bénéficiaireonly-remboursement et ils vérifient leur identité. Le panel indique ce que Stripe collecte, que Stripe a pas de relation de soutien avec eux, et cet argent prend environ 6 à 8 jours civils pour arriver - aucun de ceux qu'ils devraient devoir découvrir par la suite. Organization Stripe est une liste de contrôle guidée, pas un formulaire, parce que Stripe n'a pas d'API pour devenir une plateforme Connect. L'étape 6 porte un avertissement complet plutôt qu'un indice: un og dont l'équilibre Stripe paie automatiquement perd le flotteur de la commission avant le taux de licenciements, et chaque transfert échoue alors à l'insuffisance des fonds sans évènement Stripe pour l'expliquer. L'argent est une décimale STRING bout en bout et n'est jamais numéro()-ed sauf pour choisir un couleur. Les montants négatifs sont réels - une commission annulée devient un tirage au sort - et le la base de code n'avait pas de convention pour en montrer une, donc ils rendent dans l'erreur ton avec un moins explicite et une puce Draw. Sub-tabs se synchronise avec ?sub- ; SettingsView possède ?tab et le réécrit sur chaque ongle de changement. La voie BFF existe parce que CommissionService n'est que ClusterIP - sans elle L'ensemble de la fonction 404 est bien que chaque service soit sain et que chaque construction soit verte.
· kamo-internal
Dossiers sur lesquels vous pouvez agir, envoyer vous pouvez sélectionner
Cliquez avec le bouton droit sur n'importe quel dossier pour ses actions. L'en-tête du menu n'est pas chromé il nomme le dossier et montre son live non lu/total, donc Mark all read et Le dossier vide peut être jugé avant qu'il ne soit cliqué plutôt qu'après. Les actions qui ne peuvent pas s'appliquer sont indiquées désactivées avec la raison (rien non lue, dépliant vides, les dossiers intégrés gardent leurs noms) au lieu d'être Videz et Supprimer l'itinéraire par le biais d'une confirmation construite pour le chrome de courrier. Le dialogue de confirmation MUI à l'échelle de l'application exige un mot de défi tapé temps; un défi sur une action récupérable ne forme que les personnes à taper par des avertissements. Donc la porte est réservée aux deux qui détruisent le courrier . . . . . . . . . . . . . . . . . . . . . . . . . . conséquences exactement: tout le reste se déplace vers Trash et le dit. Les dossiers sont réordonnés par traînée, par membre, stockées dans les préférences ui partagées le tableau pour que l'agencement les suive à travers les dispositifs. L'ordre est un liste forfaitaire de noms de dossiers: les frères et sœurs ne sont comparés que les uns aux autres, Donc un ordre de liste à chaque niveau, et un dossier qui est renommé ou déplacé retombes à sa position naturelle au lieu de corrompre un arbre. Chutes tous les niveaux sont ignorés - ce qui serait un retour par retour sur le serveur de courrier, Ce n'est pas une sorte. La sélection du courrier fonctionne désormais comme le fonctionnement de la sélection partout ailleurs: shift-click pour une plage à partir de l'ancre, cmd/ctrl-click pour en choisir un, Et l'avatar se transforme en case à cocher sur le vol stationnaire plutôt que de taxer chaque rangée avec une colonne de la case à cocher permanente. Les actions circulent dans une barre qui flotte sur la liste et les feuilles avec la sélection, au lieu d'une bande coincée dans le chrome qui a poussé la liste vers le bas sur chaque tique. Aussi: le Fixation du pied de page des dossiers est parti - le bouton à côté des dossiers Un en-tête crée déjà des dossiers - et le bouton de rafraîchissement est enfin carré. CSS ne pouvait pas le faire en soi: dans une ligne flexible, la taille principale résout avant l'alignement-soiture: s'étire donne à l'article sa hauteur, donc l'aspect-carré avait pas de hauteur pour dériver une largeur. Il mesure plutôt la querelle.
· EmailService
Agissez sur un dossier entier, pas seulement la page que vous avez défilée
Marquez tous les dossiers en lecture et en vides sont des opérations à l'échelle du dossier, le client ne peut pas exprimer par la mise en lots des uids: il ne tient jamais que la page qu'il a draché, donc un pli avec 4 000 non lus prendrait 80 aller-retour et Il manque encore tout ce qu'il n'a jamais chargé. FolderManager gagne setFolderSeen et emptyFolder. Le chemin IMAP bascule drapeaux dans un appel côté serveur et ne touche que des messages qui en fait ne sont pas d'accord avec l'état cible - un ensemble de couvertureSuper les drapeaux reformulent les drapeaux Un serveur a déjà et fait que chaque client connecté resynchronisé ne sert à rien. Graph n'a pas d'équivalent en vrac, de sorte qu'il marche sur le dossier et les PATCHes; le filtre rétrécit au fur et à mesure, de sorte qu'il relise la première page au lieu de la radiomessagerie avec le 'skip', qui empilerait sur les articles le lot précédent juste renversé de l'ensemble de résultats. Son plafond de balayage est enregistré, jamais silencieux. La poudre garde les ordures spéciales: les ordures sont effacées pour de vrai, tous les autres Le dossier déplace son contenu sur la poubelle et reste récupérable. Le DÉLÉTÉ du graphe S'y comporte déjà, donc pas de nom de dossier spécial là-bas. Les deux les points d'extrémité renvoient le nombre de messages déplacés, de sorte que l'interface utilisateur peut indiquer "marqué 240". lire" à partir de "rien à faire", et ne publier un événement de changement que lorsque Quelque chose a en fait changé.
· SecurityService
Relais faisant face au navigateur pour la fonctionnalité de la commission
Résout la session, autorise et transmet à la CommissionService avec l'organisation et membre estampillé de cette session - jamais à partir de quoi que l'appelant ait envoyé. C'est les seuls droits de lieu sont vérifiés: SecurityService exécute anyRequest().permitAll() avec une authentification à la main rouleau, donc un point d'extrémité qui oublie son contrôle échoue OUVERT et est accessible par le relais API public. Trois droits plutôt qu'un, de sorte que la séparation des droits est exprimable: avec un seul la subvention, qui délivre une commission pourrait également libérer le paiement et annuler hold that is for catche. Les actions de déménagement et de destination monétaire sont difficiles à refuser sous impersonnement. L'usurpation d'imitation une séance plénière en tant que membre arbitraire, donc sans ce refus un dieu admin pourrait entrer en tant que quelqu'un, pointer des paiements à sa propre banque, se retirer, et annuler la soute. Le propriétaire de l'organisation est un détenteur implicite. Un droit flambant neuf est accordé à Personne le jour où il se déploie - y compris à quiconque pourrait allumer la fonction " Ainsi, sans une branche propriétaire, les navires présentent dormants et inaccessibles. /me/ Les opportunités sont servies ici plutôt que relayées, parce que SecurityService est propriétaire le modèle d'opportunité; enregistrement de ces référentiels dans CommissionService également donnerait deux écrivains à un modèle de bibliothèque partagée. Il s'agit de lier les rangs des membres avec les réserves où elles sont l'agent principal, parce que l'agent est propre La commission ne produit pas de ligne éclatée et une seule venance de vérification d'un seul côté se cache silencieusement les gains d'un demi-membre.
· kamo-shared-library
Trouvez des scissions de la commission d'un membre pour la vue de leurs propres commissions
Org-scoped plutôt que claveté sur le membre seul: ORG-ID est dupliqué sur ce tableau pour qu'une ligne ne puisse jamais être lue cross-tenant par id, et un détecteur qui l'a ignorée serait tranquillement défaire cela. Seule la moitié des "opportunités que je gagne" - la commission au niveau des réserves appartient à l'agent principal et ne produit aucune ligne fractionnée, de sorte que les appelants doivent s'unir avec les réserves de cet agent. Documenté sur la méthode, donc l'appelant suivant n'émet pas d'avis que simulalement la rémunération d'un demi-membre.
· kamo-internal
Faire de la surface de l'organe une véritable grille de données kamo
Les forfaits du membre étaient une liste de cartes sans mouvement, ce qui n'est pas la façon dont le reste de kamo regarde. Voici maintenant la maison AG Grid: sous-boîte en attente et complète synchronisé à la fin de fin de la radiomessagerie sous-sous-, côté serveur (page/taille/statut de statut DocsService plutôt que de trancher un capuchon de 200 rangées), remplissant la vitre au lieu de le dimensionner à ses rangées, et pas de titre - l'onglet des paramètres le nomme déjà. Le statut se lit en un coup d'oeil plutôt qu'en tant que puce grise: une date d'échéance est la sienne l'urgence, et l'attente sur les autres et les changements de contenu sont des états lisibles au lieu de les cachées. Le mouvement est limité et fermé à l'utilisationReducedMotion.
· kamo-internal
Montrez le nom du membre sans le préfixe "Hi",
· DocsService
Paging côté serveur pour la liste des affectations de membres
La surface de l'organe demandait sans condition MAX-SI-E et a coupé le résultat en tranches le navigateur, donc une grille qui montrait une page avait déjà téléchargé un tout l'historique de l'emploi pour le construire. Les deux lecteurs membres prennent maintenant page/taille et la liste des pages dans la base de données. Spec.status (un enum) devient Spec.statuses (a Set) et le paramètre fil passe "status", maintenant acceptant un CSV. C'est le point: la grille des membres demande une BUCKET - les trois ÉPRES OUVERTURES qui doivent encore du travail, ou les quatre terminaux - et un filtre à valeur unique ne peut exprimer ni l'un ni l'autre sans trois allers-retours page. Un jeton passe à un ensemble d'un élément, donc la grille HR est existante statut-EXECUTED est identique sur le fil d'origine et n'a pas besoin d'un changement de client. Une Un jeton inconnu dans une liste est un 400 nommant le jeton, jamais un silencieusement abandonné filtre: une grille de conformité qui prétend être filtrée tout en montrant tout est le pire résultat disponible. clampPage/clampSize sont exposés de sorte que les lecteurs de membres se pincent à travers la règle SAME comme la grille RH au lieu de passer MAX-SIE littéralement, ce qui est une "paged" le critère d'évaluation devient tranquillement un terminal non lié. listMine transmet sa pagaille sans le re-dernier, donc la pince existe une fois. L'autorisation n'est pas modifiée et les tests l'épingle: les critères d'évaluation des membres restent allumés. memberGuarded() 'GaryAssignmentOwnership, HR endpoint ares () LegalPackageAccess et les trois nouveaux «RequestParams» sont déclarés nommément Situation exacte/page/taille - la raison pour laquelle cette surface est sûre est que rien sur elle nomme une personne. Pas de changement de schéma. Aucune nouvelle entité. épreuve mvn-o: 391 essais, 0 défaillance, 0 erreur (contre 379).
· kamo-internal
La carte de notification par courrier électronique remplace l'onglet Notifications
Les deux commutateurs passent sur Mon profil de la même forme que la carte de mot de passe: une carte, une tuile d'icône et aider le texte par rangée, et un encart teinté qui n'apparaît que lorsque les heures de calme sont allumées. Pas d'en-tête Bouton - les interrupteurs s'économisent, déboutées, exactement comme l'on a fait l'onglet. La carte mène avec où va le courrier, parce que c'est la partie que les membres se trompent: les avis sont envoyé à l'adresse sur leur compte UTILISATEUR, que la carte nomme, et jamais à la boîte aux lettres organisation qui leur a été attribuée - une boîte aux lettres qu'ils devraient se connecter pour lire, ce qui est précisément la chose l'avis leur dit de le faire. SecurityService ne retourne cette adresse qu'au membre de celui-ci appartient à, donc la note retombe à une forme non identifiée s'il est absent. Membres de l'équipe uniquement: le notifiant sert des tickets de discussion interne et d'assistance, ce qu'un membre en clair fait ne pas y travailler. De l'auto-par. d'ailleurs, puisque la voie de préférence est me-scoped et sur celle de quelqu'un d'autre profiler ces commutateurs éditeraient les heures de silence de l'administrateur.
· SecurityService
Exposez le courrier électronique du compte utilisateur sur votre propre profil de membre
La carte de notification par courrier électronique personnel du profil doit indiquer l'adresse des notices de messagerie manquée. effectivement atteint, et cette adresse est le compte utilisateur, et non le champ « e-mail » à côté, qui est la boîte aux lettres que cette organisation a affecté le membre. Retourné uniquement lorsque la session est en train de lire sa propre ligne membre. Une adresse personnelle n'est pas quelque chose un administrateur devrait recueillir le profil d'un collègue, et aucun autre appelant n'a de raison de le vouloir.
· kamo-internal
Comptabilité et fonds d'autorisation financière et accès financier aux paramètres de compte
Les groupes de sécurité et d'administration d'accès n'existaient que dans SecurityRoleManager en tant que listes de noms en ligne, donc JobTitleManager, DepartmentManager et RolesPermissionsTab a mis en place tous les services sans traitement en général. Plutôt que d'ajouter un quatrième exemplaire, les définitions de groupe passent à permissionGroups.ts et les quatre éditeurs les lisent. is GeneralPermission est la raison pour laquelle il importe : filtrage sur le type de service seul rendrait une découpe correctement deux fois, une fois en général et une fois dans son propre section, donnant un réglage deux bascules indépendantes. L'adhérentPermissionsLeab est délibérément intact - sa liste générale d'autorisations est une simulation codée en dur read/write/delete/admin, et non de vraies données de droits. /sets/account et sa section d'atterrissage admettent désormais également les droits financiers. Un contrôleur ne contenant que GRANDE-FINANCES serait redirigé tout droit vers/réglages; l'élargissement d'un seul des deux laisserait la page joignable par URL mais invisible dans la nav.
· InitializerService
Migrations pour les tables de gestion du grand livre des commissions et des tableaux de paiement Stripe
Les miroirs com.kamo.z.shared.commission. ddl-auto les créeraient à partir du annotations de toute façon; la DDL explicite est la convention de la maison et c'est ce qui fait la forme retraçable en un seul endroit plutôt que dans une douzaine de classes d'entités. La Commission est prise en compte (ORG-ID, STRIPE-EVENT-ID), non pas l'événement id seul. Chaque organisation gère sa propre plate-forme Stripe Connect, donc les événements ids ne doivent être uniques que sur un seul compte - Les clés de l'identifiant nu et ne sont sûres que parce que cette a un compte Stripe unique. Appliqué contre le prod; les neuf tables et chaque garde unique vérifiée présente.
· SecurityService
Semez les droits financiers sur le modèle d'administration de chaque modèle de branche
Les trois droits de commission assurent une fonctionnalité qui n'existait pas auparavant. Les NOUVEAUX-SEEDS ne disent délibérément rien à leur sujet - ce mécanisme porte un l'octroi actuel de subventions, donc un déploiement ne se manque jamais d'accès silencieusement, et l'utilise Ici, transférerait du pouvoir de déménager de l'argent à des gens qui ne l'ont jamais eu. Ce dont ils ont besoin, c'est plutôt d'un défaut de rôle, qui n'existait pas. Deux parties: - modèleSeedSettingFor obtient une surcharge de type DefaultRoleType accordant le financement les droits sur les modèles d'ADMINISTRATOR uniquement. DÉLIVRANCE, non FORCE-GRANDÉ: un org must rester en mesure de révoquer un argent directement auprès d'un administrateur sur son membre; le profil et FORCE-GRANTED l'emporte sur toutes les couches ultérieures de la cascade. - garantir les modèles de type "recteur" crée la rangée ADMINISTRATOR pour les modèles qui n'en ont pas. Les lignes de rôle par défaut sont paresseuses, créées uniquement lorsque quelqu'un sauvegarde les valeurs par défaut d'un modèle, et syncSecurityModelRoleRights itère ce tableau - donc sans cela le par défaut s'appliquerait à chaque modèle de branche, sauf ceux qui n'ont jamais été personnalisés, en silence, et ce sont ceux qui sont les plus susceptibles de se fier à l'est.
· kamo-shared-library
Haut-g dese et domaine de paiement Stripe, membres de l'équipe
Ajoute com.kamo.z.shared.commission: un grand livre signé uniquement, par membre la ligne de balance qui existe uniquement pour sérialiser les retraits simultanés, Modèle de lot/ligne de traitement de la Commission et Connect Stripe par œil les entités de paiement. Trois décisions méritent d'être tenues: - Le grand livre est appendice uniquement et l'applique en Java (« Pré-Update/-PreRemove » lancer). Le colombon (updatable-faux) ne fait que l'on omite Hibernate une colonne de la MISE À JOUR, il ne fait pas échouer l'écriture, donc une correction tièderait regarderait comme si elle avait réussi. Les corrections sont en train de rificateurs. - Disponible ou en attente est une question sur EFFECTIVEAT, et non une machine d'état. A Commission émise aujourd'hui avec les mouvements de maturité du mois prochain à être disponible sur son Il n'existe donc pas de balayage qui puisse échouer et faire passer de l'argent en suspens. - L'interprétation de la CNUDCI est redondante avec le registre par construction. C'est existe parce qu'un équilibre est un agrégat et SELECT FOR UPDATE ne peut pas verrouiller un agrégat; sans une ligne pour prendre PESSIMISTIC-ÉCRITE, deux concurrents les retraits passent à leurs propres contrôles de suffisance. L'argent est NUMERIC(19,4) tout au long, les ids sont des colonnes INT8 claires plutôt que les associations, donc les états financiers sont en attente de la barbotage des membres, et ORG-ID est dupliqué sur les rangées d'enfants afin qu'aucune bagarre à une seule rangée ne puisse lire entre le cross-tenant. Il ajoute également trois droits (187 à 189) pour la surface financière. Ils sont divisés donc la séparation des tâches est exprimable: avec un droit, la personne qui émet une la commission pourrait également libérer le paiement et annuler la mise en attente qui existe à Le type de service est nul délibérément - un nouveau type de service grouperait les rendre automatiquement mais les rendre en aucun temps éditeur, puisque les sections d'applications uniquement apparaissent lorsque l'orge a cette application activée. Schéma appliqué via KamoInitializer; les neuf tables vérifiées présentes en prod avec TOUS les privilèges pour l'utilisateur de l'application kamo.
· kamo-internal
Adoucir la carte MAW dans la carte de mot de passe et déposer l'onglet Sécurité d'inscription
Deux endroits ont posé une question - comment puis-je entrer dans ce compte - donc le deuxième facteur vit maintenant à côté du mot de passe sur Mon profil, dans une carte rebaptisée "Password - Multi Factor Authentication". L'écoulement d'enrôlement sort de la languette dans - sans chrome pour qu'il rend en ligne plutôt qu'en page: pilule de statut, QR/secret numéroté et étapes de code dans un encart, et le même dialogue de code de récupération non accessible. L'en-tête de la carte ne porte pas le bouton d'édition maintenant qu'il possède deux actions indépendantes - la ligne du mot de passe a son propre "Modifier le mot de passe", la ligne MFA est propre "Allerez-vous". L'AMF reste autonome uniquement pour la raison de l'onglet était : les critères d'évaluation du MFA de SecurityService résolvent l'utilisateur. à partir de la session de l'appelant et ne prenez pas de paramètre utilisateur, donc un administrateur sur le profil de quelqu'un d'autre inscrivent leur propre authentification. Le changement de mot de passe est plus large (MANUE-MEMBER-SECURITY, dieu), donc cette ligne seule y rend. L'état du mot de passe passe PasswordSecurityCard, qui fixe une branche morte sur le chemin: l'ancienne carte a comparé un mot de passe "Tradulé"Error contre les littéraux anglais, donc "Mot de passe actuel est incorrect" n'a jamais atteint le champ auquel il appartenait. L'erreur porte maintenant son champ.
· kamo-internal
Proposer les boîtes aux lettres, les alias et les boîtes aux lettres partagées de l'orge
L'auto-complet du destinataire ne connaissait que les contacts et les adresses raclées. Dossier Envoyé, donc les adresses de l'organisation et tout est géré Il a fallu taper à partir de la mémoire. Nouveaux ventilateurs GET/api/email/directory à l'adresse des quatre sources EmailService à l'origine cette page et retourne une liste d'adresses deduped. côté serveur agrégé parce que chacun de ces appels consomme sa propre clé à usage unique; à partir du navigateur, il serait Quatre allers-retours OTK chaque fois qu'un compositeur s'ouvre. Chaque source se dégrade sur son possède, donc un organisme dont le fournisseur n'a pas de provisionnement reçoit encore son pseudonyme. La liste est mise en cache en mémoire et appariée localement - les orgs ont des dizaines de ceux-ci, pas milliers, et un paramètre de requête par frappe mettrait un aller-retour réseau dans à l'avant des suggestions, le navigateur peut déjà répondre. Les allumettes d'org peignent donc immédiatement pendant que les recherches de contact et de dossier sont encore en vol, et ils mènent la liste déroulante: c'est un petit ensemble exact, et une adresse interne qui se trouve également dans un carnet de contact qui doit être interprété comme la boîte aux lettres et non la carte de contact. L'édition des boîtes aux lettres dans Paramètres abandonne le cache, donc une nouvelle adresse est suggestifiable sans rechargement. L'URL de base d'EmailService et les assistants qui les accompagnent d'une embrochure. la nouvelle route chanquine son OTK de la même manière au lieu de conserver une deuxième copie.
· kamo-internal
Une vue de la boîte aux lettres, et une colonne qui est toute la liste
La bascule Conversational/Classic est parti et chaque membre obtient liste classique. La vue de la conversation porte sa propre liste, son propre fil conducteur Panneau et sa propre surface API pour une deuxième façon de lire la même mail - tout a été supprimé, ainsi que le mode localStorage it mémorisation par navigateur. L'en-tête de la colonne de la liste est allé avec. Le nom du dossier, son icône, description sous forme de description et le bouton de rafraîchissement étaient de six rems de chrome au-dessus d'une liste qui voulait la hauteur, et l'arborescence de pliage dit déjà quel dossier est ouvert. Rechercher et déplacer le panneau de filtre vers le plieur barre latérale, au-dessus de l'étiquette Dossiers, donc la colonne de liste n'est rien d'autre que liste. Le bouton de rafraîchissement retourne à côté du commutateur de boîte aux lettres comme un carré: allongement des éléments sur la rangée et l'aspect-carré sur le bouton sa hauteur suit le commutateur et sa largeur suit sa hauteur. Il est assis à côté de la carte de boîte à écoute unique, donc un membre sans décrochage ne perd pas de rafraîchissement. Les filtres tombent à une colonne et deux sélections côte à côte ne s'adaptent pas à un Barre latérale 320px. Un fournisseur SMTP-only n'a pas de barre latérale de dossier, donc il y a le panneau de recherche reste au-dessus de la liste au lieu de disparaître. Les chaînes pour les surfaces enlevées sont écadrons des 22 localités de l'ensemble de la liste dictionnaire de kamo-traduction (61fdfcf, en premier). thread Détail de/to/cc/noContent stay - l'onglet des communications principales les rend.
· SecurityService
Exentrer le courrier électronique du groupe de contact dans le fichier du Département
Le Centre d'interaction a besoin de l'adresse d'un membre pour pré-remplir un compositeur, et le seul critère d'évaluation qui en a été l'un d'entre eux, c'est-à-dire le seul élément d'évaluation demande par ligne visible. EmbEmail est inscrit sur la liste des membres inscrits sur la liste. déjà se charge, donc le servir ici ne coûte rien et enlève le N-1.
· kamo-internal
Envoyer un membre directement par courrier électronique à partir de sa rangée
Le dock d'action de la rangée pourrait discuter, se rencontrer, composer et ouvrir un profil. chose qu'il ne pouvait pas faire était de lancer un e-mail, donc atteindre un collègue par courrier signifier quitter le panneau, ouvrir le compositeur et retaper son adresse. Ajoute un bouton de courrier aux côtés des autres qui ouvre la fenêtre de l'outil du compositeur avec le membre déjà dans le domaine To. L'adresse se démarque dans le charge utile par département (EmbEmail est sur la ligne des membres, donc elle ne coûte pas de supplément requête) plutôt qu'un détail par rang de fessage, et le module/porte droite est résolu une fois dans NavTopPanel au lieu de par ligne.
· DaemonService
Cochez le rappel journalier du forfait légal
DaemonService possède le mot car DocsService ne le peut pas. DaemonService est stratégie: Recréer - l'ancienne dose est partie avant le début de la nouvelle, donc un déploiement Window ne peut pas doubler-feu. DocsService est RollingUpdate maxSurge:1, donc a «Cela peut s'y rendre possible: pour la longueur de chaque déploiement, il y a deux gousses et les deux pensent qu'il est 13:00. Pour un emploi dont la production est l'envoi à tous les jours de retard employé sur la plate-forme, "généralement une fois" n'est pas un bien. Il nous donne aussi DésilableConcurrentExecution, JobTriggerController's manuelle et cron accordable sans redéploiement de DocsService. Modélisé sur LeadEmailSweepJob, y compris la partie qui porte plutôt la charge que stylistique: un RestTemplate par défaut attend FOREVER, donc un DocsService codé irait copier ce fil et - sous - DisstoralConcurrentExecution - arrêter le balayage jusqu'à ce que la gousse redémarre, silencieusement et indéfiniment, en ayant exactement comme "non des rappels étaient attendus". Les temporisations sont explicites. Timbres internal.auth.secret (public-chat), la valeur DocsInternalAuthFilter valide - NE PAS le secret interne MLOS, qui est une valeur différente et 403 chaque appel, la correction StewardNotifier et VoipGlobalSyncJob tous les deux nécessaires. Chaque jour, pas horaire: le seau est fonction du jour, donc une tique horaire est de 24x le balayage en gigot croisé pour au plus un envoi supplémentaire et 24 fois le rayon de souffle. Non Configmap change - l'URL de base docs et le cron portent tous deux des défauts de fonctionnement.
· DocsService
L'échelle de rappel à date en duuc et le balayage en lecture seule par lots
Le seau est une fonction pure de (dueDate, aujourd'hui) et jamais de " quand nous allons durer UPCOMING-D-n- pour les offsets configurés, DUE-TODAY, puis PASSÉE-DUE-P-plancher (joursOverdue / interval)-. Courir le balayage cinq fois le jour 9 C'est donc un seau, et la réclamation du grand livre est ce qui le dédouble - non On se souvient de l'état d'autre que partout. Les compensations sont des données; rien dans la classe ne sait le nombre 3. passée-due-périodes max par défaut à 0 signifiant UNLIMITED, car La décision 4 dit que le rappel dû au passé se répète et qu'une casquette silencieuse ressemble exactement un balayage de travail tout en abandonnant le membre le plus besoin de poursuivre. Le seuil est aujourd'hui max(provenantDays) 1, pas maintenant(): le prédicat du référentiel Est due À AVANT, de sorte qu'un seuil maintenant() trouverait seulement des rangs en retard et la totalité La moitié prochaine de l'échelle ne se tirerait jamais. Une courte transaction en lecture seule par tranche, matérialisant complètement chaque lot dans Les enregistrements simples - L'organisation et le membre sont Lazy, donc le fqdn, l'étiquette, le nom et l'adresse sont résolus à l'intérieur de celui-ci et la transaction est FERMÉE avant le premier envoi. L'envoi d'EmailService bloque HTTP dans le blocage de SMTP, et un lot maintenu en pions ouverts a une connexion Hikari pour la longueur de chaque aller-retour dans celui-ci, dans un service également desservant WOPI. Le balayage interprète l'écriture de l'ERO. Il ne peut pas sérialiser, ne peut pas sortir de l'impasse contre l'assistant, et la paging est stable parce qu'il ne fait pas de mutation les lignes il se charge de la méditation. dryRun ne résout et ne revendique rien - un parcours sec qui Sauvegarderait chaque seau qu'il inspectait et supprimerait silencieusement la vraie course. L'enregistreur gagne dispatchAllCounted à côté de l'EverAllAll en valeur inchangée, parce que LegalReminderSweepResultDto déjà réclamé et a échoué et un seul envoyé count ne peut pas les remplir: sur une nouvelle "recette 0 de 400" est correcte, en bonne santé la réponse et "claimed 400, envoyé 0" est une panne, et le journal de daemon doit être capable pour les distinguer.
· DocsService
Prévenez le membre qui a été attribué, annulé et rempli
ONE hr.package-assigned par membre par paquet, jamais un par document: c'est-à-dire ce pour quoi suppressInvite existe, et 8 documents x 200 membres est de 1 600 enveloppes pour 200 personnes. L'envoi est une phase sans transaction contigue APRES les lignes d'affectation et les enveloppes, parce que l'envoi d'EmailService bloque HTTP dans le blocage du SMTP et l'entrelacement de 200 de ceux dont l'étirement est tiré à l'enveloppe un RH d'exécution suit un état de progrès pour. La carte de réparation de livraison et un livre répété Reproduit reconquisent les mêmes notices et les deux sont refusés à la demande du grand livre plutôt que par un si - la carte de réparation existe précisément pour redémarrer les membres qui ont déjà été affectés, donc une condition de code devrait encoder "déjà attribuée mais peut-être pas encore envoyée par courrier électronique", qui est l'État que le grand livre connaît déjà. hr.package-vided ne s'éteint que pour le résultat VOIDED. SKIPPED-EXECUTED ne doit pas e-mail - ce membre a terminé, et leur a dit que leur forfait rempli était retirés est à la fois erroné et alarmant - et NOT-FOUND ne doit pas non plus, puisque le id n'a jamais été cet org's et le service vide refuse déjà de résoudre un nom C'est ainsi qu'il ne peut pas devenir un oracle de transitaire. L'expédition passe LegalAfterCommit sur le pool de livraison: un réessai de sérialisation qui a roulé Un vide de retour aurait déjà dit à 200 personnes leur paquet était annulés, et il n'y a pas d'absence. hr.package-completed est un récépissé au membre portant l'article en infraction. digest manifeste. Appelé délibérément: les listes de phrases attribuées et évidé, mais un modèle canonique que rien n'envoie est du poids mort, et jusqu'à ce que le L'artefact déposé est téléchargeable ce récépissé est le seul enregistrement que le membre détient.

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