Ir para o conteúdo
KAMOUniverse

Changelog

O que há de novo.

Cada melhoria para a plataforma, como ele envia.

  1. · kamo-shared-library

    Mostrar o que custaria desligar a abertura de falhas

    kamo.entitlement.fail-open concede qualquer aplicativo que a matriz do plano nunca menciona. Está. documentado como uma válvula temporária para o enchimento do catálogo — desligá-la uma vez que o matriz é semeada — mas nada poderia responder à pergunta que decide se desligar é seguro: quais inquilinos estão segurando quais aplicativos só por causa dele. Flipping ele cego teria tirado aplicativos de organizações ao vivo, com o primeiro ticket de suporte como notificação. fail OpenGrants resolve cada organização duas vezes, uma vez que concede aplicativos não mencionados e uma vez negando-os, e relata a diferença. Não lê o vivo bandeira, então ele dá a mesma resposta antes e depois do flip. A re-resolução passa pelo plano de resolução em vez do plano de identificação directamente, espelhando o retorno do caminho real para um planoObservação de código – caso contrário, uma concessão que De facto, sobreviveria é relatado como uma perda.

  2. · kamo-internal

    Mostrar se alguém está lá, e sua extensão

    Cada linha agora carrega um ponto de presença e palavra ao lado do nome, e sua extensão na linha de detalhe — então escolher uma pessoa já não significa escolher um nome e Esperando. Este é o escolhidor de pessoas no aplicativo, então ele cai no Gerente campo, assinadores de e-sign, adicionando pessoas a um chat e atribuindo suporte semelhante. Offline bate o que quer que tenha sido declarado. Availability status só se move ao iniciar sessão, o sign-out e uma alternância manual, para que alguém que nunca assina leia DISPONÍVEL indefinidamente — mostrar que, como ponto verde, estaria confiantemente errado a respeito do Uma coisa é o ponto. Desenhos não conectados como um anel de contorno em vez de um ponto preenchido, então ele lê como ausência em vez de como outra cor de status. Um directório que nunca teve presença — uma fonte de memória por detrás de «fetcher» — mostra nenhum indicador. Ausente é desconhecido, e desconhecido não deve dizer nada em vez de alegar que todos estão offline.

  3. · SecurityService

    Transportar disponibilidade, presença e extensão em uma linha de diretório

    Escolher uma pessoa é mais fácil quando a linha diz se eles estão lá e como Apanhem-nos, pois, cada um agora carrega o que pela última vez declararam, quer algo de o seu é realmente conectado, e sua extensão de trabalho quando eles têm um. A disponibilidade e a presença estão aqui porque ou só engana: Availability status só se move ao iniciar sessão, sair e alternar manualmente, então a O membro que nunca assina lê DISPONÍVEL indefinidamente. A presença é lida da PRESENÇA: {memberId} a chave MediaService escreve — a cross-service lido vale a pena nomear. As alternativas foram uma viagem de ida e volta HTTP para MediaService em cada tecla de uma pesquisa, ou presença de leitura no navegador, e o navegador não pode: ToolProviders renderiza o dock de ferramentas como um irmão do árvore segurando os provedores de presença, então um catador aberto dentro de um ticket de suporte A janela reportaria todos os colegas offline. Ambos os serviços compartilham o host Redis e base de dados. Uma pesquisa falha é lida como offline em vez de falhar na pesquisa.

  4. · BillingService

    Compre um bloco quando uma org optado ficar sem espaço

    Corre pouco depois da varredura noturna de fotos, porque é isso que produz o figura de uso que decide sobre — expandir-se contra o número de ontem iria comprar um bloquear um dia de atraso todas as vezes. Um quarteirão por corrida, nunca uma batida de captura, e pára no teto do proprietário. Se uma organização está muito além desse teto o resultado certo é que escreve parar e alguém olha para ele, não que a plataforma compra silenciosamente sua saída para o seu despesas. Expandir automaticamente sem teto como desativado em vez de ilimitado, porque um limite ausente é muito mais susceptível de ser um descuido do que uma intenção.

  5. · InitializerService

    Adicionar as colunas de expansão automática

  6. · kamo-shared-library

    Opt-in auto-expand com um teto

    Duas colunas sobre a assinatura que detém os blocos: se comprar outro um automaticamente quando a organização fica sem espaço, e o máximo que pode Nunca comprar. Off por defeito de propósito — silenciosamente aumentar a conta de alguém é pior do que um upload que falha com uma explicação, então ligá-lo é o proprietário negociando um pouco dinheiro para nunca ter que pensar sobre isso, e isso é apenas o seu comércio para Faça. Um limite máximo é necessário em vez de opcional: uma compra automática sem é um compromisso aberto com um processo que ninguém está a observar.

  7. · BillingService

    Deixe uma mudança de preço do catálogo realmente chegar ao Stripe

    Os preços são imutáveis e o mapeamento mantém uma linha por (org, tipo, código, ciclo) atrás de uma chave única, de modo que uma vez que um preço existiu nunca poderia mudar. A A edição de preços foi um no-op permanente na receita, e nada relatou isso. StripePriceReconciler compara cada preço mapeado com o que o catálogo agora diz e, quando solicitado, aponta o mapeamento em uma nova Stripe Price com o velho um arquivado — arquivado em vez de excluído, porque o Stripe continua a facturar preço arquivado para as assinaturas já nele contidas e recusa-o para novas, que é exactamente o comportamento desejado. A medição é levada através, então um medidor preço não pode voltar unmetered e silenciosamente parar o uso de faturamento. Ele deliberadamente não move os assinantes existentes para o novo preço. Silenciosamente re-privar um cliente ao vivo porque alguém editou uma linha de catálogo é uma carga ninguém autorizado; se avorá-los é uma decisão comercial, e O facto de nunca ter sido uma decisão foi o que faltava. A contagem ainda no preço antigo é relatado em vez disso. Relatório exposto-somente por defeito em GET ********************** com o reponto atrás de um POST explícito.

  8. · InitializerService

    Adicionar as colunas que fazem uma alteração de preço detectável

    Order(0), nullable, no backfill — um valor nulo lê como "não sabemos o que este preço foi criado com" e o reconciliador trata-o como desconhecido em vez de como deriva.

  9. · kamo-shared-library

    Gravar o que cada preço Stripe foi criado com

    O mapeamento armazenado apenas qual ID de preço usar, então uma mudança de preço do catálogo poderia nem sequer ser notado. garantirPlanPreços curto-circuito na existência da linha e a chave única proibiu um segundo, o que significava levantar um plano de $72 para $79 atualizou a página de marketing, a cotação no aplicativo e o plano DTO e mudou nada sobre o que alguém foi acusado — por nada relatar a divergência. unit amount cents e moeda dão ao reconciliador algo para comparar. Nullable e NULL esquerdo para linhas existentes: null significa "desconhecido", que é verdadeiro de cada linha anterior à coluna, e tratando desconhecido como desigual recriar todos os preços na propriedade na primeira corrida.

  10. · kamo-internal

    Digite a capacidade de armazenamento que o resumo agora retorna

    Mantém o contrato do cliente na etapa com BillingService, que agora relata o que o plano inclui, quais blocos foram comprados, o teto combinado e o fração usada ao lado dos bytes armazenados. O painel que o renderiza precisa de uma nova cópia, e o dicionário de tradução- kamo é mid-edit por outra sessão, então a UI pousa separadamente em vez de varrer No trabalho de voo naquele acordo.

  11. · BillingService

    Capacidade de comunicação juntamente com a utilização

    O painel de armazenamento apresentou os bytes armazenados contra nada — sem subsídio, nenhum percentual, nenhum dinheiro — assim um proprietário olhando para 400 GB não tinha nenhuma maneira de dizer se isso era confortável ou prestes a parar seus uploads. O seu primeiro o conhecimento de um problema teria sido um upload falhado. O resumo agora carrega o que o plano inclui, quais blocos foram comprados, o limite máximo combinado e a fracção utilizada, mais o tamanho do bloco e preço superfície pode dizer o que outro bloco daria e custaria sem codificação. Tudo isso vem das mesmas linhas de catálogo a taxa é cara.

  12. · kamo-shared-library

    Dar um efeito ao subsídio de armazenagem

    O armazenamento foi medido em dezenove domínios, por noite, com falha de construção teste de cobertura — e nada em qualquer lugar computou um subsídio ou recusou um byte. A figura de armazenamento do plano era dados que ninguém leu, e o Armazenamento Adicional add-on não teve nenhum efeito do produto: pagar nada mudou e não pagar o custo Nada. StorageQuotaService resolve o que uma organização pode deter — o plano por usuário Subsídios repartidos entre os seus lugares, acrescidos dos blocos que comprou — e ImageService recusa conteúdo que o excederia. O cheque senta-se após o dedup lookup, então re-anexar um arquivo que a plataforma já possui nunca é recusado para o espaço; apenas bytes genuinamente novos contam. Vive aqui em vez de em BillingService porque os serviços que escrevem bytes não podem cada um chamar uma API de faturamento em seu caminho de upload, e ele é injetado por campo em vez de através do construtor porque ImageService é montado por mão em vários lugares — um argumento construtor é a única edição que compila em toda parte, excepto nos testes e depois falha na construção da imagem. Duas maneiras deliberadas de estar errado. "GB" é lido como um gibibyte, que é o gerenciador de arquivos significa quando imprime GB e a leitura mais generosa. E um organização sem assinatura ao vivo, ou um serviço sem ligação de quotas, lojas exatamente como antes: este portão existe para segurar um cliente paga Eles compraram, não para transformar uma lacuna de faturamento em perda de dados. As leituras nunca são fechadas — encher o seu armazenamento pára de adicionar mais, nunca tira o que tem.

  13. · kamo-internal

    Diga ao solicitante se o seu agente está realmente lá

    Um fio silencioso não distingue "ninguém olhou para isto" do "meu agente" se afastou", e a pessoa que espera não pode dizer qual. O anúncio da conversação diz qual, e quando a resposta é "não agora" diz o que acontece em seguida — a mensagem é recebida e será respondida quando voltarem — antes do que deixar alguém a perguntar-se se ele aterrou. Colocado sob o chat em vez de no cabeçalho porque ele responde "é qualquer pessoa há?", que é a pergunta que está sendo feita durante a digitação, e não durante a digitalização do metadados do ticket. Respondedo ao servidor, não lido do mapa de presença do solicitante: transmissão por organização, assim um membro cliente-org sendo ajudado pelo provedor org veria o seu agente permanentemente offline. Um confiantemente errado "eles estão longe" é pior do que nenhum aviso. Pela mesma razão que uma pesquisa falhada mantém a última Resposta conhecida em vez de virar o aviso. Poluído em 30s e apenas enquanto a aba é visível. Disponibilidade é um conforto sinal, não um corretor um, e uma guia de fundo é ninguém olhando.

  14. · MediaService

    A reatribuição chega ao novo agente, e o solicitante é informado quem está lá

    A mudança não chegou a ninguém. atribuiçãoAbridoAt registros que um cliente colocou a conversa na tela, e é o que levanta um ticket no sign-in — mas Ainda tinha o selo do agente ANTERIOR, então o novo só conseguiu o impulso vivo se eles estavam online naquele segundo, e nada se estivessem Saiu. aplicarA atribuição agora o limpa sempre que o cessionário realmente muda, O que torna a entrega duradoura para quem a possui agora. - Está bem. informa à pessoa que pediu ajuda se A pessoa que os ajuda é acessível. Resposta do servidor de propósito: presença é transmitido por organização, assim um solicitante de cliente-org não pode ver um agente em o provedor org em tudo e o status leria "offline" para cada Conversa de "cross-org". Escopo às pessoas já na conversa — um id ticket é um UUID, não um segredo, e "é esta pessoa em sua mesa" não deve responder a um palpite.

  15. · kamo-internal

    Atribuir um pedido de chat e atribuir a partir da lista de tickets

    Duas lacunas, mesma causa — a designação foi tratada como algo que acontece com bilhete em vez de um pedaço de trabalho. O botão de atribuição foi escondido para pré-bilhetes. o caso em que levá-lo para a pessoa certa mais importa, não tinha como ser Entreguem-se. Essa exclusão data de quando um pedido de chat ainda não era "a bilhete real" e atribuição só aconteceu na conversão. Está atribuído agora, e o status sobrevive, então ainda pode ser convertido depois. E atribuir a necessidade de abrir a conversa primeiro, que é a forma errada para triagem de uma fila — a pessoa que trabalha na fila muitas vezes não é a pessoa que deve responder. A célula designada para a lista de tickets é agora o controle: hovering mostra atribuir ou reatribuir, clicando abre o mesmo selecionador do ticket usa a janela. O clique da linha ainda abre a conversa. A resposta altera a sua própria linha em vez de recarregar, por isso atribuir não mover o lugar do operador em uma fila filtrada, ordenada e páginada.

  16. · kamo-internal

    Motor de citação para o selecionador plano, combinando o que Stripe vai cobrar

    A aritmética por trás de um total em execução ao vivo, mantido à parte de qualquer componente assim que o os números podem ser testados diretamente. Ele espelha... exatamente: escala de add-ons por assento com contagem de cabeça, conta plana por unidades compradas no entanto muitas pessoas estão no plano, e medidas são nomeadas em vez de Adivinhei. Essa correspondência é a questão. Ambos os lugares a plataforma anteriormente citado um preço discordou com a carga — o assistente de ordem in-app adicionou cada add-on uma vez independentemente dos lugares, e da página pública faturado um conjunto de armazenamento em toda a organização por utilizador.

  17. · BillingService

    Faça um primeiro plano de compra e retorne os preços reais do plano

    Duas coisas impediram uma organização de comprar uma primeira assinatura. As listas de planos só foram acessíveis através do sub.marketId numa subscrição já realizada, então uma org com nenhum não poderia ver um plano em qualquer lugar no produto. GET /api/billing/markets/for-org resolve o mercado a partir do raiz do direito — o mesmo org cujo plano livre já fornece a sua linha de base, Assim, os planos e direitos não podem vir de catálogos diferentes. E o plano DTO lia... sempre povoa: são NULL para cada plano KamoCRM, porque o Seeder escreve preços em ********************** Por conseguinte, foi apresentada uma superfície de compra Nenhum preço, e a conta registrou uma taxa nula. Agora lê o preço linhas, com as colunas do plano como um retrocesso para catálogos que as carregam. Também expõe o tamanho da unidade adicional para que uma superfície de compra possa dizer "por 10 GB" sem codificar.

  18. · kamo-internal

    Portão ações pagas em um assento licenciado, no ponto de estrangulamento

    Quase todas as ações gateable no produto — discar uma extensão, e-mail um membro, abrir o assistente de IA, tocar uma gravação, iniciar uma conversa social — é um nu E o registo das ferramentas não tinha nenhum portão. Datar esses sites de chamadas um de cada vez nunca poderia ser completo: um expedidor adicionado mais tarde, ou simplesmente perdido, rotas em torno dele. O cheque agora vive em FerramentaWindowsContext's single tool:open handler, então cada chamador é coberto. As ações que nunca passam por uma janela de ferramentas são fechadas onde vivem: anexos (incluindo drag-drop e pasta, que são a mesma capacidade por outra rota), a criação de um chat em um grupo, e os pontos de entrada de reunião. Isso também resolve três inconsistências encontradas na auditoria. Dois dos três "convidar a reunião" pontos de entrada verificados organização. isMeet e o terceiro fez não; dois dos três pontos de entrada de e-mail verificados ACCESS MAIL e o terceiro não; e discar a extensão de um membro da lista não teve verificação VOIP de qualquer Gentil. Todos eles agora concordam. Capacidades por omissão bloqueadas — enquanto a primeira carga está em voo, se a chamada falha, e se uma infra- estrutura antiga omitir o campo. Supondo que "permitido" seria mão fora características pagas, que é o erro o caminho de direito já feito uma vez com seu padrão de falha aberta.

  19. · SecurityService

    Resolver o que um membro pode fazer, não apenas o que seu plano inclui

    Os subsídios de recurso descrevem um plano. Nunca descreveram este membro, porque o navegação por portas de console em org-level org.features — assim um membro sem licença em todos os aplicativos que a organização tinha direito, e o nível de membro licença que já existia na base de dados não teve efeito em nada. Capacidades de Membro é aquela resposta ausente, resolvida uma vez no servidor. Um membro sem assento mantém chão deliberado: conversa de texto com companheiros de equipe, apoio, o seu próprio perfil, o seu próprio faturamento — o suficiente para alcançar um ser humano e comprar um lugar para trás. Entrada-mensagem tradução fica em também, porque lendo o que Você foi enviado não está gastando. Tudo o que custa dinheiro para correr está fora. Uma licença de teste de org ativa todos na org em vez de apenas o assento Suporte. Uma org experimental é semeada com o único assento do plano livre, por isso teste em licenças teria significado o proprietário sozinho poderia avaliar o produto enquanto a equipa que eles convidaram para avaliar não viu nada. A autenticação nunca consultou o estado de faturamento e ainda Não. Perder um assento custa recursos, nunca acesso.

  20. · BillingService

    Contas por unidade de acréscimos por unidades compradas, não por cabeça

    Rola a nova quantidade adicional através da criação e atualização: um complemento FLAT agora toma a sua quantidade Listra do que a subscrição realmente comprou, então quatro 10 GB blocos de armazenamento faturam como quatro blocos em vez de uma vez por assento. Quantidades são filtradas contra os códigos adicionais resolvidos no caminho para dentro, então um corpo velho ou hostil não pode estacionar uma quantidade contra um código que não tinha direito comprar.

  21. · InitializerService

    Reprize Armazenamento Adicional em $2,50 por 10 GB, org-wide

    O add-on descreveu um pool compartilhado em toda a organização e foi então preçod USO BASED em $4 com "25 GB" declarado apenas em prosa. Nunca nada apresentou evento medidor de armazenamento, por isso ele não cobrado nada; e se tivesse sido anexado, Stripe rejeita uma quantidade sobre um preço medido, por isso a assinatura criaria Atirado. Enquanto isso, a página pública a tornou como "+$4 /usuário/mês". Agora é FLAT com unit size 10 em $2.50 — bloqueia o proprietário compra, preçod o O mesmo que muitas pessoas estão no plano. AddOnQuantityMigration adiciona os dois colunas nuláveis no Order(0), antes que qualquer corredor possa carregar uma entidade que mapeia Eles.

  22. · kamo-shared-library

    Dê um tamanho de unidade e uma quantidade de compra

    A unidade de um complemento só existiu como prosa dentro de sua descrição ("Cada unidade adiciona 25 GB") e como uma constante codificada no site de marketing, para que nada pudesse Acusá-lo. SubscriçãoAddOn ganhos unit size, e AccountSubscription ganhos addon quantities — quantas unidades de cada suplemento da subscrição comprada. ativo addon codes permanece a fonte de direito da verdade, então nada que só pergunta "é este aplicativo concedido" tem que saber que o mapa de quantidade existe. Também corrige a citação do assistente de ordem, que adicionou cada complemento uma vez sem assentos fator, embora a maioria seja PER SEAT: uma ordem de 25 lugares com quatro módulos foi Citado $31 contra o $775 Stripe iria cobrar. A citação agora segue o mesmo modelo de preço que a carga faz, e omite add-ons medidos em vez de adivinhar.

  23. · kamo-internal

    Escolha o agente para onde reatribuir um ticket, em vez de digitar seu id

    Atribuir e reatribuir abriu uma caixa de texto na qual digitou um ID de membro bruto — na qual significa já saber o id da pessoa que você queria, para uma ação cujo todo O propósito é encontrar o certo. Ele agora usa o MemberPickerDialog, o mesmo catador por trás do campo Manager em um perfil do membro e o único escolhidor de pessoas neste aplicativo. A sua pesquisa de pastas é executada server-side e correspondências no nome, alias, trabalho e conta e-mail, título do trabalho e departamento, então "ana emprestando" encontra a Ana em Empréstimo; cada linha carrega o suficiente para Diga a duas pessoas com o mesmo nome. A atribuição atual é fixada acima da resultados para que não seja perdido no meio da pesquisa. IDs de membros excedem o intervalo de inteiros exatos do JavaScript, então o ID permanece uma string de o diretório para o fio.

  24. · MediaService

    Endpoints para a entrega automática de entrada

    GET /sessions/chat/auto-open retorna as conversas de chat do cliente deste membro deve levantar; POST /sessions/{guid}/registros abertos automaticamente que ele fez. A durável contrapartida da transferência de apoio, e pela mesma razão: a decisão pertence à plataforma, não a uma página do navegadorStorage. A escrita é escopo para a própria linha de membros do chamador, então cliente de um membro nunca pode se aposentar de outro, e selos tempo servidor em vez de um cliente fornecido valor — a comparação é contra as datas das mensagens escritas por este mesmo relógio, e um navegador distorcido iria suprimir uma conversa para sempre ou Subi-lo infinitamente. ChatAutoOpenHqlTest analisa a consulta contra o modelo de entidade real e três predicados para o qual existe. Os dados da mola só validam @Query no contexto boot, então um erro de digitação apareceria como uma inicialização falhada ou um 500 em um caminho cada membro bate no login; o teste lê a consulta fora da anotação por reflexão para que não possa passar contra uma cópia velha.

  25. · kamo-shared-library

    Registro durável de uma conversa que o cliente levantou sozinho

    MediaSessionMember ganha AUTO OPENED AT, ao lado do msgIdLastViewed porque é o o mesmo grão — um fato sobre a relação de um membro com uma sessão. Aquele. responde "quanto leram"; este responde "já foram mostrados isto, não solicitado". Ele substitui uma sessão per-tabStorage flag, que não era um registro de nada: a o segundo dispositivo reabriu todas as conversas que o primeiro já tinha disparado, e A limpeza do armazenamento perdeu totalmente o fato. findChatSessionsToAutoOpen retorna as sessões segurando algo que o membro tem não ler onde algo chegou desde o último aumento — assim uma conversa deliberadamente deixado não lido pára de reabrir em cada carga, mas volta quando um Uma mensagem genuinamente nova. Somente sessões de bate- papo; tickets de suporte têm seus próprios Entrega. As mensagens do próprio membro estão excluídas e um msgIdLastViewed o ponteiro conta como não lido em vez de como capturado, porque uma sub- consulta escalar sobre uma linha desaparecida produz NULL e leria como permanentemente lido.

  26. · kamo-internal

    Renovar o painel de preferências

    Quatro dropdowns e um interruptor em um painel lavado de cima para baixo no inquilino cor em plena força, então cada controle lutou seu próprio fundo. Cada selecionar escondido três ou quatro opções atrás de um clique e repetiu as mesmas doze linhas de estilo borda. O painel é uma superfície agora, e a cor pertence ao que for selecionado. - Todas as opções estão no ecrã. Estas são quatro configurações com três a cinco valores curtos cada; mostrando- os é mais rápido de usar do que abrir um menu, e um componente Escolha substitui quatro blocos de estilo duplicado. - Tempo de lembrete e método compartilhar um cartão, porque nenhum dos dois significa nada sem o outro. Os deslocamentos do lembrete são mono, correspondendo ao resto do o tratamento do tempo. - O calendário padrão mostra a sua cor, por isso é reconhecido da mesma forma que está na barra lateral e na janela do evento em vez de apenas pelo nome. - O cabeçalho fica colocado enquanto o corpo rola — com quatro seções o título Caso contrário, vai embora. Estas configurações salvam na mudança sem nenhum botão para pressionar, e disse anteriormente Com um gira-discos. Existe agora um explícito "Salvado", que desaparece depois um par de segundos porque é um recibo para a mudança feita, não um Estado permanente do painel. Seções cambaleiam e as molas de confirmação; ambas são suprimidas sob prefere movimento reduzido. Cada string é uma chave existente. Verificado com uma construção de produção numa árvore de trabalho separada.

  27. · kamo-internal

    Substituir os spinners da caixa de correio por um esqueleto que se reúne

    Cada estado de carregamento em /mensagens era um Loader2 em um painel vazio de outra forma — o boot, a lista de mensagens, a árvore de pastas, o corpo da mensagem e a página seguinte tudo espalhe no lugar e não disse ao leitor nada sobre o que estava vindo. Eles agora desenham a coisa que está carregando. Cada substituto copia a geometria de o componente que ele representa, até o avatar 40px, o recuo da pasta e a linha de mensagens 104/120px medida a partir da marcação real, de modo que o layout não Movam-se quando os dados aterrarem. Uma ideia carrega o movimento: uma faixa de luz cruza cada placeholder esquerda para direita e começa uma batida mais tarde em cada linha abaixo dele, assim o destaque desce a pilha como uma única passagem diagonal em vez de cada linha a piscar no seu próprio relógio. As fileiras surgem na mesma ordem. A luz é misturada de -- acent-comms, o sotaque familiar do módulo de mensagens, por isso ele lê como este produto em vez de um gloss genérico. prefere o movimento reduzido Esboça tudo para continuar com as barras. Nenhuma chave nova da mensagem: os placeholders anunciam-se aos leitores do ecrã através das três cordas de carga que já estavam lá.

  28. · kamo-internal

    Adicionar e remover os convidados da janela de eventos

    A última coisa que o diálogo não pôde fazer. Podia mostrar quem já estava em um evento, mas não havia maneira de colocar alguém lá — o único controle convidado foi "atualizar e notificar", que reenvia pessoas que já foram convidadas. Os hóspedes são adicionados por e-mail, listados com o seu RSVP como um ponto colorido intitulado com o estado, e removido ao pairar. Enter adiciona um convidado em vez de submetendo a janela, porque você está no meio da lista em vez de terminar. A organizador é marcado e não pode ser confundido com um hóspede comum. A validação por e- mail é deliberadamente permissiva: o teste real é se o e- mail para ele salta, e um padrão mais rigoroso rejeita endereços que são perfeitamente válido. Apanha um erro óbvio, nada mais. O estado vazio convida em vez de pedir desculpas. Strings enviados antes disso no dicionário kamo-tradução- — next-intl lança sobre uma chave faltando de en.json e kamo-internal CI clones que em tempo de compilação, assim que aterrando este primeiro teria enviado uma página de calendário que acidentes. Verificado com uma compilação de produção numa árvore de trabalho separada; outra sessão Segura a fechadura na árvore.

  29. · EmailService

    Gerencie a lista de convidados de um evento

    A janela poderia mostrar quem já estava num evento mas nunca adicionar ou remover alguém; a única operação convidada foi re-notificar pessoas que estavam de alguma forma Já lá está. Eventos agora aceitar uma lista de convidados, substituído atacado em salvar. Substituir em vez disso do que mesclar, porque a janela possui a lista — um convidado removido tem de Desaparece aqui. Uma lista nula significa "não fornecida" e deixa os convidados sozinho, que é o que um cliente editando apenas um título envia. Duas coisas que um cliente não pode afirmar, então nem é lido fora do requisição: o RSVP, que é o convidado a dar, e a bandeira do organizador, que registra quem convocou a reunião. Ambos sobrevivem a uma edição — recriando as linhas em vez de actualizá- las reporiam cada resposta e tiravam a uma pessoa autorizada a cancelar o evento. Os hóspedes voltam em grupo. Uma visão mensal retorna cem eventos, e perguntando por evento é uma consulta por linha. Excluir um evento agora remove seus convidados primeiro. Eles carregam um não null chave estrangeira de volta para ele, então a exclusão ou órfão eles ou falhou uma vez A base de dados executou a referência.

  30. · kamo-shared-library

    Procura de convidados e delete-por-evento

    A janela do evento mostra com quem está um evento e o endpoint da lista devolve uma mês de eventos de cada vez. Pedir convidados por evento é uma consulta por linha; findByEventIdIn pergunta uma vez. deleteByEventId é a primeira metade de substituir uma lista de convidados por atacado, e de remover um evento sem filas órfãs que carregam um estrangeiro não null A chave de volta.

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