Ir para o conteúdo
KAMOUniverse

Changelog

O que há de novo.

Cada melhoria para a plataforma, como ele envia.

  1. · kamo-shared-library

    Um domínio é reivindicado provando-o, não digitando-o

    Três regras, e só fazem sentido juntos. ** Naming um domínio não reivindica nada.** Um FQDN era globalmente único aqui, então o primeira organização a entrar "acme.com" bloqueado para fora todos os outros — incluindo a empresa que realmente possui acme.com, que então não tinha como entrar. Alguém que não provou nada não pode negar um domínio a alguém que Pode. Duplicar linhas entre organizações agora são legais; uma repetição dentro de UM organização ainda é recusada, porque isso é um erro sem significado, em vez do que uma reivindicação concorrente. ** Apenas uma rota de domínio verificada.** findByDomain agora requer propriedade verified na linha de topo, então um host vai para a organização que provou o controle de O seu DNS em vez de quem o digitou primeiro. Sem este emparelhamento o primeiro regra seria uma porta aberta: reivindicar algumbank.com e esperar. Um nome falso herda o seu Verificação da empresa-mãe — o desafio TXT só é emitido para o ápice — e que é lido fora da associação pai explícito, nunca como d. pai. proprietárioVerificado, que Hibernate emite como uma junção interna sobre toda a consulta e iria soltar cada linha do ápice. ** Verificando tira o domínio de todos os outros.** setOwnershipVerified revoga o mesmo FQDN onde quer que seja mantido, por isso há, no máximo, um titular em um Tempo. Isto não é uma cortesia: duas linhas verificadas são tanto routable, e o resolvedor iria entregar o tráfego para qualquer que a base de dados retornou primeiro. An organização que verificou um domínio no ano passado e desde então deixou lapso seria Continuem a receber o correio de quem quer que o possua agora. Verificação DNS do perdedor vai com ele, porque descreve um nome de máquina que já não aponta para eles. Permitir duplicatas então quebra cada pesquisa que assumiu uma linha, e uma de aqueles não foram um acidente, mas um seqüestro: o upsertDomain correspondeu ao nome do domínio e em seguida, reatribuiu o que quer que ele encontrou para a organização de chamada, então um upsert Teria tirado o domínio de outra organização. Está. Organizado agora. O resto — findByDomain, updateSslInfoByDomain, transferDomainOwnership — passou por um único suporteOf(), que prefere linha verificada e de outra forma toma o ID mais baixo, de modo que o proprietário de um domínio não pode alteração entre dois pedidos. Esquerda como ligações opcionais que eles teriam jogado O esquema agora permite.

  2. · SecurityService

    Carregar os padrões do ecrã inicial por membro

    Leia em POST/PUT/security-models e PUT/master-model, e emitido de configurações /applied-model para que a shell possa decidir onde um membro pousa em "/". Uma aplicação separadaHomeScreenDefaults call em vez de mais três posicional argumentos sobre um método de serviço que já leva quinze. Faltam chaves sozinho em vez de reset, então um cliente que posta um modelo de segurança sem saber sobre este campo não pode silenciosamente entregar a cada membro do modelo seu launchpad para trás — ou levá-lo embora. /applicated-modelo normaliza na saída assim como dentro REQUISITOS CHILD ORG A PROPRIEDADE retém uma tela inicial, então uma coluna nula em uma linha escrita antes disso Enviado, ou qualquer coisa não reconhecida, lê-se como a plataforma de lançamento. O próprio cliente. O retorno é o mesmo valor, então os dois não podem discordar.

  3. · kamo-shared-library

    Um modelo de segurança diz onde cada membro pousa em "/"

    Três colunas sobre ChildOrgSecurityModel — DEFAULT MEMBER HOME SCREEN, **************************** DEFAULT ORG OWNER HOME SCREEN. Cada porão HOME SCREEN DEFAULT ou REQUIRES CHILD ORG OWNERship; o segundo retém o launchpad até que esse membro possua uma organização própria. Três em vez de um porque os três tipos de membros são três empregos diferentes: o mesmo modelo rotineiramente quer um membro simples empurrado para criar seu próprio organização enquanto seus membros da equipe e proprietários vão direto para o trabalho. A divisão espelhos APLIES TO MEMBERS / TEAM MEMBERS / OWNERS exatamente. VARCHAR, não um enum ordinal — uma remarcação ordinal cada linha armazenada no dia a terceira opção é inserida em qualquer lugar, exceto no final. setHomeScreenDefaults é um setter direcionado na forma de setAllowRootSubdomínios em vez de mais três parâmetros posicionais na atualizaçãoModel, que já leva Quinze. Null significa "deixe este sozinho", então um ouvinte que sabe sobre um dos Os três não podem reiniciar silenciosamente os outros. normalizeHomeScreenO padrão falha OPEN e é testado para ele: apenas a string exata liga o requisito, porque a alternativa leva a tela inicial de um membro E um erro de digitação ou um cliente velho nunca deve ser capaz de fazer isso por acidente.

  4. · InitializerService

    The three per-member-type home-screen columns on a security model

    CHILD_ORG_SECURITY_MODELS gains DEFAULT_MEMBER_HOME_SCREEN, DEFAULT_TEAM_MEMBER_HOME_SCREEN and DEFAULT_ORG_OWNER_HOME_SCREEN. Each holds HOME_SCREEN_DEFAULT (the launchpad) or REQUIRES_CHILD_ORG_OWNERSHIP, which withholds it until that member owns an organization of their own. The DEFAULT clause is the load-bearing part, not the ADD COLUMN. The columns are NOT NULL and the estate is not empty, so the default is what backfills every existing security model in the same statement — and it is deliberately the permissive value, because defaulting the other way would take the launchpad away from every member of every model the moment this ran. Order(0) for the usual reason: the shared-library entity carrying these fields is loaded by every Java service, so an earlier runner would die on "column does not exist" before a late-ordered migration was ever reached. The SET NOT NULL statements repair the case where Hibernate's ddl-auto created the columns first, from the entity's columnDefinition, without the constraint. Each is preceded by its own null-clearing UPDATE, because SET NOT NULL is refused while any row still holds a null — the test pins that ordering.

  5. · kamo-internal

    Uma lista do que a verificação encontrou, ao lado do que você está usando

    A seção de marca de /rede/criar torna-se três bandas com a mesma forma: o que seu site tem à esquerda, o que sua organização está usando à direita. Logotipos. Havia dois trilhos sobre os mesmos candidatos, um por slot, classificados — uma empresa com quatro logótipos parece ter oito, A pergunta foi colocada de forma errada. Um membro não olha para um trilho e pergunta "Qual destes é o meu logotipo completo"; eles olham para a sua própria marca e dizem " aquele é o completo". Então é uma lista dos logotipos do site, cada linha carregando ambos destinos — Definir como cheio, definir como simples — e cada linha marcada Vector ou Imagem, porque essa é a única coisa sobre um arquivo de logotipo que você não pode ver olhando para ele e a única coisa com que a ranhura simples se importa. Marcado, nunca filtrado: escondendo rasters do slot simples escondeu o logotipo da própria empresa em exatamente os sites o O exame funcionou melhor. A lista de passos com setas para cima/para baixo e diz quantos existem são, então "é meu logotipo aqui" é responsável por olhar. Os fundos voltaram. O assistente de doze passos coletou papéis de parede de entrada e a reescrita de uma página deixou-os cair; a varredura já estava encontrando o herói de uma empresa imagens e depois oferecer-se para não o pôr. A mesma banda: imagens digitalizadas na esquerda, upload ea ordem de execução à direita, com a escolha da marca d'água abaixo Uma vez que haja algo para carimbar. As cores são adotadas em vez de oferecidas. Uma verificação terminada define o par que encontrou, E os catadores permanecem vivos. Os guardas são todo o risco, então eles são puros e testado em scanAutoApply.ts: uma vez por resultado de scan, e nunca sobre uma cor criador tocou — incluindo para uma varredura posterior de um site diferente. Também aqui: - "Para quem isto é" está ausente completamente, incluindo o rumo, até que haja algo para responder. Estava a renderizar uma carta vazia antes de um tipo estar escolhido, e novamente para modelos que resolvem cada questão de conformidade em si. - A visualização ao vivo mostra o logotipo FULL, no topo esquerdo da área de conteúdo acima do texto simulado, onde um ecrã de entrada coloca-o. A barra acima é a navegação barra e mostra a marca — e os dois slots são fáceis de misturar, então a visualização É o único lugar onde um criador pode dizer qual deles preencheu. - " logotipo compacto" é " logotipo simples" em qualquer lugar que é lido, aqui e no Getting Começou o assistente. Os identificadores internos são deixados em paz. - "Pequeno Nome" é "Organização Nome (Pequena Versão)". - Site diz claramente que você não precisa de um, em vez de deixar a ausência de um asterisco vermelho para levar a mensagem.

  6. · kamo-internal

    Uma tela inicial padrão por membro

    Um modelo de segurança diz agora onde cada um de seus três tipos de membros pousa quando eles abrir "/". Dois valores: HOME SCREEN DEFAULT é a plataforma de lançamento que todos sempre tiveram tinha, e requires CHILD ORG OWNERship retém-no até que esse membro possua um organização de seus próprios — "/" vai para /rede/criar em vez, eo O link organização-rede deixa a barra superior até que eles tenham uma. Três colunas em vez de uma, espelhando APLIES TO MEMBERS / TEAM MEMBERS / OWNERS, porque o mesmo modelo normalmente quer um membro simples criar sua própria organização enquanto seus membros de equipe e proprietários vão trabalhar. A regra é pura e testada em app/lib/homeScreenGate.ts: qual coluna se aplica, e o que conta como possuindo uma organização (um proprietário do org já são dentro não criou um — a mesma exclusão que o FirstOrgCta faz). Falha Abra a cada passo. Somente o texto exato fecha o portão; uma coluna nula, uma valor não reconhecido, uma requisição de modelo aplicado e uma my-networks inalcançáveis todos lidos como "não", porque tirando a tela inicial de alguém com a força de um pedido que não respondeu não é algo a fazer. Um contexto, montado acima dos navegadores e da página, em vez do gancho em ambos lugares: NavTop eo launchpad precisam da mesma resposta em cada carga de página, e duas cópias custariam duas viagens de ida e volta e poderiam discordar pelo comprimento de uma. A plataforma de lançamento não espera deliberadamente — mantendo a casa de cada membro página por trás de um /applicated-modelo buscar para poupar um punhado deles um breve flash é O comércio errado.

  7. · kamo-internal

    Criar o Meu Livre Org torna-se um elemento de três passos

    O widget incorporou toda a CreateOrgForm — cinco seções, a marca Previsão, o medidor de prontidão — que é aproximadamente 1.400px dentro de um painel de aproximadamente 756px. As linhas da HomeGrid são minmax (unidade, auto), e que 'auto' é uma válvula de segurança em vez de um teto, assim um painel cujo conteúdo não pode encolher cresce a linha: "widget" renderizado como um formulário longo abaixo da página. É agora o caminho rápido que sempre foi descrito como. Três etapas — tipo, nome e endereço, revisão — pedindo apenas os campos que realmente bloqueiam uma criação e envio tudo o mais exatamente como paraWizardFormData sempre o enviou para um criador que Pulei esses passos. Branding, aplicações e conformidade são concluídas posteriormente no assistente de nova org's Geting Starting. /rede/criar está inalterado e ainda pede Tudo à frente. O passo do tipo é uma busca, não uma grade de cartão. No layout denso do widget a grade é uma carta por linha, de modo que um inquilino com trinta tipos de filial é de dezoitocentos pixels de cartas — o alongamento, novamente, e fica pior à medida que a plataforma cresce. Pesquisa torna o passo uma altura fixa em quatro tipos ou trezentos. Também aqui: - WidgetFrame toma um maxHeightPx opcional, e este widget passa o seu próprio paneHeightPx( halfRows), então o painel é o tamanho que o membro lhe deu e rola em vez de crescer. Opcional, então nenhum outro widget muda o comportamento. WidgetComponentProps ganha meia hora para tornar isso possível. - A pré-visualização alias agora lê KamoCRM.com/o/<alias> em ambas as superfícies que mostram Ele, através de um ajudante em vez de cada edifício a corda em si. DISPLAY SOMENTE — o roteamento é pelo nome da máquina e não existe rota /o/, então espaço de trabalhoUrl e /api/org/current são deliberadamente intocados e um lançamento ainda pousa em interna.<host>. Um domínio personalizado ainda mostra como ele mesmo. - A busca /branch-types/creatable e seu movimento de análise para um módulo compartilhado e gancho, uma vez que ambos os tipógrafos precisam dele e ele também carrega contexto subdomínio- ramo. Isso resolve uma duplicação ao vivo: OrgTypePicker construído BranchTypeData duas vezes e as duas cópias já tinham se desviado na coerção do array. - espaço de trabalhoUrl sai do CreateOrgForm para que o widget possa construir um espaço de trabalho link sem importar o formulário da página inteira. - próximo / link para o salto "abre a página inteira". check-client-navigation falhou o âncora crua porque seu regex precisa <a e href em uma linha. Guardas, tsc e 4.039 testes verdes; teclas de dicionário empurradas primeiro.

  8. · kamo-internal

    Começando o cartão na landing page Configurações

    Adiciona uma placa de grupo essencial que liga a /settings/wizard, correspondendo à makeCard idioma usado por seus irmãos. Teclas do dicionário já empurradas ****************************

  9. · kamo-internal

    UM ENVIO PARA AI interruptor no formulário de relatório

    Alinhado à direita na linha "O que estás a reportar?", sempre que a janela abre — inicia uma sessão em uma máquina com credenciais de cluster e uma mudar que lembrou sua última posição eventualmente enviaria algo ninguém Era para ser enviado. Apresentando em mãos o relatório em andamento, e lido pelo operador que o enviou. Desenhado apenas para um titular do MANAGEM SYSTEM BUGS, lido do servidor resolvido PlataformaDireitosContexto — controloA direita é a espinha dorsal dos direitos ENTANTES e não pode responder para uma plataforma direita em tudo, assim que perguntando teria escondido o interruptor de cada administrador de plataforma. Isso é cromo de qualquer forma: o endpoint do SecurityService fica sob um nível de classe @RequirePlatformRight e recusa qualquer outra pessoa com um 403. A solicitação carrega um ID de bug e NADA MAIS. O formulário não tem caixa imediata, não escolhedor de modelo e nenhum selecionador de imagem, então o servidor escolhe todos eles; montar uma carga aqui teria colocado essas escolhas no navegador, onde o O membro que detém a direita pode editá-los. O hand-off é executado após os uploads, não ao lado deles — o despacho lê o que quer que esteja anexado no momento em que é executado, e uma sessão iniciada cedo seria A trabalhar a partir de meio relatório. Uma expedição que falha ainda aplica seu status, então o relatório está em progresso quando o botão é pressionado novamente e um repórter pode apenas editar um que ainda é Novo: a janela lembra o que escreveu pela última vez e skips the redundant re- save, ou o retry relataria que um relatório salvo poderia não ser salvo e nunca tentar novamente a coisa que realmente falhou.

  10. · SecurityService

    Enviar para IA diretamente fora do formulário de relatório

    Um titular de GESTÃO SYSTEM BUGS recebe um botão DE ENVIO AI no Bug de Relatório janela, e submeter com ele em mãos o relatório para uma sessão sem diálogo de triagem no meio. O novo endpoint não leva corpo, e esse é o ponto. O formulário não tem prompt caixa, nenhum selecionador de modelo e nenhum selecionador de imagem, então a instrução, o modelo, o esforço, as capturas de tela e o status são todos eles escolhidos aqui — um chamador após o portal não pode expressar nada que o diálogo não possa, o que faz O interruptor é estritamente mais estreito do que a superfície que representa. Depois vai. através do despacho () inalterado, então o acelerador, a linha de auditoria escrita antes do chamada de rede, e a verificação de propriedade da imagem são as mesmas, nem um segundo cópia para manter o passo. Guardado pelo nível de classe. o diálogo Já se senta debaixo. O console esconde o interruptor de todos os outros, mas isso é cromado: um relatório apresentado com a bandeira por um membro sem direito é recusou-se com um 403 aqui e não atinge nenhuma sessão. "Já visto" é um fato por membro e não pode ser escrito para todos — PlatformRightsResolver responde "faz este membro segurá-lo", nunca "quem o detém". Assim, a leitura é gravada para o operador que pediu a expedição, antes do chamada de rede em vez de depois dele (pode levar dois minutos e pode falhar), e IN PROGRESS é o que tira o relatório do crachá NOVO de qualquer outro gerente.

  11. · kamo-internal

    Assistente de Configuração Iniciada em /settings/wizard

    Transforma os nove assistentes movidos num editor sobre a organização O membro já está inscrito. Cada passo agora semeia seu valor de org vivo dados (useOrgContext, GET /api/security/org/{id}, /api/security/features, ou useAppliedModel conforme apropriado) e salva para o endpoint que já possui que a configuração em "Salvar e continuar"; "Pular esta etapa" regista o progresso sem escrita. - orgSettingsSave.ts: tipos de carga útil por etapa (StepSavePayloads) e um saveStep(key, orgId, value) genérico, digitado sem `nunca`/`ninguém'. - orgDetails.ts: shared fetch for the org fields the thin theming Classe de organização não carrega (contato, etiquetas, descrição, etc). - assistenteSteps.tsx / StepRail.tsx / page.tsx: a tabela de passos, o sempre- trilho clicável, eo shell (BrandScanProvider, inerte durante salva). - IdentityStep cai **************************** controles — são Configurações -> Domínios/Comportamento e território de rotulagem agora. - BackgroundsPassa faixas existentes + novos slots juntos, desde /backgrounds/commit substitui todo o pedido e comprometendo apenas novo os ficheiros teriam apagado a apresentação de slides existente de uma organização. - complianceWizard.ts: ampliou o parâmetro getComplianceStepUi para o cinco campos que ele realmente lê, então a etapa de conformidade pode chamá-lo com Use as configurações do AppliedModel em vez de um BranchTypeData em tempo de criação. - api.ts: buildCustomLabels exportados para reutilização pelo protetor de etiquetas.

  12. · kamo-internal

    O herói /copilot e ambos os códigos de varredura carregam a marca camaleão também

    foram os dois últimos sites, e nenhum poderia apenas tomar o novo src inalterado, porque a obra de arte é uma silhueta transparente 127x102 onde o raster era um quadrado opaco. Co-piloto Herói. `objectFit: cobertura` cortaria o focinho de ambos os lados do quadrado azulejo, então a marca é `contida` dentro de um invólucro interno - `fill` resolve contra a caixa de enchimento, assim que o inset não pode viver na placa em si. A placa também ganha um preenchimento translúcido: costumava SER o ícone, e um não preenchido deixa a borda e A sombra que delineia nada. QrFrame, ambos os códigos. Duas correções: - A marca é branca, e um código QR é impresso em branco. Como enviado foi um logotipo invisível sentado em um buraco perfurado fora do código. «brilho(0)» emitido <image> conduz-o para preto e deixa os Nocautes transparentes. Tem. para ser CSS — imageSettings renderiza um <image href>, e um SVG externo referenciado dessa forma é um documento isolado que não herda nenhuma cor. - 48x39, não 48x48. qrcode.react códigos rígidos preservarAspectRatio="none" sobre isso elemento, então a caixa é a proporção de aspecto e um quadrado esmagou a marca. A caixa mais estreita também encolhe o buraco escavado para ~2,9% do código, sob o 3,5% Foi antes e muito dentro do que o nível M pode perder e ainda escanear. Verificado por renderização do QRCodeSVG com estes adereços exatos e rasterizando-o: a marca lê claramente no centro e a escavação não limpa nenhum padrão localizador. Ambos os códigos, não apenas Instalar — eles são um quadro compartilhado em uma placa branca compartilhada, e os próprios documentos do QrFrame dizem para resistir ao estilo de qualquer site de chamada individualmente.

  13. · kamo-internal

    Troque a marca de aplicativo móvel para o camaleão SVG no trilho e em casa

    raster. Ambos agora desenham a arte KamoMobileApp como vetor. Registrado como SVG porque é isso que a marca é: uma única silhueta branca com Nocautes transparentes. Passado através do svgo em 2 precisão decimal primeiro, que é sem perdas para a geometria deste traço, mas leva o arquivo de 675 KB para 106 KB (~23 KB — a exportação transportava seis casas decimais em cada um dos ~5k segmentos de rastreamento. Duas coisas não passam do raster: - A caixa. O viewBox é 127x102, então uma largura quadrada/altura o esmaga. Cada um dos os três locais de chamada recebem uma caixa 127:102 dimensionada para manter a altura óptica do glifo onde estava o PNG acolchoado. - otimização próxima/imagem. `unoptimized` em todos os três: / next/image cannot reample vetor, então sem ele o pedido é uma viagem redonda que devolve os mesmos bytes. CopilotHero e o centro QR ainda usam icon.png em seus próprios tamanhos; o raster permanece.

  14. · kamo-internal

    Criar meu widget Org livre

    Envia o mesmo CreateOrgForm a renderização da página /network/create, em sua layout do widget, como um widget home-launchpad (org.create) CREATE FREE ORG WIDGET. Última inscrição: é um convite permanente, Não é um painel crítico do tempo. Nenhum portão — criar uma organização não é uma aplicação e os cinco direitos são a totalidade da decisão. Também espelhos CREATE FREE ORG WIDGET e seus quatro filhos política em a hierarquia de direitos TS mantidos à mão (205 -> 210 arestas), que as asserções cinco-direita-forma do widgetPolicy.test.ts exigem para cada widget registado.

  15. · KlusterServices

    Abrir Enviar para IA numa página de sessão de Código VS, não numa janela do Konsole

    Um despacho começa agora uma sessão de ANTECEDÊNCIA e entrega VS Codifice o seu ID de sessão, em vez de executar o CLI em uma janela de terminal: Passar o prompt para o URI é uma armadilha: as chamadas de extensão setInputText e nunca envia, e sintetizar um Return é impossível enquanto o O armário do KDE mantém a sua captura X. Uma sessão que já está correndo não tem mais nada Submeter-se, que é o que faz a entrega trabalhar com ninguém na máquina. Quatro coisas medidas em vez de fundamentadas sobre: - cwd deve ser realpath( workspaceFolders[ 0], NÃO é o pai- mãe comum utilizado Antes. O host do painel cria- se na primeira pasta e lista apenas a sessões que encontra lá, então uma sessão iniciada em qualquer outro lugar é invisível para a janela onde se pretende abrir — a transferência abre uma página vazia. A outra repositórios permanecem acessíveis através de -- add- dir em vez disso. - Add-dir é VARIADIC e estava comendo o prompt, então as sessões vieram com um compositor vazio. A lista de diretórios agora vai primeiro, fechado pelas bandeiras depois dele. - Um lançamento não pode imprimir nenhum punho, ou um marcado "(idle - enviar um prompt para iniciar)". Ambos significam que a mensagem nunca chegou, então ambos são parados e tentados novamente em vez do que aberto na frente do operador como uma aba vazia. - O painel não pode ter um agente de segundo plano, e um finalizado permanece residente, então Um observador pára-o assim que o trabalho está feito. Reabrindo a aba, em seguida, retoma o sessão normalmente, toda a conversa intacta. A confirmação é agora a transcrição endereçada pelo ID da sessão, que remove o A busca por agulha esfolada pelo JSON, que informou os envios entregues como falhas.

  16. · kamo-internal

    /network/create é uma página; os doze passos movem-se para /settings/wizard

    CreateOrgForm.tsx é um componente com dois layouts (página/widget), construído a partir de Task 7/8 CreateOrgFields model, grupos de campo e OrgBrandPreview. page.tsx é agora apenas o Concha de largura total à volta. Os arquivos de nove passos do assistente antigo mais o movimento Stepper/stepIcons para app/settings/wizard, onde o Task 12 os religa para a Configuração de Introdução Assistente; BranchTypeStep, MemberInfoStep, ReviewStep, StepNavigation, CancelModal and the SessionStorage-backed useWizardForm gancho são aposentados outright, uma vez que uma criação de uma página tem nenhum passo para navegar entre e nada para salvar um rascunho. Cada importação relativa nos arquivos movidos que apontavam para ../ui/*, ../brandscan/*, ../../types, .././validação, ../../appSeleções, ../../conformidadeWizard ou .././ganchos/* é reescrito para a forma absoluta de @/app/network/create/..., uma vez que componentes/ui e componentes/brandscan ficam put (os componentes de campo sobreviventes ainda os usam) e apenas resolvem um diretório a partir da localização antiga dos passos. ganchos/useWizardForm.ts é aparado em vez de excluído: tests /submitWizard.test.ts importações frescoWizardData dele e deve permanecer verde e sem edição, para que o arquivo mantém que uma exportação (e o INICIAL DATA que ele precisa) e deixa tudo o mais que já não tem um chamador. Duas correções de correção encontradas na revisão antes de cabear os componentes do campo: - CreateOrgForm's onChange está agora referencialmente estável entre renderizações (pedidoScan ler através um ref em vez de uma dependência useCallback) — OrgTypePicker e IdentityFields cada lista emChange em um array de dependência useEffect, e requestA própria identidade do Scan muda em cada marca completada scan, que teria re- disparado ambos os efeitos em cada scan em vez de apenas em mudanças reais de entrada. - DropZone leva um real desactivado prop (tabIndex=-1, manipuladores vigiados, nativo desativado em seu arquivo input e botão de recuo) em vez de confiar apenas no ponteiro-eventos-nenhum de um antepassado, que não faz nada para activação do teclado; ligado através dos slots de logotipo da BrandFields para um formulário bloqueado na verdade bloqueia usuários de teclado também. /network/create?fresh=1 torna-se simples /network/create em FirstOrgCta.tsx e network/page.tsx: o formulário de uma página começa a partir do inicialCreateOrgFields() em cada montagem em vez de restaurar um sessãoStorage rascunho, então o param não tem mais nada para fazer.

  17. · kamo-internal

    Grupos de campo reutilizáveis e a visualização da marca ao vivo

    Extrai as entradas de BranchTypeStep, BasicsStep, LogoStep, ColorsStep, AppsStep e AgeRestrictionsStep em cinco componentes de campo controlados (OrgTypePicker, IdentityFields, BrandFields, AppSwitches, ComplianceFields) que tanto /network/create-as-one-page como o widget launchpad podem renderizar, deixando o enquadramento (cabeçalho, botão de pular, navegação) para trás. Adiciona OrgBrandPreview, uma miniatura de marca ao vivo impulsionada pela previewPalette(), que o padrão verifica qualquer cor escrita pelo criador antes de atingir um estilo Atribuir e voltar para as variáveis CSS da plataforma. IdentityFields e OrgTypePicker foram ajustados no meio da tarefa Aterrissagem adicional em paralelo: OrgTypePicker agora captura o subdomínio- ramo do org pai contexto ao lado do tipo de branch, e IdentityFields consulta webAliasPossible() em vez de re-derivar, oferecendo o caminho web- alias Só quando estiver verdadeiramente disponível. Tarefa 8 do ********************** Plano.

  18. · kamo-internal

    Botão do Assistente de Configuração Iniciado com uma borda de atenção

    Adiciona o ponto de entrada do launchpad ao assistente de configuração: apenas um proprietário, com direitos comprimido que lê "O Assistente de Configuração Iniciada (x/9 passos completos)", colocado primeiro na fila de comprimidos à frente dos Meus Widgets. Renda nula até que o org-proprietário + direito + carregado-síntese + portão não-acabado resolve, de modo que nunca flashes para um proprietário cuja organização já terminou a configuração. A fronteira carrega um contínuo cônico-gradiente mais uma caixa-sombra de respiração na própria organização -- cor-primário, e pára de animar (enquanto se mantém visivelmente em dois tons) sob o movimento preferido.

  19. · kamo-internal

    Introdução do modelo de passo do assistente e do cliente

    Adiciona o modelo passo lado cliente (app/lib/orgSetupWizard.ts), uma API fina cliente para GET/PUT/DELETE /api/security/org-setup-wizard (app/lib/orgSetupWizardApi.ts), e o gancho de usoOrgSetupWizard que o A página do assistente e o botão do bloco de lançamento serão ambos construídos. Vidas lógicas puras no app/lib em vez de ao lado da página porque app/settings/** e app/hooks/** não estão na lista de allowlist de inclusão do vitest. isWizardFinished é decidido unicamente pelo servidor completoNa trava, não contando os passos completados, de modo que o botão de lançamento permanece organização que já terminou mesmo depois que a lista de passos cresce. normalizeSummary é total sobre entradas desconhecidas e solta as teclas de passo O cliente não reconhece. useOrgSetupWizard mantém `loaded` separado de `summary` para que o botão launchpad não renderize nada até a resposta real é conhecido.

  20. · SecurityService

    Adicionar o serviço de progresso e os parâmetros por trás do assistente Introdução

    Org-scoped GET/PUT/DELETE em /api/security/org-setup-wizard track qual dos nove Começando etapas uma organização terminou. Uma leitura nunca cria uma linha, e completoAt é um conjunto de trava armazenada uma vez quando o último passo notável pousa - sobrevive tanto descompletando um passo e a lista de passos crescendo mais tarde, então uma organização terminou O botão de lançamento nunca reaparece.

  21. · kamo-internal

    O painel maximizado amplia a conversa que você escolheu

    Mudar conversas na visão maximizada foi um empurrão 8px e um desbotamento 180ms — perto o suficiente para nada que o painel parecia ter simplesmente repintado. Agora. lê-se como chegando em algum lugar: a conversa de entrada vem de 6% abaixo do tamanho com uma ascensão curta e terras no painel, opaco cedo para que seja legível enquanto é ainda em movimento, em uma curva que gasta a maior parte de sua viagem na frente e depois se instala. A forma é ditada pelo z-stack em vez de escolhido. Clicando em uma linha do navegador foca a nova janela, então a entrada é pintada sobre a saída, e que decide Ambas as metades: - A entrada pode crescer no painel, mas nunca passa dele. A shell maximizada é uma elemento fixo o tamanho do viewport e nada aqui prende o documento transbordar, então uma chegada que ultrapassa 1 pintura fora do viewport. - A saída tem o tamanho completo e só desaparece. Enquanto a entrada ainda está sub-escala não cobre o painel e a saída é a única coisa atrás Assim, encolhendo que também abriria uma borda de fundo em torno de uma janela MAXIMIZADA — Um brilho, não profundidade. É livre para desaparecer porque a entrada é opaca sobre ele Muito antes de desaparecer. Essa regra de cobertura é aritmética, não gosto, então é um teste: o desbotamento de saída deve O último a chegar. Mais dois pinos as restrições que são invisíveis até que eles break — a chegada nunca passa de 1, e termina dentro da fase de swap, que retira o papel e, de outro modo, reorientá-lo-ia a meio do voo. Movimento reduzido mantém o Deformação cruzada. Incidentalmente fixa uma coisa menor: a chegada costumava ser 200ms dentro de uma fase 180ms, Então foi entregue o alvo fixo 20ms antes de terminar.

  22. · kamo-internal

    Widgets de três colunas e tamanhos mínimos per-widget

    Ampla Largura de Widget para 1 .. 2 .. 3 .. 'completo' e permite uma definição de Widget declarar minLargura/minAltura. widgetMinSize (definição) converte que em um piso PaneSize (ou nulo quando nada é declarado), dando ambos eixos um piso mesmo quando apenas um é declarado — o eixo não declarado pisos em seu próprio tamanho padrão. Rosca esse piso do registro através de cada consumidor que tem tamanhos ou redimensiona um painel: useHomePanes' sizeOf/setSize, PaneChrome's drag AND teclado redimensionar caminhos (todas as três chamadas clamp), ClassificableCard, a casa site de renderização de widget de grade ordenável da página, e o layout de configurações-página Previsão. A banda presa na página. tsx não é tocado de propósito — ele sempre renderiza em widgetDefaultSize e nunca lê armazenado preferências, então um padrão declarado já satisfaz seu próprio piso. Nenhum elemento no registo declara largura 3 ou um mínimo ainda; isto é mais tarde trabalho. Isto só alarga o vocabulário e liga as máquinas.

  23. · kamo-internal

    Toque um logotipo rastreado à mão, e baixe o arquivo convertido

    Quatro coisas no conversor raster-to-vector e o slot de logotipo simples. ** A barra de rolagem nas opções raster é três vezes maior.** 4px foi um alvo difícil para land on, e as regras eram apenas webkit, então Firefox nunca tinha tido um bar estilo em tudo — Barra de rolagemLargura/barra de rolagemColor agora carrega a mesma intenção lá. **Uma fonte que já tenha um fundo transparente é deixada em paz.** O conta-gotas utilizado para devolver felizmente uma cor para um pixel transparente: uma tela armazena alfa pré-multiplicado, então cada um deles lê de volta como (0, 0, 0), e escolhendo um disse ao pipeline o fundo era preto. Ele então foi e apagou as partes escuras do logotipo. Clicando em transparência agora diz isso em vez de escolher. A correção do lado do servidor correspondente está em vectorservice. **Uma varinha e um pincel, cada um capaz de adicionar ou remover. ** Remoção automática fica duas coisas erradas muitas vezes o suficiente para precisar discutir com: um fundo que vaza em uma parte fechada do design, e um pedaço do design que compartilha a cor do fundo e vai com ele. A A varinha toma uma região contígua inteira em um clique; o pincel leva o que for arrastado. Cada operação resolve contra a colheita ORIGINAL, nunca o corte atual. Isso é o que torna possível "+" em tudo — uma vez que a remoção zerou o alfa de uma região não resta nenhuma região para encontrar, mas o original ainda tem a cor. Ele também faz as operações replayable, então Ajustando uma configuração após a remoção de re-runs sem descartar as correções. Edita tinta localmente para feedback instantâneo; apenas o resultado estabelecido cruza o fio, e apenas o alfa máscara, como um 8-bit escala cinza PNG de algumas centenas de bytes. **Um botão de download ao lado do logotipo simples**, para que o membro possa manter o SVG o conversor produzido — muitas vezes a única cópia vetorial do seu logotipo que qualquer pessoa tem, e de outra forma alcançável apenas de um balde que eles não podem navegar. A extensão vem de cheirar os bytes, não o nome armazenado: esse slot escreve cada envio para um logotipo fixo. chave svg independentemente do tipo, assim theme.kamocrm.com serve bytes PNG de um nome .svg para qualquer org que definir um logotipo antes deste O conversor existia. Caído numa bolha em vez de ligado, porque uma origem cruzada `<a download>` é ignorado e abriria o arquivo em vez de salvá-lo.

  24. · kamo-internal

    Conjunto de campo de uma página e os padrões que substituem os passos deixados

    CreateOrgFields é o que o novo formulário de página única /network/create realmente pede para: um tipo de ramo, nome, alias, os interruptores de aplicativo, e um punhado de opcional campos. toWizardFormData preenche tudo o que o assistente de doze passos costumava coletar mas esta página nunca mostra, usando exatamente o que pular cada um desses passos usados para enviar (bindPhone/bindEmail true, contacto/marcas em branco, marca d'água FULL, fontes da marca COMPANY) assim que uma org criado aqui é indistinguível de um fez o velho caminho por alguém que preencheu apenas o que era necessário. comBranchType também mantém paiAliasId apontou para uma opção a selecionada modelo realmente oferece (ROOT primeiro quando permitido, caso contrário o primeiro personalizado do modelo alias) — o assistente de doze passos fez isso em um efeito BasicsStep o criador nunca viu fogo, e sem um equivalente aqui criar blocos de pronto para sempre em um campo esta página nunca pede por qualquer tipo de branch A opção pai é ROOT.

  25. · kamo-shared-library

    Criar os meus direitos de widget Org Livre e começar o progresso do assistente

    Adiciona o Tipo de Direitos de Papel 288-292 (CREATE FREE ORG WIDGET e os seus quatro ADDED/OPTIONAL/ CREATE CHILD ORG (131). Adiciona OrgSetupWizardStep, a enum de nove passos que suporta a Configuração de Introdução Wizard, e... org setup wizard progress tabela da tarefa 2. Também atualiza a forma taxonomia presa de RoleRightHierarchyTest (278/205/35/38 -> 283/210/36/37): CREATE CHILD ORG foi uma raiz autônoma e ganha sua primeira criança aqui, movendo-o para as raízesCom o balde de crianças, combinando com este arquivo Convenção estabelecida própria de registo de cada envio de widgets nesse teste.

  26. · kamo-internal

    Tamanho mínimo por painel, aplicado tanto na leitura como no arrasto

    Threads um opcional `min?: PaneSize ' null` através de clampPaneSize, os dois assistentes resize-delta, e as duas funções de leitura/escrita modelo de painel de lançamento puro. Para trás compatível: cada chamador existente omite o argumento e mantém o comportamento de hoje, uma vez que clampPaneSize cai De volta à rede, de volta ao andar, quando não É fornecido o mínimo por painel. O piso é imposto sobre o valor da soluçãoPaneSize, não só no manipuladores de arrastar, então a preferência de um membro foi gravada antes de um painel ter uma mínimo (ou antes de ser levantado) é puxado para cima em leitura.

  27. · SecurityService

    Colocar um orçamento em tempo real para rever a verificação

    O desfecho não tinha qualquer tipo de limite. O *** o ecrã do registo exigido antes de habilitar seu botão reenviar nunca foi lido aqui — o request body é três campos do JSON e nada no servidor procurado uma carga útil — por isso o comando fechou um botão, não o pedido, e um script postar diretamente neste URL já era ilimitado. VerificaçãoResendRateLimiter substitui-o por um orçamento que o servidor possui: um 60s resfriamento tomado como um único SET NX assim que réplicas de corrida não pode tanto ganhar, 5/hora e 15/dia por endereço, e 20/hora por IP público. Verificado ANTES da org e procura do utilizador e chaveado no endereço SUBMITED, por isso um o orçamento dos custos da sonda se a conta existe ou não e o 429 não tornar-se o oráculo de conta-existência que o endpoint é cuidadoso "se este A resposta existe para evitar. A janela IP é ignorada para um endereço não público: não deve ser determinada colapso em uma chave compartilhada para cada registrador. Redis-backed porque este serviço executa réplicas, e falhas abertas em uma falha Redis. Uma rejeição responde 429 com Retry-After e retryAfterSeconds, então o tela pode contar para baixo contra este relógio em vez de adivinhar em seu próprio.

  28. · InitializerService

    Criar org setup wizard progress para o assistente Iniciar

  29. · kamo-internal

    O ano de org estabelecido é opcional, e unsset renderiza como ausente

    Nada no servidor o exigia — a coluna é nulável, a criação O analisador mapeia um valor vazio para nulo, e o patchOrganização aplica apenas as chaves um corpo PUT menciona, então "ano": nulo é um claro deliberado. O único portão era este assistente validBasics, que bloqueou todo o passo básico até um ano Foi escolhido. Muitos clientes reais não têm resposta (um novo LLC, uma divisão girada no meio do ano, qualquer um que simplesmente não sabe), então o portão apenas ensinou-lhes a Inventa um. Largue-o; o campo mantém o seu rótulo sem asterisco e ganha o mesmo "Opcional". FieldHint cada outro campo opcional no passo já tem. Corrige a razão pela qual ninguém notou que o campo já era nulável fim a fim: o org DTO analisado anoEst com um nu ************* e coerção é executada ANTES da opcionalidade, então Number(null)=== 0 e cada org sem o ano chegou como fundado no ano zero. Ficou invisível porque a exibição Os locais guardam a veracidade e 0 é falso — teria surgido como "Est. 0" em o primeiro site que verificou `!= null`. Pré-processo nulo e "" voltar para não definido, normalizar da mesma forma na Organização. de JSON, e alargar o DTOs de rede/tema para admitir o nulo que realmente chega. Os dois sites de exibição que usaram `{org.yearEst &&& <Fact/>}` tornam-se ternários: a Falso-e renderizar é o que teria pintado um 0 nu na gaveta. A o formulário de configurações agora roteia o salvamento através da análiseAnoEst, então uma caixa em branco limpa o valor de propósito em vez de por meio de JSON.stringify transformando NaN em nulo.

  30. · kamo-internal

    Mostrar apenas os membros que são deles para ver

    Três superfícies de membros foram abertas para as pessoas que não podem significar nada Pois. Cada porta está no TIPO DE MEMBRO ou nas aplicações da org, nunca no checkRight — checkRight retorna true para cada direito no modo deus ativo, e a página canViewOtherMemberAccount ORs em direitos que não têm nada a ver com Tema **************** entre eles. getMemberType () padrão para 'MEMBER', então cada um deles falha em fechar em uma sessão cujo tipo ainda não resolveu. Planos e faturamento: somente membros da equipe. O plano, as assinaturas, as facturas, os métodos de pagamento e o assento pertencem todos à empresa; um membro simples Não tem nenhum, por isso a conta estava a mostrar-lhes o dinheiro da empresa. Fechado. O VEZ, então um proprietário abrindo a página de outra pessoa mantém a administração caminho. O cartão /settings é fechado da mesma forma — um cartão que abre uma aba que Não vai render é pior do que nenhum cartão, exatamente como Comissões ao lado dele. Ringtones e Alertas: fechado na mesma condição que o ícone do telefone da NavTop, que é agora uma função (temPhoneAccess) em vez de duas cópias da mesma &&. A subtab não passa da configuração do telefone que o ícone abre — que toque, que dispositivo, quão alto — assim um membro sem telefone estava sendo controles entregues que não podem mudar nada que eles nunca ouvirão. Áudio, Vídeo e os sons do evento não são tocados: esses são os dispositivos de reunião e o próprio aplicativo sons de notificação, que cada membro tem. Legal & Compliance: membros da equipe e uma org com os aplicativos Docs e HR. Em vez de emlinharem as novas condições, eles dobram em legalBadgeApliesTo, que o botão de assinatura do NavTop e o provedor de contagem por trás do seu crachá já partilhar. Esse botão é um link direto para esta aba, então uma quarta cópia do condição iria deixá-lo sobreviver ao seu próprio destino e soltar o membro em seu perfil sem explicação; o provedor fica quieto na mesma condição em vez de realizar uma assinatura STOMP e uma sondagem de 60 segundos para uma contagem que é 0 por construção.

Seu universo está esperando.

Comece gratuitamente em minutos.Adicione produtos sempre que estiver pronto — sem migração, sem novos logins.

Gratuito para sempre — não é necessário cartão de crédito