Ir para o conteúdo
KAMOUniverse

Changelog

O que há de novo.

Cada melhoria para a plataforma, como ele envia.

  1. · MediaService

    Uma conversa chega ao telefone

    Uma mensagem em uma linha Exec2Exec agora vai para os telefones dos destinatários, bem como seus consoles: telefone do cliente quando KamoCRM responde, telefone de cada membro da mesa quando um O cliente escreve. Ele monta o presence-gated CHAT MESSAGE existente push, deep-links para kamocopilot://exec2exec/<guid> (com o nome do cliente na cópia da secretária), e colapsos por conversa, então uma explosão é uma notificação, não dez. Um push falhou é registrado e nunca pára os quadros de console que já foram apagados.

  2. · kamo-internal

    Controle Exec2Exec da NavTop é a mesa para um executivo KamoCRM

    Para um membro com o Exec2Exec Access na organização da plataforma, o controle agora conta mensagens de clientes que eles não viram E abre o Centro de Interação. Chats > Exec2Exec em vez de sua própria conversa. Os clientes não vêem mudanças. - interacçãoCenterIntent abre o painel numa aba e balde. O balde viaja como um pedido pendente o Chats pane honra quando o Exec2Exec a aba aparece, uma vez que essa aba se junta à faixa somente após os direitos da plataforma carga e um painel fresco de outra forma cairia em sua primeira guia para o bem. - O directório Exec2Exec filma o cliente de crachásUnreadCount, o mesmo servidor contar, então o crachá e as linhas que ele abre para concordar; resposta já não emblema uma linha. - useExec2ExecDeskUnread pergunta novamente quando o instantâneo não lido da mesa se move ou a aba volta, e mantém o último número em uma pergunta falhada.

  3. · MediaService

    A contagem da secretária das mensagens do cliente ainda não vistas

    - Está bem. retorna quantas mensagens de clientes este titular EXEC2EXEC ACCESS não viu, em cada conversação, e cada lista linha carrega clienteUnreadCount. É o A regra não lida da plataforma restringiu-se ao que o cliente da conversa disse: toda a mesa senta-se em cada bate-papo, então a resposta de um colega é não lida para o outros sem esperar por nenhum deles. Uma consulta alimenta ambas **************************** O distintivo do NavTop e as linhas do Centro de Interação concordam.

  4. · KlusterServices

    Disque 911 e 933 de cada extensão, com um aviso de email MLTS

    Extensões não puderam chegar ao 911: nenhuma rota de saída igualou 911 ou 933, então do-interno caiu para o mau-número e jogou "não pode ser concluído como discado" sem nunca enviar um INVITE. startup.sh agora carrega a metade dialplan da correção: - 911 e 933 são extensões exatas em [de-interno-custom], o contexto O portão de saída vive. Uma extensão exata supera cada padrão em seu contexto, para que o portão não pode capturá-los, e eles pulam o [kamo-outbound-permitido] lista: cada extensão pode discá-los sem prefixo. Cada um vai diretamente para de-interno-adicional, onde FreePBX A própria rota de saída assume o controlo. - [kamo-e911- notify] corre antes da chamada ser roteada e iniciada kamo e911 notify.py descolada, através do TrySystem (System() pendura o canalizar para cima quando o seu comando não pode ser executado), com cada argumento reduzido para dígitos por Filter. - kamo e911 notify.py envia as caixas de correio do administrador da plataforma através de Com o tempo, a extensão e o seu O nome, o número de chamada e a localização enviadas para o centro do 112. Ele recusa qualquer destinatário fora de kamocrm.com, repete uma falha de relé três vezes e registra todos os resultados para ************************* A cápsula. postfix próprio não é usado: ele retransmite via smtp.gmail.com e sua fila é Preso. O notificador é reescrito em cada boot; o bloco dialplan é adicionado uma vez sob a sua própria guarda, como o bloco assistente. A metade do roteamento são dados do FreePBX, fora deste repo, e é aplicada no k1m1: rota de saída Emergência911 (emergência rota=YES, padrões 911 e 933, tronco 1 (o tronco de Telnyx), primeiro na sequência, sobrepor CID +1949299960) e Devices.emergency cid +19492989960 em todas as 22 extensões. freepbx/tests/test e911.py (stdlib unittest) verifica que startup.sh analisa como bash e como YAML, modelos Asterisco seleção extensão para mostrar 911 e 933 passar o portão enquanto 10 dígitos, 11 dígitos e 011 números ainda chegar a ele, pinos o gancho de notificação para NoOp/TrySystem/Return com argumentos filtrados, e conduz o notificador contra um relé falso.

  5. · kamo-marketing

    Listar apenas o número de telefone nas páginas em inglês

    mostraPhone(locale) em app/lib/phone.ts é a regra única, atualmente locale === "en". PhoneLink não retorna nada em outro lugar, que cobre o cabeçalho, menu móvel e rodapé, onde o número está sozinho. TelefoneSomente embrulha as posições que transportam mais do que o número — o cartão de contacto, e o "Dê-nos uma chamada:" lead-ins na tira CTA casa, a Enterprise cartão de preços e a página de demonstração — assim suas palavras e espaçamento vão com ele. A Organização JSON-LD adiciona telefone à org e aos seus ContactPoints Na mesma condição, então nenhuma outra marca local reivindica o número.

  6. · kamo-marketing

    Deixe o logotipo levar para casa, e listar o número de telefone onde os visitantes decidem

    A entrada Home do cabeçalho duplicou o logotipo, que já faz links para /. Ele se foi do desktop e menus móveis; em seu lugar o logotipo carrega uma dica de hover/focus dizendo que vai para casa (esquerda da página inicial em si, onde não há para onde voltar). (949) 298-9960 é agora uma ligação de toque à chamada: - cabeçalho, centrado entre o navegador e o seletor de idioma (xl e para cima; a linha lg não tem espaço para ele), e no menu móvel com os CTAs - rodapé, sob os ícones sociais - página de contato, como um cartão de chamada que dirige as opções de contato - tira CTA home, cartão de preços empresarial e página de demonstração, ao lado do chamadas de ação existentes - Organização JSON-LD, como telefone na org e ambos os ContactPoints O número vive uma vez em app/lib/phone.ts; PhoneLink renderiza-lo e os relatórios clicam através da faixa de dados como clique no telefone com a sua localização.

  7. · kamo-internal

    Uma superfície dropdown pintada com marca para toda a barra superior

    Cada dropdown que pendura NavTop — os oito menus de opções (Mail, Docs, Chamada / Texto, Calculadora, Suporte, Configurações, Linux Desktop, Jogos), a pílula de disponibilidade e o seletor de idiomas — agora abre em UMA superfície compartilhada em vez de seu próprio branco MUI popover. - Pintado na cor primária da organização com etiquetas brancas e ícones. Sua borda superior se senta rubor na borda inferior da barra, na cor própria da barra nesse local (o gradiente pára agora em Navtop/menu/navTopSeam.ts e NavTop constrói o seu fundo a partir deles), com cantos quadrados superiores E uma côncava junta-se a ambos os lados, por isso lê-se como a barra que se estende para baixo em vez de um painel colocado sobre A página. Uma marca muito leve para o texto branco é escurecida em sua própria tonalidade apenas até WCAG AA necessidades (um teto de luminância em matemáticas de cor relativa CSS); cada outra marca é desenhada como escolhida. - Abre sob um rato descansando, segue o ponteiro ao longo da barra — a superfície plana e redimensiona para o menu seguinte, enquanto o conteúdo desliza na direção da viagem — e dobra de volta para o barra logo após o ponteiro deixar tanto o gatilho quanto o painel. Um clique ou um toque o prende até que uma imprensa externa, Escape ou uma escolha; um toque nunca foca um campo de texto. - Teclado: Digite / Espaço / ArrowDown aberto para a primeira linha, setas andar as linhas, Casa / Fim, type-ahead, Direita / Esquerda abrir e fechar grupos e passo para o menu vizinho, mãos Escapar Concentrem-se no gatilho. - Um destaque que desliza de fileira em fileira, grupos que abrem abaixo de sua fileira em um fio guia, um Um único anel nos crachás de contagem, o balanço de Cheddar a contar. Todos os movimentos fora de movimento reduzido. - Configurações obtém uma caixa de pesquisa que pesquisa dentro de seus grupos e marca a correspondência; Enter abre o Primeiro golpe. O seletor de línguas é uma grade de duas colunas de todas as 22 línguas, pesquisável pelo nome nativo, Nome ou código em inglês. Configurações pin alterne ea carteira Cheddar ficar branco na marca e estão inalterados no trilho. Os trilhos voam para fora são inalterados — o trilho já espreita aberto sobre pairar. Quando um menu é aberto, alterna e fecha é uma máquina de estado livre de reação (navtop/menu/hoverIntent.ts) com testes próprios. Verificado em Chrome real contra os componentes reais (esbuild arnês, fontes de dados golpeadas): 170 controlos medidos em 11 marcas — cronometragem do hover, a costura e os cantos, ambas côncavas, texto branco em 4.5:1 ou melhor em cada parte do painel, tinta branca em todo, o deslize entre menus, a licença graça, uma diagonal em um vizinho não roubar o menu, clique-to-pin, toque, teclado, buscas e movimento reduzido. 287 testes nas suítes nav e navtop, tsc, imature-build guardas contra o dicionário atual en.json.

  8. · MediaService

    Sentar toda a mesa em cada bate-papo, mostrar quem está nele, fechar os feeds de chat

    - Adesão permanente: todos os titulares do EXEC2EXEC ACCESS Conversa Exec2Exec. Exec2ExecDeskBancos e assentos descalços Subvenções ao evento exec2exec.desk.changed do serviço de segurança, uma varredura de 5 minutos, inicialização, e sempre que uma conversa é aberta ou cheia de volta; a mesa é re- lida por conversa para que uma varredura não possa desfazer uma concessão que outra cápsula acabou de aplicar. - GET /chat/{id}/participantes lista os executivos do KamoCRM numa conversa (memberId, userId, name, jobTitle). - Linhas de remetente carregam remetentePhone (o telefone de org de topo (Main)) e remetentePhoneExt (a extensão VOIP habilitada, caso contrário o membro da equipe) para Pessoal do KamoCRM. A recepção é sempre assinada por Deus. - Roster linhas carregam aguardandoDesk (o cliente falou por último) para o console Verificação de entrada. - Segurança: /topic/chat/incoming/{memberId} e /topic/chat/unread/{memberId} pode agora ser subscrito apenas por esse membro e nunca enviado por um cliente. Ambos estavam desprotegidos, então qualquer cliente pode seguir qualquer membro. chegadas e não lidas por id. - O genérico add/remove/leave/rename member routes recusar Exec2Exec Sessões (409 MEMBRO GESTÃO): o reconciliador é o proprietário dessa adesão. - E-mail desligado: mensagem de um cliente envia a secretária, resposta de um executivo envia apenas o cliente, em vez de cada executivo sobre tudo. - Back Fill saudações e assentos na transação que abre um bate-papo, por isso um a primeira resposta do cliente nunca é marcada como lida para a mesa.

  9. · kamo-marketing

    Mão Google a marca verde-tile, porque ele lista o maior ícone que declaramos

    A pesquisa mostra um ícone por site e leva o maior declarado, Apple-touch-icon incluído, assim os ícones 180px touch (nosso e o O tema era superior a tudo o resto. Uma maçã 192px-touch-icon agora ultrapassa os dois. Seus pixels são a marca verde-tile 96px duplicada Então, a queda do Google devolve o original. Tabs manter favicon.ico, iOS mantém a exata 180 correspondência para a casa tela, e nenhum logotipo na página muda. Navegador de novas peças que quer o maior ícone vai pegar este.

  10. · kamo-internal

    Mostrar quem do KamoCRM está no chat e como contactá-los

    A janela do cliente agora lista os executivos do KamoCRM em sua conversa, re- ler sempre que alguém é adicionado ou removido. A linha mostra apenas NAMES, com títulos no hover: "Nome - Título" por pessoa correu a mesa para um executável que cortado após o primeiro executivo, para que um cliente não pudesse mais ver quem mais estava ali — a única coisa que a tira serve. O carregamento, vazio e falhou são desenhados à parte; "ninguém do KamoCRM está neste chat" é algo em que um cliente atua. A linha de atribuição de um executivo da KamoCRM termina agora na linha principal da org e na sua Prorrogação — "Sage Nadjafinia - KamoCRM Inc. - Presidente - (949) 298-9960 x8080" — através da assinaturaPhone, inalterado, assim que imprime exatamente como um email A assinatura faz. O separador é " - " em toda parte, para combinar. Os quadros de membros chegam com id: null, então eles são tratados antes do A transcrição é "sem identificação, solte-a" guarda; atrás dela eles foram silenciosamente descartados.

  11. · SecurityService

    Dizer quando a secretária mudar

    Concessão ou revogação do Exec2Exec Access agora publica exec2exec.desk.changed, assim MediaService pode colocar um executivo em cada bate-papo — ou tirá-los — como o comutar na página de administração da plataforma, em vez de sempre que a sua varredura seguinte Corre. Após commit, não inline: MediaService re-deriva toda a mesa do banco de dados e nunca confia na carga útil, por isso uma subvenção rolled-back não pode qualquer um — mas um inline publicar corridas o commit, e uma reconciliação que lê Primeiro reconcilia-se com a velha secretária. A carga é para o registo, não para a lógica. Publica quando o direito é mantido antes E depois também: executivo é a maneira natural de colocá-los de volta nas conversas após um evento perdido.

  12. · kamo-shared-library

    Carrega a linha do executivo numa mensagem

    ChatMessageDto ganha remetentePhone e remetentePhoneExt, definido apenas quando o remetente é a equipe KamoCRM: a linha principal do org da plataforma mais a extensão que atinge Essa pessoa, como uma assinatura de e-mail já a imprime. O relé copia de um allowlist, então um campo que esta classe não declara não atinge nenhum navegador — histórico Levaria o número enquanto todas as mensagens ao vivo chegavam sem ele. O comentário do localizador de bolsas-somente não diz mais aos ouvintes que é a resposta errada. Para o escritório Exec2Exec é agora exatamente o direito, deliberadamente: requester fez a opção na página de administração da plataforma o controle único sobre que se senta nas conversas executivas.

  13. · kamo-internal

    Parar em um Centro de Interação preso; mantenha janelas sob cada menu

    Dois acompanhamentos para 0c5ef994 (máximo ao lado do navegador). Um Centro de Interação Pinned agora tira sua largura do maximizado Pane. Pinado, o painel é trabalhado ao lado da tela, então um maximizado a janela e a sua tira de tabulação param na borda esquerda do painel em vez de correrem debaixo dela. O painel publica sua largura em uma variável CSS enquanto está preso E aberto (useInteractionCenterReserve) e paneGeometria subtrai-o, o caminho a variável rail já funciona; o painel é desenhado na mesma string, então os dois não podem discordar. Sem fixação, o painel ainda é um modal sobre um scrim e A janela mantém a sua largura atrás dela. Desvinculando, fechando e desmontando tudo retirar a reserva. A tampa de largura do navegador mede o quarto para o A borda do painel também. Os menus já não abrem atrás das janelas da ferramenta. O balcão z da loja (tool-core, compartilhado com móvel) sobe em cada aberto, levantar e focar e nunca é reiniciado; pintados em bruto, uma longa sessão levou janelas para além de MUI 1300, e cada menu, popover e diálogo no aplicativo então abriu BEHININ - no DOM, posicionada, invisível. A doca agora lê o contador apenas para ORDER e pinta cada janela na sua posição numa pequena banda acima de 200 (windowStacking.ts), assim que o empilhamento da loja decidido é mantido e nenhuma janela nunca atinge um menu camada. O elevador do navegador sobre um painel maximizado usa o mesmo nível pintado, então Fica debaixo dos menus também. Verificado no Chrome real: a janela e a extremidade da tira na borda do painel fixado (890px de 1440), uma sobreposição de painel sem pinos, e após 2.000 cliques de foco (o contador passado 1300) um menu na camada padrão do MUI ainda pinta sobre a janela.

  14. · kamo-internal

    Maximizar ao lado do navegador, não sobre ele

    Uma janela de ferramentas maximizada usada para tomar o viewport inteiro. Ele, seu navegador coluna e sua faixa de tabulação foram todos fixados em (0,0) no nível de empilhamento da doca, sobre ambos os navegadores — para que um membro lendo uma janela maximizada pudesse chegar a nenhum navegação até que a guardem. O painel é agora tudo abaixo de NavTop e direito de NavPri. A janela, o navegador e a tira começar na borda do trilho e sob a barra, leia de as mesmas duas variáveis CSS AuthedChrome offsets da própria caixa de conteúdo da página por (paneGeometry.ts), então uma grade expandida move a página e o painel juntos. O navegador e a tira deslizam dentro de slots de recorte, então eles saem de atrás do trilho e do bar em vez de atravessá-los, e todos os três seguem um trilho alternar com o próprio tempo da janela. Enquanto uma janela é maximizada, o navegador também tem que agir sobre ela: - Uma opção que vai para uma PAGE anuncia nav:page primeiro, e cada janela ainda na tela é colocado como um hexhead — caso contrário a página iria carregar debaixo do painel. Clicando na página que você já está em conta também: é pedindo para ver essa página. - Uma opção que abre uma janela TOOL marca a sua ferramenta:aberto com origem: 'nav', e o funil cada aberto passa através de transforma que em maximizado: Verdade. A nova janela leva o painel, o antigo vai para um Hexhead através a própria troca da loja, e o navegador e as abas seguem a nova janela — para o seu balde, para a lista de terminais, ou para uma ferramenta sem navegador. Ambos se aplicam apenas enquanto uma janela segura o painel (a chamada do membro). Com nada maximizado um clique de navegação se comporta exatamente como antes. As regras são puras (navPaneRule.ts) e o nav apenas anuncia (app/lib/navIntent.ts); * **************** falha em uma ferramenta nua: aberto ou roteador. empurrar escrita numa superfície de navegação. Coberto: ambas as opções de navegação e menus, Configurações, a paleta de comando, o logotipo, KamoMobile, a pílula do plano, links do NavTop e Bell, o botão Exec2Exec, e as linhas do Centro de Interação. Retirada fixada na mesma alteração: - O hover-peek do trilho e o Centro de Interação (painel e pano de fundo) sentado em z 26-30 sob um painel em 201 e escalando, assim que o navegador foi alcançável eles Abriu atrás dela. As camadas do nav são levantadas acima do painel por sua própria nível enquanto um é mantido, mantendo sua ordem (navLayerZ, useMaximizedPaneZ). - A costura do navegador computou sua largura como x do ponteiro, verdade somente enquanto o navegador começou em 0. Mede da borda esquerda do navegador Agora, e tampa a largura em uma parte do painel em vez da tela. - O xadrez e o Hold'em escolheram o layout da janela. Largura interior quando maximizada — muito largo pelo trilho, e velho em um trilho alternar. Eles medem os seus próprios root (useMeasuredBox, movido para ferramentas/ para ser compartilhado); **************************** Continua assim.

  15. · kamo-shared-library

    Listar os membros que possuem uma plataforma direita

    countHoldersOf respondeu quantos; o escritório Exec2Exec precisa de quem. Linhas de subvenção sozinho são a resposta errada para "quem trabalha a mesa" — o proprietário de nível superior detém toda plataforma direita sem linha em tudo - assim este é um braço dessa resposta, e o chamador adiciona o proprietário e o cheque de emprego.

  16. · kamo-internal

    O canal executivo na consola

    Uma linha direta entre um executivo de clientes e os executivos do KamoCRM: o chat metade da janela de suporte sem ticket, sem status, sem classificação e sem fila. A janela da toalha. Seu próprio diretório, porque o rascunho guarda resolve uma ferramenta arquivos de sua própria pasta — e passa VACUOUSLY para uma ferramenta somente para chat, uma vez que o a área de texto do compositor vive em app/componentes/chat. A guarda de perto é, portanto, escrita à mão, não inferida de um carrapato verde. A linha de classificação. Nome, organização e cargo oficial na linha única que costumava conter um nome, e em ambos os lados — o ponto do canal é qual cabeçalho alguém estava escrevendo sob, o que se aplica ao mensagens de uma organização diferente também. O lado de uma mensagem é computado do ID USO do remetente em renderização e nunca armazenado; um lado armazenado é o que uma vez fez bolhas pousar no lado errado irreprodutivelmente. A maioria dos executivos não tem emprego título gravado, então dois campos é a visão normal e não há nenhum separador. NAVTOP. À esquerda do sino, no cromado fixo e deliberadamente fora de NAV REGISTRY — não existe nenhuma bandeira "não móvel" nesta base de código, e ficar fora do registro É como um ícone é feito inocultável. Envia o seu próprio conversação explicitamente: a ferramenta é fechada em uma instância, e uma abertura sem propless de uma ferramenta capped é um aumento, não uma navegação, por isso o botão seria de outra forma Re-raise o executivo que o Centro de Interação tinha aberto pela última vez. O seu crachá conta a própria conversa do espectador, nunca o total de mesa — um operador é um festa a cada conversa que eles respondem, e clicando em um controle pessoal não pode Esvaziar a informação de outra pessoa. Centro de Interação. Um sétimo balde, direito dos membros da equipe, visível apenas para um Titular do EXEC2EXEC ACCESS no interior da plataforma org. Ele lista os usuários, não as sessões — a maioria das quais nunca escreveu nada — com as suas próprias organizações abreviada para "Acme +3", a lista completa em uma dica, no atributo título e no rótulo de aria da fileira, por isso é alcançável sem um hover. ALL BUCKETS é ambos a faixa e a lista de permissões de preferência salvas, por isso uma lista visível derivada todos os três leitores e um membro restaurado em uma aba que eles não podem mais ver é saltado em vez de encalhado em um valor Tabs sem Tab. Bem-vindo à mensagem. O primeiro controle gravável já colocado na plataforma Geral tab. Back Fill senta-se atrás de uma confirmação e relata o que ele fez; está fechado em EXEC2EXEC ACCESS em vez do próprio direito da aba, porque pressionando-a escreve um mensagem nas conversas das pessoas.

  17. · SecurityService

    Guardar a mensagem de boas- vindas

    A saudação que a plataforma envia primeiro sobre Exec2Exec, na configuração da plataforma singleton onde todas as outras plataformas já vivem. Dois novos endpoints em vez de mais duas chaves em /system-config, e que é o todo o ponto da mudança: o GET de singleton não tem filtro por campo em tudo — não autorizado Os campos governam somente a escrita — assim admitindo PLATFORM GENERAL ao seu portal qualquer entregaria a cada operador geral o URL base KamoPBX, ID mestre da conta, nome da conta, utilizador administrador, endpoint do reino e WSS, mais o modelo de extração id. Um campo de texto a que têm direito, em troca para as outras duas páginas. Gravações em branco como nulas: não configuradas e configuradas- para- nada são as mesmas instrução, e Back Fill é um no-op nesse estado. O direito em si é imposto no MediaService, onde as conversas estão, então PlatformRightCoverageTest registra em ENFORCED ELSEWHERE com o arquivo que Segura o portão.

  18. · MediaService

    Servir o canal executivo

    Uma conversa com sua própria regra de audiência e nenhuma máquina de bilhetes, seguindo Forma do SystemBug: seu próprio pacote, seu próprio controlador, sua própria visibilidade, e MediaSession/MediaObj reutilizado para tudo embaixo. Nada tinha de ser suprimido da fila de suporte porque uma conversa sem linha de ticket nunca entra nele. Elegibilidade (Exec2ExecElegibilidade) é um membro simples da org de topo OU O proprietário de qualquer org em que tenham sido assinados — e "proprietário" são dois factos, não um: a bandeira do TeamMember AND orgs.user id owner, porque a própria org da plataforma é Detidos sem o seu proprietário, necessariamente com a bandeira. O portão direito da plataforma apenas o lado KamoCRM, e canOperate passa por SessionPlatformFacts, nunca AuthHelper.hasright, que uma bandeira GD nua ignora. Cada mensagem carrega nome, org e cargo oficial, resolvido ao vivo a partir do autor's member id — membros é UNIQUE(ORG ID, USER ID), de modo que o id já Nomes, permanentemente, de que organização alguém estava a escrever. Nada é fotografado na linha. Um simples deputado não tem qualquer título de emprego, que é o caso normal para exatamente a população que isso serve, então a linha degrada para dois campos em vez de seguir um separador. Uma conversa, dois endereços (chat id e session guid), porque o navegador possui o guid — é a chave de rascunho do compositor, a chave não lida e o STOMP tópico — enquanto a linha é chaveada por id. Ambos resolvem para a mesma linha; nem é para ser arrumado. Anunciando uma mensagem fãs para fora todos os três quadros, não apenas o tópico de sessão: a tópico apenas uma janela montada assina é como um crachá não se move até que um página recarregar. O autor das boas-vindas não se junta deliberadamente à sessão — o membro do SYSTEM da plataforma é uma pessoa real de inscrição, e juntando-se a eles colocar Todas as conversas sobre a implantação no instantâneo não lido de um humano. Uma segunda linha de membros para o mesmo usuário carrega seu ponteiro de leitura existente Escuto. A regra não lida é por MEMBRO e este recurso é o único lugar um USUÁRIO detém vários, então um ponteiro novo contou tudo o que eles tinham escrito de sua primeira organização como não lida contra si mesmos. Elegibilidade é mais ampla do que a saudação de propósito: um proprietário de org recebe o canal, mas a Mensagem de Boas-vindas é endereçada, como especificado, ao próprio kamocrm simples membros. DDL é à mão (ddl-auto: none, InicializerService unployed) e já aplicado ao grupo; **************** é o recorde.

  19. · kamo-shared-library

    Fundação do canal executivo

    Uma conversa de pé entre um executivo do cliente e o KamoCRM os executivos, com a chave no usuário em vez de em um membro — que é o que lhe permite seguir alguém que possui quatro organizações de qualquer uma que eles são assinados em, enquanto cada parte ainda está armazenada como um ID de membro para que cada mensagem registre de que organização o seu autor o escreveu. - MediaSessionType.EXEC2EXEC(5) — anexado, nunca inserido; a coluna é @Enumerado(ORDINAL). Não tem o formato de SUPPORT TICKET: sem status, sem fila, sem atribuição, nada que feche. - **************** - anexado por último, porque getSortOrder() retorna ordinal(). Ele porta quem RESPOSTA a mesa, nunca quem tem direito a Um: Confling os dois entregaria a cada executivo a mesa. - Exec2ExecChat, um satélite na coluna da MediaSession como o SystemBug é, com UNIQUE no USER ID: "há apenas um bate-papo Exec2Exec" é um banco de dados mais do que uma convenção, que é o que resolve a corrida entre Botão NavTop e a resolução automática do mesmo bate-papo em um login. - Ganhos ChatMessageDto **************************** O relé cópias de uma lista de permissões, por isso um campo que não declara não atinge nenhum navegador em tudo — a história leria corretamente enquanto as mensagens ao vivo mostravam um nome nu. - Está bem. a saudação que a plataforma envia primeiro. - EncontrarMembros de ChatPor nomes de membros EXEC2EXEC. Essa consulta é um ALOWLIST, e deixando o tipo fora dele é toda a razão pela qual uma conversa social poderia Nunca mostre uma conta não lida em lado nenhum.

  20. · kamo-signer-monorepo

    O papel de parede da org por trás de cada página, e cópia branca sobre ele

    kamo-sign era a única superfície branca ainda pintando um cinza plano. Agora toca o convidando a fotografia de fundo da organização da forma kamo-login, kamo-register, o console E o KamoMeet já o faz. `backgroundImageCount` → §<themeBase>/img/bg/{n}.webp`, `backgroundOrder` homenageado, um 8 s habita com um crossfade de 1,2 s que pára sob o movimento de preferência reduzida, 404s caiu, e as org's primárias sobre ele em 6%. `OrgBackground` vive em @kamo/tema, ao lado do resto da convenção de ativos temáticos, então o O assinante tem uma cópia em vez da quinta. Ele resolve a bala em cada passagem e re-sondas em KAMO THEME REAPPLY: o layout monta antes de qualquer token ter sido validado, então o remetente é desconhecido na primeira pintura e conhecido apenas uma vez que a sessão chega. ** Ele não faz nada quando a org não tem papéis de parede**, e tudo o que responde a ele é fechado nesse mesmo fato via `useOrg Wallpaper(). Cópia branca sobre `-- background` — que em um O inquilino temático é #ffffff — seria invisível, portanto esta nunca deve ser uma cor incondicional. Montado em quatro raízes, nunca dentro de uma tela: as fases são envolto em um `motion.div` que anima `y`, e um ancestral transformado é um bloco contendo, então uma `posição: camada fixa` dentro de um escorrega com a transição em vez de ficar parado atrás dele. - ** Uma cor de 6% é uma cor, não uma cor.** Cópia do corpo branco sobre o papel de parede do 'crm' — uma selva iluminada pelo sol — Medidas 1.6:1 apenas com a lavagem, e kamo-login's page-wide `rgba(2,0,36,0.2)→0.05` apenas atinge ~2:1; escapa com isso porque cada palavra que mostra fica dentro de uma carta fosco. A tela de conclusão não tem cartão, então o escurecimento é um radial centrado sob o linear gradiente, sintonizado pela amostragem de pixels renderizados. Medido contra ambos os inquilinos reais, cada linha agora limpa AA: 8.5:1 para o título, 5.5:1 para o rodapé, pior caso 5.5:1. - **A tela de conclusão fica branca** — o cabeçalho e a dica de download com as três linhas reportado, uma vez que eles compartilham uma superfície e meia uma correção lê como um bug. - ** Um logotipo é a cor que o inquilino escolher.** 'crm's é quase preto verde, invisível em um fotografia sob um scrim. ThemeLogo pega uma 'overlayColor' e mascara a arte para um silhuette, o mesmo mecanismo kamo-login e KamoMeet usar para a própria logo- sobreposição da org configuração; o sinalizador passa #ffffffff exatamente quando um papel de parede está acima. - **O cartão de "mensagem" da tela de boas-vindas foi uma lavagem de 4% sobre `transparente`** — no apartamento fundo a tonalidade quase branca pretendida, sobre uma fotografia de 96%, com uma citação escura Nele. Mistura-se em #fff em um papel de parede em vez disso. - ** A página pública de citação** também a recebe, tingida de seu próprio `--quote-primary` e escondida em `@media print' — o que os arquivos do cliente permanecem em papel branco. O seu apelido de org é lido no `/public/<alias>/` segmento do URL do cabeçalho que `QuoteMapper.themeAsset` já constrói, em vez de adicionar um campo para `PublicBranding' e reinstalar dois serviços Java para um Folha de estilo. A regra de impressão repete o seletor `html[data-kamo-wallpaper]` na íntegra especificidade: uma consulta de mídia adiciona nenhum de seus próprios, assim que uma `.quote-page ` lá perderia para A regra da tela e imprimir uma página transparente. Verificado em um navegador contra `crm' e `sign-pink` fora do balde tema ao vivo — bem-vindo, consentimento, espaço de trabalho do documento e conclusão — com contraste medido a partir de pixels renderizados que olhos.

  21. · kamo-internal

    Terminar a página da categoria — largura, uma seta para trás, palavras reais

    Os três gerentes foram escritos para sentar dentro de uma aba aninhada de uma aba. Como uma página de Precisavam do espaço que agora têm. - A configuração capped-se em 560px, então dois interruptores se sentaram em uma coluna com a maioria de uma tela larga vazia ao lado deles. Eles são uma grade que preenche a largura e dobra para uma coluna abaixo de 360px cada. - Duas setas traseiras apontadas para o mesmo lugar — uma no pão ralado, uma ao lado o título. A trilha lê como uma trilha agora; a seta é a única "volta". - Doc Types é a aba que a maioria das organizações pousam sem nada nele, e seu estado vazio, suas dicas de comutar e suas cinco mensagens de erro não foram traduzidas Inglês. O estado vazio também disse ao leitor para clicar num botão já ligado screen; diz para que serve um tipo de documento. - Dois botões gritavam no MUI. Carregar as categorias já não define o estado síncrono dentro do efeito — o As regras do React Compiler rejeitam isso como uma renderização em cascata, e a repetição agora token do clique em vez disso. A busca cancela ao desmontar enquanto está lá.

  22. · kamo-internal

    Categorias são uma tabela, e cada uma abre como sua própria página

    /settings/features/docs carregava oito abas: Geral, então sete que cada montado Os mesmos três gestores contra um ordinal diferente. Sete cópias de um ecrã, e quatro deles estavam a editar a coisa errada. Os ordinais foram escritos quando ImageAssocType tinha seis constantes. Anexando constantes e dando-lhes ids explícitos movidos CALL RECORDING de 3 para 7, e o página não tinha como notar: a aba chamada "Call Recordings" estava editando MY DOCS, "My Documents" RECORDING, "Meet Recordings" system WIDE, "System-Wide" VM RECORDING, e CALL RECORDING foi inacessível. Nada falhou, porque um ordinal é sempre uma categoria válida. Enquanto isso, as categorias que foram nunca dado uma aba realizada o trabalho real — esta organização trinta e seis tipos de documentos Todos se sentam em LOAN, que a página não poderia abrir em tudo. Então a página é duas páginas agora. Geral diz o que é gestão de documentos; Categorias é uma tabela de cada categoria que a ORGANIZAÇÃO pode configurar, servida por DocsService do próprio enum, com pastas, tipos de doc, tipos definidos, documentos armazenados ao lado de cada um. Uma linha abre como sua própria página abaixo **************************** a forma como um provedor de telefone faz — broadcrumb voltar para a tabela, o mesmo cabeçalho gradiente, e Configuração / Doc Tipos / Empilhando Ordens como abas reais em vez de cinza aninhados dentro de um painel. O URL carrega o nome de enum, nunca o ordinal, então um link salvo hoje sobrevive a próxima constante que alguém adiciona. Coisas menores que corrigem no caminho passado: - A página Geral tinha sido renderizado "Descrição", "Categorias de Cabeçalho" e "Categorias Corpo" — placeholders ninguém preencheu. - O launchpad de configurações e o menu de configurações listaram todas as sete abas mortas. - Uma categoria cujos tipos de documentos nunca mais podem ser aplicados (Materiais de Marketing) oferece uma aba Doc Types; um cujos tipos de documentos são simplesmente desligados diz assim, ao lado do interruptor, em vez de deixar alguém definir tipos que não fazem nada. - AssocTypeSettings manteve a antiga barra de aninhados e não tem ninguém para ligar.

  23. · DocsService

    Servir as categorias do documento do enum que as define

    A página de configurações de documentos nomeou suas próprias categorias e enviou o ordinal que acreditava Cada um tinha. Esses ordinais foram escritos quando ImageAssocType foi seis constantes long; anexando constantes e dando-lhes ids explícitos movidos CALL RECORDING de ordinal 3 a 7, e a página nunca notou. A página com o nome "Call Recordings" tinha editado MY DOCS, "My Documents" tinha editado MEET RECORDING, "Meet Recordings" estava editando SYSTEM WIDE, "System-Wide" estava editando VM RECORDING, e CALL RECORDING era inacessível. Nada falhou, porque ordinal é sempre uma categoria válida — apenas não aquela que você quis dizer. - Está bem. respostas com a lista do próprio enum define, assim que o ordinal eo nome sempre sair aqui juntos e um chamador Nunca terá de adivinhar. Uma categoria se qualifica quando pastas ou tipos de documentos estão ligados ou organização-settable — precisamente "há algo aqui para definir", que elimina as associações que existem apenas como canalização (uma imagem de erro, uma imagem foto frame, um currículo em uma aplicação de trabalho). Cada linha também carrega as contagens que a tabela de configurações mostra: tipos de documentos definidos e Ativos, empilhando ordens e documentos armazenados. Três leituras em conjunto memória em vez de uma consulta por categoria, então uma requisição preenche toda a tabela onde a página anteriormente precisava de trinta e nove.

  24. · kamo-signer-monorepo

    Um gatilho compacto para o menu de cópia assinada

    A lista de envelopes do remetente e qualquer tabela de pacotes atribuídos têm uma linha, não um slot herói, e o A pílula rotulada não se encaixa. `iconOnly` dá ao menu SAME um ícone de download nu para abrir. A alternativa foi um download de arquivo único sob medida em cada espaço apertado, que é como "download the cópia assinada" passou a significar três coisas diferentes em três telas em primeiro lugar.

  25. · kamo-signer-monorepo

    O § 7001(c) divulga o código, em vinte e duas línguas

    `@kamo/esign-core` agora carrega a divulgação do consumidor em si — seis cláusulas, cada língua o sinal do produto e `consentDisclosure(locale, brand)` para preencher o nome do remetente. Estava em... dicionário kamo-signer; pertence aqui por duas razões. É mostrado em duas superfícies, e um assinante após um link por e-mail deve estar concordando com as mesmas palavras que um membro assinando o mesmo Documento de dentro da plataforma. E é VERSIONED: `CONSENT DISCLOSURE VERSION` é escrito na linha do destinatário no momento da autorização e impressa no certificado de conclusão, "eles aceitaram a divulgação" designa um texto específico — que não pode fazer se um gasoduto de tradução pode rever as palavras sem ninguém bater a versão. Mudar a redação é, portanto, um salto de versão aqui E no EsigService's EsignCertificateService. Certificados antigos continuam nomeando a versão antiga, que é o ponto de ter um. A etapa de publicação agora aceita qualquer credencial que o registro leva. NPM PUBLISH TOKEN sai como um token, que é o que o kamo-js usa e o que executa 12016 falhou por falta de — esse segredo existe em kamo-js e não neste repo. GIT CLONE TOKEN, que este repo tem, é um usuário do Forgejo token; o registo de pacotes aceita aqueles apenas como autenticação BASIC, e responde a um 401 nu quando um é enviado como portador, sem nada a dizer o esquema era o problema. Tenta o portador primeiro, cai de volta ao básico, e prova a credencial com `npm whoami` antes de construir qualquer coisa — assim um credencial que não pode publicar diz isso em vez de falhar três passos mais tarde dentro `pnpm publish`.

  26. · ESigService

    Um certificado de conclusão real, e as três cópias de um registro assinado

    O que o pipeline achatado anexou foi uma página por assinatura carregando sete linhas: nome, e-mail, ID de membro, timestamp, método de captura, IP, agente do usuário. Sem roteamento, sem registro de consentimento, não entrega ou visualização da linha do tempo, nenhum hash de documento assinado, nenhum número de página — então um leitor não poderia dizer se eles estavam segurando tudo — e só existia INSIDE o PDF executado, onde uma parte Quem queria as provas por si só não conseguia chegar lá. «EsignCertificateRenderer» tira o certificado: o envelope e ambas as impressões digitais, as partes em ordem de roteamento, e então por partido toda a história — papel, ordem de assinatura, status, COMO eles eram autenticada, a linha do tempo do convite à assinatura, IP, dispositivo, método de captura, e que a divulgação do consentimento que aceitaram em que língua. É usado em ambos os lugares: o oleoduto achatado adiciona estas páginas ao documento executado, e `EsignCertificateService' serve as mesmas páginas como um PDF autônomo. Uma segunda execução é um segundo conjunto de auditorias declarações que podem discordar com o primeiro, e a única coisa que um registro de auditoria pode nunca fazer é contradizer-se. O certificado é REGENERADO, nunca armazenado. Cada fato nele já é durável no destinatário e linhas de assinatura, de modo que uma cópia armazenada seria apenas uma segunda coisa que pode ficar velha; também significa Um envelope assinado antes de hoje recebe um certificado completo da primeira vez que alguém perguntar. **************** em quatro superfícies - a sessão do signatário, um membro do pessoal copy, painel do remetente e API interna — com `ambos' como zip. «/documento assinado» ao seu lado porque já está ligado do correio entregue e serializado para outros serviços. Duas coisas que os testes apanharam que seriam defeitos vivos: - `Map.of` lança NullPointerException em um valor nulo, e o único pedido com um valor nulo é o que o branch existe para: um envelope que não está completo não tem PDF executado, então `?o que=ambos' em um envelope em voo teria sido um 500 em vez de um zip segurando o certificado. Degrada-se a qualquer metade que exista agora — alguém perseguindo uma assinatura paralisada é exactamente quem precisa do registo de auditoria. - O zip é MANTIDO em vez de desinflado (ambos os membros já estão comprimidos PDFs) com entradas ordenados, então os mesmos insumos produzem os mesmos bytes e quem o recebe pode checksum-lo. A test analisa ambos os membros como PDFs em vez de contá-los: uma entrada MANTARD com um CRC errado Desembucha para o lixo que ainda parece um ficheiro. (ele não tem espaços nele, então uma embalagem somente de palavras o executa fora da borda), declara uma data-limite ausente como um traço explícito em vez de omitir a linha — "Assinado: —" e nenhuma linha são diferentes declarações, e apenas uma delas é evidência — e selos "Page n of m" após o corpo, porque até que o corpo esteja acabado ninguém sabe o que é m. O consentimento agora carrega o local onde foi entregue, então o registro diz qual dos vinte e dois Traduções do § 7001(c) divulgação o assinante realmente lido.

  27. · kamo-shared-library

    Registro O QUE autoriza a divulgação de um assinante aceito, e em que idioma

    "consentido" registra que alguém marcou uma caixa. 15 U.S.C. § 7001(c) é uma lista de coisas específicas Um consumidor deve ser informado antes de consentir — o direito ao papel e qualquer taxa, como retirar e o que isso lhes custa, o que o consentimento cobre, como manter seus dados de contato atuais, hardware e software necessários para ler e reter os registros. Esta redacção é traduzida em vinte e duas línguas e será revisto, por isso um certificado produzido após uma revisão seria De outra forma, descrever a divulgação corrente, enquanto o assinante tinha aceite uma anterior, em um idioma o registro não nome. «consent disclosure version» e «consent locale» são escritos pelo ESigService no momento do primeira aceitação e nunca sobrescrita — reabrir um link de assinatura re-posts consent, e re-dating uma antiga aceitação a qualquer texto atual é a única coisa que essas colunas existem para prevenir. DDL aplicado à mão no cluster ao vivo (ddl-auto é `nenhum` em toda parte): TABELA ALTER esign envelope recipients ADD COLUNN SE NÃO EXISTE consentimento divulgação versão varchar(32); TABELA ALTER esign envelope recipients ADD COLUNN SE NÃO EXISTE consentimento locale varchar(16); Ambos são nulos, e linhas que consentiram antes de existir ler como "não gravado" no certificado em vez de receber uma versão que eles nunca viram.

  28. · kamo-signer-monorepo

    Uma superfície de assinatura para ambos os aplicativos, e o rótulo branco finalmente pinta

    A UI assinante existiu duas vezes — aqui, e copiado à mão no assistente de execução legal de kamo-internal — e os dois tinham se desviado em ambas as direções. «@kamo/esign-core», «@kamo/esign-ui» e `@kamo/doc-render` são pacotes publicados agora, construídos e empurrados para o registro Forgejo por este O IP do Repo, e o kamo-internal consome-os em vez do garfo. A fusão levou a melhor metade de cada: loja do kamo-internal (validação de formato, armazenamento guardado em `localStorage` em vez de em as razões DELEGADAS e NOT YET). Componentes tomam suas strings como PROPS — os dois aplicativos traduzem de dois dicionários diferentes, e um componente que escolhe suas próprias chaves só pode viver em um. Quatro defeitos, e um deles causou dois dos outros: - ** Todo botão MUI contido neste aplicativo era transparente.** «AppProviders» passou `enableCssLayer: true`, então todos os MUI CSS desembarcaram em `@layer mui` — e Tailwind's preflight, carregado unlayered by `@tailwind base`, bate camadas CSS outright qualquer que seja a especificidade. Medida: `.MuiButton-contidoPrimário` computado `background-color: rgba(0,0,0,0)` com «color: rgba(0,0,0.87).». Então "Acordar e continuar" renderizado como texto simples, e "Cancelar" e "Adotar & assinar" sentou-se ao lado um do outro como duas sequências de leitura de texto cinza como uma frase — que é exactamente como foi relatado. Preflight's `p { margem: 0 }` estava batendo o cartão de consentimento `mb` pela mesma razão, que é por isso que tudo naquela página correu junto. kamo-internal tem sempre montou sua cache Emotion sem camadas; combinando com ele corrige tudo de uma vez. - ** O logotipo foi uma imagem quebrada.** `ThemeLogo` caiu para `/img/logo-full.svg`, que este aplicativo faz Não serve, e pintou o glifo da página rasgada do navegador no lugar do remetente. Agora anda o lista de extensão para ambas as variantes (uma org cuja marca é .png tinha `.svg` solicitado, 404ed, e parado lá — `sign-pink' é exatamente essa org), e quando nada resolve, ele desenha o org's nome curto como um wordmark, ou nada antes de um token ter nomeado uma organização. - **O favicon e o título da tabulação nunca foram definidos – nem a marca CSS da org.** «DynamicMetaLoader» computado `const slug = orgSlug () ONCE, no corpo de efeito, antes de qualquer token ter foi validado: «'». O ouvinte `KAMO THEME REAPLIY`, levantou o momento em que a org convidativa foi conhecido, re-arranjou um encerramento sobre esse mesmo `' ''' e voltou no guarda. config.json foi, portanto, Nunca fui buscar na rota de assinatura. Resolvido por aplicar agora, Favicons REPLACE em vez de Anexar, e o título é "Assinar - {Org Short Name}", como solicitado. Verificado contra um inquilino de verdade: `Sign - Sign Pink`, quatro favicons de org, a marca png, e `--color-primário: #452d4e' chegando ao tabulações, caixas de seleção e botões — a paleta MUI não pode segurar um `var()`, então cada marca possui componente é apontado para ele explicitamente. - **O catador de línguas era um globo sobre uma lista de endonímos**, então um assinante que não lê nenhum dos Os guiões latinos não tinham nada para apontar. Bandeiras e nomes nativos agora, a mesma mesa e o mesmo emoji pilha de fontes como NavTop do kamo-internal. Também aparece nas telas de boas-vindas e consentimento: usou chegar apenas com a TopBar, depois que o assinante já tinha lido uma divulgação em inglês. As transferências oferecem todas as três cópias onde quer que uma tenha sido oferecida: o documento executado, o certificado de conclusão, ou ambos zipped (`/api/sign/download?what=`). O certificado é a metade do gravar que atribui uma assinatura a uma pessoa; entregando apenas as mãos PDF ao longo da metade que Não prova nada. A porta de consentimento agora carrega as seis cláusulas 15 U.S.C. § 7001(c) exige que um consumidor seja mostrado Antes de consentir, eo locale foi entregue em passeios para fora com o consentimento assim que o certificado pode afirmar qual das vinte e duas traduções foi realmente lido.

  29. · kamo-signer-monorepo

    Renderize o campo Data de Assinatura e faça a leituraSomente significa algo

    Três mudanças, das quais apenas a primeira é trabalho novo. **`assinature date`** é um campo ESigService preenche no instante em que os sinais do assinante - nunca o navegador, cujo relógio é settable e que é o único valor que uma parte tem Incentivo à anulação de um instrumento jurídico. Assim, não há controle para ele: assinante vê a data que irá transportar, bloqueado, formatado a partir do local da sessão e fuso horário, que são os mesmos dois valores que o servidor forma a data carimbada com. A antevisão e o documento executado não podem discordar. ** "LerApenas" foi decorativo aqui.** Está na forma de design, é um interruptor O painel de propriedades do kamo-internal e o FieldCompletion do ESigService honram-no — e O InteractiveField nunca olhou para ele. Um campo marcado somente para leitura renderizado como um comum input o singer poderia digitar livremente, e uma vez que o campo somente leitura, que o valor livre-tipo foi o único valor na página nada verificado antes de ser carimbado no documento. **signStore contou campos somente leitura como necessário**, então um envelope carregando um poderia em uma caixa sem controle nela, enquanto o SERVER considerou a mesma submissão completo e teria aceitado. O porto do kamo- interno deste arquivo já tinha diferente para corrigir exatamente isso; os dois concordam novamente, e ambos agora combinam FieldCompletion.

  30. · kamo-internal

    Um campo de Data de Assinatura e um envio que admite quando nada foi enviado por e- mail

    ** "Enviado" não foi a mesma coisa que "entregou", e o diálogo nunca disse isso.** EsigService descartou o resultado de cada e-mail de convite, então um envio cujo e-mail foi recusada ainda mostrou "Documento enviado para assinatura" — a falha exata relatada hoje, onde um destinatário nunca foi informado de que um documento estava à espera. O diálogo agora lê o que o enviar realmente relatado e, quando um convite não saiu, coloca um aviso de que STAYS up, nomeia o endereço e carrega o botão de reenviar em vez de enviar o remetente está fora para encontrar a linha em outra aba. ** Data de assinatura. ** Uma nova ferramenta em Ferramentas de Assinatura. O sinalizador não é mostrado nenhum controle para ele: o servidor escreve a data no instante em que eles assinam, em seu próprio fuso horário e local da organização, então o que o PDF executado diz não pode ser a assinatura Relógio do navegador. O designer mostra-o bloqueado, não oferece Needed/Read-only/validation configurações para ele (eles são perguntas sobre uma entrada que não existe), e o assinante vê a data que irá transportar — formatado a partir do local e zona da sessão assim, a pré-visualização e o documento concordam. Três coisas que já estavam quebradas: - **`readOnly` foi decorativo em ambas as UI assinantes.** A bandeira está na forma de design, ela é um interruptor no painel de propriedades e o ESigService honra-o — e nenhum InteractiveField já olhou para ele, então um campo "somente leitura" renderizado como um comum o sinal pode digitar livremente. Porque nada obriga a um campo somente leitura, que o valor livre-tipo foi o único valor na página nada verificado antes de ser carimbado no documento. - **sinal do kamo-signerStore contou campos somente leitura como necessário**, então um pacote carregar um nunca poderia ser terminado — Terminar ficou desativado e o "próximo campo" Submissão completa. O porto de kamo-internal já tinha consertado isto; os dois agora concordam um com o outro e com FieldCompletion. - ** Nada mantinha as três cópias do vocabulário de campo juntas.** Dois deles dizem "VERBATIM PORTO, não divergir" em seus próprios cabeçalhos e nada o forçou; a tipo adicionado a um sozinho renderiza como uma entrada de texto nu em qualquer outro lugar, silenciosamente, porque cada renderizador tem um branch padrão. Há uma catraca agora. A janela de envio também etiqueta cada linha do destinatário com o espaço de assinante ao qual se liga, e Preenche um slot que o modelo já fixa para alguém. A ligação é por POSIÇÃO, e staff nunca viu os slots em tudo — assim em um modelo de duas partes a única coisa que decide que tem os blocos do empregador e que tem o do empregado era que nome aconteceu de ser datilografado primeiro, sem nada na tela dizendo assim.

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