Changelog
Qué hay de nuevo.
Cada mejora de la plataforma, a medida que se envía.
· kamo-internal
Envíe un correo electrónico a un miembro de su fila
Añade una acción de correo junto a chat, llamada y perfil en una fila de miembros, abriendo el Herramienta de mensajes con el destinatario ya rellenado. Está escondido a menos que el org tenga Correo electrónico habilitado, el visor tiene ACCESS-MAIL, y el miembro tiene una dirección en el archivo de una acción que abre un compositor vacío es peor que ninguna acción. El permiso se resuelve una vez en NavTopPanel en lugar de por fila: cuanto más profundo useEmailDisponibilidad() la sonda cuesta un OTK más más viajes de urdos y buzón de buzón, y este panel monta en toda la aplicación. Los beneficiarios pasan por como " inicialData: "a: [email] DraftMessage.to es un cuerdas[], así que un piso a: '...' se deja caer en silencio y el compositor se abre sin los mismos documentos de HexHeadPopover.
· MediaService
Aceptar 3 archivos adjuntos GiB transmitiéndolos al almacenamiento
file.getBytes() no puede representar una carga esta gran variedad de Java parada sólo más arriba de 2 GiB, así que cada pasado de apego que murió en un OutOfMemoryError independientemente de montón, y 1 GB necesitaba una asignación de 1 GB para almacenar un archivo que Spring ya había abarrotado en disco. El MultipartFile ahora va a la imagen como fuente reabiertable y es que se transmite directamente a través. Límites elevados a la altura: multiparte a 3GB por archivo (3100MB por solicitud, por lo que el el archivo mayor permitido no es rechazado para su propio límite y cabeceras) y media.attachments.max-bytes a 3 GiB. Bobinas multipartes a un explícito 24Gi emptyDir en lugar de la capa de escritor del contenedor. Tomcat max-swallow-size es ahora -1, así que un La carga rechazada recibe su 4xx entregado en lugar de una conexión de reinicio.
· kamo-shared-library
Raquee el almacenamiento ataviado con contenido para que un objeto pueda exceder el montón
Los accesorios de chat se están moviendo a un techo de 3 GiB. que no puede expresarlo en absoluto, una matriz de Java se detiene en Integer.MAX.VALOR y MinIOStorageService.upload luego amortiguar todo el objeto por segunda vez para que pudiera volver a poner en contra del siguiente nodo. Añade un camino de streaming junto a ambos: HashUtils.computeDigests deriva Blake3 y SHA3-256 de un pase, uploadStreaming reabre un InputStreamSource por nodo intento en lugar de sostener los bytes, y la nueva tiendaContentDiressed sobrecarga hashes, dedups y tiendas sin acumular nunca el contenido. La memoria pico es el MinIO parte búfer en lugar del tamaño del archivo. Es deliberadamente no "Transactional: almacenar gigabytes toma minutos, y la fila sólo se publica (isMissing=false) una vez que el objeto se almacena duramente, por lo que un accidente deja el mismo estado que el camino amortiguado deja.
· kamo-internal
Título la forma hipotecaria panes Borrower (s)
El formulario de préstamo/Borrower/Subject Property sirve a cada prestatario en el archivo, por lo que el Los títulos de pestaña y panel ahora provienen de traducciones y leen Borrower(s). Préstamo y Sujeto Propiedad era inglesa codificado duramente y ahora se resuelve a través de la siguiente-inde aquí también.
· kamo-internal
Conduce la plantilla de correo electrónico de la dirección From, detrás de un interruptor de encendido/apagado
El escollador de plantillas en el pie de compositor se ha ido. Qué plantilla usa un mensaje no es un decisión separada de quién es enviado como: la dirección principal del miembro la firma como ellos, a buzón de departamento lo firma como ese departamento con los datos de contacto del departamento, el El buzón de contacto de la organización lo firma como la organización, y los letros del buzón de otro miembro es ese miembro. Todo lo que queda por elegir es si usar uno en absoluto, que ahora es un cambie en la misma esquina. Apagarlo envía el cuerpo exactamente como mecanografiado. El editor mostró una firma en ese estado mientras que el mensaje enviado no tenía ninguno, porque una plantilla nula cayó de nuevo a DEFAULT-CONFIG para el vista previa solamente; ahora se desnuda, así que lo que está en la pantalla es lo que sale. También arregla el título de trabajo y el departamento nunca apareciendo en una firma compuesta. TeamMember y llegar como trabajoTítulo Oficial/trabajoTitleTítulo y departamentoTítulo, no de trabajoTitle y departamento y pueblan la línea móvil que el usuarioCellPhone gafa ya cerrada.
· kamo-internal
Ofrece boletos de espera para cada agente disponible a la vez
· kamo-internal
Teal acepta-solicación emergente, visualmente distinto de la alerta de plomo
· kamo-internal
Caminterrear buzones del mismo recolector buscable que el compositor utiliza
El interruptor era la mitad más débil del par: un selecto sosteniendo cada buzón que el miembro puede abrir, que para el acceso de toda la zona es cada buzón en el org. También llamó /accesible, que los construye todos en cada carga de página, una consulta por miembro y otra por buzón. Ahora un botón que muestra el buzón abierto, abriendo MailboxPickerDialog en contra /enviable. Nada carga toda la lista, y el conmutador y el de campo ofrece los mismos buzones bajo los mismos encabezados porque leen El mismo punto final. Las aliasas se excluyen a través de alias=falso. Correo enviado a una tierra en el buzón detrás de él, por lo que no hay nada que abrir; paraOpenableMailbox se niega ellos como segunda línea de defensa. La selección se mantiene inalterada en el comportamiento: la cadena de consultas ya lleva el identificador y la dirección, por lo que el botón se etiqueta sin esperar un vistaza y sólo resuelve el nombre de la pantalla si es barato.
· EmailService
Deja /enviar el grupo alias para los que llaman que abren buzones
El conmutador de buzón /messages ofrece el mismo conjunto que el del compositor campo, menos una cosa: un alias no se puede abrir. Correo dirigido a ella aterriza en el buzón detrás de él, así que no tiene carpetas y nada que mostrar. Excluido lado servidor en lugar de filtrado por el llamante para que los totales se queden honesto - un cliente que dejaba filas de una página reportaría 'mostrando 24 de 41234' mientras se entregan 21.
· kamo-internal
Pura máquina de decisión de aceptación y snooze per-miembro
· kamo-internal
Proxy el resumen de cola y las variables de la reclamación
· kamo-internal
Descargue el documento ejecutado y elija una orden de firma real
El remitente no tenía ninguna ruta hacia el documento terminado. EnveloEnvolveoResummmary anunciaban un firmadoDocumentUrl apuntando dentro de la propia aplicación kamo-signer BFF, autenticada por una sesión de firmantes - por lo que la única persona que podía Alguna vez lo que regresó fue el último firmante, durante cuatro horas. Añade el Ruta proxy de OTK y una acción de descarga en cada sobre completado. El diálogo también envió en rutaOrden 1, 2, 3..., que LOOKED ordenó y era Nunca se ha hecho cumplir. ESigService lo hace cumplir ahora, por lo que la elección es explícita: Cualquier pedido (todo el mundo invitado juntos, el comportamiento de hoy y el default) o uno a la vez. Las negativas ahora muestran su razón en lugar de "Acción fallida" . ESigService los declara con palabras y estaban siendo desechados y reenviar/eviértegan están ocultos donde el servicio sólo 409.
· EmailService
Variables de vista previa de las plantillas de la firma electrónica
El editor de plantillas admin deja en blanco a cada marcador de posición para una clave con no sampleVariables brazo, por lo que las siete plantillas de esigno previsualizado como una página de huecos vacíos, incluyendo los cinco nuevos avisos de ciclo de vida. Un brazo compartido para el ciclo de vida cinco, más brazos para la invitación y el código de paso.
· kamo-shared-library
Las cinco plantillas de correo electrónico del ciclo de sobre-ciclo que nunca fueron escritas
Un sobre de la firma electrónica tenía exactamente dos plantillas: la invitación y el Código de paso. Nada existía para nada de lo que sucede después de un letrero letreros - por lo que la aplicación de firmantes promete "una copia firmada será enviado por correo electrónico a todas las partes" y nunca se ha enviado tal correo electrónico. Añade esign.envelope-completado (copia ejecutada de cada una de las partes), ******************* esign.signer.decoderd, esign.envelope.voide y esign.envelope-expired, con el CANONICAL-KEYS entradas sin las cuales cada envío es un permanente 404. También escapa de texto libre en los dos cuerpos de esignidad existentes: TemplateRenderer los sustitutos sin fuga, y un nombre destinatario, título del documento y El mensaje tipo del personal es todo texto gratuito. Las variantes simples se mantienen suministradas porque las filas por-org son solo para insertarse. EsignLifecycleTemplatePelPlante constante - . . . . . . . . . . . . . . . . . . . . . . . . . . triple y que cada marcador de posición es uno que el remitente realmente llena.
· MediaService
Decide la carrera de reclaledos de boletos con una actualización condicional
· kamo-internal
Reconstruir la configuración del mercado hipotecario en siete fichas coherentes
La página de mercado de MORTGAGE llevaba quince pestañas, doce de ellas config de prestamista, y varios respondieron la misma pregunta en dos lugares: la cobertura estaba encendida en el marco de los mercados de capitales, mientras que su tolerancia vivía en el marco de las políticas, el servicio el modelo y los términos de mantenimiento eran pestañas separadas, la habilitación de productos transportado un restricción de canales, mientras que las reglas del canal permitieron y desautorizaron los canales, y La delegación se fijó en tres lugares sin nada que decir cuál ganó. Agrupados por la pregunta que un operador está respondiendo: modelo de negocio institucional, autoridad de suscripción, concesión de licencias Ofertas de habilitación de productos, reglas de canal, superposiciones de riesgo la ejecución de los mercados de capitales, la política de precios, la política de capital inversionistas inversionistas y su delegación, superposiciones, entrega, compromiso servicios de servicios de mantenimiento de la postura, política de servicios automatización AI autonomía, muros de confianza por etapa socios conexiones proveedoras, directorio de proveedores Donde un escenario está realmente resuelto de varios lugares, la página ahora lo dice en lugar de dejar que el operador adivinar: la sección de autoridad dice la precedencia de delegación, las insinuaciones del canal dicen que una regla de entrega de inversionistas late ellos, y el objetivo de envío de remesas está etiquetado como el default de la org. Cada sección se construye a partir de un nuevo configKit, sustituyendo a unos cien líneas de carga/salida/error/estadamiento/snackbar por pestaña con una carcasa sección, una mesa, una barra de guardar y una tostada por cuenta. Licencias, superposiciones de riesgo y las conexiones del proveedor ganan edición en línea. La API siempre lo apoyó, por lo que arreglar un tipópo solía significar borrar la fila. Los cuatro subeditores inversores se convirtió en un componente detrás de un control segmentado, por lo que abrir los costos de los inversores una petición en lugar de cuatro. Resúmenes gana una lectura de perfil prestamista cableada al prestamistaProfile, lenderProfileValidación y cambioLog: tres endpoints que existían desde entonces la superficie fue construida y que nunca se había llamado nada, así que no había manera de ver si un perfil validado o qué módulos se encendió. Los enlaces acuñados contra las viejas babosas son remapeados en lugar de aterrizar silenciosamente en Resúmene, ya que SettingsView resuelve un desconocido ?tab= al index 0.
· kamo-internal
Elija la dirección de un diálogo buscable, no un desplegable
Un selecto no puede sostener esta lista. Todo lo que ofrece el conmutador /messages es enviables, y para un miembro con ACCESS-ALL-MEMBER-MAILBOXES que es todo buzón en la org y decenas de miles en uno grande. El compositor ahora muestra el remitente actual como un botón y abre un selector que busca y páginas en el servidor, para que nada cargue todo el conjunto. La cáscara de recolección se extrae de MemberPickerDialog, que ya se resolvió esto para el directorio org: debouncing, paging, respuestas fuera de orden, desplazamiento infinito, navegación de teclado, encabezados de grupo y el error vacío y pantallas de carga. BúsquedaPickerDialog ahora es dueño de todo y toma un Traker más un renderr de hilera. MiembroPickerDialog es un envoltorio con él sus accesorios sin cambios, por lo que el campo del gerente, el miembro de chat añade y el signo electrónico búsquedas están intactas; MailboxPickerDialog es el segundo envoltorio. Los encabezados de grupo reutilizan las propias teclas de traducción del conmutador, por lo que lo mismo El buzón no puede terminar nombrando dos cosas diferentes en dos lugares. Composiar como otro miembro todavía ofrece los alias de ese miembro: son direcciones en una identidad en lugar de buzones, por lo que el endpoint . que respuestas para el miembro de la locura no pueden conocerlas. El compositor se fusiona ellos en la primera página a través del gancho de la quien recolector de la quien selecciona.
· EmailService
Búsqueda, página final de las direcciones que un miembro puede enviar de
GET /api/email/mailboxes/sendable answers la misma pregunta que /accesible cada dirección que el miembro puede enviar como una vía fusionada que es buscar y llame en la base de datos. /accesible no puede servir a un seleccionador. Se materializa cada grupo en su totalidad, y para un miembro que tenga ACCESO.ALL-MEMBER-MAILBOXES eso significa caminar cada miembro en la org y luego emitiendo una consulta por miembro y otro por buzón. Con cinco cifras de personal son decenas de miles de consultas y un carga para que coincido, en cada llamada. Sólo la cola privilegiada se llama SQL; los propios buzones del miembro, alias y buzones compartidos se cuentan en Java y siempre clasifican primero, así que La búsqueda de su propia dirección nunca se contesta en la página 40. Un buzón alcanzables a través de varias subvenciones se lista una vez, bajo el más estrecho. La misma regla que se aplica el compositor, por lo que no aparece ninguna identidad dos veces. Las filas llevan el grupo de donde vinieron y, para el buzón de otro miembro, su propietario, por lo que el cliente puede renderizar los mismos encabezados que utiliza el conmutador de buzón. La resolución de nombre se degrada exactamente como lo hace el miembroDisplayName; los dos tienen que estar de acuerdo o la misma persona lee de manera diferente en los dos lugares.
· MediaService
Denuncian la reclabista de la llamada
· MediaService
GET /types/-typeId-/slots para que el editor de ajustes pueda enumerar las ranuras
La configuración de la interfaz de usuario siempre ha buscado este camino, pero sólo POST/PUT/DELETE eran Mapeado, por lo que la pestaña Availability Slots obtuvo una 405 y se dejó vacía. A diferencia de /slots/disponible esto devuelve cada ranura activa en el tipo sin filtrar por aviso de reserva anticipada o restricciones de or infantil. un administrador necesita ver el ranuras que configuran, incluyendo las que nadie puede reservar actualmente. Restricciones cabalgan en cada franja horarca de las exenciones de hurametrada, así que esto también sustituye a los /slots/restricciones leer que la interfaz de usuario estaba intentando.
· MediaService
Propeable del predicado de boleto reclamable en un solo servicio
· kamo-internal
Asignar un buzón a un departamento y a la organización
El email de contacto del departamento era texto libre, por lo que podía nombrar una dirección el org no es dueño. Se convierte en un seleccionador sobre los buzones reales de la org... la misma lista *******************, por lo que "los buzones asignables" significa el mismo conjunto donde sea que se ofrezca. Opcional, y "None" es tanto el predeterminado como cómo te desconectas; un botón claro en el campo lo hace en un solo clic. Comportamiento-etiquetado La información de contacto mantiene su campo de texto de correo electrónico exactamente como era y gana el mismo seleccionador debajo de ella. Los dos son independientes: el campo de texto es lo que org publica, el buzón nombra uno de los propios de la org. One MailboxSelect sirve a ambas pantallas para que no puedan derivar, sobre una búsqueda en caché compartida Así que la fila de lectura de Contact Information y su selector no solicitan la lista. El Los estados se mantienen distintos a propósito: un org sin buzones, un backend de correo que es hacia abajo, y un buzón eliminado del lado del proveedor de otra manera todo lo haría como un vacío campo. El último se presenta como "no más disponible" en lugar de mirar sin asignar, porque un puntero rancio tiene que ser visible para quien lo arregle. Las salvas del Departamento envían la dirección resuelta junto al puntero. Un servicio de seguridad construido antes de que existiera buzónId lo ignora y lee correo electrónico, así que sin que este cambio despejaría la dirección de cada departamento la primera vez que uno se salvó contra el en la actualidad se desmanteló. El servicio reconstruido ignora el campo; quita el puente una vez que todos los ambientes han pasado esa construcción.
· InitializerService
Apunteros de buzón para departamentos y orgs, y rellenan los departamentos
DEPTS.MAILBOX-ID y ORGS.CONTACT-MAILBOX-ID, ambos UUID lisos sin FK a email.provider.mailboxes: los buzones sincronizados de proveedores externos y se pueden eliminar lado proveedor, y el endpoint de eliminación del buzón no sabe nada de departamentos, por lo que un El verdadero FK convertiría ambos en fracasos. DEPTS.EMAIL era texto libre y sostiene una mezcla. Direcciones que realmente son de la org. Los buzones están enlazados y reescritos a la propia carcasa del buzón -- Support-KamoCRM.com nunca fue cómo se aborda ese buzón. direcciones sin buzón que coincido no puede ser expresado por el recolector que reemplaza el campo, por lo que se despejan; que es el declaración destructiva y es deliberada, que cubre Sales y Corporate hoy. ORGS.CONTACT-EMAIL se queda solo. Mantiene su propia entrada de texto y el buzón se sienta a su lado en lugar de reemplazarlo.
· kamo-shared-library
Deja un departamento y un punto de org en uno de sus buzones
El correo electrónico de contacto de un departamento era texto libre, así que podría nombrar una dirección que hace el org dos de los tres departamentos con un set hoy hacen exactamente eso. Ahora tiene un puntero a uno de los buzones de la organización, y la Organización gana lo mismo puntero junto a su contacto existenteEmail, que está intacto. La asignación es un puntero y nada más: registra qué buzón el departamento o Se llega a la org y no le da acceso a nadie a ella. Ambas columnas son UUID simples sin FK para email-provider.mailboxes, deliberadamente. Las buzones se sincroniza de proveedores externos y se pueden eliminar el lado del proveedor, y el buzón borrar endpoints no sabe nada de departamentos - un FK real convertiría ambos de esos en fracasos. Un puntero rancios es el costo aceptado y la interfaz de usuario lo sale a la superficie. Departamento.-- El correo electrónico se queda, sosteniendo la dirección al que se resuelve el buzón asignado. Los consumidores quieren una dirección, no un id, y las direcciones del buzón son inmutables (actualMailbox solo acepta un nombre de visualización y contraseña), por lo que la copia no puede derivar. Asignar escribe ambos; limpiar las nulas ambas. Un buzón de otra organización es rechazado... el recolector sólo ofrece este org, pero la petición se puede hacer sin ella, y un puntero cruzado pondría la dirección de una org en el correo de otro.
· kamo-internal
Un campo de gerente en Position, y un recolector de personas para toda la aplicación
La tarjeta de posición gana Gerente, opcional. Es una búsqueda, no un desplegable: un org puede sostener miles de nombres, y lo único que un selecto con todos ellos garantiza es un pergamino. Un gerente rechazado, un bucle de reporte, digamos que la razón del servidor en lugar de una fallas genéricas del miembro no puede actuar. El miembroPickerDialog es el seleccionador. Búsqueda se ejecuta en el servidor, los resultados llegan a una página a tiempo, y desplazarse pide para el siguiente, así que nada aquí tiene un directorio. Se lee como una paleta de comando porque esa es la ruta más rápida para alguien que conoce el nombre, mientras que navegar todavía funciona para alguien que no: flechas se mueven, Entra en seleccione, Escape cierra, y el pie lo dice. Las filas llevan título, departamento, correo electrónico y cuenta de informes suficiente para Dile a dos personas con el mismo nombre aparte. Alguien que no se puede elegir se mantiene visible con la razón adjunta; un nombre que silenciosamente no está en la lista se lee como un error. Dos recolectores ya existían y ninguno de los dos pudo sobrevivir a un gran org. El letrero de la firma electrónica El diálogo y los miembros adicionales del chat popover tanto colocó a cada miembro y se filtraron en el navegador. Ambos ahora hacen este diálogo, manteniendo sus propias fuentes, un firmante puede ser cualquier miembro, el directorio de chat no es sólo el personal y ganando la misma búsqueda, teclado manejo y mira. El popover se convierte en AddChatMembersDialog, ya que ya no es un popover.
· SecurityService
Estala un gestor y busque en el directorio una página a la vez
GET ************* responde una página del directorio de la sesión de org. La búsqueda, el pedido y la paging ocurren en la base de datos; un arbusto ?size= es limitado. Las palabras son Anded y LIKE metacaronistas escaparon, por lo que un correo electrónico pegueado con un subrayado estrecha el buscar en vez de ensancharlo. La plataforma System User nunca aparece. la seguridad de los miembros ahora lee y escribe el gerente. Tres rechazos, en el orden una persona que llama los golpea: no un miembro del equipo de este org, o alguien que ya informa a través de este miembro, el último cerraría la línea de reportajes en un bucle sin preguntas caminando Podría terminar, por eso no puede vivir en el esquema. El gerente está resuelto ANTES de que todo esté escrito. El ahorro es una transacción en todo funciones, derechos, tiempo de espera y posición; devolver un 400 de los cuales se dedicaría aún a cabo todo lo escrito a ese punto, por lo que la respuesta reportaría a un gerente rechazado mientras los papeles cambiaron silenciosamente. MemberAvatarUrlService es el hogar para la construcción de URL de avatar en nuevo código. Varios los controladores llevan copias privadas que han quedado a la deriva. extensión de foto con instancia de instancia, que es falsa para un proxy de Hibernate y sirve a .png URL para un JPEG.
· kamo-shared-library
Un gerente, y una búsqueda de directorios que sobrevive a una gran ori
TeamMember obtiene una auto-referencia opcional a quién se presenta. CTenta a INT8 para que Hibernate no pueda copiar a Member.ID's DEFAULT unique-rowid() en el join columna y rellenar cada fila con un gerente que no existe. TeamMemberRepo gana searchDirectory: una página del directorio de la org, filtrado, ordenado y window en la base de datos. Está escrito para orcarros con cinco figuras de personal, por lo que el El llamante nunca tiene más que una página. El recolector que respalda se ejecuta en cada pulsación de teclado. Los términos se extienden contra un pajar concatenado, que es lo que permite a "apoyo enana" encontrar el Ana en Préstamo; una cadena de LIKEs ORed no, porque LIKE sólo coincide con lo que se une contiguo Texto. Cada asociación se une a una LEFT explícita: un camino implícito se une es INNER en JPQL y dejaba silenciosamente a todos sin departamento. Los ciclos no se pueden expresar en el esquema, así que findManagerIdDe deja que el escritor camine un informar de la cadena un eslabón a la vez antes de aceptar un gerente.
· InitializerService
Dale a un miembro del equipo un gerente
Añade MANAGER-ID a member-team.member, una autorreferencia anulable para el informe línea. Nada se llena: ningún gerente es una respuesta completa, tanto en la parte superior de la Gráfico y para cualquiera simplemente no asignado. El DEFAULT DROP es la declaración de carga, no la actualización ADD COLUMN . ddl-auto: crea la columna primero. Una columna de unión a Miembro, cuyo id es INT8 DEFAULT único.rowid(), hereda ese defecto a menos que la entidad pine columnaDefinición, que Estamparía cada fila existente con un identificador de gerente aleatorio. El huérfano y la autorreferencia barre ids claros que una columna predeterminada ya habría escrito.
· InitializerService
Añadir DEPTS.PARENT-DEPT-ID para los departamentos anidados
Nullable sin relleno... null significa nivel superior, que es lo que cada existente El departamento estaba y la mayoría se quedará. Declarado UUID UU con un DROP DEFAULT explícito. Departamentos llaves UUID DEFAULT gen-random-uuid (), y una columna FK que hereda que por defecto se obtiene estampado con un padre aleatorio en cada fila existente, huérfano todos ellos y fallar en la restricción que sigue.
· SecurityService
Hilar el departamento de padres a través de crear y actualizar
DepartmentService ahora toma su petición DTO en lugar de ocho argumentos posicionales, Así que el padre se une a la carga útil en lugar de convertirse en una novena en una fila de la misma tipo cuerdas. Org scoping en los endpoints mutantes no ha cambiado; el propio alquiler del padre comprobar la vida en el servicio junto al guardia.

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