.implementado itens desativados nos selects

This commit is contained in:
Luiz Silva 2026-06-16 18:14:15 -03:00
parent 900a5f3c5c
commit 84383c3bbf
18 changed files with 1645 additions and 1567 deletions

View file

@ -6,6 +6,7 @@
:items="itens"
item-title="rotulo"
item-value="chave"
:item-props="itemProps"
:loading="carregando"
:disabled="carregando"
:menu-props="{ maxHeight: 320, zIndex: 99999 }"
@ -101,7 +102,14 @@ export default defineComponent({
{ deep: true },
)
return { attrs, emit, localValue, itens, carregando }
// Deriva item-props para desativar itens cujas chaves estejam em opcoes.desativado
const itemProps = computed(() => {
const desativados = props.opcoes?.desativado
if (!desativados || desativados.length === 0) return undefined
return (item: ItemSelecao) => ({ disabled: desativados.includes(item.chave) })
})
return { attrs, emit, localValue, itens, carregando, itemProps }
},
})
</script>

View file

@ -6,6 +6,7 @@
:items="itens"
item-title="rotulo"
item-value="chave"
:item-props="itemProps"
:loading="carregando"
:disabled="carregando"
:menu-props="{ maxHeight: 320, zIndex: 99999 }"
@ -90,7 +91,14 @@ export default defineComponent({
void carregarItens()
})
return { attrs, emit, localValue, itens, carregando }
// Deriva item-props para desativar itens cujas chaves estejam em opcoes.desativado
const itemProps = computed(() => {
const desativados = props.opcoes?.desativado
if (!desativados || desativados.length === 0) return undefined
return (item: ItemSelecao) => ({ disabled: desativados.includes(item.chave) })
})
return { attrs, emit, localValue, itens, carregando, itemProps }
},
})
</script>

View file

@ -6,6 +6,7 @@
import type { zCoordenadas } from "p-comuns"
import type z from "zod"
import type { OpcoesSelecaoBase } from "./tiposSelecao"
/**
* Contrato padrão de uma entrada.
@ -124,73 +125,11 @@ export type PadroesEntradas = {
}
>
selecao: tipoPadraoEntrada<
string | null | undefined,
{
/**
* Carrega os itens da seleção (sincrono ou async).
* - Cada item precisa ter uma chave estável (value) e um rótulo (title).
*/
itens: () =>
| { chave: string; rotulo: string }[]
| Promise<{ chave: string; rotulo: string }[]>
/** Seleção simples — ver {@link OpcoesSelecaoBase} para opções disponíveis. */
selecao: tipoPadraoEntrada<string | null | undefined, OpcoesSelecaoBase>
/** Se true, mostra ícone para limpar o valor (Vuetify clearable). */
limpavel?: boolean
/** Estado de erro (visual). */
erro?: boolean
/** Mensagens de erro. */
mensagensErro?: string | string[]
/** Texto de apoio. */
dica?: string
/** Mantém a dica sempre visível. */
dicaPersistente?: boolean
/** Densidade do campo (Vuetify). */
densidade?: import("../../tipos").CampoDensidade
/** Variante do v-text-field (Vuetify). */
variante?: import("../../tipos").CampoVariante
}
>
selecaoMultipla: tipoPadraoEntrada<
string[] | null | undefined,
{
/**
* Carrega os itens da seleção (sincrono ou async).
* - Cada item precisa ter uma chave estável (value) e um rótulo (title).
*/
itens: () =>
| { chave: string; rotulo: string }[]
| Promise<{ chave: string; rotulo: string }[]>
/** Se true, mostra ícone para limpar o valor (Vuetify clearable). */
limpavel?: boolean
/** Estado de erro (visual). */
erro?: boolean
/** Mensagens de erro. */
mensagensErro?: string | string[]
/** Texto de apoio. */
dica?: string
/** Mantém a dica sempre visível. */
dicaPersistente?: boolean
/** Densidade do campo (Vuetify). */
densidade?: import("../../tipos").CampoDensidade
/** Variante do v-text-field (Vuetify). */
variante?: import("../../tipos").CampoVariante
}
>
/** Seleção múltipla — ver {@link OpcoesSelecaoBase} para opções disponíveis. */
selecaoMultipla: tipoPadraoEntrada<string[] | null | undefined, OpcoesSelecaoBase>
confirmacao: tipoPadraoEntrada<
boolean,

View file

@ -0,0 +1,48 @@
/**
* Tipos específicos dos componentes de seleção (simples e múltipla).
* Extraído de tiposEntradas.ts para respeitar o limite de 250 linhas.
*/
import type { CampoDensidade, CampoVariante } from "../../tipos"
/** Item padrão dos componentes de seleção. */
export type ItemSelecaoOpcoes = { chave: string; rotulo: string }
/** Carregador de itens (síncrono ou async). */
export type CarregadorItens = () => ItemSelecaoOpcoes[] | Promise<ItemSelecaoOpcoes[]>
/** Opções compartilhadas entre seleção simples e múltipla. */
export type OpcoesSelecaoBase = {
/**
* Carrega os itens da seleção (sincrono ou async).
* - Cada item precisa ter uma chave estável (value) e um rótulo (title).
*/
itens: CarregadorItens
/**
* Lista de chaves (valores de `chave`) que devem aparecer desativadas.
* Os itens aparecerão visíveis no menu, mas não poderão ser selecionados.
*/
desativado?: string[]
/** Se true, mostra ícone para limpar o valor (Vuetify clearable). */
limpavel?: boolean
/** Estado de erro (visual). */
erro?: boolean
/** Mensagens de erro. */
mensagensErro?: string | string[]
/** Texto de apoio. */
dica?: string
/** Mantém a dica sempre visível. */
dicaPersistente?: boolean
/** Densidade do campo (Vuetify). */
densidade?: CampoDensidade
/** Variante do v-text-field (Vuetify). */
variante?: CampoVariante
}