Vista Kiosk
Visão geral
A vista Kiosk é uma interface para tablet/ecrã tátil pensada para operadores de chão de fábrica. Após autenticação por PIN, o operador vê uma grelha de cartões de trabalho (opcionalmente filtrados pela sua identidade — ver Filtros por Utilizador abaixo); cada cartão contém componentes ao vivo (temporizadores, contadores, botões de workflow) que o operador utiliza durante o turno.
Use-a quando:
- Um único tablet é partilhado por vários operadores, cada um autenticado por PIN no início do seu turno.
- Os cartões representam o trabalho do operador (encomendas, tarefas, máquinas) — não um menu de retalho.
- Os workflows disparados a partir do cartão devem ser atribuídos ao operador, e não ao utilizador ao nível da organização com sessão iniciada no tablet.
Conceitos
Subutilizador
Uma linha numa Feature configurada que representa um operador. O
subutilizador tem um PIN (tipicamente 4 dígitos, guardado em texto simples —
segurança de nível kiosk) e um setor/função opcionais. A identidade é
propagada aos descendentes através de um KioskSubuserScope, de modo a que
as ações de workflow gravem _metadata.subuserId nos registos que criam.
Separadores
Categorização da grelha de trabalho. Os separadores são obrigatórios: um
kiosk sem separadores não apresenta dados nenhuns, apenas um estado vazio
("Sem tabs configuradas") que pede ao admin que adicione pelo menos um.
Cada separador tem um FilterGroup canónico aplicado aos cartões visíveis. O
índice do separador ativo vive em KioskViewState.activeTabIndex e é
atualizado ao tocar num separador.
Modo de ação do cartão
Configurável por vista (KioskCardConfig.actionMode):
| Modo | Comportamento ao tocar no cartão |
|---|---|
editForm (predefinição) | Abre o formulário de edição da linha |
panel | Abre uma folha inferior com os workflows configurados |
liveComponents | Sem ação ao toque — o operador interage apenas com os componentes ao vivo dentro do cartão |
Botão de turno (entrada/saída)
Um botão de primeira classe na barra superior que alterna entre "Marcar
entrada" e "Marcar saída" com base no último registo de assiduidade do
operador. O toque dispara um workflow configurado pelo admin (tipicamente
create_record sobre uma Feature de assiduidade). Sem entidade nova —
Configuration Over Code pura.
Chips de temporizadores ativos
A barra superior mostra chips com os temporizadores de tarefa que o operador em sessão tem a correr - os iniciados a partir do componente Timer numa das vistas embebidas nos separadores. Ficam de fora o contador de ocioso (contabilidade interna) e o perfil de temporizador configurado no próprio kiosk, que continua a viver no botão de temporizador dedicado da barra. Sem operador em sessão, ou sem nenhum temporizador de tarefa a correr, os chips desaparecem por completo.
Até 2 chips ficam visíveis, cada um com a etiqueta e o tempo decorrido a avançar; tocar no próprio chip para o temporizador, sem confirmação. A partir do 3.º temporizador, os chips colapsam num botão "+N" que abre o diálogo "Os meus temporizadores" com a lista completa e um botão de parar por linha. Um temporizador aberto há mais de 12 horas troca o ícone de parar por um ícone de aviso — tanto no chip como na lista — sinal de que ficou esquecido a correr e entrou em recuperação.
Layout (após o PIN)
┌──────────────────────────────────────────────────────────────┐
│ KioskTopBar avatar · nome/sector [chips] [+N] [shift] [logout] │
├──────────────────────────────────────────────────────────────┤
│ KioskTabBar [ Tab A ] [ Tab B ] [ Tab C ] (scrollable) │
├──────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Card 1 │ │ Card 2 │ │ Card 3 │ <- card grid │
│ │ timer │ │ timer │ │ timer │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │
└──────────────────────────────────────────────────────────────┘
Configuração de admin
Abra a caixa de diálogo de configuração da vista kiosk (contexto de admin). O formulário está dividido em secções:
Feature
Escolha a Feature cujas linhas são subutilizadores do kiosk, depois mapeie as colunas:
| Definição | Obrigatório | Descrição |
|---|---|---|
| Feature de Utilizadores Kiosk | sim | Onde vivem as linhas de subutilizador |
| Campo de ID do Utilizador | sim | Identificador estável (gravado em _metadata.subuserId) |
| Campo de Nome de Utilizador | sim | Nome de exibição mostrado na barra superior |
| Campo de Senha | sim | O PIN (texto simples — nível kiosk) |
| Campo de Setor | opcional | Setor/função para agrupamento e filtros por subutilizador |
Filtros por Utilizador
Aparece assim que a secção Feature acima tiver uma feature selecionada.
Mapeie uma coluna na Feature de trabalho para um valor sentinela resolvido
no login: kiosk_user_id / kiosk_username / kiosk_sector. As linhas são
filtradas para corresponder ao subutilizador ativo em tempo de execução.
Cartões
- Campos a Mostrar — que colunas da feature aparecem no corpo do cartão.
- Filtros — filtros ao nível do admin (
FilterGroupcanónico), aplicados antes dos filtros por separador e por subutilizador. - Acção ao tocar no card — escolha um dos 3 modos acima. Quando
panelestá selecionado, configure a lista de workflows mostrada na folha.
Separadores
Adicione, edite, reordene, ou remova separadores. Um kiosk novo nasce sem separadores nenhuns e só mostra conteúdo depois de se adicionar o primeiro. Cada separador abre uma caixa de diálogo com:
| Campo | Descrição |
|---|---|
| Nome da tab | Rótulo mostrado na barra de separadores |
| Feature | A feature cujos dados a tab mostra - lista as features do workspace atual mais as partilhadas de outros workspaces da mesma organização, ordenadas alfabeticamente e identificadas com o nome do workspace entre parênteses |
| Vista | O tipo de vista que renderiza a feature (cartões, tabela, formulário, etc.); kiosk dentro de kiosk não é permitido |
| Identidade do operador | Só aparece depois de escolher uma Feature - mapeia colunas para o ID, o nome e o setor do operador, usados para pré-preencher um registo novo (aplica-se a vistas de formulário, com login de operador ativo); se a feature da tab tiver colunas elegíveis (Lista Ligada de seleção única cuja feature-alvo tem uma coluna Operador), aparece também Coluna para o colaborador |
Depois de escolher a Feature, o diálogo mostra ainda a subsecção Filtro do operador, que lista as colunas elegíveis da feature da tab:
- colunas do tipo Operador - comparadas diretamente com o operador autenticado;
- colunas do tipo Lista Ligada de seleção única cuja feature-alvo tem uma coluna Operador - comparadas com o colaborador mapeado.
Sem operador autenticado, ou com um operador sem colaborador associado, a tab mostra 0 registos e apresenta um aviso discreto no topo. O mesmo aviso aparece também quando é a Coluna para o colaborador (linha "Identidade do operador" acima) que fica sem mapeamento - o carimbo é omitido (coluna vazia) no registo criado, não só o filtro que fica sem efeito.
A seleção de campos, os filtros e a ação ao tocar no card configuram-se na própria vista da tab (ver Cartões acima), não neste diálogo.
Botão de Turno
Três menus pendentes ligam o botão de turno: uma Feature (onde as linhas de check_in/check_out são guardadas), a coluna que guarda o tipo, e o workflow que realiza a escrita. Deixar qualquer um em branco oculta o botão.
O menu de Feature lista as features do workspace atual e as features partilhadas de outros workspaces da mesma organização, ordenadas alfabeticamente; uma feature partilhada de outro workspace aparece com o nome do workspace entre parênteses (ex.: "Assiduidade (Produção)").
Fluxo de autenticação
- O operador chega à vista kiosk (
type: 'kiosk'). O router redireciona utilizadores comkiosk: trueno seuuserConfigpara o seu rail configurado; a navegação para fora é revertida. - A vista obtém a Feature de kiosk configurada e lista os subutilizadores
como cartões em
KioskUserGrid. - Tocar num cartão →
KioskPinDialog(modeloAdaptiveDialog). - Insere o PIN. Se corresponder, a caixa de diálogo despacha
SubuserLoggedInparaKioskSessionBloce fecha. - A vista é reconstruída envolvida em
KioskSubuserScope. Os componentes descendentes (botões de workflow, ação create_record) leem o subutilizador ativo viaKioskSubuserScope.of(context). - O logout através do botão da barra superior despoleta uma caixa de diálogo de confirmação e, uma vez confirmado, devolve a vista à grelha de subutilizadores para o próximo operador.