Changelog
O que há de novo.
Cada melhoria para a plataforma, como ele envia.
· kamo-internal
O cartão em citações de resposta, histórico de mãos, eventos de tickets e autores de thread de bugs
As últimas quatro superfícies que nomearam um membro sem nada para abrir, agora que o MediaService envia os IDs (fa25989): - Aspas de resposta: o nome do autor citado abre sua carta, no hover only (a citação é o salto). Tirado do ID do próprio membro pai carregado — @kamo/chat-core's quote não carrega nenhum ID — em colega bate- papos; num ticket na regra segue- se o rosto de uma bolha (do próprio lado do visualizador, uma vez que os lados são conhecido, nunca as palavras de um visitante); em uma caixa de entrada social apenas para os representantes da organização. Exec2Exec permanece simples: cross-org. - Hold'em história da mão: o jogador que atuou (memberId). - Eventos de ticket: o nome do ator é cortado da frase do evento (em torno do nome do membro) e abre seu cartão quando o ticket diz que eles estão do lado do espectador (actorCard, isOwnSide). O mundo a placa de bugs não passa nenhuma regra, então seus eventos permanecem simples. - Autores de fio de bug: apenas o nome de um colega abre seu cartão (memberOrgId); o membro de outra organização, ou um retido, permanece um nome.
· kamo-internal
Mostrar o URL de chamada JustCall antes de existirem credenciais
Gera um UUID telefone- servidor quando JustCall é selecionado e mostra o URL do webhook imediatamente. Esse mesmo ID é enviado ao criar para que o URL O membro colado no JustCall corresponde aos registos do servidor Kamo.
· VOIPService
Pré-atribuir o ID do servidor do JustCall para URL de retorno de chamadas
O formulário de novo telefone gera um UUID antes de criar para que o membro possa colar o URL de retorno de chamada do webhook em JustCall enquanto solicita credenciais API. Criar aceita esse id para JUST CALL; a configuração retorna o URL mesmo quando o a linha ainda não existe.
· VOIPService
Serve JustCall callback URL para configuração do servidor de telefone
Adiciona GET /api/voip/setup para que as configurações UI possam mostrar o exato URL do webhook por instance sem codificação do servidor de implantação.
· kamo-internal
Mostrar o URL de retorno de chamadas do JustCall na configuração do novo telefone
Surge o URL de retorno de chamada por instance no novo telefone JustCall e abas de visão geral para que os membros saibam o que dar JustCall ao configurar APIs e webhooks. O URL é obtido do servidor, mostrado com um botão de cópia após criar, e explicado no formulário antes do telefone O ID do servidor existe.
· kamo-marketing
Use o logotipo PNG completo que flutua sobre o banner de visualização.
Substitua o wordmark SVG por kamocrm-logo-full-v4 para que a marca se estenda acima da faixa vermelha e abaixo da barra de navegação.
· kamo-internal
O cartão no histórico de entregabilidade é "quem"
EmailService agora envia o membro por trás de cada mudança no histórico de opt-out de um endereço (membro do ator, texto). Em Configurações → Email → Entregabilidade o nome de um colega abre cartão de membro, como já faz no histórico da aba Opt Out. O destinatário, o sistema e colega o livro de registros não poderia nomear palavras stay, e uma entrada sem um id lê exatamente como antes.
· kamo-internal
O cartão em aliases de e-mail e acesso à caixa de correio compartilhado
EmailService agora envia os IDs dos membros em aliases e acesso à caixa de correio compartilhado como texto. Como números JSON eles foram arredondados passado 2^53, então estes tabs não correspondeu a ninguém na lista e imprimiu o número, e A revogação do acesso de alguém enviou o id arredondado, que não removeu nada. Apelidos "Atribuídos" agora é o nome do membro com seu cartão. Os chips de acesso de uma caixa de correio partilhada carregam ele sobre pairar apenas, uma vez que cada chip é um botão (sua exclusão). Chips de membros da aba Caixas de Correio e um O atribuatário da caixa postal já leu os IDs que o EmailService envia como texto (memberId, atributedMember Id), Então as cartas já eram exatas.
· MediaService
Citações, histórico de mãos, eventos de tickets e tópicos de bugs enviam o ID que um cartão membro precisa
Quatro superfícies mostraram um membro pelo nome sem identificação ao lado dele, então o cartão de membro do console não tinha nada para Abra. Cada um agora envia o id como TEXT ao lado do nome que já envia (um id de 19 dígitos lido como um número JSON é arredondado para outra pessoa), e só onde esse nome já atinge o chamador. - Aspas de resposta: wireFields adiciona paiSenderMemberId ao lado do paiSenderName. Palavras de um visitante do web-chat são armazenados sob o membro do sistema da org, de modo que o pai do visitante não carrega nenhum — no envio ao vivo e em a história lia da mesma forma, quer o visitante desse ou não nome. Um thread de bug do sistema o detém com O nome, contra a organização dos pais. As linhas Exec2Exec também o carregam; o console as mantém simples. - Hold'em: cada linha mão-história (ActionView) carrega membroId, leia fora da mesma linha mão-lugar que o Então os dois não podem nomear pessoas diferentes. - Bilhetes de suporte: todos os eventos de sistema armazenam o atorMembro ao lado do atorName. Um evento que nomeia o seu próprio actor (a transferência de IA lê "AI Assistant", armazenada sob o membro do sistema) deixa cair o ID armazenado. - Bugs de sistema: cada linha de thread carrega o membroOrgId ao lado do membroId, retido com ele. O conselho é global, e a org é como o console diz a um colega de membro de outra organização. Testes: ChatReplyPreviewWireFieldsTest, SupportSystemEventActorTest (new); SystemBugThreadRedactionTest (+4), HoldemTableViewTest (+1). Cada um falha com sua mudança revertida. Suíte completa 1005/1005 verde; limpo origem/main foi 994/994.
· EmailService
O histórico de entregabilidade nomeia o membro por trás de cada mudança
Configurações → Email → Entregabilidade mostra o histórico de opt-out de um endereço com quem fez cada mudança, mas O HistoryView enviou apenas o nome do ator, de modo que a página não pôde abrir seu cartão de membro. Cada entrada agora carrega o atorMembro ao lado do atorNome: o livro de registros actor member id como texto, exato (uma rodada INT8 como um número JSON). Visibilidade é inalterada: as mesmas chamadas MANAGEM EMAIL OPT OUTS já vêem que O nome do membro aqui, e a sua identificação no histórico da página Opt Out. EntregabilidadeHistóriaActorTest drives GET /address e escreve a resposta com ObjectMapper do aplicativo: A mudança de um membro carrega o ID como uma string JSON, o destinatário não carrega nenhum. Falha sem a Mudança.
· kamo-internal
A carta na lista de exclusão "última alteração"
O EmailService agora envia o membro por trás da última alteração de cada endereço (último MembroActor, texto). A lista retira o seu nome da frase "última alteração" (em torno do Nome do Membro) para que abra a sua cartão de membro — apenas no hover, como a linha inteira é o botão que seleciona o endereço. Sem id a linha lê exatamente como antes.
· EmailService
Uma linha opt-out carrega o membro por trás de sua última mudança
A lista de opt-out com o nome de quem fez a última alteração de cada endereço (últimoActorName) mas não quem são, por isso a página de configurações não pôde abrir seu cartão de membro. Cada linha agora carrega o últimoActorMembroId ao lado o nome — ler de ************* como texto, exato (um INT8 rodadas como um JSON número). As entradas de história já levavam o atorMembro.
· kamo-internal
O cartão nas pessoas que os servidores agora nomeiam — histórico de documentos e compartilhamentos, carreiras, membro primário da conta, gerente de um assento do grupo
Transmite os IDs que os serviços agora enviam: - Histórico do documento (alterações e downloads do DocManager, histórico do material de marketing): o membro pelo nome (nome do membro) e ID exato, onde as linhas impressas um número arredondado como "Membro: 1170943544097472500". - Acções (PartilhaDocumentDialog's existing shares, the material gavera): face de um membro e nome abrir o seu cartão (membro destinatárioId). Os campos lidos da gaveta que o servidor nunca enviou (memberName, isAllowEdit, expiresOn) — suas linhas estavam em branco, cada compartilhamento lido "pode ver" e não A validade mostrada; ImgShareRecord agora descreve o que shareToMap realmente escreve. - Carreiras: "Última mudança" na gaveta do aplicativo (statusChangedById), o gerente de contratação em o conselho de administração (contratadoManagerId). - A linha de membros primários da visão geral da conta (membro primário, que o servidor agora envia). - A linha de cobertura de um assento de grupo nomeia o seu gerente (membro gerente). Cada campo é opcional: ausente, o nome permanece claro exatamente como antes.
· BillingService
A cobertura de um assento de grupo carrega o ID do membro do seu gerente
GET /api/billing/self/coverage nomeado gerente do grupo de faturamento (managerName) mas não quem eles são, para que a página do plano do membro não poderia abrir o cartão de membro do gerente. Agora carrega managerMemberId ao lado do nome, como texto — um ID INT8 chega arredondado como número JSON.
· kamo-internal
O cartão de administrador, leads e configurações — valores de histórico, reservas, caixas de correio, registros de auditoria, o herói do perfil
Cada membro restante destas telas mostra abre o cartão de membro. IDs são as strings dos dados carrega, cada um verificado na origem/main do servidor. - Histórico (EntityHistoryPanel; lead and account history): um cessionário alterado, membro primário ou membro adicionado / removido é o seu nome com o cartão, no valor armazenado, quando o registro ou o seu lista de atores pode nomeá-los; o título nativo do id cru é deixado sobre ele. Os nomes só de notas ficam de texto. - Faces ao lado de nomes com cartões, pairar apenas: membros da conta, administradores de plataforma, o lead-lock Cartão de contacto. Gerenciar cabeçalho de direitos: MemberAvatar (46px, anel mantido) e nome. Dev Machine título. - Reservas: "Reatribuído de" / "Arquivado por" dica mantida sobre as palavras; "Pedido por" no aprovar, extensão e negar diálogos e Legenda reatribuída (o subtítulo da janela é agora um nó); actor de histórico (actor MemberId). - Coluna do agente da grelha de leads: a lista envia o ID atribuído apenas como agente designado (LeadListDTO), assim o cartão nunca abriu lá; agora usa-o. - Vista principal: o chip pane-lock (membro do titularId); agente de aceitação de reatribuição quente (membro do eventoId). - Opt-outs: configura o ator histórico e as linhas "Por" do painel principal (membrorId). - Caixas de correio: chips de membro da empresa (memberId), atribuído por correio pessoal (membro designado). - Perfil: Gerente do Trabalho (manager ID, pairar apenas: um clique ainda abre o selecionador); o nome do herói e foto no registro de outra pessoa (o membro da rota ID). - Planos e faturamento: licenças, membros da assinatura, administradores de conta (memberId); assentos comprados para outra organização ficar texto. - Auditoria: org access log member (somente de viagem; a linha abre a entrada), PHI actor de auditoria (linhas de pessoal) ficar ids). Console de hipoteca: administrador de tarefas atribuído, preço de assinatura, administrador de governança. Planície esquerda: ecos de escolha e seleção (reatribuir volume, atribuir novo líder, dividir comissão, primário agente, personificar, assistente de ordem, atribuir-a-licenciar, simulador de política); nomes dentro de botões que carregar dicas (botão de reserva); não membros (seletor de contas, divulgação e destinatários de partilha, contatos, contas de usuário da plataforma, agentes de IA, nomes de agentes digitados, organizações); registro (herói, chip de papel de parede, galeria avatar); confirmações e brindes. Falhas de dados: gerente de cobertura de assentos ********** não envia identificação); conta resumo membro primário (getCustomerDetail envia membros primários e membros[], a página lê primárioMembro e mostra ---); histórico de entregabilidade (HistoryView, no actor id); lista de opt-out (OptOutRow, nome somente); aliases de e-mail e acesso à caixa de correio compartilhado (entidades, Membro LongoId como JSON Números); proprietário do voipMemberId (OrgPhoneNumberController, um Long cru; já ligado em Números). Testes: memberSentence, withRequester, history values, lead opt-out panel, opt-out history actor, Actor da rede PHI.
· kamo-internal
Cartão em home boards, HR, KB, documentos e e-sign — rosto e nome como uma porta
Os dois do proprietário: o Leaderboard Achievement e widgets de painel de avaliação de afiliados tinha o cartão no Apenas 20 px face. Cara de Membro (BoardChrome) agora leva o nome da linha como seu filho, então rosto e nome são um gatilho em cada linha, a própria linha do espectador incluído (memberId, uma string Java em ambas as placas). O gatilho abraça os dois, então a lacuna antes da pontuação não abre nada. O nome do conselho de obtenção dica (nível rank, número de realizações) agora anda nos pontos; o conselho de Afiliados "nome · trabalho title" tooltip se foi, porque o cartão se dirige com ambos (o mesmo oficial-else-catálogo título). Um ex-membro fica sem cartão. - Arcade ALTO SCORES (ConseguimentoBoardPanel): a dica de linha-larga cobriu o cartão; ele monta em A pontuação agora. A etiqueta de três letras e o nome são um gatilho, "You" incluído. Isto também cai. o pontilhado preto sublinha a sombra de texto do gabinete pintada sob cada nome em repouso. - PersonCell: a dica membro-id sentou-se dentro do gatilho e cobriu o cartão sempre que o cartão aberto acima da linha. Removido; o ID ainda é o que cada chamada envia e o que as pesquisas correspondem. - Visão geral do HR: as filas de atenção (somente de hora, as linhas são links) e a matriz de conformidade. Insights de formação: atenção (somente em horas), posições, e a alimentação da atividade, cortar em torno {nome} em a frase traduzida. HrResumoDto e HrAttendanceSummaryDpara enviar membroId como uma String. - Treinamento e visualização do público legal **************************** String) e a folha de pagamento auto-match review rows (um timecard-service Long, serializado como texto, retransmitido verbatim). - Consola de revisão KB: "Enviado por {name} em {date}" recortar em torno do nome (submissorMembro Id, String.valueOf in kbservice). - Pedidos de assinatura: o remetente na linha "Enviado por" da grade (somente para a hora: a linha abre a gaveta) e na linha do tempo da gaveta (sentByMemberId, String.valueOf in esigservice). - Partilhar as pessoas com acesso às filas. ToStringSerializer). Esquerda simples: os catadores e suas seleções (MemberSearchDialog, AccountSearchDialog, SignerCard's membro escolhido, os chips de inscrição e treinamento das pessoas, o membro de código de rastreamento, o gatilho de gotejamento resumo, a disponibilidade da legenda "edição"; candidatos (não membros, segundo o resumo); signatários, gotejamento de inscrições, autores sociais e organizadores de .ics e participantes (sem id de membro); brindes e diálogo Linhas de assunto. Gaps de dados: as listas de partilha de documentos (recipiente) Apenas nome), histórico do documento (memberId um número JSON, sem nome), o histórico de versões do KB (Longo editorMemberId, sem editorName), as carreiras "últimas" (statusChangedByName only) e gerente de contratação do conselho de carreira (contratadoManager Apenas nome). Testes: ambas as placas, o arcade, PersonCell, o HR Visão geral, Treino Insights, a assinatura gaveta e a sentença de revisão KB. Cada um falha contra o componente de origem/principal.
· kamo-internal
A carta no chat, suporte e janelas da doca — nomes ao lado das faces, e as linhas que nomeiam as pessoas
Onde um rosto já abriu o cartão de membro e o nome ao lado dele não, e nas linhas que Nomeia as pessoas. Cada ID é a string que os dados já carregam, verificada no servidor: MediaService's linhas de histórico e quadros ao vivo, ChatListRowDto, ReceiptDto, SupportAgentMetricsDTO, SystemBugDTO, HoldemTableView. SeatView, ChessGameView e o autor de feed do SecurityService enviam IDs como texto. - Transcrição do chat: o nome do autor acima de cada execução de mensagens (msg.memberId), em chats de duas pessoas também, que não usam rosto. As linhas do sistema "X adicionado / removido Y", "X à esquerda" (member Id, transitMemberId) e a linha de abertura "criada com" (memberId roster) são cortadas em torno de seus slots (novo app/lib/sentenceSlots.ts, o LeadsHistórico dividido, testado) para que cada nome abra seu próprio cartão; as faces da linha de abertura são o MemberAvatar nas slots MUI do grupo, pairando apenas. - Indicador visto: em uma conversa de três ou mais, as pessoas que viram a última mensagem são faces ao lado do rótulo (cinco, depois +N), cada abrindo o seu cartão. Existiam apenas dentro do dica do rótulo, que é desenhada sobre o cartão; a dica mantém nomes e horários. Sem rostos entre Duas pessoas, a regra das bolhas. - Linha da lista de bate-papo: o título de um bate-papo sem nome é o nome de cada membro (um grupo também, não apenas um one-to-one), hover only; o autor da antevisão (lastMessage.memberId) nas linhas CHAT quando estão Um dos membros da fila. As palavras de um contato social são guardadas sob o proprietário, então nenhum outro tipo. - Bilhete e janelas sociais: o nome do remetente acima de uma bolha, nos termos que o rosto já usa (Só o próprio lado do TicketChat; SocialChat nunca o contato). - Interaction Center linha: a dica Mais sentou no próprio gatilho do cartão, sobre o cartão. Removido; "Mais" permanece como o nome do leitor de tela do botão. O avatar desenhado à mão é o MemberAvatar (38px, anel e cinzento inactivo mantido). - Softphone CRM autor de atividade recente (post.autor.id); agente de análise de suporte (agentId). - Hold'em compact rail: o nome do jogador (set.memberId), pairar apenas dentro do botão do disco; seu Apenas a dica de nome removida, o cartão dá o nome completo. - Xadrez: o disco e o nome do oponente (oponenteMembro) em todos os três tamanhos de assentos, nunca do leitor assento ou do computador. O disco mantém a sua cor lateral, de modo que permanece o próprio desenho do banco. - Sistema Bugs cartão e gaveta: o nome do repórter (relatorId), apenas quando repórterOrgId é o organização própria do leitor (reporterCardId, testado): o conselho é de cada organização. Esquerda plana: os catadores (diálogo de membros adicionais, trocador de caixa de correio, move- para- pasta, a lista do compositor, o painel de convites Hold'em, as confirmações do menu de jogos; pessoas que não são membros (livro de endereços) contactos, números SMS, partes da história da chamada; correspondentes de correio mantêm o seu próprio cartão); outros organizações (Exec2Exec, um ticket do lado distante e solicitante, o aviso de disponibilidade do agente); o o próprio rosto do espectador (o link de perfil do NavTop, o compositor do post); código morto (clubhouse ChatArea e OpenChatTabs não tem importadores); coloca um cartão não pode viver: HexHeadPopover (ele próprio do membro ações, desenhadas sobre a carta), chips de reação (nomes dentro da dica de ferramenta de uma opção), a janela da ferramenta barra de título (a pega de arrastar), a linha de digitação e o banner de resultados Hold'em (ambos desmontados sob o carta em segundos); as frases de status de xadrez (o assento ao lado deles tem o cartão). Nenhum ID nos dados: respostas aspas (parentSender Apenas o nome), eventos do sistema de suporte (apenas o nome do ator), notificações (O MemberNotification não tem ator), Hold'em hand history (ActionView não tem membro) Id), Sistema Bugs linhas de thread (um membroId, mas nenhuma organização, em uma placa global), menciona post.
· kamo-internal
O cabeçalho do cartão usa o papel de parede que seu desktop mostra
A banda de cabeçalhos agora mostra o papel de parede de desktop do membro — sua primeira fotografia no ar, ou organização é quando isso é o que seu desktop joga — sob seu próprio tom de lavagem, desbotado sobre o banda de cores, uma vez descodificada. Uma área de trabalho simples mantém a banda; assim como uma fotografia que não irá Carregar. SecurityService resolve qual (o novo campo "papel de parede" do cartão); o conjunto da organização vem do usoOrgThemeImages, que o cenário do console já preencheu. Pintado a partir da origem do tema (o img-src da página CSP permite), nunca através da próxima/imagem ou do proxy de imagem, que não pode alcançar um host de tema in-cluster — a lição ProfileHero aprendeu.
· SecurityService
O cartão de membro carrega o papel de parede seu desktop mostra
GET /members/{id}/card ganha "papel de parede" para o cabeçalho do cartão, resolveu a forma como o console pano de fundo e o herói do perfil resolve a área de trabalho de um membro: nenhum quando o seu console está definido para a planície gradiente; {url, tom} para o seu primeiro papel de parede no ar, na sua ordem; {org: true, tone} quando eles tocam da organização (o cliente já tem esses — o tema que pinta). O tom é deles. Fundo próprioTone, então a fotografia é lavada como em seu desktop. Member WallpaperResolver lê fundoMode/fundoTone da loja ui-preferences e da no ar TemaLinhas de fundo, e aborda a imagem exatamente como o TemaBackgroundController faz (generateFileHash agora é compartilhado em vez de copiado). Uma leitura mal- sucedida ou uma máquina que o domínio do tema não possa ser derivado de, custa o papel de parede e nunca o cartão.
· kamo-internal
O cartão na cauda longa — HR, KB, placas, webinars, crescimento, rastreamento, Hold'em
Cada membro deste nome de tela agora abre o cartão de membro. IDs são as cadeias de texto já os dados transportado, excepto quando indicado. - PersonCell / PersonStack (consola de presença do HR, 7 importadores): rosto e nome são um gatilho sobre memberId; o avatar MUI privado é o MemberAvatar (mesma tonalidade, mesmo tamanho). Um novo 'clickToggles' o prop é desligado onde a célula se senta em algo clicável (Compliance findings rows, the roster's cartas e linhas de mesa). A dica do ID- membro permanece; a dica do nome da pilha dá lugar ao cartão. - Atribuições de formação e grelhas legais de pacotes atribuídos: teamMemberId; as iniciais com o estado Os discos são o MemberAvatar (28/30px) — o caminho-de-ferro do Estado ainda tem o estatuto. - Problemas de execução da folha de pagamentos e o trilho de atividades do RH: Nome de membro no memberId. - KbPerson (4 importadores): MemberAvatar dentro do cartão em sua dica de "nome — título" é o que o cartão agora diz, e teria se sentado em cima dele. Apenas para perus dentro do pino clicável, atenção, review-queue e cartões fixos. - BB artigo byline: autorMembro, que é um JSON NÚMERO, então um ID de 19 dígitos chega arredondado e o cartão não pode encontrar o autor até que o kbservice o envie como texto. A tradução "Por {nome}" é cortado onde a localidade coloca o nome, então apenas o nome é o gatilho. - Conselhos: O MembroFace é o MembroAvatar (20px, anel de pódio guardado) dentro do cartão ("semente" torna-se `memberId`); a célula de nome arcade High Scores é um MembroName. Um membro que o conselho não pode nomear ("um antigo membro") não recebe nenhum cartão; as dicas de nomes dos widgets não são tocadas. - Webinars: o apresentador (atribuídoPresenterId) em Meus Webinars e o assistente de programação, apenas paira em suas linhas clicáveis; participantes membros em Meus Webinars (visitantes não têm id e permanecer simples); O apresentador da página principal, através de... o cartão com e sem identificação. - Submissões de crescimento (memberId; reviewedByMemberId em toda a frase "Reviewed by") e coluna de membros dos códigos de rastreamento (memberId, hover-only: a linha abre a gaveta). - Hold'em: nomes de outros jogadores na placa do assento e nas fileiras do lobby (memberId, hover-only dentro do botão da mesa). Esquerda simples: os compartilhamentos existentes e os compartilhamentos do MaterialDetailDrawer (docsservice's lista de imagens envia o destinatário Nome e nenhum ID de membro), os relatórios ScheduleDialog (um proprietário Apenas nome, que nenhum chamador passa), Hold'em HandHistórico (as ações carregam um número de assento, não um ID de membro). Catadores deixados em paz: o e-sign MemberSearchDialog, as fichas de pesquisa e destinatário da janela de partilha, o selector do oponente do NewGamePanel, o trilho de filtro do roster legal. Medida no Chrome em relação à origem/componentes principais: PersonCell, PersonStack, KbPerson e o Caras de tabuleiro manter seus tamanhos de caixa, centrifugando e a posição do ponto no relógio.
· kamo-internal
O cartão no bate-papo e no clube — linhas, lista, rostos de mensagem, autores de posts
Superfícies (cada ID é a string que os dados já carregam): - ConversaRow: cada face em uma linha de bate-papo avatar stack (members[].memberId), e o nome chat sem nome é intitulado com, abra o cartão no hover somente; um clique ainda abre o Conversa. As faces são MemberAvatar dentro da slot MUI Avatar do grupo, cuja classe anel, sobreposição e "+N" pendurar. Pressionar dentro do cartão portalizado não mais bolhas no ButtonBase da linha e ondula a linha. O rosto do solicitante de suporte é o MemberAvatar sem cartão: na mesa de plataforma eles são membros de outra organização. - ChatMembersPopover: o rosto e o nome de cada membro são um MemberHoverCard (memberId); MembroAvatar. Os controles de remoção ficam fora dele. - MensagemAvatar leva um membro opcionalId: dado um, o rosto abre o cartão no hover (sem aba parar, sem título nativo sob o cartão). Passado por MessageBubble e MessageList (msg.memberId, somente bate-papos de membros), SocialChat (senderId, nunca o contato) e TicketChat (senderId, apenas em o próprio lado do espectador uma vez que os lados são conhecidos, nunca um visitante de web-chat: um ticket de dois lados são geralmente duas organizações). - PostCard e ComentárioThread: o nome do autor é MemberName e o rosto do autor é MemberAvatar com o cartão no hover (autor.id). O nome e o rosto do PostCard mantêm o seu clique na página do membro. Planície esquerda: - Indicador visto: as faces vistas só existem dentro de uma dica MUI (z 1500, acima do 1305), então uma carta aberta de um seria desenhada sob a dica. Precisa das caras fora da dica. - Exec2ExecChat: organização cruzada, e o cartão recusa membros de outras organizações. - Título de um chat de grupo (os nomes associados são uma string) e prefixo de remetente da pré-visualização. Nota: um cartão aberto dentro de uma janela de ferramentas (chat, ticket e janelas sociais, o interruptor de chats coluna) lê presença fora PresenceProvider, qual ToolDock é um irmão de, por isso diz Offline. Testes: ConversaRow (o cartão do rosto e do título, o clique ainda abre o conversação, um pressione no cartão não ondula a linha), MessageAvatar (o cartão só com ID de membro), TicketChat (somente do próprio lado, nunca um visitante).
· kamo-internal
O cartão em leads — atribuidos, autores da linha do tempo, histórico e agentes de tickets
Todos os lugares onde as telas de chumbo nomeiam um membro (pessoal) agora abre o cartão desse membro. Os IDs são os IDs do membro de string que os dados já carregam. - Vista principal: o agente do cartão de atribuição (a página é atribuída aoLeadMemberId). AgentSelector e o A interface de bloqueio de chumbo está intacta. - Grade de leads: a coluna Agent (atribuídaTeamMember.id), paira apenas: é uma célula de grade. - Softphone CRM: o azulejo "Atribuído a" (atribuídoTeamMember.id). - Linha do tempo das comunicações, o membro do nosso lado de cada entrada (entry.memberId): avatar (MembroChip substitui o MUI Avatar desenhado à mão, o mesmo 20px), um chat de saída do título, o membro de uma chamada e um subtítulo de texto de saída, um remetente de email de saída. Títulos são frases traduzidas, então todo o título é o gatilho. O chumbo do outro lado permanece claro: filas de bate-papo inbound não carregam ID de membro, e em um membro de email inbound é quem o recebeu, não o O remetente foi mostrado. A shell desliga os eventos do ponteiro na coluna de título, então a linha é uma clique no alvo; os nomes opt-in de volta, como LeadRefChip faz. Uma chamada ou email que se expande mantém a sua nome hover-only ea shell passa o clique do nome, então a linha ainda se expande. - Lista de tickets de suporte: o agente atribuído (atribuídoAgentId), passe apenas: a célula atribui ou abre O bilhete. Sua dica Atribuir/Reatribuir se move ao lado do nome para que ele não mais cobre o cartão. - História da liderança: cada membro de uma linha (membro, membro, membro, membro). Uma linha pode nomear dois membros dentro de uma frase traduzida, por isso é formatado com um marcador no lugar de cada membro e dividido nos marcadores: as palavras permanecem próprias do local, em sua ordem, e nenhuma mensagem mudou. - Gerenciar créditos: o link de perfil da coluna membro (memberId), paira apenas para que o link mantenha Clique. - Oportunidades reservadas: o agente principal (membro principal). Um membro removido (sem nome) permanece "Agente desconhecido". - Guia do histórico principal: a coluna "Changed by" (actor.memberId). É desenhada pelo EntityHistoryPanel, então o histórico da conta recebe o cartão também. Planície esquerda: - Solicitante de ticket: o formulário de contato público arquiva seus tickets sob o membro do SYSTEM do org sem isPublicChat, então requestorId não é confiável a pessoa que pede. TicketHeader nomeia apenas o agente no MemberPickerDialog. - Oportunidades reservadas' "Reatribuído de" / "Arquivado por" legendas e GerenciarReservaçãoDialog's legenda: nomes dentro de frases que carregam sua própria dica ou cabeça de uma janela. O agente primário e commission-split linhas (ManageReservationDialog, CommissionSplitEditor) são catadores. - Lead history's old/new values for the assignee field: renderValue retorna texto. - A tarefa atribuída à vista principal: uma string livre sem ID.
· kamo-internal
O cartão em configurações e listas de administradores — membros, faturamento, administradores de plataforma, telefone, comissões
O cartão de membro nas configurações e listas de administrador que mostram as pessoas. Cada nome abre a carta em hover, focus ou toque em; um nome que já faz algo no clique mantém esse clique. - Membros da equipe (Manager do membro da equipe): o nome nas abas dos membros e membros da equipe (membro da linha) Id, seu avatarUrl pintado no cartão). A aba clientes são dados simulados, não membros: deixados em branco. - Membros de uma conta (conta/visão/[id]/membros): cada nome (membro), membros do cliente incluído. O avatar desenhado à mão é agora o membro Avatar a 32px. - Donos de faturamento: o nome de cada candidato (id, que é o ID membro em ambas as listas que ele lê). - Grupos de faturamento: o gerente em "Paid by" (managerMemberId) e cada nome de lista (memberId). A lista de grupos da linha "Paid by <manager>" (managerMemberId): o nome está dentro de uma tradução frase sem etiqueta para pendurá-lo, então toda a frase é o gatilho. - Administradores de Plataforma (AdministratorCard): o nome (memberId); o avatar desenhado à mão está agora Membro Avatar a 48px. Um administrador em outra organização lê "Não em sua organização" A menos que o espectador seja Deus. - Configurações Webinar, tabela de disponibilidade do tipo: cada apresentador (equipeMemberId, um ID de membro). - Telefone: o proprietário de um número em Números (proprietário Id; "pertence a" é o gatilho, e Fact toma um node now); o membro atribuído em ambas as tabelas de extensão (atribuídoMemberId), no hover e no foco somente, então o link para suas configurações de telefone mantém seu clique; cada membro em dispositivos móveis (memberId). - Subcontratante da Comissão: o membro em cada linha de um lote enviado (membro; uma linha vazia permanece atingido através, que a linha de um pai não atinge mais) e em cada retirada (memberId). Esquerda plana: os catadores (MembroPickerDialog, a linha de composição Autocomplete, o licenciado caixas de seleção, o botão pick-a-manager); nomes dentro de frases de confirmação, dicas de ferramentas e torradas; Usuários de PBX e chamadas de mensagens de voz, que não carregam ID de membro; e RelacionamentoManager, que lista organizações, não pessoas. PlatformAdminsTab atrai suas pessoas apenas através do AdministratorCard.
· kamo-internal
O cartão em convidados calendário, autores de documentos e notas de conta
- Calendário: as linhas de convidados resolvidas da janela de eventos abrem o cartão de membro (a antevisão do público membroId, transportado para GuestRow). Um endereço dactilografado à mão não tem ID e permanece texto; um endereço dactilografado que pertence a um membro já foi promovido a uma fileira de membros. - Documentos: "Uploaded by" na grade de documentos (DocsService createdByMemberId; the Shared tab usa sharedBy) e a linha do tempo da versão (cada versão é criadaByMemberId, o original O upload é do histórico) abra o cartão do carregador no hover. Ambos sentados dentro de alguma coisa clicável, para que o cartão nunca leva o clique. - Notas da conta: notas recentes da visão geral e a aba Notas nomeiam o autor (SecurityService now envia o autorNome ao lado do autorMembro — antes, cada nota lida "Sistema") e abre o seu cartão. - O cartão mantém os eventos que começam algo (clique, pressione, focus, teclas) de borbulhar através o portal para a linha que detém o nome, então pressionando uma ação já não ondula ou seleciona Essa fila. As extremidades de uma prensa ainda alcançam a janela, onde o framer-motion termina enquantoTap.
· DocsService
O ID do membro do upload viaja com a lista e o histórico
A lista de documentos (/imaging/list) e o histórico de um documento carregavam apenas o nome do uploader, então O kamo- internal pode mostrar quem enviou um ficheiro, mas não abrir o seu cartão de membro. Ambos agora carregam criadoPorMembro, como texto — um INT8 não sobrevive a um número JavaScript. Autor de cada versão Já carregavam os deles.
· kamo-internal
O cartão de membro — paire sobre qualquer membro, veja quem eles são e o que você pode fazer
Um cartão para cada nome de membro no kamo-internal, fechado pela regra do servidor SecurityService now service (MemberInteractionPolicy, securityservice 5063ea): chat, call, meet now, email ahead; texto, programação e um jogo (chess / Texas Hold'em) por trás Mais; seu perfil — ou, para um membro do lado do cliente, a sua conta — no rodapé. Uma acção recusada é desenhada com uma fechadura e diz por que no hover (a política de chat nas próprias palavras do org); uma ação que o espectador nunca pode tomar é Nem um pouco. As peças (app/componentes/membros/cartão, app/lib/cartão): - Nome de Membro / MemberChip / MemberHoverCard — gatilhos construídos no cartão correspondente useHoverCard (intenção, uma carta de cada vez, ancoragem, Escape retorna foco, toque no toque), que ganha `clickToggles` para que um nome que já faz algo no clique mantenha esse clique. - MemberCard — cabeçalho colorido com a cor própria do membro misturado com a marca, anel de presença ao vivo, title · departamento, sua hora local e quão longe ou atrás de você, copiar para verificar detalhes. - MemberActionBar – os botões marcados do cartão ou a tira compacta de uma linha. - MembroAvatar — o único avatar (foto de tamanho, outras iniciais na tonalidade do membro, presença opcional). - actions.ts — o conjunto de executores ONE; a lista `inicialData.to` do compositor, chat by userId, Segure-os como "jogo", não "criar", cada um preso por um teste. - cache.ts — uma leitura por membro, partilhada por cada gatilho, 60s TTL, preparada a partir de listas, ler através do usoSyncEstrangeiroStore para que nenhum estado é definido dentro de um efeito. - MemberCardDialogs — montado uma vez no AuthedChrome para o diálogo de reunião, que ganha `inicialMode' Então "Schedule" abre pronto para escolher uma hora. Camada 1305: sobre diálogos MUI, então um nome dentro de uma janela ainda recebe seu cartão; sob dicas de ferramentas MUI. As três cópias destas acções desapareceram: - As linhas do Interaction Center desenham a faixa compartilhada a partir de `interaction` em cada linha do roster; Cartão completo. O perfil e os portões de correio copiados à mão do NavTopPanel são removidos. O bate-papo hex-head segue a decisão do cartão para um bate-papo. Sua "Ver conta" foi oferecido a todos e levou a uma página da qual a maioria dos membros são expulsos; agora só aparece quando o espectador pode abrir esse perfil, e vai para ele. - MemberContactCard (leader lockholder / roster) desenha as peças compartilhadas em vez de sua própria chamada e Mensagem. A tabela apresentadores webinar coloca o cartão em cada apresentador e um âmbar "Sem tempo bookable" aviso ao lado de qualquer apresentador um visitante não pode reservar (mediaservice a9f20cc), com uma dica dizendo o que fazer. Especificações e plano: **************************** **************************** O resto do lançamento segue-se. Testes: memberCard lib (parse, cache, razões, hora local, cada executor), renderização do MemberCard (hover, teclado, oculto vs ofuscado, Mais, rodapé, clique preservado, sem id, não encontrado), apresentador Falhas no perfil da Hexhead. tsc clean; eslint não adiciona nada às contagens existentes dos ficheiros tocados; guardas passam; 632 testes através das pastas tocadas verde.
· MediaService
A tabela Apresentadores pode ver quais apresentadores ninguém pode reservar
- Está bem. — GESTÃO APOIO somente o tipo da organização (algo mais é "não encontrado") — responde a cada apresentador ativo com hasBookableTime, para o aviso ao lado de seu nome na tabela Apresentadores. hasBookableTime(member, type) é extraído de webinarsAwaitingMyAvailability, que agora o chama, então a tabela do administrador, o próprio marcador de calendário do apresentador e a página de reserva BookableStarts e não pode discordar sobre se alguém pode ser reservado. Testes: a tabela marca um apresentador cujas horas passaram e não um com horas à frente (real disponibilidade aritmética), outro tipo de org não é encontrado, a forma do fio, e o 403 sem GESTÃO E APOIO. Suíte completa 994/994.
· SecurityService
Uma regra para o que um membro pode fazer com outro, servido por membro e por fila
As mesmas cinco ações — bate-papo, chamada, e-mail, encontro, perfil de visualização — foram oferecidas de três lugares em kamo-internal (a linha Interaction Center, o chat hex-head popover, o cartão de contacto lead-lock), cada decidir no navegador a partir da sua própria leitura dos direitos. Nenhum dos dois concordou, ninguém pôde ver a conversa política ou qualquer coisa sobre a pessoa do outro lado, e o resultado foram botões que falharam ao clicar. A Política de Interacção dos Membros (membros/cartão) é agora a única regra, pura e testada. Por acção responde Ocultar quando o espectador nunca pode fazê-lo (sem assento, a org não tem direito ao aplicativo) ou RECUSA com um código da razão quando é esta pessoa no caminho (a política de chat — com a própria formulação da org — Inativo, não-emal, não-número, não-móbil, não-laborador: chat não restrito; a política de chat do colega ativo; permite- lhe iniciar (passas OVERRIDE CHAT POLICY) call seat canCall; qualquer extensão ou número no arquivo assento de texto canSendTextMessages; um celular que leva textos e-mail EMAIL intitulado, ACCESS MAIL, canSendEmail; um endereço no arquivo encontro/agenda MEET intitulado, canMeet, START MEETING; um colega ativo perfil da página do membro próprios seis direitos ou deus — para um membro do lado do cliente, VIEW ACCOUNTS ("Ver conta") jogo os jogos de ambos os lados podem jogar: direito + PLAY CHESS/PLAY HOLDEM em cada lado (proprietário está dentro) Os dados de contato de um membro do cliente são apenas para um visualizador que pode ler contas. As aplicações são Projecção ENTRADA (computeEffectiveCaracteres), a mesma que a organização do navegador.isEmail lê. MemberInteractionService resolve o visualizador uma vez — capacidades de assento do direitoServiço, aplicativos, direitos, proprietário — e decide por um membro ou uma lista inteira (direitos do jogo lidos uma vez por jogo). - Está bem. identidade (nome, avatar, título, departamento, tipo, fuso horário, disponibilidade), os valores de contato que a política permite a este visualizador ver (de um colega são os únicos a lista já serve a cada membro), a conta para um membro do lado do cliente, e a decisão. Outro membro do org é 404, como um que não existe; o id é uma string de caminho. A sessão vem através de CallerSessionResolver, para que a catraca de ponta sem guarda a reconheça. /by-department linhas ganham `interação` da mesma política, então uma linha de roster e uma carta aberta a partir dela nunca pode oferecer coisas diferentes. LeadWebinarEntry ganha apresentadorMemberId, para que a página principal possa colocar o cartão no nome do apresentador. Testes: MemberInteraction PolicyTest (17), MemberCardEndpointTest (wire shape, contact reholded, 404 através de orgs, 400/401), MemberRosterInteractionTest. As cinco falhas na suite completa *******************X4, o nome da ratchet **************** são os mesmos cinco que falham na origem/principal sem esta alteração.
· kamo-internal
Uma marca vermelha no calendário quando ninguém pode reservar um webinar com você
O apresentador de um webinar cujas horas se esgotaram nunca foi informado. A página de reserva apenas oferece não vezes, e a única pessoa que pode corrigi-lo é a única pessoa que o produto nunca mencionou. O ícone do calendário agora carrega uma marca vermelha, piscando sempre que o MediaService diz pelo menos um webinar este membro apresenta não tem tempo de reserva (mediaservice ddf8e20). O calendário é onde um O apresentador declara essas horas, por isso é onde o empurrão pertence. Ao passar o próprio nome da opção é substituído pelo que está errado, quais webinars estão esperando, e o que fazer — o mesmo tratamento os leads aceitar-porta usa, porque um ponto sozinho não diz a alguém o que ir e fazer. Ele monta o cliente STOMP bate-papo existente em vez de abrir uma conexão: um frame sem conteúdo em ************* diz "reler", eo navegador pergunta Endpoint autenticado para a sua própria resposta. A semente não é uma otimização — o assunto é o núcleo NATS sem fluxo, então um frame publicado enquanto esta aba estava dormindo se foi — e o primeiro plano re- lido é a ÚNICA coisa que pode pegar uma janela que simplesmente expirou, uma vez que nada escreve então. Sessões que nada presente nunca subscreve, que é quase todos eles. O id de membro é o STRING um: arredondando um unique rowid() através do acessor numérico seria subscrever o tópico de um colega e ser recusado pela guarda do servidor, deixando uma marca que nunca vai viver sem nada no ecrã para o explicar. A resposta é marcada com o membro que foi lido para, assim um sudo de modo deus ou um switch de sessão mostra o novo membro EMPTY em vez do anterior state — e não precisa de efeito de reset, que as regras do React Compiler rejeitam em novo código. Testes: apresentadorDisponibilidade.test.ts fixa o destino, o predicado da moldura (nunca lança, o que quer que chega), o analisador (um corpo que não pode confiar deixa a marca em paz) e a dica contra o real dicionário; ************* drives the real useNavAdornments e lê o que o Nav desenharia. As cordas já estão no dicionário principal. (996b07f0), sem plural neles. tsc limpo, eslint limpo nos arquivos tocados, guardas passar, 318 testes de navegação verde.
· MediaService
Dizer a um apresentador, viver, quando ninguém pode reservar um tempo com eles
Um apresentador cujas horas declaradas se esgotaram é o único estado nesta característica nada relatado: a página de reserva simplesmente não oferece horários, o visitante sai, e a pessoa que poderia corrigi-lo em um O minuto nunca ouve falar nisso. A demonstração do próprio produto KamoCRM está exatamente nesse estado hoje — sua única A última janela do apresentador foi 2026-09-03. - Está bem. respostas, apenas para o chamador: quantos tipos ativos eles se apresentam, e qual deles não tem tempo de reserva. Por tipo, porque cada um tem o seu próprio comprimento, avanço mínimo e horizonte; por apresentador, porque as suas próprias janelas menos as suas próprias reservas e calendário é o que eles podem ir e mudar. Ele executa a aritmética SAME a reserva página faz — getBookableTimes e este agora compartilhar bookableStarts() — assim o marcador não pode reivindicar um gap a página iria preencher, ou ficar escuro enquanto a página não tem nada a oferecer. Viver sobre o soquete existente: **************************** publica um frame sem conteúdo em **************** após o compromisso de qualquer coisa que mude a resposta — um janela de disponibilidade adicionada, alterada ou suprimida; sendo adicionada ou removida dos apresentadores de um tipo; a sessão reservada (assinatura ou do site de marketing) ou cancelada. **************************** Veste-o. **************** o gémeo do revezamento de má formação, e Destino do Estômago Authz protege esse destino por membro no SUBSCRIBE e recusa ENVIOS ao cliente: nomes de tópico um ID de membro do apresentador, e desprotegido ele deixaria qualquer pessoa no socket assistir a um nome O diário do colega está vazio. A moldura não tem título, nem horas nem contagem — o navegador reler o endpoint na sua própria sessão. O que nenhum quadro pode anunciar é uma janela simplesmente EXPIRANDO, porque nenhuma escrita acontece. O navegador o primeiro plano re-leitura é a única coisa que levanta o marcador então, por isso não é opcional. Testes: ApresentadorDisponibilidadeGapTest executa a regra sobre um membro realDisponibilidade Serviço (horas no passado, horas à frente, horas consumidas pelas suas próprias reservas, uma janela demasiado curta para acolher, um tipo de dois, não apresentar nada); * * ****************espina a forma do fio eo 401; ************* ***pins the suject→destination mapping, the guard and the Carga útil sem conteúdo. Suíte 991/991.

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