Changelog
Ce qui est nouveau.
Chaque amélioration apportée à la plateforme, à mesure qu'elle est livrée.
· kamo-internal
Étituérer la cascade, ajouter les actions de branche bulk, expliquer la règle
Le point de vue en cascade parcourt maintenant la chaîne au lieu de clignoter toutes les personnes touchées. les anchérieurs arrivent déjà près du premier, donc l'indice IS le distance avançait l'arborescence et chaque rangée retardait de 90 ms en arrière de la dernière le regarder déplacer l'enfant à la mère à la grand-parent est ce qui enseigne la règle, qui a Le flash simultané se lit comme un problème. Encore instantané sous-prépare-réduction-prochaine. Accorder tous / Supprimer tout sur une branche, montré seulement quand ils changent quelque chose. Route par le biais de la demandeToggle par droit plutôt que directement d'écrire les paramètres: a une action globale ne doit pas devenir une deuxième mise en œuvre des règles en cascade qui dérive de la seule dans RightsHierarchy.ts. La pilule autorisée/totale est désormais toujours dans une rangée d'origine plutôt que seulement lorsque s'est effondré - c'est la lecture la plus rapide de ce qu'une branche accorde réellement. rend également hiérarchisation/hiérarchieBody, auquel l'engagement précédent a ajouté le dictionnaire puis jamais utilisé. Montré seulement au-dessus d'un groupe qui a effectivement nidification; une bannière qui apparaît partout est qu'un seul peuple apprend à sauter. droitsTreeForest.test.ts épingle la règle d'ancrage de l'arbre et des types de branche Partage de l'éditeur: un droit dont la société mère est filtrée hors du groupe actuel se fixe à l'ancêtre PRESENT le plus proche, ou devient une racine. L'inverse fait un L'autorisation remboursable disparaît de l'éditeur sans rien pour l'indiquer - et il est accessible dans la pratique, parce que EDIT-QUOTE-TERMS est déclaré CRM alors que son MANAGE-QUOTES est POS.
· kamo-internal
Montrer et faire respecter la hiérarchie des autorisations dans les cinq éditeurs
Cinq éditeurs ont accordé 199 droits en tant que cinq listes plates de cases à cocher, et aucun de ils ont montré qu'un droit peut être une condition préalable à un autre. Octroi d'un enfant sans que sa société mère ressemblait exactement à l'octroi d'une autorisation de travail - qui est comment l'onglet Légion et Conformité nécessitait deux droits et aucun éditeur ne pouvait le dire. RightsTree rend l'arbre: indentation avec une colonne vertébrale du connecteur, pliable branches, une pilule autorisée/total par branche, recherche qui garde les ancêtres d'une correspondance visible, et une cascade qui est animée parce que l'animation est ce qui enseigne le la manière d'un enfant de manière à ce dont il dépend, invalidant un parent assombrit ses sous-arbre, les deux avec un toast écrasant unad d'objet qui se déplaçait. Distinctions honorifiques préfère-réduction-mouvement. Il s'arrête également de mentir autour de trois États que les rédacteurs ne pourraient jamais exprimer: droits verrouillés par le modèle de sécurité de l'organisation, accordé - mais inertes les rangs hérités de l'héritage dont la parente est niés, et les 58 droits qui sont distributeurs qui ne sont accessibles que ce n'est nulle part. Un administrateur Auparavant, il n'était pas possible de dire une autorisation réelle d'un espace réservé. Les règles de cascade en direct dans app/lib/rightsHierarchy.ts, en miroir de Java's RoleRightType. Une copie d'une règle de sûreté est une responsabilité, de sorte que le critère de parité se lit comme suit: la source de Java et échoue à toute divergence plutôt qu'à une convention de confiance. L'éditeur de modèle de type de branche obtient l'ordonnancement et l'indentation mais conserve son leur propre contrôle et NE PAS auto-cascade: il s'agit de valeurs de FORCE, absolues et appliqué après chaque niveau, donc les cascader réécrirait silencieusement un délibéré l'annulation. La relation parente y est toujours appliquée au moment de la résolution. Conception - l'audit reproductible: docs/superpuissances/specs/
· SecurityService
Normaliser le membre contre la hiérarchie
Les droits directs des membres passent désormais par le biais de RightsHierarchy.normalizeLevel avant qu'ils ne persistent: un enfant accordé tire ses ancêtres à DANG-DELANT auprès du membre Un parent refusé pousse NUKE vers le bas son sous-arbre là-bas. côté serveur plutôt que de faire confiance à l'éditeur, car ce point d'extrémité est joignable directement. Un niveau stocké avec un enfant mais pas son parent est précisément ce que les bandes de passe de fermeture du résolveur plus tard - le membre continuerait à perdre un droit UI a montré comme étant accordée, sans rien pour l'expliquer. Recueilli dans une carte d'abord afin que la hiérarchie voie l'ensemble du niveau à la fois; la normalisation de l'entrée par entrée dépendrait de l'ordre que le client a passé à envoyer.
· InitializerService
Les ancêtres du backfill de sorte que la fermeture ne peut pas enlever l'accès
MemberRightsAppliedService refuse maintenant tout droit dont la chaîne mère n'est pas accordée. Chaque rangée écrite avant l'existence de la hiérarchie ne sait rien de ancêtres, donc un rôle de holding MANAGE-SUBSCRIPTION-PLANS sans ACCESS-COMMERCE tout à fait normal jusqu'à présent - le perdrait lors du prochain nouveau calcul. Dans 13 des organisations vivantes qui sont une panne, pas une migration. Rapproche les quatre niveaux (rôles d'org, départements, titres d'emploi, annulations de membres) à l'invariant les chemins d'écriture maintenant maintenus, en utilisant la même règle: a Un descendant élève élève à GRANTED. L'étape 2 est celle qui en fait empêche la panne - il retourne un ancêtre explicitement DÉPIED à accorder, parce que les rangées qui existent survivent à l'étape 1 intouchées et la fermeture atteindraient alors toutes les descendant sous eux. Les modèles de modèles de sécurité ne sont PAS délibérément touchés: un FORCE-NUKE sur un parent est un administrateur qui change d'arbre à dessein et clôture honore c'est la caractéristique. L'étape 3 est un GATE, pas une ligne de connexion: il vérifie à nouveau l'invariant et échoue la course si Tout niveau est encore constitué d'un descendant accordé sous un ancêtre non accordé. A la migration qui a fait état d'un succès avec une violation laissée à droite problème au résolveur, où il fait surface en tant que membre perdant tranquillement un l'autorisation avec rien pour l'expliquer.
· kamo-shared-library
Hiérarchie parent/enfant pour 199 droits
RoleRightType a déclaré un domaine "parent" et un public getParent() pendant des années. Chaque constante est passée nulle et rien ne l'appelait jamais. Ceci finit que échafaudage : 135 enfants, 34 racines, 30 autonomes, profondeur maximale 3, dérivée d'un l'audit de l'ensemble des 199 droits sur 15 081 fichiers sources dans le cadre des 40 dossiers. Deux points d'application, et la scission est la conception: Normaliser Level() est l'autorisation. Il rend ONE de niveau auto-cohérent - une autorisation Un enfant tire ses ancêtres à ce niveau, un parent refusé pousse NUKE vers le bas son sous-arbre là. Appliqué dans les chemins de l'écriture de rôle, de département et de titre d'emploi. Parce que chaque niveau reste cohérent, un titre d'emploi qui accorde également un enfant accorde également des subventions. le parent PERSONNEL, et la cascade existante laisse déjà plus spécifique niveau a battu un département qui l'a nié. Aucune règle de préséance interclasse n'était ajouté et la chute d'eau n'est pas affectée. applyClosure() est LA RÉSOLUTION, annexé après applicationTemplateRules. Il s'agit d'une un filet de sécurité pour les deux seules choses que l'auteur ne peut pas atteindre: un modèle de sécurité FORCE-NUKE sur un parent (absolue, appliqué en dernier, donc sans cela une force parent laisse ses enfants accordés) et les rangées écrites avant tout. Deux paires restent délibérément FLAT parce que la séparation des tâches en dépend: APPROUVE-TIMECARD-AJUSTEMENTS / FINALIE-PAY-PERIODS, et APPROUVAGES-ORG-PAYOUTS comme un frère ou une sœur de MANAGE-ORG-FINANCES plutôt que de son enfant - nidifiant ce dernier forcerait tout homologue de paiement à être également un émetteur. Conception : kamo-interne
· kamo-internal
Repelant le rappel dans la couleur de l'orge, ouvre ses options en place
La carte est maintenant la couleur principale de l'organisation, avec chaque marque tirée en -on-prime plutôt qu'un blanc littéral - une org de marque blanche qui choisit un Un primaire pâle peut redéclarer ce jeton et déplacer toute la carte. Chips, rails et les bords sont mélangés de couleur à partir de la même pièce, de sorte qu'ils restent lisibles dans les deux sens. L'action principale est une pilule inversée, correspondant à l'idiome de la signature légale. Un héros utilise déjà un bouton sur une bande colorée. La colonne vertébrale de l'accent en nature est partie; l'icône porte déjà le genre, et un Une deuxième couleur sur une carte colorée ne l'a que brouillée. L'exception est en retard, et il inverse plutôt que de virer au rouge: le rouge sur une couleur d'orgge arbitraire est illisible. Ses menus Snooze et More sont MUI Menus, qui font le portail du document et apportent un verrouillage avec eux. Cette écluse met en place un débordement: caché ET une compensation rembourrage à droite sur le document.body, et le rembourrage du corps déplace toutes les positions fixes élément sur la page - donc le pont, qui est fixé en bas/droit 20, a sauté côté le moment où n'est-ce que l'on a atteint pour Snooze, et le menu a couvert la carte il appartenaient à. Les deux sont un panneau en ligne maintenant, s'étendant à l'intérieur de la carte avec le délimiter gauche allumé. Pas de portail, pas de serrure de défilement, rien à couvrir.
· kamo-internal
L'onglet Paramètres juridiques et de conformité avec le texte juridique par défaut de l'ordonnance
Un nouvel onglet sur /settings/caréntures/étuitions contenant du texte juridique par défaut, lié à la menu de réglages et le rampe de lancement des paramètres. Création d'un paquet sur /hr/legal-compliance commence maintenant à partir de là, et ce champ est trois rangées de plus. DROITS. La page de paramètres de la HRS dans son ensemble se réconcilie maintenant à la recherche de l'enregistrement sans MANAGE-HRS-SETTINGS plutôt que de se contenter de rediriger: la redirection est un effet, donc il ne peut pas courir jusqu'après un rendu, et chaque onglet peignait - et tirait son Charges de montage-temps - pour un membre qui ne tient pas la droite. Le nouvel onglet a également besoin d'une prise de performance et d'une représentation, tenue identique en trois endroits (page, menu, lien de menu, carte de lance) et épinglé par un test, car un lien offert à quelqu'un, la page ne rendra pas l'onglet pour ouvrir Provider Setup à la place: SettingsView résout un taux d'index 0 inconnu plutôt qu'inconnu. Le dialogue enseignait la valeur par défaut alors que l'auteur n'a pas tapé - l'allumer se rétracte après qu'ils pourraient déjà être en train d'écrire. seedDefaultAttestation est un pur Aide pour que la règle soit testable, et elle est appliquée À L'EXTÉRIEUR DE L'état: Réagir à des correcteurs de mise à jour à double allumage, qui ont laissé l'instantané ensemencé avancé et le deuxième appel refusant son propre changement. Un EDIT ne réense plaquette jamais. Le paquet porte sa propre formulation et l'écrase réécrirait ce que l'audience d'une version publiée est appelée à accepter.
· kamo-internal
Texte riche dans le collant et les aperçus, et un mode que vous pouvez changer
Une note dit maintenant s'il s'agit d'un texte riche ou d'un texte en clair, et à la fois l'éditeur. Et le cotisant flottant peut l'éteindre. La note flottante en mode riche intègre le même éditeur/notes utilise, donc il a chaque outil que la page complète a - habillé dans la couleur de cette note propre par l'intermédiaire d'un nouvel accessoire optionnel sur KbArticleEditor. L'accessoire est additive: absent, l'éditeur a l'air exactement comme il l'a fait, donc la connaissance la base n'est pas affectée. La barre d'outils s'enroule et fait défiler plutôt que de pousser le écrire une zone obturée d'un collant étroit. Changer de richesse - s'il vous est dit tout d'abord, et dit clairement que le formatage est rejeté et ne peut être récupéré tant que le texte est conservé. Ce n'est pas Le mode caché - le mode ordinaire n'a nulle part où le mettre - donc la conversion aussi snapshots une version, laissant l'ancien formatage récupérable de l'histoire. Les riches sont allongés et n'ont besoin d'aucun avertissement. Les avant-premières sur les cartes murales et les puces du pavé de lancement montrent maintenant le réel contenu plutôt qu'une ligne aplatie. Ils sont rendus par un seul. lexicalToHtml plutôt qu'une instance lexicale montée: un mur est des dizaines de cartes, et chacune ferait s'enfoncer dans l'ensemble de l'exécution de l'éditeur pour afficher un paragraphe. Cette sortie est injectée, et le contenu de la note est membre, écrit et souvent collé, il s'agit donc de la partie sensible à la sécurité et a été écrit le premier test - en s'échappant, un système d'autorisation qui refuse javascript: et données: (y compris les onglets et cas-obfuscés, l'intégration des cotations à l'intérieur de href, et les anciennes notes brutes-HTML affichées comme du texte plutôt que rendues. Pendant qu'une recherche est en cours d'exécution, les cartes gardent l'aperçu en évidence: le marquage du coup est plus à mi-recherche, et il ne peut pas souligner rendu HTML sans ré-parer ce qui vient d'être sérialisé. Egalement: les billets flottants portent le fond configurable de l'ordre filigrane, le même que celui utilisé les pages de contenu, honorant l'ordre de l'ordre bg Critère d'eau, y compris NUN. Size en tant que part de la note de sorte qu'il est à n'importe quelle taille, et un peu plus fort que les pages utilisent parce qu'un collants reposent sur du papier saturé plutôt que sur du papier presque blanc.
· KBService
Porter le mode texte riche/texte en clair d'une note à travers l'API
Créez les honneurs le mode demandé et les défauts de paiement à la richesse, en faisant correspondre Un éditeur une note est créée. La mise à jour est nulle-gardée comme les autres champ sur ce point d'extrémité, donc un appelant n'envoie que RichText blanc la note. Le DTO lit à travers isRichTextOrDefault(), donc une ligne qui en quelque sorte Le remblai est signalé comme riche. Erreur vers le maintien formatage est la direction sûre: l'inverse présenterait un formatage noter comme de rien dire et inviter le membre à l'aplatir.
· InitializerService
Ajouter la colonne ' ' ' ' ' ' ' ' ' ' ' ' ' ' '
Si une note est éditée en texte riche ou en clair, on ne peut pas être lu en retour hors de son contenu: une note riche que personne n'a encore formatée est byte-for-byte un clair. Sans colonne, l'éditeur perd sa barre d'outils à chaque fois que note est rouverte. VÉRÉ TRUE, qui est aussi ce qui permet à YugabyteDB d'ajouter la colonne à un un tableau qui a déjà des rangées. VRAIMENT spécifiquement parce que chaque note écrite avant que la colonne n'ait été rédigée dans le riche éditeur - c'était le seul l'éditeur il y avait - donc le backfilling to FALSE montrerait formaté note comme simples et offrir de les aplatir. - Ordonner(0) pour la raison habituelle: le moment partagé-lib cartographie la colonne, chaque coureur qui charge un Note le SELECT, donc une migration tardive n'est jamais atteint. Navires avec la garde de la dérive utilisé par ce colis - il reflète la colonne Nom de l'entité au lieu de la réaffirmer, et a été vérifié par cassure le nom et le regarder échouent. Appliqué contre Yugabyte: colonne présente comme valeur booléenne par défaut true, tous les rangées existantes se sont retournées à vrai, pas de NULL.
· kamo-shared-library
Une note indique s'il s'agit d'un texte riche ou d'un texte en clair
Le mode ne peut pas être dérivé du contenu. Une note riche du membre a non formatée mais sérialise l'octet pour l'octet à l'octet à l'identique les deux sont un document lexical de paragraphes non stylés - donc sans quelque part pour le garder, l'éditeur perd sa barre d'outils chaque fois que la note est rouverte. Par défaut à la richesse, et la colonne est rembranchée à VRAI, parce que chaque note qui est antérieure au drapeau a été écrit dans le riche éditeur; c'était le seul L'un était là. Le remplissage vers FAUX présenterait des notes formatées comme simples et inviter le membre à les aplatir. Nullable à l'intentionnellement, avec isRichTextOrDefault() lisant un drapeau non-réglé comme rich: une querelle qui échappe d'une manière ou d'une autre au remblai à l'épaule pour garder formatage, pas pour le rejeter.
· kamo-internal
Une page pour les notifications et les contrôles sur celles-ci
La page des notifications portait un en-tête qui lui était propre, un sourcil, un titre et trois boutons de pilule à l'intérieur d'une carte bordée - pendant chaque page voisine (le compte navigateur, chaque écran de réglages) est introduit par le gradient de marque avec un flèche arrière et une barre de languette sous-points. Il se lisait comme ailleurs dans le produit. Il maintenant porte le même en-tête, avec le compte non lu comme sous-titre et les deux les actions qui opèrent sur la liste comme les boutons blancs du héros. Sous-le, deux onglets: Notifications et Paramètres. Les paramètres sont ceux qui utilisés pour être un onglet sur le profil du membre à /settings/member/-id-?tab les notifications, qui mettent les contrôles sur les notifications sur un écran différent des notifications elles-mêmes - un sujet en deux endroits, dont aucun a mentionné l'autre. Un membre qui ouvre la cloche parce qu'elle ne s'arrêtera pas est maintenant déjà sur la page qui peut l'arrêter. Le taux est partagé par l'intermédiaire NOTIFICATION-TABS, de sorte que la barre et les surfaces qui s'y raccordent en profondeur ne peuvent pas dériver sur une valeur qui ne sélectionne rien. Les deux surfaces qui sont liées à l'ancien emplacement (action des cadres du plateau de toast, le bouton Paramètres de la page, maintenant un onglet) aller à NOTIFICATION-SETTINGS-HREF. Une Un ancien signet de l'URL du membre résout toujours le rapport premier onglet pour un « tab » il ne reconnaît pas. La copie Quick Tips qui a suspendu l'ancien onglet (settings.notifications.help.) est non reporté: le tiroir d'aide est un produit de SettingsView et cette page a néant. Les clés sont laissées dans le dictionnaire plutôt que lavées.
· DocsService
GET/PATCH le texte juridique par défaut de l'ordre
/api/docs/juridiques/réglages, derrière le même entonnoir gardé() que tous les autres cartographie sur ce contrôleur. La lecture NE JAMAIS crée une ligne: elle résout les LegalDefaults lorsque l'orge a néant. Cela permet de garder les graines de l'éditeur du paquet se liant à l'effet secondaire et c'est ce que couvre les organisations créées après la création de la graine de KamoInitializer - la ligne est matérialisés sur le premier sauvetage, où appartient une écriture. Le bon ensemble est délibérément plus large que les critères d'évaluation de l'emballage. Ce critère d'évaluation est atteint à partir de l'onglet Paramètres Juridique et Conformité (MANAGE-HRS-SETTINGS) et à partir de l'éditeur de paquets (MANAGE-LEGAL-AND-COMPLIANCE); soit seul 403s un écran sur un domaine qu'il possède. Coffre-fort à élargir car il s'agit d'une corde d'un niveau d'orge de la plaque de chaudière - pas de liste, pas d'affectation, pas de preuve - et un test de régression les épingles que l'élargissement n'atteint pas la liste/créer/la mise en avant du public. Sémantique de PATCH: un champ absent n'est pas touché, une corde vide est délibérée clair. Publier déjà refuse une attestation vierge, donc un défaut autorisé uniquement fait que l'auteur écrive le sien.
· InitializerService
Semences à chaque organisation un texte juridique par défaut
Une ligne thro-fixation légale par orgg, unique sur org-id, portant - INSERT-ONLY, jamais MISE À JOUR. Une ordonnance qui a édité sa propre formulation en est propriétaire; un redéploiement réinformant silencieusement la phrase que son peuple est invité à légalement accepter de devenir le pire comportement possible pour cette chaîne. Cela fait aussi le coureur idempotent. Orgs créés APRES ces séries sont couvertes par le DocsService lire la contre-recuprie plutôt que par provisionnement d'orgg, donc une voie d'approvisionnement future qui a oublié la call ne peut pas expédier un org dont le texte juridique par défaut est blanc. Les deux déclarations réessaient 40001: un jet d'un CommandLineRunner avorte le tout l'initialiseur et les souilleurs de chaque coureur commandé après.
· kamo-shared-library
Texte juridique par défaut au niveau de l'orge
LegalSettings est une ligne par organisation portant le libellé d'un NOUVEAU Le paquet commence par. C'est un DEFAULT, jamais une référence vivante: créer un paquet copie le texte, et la publication de gels qui copie sur une version, donc l'éditer ici ne peut pas modifier un paquet qui existe ou un quelqu'un a déjà a été accepté. LegalDefaults détient la formulation de la plate-forme en UN endroit. Le KamoInitializer Semence, le DocsService lit-il la gouffre et le champ des paramètres s'y rattachent tous trois littérales dériveraient et orgsents de part et d'autre de la migration alors ne sont pas d'accord sur ce qu'est la valeur par défaut.
· kamo-internal
L'histoire devient une page, et la cloche sonne
La cloche a ouvert un popover, qui est la bonne forme pour "ce qui vient de se passer" et le mauvais pour "ce que ce rappel a dit mardi". Un panneau suspendu à un La barre d'outils ne peut pas être paged, ne peut pas être filtrée sans ensanglantement, et se ferme lorsque vous cliquer sur n'importe quoi - afin qu'un membre puisse voir quelques notifications récentes non lues et Rien d'autre. Tout ce qui était déjà lu était, dans la pratique, parti. C'est un pauvre propriété pour mémoire de ce que la demande a dit à quelqu'un. /notifications est ce relevé. Il se lit comme une chronologie plutôt que comme une liste. parce que les notifications sont des événements et que la question qu'un membre pose est presque toujours "quand": une colonne vertébrale de jours avec les notifications suspendues, chaque point dans sa propre couleur, donc un mois d'histoire lit comme des bandes avant un seul Un mot est lu. Les lignes non lues portent le sol et les rangées en lecture ne portent que le point, quelle est la différence pour laquelle on scanne. Le rail de filtrage rétrécit ce que la colonne vertébrale au lieu de la réorganiser - lire, non lue ou les deux, et par nature avec un compte contre chacun. Le groupement de jour est sensible au calendrier plutôt qu'aux heures écoulées: à mi-chemin minuit, quelque chose d'il y a quatre heures s'est passé hier, et "Il y a 4h" n'est pas Ce qu'une personne à la recherche va scanner. Tout ce que le serveur ne pouvait pas dater est conservée et groupée, lorsqu'elle ne peut prétendre à un jour auquel elle peut n'appartenir pas. La cloche est maintenant un lien, badgé comme les deux autres marques d'attention dans la barre donc Tous trois lisaient de la même manière. Ce qui diffère, c'est le mouvement, et délibérément: un Un document en jeu et une horloge en marche sont des états, et ils impulsionnent un anneau qui dit "toujours vrai". Une notification non lue est un événement, et ce qu'une cloche fait quand un événement se produit est l'anneau. Donc il oscille - frappé une fois et s'installant, amplitudes Réduire de moitié de 12 x 9 x 6 x 3 x 1,5 x pivotement au niveau de la couronne parce qu'une cloche est suspendue puis repose pendant quatre secondes. Une cloche qui ne s'est jamais arrêtée serait une alarme. Et le comte à côté dit déjà que la chose persiste.
· EmailService
Historique filtrant et pléneux
Le centre pourrait répondre à une question: la plus récente, non lue ou non, sans aucun moyen de demander ce qui avait déjà été lu. Donc tout ce qu'un membre avait vu était, dans la pratique, disparu - qui est une mauvaise propriété pour ce que demande a été informée à quelqu'un. GET /api/notifications/browse pages, rapporte le total, compte chaque type pour a un rail de filtrage, et prend un statut de tous, non lu ou lu. La liste existante reste en l'état, il remplit le pont vivant, qui veut les plus récents et rien d'autre. Construit à partir de prédicats plutôt qu'une requête par combinaison de filtres, et délibérément pas à partir de (:qu'il est NULL OU ...) - un paramètre nul non typé est ce qui a fait chaque consultation de calendrier 500, et un prédicat omis ne peut pas le faire.
· kamo-shared-library
Que l'historique soit interrogé par spécification
L'historique par nature et par la question de savoir si une notification a été lire, et ceux qui combinent librement - qui en tant que JPQL est une requête par combinaison, ou une requête pleine de (en nature est NULL OU n.kind : kind). La seconde est ce qui a fait chaque calendrier de recherche de réponse 500: un paramètre nul Arrit untyd et PostgreSQL refuse purement et simplement la déclaration. Une spécification omet le prédicat plutôt que de passer un nul, de sorte que la faute ne peut pas se reproduire ici.
· kamo-internal
Reconstruire / note en tant que mur de papier avec un éditeur à vitre éclatée
La page était le dernier écran encore sur Tailwind raw blue-600/gris-50 alors que Tout autour de lui s'est déplacé vers le système de la maison, et chacun de ses 100 dollars. Les variantes étaient des valeurs mortes, les banches mondiales.css. Il a également ignoré la connaissance de l'accent, le jeton d'accent réservé exactement ce module. Reconstruit autour de la métaphore les données déjà porteuses: la palette est après par construction, donc les notes rendent en papier et en maçonnerie hauteur, a Une pente déterministe per-id qui se redresse sur le vol d'aiguillage, une tête d'épingle sur l'épingle note dans la teinte profonde de la note. Une note non colorée obtient du papier ordinaire plutôt que de la résolutionStickyColor()-sacrouement du citron, qui autrement peindre la paroi entière en jaune et dépenser la palette avant que le membre ne choisisse n'importe quoi. Les bandes suivent le type actif au lieu d'être fixe, donc un seul diviseur coûte de l'espace quand il dit quelque chose de vrai: la récence sous un tri de date, initiales sous un quart de titre, fréquence ouverte sous un tri de border-comtage. S'ajoute: une palette de commande, un rail de filtre écrasable de couleur les stats de murs, les stats de multi-select avec des actions de vitesse et de volume, clavier nav (Flèches N N P X), mise en évidence de la recherche, chargement de squelette dans la forme propre du mur, et les états séparés vides contre sans résultats. L'éditeur s'ouvre maintenant à côté du mur sur un séparateur traînable plutôt que remplacer la page, et est claveté par note id donc les notes de commutation la réinitialise. Filtrer, trier, bandes, équilibrement de maçonnerie et géométrie du papier app/lib/noteWall.ts derrière 48 tests unitaires. Contenu basé sur le DOM de NoteCard parer est parti - il a utilisé document.createElement, donc une note dont contentPlain was inachevé en sauvegarde rendu sans prévisualisation du côté serveur. Suppose NOTE-SORT-OPTIONS, qui ont expédié des étiquettes de tri en anglais codées en dur dans les 22 localités.
· kamo-internal
Pincer et déspiner une note de son bâton flottant
Le collant pouvait recouleur, renommer, minimiser, maximiser et fermer une note mais pas épingler - donc l'épinglage signifiait revenir à /notes pour la seule chose la note est déjà devant vous pour. L'épinglage est une propriété de la note plutôt que du collant, donc la bascule écrit directement à la note et retour via le cache partagé. C'est ce qui fait qu'il atterrit partout en même temps: la liste /notes, et les notes épinglées bande sur le pavé de lancement domestique (où il reste caché jusqu'à ce que le bâton est fermé, comme précédemment). Optimiste, et il remet la broche en arrière si l'écriture échoue. Composants Reuses.notes.card.pin / .unpin et la même icône l'éditeur Dessine, donc une broche signifie une chose sur les trois surfaces. Pas de nouvelles cordes.
· kamo-internal
Une fenêtre d'heures calmes, régissant les deux voies de notification
Il y en avait deux. La paire près du haut de la page a réduit au silence les cartes dans l'application; Une paire en bas a réduit au silence les e-mails manqués de messagerie. Rien à l'écran dit c'était des choses différentes, donc un membre fixant des heures de calme a dû remarquer le un deuxième ensemble existait et le fixait aussi - et l'hypothèse raisonnable, que la seule Ils avaient déjà couvert la soirée, ils avaient tort. La fenêtre en haut est maintenant la seule, et elle écrit les deux. Ils sont stockés par différents services et heures d'utilisation sur les préférences de notification du membre, Heures d'e-mails sur le ui-preference MediaService lise - donc le contrôle écrit deux fois, qui est exactement la plomberie d'un membre ne devrait jamais avoir à connaître. Les deux magasins sont réconciliés une fois, sur la charge, parce qu'un membre peut arriver avec un une fenêtre d'un côté et non de l'autre. Qui est fixé gagne: une fenêtre d'e-mail est adopté lorsque le côté in-app n'a pas, donc rien de ce que personne configuré est jeté loin, et sinon la fenêtre dans l'application est poussée vers l'extérieur de sorte que le contrôle unique sur l'écran dit la vérité sur les deux chaînes. La préférence par courrier électronique appartient maintenant au panel plutôt qu'à sa propre section. Deux composants débouclant des écritures à la même clé stockée se précipiteraient et pourraient persister une moitié d'une forme, et MediaService lit un champ absent comme par défaut membre n'a jamais choisi.
· kamo-internal
Deux significations de 100 % et une largeur de lecture, et la vitre entière
Le pourcentage de réinitialisation à une valeur de référence: la page a atteint la vitre mais plafonnée à 920px, qui sur un moniteur large laisse la bâche flottante en beaucoup bureau vide. Ce plafond est délibéré - une page de lettre étendue sur une L'affichage de 34 pouces est un pire document, pas un plus grand, parce que l'œil ne peut pas suivre une ligne aussi longue - mais ce n'est pas toujours ce que le membre veut. En lisant des petits caractères ou en travaillant une forme dense, ils veulent l'espace qu'ils ont. Il y en a donc maintenant deux, et une fourche dans la capsule choisit qui: la largeur lisible, coiffée à 920. Qu'est-ce que la vitre s'ouvre. largeur remplit la vitre, moins une gouttière 24px donc l'ombre de la feuille n'est pas coupé contre le bord et la page se lit comme prévu plutôt que les cultures. Ils sont un MODE, pas deux autres arrêts sur l'échelle de zoom, parce qu'ils sont des intentions différentes plutôt que des grossissements différents. Le zoom se multiplie quelle que soit la base de référence est active, donc la lecture reste honnête à propos de celle qu'il est un multiple de l'un ou l'autre de ces deux cas. Le changement de LANDS à l'inclusion dessus et le zoom revient à 100%. "Fit à la largeur" qui laisser un zoom de 250 % appliqué sur le dessus ne conviendrait pas à rien, et le membre a demandé une largeur, pas un multiplicateur de un. La bascule est un bouton avec "caracté" et ses noms d'infobullition La pression est fournie plutôt que ce qui se passe actuellement: "Ajust to Width" en page Mode, "Reset view" en mode largeur. Les deux clés existaient déjà et sont non-vide dans les 22 localités. maxPageWidthPour recouvrir les bords lors des essais: une mesure de la vitre NaN chute à la tête lisible plutôt que d'atteindre PdfPages en tant que maxPageWidth et ne rien rendre, et une vitre effondrée ne retourne jamais une largeur trop petite à Lire. Un picotement d'essai le fait que sur une vitre plus étroite que le capuchon des deux les modes convergeant vers l'intérieur de la gouttière - qui est correct plutôt qu'un bug à design autour.
· kamo-internal
Actualiser l'horloge NavTop dès que l'éditeur sauve
Viding the punch un membre est actuellement cadencé sous les laisse déjà OFF côté serveur: RosterService.clockState lit les derniers jets et couteaux LIVE des lignes annulées, donc aucun arrêt n'est écrit et aucune n'est nécessaire. Un cadeau ici serait pire que inutile - le SHIFT-IN avec lequel il s'associerait était juste annulé, donc il est un orphelin et élève l'exception de frappe manquante l'éditeur existe à clair. Ce qui n'était pas vraiment l'indicateur. Il interroge sur un plancher des années 60 sans signal de l'éditeur, donc après suppression de l'entrée ils ont été cadenrés sous le membre regarda le chrome continuer en disant qu'ils étaient sur l'horloge. L'éditeur annonce maintenant un sauvetage qui a écrit quelque chose et le contrôle re-lit. Tiré à partir de "finalement" et sur ce qu'il faut sur ce qu'il faut pour réussir: un économiser qui s'est arrêté à mi-chemin a encore changé le record, et c'est le cas lorsqu'un L'insigne rassis est le plus difficile à remarquer. L'événement porte la version éditée de la part de l'horloge NavTop. (fetchMyClockState ne prend pas d'id membre) alors que ce même éditeur est utilisé par HR contre d'autres membres à /hr/attendance. STRINGS et refuse un numéro, pour la raison parseClockState donne déjà: ids sont des valeurs uniques-rowid() passées MAX-SAFE-INTEGER et deux membres peuvent tourner au même nombre. Ne répare pas le navigateur de l'AUTOREUR membre lorsque le HR édite sa carte - qui a besoin le relais push de la carte hor.clock.memberimemberId, toujours en attente.
· kamo-internal
- zoomez le document, et attrapez-le pour le déplacer
Une capsule flottante en bas à droite de la vitre du document: pourcentage, Le LECTURE EST LA RÉSERVOIR - un bouton de réinitialisation séparé serait un troisième contrôle pour quelque chose que le membre ne veut qu'une fois qu'il peut déjà voir qu'ils ne sont pas à 100%, et où ils cherchent à vérifier, c'est le nombre. C'est un vrai bouton avec une étiquette, donc les lecteurs de clavier et d'écran l'atteignent. 100 % signifie FIT-TO-PANE, pas taille réelle. Le zoom multiplie la largeur de l'ajustement échelle PdfPages calcule déjà, et le point de vue dans lequel le membre a commencé est ce qui Ils signifient qu'ils font pression sur "100%". Les étapes sont multiplicatives (x1.25), pas 0,25: une marche fixe est un quart de la page à 100 % et un seizième de celle-ci à 400%, donc zoomer de loin prendrait une douzaine de presses. Le Les maths sont en app/lib/pdf-oom.ts avec des tests, y compris ce retour. exactement où vous étiez et qu'un NaN retombe en forme plutôt que atteindre PdfPages en tant qu'échelle et naturelle et NaN, ce qui rend zéro page et ressemble exactement au document qui ne se charge pas. DRAG TO PAN, où que ce soit ce n'est pas quelque chose que vous utilisezDragToPan writes scrollLeft/scrollTop plutôt que de transformer le contenu, donc il hérit des limites du conteneur, des pare-glaces et des roues libres et l'axe horizontal ne fait rien jusqu'à ce que la page soit plus large que la vitre, sans condition nulle part pour le dire. Il refuse de commencer entrée, zone de texte, sélection, bouton, a[href, étiquette, étiquette, étiquette, étiquette, étiquette, étiquette, étiquette, étiquette, étiquette, étiquette, étiquette, étiquette, étiquette, étiquette, étiquette, étiquette repos: il s'agit des cases de signature, des champs de texte et des groupes de cases à cocher InteractiveField rend, et les propres boutons de la capsule de zoom. Le pointeur est capturé sur le chemin en bas donc une traînée qui quitte la vitre continue à suivre et finit toujours proprement. MOUSE SEULEMENT. Toucher déjà les poêles nativement avec la quantité de mouvement et le bandage du caoutchouc qu'aucun manipulateur ici ne peut se reproduire, et détourner l'emporter ferait documenter pire sur les dispositifs où le traînage est le geste naturel. Un correctif de mise en page est fourni avec: PdfPages centre des pages avec Les éléments zalign-items: centre, et un élément flexible plus large que celui de son conteneur déborde ÉGliquement des deux côtés - la moitié gauche dont aucune position de défilement ne peut atteindre. Après avoir dépassé la largeur de la vitre aurait mis la marge de gauche de chaque page permanente hors de portée. L'enveloppe de la page devient maintenant la plus large page (-largeur: fit-content, au sol à la largeur min: 100%), donc l'ensemble b) reste à l'intérieur de la zone déroulante.
· kamo-internal
Notes déplées sur le bloc de lancement, rotation des couleurs et envoi correct
Trois choses. Les notes épinglées atteignent le rampe de lancement. Chaque note épinglée sur /notes obtient un puce là dans sa propre couleur collante, avec un aperçu court; en cliquant un le ramasse sur la superposition, et un contrôle de coin l'ouvre dans son intégralité à la place, pour les choses qu'un bâtoneux ne peut pas faire. Une note qui est CURRENTEMENT LA MONDITION est laissée de côté - c'est déjà sur l'écran du membre, et énumérerait qu'il offrirait la même note deux fois, la même règle qui fait sa carte /notes est inerte. Fermer le collant remet la puce. La bande ne rend que lorsque l'option notes a survécu à la porte de la nav, donc il ne décide en rien de l'accès seul, et il préfère la superposition copie mise en cache d'une note de sorte qu'une puce ne montre jamais un titre ou une couleur d'avant Il a été ramassé. Les nouvelles notes tournent à travers la palette. Chacun s'ouvre sur la couleur après la note CRÉE la plus récente du membre, enveloppant à l'extrémité, donc un mur de stickies n'est jamais un bloc de jaune identique. Cintes retirées des notes eux-mêmes plutôt qu'un compteur stocké, de sorte qu'il reste juste à travers les appareils et des sessions sans fin pour persister; un non-défaitement ou non reconnu la couleur précédente redémarre la rotation au lieu de deviner. Fermer une note la froisse maintenant. Un battement d'anticipation, puis il s'effondre, spins et gouttes, laissant une bouffée de déchets de papier dans sa propre couleur sur l'espace qu'il est parti. Les chutes sont rendues par la couche, et non par la Remarque: un enfant hérite de la transformation de sortie de la note et se rétrécirait avec elle au lieu d'éclater vers l'extérieur, donc la note passe sur sa dernière rectangle et couleur sur la sortie. Une note maximisée rafales à travers le une fenêtre d'affichage entière plutôt que la taille à laquelle elle serait redevenue; on ne fait pas éclater du tout, n'ayant pas de place sur l'écran pour éclater; et préfère-réduction-mouvement se fait sentir sans déchets. La dispersion est une hachage déterministe, pas Math.random, qui re-rollrait tous les rendus et gâcher les déchets à mi-vol.
· kamo-internal
Paramètres de notification sur toute la largeur, avec un modèle de travail
C'était une colonne de 760px de tiges de commutation, qui se lit comme un formulaire à remplir plutôt. que quelque chose à ajuster - et sur un écran large gauche deux tiers de la page vide tandis que la liste des types de notification s'est enfuie en bas. La vraie question de la page n'est pas "ce sont mes paramètres" mais "comment dur est-ce que c'est application permise à m'interrompre", donc il s'ouvre maintenant en répondant à cela dans un phrase assemblée à partir des valeurs live - dans l'application, avec un son, sur votre bureau, en dehors de vos heures de calme - et donne la largeur aux quatre décisions derrière elle: quels canaux, où ils atterrissent, quand rester tranquille, et ce qui est Cela vaut la peine d'être informé. La pièce maîtresse est une scène: la propre fenêtre d'affichage de l'application en miniature, peinte dans le les jetons sombres du pont de notification tandis que la page autour de lui reste claire, parce que c'est le contraste exact qu'une notification réelle fait lorsqu'elle arrive au-dessus d'un écran de travail. Le coin est choisi en cliquant sur le coin, et la carte ressorts à travers plutôt que de couper, donc le contrôle et ses conséquences sont un geste. Quatre quadrants ont été la liste déroulant ici: le choix est spatial, et le Les mots "inférieur à droite" sont une pire carte d'un écran qu'une image d'un écran. À côté de ça, montrez-moi soulève une véritable notification dans le vrai jeu de rôle du membre le son, le coin et le temps de licenciement. Une page de paramètres pour les notifications devrait être capable de vous montrer une notification, et une maquette serait une photo d'une - donc previewToast met une carte à jeter à travers le jeu réel, en n'écrivant rien, ne rien publier, et ne jamais atteindre le centre. Les sortes sont devenues des tuiles où toute la tuile est le commutateur, plutôt que des rangées avec a 34px toggl à l'extrême droite, et la section e-mail a adopté le panel propre lignes de sorte qu'il se lit comme une partie de la page plutôt qu'une carte qui s'est promenée. Une fois, on ne sait pas mal. C'était dans la bande résumée et à nouveau dans le Carte silencieuse - le même interrupteur deux fois sur un écran. Il vit avec le résumé, Ce qui est la chose qu'il change; la carte tranquille est laissée au genre prévu.
· kamo-internal
Les notifications deviennent un onglet sur le profil du membre
Ils étaient une page de leurs propres paramètres/réglages/notifications, qui ont donné une préférence. à propos d'une personne ailleurs que la page sur cette personne - et a quitté le Un courrier électronique manqué passe bloqué sur l'onglet profil, donc les deux moitiés de "Comment me faire dire des choses" vécu sur différents écrans. Les deux sont ici maintenant, le directement après Mon profil. Les e-mails changent de comportement exactement et même clé de préférence, même route me-scoped, même debounce et bouffées de bouffées de bouffées de bouffées et refrogeantes les primitives de la section et de la ligne du panneau de notification, de sorte qu'ils lisent dans le cadre de celui-ci plutôt que comme une carte qui errait. Ils restent une section distincte, et disent : que le canal vous atteint lorsque l'application est close, est écrit par un différents services, et garde ses propres heures de calme. Plier les deux séries d'heures en un seul contrôle, il changerait silencieusement ce que l'un d'entre eux gouverne. L'onglet est auto-auto, car chaque préférence derrière il est lu et écrit par le biais d'itinéraires à pointillés - sur le profil de quelqu'un d'autre, ces contrôles édiraient le spectateur est propre tout en apparaissant pour éditer les siens. Il récupère l'adresse du compte lui-même plutôt que de le retirer de l'onglet profil: les languettes des paramètres montent un à un temps, donc une valeur levée d'un frère ou d'une sœur serait manquant exactement quand un membre a ouvert d'abord cet onglet, qui à partir du lien Paramètres d'une notification est à chaque fois. L'ancienne route est partie, avec son sujet de réglages-menu, et les trois surfaces qui y est liée construisent maintenant le chemin à travers une aide - une voie assemblée à la main en trois endroits est une voie qui finit par ne pas être en désaccord avec elle-même.
· kamo-internal
Signer un paquet au/réglage/sign, sur un itinéraire propre
La signature était en ligne sur l'onglet profil du membre, de sorte que le document était libellé sous la bande de tabulation des réglages ET la bande de sous-onglet de conformité ET l'aide de cet onglet panneau : trois bandes de chrome non apparenté sur l'instrument que le membre est Il est demandé de lire et deux en-têtes. C'est maintenant - La page hérite de NavTop et NavPri comme tous les autres écrans et le groupe de héros du magicien est le seul en-tête. Finition ou abandon de retour - la liste Il est venu, sur le seau dans lequel se trouvait le colis. La liste navigue avec «push» et non avec 'push', pas 'replace': c'est un passage à un autre écran, donc le navigateur Back doit revenir à la liste. L'ALLOCLÉE A A TOUMA A J'ai commencé à bouger avec elle. « Rencontrer » est préfixé et nie par défaut, et c'est ce qui est un membre dont l'emploi est limité. Sans "/sets/sign" dessus, a Un ancien employé pourrait ouvrir sa liste de forfaits et être rebondi directement À elle par RestrictedMembershipGuard le moment où ils ont cliqué en un - a rediminuer la boucle sur la surface exacte qu'il existe de niveau pour rester atteignable, étant donné que les reconnaissances de conformité sont l'une des deux choses qu'elle protège. - restrictedRoutes.test.ts maintenant épingle que, y compris que le match n'est pas un à commencer: "/sets/signage" n'est pas "/sets/sign" (s/signes/signes). Pas de porte sur la page elle-même, délibérément. Un membre exécutant son propre l'accord de travail n'a pas de droit en matière de droits de l'homme et n'en aura jamais le cas. - et chaque critère d'évaluation derrière celui-ci est auto-arraché dans DocsService (LegalAssignmentOwnership, not LegalPackageAccess), la session décide donc dont elle est confiée et que quelqu'un d'autre répond 404. Un nu /settings/sign sans affectation retourne à la liste plutôt que signalement d'une erreur: il n'y a rien sur la page sans un et il n'y a aucun moyen pour l'organe pour l'y fournir. Un uid malformé montre l'erreur, parce que Le rebondissement cacherait un mauvais lien que quelqu'un est sur le point d'envoyer à nouveau.
· kamo-internal
Rappelez-vous la taille et la position de chaque note flottante par dispositif
La réouverture d'une note détachée le remet maintenant exactement là où il a été laissé, à la taille qui lui restait, sur cet écran. Le placement se fait par DISPOSITIF, délibérément. Les notes flottantes sont un la propriété du membre et reste du côté du serveur dans des préférences ui, de sorte qu'elle les suit partout; lorsqu'une note SITS est une propriété de l'écran en devant eux, et une disposition qui convient à un ordinateur de bureau de 27 pouces est erronée sur un ordinateur portable. Donc les placements en direct dans localStorage, mené par membre parce qu'un le navigateur est un appareil, mais peut être plus d'une personne. Les placements dépassent les besoins collants et la fermeture d'une note conserve son géométrie, qui est l'ensemble du point - donc le magasin est coiffé par membre et excite en premier, et une note qui est supprimée (ou 404s sur la restauration) donne son emplacement immédiatement en haut. Deux choses que cela devait faire correctement : - la déconnexion fait un stockage local de gros.clear(), qui aurait supprimé la disposition sur chaque panneau. Il capture et restaure maintenant cette clé la même manière qu'il fait déjà pour la cachette des maillons profonds. Remarque ids et les coordonnées seulement, ne jamais se contenter. - l'hydratation attend le membre id au lieu de courir au mont. Les emplacements sont à la portée des membres, donc restaurer avant que nous ne sachions qui est ignorerait silencieusement la disposition de cet appareil et retomberait à la géométrie inter-dispositifs. La mise en place de ce dispositif est la mise en place de cet appareil, sinon Préférence croisée de l'appareil en dernier transport, donc un tout nouvel appareil s'ouvre toujours à une disposition saine plutôt qu'à une cascade - et dans un sens ou deux, elle est re-fermée à la fenêtre de visualisation actuelle.
· kamo-internal
L'avance sur un rappel est lu, sans en mémoire - et un appel peut être rouvert
Deux choses, à propos d'un événement calendaire étant un endroit pauvre pour garder une copie de Le record de quelqu'un d'autre. Le dialogue de l'événement lit maintenant l'exemple du CRM. Son nom, le nombre à sonner, l'e-mail, le meilleur moment pour appeler - tous récupérés lorsque le dialogue s'ouvre, clété par le rappel id l'événement stocke déjà. Ce qu'il ne fait pas, c'est montrer une copie congelé au moment où l'appel a été réservé, qui est ce que la description utilisait pour porter et ce qui aurait dit tranquillement à un membre de sonner un numéro personne n'avait a répondu en quelques semaines. La description est maintenant la note du membre et rien d'autre part, ce qui ne peut pas devenir caduque parce qu'il n'a jamais été une copie de quoi que ce soit. Et un appel en attente peut être ouvert à partir de la page d'accueil. Cliquer on rouvre le même événement de calendrier dans le même dialogue, donc la place qu'un membre va à regarder a L'appel promis est l'endroit où ils peuvent le déplacer. L'épargne passe par le service de sécurité plutôt que l'API de calendrier, parce que l'enregistrement de rappel et l'événement sont deux les points de vue d'une promesse et seulement le service qui possède les deux peut les déplacer ensemble - l'alternative est une page chef de file et un calendrier qui ne sont pas d'accord sur la date à laquelle Appel est un rappel, et un rappel que les incendies contre celui-là que le membre ne lisent pas. La ligne elle-même est la commande; les boutons de résolution à côté d'elle arrêtent le clic, donc Personne ne marque un appel contacté alors qu'il signifie le lire.

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