Changelog
Qué hay de nuevo.
Cada mejora de la plataforma, a medida que se envía.
· kamo-internal
Escalca de la cascada, agregue acciones de rama a granel, explique la norma
El punto culminante de la cascada recorre ahora la cadena en lugar de destellos a cada afectado fila a la vez. enabledAncestors ya llega más cercano-primero, por lo que el índice ES el distancia recorrió el árbol y cada fila se retrasa en 90ms detrás de la última. verlo mover hijo a padre a abuelo es lo que enseña la regla, que a flash se lee como un fallo. Todavía instantáneo bajo la medida de preferencas-reducida-movimiento. Conceder todo / Quitar todo en una rama, mostrado sólo cuando cambiarían algo. Explotado a través de la aplicaciónToggle por derecho en lugar de escribir la configuración directamente: a la acción a granel no debe convertirse en una segunda aplicación de las normas en cascada que deriva de la única en derechosHierarchy.ts. La píldora concedida/total ahora siempre está en una fila de padres en lugar de sólo cuando Se derrumbó, es la lectura más rápida de lo que una sucursal realmente otorga. También hace jerarquíaHeading/jerarquíaBody, a la que el compromiso anterior añadió a el diccionario y nunca se usó. Mostrado sólo por encima de un grupo que realmente tiene Anidando; una pancarta que aparece en todas partes es una que la gente aprende a saltarse. derechosTreeForest.test.ts pins la regla de anclaje el árbol y los tipos de rama compartido editor: un derecho cuyo padre se filtra fuera del grupo actual se adhiere al antepasado PRESENT más cercano, o se convierte en una raíz. Al revés hace un Grantable permiso desaparece del editor sin nada que lo indique y es accesible en la práctica, porque EDIT-QUOTE-TERMS se declara CRM mientras que su POS es POS.
· kamo-internal
Mostrar y hacer cumplir la jerarquía de permisos en los cinco editores
Cinco editores concedieron 199 derechos como cinco listas planas de casillas, y ninguno de ellos demostraron que un derecho puede ser un requisito previo para otro. Concesión de un niño sin su padre parecía exactamente como conceder un permiso de trabajo que es cómo la pestaña Legal y Cumplimiento necesitaba dos derechos y ningún editor podía decirlo. RightsTree hace que el árbol: hendidura con una columna vertebral de conector, plegable ramas, una píldora total concedida/total por rama, búsqueda que mantiene a los antepasados de un partido visible, y una cascada que se anima porque la animación es lo que enseña el Regla - permitir a un niño ilumina lo que depende, deshabilitando a un padre arruinar su subárbol, ambos con un tostado de deshacer nombrando exactamente lo que se movió. Honores prefers-reducido-moción. También deja de mentir sobre tres estados que los editores nunca pudieron expresar: derechos Encerrados por el modelo de seguridad de la org, concediendo filas heredadas con permiso no eterno cuyo padre es negados, y los 58 derechos que son granizables pero no hay nada en ninguna parte. Un administrador No podía decir previamente un permiso real de un marcador de posición. Las reglas de cascada viven en app/lib/rightsHierarchy.ts, reflejadas en Java's RoleRightType. Una copia de una regla de garantía es una responsabilidad, por lo que la prueba de paridad dice la fuente de Java y fracasa en cualquier divergencia en lugar de una convención de confianza. El editor de plantillas tipo rama obtiene el pedido y la indentación, pero mantiene su control propio y NO auto-cascade: esos son valores de FORCE, absolutos y aplicado después de cada nivel, por lo que en cascada reescribiría silenciosamente un deliberado Anulación. La relación de padres todavía se aplica allí en el momento de la resolución. Diseño - la auditoría reproducible: documentos/superpotencias/especificaciones/
· SecurityService
Normalizar a miembro contra la jerarquía
Los derechos directos de los miembros pasan ahora por RightsHierarchy.normaliceLevel antes de que persisten: un niño concedido tira de sus antepasados a GRANTED en el miembro nivel, un padre negado empuja a NUKE por su subáris. Al lado del servidor en lugar de confiar en el editor, porque este endpoint es alcanzable directamente. Un nivel almacenado con un niño, pero no su padre, es precisamente lo que El paso de cierre de resolución se desnuda más tarde - el miembro seguiría perdiendo un derecho el IU se mostró como concedida, sin nada que explicarlo. Recogido primero en un mapa para que la jerarquía vea todo el nivel inmediatamente; normalizar la entrada por entrada dependería de la orden que el cliente enviara.
· InitializerService
Ancestros relleno para que el cierre no pueda eliminar el acceso
MiembroRightsAppliedService niega ahora cualquier derecho cuya cadena matriz no sea concedidos. Cada fila escrita antes de que existiera la jerarquía no sabe nada de los antepasados, así que un rol de la organización de MANAGE-SUBSCRIPTION-PLANS sin ACCESS-COMMERCE totalmente normal hasta ahora - lo perdería en el próximo nuevo cálculo. En el otro lado 13 organizaciones vivas que es un apagón, no una migración. Trae los cuatro niveles (papeles de oreja, departamentos, títulos de trabajo, miembros anulados) a la invariante que los caminos de escritura mantienen ahora, usando la misma regla: un concedido descendiente tira de sus antepasados hasta GRANTED. El paso 2 es el que en realidad evita el corte de entrega, que da una voltea a un antepasado explícitamente DENIED a concedido, porque filas que existen sobreviven paso 1 intacto y el cierre revocaría cada descendiente debajo de ellos. Las plantillas de modelos de seguridad NO se tocan deliberadamente: un FORCE-NUKE en un padre es un administrador que cambia un subáris a propósito, y cierre honor Esa es la característica. Paso 3 es un GATE, no una línea de registro: vuelve a comprobar la invariante y falla la carrera si cualquier nivel aún tiene un descendiente concedido bajo un ancestro no concedido. A migración que reportó éxito con una violación que dejó atrás daría la mano problema a la resolución, donde sale a la superficie como miembro perdiendo silenciosamente un permiso sin nada para explicarlo.
· kamo-shared-library
Jerarquía de padres/hijo para todos los 199 derechos
RoleRightType ha declarado un campo "padre" y un aprendiz público durante años. Cada constante pasó nula y nada lo llamó. Esto termina eso. andociatíos: 135 niños, 34 raíces, 30 standalone, máx. profundidad 3, derivado de un auditoría de los 199 derechos de más de 15.081 archivos de fuentes en los 40 repos. Dos puntos de aplicación, y la división es el diseño: normalizarLevel() es AUTHORING. Hace de un nivel auto-consistente - un concedido niño tira de sus antepasados a ese nivel, un padre negado empuja a NUKE hacia abajo su subárbol allí. Aplicado en los caminos de papel, departamento y trabajo. Porque cada nivel se mantiene coherente, un título de trabajo que otorga también un hijo concede becas el padre de los tres, y la cascada existente ya permite a los más específicos El nivel golpeó a un departamento que lo negó. Ninguna regla de precedencia a nivel cruzado era añadido y la cascada está intacta. applyClosure() es RESOLUCIda, anexada después de su aplicaciónTemplateRules. Es un red de seguridad para las dos únicas cosas que no pueden llegar: un modelo de seguridad FORCE-NUKE sobre un padre (absoluto, aplicado último, así que sin esto una forzada-off El padre deja a sus hijos concedidos) y las filas escritas antes de todo esto. Dos pares permanecen deliberadamente FLAT porque la separación de funciones depende de ella: APPROVE-TIMECARD-ADJUSTMENTS / FINALIZE-PAY-PERIODS, y APPROVE-ORG-PAYOUTS como un hermano de MANAGE-ORG-FINANCES en lugar de su hijo. obligaría a todos los pagadores a ser también un emisor. Diseño: kamo-internal ****************
· kamo-internal
Repage el recordatorio en el color de la org, abre sus opciones en su lugar
La tarjeta es ahora el color principal de la organización, con cada marca en ella difusiva en...en-primaria en lugar de un blanco literal - un org en marca blanca que elige un pálido primario puede volver aclarar esa ficha y mover toda la tarjeta. Chips, raíles y los bordes se mezclan de color del mismo token para que se queden legibles de cualquier manera. La acción principal es una píldora invertida, que coincide con el idioma de la firma legal El héroe ya utiliza para un botón en una banda de color. La columna vertebral de acento por tipo se ha ido; el icono ya lleva el tipo, y un Segundo color en una tarjeta de color sólo lo enturbió. El sobredebado es la excepción, y se invierte en lugar de volverse rojo: el rojo sobre un color arbitrario de org es ilegible. Sus menús Snooze y Más Menús MUI, que portal al documento y traen un pergín con ellos. Esa cerraja pone desbordamiento: escondite y una compensación Acolchado-derecha en el documento.body, y el acolchado el cuerpo mueve cada posición fija elemento en la página - por lo que la cubierta, que se fija en la parte inferior/derecha 20, saltó lado el momento en que cualquiera se acercó a Snooze, y el menú cubrió la tarjeta Perteneció a. Ambos son un panel en línea ahora, expandiéndose dentro de la tarjeta con el gatillo de la izquierda iluminado. Sin portal, sin candado de desplazamiento, nada que cubrir.
· kamo-internal
Pestaña de configuración de ajuste legal legal legal legal legal legal legal legal legal legal legal legal legal legal legal legal legal legal legal
Una nueva pestaña en /settings/caracteres/casa de detención de texto legal predeterminado, enlazado desde el el menú de configuración y la configuración launchpad. Creación de un paquete en /hr/legal-compliance ahora comienza de ella, y ese campo es tres filas más alto. DERECHOS. La página de configuración de HRS en su conjunto ahora se niega a RENDER sin MANAGE-HRS-SETTINGS en lugar de redirección: la redirección es un efecto, por lo que no puede correr hasta después de un render, y cada ficha estaba pintando y disparando su Cargas de montura para un miembro que no tiene la derecha. La nueva ficha Además, necesita MANAGE-LEGAL-AND-COMPLIANCE, mantenida idéntica en tres lugares (página, enlace de menú, tarjeta de lanzamiento) y sujetado por una prueba, porque un enlace ofrecido a alguien la página no renderizará la pestaña para abrir Provider Setup en su lugar: SettingsView resuelve un desconocido ?tab= a index 0 en lugar de error. El diálogo se fija el valor predeterminado sólo mientras el autor no ha escrito el de la letra se resuelve después de que ya podrían estar escribiendo. semillaDefaultAttestation es una pura auxiliar para que la regla sea comprobable, y se aplica OUTSIDE el actualizador estatal: Reactan doblemente invoca a los presentadores en el desarrollo, que dejaron la instantánea de la semilla avanzado y la segunda llamada rechazando su propio cambio. Un EDIT nunca vuelve a sembrar. El paquete lleva su propia redacción y sobrescribirlo Reescribiría lo que se pide a la audiencia de una versión publicada que acepte.
· kamo-internal
rico texto en las previsualizar y las previsuales, y un modo que puedes cambiar
Una nota ahora dice si es texto rico o texto plano, y tanto el editor y el pegajoso flotante puede cambiarlo. La nota flotante en modo rico incrusta el mismo editor /notes utiliza, así que tiene todas las herramientas que la página completa tiene "vestida con el propio color de esa nota" a través de un nuevo soporte opcional en KbArticleEditor. El utilero es aditivo: ausente, el editor se ve exactamente como lo hizo, así que el conocimiento base está intacta. La barra de herramientas envuelve y se desplaza en lugar de empujar el zona de salida de un estrecho pegajoso. Cambiar rico - . . . . . . . . . . . . . . . . . . pregunta primero, y dice claramente que el se descarta y no se puede recuperar mientras se guarda el texto. No lo es. ocultos - modo liso no tiene dónde ponerlo - por lo que la conversión también instantáneas una versión, dejando el viejo formato recuperable de la historia. Llanura - rico simplemente enciende las herramientas y no necesita advertencia. Los previsualizaciones en las tarjetas de pared y los chips de launchpad ahora muestran lo real contenido en lugar de una línea aplanada. Reparten a través de un standalone lexicalToHtml en lugar de una instancia Lexical montada: una pared es docenas de cartas, y cada una arrastraría en todo el tiempo de ejecución del editor a mostrar un párrafo. Esa salida se inyecta, y el contenido de la nota es miembro-escrito y a menudo pegado, por lo que es la parte sensible a la seguridad y fue escrito test-first-caping, un esquema que permite la negativa javascript: y datos: (incluyendo pestaña- y caja-obfuscado), comillas-escapado dentro de href, y notas heredadas crudas-HTML mostramos como texto en lugar de renderizado. Mientras que una búsqueda está ejecutando las cartas mantener la vista previa resaltada: marcar el éxito importa más en la mitad de la búsqueda, y no se puede destacar HTML sin re-parar lo que se acaba de serializar. También: las notas flotantes llevan el fondo configurable del org marca de agua, la misma que usan las páginas de contenido, honrando la org's configuración de BgWatermark incluyendo NONE. Se acentuó como parte de la nota para que se mantiene en cualquier tamaño, y un poco más fuerte que las páginas utilizan porque a Pegajoso se sienta en papel saturado en lugar de casi blanco.
· KBService
Llerar el modo de texto rico de una nota / texto plano a través de la API
Crear honores el modo solicitado y por defectos a ricos, que coincidan con el editor se crea una nota. Actualización es nula como cualquier otro campo en ese extremo, por lo que un llamante que envía sólo esRichText no la nota en blanco. El DTO lee a través de esRichTextOrDefault(), así que una fila que de alguna manera Se informó que el relleno fue rico. Erring hacia la conservación formatear es la dirección segura: el contrario presentaría un formato nota como simple e invita al miembro a aplanarlo.
· InitializerService
Añada la columna is-rich-text, por defecto y llenada a rica
Si una nota se edita como texto rico o texto plano no se puede volver a leer fuera de su contenido: una nota rica que nadie ha formateado todavía es byte-for-byte Una simple. Sin una columna el editor pierde su barra de herramientas cada vez que el La nota está reabierta. TRUE fallecida, que es también lo que permite a YugabyteDB añadir la columna a un mesa que ya tiene filas. TRUE específicamente porque cada nota escrita antes de que la columna existiera fue de la autoría en el editor rico. sólo el editor allí estaba, así que el relleno de FALSE mostraría formateado notas tan simples y ofrecen aplanarlas. Orden (0) por la razón habitual: el momento compartido mapea la columna, cada corredor que carga una nota lo SELECTs, así que una migración tardía nunca es alcanzado. Buques con la guardia de deriva que este paquete utiliza la columna nombre de la entidad en lugar de reintegarlo, y fue comprobado rompiendo el nombre y verlo fracasar. Aplicado contra Yugabyte: columna presente como boolean por defecto true, todo filas existentes retrocuperadas a true, sin NULLs.
· kamo-shared-library
Una nota registra si es texto rico o texto plano
El modo no puede derivarse del contenido. Una nota rica que el miembro tiene no formateado todavía serializa byte-for-byte identically a uno llano . ambos son un documento Lexical de párrafos no al estilo, así que sin algún lugar Para mantenerlo, el editor pierde su barra de herramientas cada vez que se reabre la nota. Fallece a los ricos, y la columna se vuelve a llenar a TRUE, porque cada nota que es anterior a la bandera fue de la autoría en el editor rico; era el único uno lo había. Relleno de FALSE presentaría notas formateadas como simples e invita al miembro a aplanarlos. Entornable a propósito, con RichTextOrDefault () leyendo una bandera desenmasqueada como rico: una fila que de alguna manera escapa al relleno de hombros hacia el mantenimiento formatear, no para desecharlo.
· kamo-internal
Una página para las notificaciones y los controles sobre ellos
La página de notificaciones llevaba una cabecera propia, una ceja, un título y tres botones de píldora dentro de una tarjeta bordeada mientras cada página vecina (la cuenta navegador, cada pantalla de configuración) es introducido por el héroe de gradiente de la marca con un flecha y una barra de pestañas debajo de ella. Se leía como en otro lugar del producto. Es ahora lleva la misma cabecera, con el conteo sin leer que su subtítulo y los dos acciones que operan en la lista como botones blancos del héroe. Bajo ella, dos pestañas: Notificaciones y Configuración. Los ajustes son los que solía ser una pestaña en el perfil propio del miembro en /settings/member/-id?tab= notificaciones que ponen los controles sobre las notificaciones en una pantalla diferente de las notificaciones propiamente dichas, un sujeto en dos lugares, ninguno de los cuales mencionó al otro. Un miembro que abre la campanilla porque no se detendrá ahora ya en la página que puede detenerlo. Se comparte a través de NOTICIA.TABS, por lo que la barra y las superficies que conectan profundamente en ella no pueden A la deriva en un valor que no seleccione nada. Ambas superficies que se unen a la antigua ubicación (la acción de configuración de la cubierta de tostadas, el propio botón Configuración de la página, ahora una pestaña) ir a NOTIFICATION.SETTINGS-HREF. An el viejo marcador de la URL del miembro todavía resuelve . SettingsView cae de nuevo en el primera pestaña para un "?tab=" no reconoce. La copia de los Consejos Rápidos que colgaba de la antigua pestaña (settings.notifications.help.*) es no llevado: el cajón de ayuda es una ayuda de ConfiguraciónVida y esta página tiene Ninguno. Las llaves quedan en el diccionario en lugar de fregado.
· DocsService
GET/PATCH el texto legal por defecto de la org
/api/docs/legal/settings, detrás del mismo embudo custodiado que cualquier otro mapeo en este controlador. La lectura NUNCA crea una fila: se resuelven con LegalDefaults cuando la org tiene No, ninguno. Eso mantiene libre de efecto secundario a la semilla del editor del paquete y es lo que cubre las organizaciones creadas después de la semilla KamoInitializer corrió. materializado en la primera salvada, donde pertenece una escritura. El conjunto correcto es deliberadamente más amplio que el paquete de endpoints. Este punto final se llega desde la pestaña de configuración de Legal & Compliance (MANAGE-HRS-SETTINGS) y del editor de paquetes (MANAGE-LEGAL-AND-COMPLIANCE); o de solo 403s una pantalla en un campo que posee. Es seguro de ensanchar porque es una cadena de nivel de org de caldera, sin lista, sin asignación, sin pruebas y una prueba de regresión pines que el ensanchamiento no alcanza lista/crear/audiencia-previsualización. Semántica PATCH: un campo ausente está intacto, una cuerda vacía es un deliberado despejado. La publicación ya rechaza un certificado en blanco, por lo que un default despejado sólo hace que el autor escriba los suyos.
· InitializerService
Semilla a cada organización un texto legal por defecto
Un hr.legal-settings row per org, único en org-id, portando ******************* INSERT-ONLY, nunca una Actualización. Una organización que ha editado su propia redacción la posee; un redespliegue reescribiendo silenciosamente la sentencia que se le pide a su pueblo legalmente Acordar sería el peor comportamiento posible para esta cadena. Eso también hace el corredor idempotente. Orgs creados DESTER estas carreras están cubiertas por la lectura de DocsService reposiciono en lugar de mediante org provisioning, por lo que un futuro camino de aprovisionamiento que olvidó la la llamada no puede enviar una org cuyo texto legal por defecto está en blanco. Ambas declaraciones retenida 40001: un tiro de una ComandLineRunner aborta el todo inicializador y salta cada corredor ordenado después de él.
· kamo-shared-library
Texto legal por defecto a nivel de Org
LegalSettings es una fila por organización llevando la redacción de una NUEVO legal El paquete empieza con. Es un DEFAULT, nunca una referencia en vivo: crear un el paquete copia el texto y la publicación congela esa copia en una versión, así que editarlo aquí no puede alterar un paquete que existe o alguien ya ha Acordó hacerlo. LegalDefaults mantiene la redacción de la plataforma en el lugar ONE. El KamoInitializer semilla, el DocsService leyó la caída y el campo de configuración se unen a él. tres literales irían a la deriva y ojo a ambos lados de la migración entonces No está de acuerdo sobre cuál es el default.
· kamo-internal
La historia se convierte en una página, y suena la campana
La campana abrió un popover, que es la forma correcta para "lo que acaba de pasar" y el equivocado para "qué dijo ese recordatorio el martes". Un panel colgando de un barra de herramientas no se puede llamar, no se puede filtrar sin aglopearse, y se cierra cuando usted clic en cualquier cosa para que un miembro pueda ver algunas notificaciones recientes no leídas y Nada más. Todo lo que ya se leía ya se había ido. Eso es un pobre. propiedad para el registro de lo que la aplicación le ha dicho a alguien. /Noificaciones es ese registro. Se lee como una cronología en lugar de una lista, porque las notificaciones son eventos y la pregunta que trae un miembro es casi Siempre "cuándo": una columna vertebral de días con las notificaciones colgando de ella, cada punto en el color de su propia especie, así que un mes de historia se lee como bandas antes de un sencillo se lee la palabra. Las filas no leídas llevan el suelo y las leen llevan sólo el punto, que es la diferencia que se está escaneando. El carril de filtro estrecha lo que el la columna vertebral se mantiene en lugar de reordenarlo - leer, sin leer o ambos, y por tipo con un conteo contra cada uno. La jornada de agrupación es consciente del calendario en lugar de las horas de duración: a la mitad medianoche, algo de hace cuatro horas pasó ayer, y "hace 4h" no es para qué escanear una persona que lo busque. Cualquier cosa que el servidor no pudiera salir se mantiene y se agrupa, cuando no puede reclamar un día al que no pertenezca. La campana es ahora un eslabón, maldito como las otras dos marcas de atención en el bar, así que Los tres leen lo mismo. Lo que difiere es el movimiento, y deliberadamente: un documento pendiente y un reloj corrido son estados, y pulsan un anillo que dice "todando verdad". Una notificación no leída es un evento, y lo que hace una campana cuando Un evento sucede es un anillo. Así que se balancea una vez y se asenta, amplitudes a la mitad, con una media de 12o 9o, 6o de 3o de 1,5o, pivotando en la corona porque cuelga una campanilla y luego descansa cuatro segundos. Una campana que nunca se detuvo sería una alarma, y el conteo ya dice que la cosa persiste.
· EmailService
Una historia filtrable y de página
El centro podría responder a una pregunta: el más reciente cien, sin leer o no, sin forma de preguntar por lo que ya se había leído. Así que cualquier cosa que un miembro hubiera visto se había ido, en la práctica, que es una propiedad pobre para el registro de lo que el La aplicación se lo ha dicho a alguien. GET /api/notificaciones/páginas de navegación, reporta el total, cuenta cada tipo para un filtrar el carril, y toma un estado de todos, sin leer o leer. La lista existente se queda Así era: llena la cubierta viva, lo que quiere lo más nuevo y nada más. Construido a partir de predicados en lugar de una consulta por combinación de filtros, y deliberadamente no de (: amable IS NULL OR ...) Un parámetro null no tipo es lo que hizo que cada calendario buscara 500, y un predicado omitido no puede hacer eso.
· kamo-shared-library
Que la historia se cuida por especificación
El historial navegable se filtra por especie y por si una notificación ha sido leer, y aquellos que se combinan libremente, que como JPQL es una consulta por combinación, o una consulta llena de (: amable ES NULL OR n.kind =: amable). La segunda es lo que hizo que cada calendario buscara respuesta 500: un parámetro nulo Llega sin escribir y PostgreSQL rechaza la declaración de plano. Una especificación omite el predicado en lugar de pasar una nulidad, por lo que la culpa no puede repetirse aquí.
· kamo-internal
Reconstruir /notes como una pared de papel con un editor de dos enpantas
La página era la última pantalla todavía en crudo Tailwind azul-600/griy-50 mientras todo lo que lo rodea se trasladó al sistema de la casa, y cada uno de sus 100 libras Las variantes eran el código muerto globals.csss pins de colores: luz. También ignoró el conocimiento de acento reservado para exactamente este módulo. Reconstruido alrededor de la metáfora que los datos ya llevan: la paleta es post-it por construcción, así que las notas se vuelven como papel y mampostería alturas, un inclinación determinista per-id que se endereza en flotar, una cabeza de alfiler en el pegado notas en el propio tono profundo de la nota. Una nota sin color recibe papel plano en lugar de resolver el retroceso de limón de StickyColor, que de otra manera pintar todo el muro amarillo y pasar la paleta antes de que el miembro elija lo que sea. Las bandas siguen el tipo activo en lugar de ser arreglada, así que un divisor sólo cuesta espacio cuando dice algo cierto: la regencia bajo un tipo de fecha, iniciales bajo un título, abierta-frecuencia bajo un tipo de recuento de vistas. Añade también: una paleta de comandos (K), un carril de filtro plegable con color swatches y estadísticas de pared, multiseleccionados con acciones de cambio y a granel, nav de teclado (/ .K N P F X flechas), resaltado de búsqueda, carga de esqueleto en la propia forma de la pared, y los estados separados vacíos vs-no-resultados. El editor ahora abre al lado de la pared en un divisor arrastrable en lugar de sustitución de la página, y está teclado por id de nota por lo que las notas de cambio la restablecen. Filtrar, clasificar, seguir de banda, equilibrio de mampostería y geometría de papel se desplazan a app/lib/noteWall.ts detrás de 48 pruebas de unidad. Contenido basado en DOM de NoteCard Parser se ha ido. usó documento.createElement, por lo que una nota contentPlain fue anulado en excepto sin presentación de vista previa en todo el lado del servidor. Retirá NOTA.SORT-OPTIONS, que enviaba etiquetas de tipo inglés codificadas consoras en los 22 locales.
· kamo-internal
Pin y desenrosque una nota de su flotante pegajoso
El pegajoso podría redistecar, renombrar, minimizar, maximizar y cerrar una nota, pero no fijarlo, así que fijar significaba volver a /notadas para una cosa La nota ya está delante de ti. Pinning es una propiedad de la nota más que de lo pegajoso, así que el desfilatorio escribe directamente a través de la nota y de vuelta a través del caché compartido. Eso es lo que lo hace aterrizar por todas partes a la vez: la lista /notes, y las notas clavadas banda en el home launchpad (donde permanece escondido hasta que el pegajoso está cerrado, como antes). Optimista, y pone el alfiler de nuevo si la escritura falla. Reutiliza componentes.notes.card.pin / .unpin y el mismo icono el editor dibuja, por lo que un alfiler significa una cosa en las tres superficies. No hay nuevas cuerdas.
· kamo-internal
Una ventana de horas tranquilas, gobernando ambos canales de notificación
Eran dos. La pareja cerca de la parte superior de la página silenció las tarjetas de la aplicación; el Par en la parte inferior silenció los correos electrónicos de mensajes perdidos. Nada en la pantalla dijo nada eran cosas diferentes, así que un miembro que fijaba horas tranquilas tenía que notar el segundo set existió y lo estableció también. Ya habían llenado cubierto la noche, estaba mal. La ventana de la parte superior es ahora la única, y escribe ambas cosas. Se almacenan por diferentes servicios - horas en la aplicación en las preferencias de notificación del miembro, horas de correo electrónico en la ui-preferencia MediaService lee , por lo que el control escribe dos veces, que es exactamente la fontanería que un miembro nunca debería tener que saber. Las dos tiendas se concilian una vez, en carga, porque un miembro puede llegar con un ventana a un lado y no al otro. Lo que sea que esté listo gana: una ventana de correo electrónico es adoptado cuando el lado de la aplicación no tiene ninguno, por lo que nada de lo que nadie configura es lanzado lejos, y de lo contrario la ventana en la aplicación se empuja hacia afuera por lo que el único control en La pantalla está diciendo la verdad sobre ambos canales. La preferencia por correo electrónico es propiedad del panel ahora en lugar de por su propia sección. Dos componentes deborrar escriben a la misma clave almacenada correrían y podrían perdácen media forma, y MediaService lee un campo ausente como un default el el miembro nunca eligió.
· kamo-internal
Dos significados del 100% a una anchura de lectura, y todo el cristal
El porcentaje se restablece a una línea de base: la página creció al panel pero tapado a 920px, que en un amplio monitor deja la hoja flotando en una gran cantidad de de escritorio vacío. Esa gorra es deliberada. Una página de cartas estirada a través de un La visualización de 34 pulgadas es un documento peor, no más grande, porque el ojo no puede rastrear una línea tan larga, pero no siempre es lo que el miembro quiere. Leyendo letra con estampado fino o trabajando en una forma densa, quieren el espacio que tienen. Así que ahora hay dos, y un movimiento de en juego en las selizaciones de la cápsula que: página el ancho legible, tapado a 920. A lo que se abre el panel. el ancho llena el panel, menos una canaleta de 24px para que la sombra de la hoja no sea Cortado contra el borde y la página se lee como se coloca más bien que recortado. Son un MODE, no dos paradas más en la escalera del zoom, porque lo son diferentes intenciones más que diferentes magnificaciones. Zoom se multiplica cualquier punto de referencia que esté activa, por lo que la lectura se mantiene honesta sobre la que es un múltiplo de, y / / - todavía funcionan de cualquiera de los dos. Cambiar la base de referencia de LANDS en él. El zoom vuelve al 100%. "Apto a ancho" que dejó un zoom del 250% aplicado en la parte superior no encajaría en nada, y el miembro pidió una anchura, no un multiplicador de uno. El peggle es un botón con la presión de la aria, y sus nombres de punta de herramientas QUEAT PRESSING Hágalo en lugar de lo que está actualmente en: "Apto para Ancho" en la página modo, "Reset view" en modo de anchura. Ambas llaves ya existían y son no vacía en los 22 locales. maxPageWidthPara cubrir los bordes en las pruebas: cae una medición de panel NaN volver a la tapa legible en lugar de llegar a PdfPages como maxPageWidth y no renderizar nada, y un panel colapsado nunca devuelve un ancho demasiado pequeño a - Lea. Una prueba pone el hecho de que en un panel más estrecho que la tapa los dos los modos convergen dentro de la canaleta que es correcto en lugar de un error a diseño alrededor.
· kamo-internal
Refresca el reloj NavTop en el momento que el editor salva
Vaciarlos con el puñetazo que un miembro está actualmente encerrado ya los deja OFF lado del servidor: RosterService.clockState lee el último golpe en vivo y saltos filas anuladas, así que no hay relojes escritos y no se necesita ninguno. Un SHIFT-OUT aquí sería peor que inútil. El SHIFT-IN con el que se emparejaría fue anulado, para que aterrice como huérfano y levante la excepción de golpe perdido al editor existe para despejar. Lo que realmente estaba mal era el indicador. Encuesta en un piso de los 60 con no señal del editor, así que después de borrar la entrada fueron enganchados El miembro vio el cromo seguir diciendo que estaban en el reloj. El editor anuncia ahora un ahorro que escribió algo y el control releye. Despido de "final" y cerrado en lo que LANDED en vez de en el éxito: un ahorro que se detuvo a mitad de camino todavía cambió el récord, y ese es el caso donde a La insignia rancia es lo más difícil de notar. El evento lleva al miembro editadoId porque el reloj NavTop está autoscopiodo (fetchMyClockState no toma ningún miembro id) mientras que este mismo editor es utilizado por HR contra otros miembros en /hr/asistencia. shouldRefreshClockPara compararse como STRINGS y rechaza un número, por lo que parseClockState ya da: Los ids son valores únicos.rowid() más allá de MAX-SAFE-INTEGER y dos miembros pueden redondear al mismo número. No arregla el navegador del miembro de la otra cosa cuando HR edita su tarjeta. el tiempo.clock..mememberId push relay, todavía pendiente.
· kamo-internal
Acerca el documento, y agálalo para moverlo
Una cápsula flotante en la parte inferior derecha del panel de documentos: porcentaje, . La LEA DE Qué es el RESET.Un botón de reinicio separado sería un tercer control para algo que el miembro sólo quiere una vez que ya puede ver que no están al 100%, y donde buscan comprobarlo es el número. Es un botón real con una etiqueta, para que los lectores de teclado y pantalla lleguen a él. 100% significa FIT-TO-PANE, no tamaño real. Multiplica el ancho en forma escala PdfPages ya calcula, y la opinión en la que el miembro comenzó es en lo que significan que cuando presionan "100%". Los pasos son multiplicativos (x1.25), no 0,25: un paso fijo es un cuarto de la página al 100% y un decimosexto de ella al 400%, así que hacer zoom desde lejos tomaría una docena de prensas. El Las matemáticas están en app/lib/pdfZoom.ts con pruebas, incluyendo que "a" . . . devuelve exactamente donde estabas y que un NaN vuelve a encajar en lugar de llegar a PdfPages como escala = naturalScale * NaN, que renderiza páginas cero y se parece precisamente al documento que no se carga. DRAG TO PAN, en cualquier lugar que no sea algo que usted opera. useDragToPan escribe scrolliziz izquierda/scrollTop en lugar de transformar el contenido, por lo que hereda los límites del contenedor, las barras de desplazamiento y el comportamiento de la rueda de forma gratuita. y el eje horizontal simplemente no hace nada hasta que la página es más ancha que el panel, sin condiciones en ninguna parte para decirlo. Se niega a empezar entrada, área de texto, selección, botón, a[href], etiqueta, [role=radiogroup] y descanso: esas son las cajas de firmas, campos de texto y grupos de casillas InteractiveField renders, y los propios botones de la cápsula zoom. El puntero es capturado en el camino hacia abajo, por lo que un arrastre que deja el panel sigue rastreando y aún así termina limpiamente. SOLO meramente. Toque ya sartén nativamente con ímpetu y salada de goma que ningún manejador aquí puede reproducirse, y secuestrarlo haría el documentar peor en los dispositivos donde el arrastre es el gesto natural. Una solución de diseño viene con esto: PdfPages centra páginas con ítems de Alineación: centro, y un elemento flexible más ancho que sus desbordamientos de contenedores EQUALLY en ambos lados - la mitad izquierda de la que no puede colocarse de desplazamiento alcance. Zooming más allá del ancho del cristal habría puesto el margen izquierdo de cada página permanentemente fuera de su alcance. El envoltorio de página ahora crece a la más ancha página (ancho: ajuste-content, pisoteado en el ancho de la zona: 100%), por lo que todo hoja permanece dentro de la zona de desplazamiento.
· kamo-internal
Notas pinchadas en el launchpad, rotación de colores y una despedida adecuada
Tres cosas. Las notas pinned llegan a la plataforma de lanzamiento. Cada nota sujeta a /nota obtiene un chip allí en su propio color pegajoso, con una breve vista previa; haciendo clic en uno Lo recoge en la superposición, y un control de esquina lo abre en el máximo editor en lugar de cosas que un pegajoso no puede hacer. Una nota que es CURRENTLY FLOATING se deja fuera. Ya está en la pantalla del miembro, y listarlo ofrecería la misma nota dos veces, la misma regla que hace su tarjeta /notes va inerte. Cerrar el pegajoso devuelve el chip. La banda renderiza sólo cuando la opción de notas sobrevivió a la propia puerta del nav, por lo que no decide nada sobre el acceso por sí solo, y prefiere la superposición copia en caché de una nota para que un chip nunca muestre título o color de antes Fue recogido. Nuevas notas giran a través de la paleta. Cada uno se abre en el color después de la nota CREATED más recientemente del miembro, envolviendo al final, por lo que una pared de pegatinas nunca es un bloque de idéntico amarillo. Llamé a las notas en lugar de un mostrador almacenado, por lo que se mantiene a través de los dispositivos y sesiones sin nada extra para persistir; un desconjunto o no reconocido el color anterior reinicia la rotación en lugar de adivinar. Cerrando una nota ahora la arrugo. Un ritmo de anticipación, luego se croba, Giras y se desplaza, dejando un soplado de trozos de papel en su propio color sobre el espacio que dejó. Los restos son renderizados por la capa, no por la Nota: un niño hereda la salida de la nota se transforma y se alejaría con él en lugar de reventar hacia afuera, así que la nota se da la mano sobre su último rectángulo y color a la salida. Una nota maximizada estalla a través de la visión completa en lugar del tamaño al que se devuelva hacia abajo; un minimizado uno no estalla en absoluto, sin tener espacio en la pantalla para estallar; y prefer-reducido-motion consigue un claro desvanecido sin chatarra. La dispersión es un hash determinista, no Math.random, que volvería a rodar cada render y jitter los restos en pleno vuelo.
· kamo-internal
Ajustes de notificación a través del ancho, con un modelo de trabajo
Era una columna de 760px de filas de interruptores, que se lee como un formulario para rellenar más bien que algo para sintonizar y en una pantalla ancha dejó dos tercios de la página vacía mientras que la lista de tipos de notificación salió de la parte inferior. La verdadera pregunta de la página no es "cuáles son mis ajustes" sino "lo difícil que es esto la aplicación se le permite interrumpirme", así que ahora se abre respondiendo a eso en un frase ensamblada a partir de los valores en vivo en la aplicación, con un sonido, en tu de escritorio, fuera de sus horas tranquilas y da la anchura a las cuatro decisiones detrás: qué canales, donde aterrizan, cuándo permanecer callados, y lo que es Vale la pena de ser informado. La pieza central es una etapa: el propio visor de la aplicación en miniatura, pintado en el la cubierta de notificación es unas oscuras fichas mientras la página alrededor se mantiene ligera, porque ese es el contraste exacto que una notificación real hace cuando llega sobre un una pantalla de trabajo. La esquina se elige haciendo clic en la esquina, y la tarjeta broncean en lugar de cortar, por lo que el control y sus consecuencias son uno gesto. Cuatro cuadrantes vencieron un desplegable aquí: la elección es espacial, y la Las palabras "derecha inferior" son un mapa peor de una pantalla que una imagen de uno. A su lado, Muéstrame una verdadera notificación en la cubierta real de la mano del miembro. propio tiempo de sonido, esquina y despido. Una página de configuración para notificaciones debe ser capaz de mostrarte una notificación, y un simulacro sería una imagen de uno, así que preestrenoToast pone una carta de desechable a través de la cubierta real, no escribiendo nada, no publicar nada, y nunca llegar al centro. Los tipos se convirtieron en azulejos donde toda la baldosa es el interruptor, en lugar de las filas con a 34px toggle en la extrema derecha, y la sección de correo electrónico adoptó el propio panel filas para que se lee como parte de la página en lugar de una tarjeta que entraba. No molestar ahora aparece una vez. Estaba en la tira de resumen y otra vez en el Tarjeta tranquila, el mismo interruptor dos veces en una pantalla. Vive con el resumen, que es lo que cambia; la carta tranquila se deja al tipo programado.
· kamo-internal
Las notificaciones se convierten en una pestaña en el perfil del propio miembro
Eran una página propia en /settings/notificaciones, que pusieron una preferencia acerca de una persona en otro lugar que no sea la página sobre esa persona y dejó el interruptores de correo electrónico de mensaje perdidos varado en la pestaña de perfil, por lo que las dos mitades de "cómo se me dicen las cosas" vivía en diferentes pantallas. Ambos están aquí ahora, en ************* directamente después de Mi Perfil. Los interruptores de correo electrónico mantienen su comportamiento exactamente. Ruta me-scoped, mismo rebote y rubor continuo y son redibbucidos con el la sección del panel de notificación y rema primitivos para que lean como parte de ella en lugar de como una carta que entró. Permanecen una sección distinta, y dicen eso: que el canal le llega cuando la aplicación se cierra, está escrito por un diferente servicio, y mantiene sus propias horas tranquilas. Doble los dos juegos de horas en un solo control cambiaría silenciosamente lo que uno de ellos gobierna. La pestaña es auto-úl-úl, porque cada preferencia detrás de ella se lee y se escribe a través de las rutas mescopedas en el perfil de otra persona estos controles editarían el espejo mientras parece editar el suyo. Consigue la dirección de la cuenta propio en lugar de tomarlo de la pestaña de perfil: las pestañas de configuración montan uno en un tiempo, así que un valor levantado de un hermano faltaría exactamente cuando un miembro Abrió esta pestaña primero, que desde el enlace de configuración de una notificación es cada vez. La antigua ruta se ha ido, junto con su tema de configuración-menú, y las tres superficies que vinculó a ella ahora construyen el camino a través de un ayudante - una ruta montada a mano en tres lugares es una ruta que finalmente no está de acuerdo consigo misma.
· kamo-internal
Firma un paquete en /settings/sign, en una ruta propia
La firma estaba en línea en la pestaña de perfil del miembro, por lo que el documento se sentó bajo la pestaña de configuración tira Y la tira sub-tab de cumplimiento Y ayuda de esa pestaña paneles de tres bandas de cromo no relacionado sobre el instrumento que el miembro es se le pidió que lea, y dos cabeceras. Ahora es ************* La página hereda NavTop y NavPri como cualquier otra pantalla y la banda de héroes del mago es la única cabecera. Acabado o deja regresa a ******************* la lista Vino de, en el cubo el paquete estaba dentro. La lista navega con el "push", no "replace": es un movimiento a un diferente pantalla, así que navegador Back tiene que volver a la lista. EL ALLOWLIST HAD TOMAMAMOS CON TI. El PREFIXOS es: "RESTRICTED-ROUTE-PREFIXES" prefijo-parecido y niega por defecto, y es lo que un miembro El empleo ha terminado se limita a. Sin ./configuraciones/señal en él, a Exempleado podría abrir su lista de paquetes y ser rebotado directamente de vuelta a ella por RestrictedMembershipGuard el momento en que clic en uno a redireccionar el bucle en la superficie exacta que existe el nivel para mantenerse accesible, ya que los reconocimientos de cumplimiento son una de las dos cosas que protege. "restrictedRoutes.test.ts" ahora pins que, incluyendo que el partido no es un Desnudo iniciosCon: ./settings/signage no es/configuración/signasigna. No hay puerta en la página misma, deliberadamente. Un miembro ejecutando su propia El acuerdo de empleo no tiene derecho a recursos humanos y nunca lo hará. emitida TO ellos y cada punto de endo detrás es autoscopiodo en DocsService (LegalAssignmentOwnership, not LegalPackageAccess), así que la sesión decide cuya tarea es y la uid de otra persona responde 404. Un desnudo /settings/sign sin asignación devuelve a la lista en lugar de notificar un error: no hay nada en la página sin uno ni manera de el miembro para suministrarlo allí. Un uid malformado muestra el error, porque Rebote escondía un mal vínculo que alguien está a punto de enviar de nuevo.
· kamo-internal
Recuerde el tamaño y la posición de cada nota flotante por dispositivo
Reabrir una nota desprendida ahora lo pone exactamente donde quedó, en el tamaño que quedó en esa pantalla. La colocación es por DEVICE, deliberadamente. Qué notas están flotando es un propiedad del miembro y se mantiene lado servidor en ui-preferences, por lo que los sigue por todas partes; donde una nota SITS es propiedad de la pantalla en frente a ellos, y un diseño que se adapta a un escritorio de 27" se equivoca en un laptop. Así que las colocaciones viven en localStorage, a la vista por miembro porque uno el navegador es un dispositivo, pero puede ser más de una persona. Las colocaciones sobreviven a los pegajosos a propósito. Cerrar una nota mantiene su geometría, que es el punto completo - por lo que la tienda está tapada por miembro y desaloja al menos atrás primero, y una nota que se elimina (o 404s en restauración) da su ranura inmediatamente. Dos cosas que esto tenía que hacer bien: - logout hace un local mayoristaStorage.clear(), que habría caído el diseño en cada fichaje. Ahora captura y restaura esta clave de la misma manera que ya lo hace por el alijo de atroneso. Nota ids y coordenadas sólo, nunca contentarse. - la hidratación espera al miembro id en lugar de correr en la montura. Las colocaciones son de un miembro, así que restaurando antes de que sepamos quién es esto. ignoraría silenciosamente la disposición de este dispositivo y volvería a la geometría de dispositivos cruzados. Precedence en la restauración es la colocación de este dispositivo, lo que sea que el Preferencia de dispositivos cruzado por última vez lleva, por lo que un dispositivo nuevo aún se abre a un diseño sano en lugar de una cascada y de cualquier manera se vuelve a abrazacar a la vista actual.
· kamo-internal
Se lee la pista de una devolución de llamada, no se recuerda y se puede reabrir una llamada
Dos cosas, ambas sobre un evento de calendario siendo un lugar pobre para guardar una copia de El historial de otra persona. El diálogo de eventos ahora lee el plomo del CRM. Su nombre, el número para sonar, el email, el mejor momento para llamar a todos cuando se abre el diálogo, teclado por el callback id del evento ya almacena. Lo que no hace es mostrar una copia congelados en el momento en que se ha reservado la llamada, que es a lo que la descripción solía llevar y lo que en silencio le habría dicho a un miembro que llamara a un número que nadie había respondió en semanas. La descripción es ahora la propia nota del miembro y nada Si no, que no puede quedarse rancios porque nunca fue una copia de nada. Y una llamada pendiente se puede abrir desde la página principal. Al hacer clic uno reabre el el mismo evento de calendario en el mismo diálogo, por lo que el lugar que un miembro va a mirar a La llamada prometida es el lugar donde pueden moverlo. Ahorro pasa por Servicio de Seguridad en lugar de la API del calendario, porque el registro de devolución de llamadas y el evento son dos opiniones de una promesa y sólo el servicio que posee ambos puede moverlos juntos - la alternativa es una página principal y un calendario sobre cuando el llamada es, y un recordatorio de que se dispara contra lo que el miembro no está leyendo. La fila en sí es el control; los botones de resolución al lado de él detienen el clic, así que Nadie marca una llamada contactada mientras querer leerla.

Tu universo está esperando.
Comience gratis en minutos y agregue productos cuando esté listo, sin migración ni nuevos inicios de sesión.
Gratis para siempre: no se requiere tarjeta de crédito