Saltar al contenido
KAMOUniverse

Changelog

Qué hay de nuevo.

Cada mejora de la plataforma, a medida que se envía.

  1. · kamo-shared-library

    Muestra lo que costaría apagado-abrantar

    kamo.entitlement.fail-open otorga cualquier aplicación que la matriz del plan nunca menciona. Es documentado como una válvula temporal para el relleno del catálogo del catálogo. la matriz es semilla, pero nada podría responder a la pregunta que decide si Apagarlo es seguro: qué inquilinos sostienen qué aplicaciones solo por ello. Voltear a ciegas le habría quitado aplicaciones a organizaciones en vivo, con el primer boleto de soporte como la notificación. failOpenGrants resuelve cada organización dos veces, una vez que concede aplicaciones no mencionadas y una vez negándolos, y reporta la diferencia. No lee la vida bandera, así que da la misma respuesta antes y después de la vuelta. La re-resolución pasa por resolución en lugar del plan id directamente, reflejando el camino real de la caída de un planCode lookup, de lo contrario una subvención que De hecho sobrevivir se reporta como una pérdida.

  2. · kamo-internal

    Muestra si alguien está allí, y su extensión

    Cada fila ahora lleva un punto de presencia y palabra al lado del nombre, y su extensión en la línea de detalle - por lo que elegir una persona ya no significa elegir un nombre y Esperando. Este es el único que se elige en la aplicación, así que aterriza en el Gerente campo, letristas electrónicos, añadiendo gente a una charla y asignando apoyos por igual. Latidos sin conexión lo que se declaró. availability-status sólo se mueve en el registro, letr-out y un cambio manual, así que alguien que nunca firma lee AVAILABLE indefinidamente - mostrar que como un punto verde estaría confiadomente equivocado sobre el Una cosa es para lo que es el punto. Los sorteos no conectados como un anillo de contorno en lugar de un punto lleno, por lo que se lee como ausencia en lugar de como otro color de estatus. Un directorio que nunca llevaba presencia, una fuente de memoria detrás de Efetcher. no muestra ningún indicador en absoluto. Se desconoce ausente, y la incógnita no debería decir nada en lugar de afirmar que todo el mundo está desconectado.

  3. · SecurityService

    Disponibilidad de transporte, presencia y extensión en una fila de directorios

    Elevar a una persona es más fácil cuando la fila dice si está allí y cómo llegar a ellos, así que cada uno ahora lleva lo que declararon por última vez, si algo de el suyo está realmente conectado, y su extensión de trabajo cuando tienen uno. La disponibilidad y la presencia están aquí porque cualquiera de los dos solo engaña: disponibilidad.status sólo se mueve en el inicio de sesión, registro y un cambio manual, así que a miembro que nunca firma lee AVAILABLE indefinidamente. Presencia se lee en el PRESENCE: "Me, med, clave MediaService, escribe Lea de servicio cruzado que vale la pena nombrar. Las alternativas eran un viaje de ida y vuelta HTTP a MediaService en cada pulsación de teclas de una búsqueda, o presencia de lectura en el navegador, y el navegador no: ToolProviders renderiza el muelle de la herramienta como un hermano de la árbol que sostene a los proveedores de presencia, por lo que un recolector abrió dentro de un boleto de apoyo window reportaría a todos los colegas fuera de línea. Ambos servicios comparten el anfitrión Redis y base de datos. Una mirada fallida se lee como fuera de línea en lugar de fallar en la búsqueda.

  4. · BillingService

    Comprar un bloque cuando un org opted-in se agota de la habitación

    Corre poco después del barrido nocturno de la instantánea, porque eso es lo que produce el figura de uso que decide en la expansión con el número de ayer compraría un bloquear un día tarde cada vez. Un bloque por carrera, nunca se rompió, y se detiene en el techo del propietario. Si una organización está lejos de ese techo el resultado correcto es que escribe stop y alguien lo mira, no es que la plataforma en silencio compre su salida en su gastos. Ampliar automáticamente sin leyenda de techo como desactivada en lugar de ilimitada, porque un límite ausente es mucho más probable que sea un descuido que una intención.

  5. · InitializerService

    Añadir las columnas de auto-expand

  6. · kamo-shared-library

    Opt-in se expande con un techo

    Dos columnas en la suscripción que sostiene los bloques: si comprar otra uno automáticamente cuando la organización se agota sin espacio, y lo más posible alguna vez compra. Fuera por defecto a propósito. "aumentar silenciosamente la factura de alguien es peor que un carga que falla con una explicación, por lo que encenderlo es el propietario que negocia un poco dinero para nunca tener que pensarlo, y eso es sólo su oficio para hazlo. Se requiere un techo en lugar de opcional: una compra automática sin El límite es un compromiso indepreciable con un proceso que nadie está observando.

  7. · BillingService

    Deja que un cambio de precio de catálogo llegue a Stripe

    Los precios de la tira son inmutables y la asignación contiene una fila por (org, tipo, código, Ciclo) detrás de una clave única, por lo que una vez que existió un precio nunca pudo cambiar. A La edición de precios era una permanente falta de oposición en los ingresos, y nada lo reportó. StripePriceReconciler compara cada precio mapeado con lo que el catálogo ahora dice y, cuando se le ha pedido, señala el mapeo en un precio de rayas fresco con el viejo un archivo archivado en lugar de borrado, porque Stripe sigue facturando un precio archivado para suscripciones ya en él y la rechaza para otras nuevas, que es exactamente el comportamiento deseado. Metro se lleva a través, así que un medido El precio no puede volver sin metro y dejar silenciosamente de hacer uso de facturación. No mueve deliberadamente a los suscriptores existentes al nuevo precio. Silenciosamente volver a presionar a un cliente vivo porque alguien editó una fila de catálogos es un cargo nadie autorizado; si abudiarlos es una decisión comercial, y la hecho de que nunca fue una decisión es lo que faltaba. La cuenta todavía en el El precio antiguo se reporta en su lugar. Expuesto informe-sólo por defecto en GET ************* con el re punto detrás de un POST explícito.

  8. · InitializerService

    Añadir las columnas que hacen detectar un cambio de precio detectable

    Orden (0), nulo, sin relleno de espaldas, una cantidad nula dice: "No sabemos qué este precio se creó con" y el reconciliador lo trata como desconocido en lugar de como deriva.

  9. · kamo-shared-library

    Regisualar con qué se creó cada precio de Stripe

    La asignación almacenaba sólo el precio de identificación para usar, por lo que un cambio de precio de catálogo podría ni siquiera ser notado. aseguraPlanPrecios cortocircuitado en la existencia de la fila y la clave única prohibió una segunda, que significaba elevar un plan de $72 a $79 actualizado la página de marketing, la cotización en la aplicación y el plan DTO y cambiado Nada sobre lo que se le acusó a nadie de nada reportando la divergencia. unit-amount-cents y la moneda dan al reconciliador algo con el que comparar. Tanto anulado como NULL de izquierda para las filas existentes: nulo significa "desconocido", que es true de cada fila depredando la columna, y tratando lo desconocido como desajustado lo haría recrear cada precio en la finca en la primera carrera.

  10. · kamo-internal

    Escriba la capacidad de almacenamiento que el resumen devuelve ahora

    Mantenga el contrato del cliente a la medida con BillingService, que ahora informa lo que el plan incluye, qué bloques fueron comprados, el techo combinado y el fracción utilizada junto a los bytes almacenados. El panel que lo hace necesita nueva copia, y kamo-translación-diccionario es mitad de la misma por otra sesión, por lo que la IU aterriza por separado en lugar de barrer en el vuelo de ese repo.

  11. · BillingService

    Reporta capacidad junto al uso

    El panel de almacenamiento reportó bytes almacenados en nada de nada, sin asignación, sin porcentaje, sin dinero, así que un propietario mirando 400 GB no tenía forma de decir si eso era cómodo o a punto de detener sus subidas. Su primera El conocimiento de un problema habría sido una subida fallida. El resumen ahora lleva lo que el plan incluye, qué bloques fueron comprados, el techo combinado y la fracción utilizada, más el tamaño y precio del bloque para un la superficie puede decir lo que otro bloque daría y costaría sin codificarlo. Todo esto viene de las mismas filas de catálogos de la que el cargo tiene un precio.

  12. · kamo-shared-library

    Dar efecto a la asignación de almacenamiento

    El almacenamiento se midió en diecinueve dominios, cada noche, con una construcción que falló la prueba de cobertura y nada en ninguna parte calculó una asignación o se negó un byte. La cifra de almacenamiento del plan era datos que nadie leyó, y el almacenamiento adicional add-on no tuvo ningún efecto de producto: pagar no cambió nada y no pagar el costo Nada. StorageQuotaService resuelve lo que una organización puede sostener. El usuario del plan asignación agrupada a través de sus asientos, más los bloques que ha comprado ImageService rechaza el contenido que lo superaría. El cheque se asienta después de la dedup busca, por lo que volver a un archivo que la plataforma ya tiene nunca se rechaza para el espacio; sólo conteo de bytes genuinamente nuevo. Vive aquí más que en BillingService porque los servicios que escriben bytes no puede llamar a una API de facturación en su ruta de carga, y es inyectado por campo en lugar de a través del constructor porque ImageService es montado por mano en varios lugares, un argumento constructor es el que compila en todas partes excepto las pruebas y luego falla la construcción de la imagen. Dos formas deliberadas de equivocarse. "GB" se lee como un gibibyte, que es lo que gestor de archivos significa cuando imprime GB y la lectura más generosa. Y un organización sin suscripción en vivo, o un servicio sin frijol de cuota por cable, tiendas exactamente como antes: esta puerta existe para mantener a un cliente pagador a lo que compraron, no para convertir un hueco de facturación en pérdida de datos. Las lecturas nunca están cerradas. El llenado de tu almacenamiento te detiene añadiendo más, nunca te quita lo que tienes.

  13. · kamo-internal

    Dile al solicitante si su agente está realmente allí.

    Un hilo silencioso no distingue "nadie ha mirado esto" de "mi agente se alejó", y la persona que espera no puede decir cuál. El aviso bajo el conversación dice cuál, y cuando la respuesta "no es ahora" dice lo que pasa el siguiente - el mensaje se recibe y será contestado cuando estén de vuelta - más bien que dejar a alguien para preguntarse si aterrizó en absoluto. Colocado bajo la charla en lugar de en la cabecera porque responde "es cualquiera ", que es la pregunta que se hace mientras se meclea, no mientras escaneo el los metadatos del billete. Responder a servidor, no leído del mapa de presencia del solicitante: la presencia es por organización, por lo que un miembro de la cliente-orgo ha sido ayudado por el proveedor org vería a su agente como permanentemente desconectado. Un equivocado confiado "están "es peor que no darse cuenta. Por la misma razón una encuesta fallida mantiene el último respuesta conocida en vez de voltear el aviso. Polé a los 30 y sólo mientras la pestaña es visible. Disponibilidad es una comodidad señal, no una correcta, y una pestaña de fondo no está mirando a nadie.

  14. · MediaService

    La reasignación llega al nuevo agente, y se le dice al solicitante quién está allí

    La reasignación no llegó a nadie. asignaciónApenadoEn los registros que un cliente puso la conversación en pantalla, y es lo que levanta un boleto en el registro, pero todavía tenía el sello del agente PREVIOUS, así que el nuevo consiguió el empuje en vivo sólo si Resultaron estar en línea en ese segundo, y nada de nada si lo eran suscrita. aplicarAsignación ahora la despeje cuando el cesionario cambia realmente, lo que hace que la entrega sea duradera para quien sea el dueño de él ahora. GET ******************* le dice a la persona que pidió ayuda si la persona que los ayuda es accesible. Reponerse al lado del servidor a propósito: presencia es transmitido por organización, por lo que un solicitante de cliente-org no puede ver a un agente en el proveedor org en absoluto y el estado leía "offline" para cada uno de los conversación. Alcance a la gente que ya está en la conversación El id de entrada es un UUID, no un secreto, y "es esta persona en su escritorio" no debería Respuesta a una adivinación.

  15. · kamo-internal

    Asignar una solicitud de chat, y asignar de la lista de entradas

    Dos huecos, la misma causa de la asignación fue tratada como algo que le sucede a una boleto en lugar de a un trabajo. El botón de asignación estaba oculto para los boletos previos, así que una petición de chat en vivo, el caso en el que llegar a la persona adecuada importa más, no tenía forma de ser Entregando en absoluto. Esa exclusión data de cuando una petición de chat aún no era "una billete real" y asignación sólo ocurrió en la conversión. Ahora es asignable, y el estado sobrevive, por lo que todavía se puede convertir después. Y asignar la necesidad de abrir la conversación primero, que es la forma equivocada para el triunfo en una cola - la persona que trabaja la cola a menudo no es la persona que debería responder. La celda asignada a la lista de entradas es ahora el control: Los espectáculos flotantes asignan o reasignan, haciendo clicidad abre el mismo picker el billete los usos de la ventana. El clic de filas todavía abre la conversación. La respuesta parchea su propia fila en lugar de recargar, por lo que asignar no mover el lugar del operador en una cola filtrada, ordenada, de página.

  16. · kamo-internal

    Motor de cita para el recolector de plan, que coincide con lo que rayas billeará

    La aritmética detrás de un total en vivo, mantenido aparte de cualquier componente por lo que el Los números se pueden probar directamente. Se refleja **************** Exactamente: escala de complementos por asiento con contaco, billete plano por unidades compradas Sin embargo, muchas personas están en el plan, y los medidos se nombran en lugar de Adivinado. Esa correspondencia es el punto. Ambos lugares sitúan la plataforma previamente cotizada precio no estaba de acuerdo con la carga, el asistente de pedido en la aplicación añadió cada complemento una vez independientemente de los asientos, y la página pública fact a un fondo de almacenamiento para toda la organización por usuario.

  17. · BillingService

    Haz que un primer plan sea purchable, y devuelva los precios del plan real

    Dos cosas detuvison a una organización que compraba una primera suscripción. Las listas de planes eran accesibles sólo a través de sub.marketId en una suscripción el org ya mantenida, por lo que un org con ninguno podía ver un plan en ninguna parte del producto. GET /api/billing/markets/for-org resuelve el mercado desde el número de que se llama root de derecho - el mismo org cuyo plan gratuito ya suministra su línea de base, Así que los planes y derechos no pueden venir de diferentes catálogos. Y el plan DTO leía ************* que nada siempre pueblan: son NULL para cada plan KamoCRM, porque el sembrador escribe precios en ************* Una superficie de compra por lo tanto mostró sin precio en absoluto, y la cuenta registró un cargo nulo. Ahora lee el precio filas, con las columnas de plan como un retroceso para los catálogos que las llevan. También expone el tamaño de la unidad adicional para que una superficie de compra pueda decir "por 10 GB" sin la codificación dura.

  18. · kamo-internal

    Puerta pagar acciones en un asiento con licencia, en el punto de estroso

    Casi todas las acciones de puerta en el producto y marcan una extensión, envían un correo electrónico a un miembro, abrir el asistente de IA, tocar una grabación, iniciar una conversación social. ******************* y el registro de herramientas no tenía puerta en absoluto. Calentar esos sitios de llamadas uno a la vez nunca podría estar completo: un despachador añadidos más tarde, o simplemente perdidos, rutas que lo rodean. El cheque ahora vive en ToolWindowsLa única herramienta de textoEl manejador abierto, para que cada persona que llama esté cubierta. Acciones que nunca pasan por una ventana de herramientas están cerradas donde viven: accesorios (incluida la gota de arrastre y la pasta, que son la misma capacidad por otra ruta), creciendo una charla en un grupo, y los puntos de entrada de la reunión. Eso también resuelve tres inconsistencias que encontró la auditoría. Dos de los tres "invitar a reunirse" puntos de entrada comprobados organización.isMeet y el tercero lo hizo no; dos de los tres puntos de entrada de correo electrónico comprobaron ACCESS-MAIL y el tercero no; y marcar la extensión de un miembro de la lista no tenía cheque VOIP de ninguna amables. Todos ellos están de acuerdo. Capacidades por defecto de bloqueo, mientras que la primera carga está en vuelo, si la llamada falla, y si un backend más antiguo omite el campo. Adiviado "permitido" daría la mano las características pagadas, que es el error que la vía de derecho ya comedió una vez con su falla-abierto por defecto.

  19. · SecurityService

    Resuelve lo que un miembro puede hacer, no sólo lo que su plan incluye

    Las subvenciones describen un plan. Nunca describieron a este miembro, porque el navegación de puertas de consola en org-level org.features - para que un miembro sin licencia en todo veía cada aplicación a la que la organización tenía derecho, y el miembro--nivel Las licencias que ya existían en la base de datos no tenían ningún efecto en nada. Capacidades de miembro es esa respuesta que falta, resuelta una vez en el servidor. Un miembro sin un asiento mantiene un piso deliberado: conversación de texto con sus compañeros de equipo, apoyo, su propio perfil, su propia facturación suficiente para llegar a un humano y para Compra un asiento de vuelta. La traducción de mensajería entrante también se mantiene, porque leer qué Te enviaron no gastando. Todo lo que cuesta dinero para huir está fuera. Un juicio activo licencia a todo el mundo en el org en lugar de sólo el asiento titular. Un org en juicio se sembrado con el asiento único del plan Libre, así que gating the prueba con licencias habría significado que el propietario por sí solo podría evaluar el producto mientras el equipo al que invitaban a evaluarlo no veía nada. El inicio de sesión está intacto: la autenticación nunca ha consultado al estado de facturación y sigue - No lo hace. Perder un asiento cuesta características, nunca acceder.

  20. · BillingService

    Bill por unidad de unidades compradas, no por cuenta de cuentas

    Ejeta la nueva cantidad adicional a través de crear y actualizar: un complemento FLAT ahora toma su cantidad de Stripe de lo que realmente compró la suscripción, por lo que cuatro 10 bloques de almacenamiento GB factura como cuatro bloques en lugar de una vez por asiento. Las cantidades se filtran con los códigos adicionales resueltos en la vía, por lo que a Cuerpo rancio u hostil no puede aparcar una cantidad contra un código que no tenía derecho para comprar.

  21. · InitializerService

    Reprecio de almacenamiento adicional de $2.50 por 10 GB, ancho

    El complemento describía una piscina compartida de toda la organización y luego tenía un precio USAGE-BASED en $4 con "25 GB" declarado sólo en prosa. Nada presentó nunca una evento de metro de almacenamiento, por lo que no facturaba nada; y si se hubiera adjuntado, Stripe rechaza una cantidad a un precio medido, por lo que la suscripción creado tendría tirado. Mientras tanto, la página pública lo hizo como "$4 /user/month". Ahora es FLAT con unidad de tamaño 10 a $2.50 . bloquea el propietario compra, precio el Sin embargo, muchas personas están en el plan. AddOnQuantityMigration añade los dos Columnas nulas en el Orden ((0), antes de que cualquier corredor pueda cargar una entidad que mapea ellos.

  22. · kamo-shared-library

    Dar complementos un tamaño de unidad y una cantidad purchable

    Una unidad de complemento sólo existió como prosa dentro de su descripción ("Cada unidad añade 25 GB") y como una constante dura en el sitio de marketing, por lo que nada podría Bill en contra. SuscripciónAñadir ganancias de unidad de tamaño, y ganancias de la suscripción de cuenta las cantidades de addon. . . . . . . . . . . . . . . . . . . . . actives.addon-codes sigue siendo la fuente de la verdad, por lo que nada que sólo Preguntas "es esta aplicación concedida" tiene que saber que el mapa de la cantidad existe. También corrige la cita del asistente del pedido, que añadió cada complemento una vez sin asientos factor a pesar de que la mayoría son PER-SEAT: un pedido de 25 asientos con cuatro módulos fue Citando $31 contra los $775 Stripe facturaría. La cita sigue ahora a la misma modelo de precios que la carga hace, y omite complementos medidos en lugar de adivinar.

  23. · kamo-internal

    Elige al agente para reasignar un boleto, en lugar de escribir su identificación

    Asignar y reasignar abrió una caja de texto que tecleaste un miembro crudo identificado en el que significaba ya conocer el id de la persona que querías, para una acción cuyo todo El propósito es encontrar el correcto. Ahora utiliza MemberPickerDialog, el mismo recolector detrás del campo de Gerente en un perfil de miembro y el único que elige la gente en esta aplicación. Su búsqueda de directorios se ejecuta lado del servidor y coincidencias en el nombre, alias, correo electrónico de trabajo y cuenta, título de trabajo y departamento, por lo que "un préstamo de una analía" encuentra a la Ana en préstamos; cada fila conlleva lo suficiente para Dile a dos personas del mismo nombre aparte. El cesionario actual está fijado por encima de la resultados para que no se pierda en la mediana búsqueda. Los ids miembros superan el rango de entero exacto de JavaScript, por lo que el identificador se queda con una cuerda de el directorio al alambre.

  24. · MediaService

    Puntos finales para la entrega automática de inicio de sesión

    GET /sessions/chat/auto-open devuelve las conversaciones de chat cliente de este miembro debe elevar; POST /sessions/-guid-opened records that it did. Los duraderos contrapartida de la entrega de apoyo, y por la misma razón: la decisión pertenece a la plataforma, no a la sesión de una pestaña del navegadorStorage. La escritura está basada en la fila de miembros del que llama, así que el cliente de un miembro nunca puede retirar la otra, y estampa el tiempo del servidor en lugar de un cliente-suministrado la comparación es contra las marcas de tiempo de mensaje escritas por este mismo reloj, y un navegador sesgado de otra manera suprimiría una conversación para siempre o volver a elevarlo sin fin. ChatAutoOpenHqlTest analiza la consulta contra el modelo de entidad real y pina el Tres predicados para los que existe. Spring Data solo valida la sesión.Query en contexto bota, para que un tipópo saliera a la superficie como una startup fallida o un 500 en un camino cada miembro golpea en el registro; la prueba lee la consulta de la anotación por reflexión para que no pueda pasar contra una copia rasgada.

  25. · kamo-shared-library

    Registro duradero de una conversación que el cliente planteó por sí mismo

    MediaSessionMembresero gana AUTO-OPENED-AT, al lado de msgIdLastViewed porque es el el mismo grano - un hecho acerca de la relación de un miembro con una sesión. Ese responde "cuánto han leído"; este responde "ya se les ha mostrado esto, sin preguntas". Sustituye a una sesión de fotos por cinta, que no era un registro de nada: a el segundo dispositivo reabrió cada conversación que el primero ya había estallado, y El almacenamiento de compensación perdió el hecho por completo. hatSessionsToAutoOpen devuelve las sesiones que sostienen algo que el miembro tiene no leer a dónde ha llegado algo desde el último aumento, así que una conversación deliberadamente dejó sin leer para reabrir en cada carga, pero vuelve cuando a un Realmente nuevo mensaje aterriza. Sesiones de chat solamente; entradas de apoyo tienen su propia Entrega. Los propios mensajes del miembro están excluidos, y un resfriado msgIdLastViewed puntero cuenta como no leído en lugar de ser atrapado, porque una suplicación escalar sobre una fila desaparejada rinde NULL y leería como se leía permanentemente.

  26. · kamo-internal

    Rebaja el panel de preferencias

    Cuatro desplegables y un interruptor en un panel lavado de arriba a abajo en el inquilino color a pleno rendimiento, por lo que cada control luchó su propio fondo. Cada uno Seleccione escondido tres o cuatro opciones detrás de un clic y repitió los mismos doce líneas de estilo fronterizo. El panel es ahora una superficie, y el color pertenece a lo que se seleccionó. - Todas las opciones están en pantalla. Estos son cuatro ajustes con tres a cinco valores cortos cada uno; mostrarlos es más rápido de usar que abrir un menú, y un componente de elección reemplaza cuatro bloques de estilo duplicado. - Tiempo y método de la Recordatorio comparten una tarjeta, porque ninguno de los dos significa nada sin el otro. Las compensaciones de la remina son mono, que coinciden con el resto de la el tratamiento del calendario del tiempo. - El calendario predeterminado muestra su color, por lo que se reconoce de la misma manera que está en la barra lateral y el diálogo de eventos en lugar de por su nombre. - La cabecera se queda encerrada mientras el cuerpo se desplaza con cuatro secciones el título De lo contrario, se desplaza. Estos ajustes ahorran en el cambio sin botón para pulsar, y previamente dicho Así que con un espino desnudo. Ahora hay un explícito "Salvado", que se desvanece después de un par de segundos porque es un recibo para el cambio que acaba de hacer, no un estado permanente del panel. Las secciones se tambalean y las primaveras de confirmación; ambas se suprimen debajo de preseumos-reducido-moción. Cada cadena es una clave existente. Verificado con una construcción de producción en un árbol de trabajo separado.

  27. · kamo-internal

    Reemplazar los spinners del buzón por un esqueleto que se ensamce

    Cada estado de carga en /messages era un cargador2 en un panel vacío de otro modo. bota, la lista de mensajes, el árbol de carpetas, el cuerpo del mensaje y la siguiente página todo no le dijo al lector nada sobre lo que venía. Ahora dibujan lo que está cargando. Cada marcador de posición copia la geometría de el componente en el que se encuentra, hasta el avatar de 40px, el sepulcro de la carpeta y la fila de mensajes 104/120px medida del marcador real, por lo que el diseño no moverse cuando los datos aterricen. Una idea lleva el movimiento: una banda de seleccione cada marcador de posición de izquierda a derecha y comienza un latido más tarde en cada fila debajo de ella, así que el punto culminante desciende la pila como un solo pase diagonal en lugar de cada fila parpadeando en su propio reloj. Las filas se levantan en su lugar en el mismo orden. La luz se mezcla desde --accent-comms, el propio acento familiar del módulo de mensajes, así se lee como este producto en lugar de un brillo genérico. prefiere-reducido-moción Aplana todo el asunto a los bares. No hay nuevas claves de mensaje: los creadores de posición se anuncian para los lectores de pantalla a través de las tres cuerdas de carga que ya estaban allí.

  28. · kamo-internal

    Añadir y eliminar a los huéspedes del diálogo de evento

    Lo último que el diálogo no pudo hacer. Podía mostrar quién ya estaba encendido. un evento, pero no había manera de poner a nadie allí, el único control de huéspedes era "actualización y notificación", que re-mails a las personas que ya estaban invitadas. Los huéspedes se añaden por correo electrónico, listado con su RSVP como un punto de color titulado con el estado, y removido en el flotador. Enter añade un invitado en lugar de Enviando el diálogo, porque usted es de la lista media en lugar de terminado. El El organizador está marcado y no puede confundirse con un huésped común y corriente. La validación de correo electrónico es deliberadamente permisiva: la prueba real es si el correo rebota, y un patrón más estricto rechaza direcciones que son perfectas Es válido. Atrapa un error tipo tipópo obvio, nada más. El estado vacío invita en lugar de disculparse. Cadenas enviadas antes de esto en kamo-translación-diccionario . . . . . . . . . . . . . . . . . lanza una llave que falta de los clones CI de en.json y kamo-internal que repo en tiempo de construcción, así que aterrizar este primero habría enviado una página de calendario que Choses. Verificado con una construcción de producción en un árbol de trabajo separado; otra sesión sostiene la cerradura en el árbol.

  29. · EmailService

    Administrar la lista de invitados de un evento

    El diálogo podría mostrar quién ya estaba en un evento pero nunca añadir o eliminar a cualquiera; la única operación de huésped fue volver a notar a la gente que de alguna manera Ya está ahí. Los eventos ahora aceptan una lista de invitados, reemplazada al por mayor en día. Sustituir más bien que fusionarse, porque el diálogo es el propio de la lista . un invitado eliminado allí tiene que desapareciera aquí. Una lista nula significa "no suministrada" y deja a los huéspedes solo, que es lo que envía un cliente que edita sólo un título. Dos cosas que un cliente no llega a afirmar, así que tampoco se lee en el petición: el RSVP, que es el invitado a dar, y la bandera del organizador, que registra quién llamó a la reunión. Ambos sobreviven a una edición. filas en lugar de actualizarlas restablecerían cada respuesta y despojarían a uno persona autorizada a cancelar el evento. Los invitados vuelven locos. Un mes ver devuelve un centenar de eventos, y preguntando por evento es una consulta por fila. Borrar un evento ahora quita a sus invitados primero. Llevan un no-nunciero llave extranjera de vuelta a ella, por lo que la eliminación los dejó huérfanos o falló una vez la base de datos hizo cumplir la referencia.

  30. · kamo-shared-library

    Busto de invitado en lo que se ve, y borrar por evento

    El diálogo de eventos muestra con quién está un evento, y el endpoint de la lista devuelve un mes de eventos a la vez. Pedir a los invitados por evento es una consulta por fila; findByEventIdIn pregunta una vez. deleteByEventId es la primera mitad de la sustitución de una lista de invitados al por mayor, y de la eliminación de un evento sin filas huérfanas que llevan un extranjero no nulo llave de ello.

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