mad-attach-btn
Botão compacto de anexo para toolbar.
Botao compacto de anexar arquivos (icone clip) com chips de preview. Ideal para toolbars de composer/reply de mensagens, comentarios, chats — onde nao se quer um dropzone grande. Reusa a mesma API de storage do <mad-multi-file-field>, entao form->save() persiste automaticamente.
Props
| Prop | Tipo | Default | Descricao |
|---|---|---|---|
| name | string | '' | Nome do campo (obrigatorio) |
| accept | string | '*' | MIME types ou extensoes: image/*,.pdf |
| multiple | bool | false | Aceita varios arquivos (gera name[]) |
| icon | string | 'paperclip' | Icone Lucide do botao |
| max-files | int | 0 | Maximo de arquivos (0 = ilimitado) |
| max-size | int | 0 | Tamanho maximo por arquivo em KB (0 = ilimitado) |
| disabled | bool | false | Desabilita o botao |
| storage | string | '' | disk (filesystem) ou db (BLOB no banco) |
| folder | string | 'uploads' | Diretorio destino (storage="disk") |
| mode | string | 'comma' | comma (virgula) ou table (tabela relacionada) |
| model | string | '' | Classe do model Eloquent (mode=table) |
| foreign-key | string | '' | Coluna FK na tabela filha (mode=table) |
| path-column | string | '' | Coluna do caminho/BLOB na tabela filha (mode=table) |
| name-column | string | '' | Coluna do nome original (mode=table) |
| file-name | string | 'prefix' | Modo do nome: prefix, unique, original, record |
| class | string | '' | Classes CSS extras |
| attrs | string | '' | Atributos HTML extras no input |
Uso basico — anexo unico no disco
<mad-attach-btn name="anexo" storage="disk" folder="uploads/docs" />
Multiplos arquivos em toolbar de reply
<div class="mad-mail-reply-actions">
<mad-btn type="submit" variant="primary" icon="send" size="sm">Enviar</mad-btn>
<mad-attach-btn name="reply_anexos" multiple
storage="disk" folder="uploads/messages" mode="table"
model="SystemMessageAttachment" foreign-key="system_message_id"
path-column="file_path" name-column="file_name"
accept="*" :max-files="10" />
</div>
Modo virgula (caminhos numa unica coluna)
<mad-attach-btn name="anexos" multiple
storage="disk" folder="uploads/comentarios" mode="comma"
accept=".pdf,.doc,image/*" :max-files="5" />
$this->form->save($comentario);
// $comentario->anexos = 'uploads/comentarios/a.pdf,uploads/comentarios/b.jpg'
Restringir tipos e quantidade
<mad-attach-btn name="imagens" multiple
accept="image/*" :max-files="3"
storage="disk" folder="uploads/fotos" mode="comma" />
Icone customizado
<mad-attach-btn name="anexo" icon="image" accept="image/*"
storage="disk" folder="uploads/imgs" />
Persistencia automatica via form->save()
O <mad-attach-btn> com storage se registra no MadFormRegistry como multi-file — exatamente como o <mad-multi-file-field>. Nao ha codigo extra no controller:
use Illuminate\Support\Facades\DB;
public function onSave(): MadResponse
{
try {
DB::connection('business')->transaction(function () {
$msg = SystemMessage::findOrNew($this->registroId);
$this->form->save($msg); // salva campos + anexos automaticamente
});
return (new MadResponse())
->toast('Enviado!', 'success')
->closeDrawer();
} catch (\Throwable $e) {
return MadMessage::error('Erro', $e->getMessage());
}
}
Quando usar <mad-attach-btn> vs <mad-file-field> / <mad-multi-file-field>
| Cenario | Usar |
|---|---|
| Toolbar compacta (composer, reply, chat, comentario) | <mad-attach-btn> |
| Botao discreto ao lado de Enviar/Salvar | <mad-attach-btn> |
| Form principal com upload destacado, label e hint | <mad-multi-file-field> |
| Dropzone grande com drag-and-drop visivel | <mad-multi-file-field> |
| Upload unico com label e visualizacao de arquivo | <mad-file-field> |
| Imagem com crop/camera | <mad-image-field> |
Resumindo: attach-btn e a versao "icone na toolbar". As outras tres sao campos de formulario com label e dropzone.
NUNCA fazer
{{-- ERRADO: input file nativo dentro de toolbar --}}
<button><i data-lucide="paperclip"></i></button>
<input type="file" name="anexo" multiple style="display:none">
{{-- CERTO --}}
<mad-attach-btn name="anexo" multiple storage="disk" folder="uploads" />
{{-- ERRADO: usar mad-multi-file-field grande dentro de uma toolbar de reply --}}
<div class="reply-actions">
<mad-btn type="submit">Enviar</mad-btn>
<mad-multi-file-field name="anexos" label="Anexos" storage="disk" folder="uploads" />
</div>
{{-- CERTO: attach-btn e compacto, cabe na toolbar --}}
<div class="reply-actions">
<mad-btn type="submit">Enviar</mad-btn>
<mad-attach-btn name="anexos" multiple storage="disk" folder="uploads" />
</div>
{{-- ERRADO: processar $_FILES manualmente --}}
move_uploaded_file($_FILES['anexo']['tmp_name'], $dest);
{{-- CERTO: declarar storage no Blade e deixar form->save() resolver --}}
<mad-attach-btn name="anexo" storage="disk" folder="uploads" />
$this->form->save($record);
{{-- ERRADO: esquecer storage — arquivo nao e persistido automaticamente --}}
<mad-attach-btn name="anexo" multiple />
{{-- CERTO --}}
<mad-attach-btn name="anexo" multiple storage="disk" folder="uploads" mode="comma" />
{{-- ERRADO: mode="table" sem model/foreign-key/path-column --}}
<mad-attach-btn name="anexos" multiple storage="disk" folder="uploads" mode="table" />
{{-- CERTO: modo tabela exige model + FK + colunas --}}
<mad-attach-btn name="anexos" multiple storage="disk" folder="uploads/msg" mode="table"
model="SystemMessageAttachment" foreign-key="system_message_id"
path-column="file_path" name-column="file_name" />