Changelog
Qué hay de nuevo.
Cada mejora de la plataforma, a medida que se envía.
· kamo-shared-library
Un dominio se afirma probándolo, no estipándolo
Tres reglas, y sólo tienen sentido juntos. **Namar un dominio afirma nada.** Un FQDN fue mundialmente único aquí, así que el primera organización para entrar "acme.com" bloqueada entre todas las demás. la compañía que realmente es dueña de acme.com, que entonces no tenía ninguna manera en nada. Alguien que no ha probado nada debe ser capaz de negar un dominio a alguien que Puedes. Las duras filas en las organizaciones son ahora legales; una repetición dentro de UNO organización sigue siendo rechazada, porque eso es un error sin más bien significado que una reclamación competidora. **Sólo unas rutas de dominio verificadas.** findByDomain ahora requiere propiedad.verificado en la fila de primer nivel, por lo que un anfitrión va a la organización que demostró el control de su DNS en lugar de a quien lo escribió primero. Sin este emparejamiento el primero La regla sería una puerta abierta: reclamar a algúnbank.com y esperar. Un alias hereda su la verificación de la matriz - el desafío TXT sólo se emite para el ápice y que se lee en la unión explícita de los padres, nunca como d.parent.ownershipVerified, que Hibernate emite como unirse interior a toda la consulta y dejaría caer cada Fila de ápice. **Verificar quita el dominio de todos los demás.** setOwnershipRevocaciones verificadas el mismo FQDN dondequiera que se mantenga, por lo que hay a lo sumo un tenedor en un el tiempo. Esto no es una cortesía: dos filas verificadas son a la vez de solución, y la El solucionador entregaría el tráfico a la que la base de datos devolvió primero. An organización que verificó un dominio el año pasado y desde entonces ha dejado que caducara seguir recibiendo el correo de quien sea el dueño ahora. Verificación DNS del perdedor va con ella, porque describe un nombre de host que ya no les apunta. Permitir duplicados entonces rompe cada mirada que asumió una fila, y una de no fue un accidente sino un secuestro: upsertDomain coincidió en el dominio y Luego reasignó lo que encontró a la organización que llamaba, así que una puntería habría quitado silenciosamente el dominio de otra organización. Es organización-saccionada ahora. El resto. findByDomain, updateSslInfoByDomain, transferDomainOwnership pasó por un solo titularOf (), que prefiere el fila verificada y de otra manera toma el id más bajo, por lo que el propietario de un dominio no puede cambio entre dos solicitudes. Dejados como encuadernaciones opcionales que habrían tirado **************** en los datos que el esquema ahora permite.
· SecurityService
Lleve los defectos de la pantalla casera por miembros
Leer en POST/PUT /security-models y PUT /master-model, y emitido de Configuraciones de modelo aplicado para que la cáscara pueda decidir dónde aterriza un miembro en "/". Una aplicación separadaHomeScreenDefaults llaman en lugar de tres posiciones más argumentos sobre un método de servicio que ya toma quince. Quedan llaves ausentes solo en lugar de reiniciar, un cliente que publica un modelo de seguridad sin saber sobre este campo no puede entregar silenciosamente a cada miembro de la modelo su plataforma de lanzamiento atrás o llévalo. /modelo aplicado se normaliza tanto en la salida como en. REQUIRES-CHILD-ORG. OWNERSHIP retenga una pantalla de inicio, así que una columna nula en una fila escrita antes de esto Enviado, o cualquier cosa no reconocida, se lee como la plataforma de lanzamiento. El propio cliente El retroceso es el mismo valor, así que los dos no pueden estar en desacuerdo.
· kamo-shared-library
Un modelo de seguridad dice que donde cada miembro tipo aterriza en "/"
Tres columnas sobre ChildOrgSecurityModel . DEFAULT.MEMBER.HOME-SCREEN, ********************** DEFAULT.ORG.OWNER.HOME-SCREEN. Cada uno de ellos se mantiene HOME-SCREEN-DEFAULT o REQUIRES-CHILD-ORG-OWNERSHIP; el segundo retiene el hasta que ese miembro sea dueño de una organización propia. Tres en lugar de uno porque los tres tipos de miembros son tres trabajos diferentes: el mismo modelo que rutinariamente quiere que un miembro sencillo empuje a crear su propio organización mientras los miembros y propietarios de su equipo van directamente al trabajo. La división espejos APPLIES.TO.MEMBERS / ETAAM.MOVIEMBRE / . . . . . . . . . . . . . . . . . . . . . . VARCHAR, no un enum ordinal - una reetiqueta ordinaria cada fila almacenada el día a tercera opción se inserta en cualquier lugar menos el final. setHomeScreenDefaults es un setter dirigido en forma de setAllowRootSubdomains en lugar de tres parámetros posicionales más en updateModel, que ya toma - Quince. Null significa "dejarlo solo", así que un llamante que conoce uno de los tres no pueden reiniciar silenciosamente a los demás. normalizarHomeScreenDefault falla OPEN y se prueba para ello: sólo la cadena exacta encende el requisito, porque la alternativa toma la pantalla de inicio de un miembro lejos y un error tipo o un cliente rancio nunca deben ser capaces de hacerlo por accidente.
· InitializerService
Las tres columnas de pantalla casera por miembros en un modelo de seguridad
HECURIDAD-MODELS gana DEFAULT-MEMBER-HOME-SCREEN, DEFAULT.TEAM.MEMBER-HOME-SCREEN y DEFAULT-ORG-OWNER-HOME-SCREEN. Cada uno de ellos se mantiene HOME-SCREEN-DEFAULT (el launchpad) o REQUIRES-CHILD-ORG-OWNERSHIP, que lo retiene hasta que ese miembro sea dueño de una organización propia. La cláusula DEFAULT es la parte que soporta carga, no el ADD COLUMN. Las columnas son NO NULL y la finca no está vacía, por lo que el valor predeterminado es lo que rellena cada el modelo de seguridad existente en la misma declaración y es deliberadamente el Valor permisivo, porque el incumplimiento de la otra manera se llevaría el launchpad de cada miembro de cada modelo en el momento en que esto corrió. Orden(0) por la razón habitual: la entidad de la biblioteca compartida que lleva estos campos es cargado por cada servicio de Java, por lo que un corredor anterior moriría en "columna no existir" antes de que se alcanzara una migración ordenada tardía. Las declaraciones SET NOT NULL reparan el caso en el que el ddl-auto de Hibernate creó las columnas primero, de la columna de la entidadDefinición, sin la restricción. Cada uno es precedido por su propia UPDATE de sin efecto, porque SET NOT NULL es rechazado mientras cualquier fila todavía tiene una nula, los pines de prueba que ordenan.
· kamo-internal
Una lista de lo que encontró el escaneo, al lado de lo que está usando
La sección de marca de /network/create se convierte en tres bandas con la misma forma: lo que su sitio web tiene a la izquierda, lo que su organización está utilizando a la derecha. - Logos. Solía haber dos rieles sobre los mismos candidatos, uno por ranura, clasificado Una compañía con cuatro logotipos parecía tener ocho, y el La pregunta se puso al revés. Un miembro no mira un carril y pide "cuál de estos es mi logotipo completo"; miran su propia marca y dicen "que es la completa". Así que es una lista de los logotipos del sitio, cada fila llevando ambos destinos. Estada como completa, Estada como simple y cada fila marcada Vector o Imagen, porque eso es lo único de un archivo de logotipo que no se puede ver mirando en él y lo único que le importa la simple ranura. Marcado, nunca filtrado: esconderse rasters de la simple ranura escondió el propio logotipo de la compañía en exactamente los sitios El escaneo funviés ha funcionado mejor. La lista se intensifica con flechas arriba/abajo y dice cuántos hay Así que "es mi logo dentro" es responsable mirando. Los fondos han vuelto. El asistente de doce pasos recogía fondos de pantalla de inicio de letrún y la reescriba de una página se los dejó caer; el escaneo ya estaba encontrando al héroe de una empresa imágenes y luego no ofrecen dónde ponerla. La misma banda: imágenes escaneadas en el izquierda, carga y el orden de ejecución a la derecha, con la opción de marca de agua abajo una vez que hay algo que estampar. Los colores se adoptan en lugar de ofrecerse. Un escaneo terminado pone al par que encontró, y los recolectores se quedan en directo. Los guardias son todo el riesgo, así que son puros y probado en scanAutoApply.ts: una vez por resultado de escaneo, y nunca sobre un color el El creador ha tocado la , incluyendo para un escaneo posterior de un sitio diferente. También aquí: - "Para quién está" está ausente por completo, cabezo incluido, hasta que haya Algo en ella para responder. Estaba haciendo una tarjeta vacía antes de que un tipo fuera elegido, y de nuevo para modelos que resuelven cada cuestión de cumplimiento ellos mismos. - El preestreno en directo muestra el logo FULL, arriba a la izquierda de la zona de contenido por encima de la texto simulado, donde una pantalla de inicio lo pone. La barra de arriba es la navegación barra y muestra la marca y las dos ranuras son fáciles de mezclar, por lo que la vista previa es el único lugar donde un creador puede decir cuál llenó. - "Logotipo compacto" es "Simple logo" en todas partes se lee, aquí y en el Getting Empeñón empeine. Los identificadores internos se quedan solos. - "Short Name" es "Nombre de la Organización (Versión corta) ". - Sitio web dice claramente que no necesitas uno, en lugar de dejar la ausencia de un asterisco rojo para llevar el mensaje.
· kamo-internal
Una pantalla de inicio por miembro por tipo-membrada
Un modelo de seguridad dice ahora dónde cada uno de sus tres miembros escribe cuando abierto "/". Dos valores: HOME-SCREEN-DEFAULT es el lanzamiento que todo el mundo tiene siempre y REQUIRES-CHILD-ORG-OWNERSHIP lo retenía hasta que ese miembro posea un organización de su propio "/" va a /network/crear en su lugar, y la El enlace de la red de organización deja la barra superior hasta que tienen una. Tres columnas en lugar de una, APPLIES-TO-MOVIEMBRES / DICIEMBRES / "OWNERS", porque el mismo modelo rutinariamente quiere que un miembro llano se empuje en crear su propia organización mientras los miembros y propietarios de su equipo van a trabajar. La regla es pura y probada en app/lib/homeScreenGate.ts: qué columna se aplica, y lo que cuenta como dueño de una organización (un propietario de la org ya están Endentro no ha creado una misma exclusión que FirstOrgCta hace. Fracasa. A partir de cada paso. Sólo la cadena exacta cierra la puerta; una columna nula, un valor no reconocido, un modelo aplicado fallido y una red inalcanzable todos leen como "no", porque quitarle la pantalla de casa de alguien con la fuerza de una petición que no respondió no es algo que hacer. Un contexto, montado por encima de los navs y la página, en lugar del gancho en ambos lugares: NavTop y el launchpad necesitan la misma respuesta en cada carga de página, y Dos copias costarían dos viajes de ida y vuelta y podrían estar en desacuerdo por la longitud de uno. El launchpad deliberadamente no se espera en ella. página detrás de un modelo /aplicado para ahorrar un puñado de ellos un breve flash es el comercio equivocado.
· kamo-internal
Create My Free Org se convierte en un widget de tres pasos
El widget incrustó todo el de CreateOrgForm cinco secciones, la marca vista previa, el medidor de preparación que es aproximadamente 1.400px dentro de un panel de aproximadamente 756px. Las filas de HomeGrid son minmax(unidad, auto), y que "auto" es una válvula de seguridad en lugar de un techo, por lo que un panel cuyo contenido no puede encoger crece la fila: el "widget" traducido como un largo formulario en la página. Ahora es el camino rápido que siempre se describió. Tres pasos, tipo, nombre y dirección, revisión - preguntar sólo los campos que realmente bloquean un crear y enviar todo lo demás exactamente en cuanto aWizardFormData siempre lo ha enviado para un creador que Se saltó esos escalón. Branding, aplicaciones y cumplimiento se terminan después en el nuevo asistente de org Getting Starteded. /network/create no ha cambiado y sigue pidiendo Todo por delante. El paso tipo es una Búsqueda, no una cuadrícula de cartas. En el denso diseño del widget la red es una carta por fila, por lo que un inquilino con treinta tipos de rama es de dieciochocientos píxeles de cartas - el estiramiento, de nuevo, y empeora a medida que la plataforma crece. La búsqueda hace que el paso sea una altura fija en cuatro tipos o trescientos. También aquí: - WidgetFrame toma un maxightPx opcional, y este widget pasa por su propia paneHeightPx(medias filas), por lo que el cristal es del tamaño que el miembro le dio y desplazase en lugar de crecer. Opcional, por lo que ningún otro widget cambia el comportamiento. WidgetComponentProps gana mediasRows para hacerlo posible. - El alias de previsual de ahora se lee en KamoCRM.com/o/aliasá en ambas superficies que muestran a través de un ayudante en lugar de construir la cuerda misma. DISPLAY SOLO el enrute es por nombre de host y no hay /o/ ruta, así que workspaceUrl y /api/org/corriente están deliberadamente intactas y un lanzamiento todavía aterriza en interna.--------- Un dominio personalizado todavía se muestra como sí mismo. - El tipo de rama/creatch/atable de búsqueda y su movimiento de análisis a un módulo compartido y gancho, ya que ambos latidores tipo tipo lo necesitan y también lleva el padre contextual subdomain-branch. Eso resuelve una duplicación en vivo: Edifica OrgTypePicker BranchTypeData dos veces y las dos copias ya se habían quedado a la deriva sobre la coacción. - el espacio de trabajoUrl se mueve de CreateOrgForm para que el widget pueda construir un espacio de trabajo enlace sin importar el formulario de página completo. - siguiente/enlace para el salto de "abrir la página completa". check-client-navigation se perdió el anclador crudo porque su regex necesita a A y href en una línea. Guardias, tsc y 4.039 pruebas verde; las llaves del diccionario empujaron primero.
· kamo-internal
Tarjeta de inicio en la página de destino Configuración
Añade una tarjeta de grupo esencial que se vincula a /settings/epretado, que coinja con el hacer Card de la lengua utilizada por sus hermanos. Las llaves del diccionario ya empujadas ****************
· kamo-internal
Un Enviar a la IA en el formulario del informe
Justo alineado en la fila "Qué estás informando?", apagado cada vez que la ventana se abre - comienza una sesión en una máquina que contiene credenciales de clúster, y un cambio que recordaba su última posición eventualmente enviaría algo que nadie Quería enviar. Presentar con ella en las manos el informe directamente: En progreso, y lee el operador que lo envió. Dibujado sólo para un titular de MANAGE-SYSTEM-BUGS, lee en el servidor-resuelto Plataforma de DerechosContexto . checkRight es la columna vertebral de los derechos TENANT y no puede responder para una plataforma correcta, así que pedirlo habría escondido el interruptor de cada administrador de la plataforma. Eso es cromo de cualquier manera: el punto final de SecurityService se sienta bajo un nivel de clase.RequirePlatformRight y rechaza a cualquier otra persona con un 403. La solicitud lleva un identificador de errores y NOSO ELSE. El formulario no tiene caja rápida, no picker de modelos y sin picker de captura de pantalla, por lo que el servidor elige todos ellos; reunir una carga útil aquí habría puesto esas opciones en el navegador, donde el los miembros que sostenían la derecha podría editarlos. La entrega corre después de las subidas, no a su lado. lo que sea que se adjunta en el momento en que se postula, y una sesión comenzó temprano sería trabajando desde la mitad de un informe. Un despacho que fracasa sigue aplicando su estatus, por lo que el informe está en marcha para cuando se presione de nuevo el botón y un reportero sólo puede editar uno que todavía es nuevo: la ventana recuerda lo que escribió por última vez y saltan el re-save de redundante, o el reinicio informaría que un informe guardado podría no ser salvo y nunca volver a intentarlo lo que realmente falló.
· SecurityService
Enviar a la IA directamente del formulario del informe
Un titular de MANAGE-SYSTEM-BUGS obtiene un Enviar en un Enviar a IA en el Bug de Informe ventana, y presentar con ella en manos el informe a una sesión sin la diálogo triage en el medio. El nuevo endpoint no toma BODY, y ese es el punto. La forma no tiene aviso caja, sin selástica y sin picker de capturas de pantalla, así que la instrucción, el modelo, el esfuerzo, las capturas de pantalla y el estado son cada uno de ellos elegidos aquí. un llamante más allá de la puerta no puede expresar nada de lo que el diálogo no pudo, lo que hace el interruptor estrictamente más estrecho que la superficie que representa. Entonces se va. a través de la expedición () sin cambios, por lo que el acelerador, la fila de auditoría escrita antes de la llamada de red, y el control de propiedad de la captura de pantalla son los mismos, no un segundo copia para mantenerse a la interfase. Guardado por el nivel de clase **************** el diálogo ya se sienta. La consola esconde el interruptor de todos los demás, pero eso es cromo: un informe presentado con la bandera por un miembro sin la derecha es se negó con un 403 aquí y no llega a ninguna sesión. "Ya visto" es un hecho por miembro y no se puede escribir para todos. PlatformRightsResolver responde "estado miembro lo sostiene", nunca "quién lo sostiene". Así que la lectura se registra para el operador que pidió el despacho, antes de la llamada de red en lugar de después de ella (puede tomar dos minutos y puede fallar), y ENPROGRESS es lo que quita el informe de la nueva insignia de cada otro gerente.
· kamo-internal
Comience el asistente de configuración en /settings/wizard
Convierte los nueve pasos de mago movido en un editor sobre la organización el el miembro ya está firmado. Cada paso ahora siembra su valor de org en vivo datos (useOrgContext, GET /api/security/org/-id, /api/security/features, o useAppliedModel según corresponda) y ahorra al punto final que ya posee que la configuración de "Guar y continuar"; "Skip this step" registra progreso sin la escritura. - orgSettingsSave.ts: tipos de carga útil por paso (StepSavePayloads) y genérico saveStep(key, orgId, valor) despacho, mecanografiado sin "never"/Ay. - orgDetails.ts: compartido para los campos de org la delgadez La clase de organización no lleva (contacto, etiquetas, descripción, etc.). - wizardSteps.tsx / StepRail.tsx / page.tsx: la tabla de escalones, la siempre- clic en el carril, y la cáscara (BrandScanProvider, inerte durante las salvas). - IdentityStep gotas ************* controles - esos son Configuración -" Dominis/Behavior & Labeling territorio ahora. - BackgroundsStep rastrea las franjas existentes, nuevas ranuras juntos, desde entonces /backgrounds/commit reemplaza todo el pedido y comprometiendo sólo nuevo Los archivos habrían borrado la presentación de diapositivas existente de una organización. - complianceWard.ts: ensancha getComplianceStepUi's parámetro to the cinco campos que realmente lee, por lo que el paso de cumplimiento puede llamarlo con useConfiguración de AppliedModel en lugar de una creación de espacio de creación de BranchTypeData. - api.ts: build exportadoEtiquetas Ustom para su reutilización por el ahorrador de etiquetas.
· kamo-internal
El héroe /copilot y ambos códigos de escaneo llevan la marca camaleón también
eran los dos últimos sitios, y ninguno de los dos pudo tomar el nuevo src sin cambios, porque la obra de arte es una silueta transparente 127x102 donde el raster era una plaza opaca. CopilotHero. "objectFit": taparía el hocico a ambos lados de la plaza Azulejos, por lo que la marca está "contenido" dentro de un envoltorio de inicio. la caja de relleno, por lo que la entrada no puede vivir en el plato en sí. La placa también gana un relleno translúcido: solía ser el icono, y uno sin llenar sale de la frontera y la sombra de la gota sin esbozar nada. QrFrame, ambos códigos. Dos correcciones: - La marca es blanca, y un código QR se imprime en blanco. Como se envió era un logotipo invisible sentado en un agujero sacado del código. Brightness(0) en el Emitido "image" lo conduce a negro y deja los nocaut transparentes. Lo ha hecho. to be CSS . imageConfiguración renderiza un "image href" y un SVG externo referenciado De esa manera, un documento aislado que no hereda de color. - 48x39, no 48x48. qrcode.react hardcodes preserveAspectRatio="none" en que elemento, por lo que la caja ES la relación de aspecto y una cuadrada aplastó la marca. El caja más estrecha también encoge el agujero excavado a . . . . . . . . . . . . . . . . . . . . . . . . . . . era antes y muy dentro de qué nivel M puede perder y aún escanear. Verificados haciendo QRCodeSVG con estos accesorios exactos y rasterising it: the mark Lee claramente en el centro y la excavación no aclara ningún patrón de buscador. Ambos códigos, no sólo Instalar son un marco compartido en una placa blanca compartida, y los propios documentos de QrFrame dicen que se resisten al estilo cualquiera de los sitios de llamadas individualmente.
· kamo-internal
Cótamea la marca de la aplicación móvil para el camaleón SVG en el carril y en casa
Raster. Ambos dibujan ahora la obra de arte KamoMobileApp como vector. Comprobado como SVG porque eso es lo que es la marca: una sola silueta blanca con Nocautos transparentes. Pasado a través de svgo a la precisión 2-decimal primero, que es pérdida para la geometría de este rastro, pero toma el archivo de 675 KB a 106 KB (23 KB (centro de KB). sobre el alambre una vez comprimido) - la exportación transportó seis decimales en cada uno de los Sedigos de 5k. Dos cosas NO se llevan del raster: - La caja. La vistaBox es 127x102, por lo que un ancho cuadrado / altura lo aplasta. Cada una de ellas los tres sitios de llamadas obtiene una caja 127:102 tamaño para mantener la altura óptica del glifo donde estaba la PNG acolchada. - Optimización de la próxima/imagen. En los tres no se puede volver a desmampar vector, por lo que sin él la petición es un viaje de ida y vuelta de vuelta los mismos bytes. CopilotHero y el centro QR todavía utilizan icon.png en sus propios tamaños; el raster se queda.
· kamo-internal
Crea mi widget gratis
Envía los mismos renders de CreateOrgForm la página /network/create, en su el diseño de widget, como un widget home-launchpad (org.create) áspeado CREATE.-FREE-ORG-WIDGET. Registrado último: es una invitación de pie, no es un panel crítico en el tiempo. No hay puerta. Crear una organización no es una aplicación, y los cinco derechos son la totalidad de la decisión. También espejos CREATE-FREE-ORG-WIDGET y sus cuatro hijos políticos en la jerarquía de derechos del TS mantenida a mano (205 - 210 bordes), que widgetPolicy.test.ts las afirmaciones de cinco en forma de derechas requieren para cada widget registrado.
· KlusterServices
Abrir Enviar a la IA en una pestaña de sesión de código VS, no una ventana de Konsole
Un despacho ahora comienza una sesión de BACKGROUND y entrega el código VS su identificación de sesión, en lugar de correr el CLI en una ventana de terminal: Pasar el aviso al URI en su lugar es una trampa: las llamadas de extensión setInputText y nunca envía, y sintetizar un Retor es imposible mientras el La taquea de KDE mantiene su agarre X. Una sesión que es ALREADY RUNNING no tiene nada que ver para someterse, que es lo que hace que la entrega funcione sin nadie en la máquina. Cuatro cosas medidas más que razonadas sobre: - cwd debe ser realpath(workspaceFolders[0]), NO el padre común que se usó Antes. El panel se arraesta en la primera carpeta y enumera sólo el sesiones que encuentra allí, así que una sesión comenzó en cualquier otro lugar es invisible para la ventana que está destinado a abrir en el paso abierto abre una pestaña vacía. El otro Los repositorios se mantienen accesibles a través de --add-dir-dir en su lugar. - --add-dir es VARIADIC y estaba comiendo el prompt, así que las sesiones se les ocurrió un compositor vacío. La lista de directorios ahora va primero, cerrada por las banderas después de ella. - Un lanzamiento no puede imprimir ningún mango, o uno marcado "(idle envía un aviso para empezar) ". Ambos significan que el mensaje nunca llegó, así que ambos son detenidos y juzgados más bien que abrir delante del operador como una pestaña vacía. - El panel no puede poseer un agente de antecedentes, y uno terminado permanece residente, así que un vigilante lo detiene una vez que el trabajo está hecho. Reabrir la pestaña y luego se reanuda el sesión normalmente, conversación completa intacta. La confirmación es ahora la transcripción abordada por id de sesión, que elimina la Búsqueda de necesidad de JSON que reportó despachos como fallas.
· kamo-internal
/network/create es una página; los doce pasos se mueven a /settings/eizard
CreateOrgForm.tsx es un componente con dos diseños (página/widget), construido a partir de la resolución 7/8 CreateOrgFields modelo, grupos de campo y OrgBrandPreview. page.tsx es ahora sólo el Concha de ancho completo alrededor de ella. Los archivos de nueve pasos del viejo mago más Pasasta/stepIcons se mueven a app/settings/wied, donde la tarea 12 las vuelve a conectarse en la configuración de inicio de la configuración Wizard; BranchTypeStep, MemberInfoStep, ReviewStep, StepNavigation, CancelModal y sesiónStorage-backed useWizardForm gancho se retiran de plano, ya que un creado de una página ha No hay pasos para navegar entre y nada que quede para salvar un borrador de. Toda importación relativa en los expedientes movidos que apuntaban a .../ui/*, ../brandscan/*, .././types, ../../validation, ../appSelections, ../../complianceWizard o ../../hooks/* se vuelve a escribir a la forma absoluta de la forma de la forma absoluta de la forma de la "app/netrea/crear/..., ya que los componentes/ui y componentes/marcascanse se quedan poner (los componentes de campo sobrevivientes todavía los usan) y sólo resuelve un directorio de arriba de la pasos de antigua ubicación. ganchos/usoWizardForm.ts se recorta en lugar de borrado: importaciones de .tests/submitWizard.test.ts freshWizardData de él y debe permanecer verde y sin editar, por lo que el archivo mantiene esa exportación (y el INITIAL-DATA que necesita) y deja caer todo lo demás que ya no tiene una llamada. Dos correcciones de corrección encontradas en la revisión antes de cablear los componentes de campo: - CreateOrgForm's onChange ahora es referencialmente estable a través de renders (solicitudScan leer a través de a ref en lugar de un usoDe dependencia de la protección de la espalda) . OrgTypePicker e IdentityFields cada lista onChange en un array de dependencia de usesEffect, y solicite cambios de identidad deScan en cada marca completada escaneado, que habría redisventado ambos efectos en cada escaneo en lugar de sólo en cambios reales de entrada. - DropZone toma un verdadero utilería deshabilitado (tabIndex=-1, manejadores vigilados, nativos discapacitados en su archivo entrada y botón de devolución) en lugar de depender sólo de un puntero-eventos-none de un antepasado, que no hace nada para la activación del teclado; conectado a través de las ranuras del logotipo de BrandFields para que un formulario bloqueado En realidad cerraba a los usuarios de teclado también. /network/create?fresh=1 se convierte en liso /network/crear en FirstOrgCta.tsx y red/page.tsx: el formulario de una página comienza desde inicialCreateOrgFields() en cada montaje en lugar de restaurar un sessionStorage draft, así que el param no tiene nada que hacer.
· kamo-internal
Grupos de campo reutilizables y la marca en vivo previa
Extrae las entradas de BranchTypeStep, BasicsStep, LogoStep, ColorsStep, AppsPaso y AgeRestrictionsApérate en cinco componentes de campo controlados (OrgTypePicker, IdentityFields, BrandFields, AppSwitches, ComplianceFields) que tanto /network/create-as-page-page-page-page-paget pueden renderizar, dejando atrás el encuadre de escalón (cabeza, salto botón, navegación). Añade OrgBrandPreview, una en miniatura de marca en vivo impulsada por previewPalette (), que Patrón comprueba cualquier color autor de creador antes de llegar a un estilo atributo y cae de nuevo a la plataforma Variables CSS. IdentityFields y OrgTypePicker se ajustaron a mitad de tarea para el ****************illa de adición aterrizando en paralelo: OrgTypePicker ahora captura la subdomain-branchera de la matriz de la org contexto junto al tipo de rama, y IdentityFields consulta webAliasPossible (en lugar de volver a conducirla, ofreciendo el camino web-alias sólo cuando está realmente disponible. La tarea 8 del plan *******************.
· kamo-internal
Empezar botón de configuración configuración con un borde de atención
Añade el punto de entrada de la plataforma de lanzamiento en el asistente de la configuración: un propietario-sólo, con derechos píldora que dice "Asistente de configuración inicial (x/9 pasos completos) ", colocada primero en la fila de pastillas delante de My Widgets. Se degrade null hasta que el propietario de la org. la puerta de la grapa no terminada, por lo que nunca destella para un propietario, quien organización ya terminó de configurar. La frontera lleva un continuo conic-gradiente blinó más una sombra de caja de respiración en la propia organización --color-primaria, y Deja de animar (mientras se mantiene visiblemente dos tonos) bajo la medida de lo que se reduce de preferencia.
· kamo-internal
Primeros pasos de inicio de modelo de paso y cliente
Añade el modelo de paso del lado del cliente (app/lib/orgetupWizard.ts), una API delgada cliente para GET/PUT/DELETE /api/security/org-setup-wizard (app/lib/orgSetupWizardApi.ts), y el gancho de usoOretupWizard que el La página de asistente y el botón de lanzamiento se basarán en. Vidas de lógica pura en app/lib en lugar de al lado de la página porque app/settings/** y app/ganchos/** no están en la lista de permitir de la inclusión de vitest. esWizardFinished se decide únicamente por el servidor completadoEn el pecado, no contando los pasos completados, por lo que el botón de lanzamiento se mantiene fuera para un organización que ya terminó incluso después de que la lista de pasos crece. normalizarElReenciero es total sobre entrada desconocida y deja caer las teclas de paso el cliente no reconoce. useOrgSetupWizard mantiene a cargo de Para que el botón de lanzamiento no rendere nada hasta la respuesta real es conocido.
· SecurityService
Añadir el servicio de progreso y los endpoints detrás del asistente de Getting Started
Org-scoped GET/PUT/DELETE under /api/security/org-setup-wizard track cuál de los nueve Primeros pasos de inicio una organización ha completado. Una lectura nunca crea una fila, y completadoEn un bloc de cosas almacenadas una vez cuando el último paso sobresaliente aterriza - sobrevive tanto des-completar un paso como la lista de pasos creciendo más tarde, así que una organización terminada botón de launchpad nunca reaparece.
· kamo-internal
El panel maximizado se acerca a la conversación que elegiste
Cambiar de conversaciones en la vista máxima fue un empuje de 8px y un desvanecido de 180ms. lo suficientemente cerca como para nada que el cristal parecía que simplemente había repintado. Ahora es Lee como llegando a algún lugar: la conversación entrante surge del 6% bajo tamaño con una subida corta y aterrizar en el cristal, opaca temprano por lo que se puede legible mientras que es todavía en movimiento, en una curva que gasta la mayor parte de su viaje por delante y luego se asiente. La forma es dictada por el z-stack en lugar de elegido. Al hacer clic en una fila de navegante centra la nueva ventana, por lo que el entrante está pintado sobre la salida, y eso decide ambas mitades: - La entrada puede crecer ENTO el cristal pero nunca más allá de él. La cáscara maximizada es un arreglo el tamaño de la vistaporte y nada aquí pincha el documento desbordamiento, por lo que una llegada que supera a 1 pinta fuera del puerto de vistas. - La salida tiene todo el tamaño y sólo se desvanece. Mientras que el entrante sigue bajo escala no cubre el panel y la salida es lo único detrás tan encogido que también abriría un borde de fondo alrededor de una ventana MAXIMIZED. un parpadeo, no de profundidad. Es libre de desvanearse porque el entrante es opaco por encima de ella mucho antes de que desaparezca. Esa regla de cobertura es aritmética, no sabor, por lo que es una prueba: el desvanecido debe Más o menos de la entrada. Dos más las restricciones que son invisibles hasta que la llegada nunca escala más allá de 1, y termina dentro de la fase de intercambio, que retira el papel y, de lo contrario, lo volvería a atacar a mitad de vuelo. El movimiento reducido mantiene el Sefade. La solución por cierto una cosa más pequeña: la llegada solía estar a 200ms dentro de una fase de 180ms, Así que se le entregó el objetivo de arreglo 20ms antes de que terminara.
· kamo-internal
Widgets de tres columnas y tamaños mínimos per-widget
Amplió WidgetWidth a 1 2o 3 "full" y deja un widgetDefinition declarar minWidth/minHeight. widgetMinSize(definición) convierte que en un piso de PaneSize (o nulo cuando no se declara nada), dando a ambos ejes de un piso incluso cuando sólo se declara uno. El eje no declarado pisos en su propio tamaño por defecto. Hilo ese piso del registro a través de cada consumidor que mide o redimensiona un panel: use tamaño deHomePanesOf/setSize, el arrastre de PaneChrome Y teclado redimensiona rutas (las tres llamadas de pinzas), SortableCard, la casa el sitio de renderizado de la página de la página y el diseño de la página vista previa. La banda de júces en la página.tsx está intacta a propósito. siempre rinde en widgetDefaultSize y nunca lee almacenados preferencias, por lo que un default declarado ya satisface su propio piso. Ningún widget en el registro declara el ancho 3 o un mínimo todavía; es decir más tarde, trabajo. Esto sólo amplía el vocabulario y alambres de la maquinaria.
· kamo-internal
Toque un logo trazado a mano y descargue el archivo convertido
Cuatro cosas en el convertidor de raster-to-vector y la simple ranura del logotipo. **La barra de desplazamiento en las opciones de raster es tres veces más ancha.** 4px era un objetivo difícil de aterrizar, y las reglas eran solo webkit, por lo que Firefox nunca había tenido una barra de estilo en absoluto. scrollbarWidth/scrollbarColor ahora lleva la misma intención allí. **Una fuente que ya tiene un fondo transparente se deja sola.** El ojo usado para devolver felizmente un color para un píxel transparente: un lienzo almacena alfa premultiplicado, así que Cada uno de ellos lee de vuelta como (0, 0, 0), y eligiendo uno le dijo al gasoducto el fondo era negro. Luego fue y borró las partes oscuras del logotipo. Al hacer clic en la transparencia ahora lo dice en vez de elegir. La solución del lado del servidor coincidente está en el servicio vectorial. **Una varita y un cepillo, cada uno capaz de añadir o eliminar.** La eliminación automática consigue dos cosas mal lo suficientemente a menudo como para necesitar discutir con: un fondo que se filtra en una parte cerrada de la diseño, y una pieza del diseño que comparte el color del fondo y va con él. El varita toma toda una región contigua en un solo clic; el cepillo toma lo que sea que se arrastra. Cada operación se resuelve contra el cultivo, nunca el recorte actual. Eso es lo que hace "a" posible en absoluto una vez que la eliminación se ha centrado en el alfa de una región no hay región para encontrar, pero el original todavía tiene el color. También hace que las operaciones sean reproducibles, así que Empujándose un ajuste después re-corre la eliminación sin descartar las correcciones. Edita pintura localmente para la retroalimentación instantánea; sólo el resultado establecido cruza el alambre, y sólo el alfa Máscara, como un PNG de 8 bits de escala de grises de unos pocos cientos de bytes. **Un botón de descarga junto al logo simple**, para que el miembro pueda mantener el SVG el convertidor producido a menudo la única copia vectorial de su logotipo que cualquier persona tiene, y de lo contrario sólo puede llegar de un cubo no pueden navegar. La extensión viene de olfatear los bytes, no el nombre almacenado: que ranura escribe cada subida a una tecla logo.svg fija independientemente del tipo, por lo que theme.kamocrm.com sirve bytes de PNG de un nombre .svg para cualquier org que estableció un logo antes de esto El convertidor existió. Se metió en una mancha en lugar de enlazar, porque un origen cruzado Se ignora una descarga y abriría el archivo en lugar de guardarlo.
· kamo-internal
Configuración de campo de una página y los impagos que reemplazan los pasos caídos
CreateOrgFields es lo que realmente pregunta el nuevo formulario de una sola página /network/create realmente ask para: un tipo de rama, nombre, alias, los interruptores de la aplicación, y un púd de campos. aWizardFormData llena todo lo que el asistente de doce pasos solía recopilar pero esta página nunca se muestra, usando exactamente lo que se salta cada uno de esos pasos utilizados para enviar (bindPhone/bindEmail true, contacto en blanco/etiquetas, marca de agua FULL, fuentes de marca COMPANY) por lo que un org creado aquí es indistinguible de uno hizo la vieja manera por alguien que completaba sólo lo que se requería. conBranchType también mantiene a su padreAliasId apuntando a una opción la seleccionada modelo en realidad ofrece (ROOT primero cuando se permite, de lo contrario la primera costumbre del modelo alias) El mago de doce pasos hizo esto en un efecto BasicsStep el creador nunca vio fuego, y sin un equivalente aquí crear bloques de OrgReadiness para siempre en un campo esta página nunca pregunta por cualquier tipo de rama. La opción padre es ROOT.
· kamo-shared-library
Crea mis derechos de widget Free Org y Empezar el progreso de los asistentes
Añade RoleRightType 288-292 (CREATE-FREE-ORG-WIDGET y sus cuatro ADDED/OPTIONAL/ REQUIRED/MOVABLE policy children), colgados de CREATE-CHILD-ORG (131). Añade OrgSetupWizardStep, el enum de nueve pasos respaldando la configuración de inicio de Getting Mago, y **************** la asignación org.setup.wizard.progress tabla de la tarea 2. También actualiza la forma de taxonomía de RoleRightHierarchyTest (278/205/35/38 - 283/210/36/37): CREATE-CHILD-ORG fue una raíz independiente y gana su primera niño aquí, moviéndolo en las raícesCon los niños cubo, que coincide con este archivo. propia convención establecida de registro de cada envío de widget en esa prueba.
· kamo-internal
Tamaño mínimo perpano, aplicado tanto en la lectura como en el arrastre
Hilados un min opcional: PaneSize a través de la abrazazaPaneSize, los dos redimensionar ayudantes de estata, y las dos funciones de lectura/escrite de preferencia en el modelo puro de lanzamientopano. Compatado hacia atrás: cada persona que se llama existente omite el argumento y mantiene el comportamiento actual, desde que la abrazadoraPaneSize cae arriba al piso de la cuadrícula **************** cuando no se suministra mínimo porpane. El piso se aplica en la resoluciónEl valor STORED de PaneSize, no sólo en el manipuladores de arrastre, así que la preferencia de un miembro registrada antes de que un panel tuviera un mínimo (o antes de que se levantara) se vuelve a levantar en lectura.
· SecurityService
Pon un presupuesto en tiempo real a la verificación de la reenvío
El endpoint no tenía ningún límite de ningún tipo. La pantalla de registro *** exigieron antes de habilitar su botón de reenlagar nunca se leyó aquí el cuerpo de solicitud es de tres campos de JSON y nada en el servidor buscado una carga útil, por lo que el control manenca un botón, no la solicitud, y un script La publicación directa en esta URL ya era ilimitada. VerificationResendRateLimiter lo reemplaza con un presupuesto que el servidor posee: un enfriamiento de los años 60 tomado como un solo SET NX por lo que las réplicas de carreras no pueden ambos ganar, 5/hora y 15 por día por dirección, y 20/hora por IP pública. Revisado ANTES de la org y el usuario buscando y teclado en la dirección de la Diebilidad, así que un los costos de la sonda presupueston en la materia existe o no y el 429 no convertirse en el oráculo de existencia de la cuenta que el endpoint es cuidadoso "si esto la cuenta existe", existe la respuesta a evitar. La ventana IP se salta para una dirección no pública: indeterminado no debe colapsar en una clave compartida para cada registrador. Redis-resboteado porque este servicio funciona réplicas, y falla en un corte de Redis. Un rechazo responde 429 con Retry-After y volver a intentarDespués de Segundos, así que el La pantalla puede contar hacia atrás contra este reloj en lugar de adivinar por sí sola.
· InitializerService
Cree org.setup-wizard.progress para el asistente de inicio de Getting
· kamo-internal
El año establecido de la org es opcional, y los renders de desconjuntos como ausentes
Nada en el servidor lo requería nunca. La columna es nula, la creación El analizadora mapea un valor vacío a nulo, y el parcheo sólo aplica las claves a PUT body menciona, así que "yearEst": null es un claro deliberado. La única puerta era Esta maga validaBasics, que bloqueó todo el paso de Basics hasta un año fue elegido. Muchos de los clientes reales no tienen respuesta (un nuevo LLC, una división girada A mediados de año, cualquiera que simplemente no lo sepa), así que la puerta les enseñó a inventa uno. Suelta; el campo mantiene su etiqueta libre de asteriscos y gana lo mismo "Opcional". FieldHint a cualquier otro campo opcional en el paso ya lo ha hecho. Arregla la razón por la que nadie se dio cuenta de que el campo ya era nulo de extremo a final: el org DTO pared yearEst con un ************************* y cocoerción corre ANTES de la opcionalidad, así que Número(nll) === 0 y cada org sin El año llegó como fundada en el año cero. Permanecía invisible porque exhibición Los sitios protegen sobre la veracidad y 0 es falso, habría aparecido como "Est. 0" en el primer sitio que marcó en su lugar. Preproceso null y "" volver a indefinido, normalizar de la misma manera en la Organización.fromJSON, y ensanche la red/tema DTO para admitir la nulidad que realmente llega. Los dos sitios de visualización que usaban .org.yearEst & . . . . . . . . . . . . . . . . . . . falsy-y render es lo que habría pintado un 0 desnudo en el cajón. El configuración de configuración ahora rasca el ahorro a través de parseYearEst, por lo que una caja en blanco se borra despeja el valor a propósito en lugar de a través de JSON.stringify convertir NaN en null.
· kamo-internal
Mostrar a un miembro sólo las pestañas que son suyas para ver
Tres superficies de fijación de miembros estaban abiertas a personas que no pueden significar nada porque, por favor. Cada puerta está en el TYPE MIEMBROS o en las aplicaciones de la org, nunca en checkRight checkRight devuelve verdadero a cada derecho bajo modo dios activo, y la página canViewOtherMemberAccount ORs en derechos que no tienen nada que ver con la asunto **************** entre ellos). getMemberType() Fallas a 'Mérnez', por lo que cada uno de ellos falla cerrado en una sesión de qué tipo Todavía no se ha resuelto. Plans y facturación: solo miembros del equipo. El plan, las suscripciones, las facturas, los métodos de pago y el asiento pertenecen a la empresa; un miembro sencillo no tiene ninguno de ellos, así que la cuenta les mostraba el dinero de la compañía. Bañado en el VIEWER, por lo que un propietario que abre la página de otra persona mantiene la administración camino. La tarjeta /settings se cierra de la misma manera - una tarjeta que abre una pestaña que no se hará peor que ninguna tarjeta, exactamente como Comisiones a su lado. Tonos y alertas: cerrado con la misma condición que el icono del teléfono de NavTop, que es ahora una función (hasPhoneAccess) en lugar de dos copias de la misma y&. La subtab no es más que la configuración del teléfono que se abre el icono. qué tono de llamada, qué dispositivo, qué tan fuerte, por lo que un miembro sin teléfono estaba siendo controles entregados que no pueden cambiar nada de lo que jamás escucharán. Audio, Vídeo y Event Sounds están intactos: esos son los dispositivos de reunión y los propios de la aplicación los sonidos de notificación, que todo miembro tiene. Legal & Compliance: miembros del equipo, y una organización con las aplicaciones Docs y HR. En lugar de enliner las nuevas condiciones, se doblan en legalBadgeAppliesTo, que el botón de firma de NavTop y el proveedor de conteo detrás de su placa ya share. Ese botón es un enlace directamente a esta pestaña, por lo que una cuarta copia de la condición le permitiría sobrevivir a su propio destino y dejaría al miembro en su perfil sin explicación; el proveedor se calla con la misma condición en lugar de celebrar una suscripción a STOMP y una encuesta de 60 segundos para un conteo que es de 0 por construcción.

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