VsUpload

src/components/upload/Upload.vue + src/components/upload/ViewUpload.vue
Form High 23 usos

Componente completo de upload de arquivos com preview de imagens, barra de progresso por arquivo e global, suporte a múltiplos arquivos com limite configurável, validação de tamanho, legenda por imagem com emoji picker (emoji-mart-vue), e viewer fullscreen (ViewUpload). Dois modos de layout: simples (thumbnails + drop zone) e expandido 50/50 (preview grande + legenda à esquerda, grid à direita — ativo quando multiple=true AND limit != 500 AND !isInternalChatMessage AND !isIosDevice).

Tag no template: <upload> ou <Upload>, NUNCA <vs-upload>. O componente é importado e registrado localmente em todos os 23 usos. Padrão universal: automatic=true + singleUpload=true + fileName="file".

Arquivo Único

limit=1 + automatic=true + singleUpload=true. Padrão para upload de imagem de perfil, logo, ou mídia de template. maxSize e maxImageSize são props separadas — definir ambas quando há restrição de tamanho. @on-upload-start limpa o preview anterior.

Estado vazio

Adicionar Imagem

Arquivo selecionado + upload concluído

Maximum of files reached
Real ViewStockImages.vue:48

Múltiplos Arquivos (modo expandido)

Modo expandido 50/50 — ativo quando multiple=true AND limit != 500 AND !isInternalChatMessage AND !isIosDevice. Esquerda: preview grande da imagem selecionada + input de legenda + emoji picker. Direita: grid de thumbnails + drop zone.

Selecionar Anexo
Real chat-attendance/Index.vue:1054

Chat Interno (isInternalChatMessage)

isInternalChatMessage=true desativa o layout expandido e reduz o tamanho dos thumbnails — essencial no chat interno para não ocupar espaço excessivo. Sem @change-caption — chat interno não suporta legendas.

doc.pdf
Escolher Documento
Real InternalChatMessage.vue:171

Upload de Mídia para Template

accept calculado dinamicamente a partir do tipo do header do template (IMAGE, VIDEO, DOCUMENT). limit=1 + singleUpload + automatic — padrão para inputs de upload dentro de popups de seleção de template.

Selecione Imagem
accept: .jpg, .jpeg, .png, .gif
Real SelectMessageTemplate.vue:92

Sem Botão de Upload (controle externo)

showUploadButton=false oculta os botões de upload — o pai chama $refs.uploadComponent.upload('all') manualmente. Padrão para flows com confirmação antes do envio. Nota: sem uso real — todos os usos reais usam automatic=true.

relatorio.xlsx
Selecionar Arquivo
Upload disparado pelo pai: $refs.uploadComponent.upload('all')
Sintético synthetic

Com Dados Extras no FormData

Prop data envia campos adicionais junto com o arquivo no FormData — útil para associar o upload a um registro (orderId, type). Sem uso real no admin.

FormData enviado:
  • file: [arquivo selecionado]
  • orderId: "ORD-123456" (via prop data)
  • type: "attachment" (via prop data)
Sintético synthetic

API

<!-- Padrão universal: automatic + singleUpload + fileName="file" -->
<upload
  :action="uploadApiUrl"
  fileName="file"
  :headers="{ Authorization: 'Bearer ' + bearer }"
  text="Selecionar Arquivo"
  automatic
  :limit="10"
  :multiple="true"
  :single-upload="true"
  :maxSize="10"
  :maxImageSize="10"
  ref="uploadComponent"
  @on-success="successUpload"
  @on-error="errorUpload"
  @on-delete="deleteUpload"
  @change-caption="watchCaption"
  @on-upload-start="onUploadStart"
/>

Props

NomeTipoDefaultObrig.Descrição
fileNameStringnullNome do campo no FormData. Obrigatório quando action é definido.
textString"Upload File"Texto exibido na zona de drop.
textMaxString"Maximum of files reached"Texto quando limite é atingido.
limitNumber|StringnullMáximo de arquivos. 500 = desativa modo expanded.
actionStringnullURL para upload via axios. Sem ela, gerencia arquivos localmente.
headersObjectnullHeaders HTTP adicionais (ex: Authorization).
dataObjectnullDados extras adicionados ao FormData junto com o arquivo.
automaticBooleanfalseUpload automático ao selecionar. Todos os usos reais usam true.
multipleBooleanfalseMúltiplos arquivos. Ativa modo expanded quando combinado com limit != 500.
showUploadButtonBooleantrueExibe botões de upload por arquivo e "upload all".
singleUploadBooleanfalseUma requisição por arquivo (vs. todos juntos).
maxSizeNumber10Tamanho máximo em MB para não-imagens.
maxImageSizeNumber10Tamanho máximo em MB para imagens. Prop separada de maxSize.
isInternalChatMessageBooleanfalseDesativa modo expanded e reduz thumbnails.
isInstagramBooleanfalseRestringe tipos e tamanhos da API Instagram (8MB imagens, 25MB outros).
isMessengerBooleanfalseMesmas restrições do Instagram.

Eventos

NomePayloadDescrição
change(inputValue, filesx)Ao selecionar arquivos.
update:vsFileStringCompatível com .sync.
on-successAxiosResponse + { srcs }Upload concluído com sucesso.
on-errorObject | AxiosErrorErro no upload ou validação. Validação: { data: { message, time } }.
on-delete{ method: 'number'|'all', file? }Arquivo removido.
on-upload-startUpload iniciado.
change-captionObjectLegenda alterada ou upload automatic+singleUpload concluído. Payload varia: { data: itemsLoaded } (digitação) ou AxiosResponse (upload).

Dependências

  • Vuesax: vs-row, vs-col, vs-input
  • Custom: ViewUpload (interno — viewer fullscreen), VsDropdown + VsDropdownMenu (emoji picker)
  • External: axios (upload HTTP), emoji-mart-vue/Picker (emoji picker — set apple, locale br, perLine 11)

Onde é usado

  • src/views/chat-attendance/Index.vue
  • src/layouts/components/internal-chat-message/InternalChatMessage.vue
  • src/layouts/components/internal-tenant-chat/InternalTenantChatMessage.vue
  • src/components/meta/SelectMessageTemplate.vue
  • src/components/stock-image-card/ViewStockImages.vue
  • + 18 outros arquivos (23 usos totais)