Changelog
O que há de novo.
Cada melhoria para a plataforma, como ele envia.
· EmailService
Ler um evento pelo ID
A página principal contém o ID de um evento de callback e quer reabri-lo no mesmo diálogo que o calendário usa, então ele precisa ser capaz de obter o evento por conta própria. Âmbito exatamente como a lista — calendários próprios do membro mais o organização — então um id pertencente ao calendário de outra pessoa lê como ausente em vez de como proibido.
· kamo-internal
Notas flutuantes tornam-se uma segunda classe da janela hex head
Hex heads agora para trás dois tipos de janela: as janelas popup ferramenta eles E notas flutuantes. Minimizar substitui o roll-up antigo — a folhas pegajosas minimizadas a sobreposição inteiramente e pousa na cabeça hex dock usando sua própria cor de nota, onde o popover aberto / fechado e Atirar para o golo conduzi-lo exatamente como eles dirigem uma janela de ferramentas. A integração é o contrato de evento, nada mais: cabeças são chaveadas por id da janela, então as notas tomam uma `nota flutuante:<id>` espaço de nomes dentro desse espaço de id compartilhado e responder `tool:focus` / `tool:close` para seus próprios. «ferramenta:pedidoFechar» não é deliberadamente vetado — que o veto protege rascunhos não enviados, e um autosalvamento pegajoso e dá descarga na desmontagem. Além disso: - Toda a barra do título se arrasta. O título é um rótulo em vez de uma entrada, que é o que estava roubando cada pixel, exceto o canto superior esquerdo; duplo-clique ele renomeia, duplo-clique em qualquer outro lugar maximiza. - Maximizar para tela cheia, a partir do botão ou um duplo-clique. - Um bilhete é viver num lugar ou noutro, nunca ambos. Enquanto flutua, seu cartão em /notas é escurecido e inerte (apenas re-attach permanece ao vivo) e A remoção do editor fecha o editor. "Abrir em Notas" mãos anote de volta e fecha o pegajoso. - A fechadura de ligação profunda era uma única booleana. A segunda vez nunca reabriu. Agora está marcado por ID. - Uma esquerda pegajosa minimizada respinga sua cabeça após uma recarga, e um legado `colapsado` migra para minimizar em vez de desaparecer.
· kamo-internal
Um controle que realmente abre o que produziu o evento
A descrição do callback carregou "Abra o lead: /leades/view/123" como texto, e o texto numa área de texto não pode ser clicado — a janela do evento edita a sua descrição em um, para que o caminho nunca poderia ter sido uma ligação lá. O destino está no DeepLink do evento desde que a coluna foi adicionada; este é o dinheiro que o usa. O diálogo oferece ao lado do tipo do evento, o agenda view oferece-lo sob a descrição, e ambos passam pelo roteador em vez de carregar um documento, porque ambos podem ser abertos sobre qualquer página e um A navegação destruiria tudo o que o membro tem. Desligado deepLink em vez de callbacks especificamente, então o que quer que produza os eventos seguintes obtêm o controle sem tocar nesta janela. A etiqueta diz "Abrir levar" quando a origem é um callback e "Abrir" caso contrário.
· kamo-internal
Chamadas de volta no calendário e um marcador na lista
Duas maneiras de ver uma chamada que prometeu fazer sem abrir a liderança. No calendário, um callback recebe seu próprio item de linha ao invés de parecer com qualquer outra nomeação — uma chamada que você deve a alguém é um tipo diferente de obrigação de uma reunião que você concordou em assistir, e uma visão que os torna idênticos faz-te ler todos os títulos para os distinguir. A vista mensal colapsa um dia chamadas em uma linha lendo quantos existem, porque uma célula se encaixa sobre três chips e uma manhã movimentada de chamadas de outra forma empurrar todas as reuniões sob um "+4 mais". A semana vê o nome dele "Liderar Callback" e coloca a liderança no pairar, uma vez que o bloco tem alguns caracteres de largura nesse zoom. O dia e a agenda vistas têm espaço para ambos e mostrar ambos. Na lista de leads, uma pista com uma chamada excelente carrega um marcador de telefone no Célula de id presa, colorida pelo quão pressionada é: cinza um dia ou mais fora, âmbar Hoje, vermelho uma vez que o tempo passou sem ninguém a marcar contatou. Excedente pulsos, que é o estado que vale a pena apanhar enquanto rolagem. Mais de uma chamada Uma pista mostra uma contagem. Urgência é lida em dias de calendário em vez de horas decorridos, porque é isso que "hoje" significa para a pessoa que lê a lista: uma chamada amanhã às 9h não é urgente às 17h de hoje, embora esteja a 16 horas de distância, e uma chamada das 9h de hoje é urgente em 8am embora seja uma hora de distância.
· SecurityService
Resumo da chamada para o marcador da lista de leads
Respostas que levam têm uma chamada ainda esperando, e quando o mais cedo é devido, para a organização do chamador num único pedido. O seu próprio objectivo em vez de um campo na liderança: callbacks mudar em sua própria programação, então dobrá-los em a carga útil do lead significaria uma junção em cada consulta de lead ou um marcador velho.
· kamo-shared-library
Rescaldos pendentes para uma organização inteira em uma consulta
Alimenta o marcador de chamadas por linha. A grade detém cada chumbo o membro pode ver, então perguntar por lead seria um pedido por linha para renderizar um coluna; esta é a mesma pergunta feita uma vez. Apenas um método de repositório — nenhuma alteração de entidade ou coluna, então nada aqui está armado contra o esquema.
· kamo-internal
Um centro de notificação, em cada página
Os lembretes não tinham para onde chegar. O popup do calendário foi um simples alerta no canto superior da página que aconteceu para ser aberto, desapareceu em um timer, e qualquer coisa levantada enquanto o membro estava em outro lugar foi simplesmente perdido — a tomada publica, e uma publicação ninguém é subscrito para sucesso e desaparece. Assim, as notificações são agora armazenadas, bem como publicadas, e o navegador lê ambos através de um contexto montado acima da árvore inteira. O que chega enquanto você está aqui é empurrado; o que chegou enquanto você não foi reivindicado no próximo conexão, uma vez, para que duas abas abrindo juntas não levantem a mesma pilha. O convés fica num canto do viewport, sobre qualquer página que esteja por baixo. Cartas empilham em vez de listar — quatro lembretes pousando juntos, que é o que evento da empresa mais sua própria reunião faz, caso contrário tomaria a mão direita terceiro da tela — e pairando os ventiladores para fora. Cada carta leva com a coisa cada notificação neste produto tem em comum: um relógio. Conta até o evento, ofertas agora, mais tarde ou não em tudo, e drena um trilho como suas próprias corridas de boas-vindas fora, que pára enquanto você está lendo. Desvia-te para te livrares dele. Tudo o resto está por trás dos dois menus: dormir por cinco, dez, quinze, trinta, uma hora, ou até cinco minutos antes da coisa começar; mudo este tipo de notificação outright; abra as configurações. As acções fornecidas pelo produtor acompanham-se, assim, um callback oferece o número do líder e uma reunião oferece seu link de adesão. Ligações passar pelo roteador, nunca uma carga de documento – o convés pode disparar a qualquer momento e uma navegação aqui derrubaria um rascunho não enviado. O sino no nav superior é cromado fixo pela mesma razão que o relógio de conformidade é: um sino que alguém pode soltar e, em seguida, não ser dito nada é pior do que nenhum. Por trás dele está o histórico, filtrado por tipo ou por não lido, com não-perturbação Quando um membro nota o ruído. A conta também te diz. TabAttention já exibiu o título e emblemou o favicon para chat, leads e suporte; notificações não lidas se juntam a ele, acima do chat porque eles são cronometrados — um lembrete de que uma chamada é devida em cinco minutos pára sendo útil daqui a cinco minutos. Sons são sintetizados em vez de carregados, então a primeira notificação de uma sessão não é o silencioso numa ligação lenta. As notificações da área de trabalho são apenas levantadas quando a aba está escondida, e a permissão é perguntada no momento em que o membro gira o interruptor ligado em vez de na carga da página, que é o padrão navegadores suprimir e as pessoas negam reflexivamente.
· SecurityService
Um retorno que leva de volta à liderança
O retorno já atingiu o calendário do membro, como um evento intitulado "Lead Chamada de volta" com seu comentário na descrição. Nada disse de quem era a decisão, nada disse que número marcar, e nada levou de volta à liderança — assim um membro olhando para o seu calendário teve que ir e encontrar o chumbo à mão, que é o procurar o item do calendário existiu para salvá- los. Ele agora carrega o nome do líder no título, seu número no local, e um link profundo do site-relativo para trás à liderança sobre o evento e em sua descrição. A descrição repete os dados de contacto deliberadamente: um calendário é lido onde o CRM não está, e um retorno que você não pode agir sem abrir outro aplicativo é um lembrete para ir e procurar algo para cima. A página principal agora compõe uma chamada de volta na janela de eventos do próprio calendário, por isso o a solicitação pode levar um evento inteiro — título, convidados, lembretes, cor — e este Passa tudo. Cada campo menos o instante é opcional; um chamador que envia apenas os três originais ainda recebe um devidamente intitulado, devidamente ligado entrada construída a partir do chumbo. Resolver um retorno de chamada retira sua notificação, bem como cancelar seu evento. Caso contrário, uma chamada feita dois minutos depois deixa um cartão ainda pedindo por ele, e Uma que volta amanhã para perguntar outra vez.
· InitializerService
Quadros de notificação dos membros e colunas de origem de um evento
Duas metades de uma característica. Um retorno de chamada agendado em uma liderança é espelhado no agendando o calendário do membro, e o ponto do espelho é voltar para o lead — então calendário eventos carrega source type, source id e deep link, e o A notificação que lhe é feita implica os mesmos três. Ordem 0: CalendárioEvento mapeia as três novas colunas a partir do momento em que esta compilação começa, então cada corredor que carrega um evento emite-os em seu SELECT e ddl-auto ainda não os adicionou. Ordenado tarde que nunca iria executar. Aplicado e verificado contra Yugabyte 2026-08-13.
· kamo-shared-library
Centro de notificação dos membros e origem de um evento
Adiciona notificação e notificação de membrosPreferência: uma linha por membro por membro notificação, porque lido, demitido e snoozed são respostas por pessoa e um A fila compartilhada não tem onde colocá-los. Preferências cobrem as duas metades separadamente — quando a notificação é efectuada, são aplicadas horas de silêncio e de não perturbação. levantadas; as notificações de som, volume e área de trabalho são propriedades do navegador. CalendárioEvent ganha SOURCE TYPE, SOURCE ID e DEEP LINK para um evento feito por um O serviço pode levar de volta ao que quer que seja. Um retorno de chamada de chumbo espelhado em um calendário foi anteriormente intitulado "Lead Callback" e apontou para nenhum lugar, então um membro Olhando para ele tinha que ir e encontrar o chumbo à mão. CalendárioEventReminderRepository ganha buscas por evento e obtém a posse calendário com um lembrete devido, que é o que permite que o fã-out de entrega perguntar se um evento pertence à organização sem uma consulta por lembrete. Esquema aplicado por KamoInitializer's MemberNotificaçãoMigração e verificado em Yugabyte antes disto aterrar.
· kamo-internal
Desanexe notas em pegadas flutuantes arrastáveis e redimensionáveis
Cada nota na lista (e o editor) obtém um controle de desacoplagem que aparece para uma sobreposição de ecrã. Qualquer número pode flutuar imediatamente; cada um pode ser arrastado em qualquer lugar, redimensionado de qualquer borda ou canto para baixo para um 220x170 andar, enrolado até sua barra de título, recolorido e editado no lugar. A colocação, o tamanho, o empilhamento e a cor persistem no suporte DB por membro ui-preferences store sob uma chave `floatingNotes' -- o mesmo mecanismo o usa layout de navegação. Essa loja, não sessãoStorage, é o ponto: pegadas tem que sobreviver a sair e voltar, e logout limpa sessãoStorage Por grosso. Notas: - Texto pegajoso é sempre perto-preto, então cada fundo selecionável é mantido acima de uma relação de contraste 7:1 contra ela por um teste unitário. A paleta não pode deriva ilegível mais tarde. - A edição em linha é oferecida apenas para notas cujo estado lexical armazenado não carrega formatação; qualquer coisa mais rica abre somente leitura em vez de ser achatado por uma viagem de ida e volta. - note.color era anteriormente um hex caiu em um slot className, onde Não deu em nada. Agora é um id de paleta resolvido para um inline fundo, e um cartão colorido pins seu texto escuro modo tão escuro não pode pintar de branco em pastel. - A sobreposição é portais para <body>; a caixa de conteúdo da shell é Overflow:auto e de outra forma clipá-lo.
· EmailService
Um inteiro para o crachá de e- mail, e conte o valor do caminho do índice
Três coisas, tudo sobre saber em vez de supor. O crachá nav-top não lido obteve toda a árvore de pastas e escolheu o INBOX de o resultado — a chamada mais cara que a infraestrutura de e-mail faz, para renderizar um número. MailReader carregou getUnreadCount para exatamente isso desde que foi escrito (a Status único nos provedores IMAP, um campo em linha no gráfico) e nada nunca expôs-o sobre HTTP. Agora sim. Este é um caminho que só dispara quando o soquete não lido falhou, por isso é raro e foi caro precisamente quando As coisas já estavam a correr mal. A listagem indexada agora relata por que ele fez ou não servir, como E o atuador expõe métricas para que Os balcões podem ser lidos. A razão de servida para modseq moved é o número que diz se esse caminho ganha sua complexidade, e não é responsável pela leitura do código: uma pasta invalida seu próprio checkpoint assim que alguém lê uma mensagem nele, então a taxa de sucesso é um fato sobre como os membros se movem através de seu correio. A prova que ele relata agora é um enum em vez de um booleano, então cada recusa é atribuído em vez de grunhidos, e os testes afirmam a razão específica — Um teste que aceitasse qualquer recusa deixaria aqueles baldes cair em disparates. Também corrige um teste que vi falhar três vezes esta tarde e que é não é meu: ImapIdleRegistryTest enquadrou um mock com o timeout () do Mockito para ver o async terra próxima, e em uma máquina carregada que expira enquanto o close é meramente fila atrás da criação de thread. Ele falha como "interações zero", que diz como um registro quebrado e é realmente uma CPU ocupada. Ele agora espera em um trinco que acorda o fechamento instantâneo() é digitado, combinando o teste de irmão dois métodos para baixo, e o fio estacionado é interrompido em um bloco final — uma corrida falha usada para vazar uma linha não-daemon dormindo por trinta segundos e desacelerar tudo depois incluindo a próxima tentativa no mesmo teste. Três suites completas executadas Ao mesmo tempo: 257 passou, três vezes.
· kamo-internal
Cromado marca em torno de um quadro de redação na sala de assinatura
A mesa foi pintada com a cor da org e escureceu em ambos os temas, que colocou a marca sob o documento e deixou o cromo neutro — exactamente ao contrário. Invertida: - CHROME é o org primário de cada lado da página: cabeçalho, agenda Trem e doca. Cada marca nele é branca, através de uma escada de fichas (--legal-on-chrome / -dim / -faint / -line) para que três regiões não podem cada inventar sua própria ideia de "texto secundário sobre a marca". - O DESK é um quadro de redacção — muito claro, cinzento, com 45 graus grade axonométrica, em gradientes CSS puros (sem ativo, sem pedido, escalas a qualquer viewport). background-attachment: local liga a rede ao conteúdo rolado para que ele viaja com as páginas. É deliberadamente NÃO derivado de -- color- primário: uma org branca com um primário pálido seria lave a superfície onde está o documento, e a página tem de ser lida como papel em uma superfície de trabalho, nunca como papel na marca. A rede é o que separa a borda da página do fundo, então nenhuma borda é desenhada. - A sombra da página é agora dois moldes — um largo macio para levantar, um escuro apertado Um para a borda do lençol. Um único borrão em uma superfície leve lê como um manchar em vez de uma página. - Um nó completo é branco sólido com a cor do org dentro dele, invertendo nó e trilho exatamente quando o membro bancos o trabalho. Verde haveria uma terceira cor lutando contra a marca por um significado. - O atestado passou para o mesmo tabuleiro que uma folha branca com o mesmo levantar, porque a declaração é um instrumento também e cair para uma planície painel lido como tendo saído da sala. Um cacete, sempre. Um passo do documento possui a barra inferior — só ele sabe se está mostrando um spinner, uma porta de consentimento, uma superfície de assinatura ou uma capturada assinatura — assim que o assistente entrega seus controles para trás e próximo para baixo em vez de empilhar uma segunda barra abaixo da primeira, e desenha a doca apenas na etapa de atestado. GuideBar ganhou um tom de marca e um ranhura inicial para isso: na marca pinta o cromo, cai a borda e sombra que cortaria o quarto ao meio, inverte seu anel e texto para branco, e sua pílula lê na cor da org. A sua auréola foi toda codificada. azul singer-app, invisível numa doca colorida. O carregamento, a sessão falhada, o consentimento e os portões de reforço agora mantenham a secretária. debaixo deles e da doca abaixo, para que o quarto nunca perca uma parede no meio do fluxo e Back é acessível a partir de uma tela que o membro não pode sair.
· EmailService
Prove uma pasta inalterada com HIGHESTMODSEQ, em seguida, sirva-a a partir do índice
Liga a lista de mensagens com base no índice, fixando a coisa que a tornou insegura em vez de virar a bandeira. O check antigo comparou as contagens de mensagens e o UIDNEXT. Ambos são cegos para uma bandeira movimento, e nada re-indexa uma mensagem quando alguém lê-lo em seu telefone, assim uma pasta que passa essa verificação pode ser ser servida com o estado lido de cada mensagem congelado no momento em que chegou — uma caixa de entrada mostrando o correio lido como não lido. Isto é... Porque é que ele enviou desactivado. CONDSTORE tem o número que se move. O HIGHESTMODSEQ é de pasta e avança em qualquer coisa: uma chegada, um expurgo, uma bandeira definida de qualquer cliente Em qualquer lugar. Então "no modseq N as mais novas mensagens K foram indexadas" mais um modseq fresco de N é uma prova de que nada mudou desde então, bandeiras incluídas. Verificado em servidor vivo antes de construir sobre ele — /usr/libexec/dovecot/imap (2.3.20) carrega CONDSTORE, QRESYNC e LIST-STATUS. A UIDVALIDIDADE é verificada em paralelo, uma vez que servidor que o altera renumerou a pasta e nada indexou sob o O valor antigo descreve o mesmo correio. O próprio STATUS de Jakarta Mail só pede os cinco itens clássicos, então o o formulário alargado é emitido directamente e a resposta é analisada aqui — sob teste, contra Dados de fio literal, porque esse número é todo o argumento de segurança. O posto de controlo vive em Redis, não numa mesa. É um marcador de sincronização cujo correcto comportamento na perda é "esquecê-lo e re-ler", então uma entidade bibliotecária compartilhada, uma migração e uma corrida KamoInitializer seria o preço errado para ele. Sem trabalho de reserva, deliberadamente. Quando a prova falha, a solicitação lê do IMAP exatamente como antes e entrega o resultado de volta para ser indexado, então pastas preencher como eles são observados — a mesma ordem em que ser rápido importa, e nada que pode fugir através de cada caixa de correio na plataforma. Isso também aborda o porquê disso. teria sido inútil antes: o índice continha 31 linhas no total. Duas ordens importam e ambas falham apenas em uma direção. O modseq armazenado é o que foi lido antes da busca, nunca depois, então uma mudança de pouso no meio da fetch folhas o posto de controle por trás da realidade e custa uma busca desperdiçada — o inverso emparelharia um modseq com aparência atual com correio velho. E as linhas já no índice têm apenas suas bandeiras atualizadas, nunca seu corpo, porque uma linha o indexador completo escreveu carrega a pesquisa de texto é construída a partir de, e reconstruí-lo de um envelope seria Deixar as mensagens fora de pesquisa silenciosamente enquanto torna a lista mais rápida.
· kamo-shared-library
O mapa foi respondido, agora que a coluna existe
KamoInitializer acrescentou **************** em 2026-08-13 **************************** verificado em Yugabyte: booleano, padrão falso, sem nulos). Mapeando-o é seguro agora e não era antes — fullTextSearch is um SELECT nativo * cujas linhas Hibernate hidrata nesta classe, então uma coluna o tabela falta quebras busca por e-mail em si, não apenas escreve. Foi por isso que isto aconteceu. Saiu e voltou há algumas horas. SearchIndexService registra a partir daqui, então as mensagens recentemente indexadas carregam tudo três bandeiras IMAP em vez de duas.
· EmailService
Serve uma lista de pastas do índice quando ele pode provar que está atual
As linhas por trás de uma lista de mensagens já estão em Postgres — o índice de metadados contém remetente, assunto, data, tamanho, anexo e bandeiras para cada mensagem que tem Visto. Ler uma página a partir daí é uma consulta; lê-la do IMAP é um SELECT mais um FETCH de cinquenta envelopes e faz com que o servidor construa o índice de caixa de correio para Responde. O que impediu qualquer um de usá-lo não era velocidade, mas confiança. O índice é preenchido por um Empurre o indexador que só funciona enquanto alguém tem a caixa de correio aberta, por isso é permitido ser arbitrariamente estagnado, e nada distinguiu uma pasta atual de Um velho. Um STATUS os distingue. É a pergunta mais barata IMAP respostas — não SELECT, sem dados de mensagem — e retorna a contagem de mensagens da pasta e sua próxima UID. O índice é usado apenas quando ambos correspondem ao que detém: a contagem captura qualquer coisa adicionada ou removida, e maxUid + 1 == UIDNEXT captura o caso uma contagem não posso ver, onde tantos chegaram como foram excluídos. UIDNEXT apenas avança, então um anexo do índice perdido deixa-o encalhado acima do UID mais alto o índice Eu sei. Todos os outros resultados voltam ao IMAP: uma pasta em falta, um servidor que descodifica STATUS, um índice vazio, um erro de banco de dados. O pior resultado disponível é o comportamento que existia antes disso. Uma pasta que falha no teste se cura quando a próxima mensagem chega e é indexada. Off por padrão atrás ************* porque a resposta marker depende de search index.is responded, que não existe até O KamoInitializer correu. É então um ato deliberado em vez de um efeito colateral de uma implantação. O predicado do acordo é onde estar errado mostra a alguém o correio errado, então ele é puro, pacote-privado e testado a partir dessa direção — cada caso pergunta se pode utilizar o índice quando não deve.
· InitializerService
Adicionar a resposta ao índice de pesquisa de e- mail
O índice regista os três. Bandeiras IMAP em vez de duas. A lista de mensagens desenha um marcador de resposta a partir deste um, e a listagem index-backed no EmailService não pode ser ligada até que o A coluna existe. Ordem 0, pela razão habitual: SearchIndexEntity mapeia a coluna a partir do momento a biblioteca compartilhada que a carrega é construída, então cada corredor que carrega aquela entidade emite-o em seu SELECT e ddl-auto não pode adicioná-lo para nós. Um corredor tardio nunca executaria — um anterior morreria em "coluna não existe" e Corre com ele. Nulable com um padrão FALSE e um preenchimento de linhas existentes. Não ler para trás dos servidores de e- mail: false já está certo para a esmagadora maioria mensagens, e o caminho lido se recusa a servir qualquer pasta que não possa provar concorda com o servidor sobre, então uma linha que está estagnada aqui é uma linha que não irá utilizar. Re-indexar corrige.
· kamo-shared-library
Gravar se uma mensagem foi respondida no índice de correio
email metadata.search index carregou is read e is starred desde que foi criado mas nunca a terceira bandeira IMAP, \Resposta. Isso foi inofensivo enquanto o índice apenas alimentado busca de texto completo, que não se importa com ele. Deixa de ser inofensivo agora que o índice pode servir uma página de uma pasta diretamente: a lista de mensagens desenha seu marcador de resposta a partir desta bandeira, então uma linha servido de um índice sem ele afirmaria, silenciosamente e erroneamente, que o O membro nunca tinha respondido a essa mensagem. A coluna é adicionada pelo KamoInitializer. não existe até que tenha corrido — é por isso que o caminho lido que precisa é por trás de uma bandeira que não funciona.
· kamo-internal
Relógio-out indicador usa o mesmo pulso que legal e conformidade
O relógio de soco respirou um brilho radial vermelho enquanto as obrigações distintivo três pixels para a esquerda pulsaram dois anéis em expansão. Ambos os controlos estão a pedir membro para ir e fazer algo, e duas animações diferentes que fecham juntos, lidos como dois sistemas não relacionados — cada um aprendido separadamente. Um anel de animação agora serve ambos, então o quadro de chaves é renomeado para fora do As obrigações apresentam que começou. Movimento reduzido ainda os degrada diferente, porque eles não perdem o mesmo valor: a contagem de crachás e cor do erro ainda dizer "você deve algo", então esses anéis simplesmente parar; nada outro na tela diz "você está fora do relógio", de modo que um detém um único anel aberto a uma intensidade constante e deixa cair o que se segue.
· kamo-internal
Na tela não é o mesmo que lido
Uma conversa de suporte foi marcada como lida no instante em que sua janela foi carregada, então a única tipo de janela que NÃO deve contar como lido — o tipo que se levanta, de um atribuição, uma reatribuição, ou uma resposta de chegada — limpou o crachá antes do O membro tinha olhado para qualquer coisa. isFocused não pode distinguir aqueles: é derivado da ordem z, e uma janela que acaba de ser aberto é o topo da construção. O mousedown e touchstart da shell são os únicos sinais no sistema que significam que uma pessoa fez algo, então o provedor agora os anuncia como ferramenta:userFocus do único lugar ambos terra. A partir daí, a regra que o membro descreveu: aberto deliberadamente lido assim que carrega levantado por si mesmo não lido até tocado lido tocado, ambos selos redesignado para você não lido novamente, nenhuma nova mensagem necessária Dois selos, porque há duas maneiras de ser não lido e cada um tem que ser limpo: markAsRead avança o ponteiro de leitura após as mensagens do solicitante, e A missão aberta retira a entrega. AtribuídoTicketOpener já não carimba o entrega quando levanta uma janela — que era o bug em miniatura, e reconhecimento de que o agente tinha visto algo que eles não tinham visto. Sua per-tab guarda carrega o peso em vez disso. TicketChat obedece à janela em vez de decidir por si mesmo, incluindo para mensagens que chegam enquanto está aberta: uma resposta pousando em uma conversa o O membro que está a ler é lido, mas um que está atrás deles não está.
· MediaService
Não lido significa que o solicitante falou, ou o ticket se tornou seu
O crachá contou "bilhetes ao vivo que ninguém pegou, além dos que tenho" — cego-mensagem, e só caiu quando um ticket atingiu o status de terminal. Então... ele sentou-se às cinco sobre uma lista que marcou nada, e abrindo uma conversa movida Nenhum dos dois. Agora conta o que diz: conversas com algo neles para este membro para ler. Ambas as metades do velho predicado desapareceram. Não lido é uma consulta nativa compartilhada com a lista de tickets, então o número e as linhas marcadas são o mesmo fato em vez de duas aproximações que derivaram duas vezes. Aposentar uma entrega agora transmite o distintivo. É uma das duas formas de conversação deixa de ser não lida, e sem a transmissão o número ficou colocado para o caso sem novas mensagens nele — o que é precisamente o caso O selo de entrega existe. Os próprios testes do distintivo movem-se com ele: eles já não batem duas metades HQL, mas afirmam o que significa o número — uma conversa do outro lado escrita em contagens, uma apenas entregado conta mesmo com nada novo nele, e cada ticket conta uma vez de muitas maneiras que ele qualifica.
· kamo-shared-library
Uma definição de uma conversa de suporte não- lida
O navtop emblema e a lista de bilhetes se separaram duas vezes respondendo perguntas diferentes. findUnreadStateForViewer é a única resposta que ambos agora lêem, Por isso não podem voltar a discordar. Não lido significa que o outro lado da conversa falou e você não olhou. Para o agente designado que é especificamente o PEDIDO falando — um A nota do colega no mesmo bilhete não é algo a que o agente deva uma resposta, Então, não levanta bandeira. Para o solicitante é qualquer um do lado de apoio. Qualquer um. outro não é uma festa para a conversa e não vê nada, por isso a consulta é escopo por função em vez de por org: um pedido de cross-org é respondido por um agente numa org diferente da pessoa que a criou, por isso nenhuma das partes identifica ambos. handoverUnread é a segunda maneira de não ser lido, sem nenhuma nova mensagem envolvida. Ser dado uma conversa é em si a coisa que você não viu, então um Reatribuição de terras não lidas por mais velha que seja a sua última mensagem — caso contrário, um bilhete movido de manhã fica invisível até que o cliente volte a falar. atribuiçãoOpenedAt já levou exatamente isso: limpo em cada (re)atribuição, carimbado apenas uma vez que o agente realmente colocá-lo no ecrã. RESOLVIDO permanece elegível de propósito. Um solicitante que responde a algo um agente marcado resolvido é o caso que mais vale a pena passar, e o que Caso contrário, ser silenciosamente deixado cair; apenas FECHADO e VOID acabar com ele.
· kamo-internal
Dê ao trilho expandido uma barra de rolagem em vez de setas finais
As setas para cima/para baixo existem porque um trilho colapsado é 80px de azulejo sem espaço para gastar em qualquer outra coisa. Expandido, o trilho é 248px e as opções leia como uma lista — lá as setas são o pior instrumento: eles dizem apenas "mais dessa forma", onde uma barra de pergaminhos diz quanto mais e onde você já estão, e eles flutuam em cima de duas fileiras em vez de sentar ao lado Eles. Assim, o roller agora toma uma 'affordance', e NavPri pede a barra de rolagem sempre que o trilho for largo (expansão persistente ou um hover-peek vivo). Tudo o mais sobre a tira é inalterado em ambos os modos: agarrar-e-jogar, a roda, toque e rolagem da opção da página atual para visualização. Dois detalhes das forças do interruptor: - a borda macia fica para baixo, porque uma máscara pinta a barra de rolagem de um elemento juntamente com o seu conteúdo, e um desbotamento ao longo das extremidades da barra significa para acompanhar parece uma falha de renderização; - agora ignora uma imprensa que pousa na sarjeta. Chrome entrega ponteiro lá em baixo, então sem ele um arrastar do polegar movido a tira duas vezes — o navegador rolando-a uma maneira e o manipulador de panela o outro.
· kamo-internal
Use os logotipos reais do fornecedor de folha de pagamento nos cartões do provedor
Adiciona os dez ativos do fornecedor e os torna no lugar do marcador placeholders. Estes são WORDMARKS, não são ícones quadrados como o conjunto de provedores de email, e seus as proporções de aspecto variam de 0,72:1 (Dayforce, mais alto do que largo) a 6,2:1 (Paychex). Os cartões de e-mail 44px azulejo quadrado iria esmagar a maioria deles e encolher o largo uma mancha ilegível, e uma borda traçada ao redor de uma marca de palavra lê como uma erro em vez de uma moldura. Assim, a marca agora renderiza em uma HEIGHT fixa com largura automática e sua própria proporção de aspecto, capped para Paychex não pode dominar um cartão. Uma altura consistente através de dez formas diferentes é o que faz a grade parecer deliberada. Cada activo dimensões intrínsecas do viewBox são gravadas ao lado de seu caminho porque próximo/imagem precisa deles para reservar a caixa correta — entregando-lhe um quadrado para um ativo 6:1 reintroduz exatamente a distorção que isso evita. No cartão o logotipo leva sua própria linha acima do nome e chip de status, em vez do que sentar ao lado deles como um ícone faria. O logotipo é marcado decorativo onde quer que o nome do fornecedor seja renderizado ao lado dele, assim, um leitor de tela lê o nome uma vez ao invés de duas vezes; o ladrilho fica para GENERIC CSV, que é um estado de conexão em vez de um fornecedor e tem Nenhum activo.
· kamo-shared-library
Transportar se um ticket é um dos itens que o crachá de suporte conta
O navtop emblema e a lista de bilhetes estavam respondendo a diferentes perguntas e Ninguém sabia. O crachá conta itens aguardando atenção — esmagadoramente bilhetes que ninguém pegou ainda, o que é um fato sobre o TICKET. A lista mensagens de chat não lidas, um fato sobre sua CONVERSAÇÃO. Assim, o distintivo lido "5" sobre uma lista que não marcou nada, e os dois números não tinham nenhum visível relacionamento. needsAtention carrega o próprio teste de adesão do crachá por linha, para que a lista possa Marca exactamente o que o distintivo está a contar. "Alguém disse: algo que você não leu" ainda vale a pena mostrar, e não é o mesmo "Ninguém está a tratar disto".
· kamo-internal
Configuração do provedor de folha de pagamento, e mapear as pessoas para folha de pagamento na inscrição
Substitui a aba Visão geral HRS placeholder com a coisa real. A aba está agora "Configuração do fornecedor" e a tela é "Configuração do fornecedor do pagamento", seguindo o tela do provedor de e-mail em que é modelado — a tecla da aba permanece "overview" para que o menu de configurações, o cartão de lançamento e todos os favoritos existentes continuam funcionando. Construído para que um administrador de RH sem antecedentes técnicos possa responder a três perguntas sem perguntar a ninguém: é isso conectado, fez sincronizar, e é Qualquer coisa errada neste momento. - Cartas de provedor mostram o que cada fornecedor pode realmente fazer ANTES dos commits org, então escolher é uma comparação em vez de um palpite, e uma capacidade ausente é visível na frente em vez de descoberto no dia da folha de pagamento. - O formulário de credenciais é feito do esquema de campo do Backend. Adicionar um campo para um fornecedor é uma mudança Java em vez de um novo componente React — o tela de e-mail hand-writes um componente por provedor e tem doze. - Segredos nunca são enviados de volta para o navegador, apenas uma bandeira "isto está definido", e um caixa em branco significa inalterada em vez de clara. - O painel de saúde leva com as duas maneiras que as horas silenciosamente não conseguem alcançar folha de pagamentos — pessoas não mapeadas e códigos de ganhos não mapeados — porque ambos são invisível na altura e só aparece como uma queixa de pagamento. - Uma corrida parcial é a sua própria cor. "412 de 415 pessoas" não é um sucesso e não um fracasso, e tornando-o como se esconde três pessoas não pagas. - Pesquisa os nomes da pessoa e da solução, não um rasto. Os códigos de emissão vêm do servidor como tokens estáveis e estão localizados aqui. A inscrição ganha a coluna de mapeamento da folha de pagamento, porque inscrever alguém e Dizer à folha de pagamentos quem são é um trabalho. Auto-match propõe em e-mail de trabalho exato igualdade e um humano confirma — um nome não é uma identidade, e uma ligação errada envia as horas de uma pessoa para o pagamento de outra pessoa. Um prestador já reclamado O registo permanece visível, mas não pode ser escolhido. Essa tela também não tinha traduções em tudo e renderizado membro bruto de 19 dígitos IDs; ambos corrigidos, com a pesquisa do nome de exibição extraída para um gancho desde que cada O ecrã do cartão de tempo tem a mesma lacuna. Plataforma avançada config ganha os sete fornecedores de folha de pagamento onde Kamo detém um Registo de parceiros. Sem cartão para Dayforce, Workday ou UKG: emissão credenciais por cliente, ea tela renderiza um cartão para cada enum constante, então um para eles seria um formulário que nenhum operador poderia preencher. RoleRightType mirror ganhos 197, 198 e 199 — os dois primeiros existiram servidor-lado e já estavam faltando aqui, então checkRight não tinha nada digitado para referência.
· InitializerService
Índice e REVOGAR as tabelas de pagamento
O que Hibernate não pode expressar para as novas tabelas hr timecard payroll *. Dois revogos. PayrollDispatch e PayrollSyncIssue recusam atualizações e eliminam Java através de @PreUpdate/@PreRemove, mas as chamadas de entidade disparam apenas para linhas carregado em um contexto de persistência — em massa JPQL, deleteAllInBatch() e SQL nativo Passem por eles. Uma tentativa de transmissão de folha de pagamento é um evento monetário, e As provas de uma sincronização completa têm de sobreviver para serem provas. Dois índices parciais, que a entidade não pode transportar porque têm predicados: lista de trabalho da varredura (orgs com sincronização ativada e uma sincronização minoridade das linhas) e erros de sincronização por membro (linhas ERROR, em menor número pelo INFO aproximadamente pelo tamanho da lista). Aplicado e verificado contra Yugabyte.
· kamo-internal
Tamanho de um anexo pelo que a API do provedor realmente carrega
O compositor realizou cada DM social a um apartamento de 10 MB, que é a foto do Telegram Limite aplicado a quatro prestadores que não o partilham. Cada um agora tem o seu próprio teto, e dentro de um provedor cada tipo de mídia fica seu próprio onde a API divide-os: Foto do Telegram 10 MB, documento/vídeo/áudio de 50 MB (enviar foto contra enviar documento) Messenger 25 MB, o mesmo para cada tipo Instagram 8 MB imagem, 25 MB vídeo / áudio / arquivo Discórdia 8 MB (o teto de upload de bots) X sem anexos desconhecido 8 MB, o mais apertado do acima Estes são os limites da API para cada postagem do adaptador, NÃO do aplicativo de consumo do mesmo nome. Os dois diferem e importa: app do Messenger levantou arquivo compartilhamento para 100 MB enquanto sua API Enviar está documentada em 25 MB, e é da API número que decide se o cliente recebe o arquivo. Tamanho para o aplicativo figura teria o compositor aceitar algo Meta então se recusa, muito depois Disseram ao agente que se foi. X não recebe nenhum clipe de papel ao invés de um que recusa tudo: XAdapter's sendImage e sendMedia ambos caem para sendText — upload de mídia foi fora de escopo do v1 - assim um arquivo anexado não iria a lugar algum enquanto a legenda chegou Sozinho. As suas próprias capacidades de Provedor dizem o mesmo. A política do anexo cresce `maxBytesByClass` para isso, chaveado por um novo valor de quatro AnexmentClass (imagem/vídeo/áudio/arquivo) que corresponde à forma como os provedores dividem seus endpoints e como o MediaService encaminha mídia de saída. SVG é um arquivo em ambos.
· DaemonService
Trabalho de sincronização de folha de pagamento noturno
Drives TimecardService's ******************* que sincroniza Cada organização cuja próxima sincronização é devida. O Cron vive aqui em vez de no TimecardService porque essa implantação é RollingUpdate com maxSurge 1, então dois pods se sobrepõem em cada lançamento e um @Scheduled método dispara duas vezes — o que para uma sincronização folha de pagamento significa dois impulsos de As mesmas horas. DaemonService é réplicas 1, estratégia Recriar. Marcado às 03:00, quarenta minutos após as varreduras do cartão de tempo: aqueles fecham aberto muda e detecta exceções, e enviando horas para um provedor de folha de pagamento antes Eles têm executado iria transmitir números que estão prestes a mudar. Recusa-se a correr numa mlos em branco. interno-auth-secreto em vez de registrar um falso sucesso — uma sincronização de folha de pagamento que silenciosamente nunca funciona parece exatamente com uma que não encontrei nada para fazer, e a diferença é um período de pagamento de horas que nunca Chegou ao fornecedor.
· SecurityService
O limite de autorização para a configuração do provedor de folha de pagamento
Retransmite o novo ************* superfície e obriga quem pode Apanhem-no. TimecardService detém o motor e nenhuma sessão; isto detém o sessão e decide. SecurityService executa anyRequest().permitAll() com um manipulador que esquece a sua guarda não é fraco controlado — é descontrolado e acessível a partir da internet pública. Mapeado sob o prefixo /api/security/payroll existente de propósito: kamo-internal atinge-o através de uma rota BFF catch-all, e um novo prefixo 404 no navegador enquanto cada serviço é saudável e cada construção é verde. Quatro níveis: - MANAGEM PAYROLL PROVIDER (199) escreve credenciais e conecta ou desconecta OAuth. Esta é a capacidade de decidir ONDE as horas de uma organização são transmitida, e é por isso que é o seu próprio direito. - MANAGEM HRS SETTINGS (45) lê a ligação e a sua saúde. - MANAGEM TIMECARDS (183) cobre o mapeamento de funcionários e o histórico de sincronização. - FINALIZE PAY PERIODS (198) transmite um lote autorizado — o mesmo nível que Cometendo a exportação, porque é o mesmo ato. Test Connection fica com o direito de escrever em vez do lido: é um chamada de saída feita com credenciais armazenadas, e deixando qualquer um que possa ver o Page Fire dá-lhes uma maneira de sondar o vendedor de folha de pagamento da org. A troca OAuth NÃO envia um id org. TimecardService o tira de Estado assinado pelo HMAC, pelo que um código obtido para um inquilino não pode ser resgatado contra outro mesmo por um ouvinte segurando a direita em ambos. Adiciona put/delete ao TimecardServiceClient, que só tinha get/post.

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