feat: download one contact as vcard (#6747)

This commit is contained in:
Alexis Saettler
2023-07-13 13:25:11 +02:00
committed by GitHub
parent 560622420d
commit dd273982c5
30 changed files with 139 additions and 36 deletions
@@ -0,0 +1,42 @@
<?php
namespace App\Domains\Contact\ManageContact\Web\Controllers;
use App\Domains\Contact\Dav\Services\ExportVCard;
use App\Http\Controllers\Controller;
use App\Models\Contact;
use App\Models\Vault;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Str;
class ContactVCardController extends Controller
{
public function download(Request $request, Vault $vault, Contact $contact)
{
$cardData = $this->exportVCard($vault->id, $contact->id);
$name = Str::of($contact->name)->slug(language: App::getLocale());
return Redirect::back()->with('flash', [
'data' => $cardData,
'filename' => "$name.vcf",
]);
}
/**
* Get the new exported version of the object.
*/
protected function exportVCard(string $vaultId, string $contactId): string
{
$vcard = app(ExportVCard::class)->execute([
'account_id' => Auth::user()->account_id,
'author_id' => Auth::id(),
'vault_id' => $vaultId,
'contact_id' => $contactId,
]);
return $vcard->serialize();
}
}
@@ -88,6 +88,10 @@ class ContactShowViewHelper
'vault' => $contact->vault_id,
'contact' => $contact->id,
]),
'download_vcard' => route('contact.vcard.download', [
'vault' => $contact->vault,
'contact' => $contact,
]),
],
];
}
+2 -1
View File
@@ -380,6 +380,7 @@
"Dog": "কুকুর",
"Done.": "সম্পন্ন.",
"Download": "ডাউনলোড করুন",
"Download as vCard": "vCard হিসেবে ডাউনলোড করুন",
"Drank": "পান",
"Drove": "চালান",
"Due and upcoming tasks": "প্রাপ্য এবং আসন্ন কাজ",
@@ -638,8 +639,8 @@
"New Password": "নতুন পাসওয়ার্ড",
"New to Monica?": "মনিকা নতুন?",
"Next": "পরবর্তী",
"Nickname": "ডাকনাম",
"nickname": "ডাকনাম",
"Nickname": "ডাকনাম",
"No cities have been added yet in any contacts addresses.": "কোনো পরিচিতির ঠিকানায় এখনো কোনো শহর যোগ করা হয়নি।",
"No contacts found.": "কোন পরিচিতি পাওয়া যায়নি.",
"No countries have been added yet in any contacts addresses.": "কোনো পরিচিতির ঠিকানায় এখনো কোনো দেশ যোগ করা হয়নি।",
+2 -1
View File
@@ -380,6 +380,7 @@
"Dog": "gos",
"Done.": "Fet.",
"Download": "descarregar",
"Download as vCard": "Descarrega com a vCard",
"Drank": "Bevia",
"Drove": "Va conduir",
"Due and upcoming tasks": "Tasques pendents i properes",
@@ -638,8 +639,8 @@
"New Password": "nova contrasenya",
"New to Monica?": "Nou a la Mònica?",
"Next": "Pròxim",
"Nickname": "Pseudònim",
"nickname": "sobrenom",
"Nickname": "Pseudònim",
"No cities have been added yet in any contacts addresses.": "Encara no s'ha afegit cap ciutat a les adreces de cap contacte.",
"No contacts found.": "No s'han trobat contactes.",
"No countries have been added yet in any contacts addresses.": "Encara no s'ha afegit cap país a les adreces de cap contacte.",
+2 -1
View File
@@ -380,6 +380,7 @@
"Dog": "Hund",
"Done.": "Færdig.",
"Download": "Hent",
"Download as vCard": "Download som vCard",
"Drank": "Drak",
"Drove": "Kørte",
"Due and upcoming tasks": "Forfaldne og kommende opgaver",
@@ -638,8 +639,8 @@
"New Password": "nyt kodeord",
"New to Monica?": "Ny for Monica?",
"Next": "Næste",
"Nickname": "Kaldenavn",
"nickname": "kaldenavn",
"Nickname": "Kaldenavn",
"No cities have been added yet in any contacts addresses.": "Ingen byer er blevet tilføjet endnu i nogen kontakts adresser.",
"No contacts found.": "Ingen kontakter fundet.",
"No countries have been added yet in any contacts addresses.": "Ingen lande er blevet tilføjet endnu i nogen kontakts adresser.",
+2 -1
View File
@@ -380,6 +380,7 @@
"Dog": "Hund",
"Done.": "Erledigt.",
"Download": "Herunterladen",
"Download as vCard": "Als vCard herunterladen",
"Drank": "Getrunken",
"Drove": "Gefahren",
"Due and upcoming tasks": "Fällige und anstehende Aufgaben",
@@ -638,8 +639,8 @@
"New Password": "Neues Passwort",
"New to Monica?": "Neu bei Monica?",
"Next": "Nächster",
"Nickname": "Spitzname",
"nickname": "Spitzname",
"Nickname": "Spitzname",
"No cities have been added yet in any contacts addresses.": "In den Adressen Ihrer Kontakte wurden noch keine Städte hinzugefügt.",
"No contacts found.": "Keine Kontakte gefunden.",
"No countries have been added yet in any contacts addresses.": "In den Adressen Ihrer Kontakte wurden noch keine Länder hinzugefügt.",
+2 -1
View File
@@ -380,6 +380,7 @@
"Dog": "Σκύλος",
"Done.": "Εγινε.",
"Download": "Κατεβάστε",
"Download as vCard": "Λήψη ως vCard",
"Drank": "Ήπιε",
"Drove": "Οδήγησε",
"Due and upcoming tasks": "Προβλεπόμενες και επερχόμενες εργασίες",
@@ -638,8 +639,8 @@
"New Password": "Νέος Κωδικός",
"New to Monica?": "Νέος στη Μόνικα;",
"Next": "Επόμενο",
"Nickname": "Παρατσούκλι",
"nickname": "παρατσούκλι",
"Nickname": "Παρατσούκλι",
"No cities have been added yet in any contacts addresses.": "Δεν έχουν προστεθεί ακόμη πόλεις στις διευθύνσεις οποιασδήποτε επαφής.",
"No contacts found.": "Δεν βρέθηκαν επαφές.",
"No countries have been added yet in any contacts addresses.": "Δεν έχουν προστεθεί ακόμη χώρες στις διευθύνσεις οποιασδήποτε επαφής.",
+2 -1
View File
@@ -380,6 +380,7 @@
"Dog": "Perro",
"Done.": "Hecho.",
"Download": "Descargar",
"Download as vCard": "Descargar como vCard",
"Drank": "Bebió",
"Drove": "Condujo",
"Due and upcoming tasks": "Tareas pendientes y próximas",
@@ -638,8 +639,8 @@
"New Password": "Nueva Contraseña",
"New to Monica?": "¿Nuevo en Monica?",
"Next": "Siguiente",
"Nickname": "Apodo",
"nickname": "Apodo",
"Nickname": "Apodo",
"No cities have been added yet in any contacts addresses.": "Todavía no se han agregado ciudades en las direcciones de ningún contacto.",
"No contacts found.": "No se encontraron contactos.",
"No countries have been added yet in any contacts addresses.": "Todavía no se han agregado países en las direcciones de ningún contacto.",
+3 -2
View File
@@ -380,6 +380,7 @@
"Dog": "Chien",
"Done.": "Terminé.",
"Download": "Télécharger",
"Download as vCard": "Télécharger en tant que vCard",
"Drank": "A bu",
"Drove": "A conduit",
"Due and upcoming tasks": "Tâches dues et à venir",
@@ -638,8 +639,8 @@
"New Password": "Nouveau mot de passe",
"New to Monica?": "Nouveau sur Monica ?",
"Next": "Suivant",
"Nickname": "Surnom",
"nickname": "surnom",
"Nickname": "Surnom",
"No cities have been added yet in any contacts addresses.": "Aucune ville na encore été ajoutée dans les adresses dun contact.",
"No contacts found.": "Aucun contact trouvé.",
"No countries have been added yet in any contacts addresses.": "Aucun pays na encore été ajouté dans les adresses dun contact.",
@@ -1278,4 +1279,4 @@
"😩 Awful": "😩 Horrible",
"😶‍🌫️ Neutral": "😶‍🌫️ Neutre",
"🥳 Awesome": "🥳 Génial"
}
}
+2 -1
View File
@@ -380,6 +380,7 @@
"Dog": "כֶּלֶב",
"Done.": "בוצע.",
"Download": "הורד",
"Download as vCard": "הורד כ-vCard",
"Drank": "שתה",
"Drove": "נסע",
"Due and upcoming tasks": "משימות צפויות ובא",
@@ -638,8 +639,8 @@
"New Password": "סיסמה חדשה",
"New to Monica?": "חדש במוניקה?",
"Next": "הַבָּא",
"Nickname": "כינוי",
"nickname": "כינוי",
"Nickname": "כינוי",
"No cities have been added yet in any contacts addresses.": "עדיין לא נוספו ערים בכתובות של איש קשר.",
"No contacts found.": "לא נמצאו אנשי קשר.",
"No countries have been added yet in any contacts addresses.": "לא נוספו עדיין מדינות בכתובות של איש קשר.",
+2 -1
View File
@@ -380,6 +380,7 @@
"Dog": "कुत्ता",
"Done.": "पूर्ण।",
"Download": "डाउनलोड करना",
"Download as vCard": "vCard के रूप में डाउनलोड करें",
"Drank": "पिया",
"Drove": "गल्ला",
"Due and upcoming tasks": "देय और आगामी कार्य",
@@ -638,8 +639,8 @@
"New Password": "नया पासवर्ड",
"New to Monica?": "मोनिका के लिए नया?",
"Next": "अगला",
"Nickname": "उपनाम",
"nickname": "उपनाम",
"Nickname": "उपनाम",
"No cities have been added yet in any contacts addresses.": "किसी भी संपर्क के पतों में अभी तक कोई शहर नहीं जोड़ा गया है।",
"No contacts found.": "कोई संपर्क नहीं मिला.",
"No countries have been added yet in any contacts addresses.": "किसी भी संपर्क के पतों में अभी तक कोई देश नहीं जोड़ा गया है।",
+2 -1
View File
@@ -380,6 +380,7 @@
"Dog": "Cani",
"Done.": "Fatto.",
"Download": "Scarica",
"Download as vCard": "Scarica come vCard",
"Drank": "Ha bevuto",
"Drove": "Ha guidato una macchina",
"Due and upcoming tasks": "Compiti in scadenza e futuri",
@@ -638,8 +639,8 @@
"New Password": "Nuova password",
"New to Monica?": "Nuovo su Monica?",
"Next": "Prossimo",
"Nickname": "Soprannome",
"nickname": "soprannome",
"Nickname": "Soprannome",
"No cities have been added yet in any contacts addresses.": "Non sono state ancora aggiunte città negli indirizzi di nessun contatto.",
"No contacts found.": "Nessun contatto trovato.",
"No countries have been added yet in any contacts addresses.": "Non sono ancora stati aggiunti paesi in nessun indirizzo dei contatti.",
+2 -1
View File
@@ -380,6 +380,7 @@
"Dog": "犬",
"Done.": "終わり。",
"Download": "ダウンロード",
"Download as vCard": "vCard としてダウンロード",
"Drank": "飲んだ",
"Drove": "運転した",
"Due and upcoming tasks": "期日および今後のタスク",
@@ -638,8 +639,8 @@
"New Password": "新しいパスワード",
"New to Monica?": "モニカは初めてですか?",
"Next": "次",
"Nickname": "ニックネーム",
"nickname": "ニックネーム",
"Nickname": "ニックネーム",
"No cities have been added yet in any contacts addresses.": "連絡先の住所に都市が追加されていません。",
"No contacts found.": "連絡先が見つかりません。",
"No countries have been added yet in any contacts addresses.": "どの連絡先の住所にも国が追加されていません。",
+2 -1
View File
@@ -380,6 +380,7 @@
"Dog": "നായ",
"Done.": "ചെയ്തു.",
"Download": "ഡൗൺലോഡ്",
"Download as vCard": "vCard ആയി ഡൗൺലോഡ് ചെയ്യുക",
"Drank": "കുടിച്ചു",
"Drove": "ഓടിച്ചു",
"Due and upcoming tasks": "വരാനിരിക്കുന്നതും വരാനിരിക്കുന്നതുമായ ജോലികൾ",
@@ -638,8 +639,8 @@
"New Password": "പുതിയ പാസ്വേഡ്",
"New to Monica?": "മോണിക്കയിൽ പുതിയത്?",
"Next": "അടുത്തത്",
"Nickname": "വിളിപ്പേര്",
"nickname": "വിളിപ്പേര്",
"Nickname": "വിളിപ്പേര്",
"No cities have been added yet in any contacts addresses.": "ഒരു കോൺടാക്റ്റിന്റെയും വിലാസത്തിൽ ഇതുവരെ നഗരങ്ങളൊന്നും ചേർത്തിട്ടില്ല.",
"No contacts found.": "കോൺടാക്‌റ്റുകളൊന്നും കണ്ടെത്തിയില്ല.",
"No countries have been added yet in any contacts addresses.": "ഒരു കോൺടാക്റ്റിന്റെയും വിലാസങ്ങളിൽ ഇതുവരെ രാജ്യങ്ങളൊന്നും ചേർത്തിട്ടില്ല.",
+2 -1
View File
@@ -380,6 +380,7 @@
"Dog": "Hond",
"Done.": "Klaar.",
"Download": "Downloaden",
"Download as vCard": "Downloaden als vCard",
"Drank": "Dronken",
"Drove": "reed",
"Due and upcoming tasks": "Vervallen en aankomende taken",
@@ -638,8 +639,8 @@
"New Password": "nieuw paswoord",
"New to Monica?": "Nieuw bij Monica?",
"Next": "Volgende",
"Nickname": "Bijnaam",
"nickname": "bijnaam",
"Nickname": "Bijnaam",
"No cities have been added yet in any contacts addresses.": "Er zijn nog geen steden toegevoegd aan de adressen van een contact.",
"No contacts found.": "Geen contacten gevonden.",
"No countries have been added yet in any contacts addresses.": "Er zijn nog geen landen toegevoegd aan de adressen van contactpersonen.",
+2 -1
View File
@@ -380,6 +380,7 @@
"Dog": "Hund",
"Done.": "Ferdig.",
"Download": "nedlasting",
"Download as vCard": "Last ned som vCard",
"Drank": "Drakk",
"Drove": "Kjørte",
"Due and upcoming tasks": "Forfallende og kommende oppgaver",
@@ -638,8 +639,8 @@
"New Password": "Nytt passord",
"New to Monica?": "Ny hos Monica?",
"Next": "Neste",
"Nickname": "Kallenavn",
"nickname": "kallenavn",
"Nickname": "Kallenavn",
"No cities have been added yet in any contacts addresses.": "Ingen byer er lagt til i noen kontakts adresser ennå.",
"No contacts found.": "Ingen kontakter funnet.",
"No countries have been added yet in any contacts addresses.": "Ingen land er lagt til i noen kontakts adresser ennå.",
+2 -1
View File
@@ -380,6 +380,7 @@
"Dog": "ਕੁੱਤਾ",
"Done.": "ਹੋ ਗਿਆ।",
"Download": "ਡਾਊਨਲੋਡ ਕਰੋ",
"Download as vCard": "vCard ਵਜੋਂ ਡਾਊਨਲੋਡ ਕਰੋ",
"Drank": "ਪੀਤਾ",
"Drove": "ਚਲਾਇਆ",
"Due and upcoming tasks": "ਬਕਾਇਆ ਅਤੇ ਆਉਣ ਵਾਲੇ ਕਾਰਜ",
@@ -638,8 +639,8 @@
"New Password": "ਨਵਾਂ ਪਾਸਵਰਡ",
"New to Monica?": "ਮੋਨਿਕਾ ਲਈ ਨਵੇਂ?",
"Next": "ਅਗਲਾ",
"Nickname": "ਉਪਨਾਮ",
"nickname": "ਉਪਨਾਮ",
"Nickname": "ਉਪਨਾਮ",
"No cities have been added yet in any contacts addresses.": "ਕਿਸੇ ਵੀ ਸੰਪਰਕ ਦੇ ਪਤੇ ਵਿੱਚ ਅਜੇ ਤੱਕ ਕੋਈ ਸ਼ਹਿਰ ਸ਼ਾਮਲ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ।",
"No contacts found.": "ਕੋਈ ਸੰਪਰਕ ਨਹੀਂ ਮਿਲੇ।",
"No countries have been added yet in any contacts addresses.": "ਕਿਸੇ ਵੀ ਸੰਪਰਕ ਦੇ ਪਤੇ ਵਿੱਚ ਅਜੇ ਤੱਕ ਕੋਈ ਦੇਸ਼ ਸ਼ਾਮਲ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ।",
+2 -1
View File
@@ -380,6 +380,7 @@
"Dog": "Pies",
"Done.": "Zrobione.",
"Download": "Pobierać",
"Download as vCard": "Pobierz jako vCard",
"Drank": "Pił",
"Drove": "Stado",
"Due and upcoming tasks": "Terminowe i nadchodzące zadania",
@@ -638,8 +639,8 @@
"New Password": "nowe hasło",
"New to Monica?": "Nowy dla Moniki?",
"Next": "Następny",
"Nickname": "Przezwisko",
"nickname": "przezwisko",
"Nickname": "Przezwisko",
"No cities have been added yet in any contacts addresses.": "Żadne miasto nie zostało jeszcze dodane w adresach żadnego kontaktu.",
"No contacts found.": "Nie znaleziono kontaktów.",
"No countries have been added yet in any contacts addresses.": "Żadne kraje nie zostały jeszcze dodane w adresach żadnego kontaktu.",
+2 -1
View File
@@ -380,6 +380,7 @@
"Dog": "Cachorro",
"Done.": "Realizado.",
"Download": "Baixar",
"Download as vCard": "Baixar como vCard",
"Drank": "Bebi",
"Drove": "Dirigiu",
"Due and upcoming tasks": "Tarefas a vencer e futuras",
@@ -638,8 +639,8 @@
"New Password": "Nova Palavra-passe",
"New to Monica?": "Novo na Monica?",
"Next": "Próximo",
"Nickname": "Apelido",
"nickname": "apelido",
"Nickname": "Apelido",
"No cities have been added yet in any contacts addresses.": "Nenhuma cidade foi adicionada ainda nos endereços dos contatos.",
"No contacts found.": "Nenhum contato encontrado.",
"No countries have been added yet in any contacts addresses.": "Nenhum país foi adicionado ainda nos endereços dos contatos.",
+2 -1
View File
@@ -380,6 +380,7 @@
"Dog": "Câine",
"Done.": "Terminat.",
"Download": "Descarca",
"Download as vCard": "Descărcați ca vCard",
"Drank": "A băut",
"Drove": "A condus",
"Due and upcoming tasks": "Sarcini scadente și viitoare",
@@ -638,8 +639,8 @@
"New Password": "Parolă Nouă",
"New to Monica?": "Nou cu Monica?",
"Next": "Următorul",
"Nickname": "Poreclă",
"nickname": "poreclă",
"Nickname": "Poreclă",
"No cities have been added yet in any contacts addresses.": "Niciun oraș nu a fost adăugat încă la adresele niciunei persoane de contact.",
"No contacts found.": "Nu s-au găsit persoane de contact.",
"No countries have been added yet in any contacts addresses.": "Nicio țară nu a fost adăugată încă la adresele vreunei persoane de contact.",
+2 -1
View File
@@ -380,6 +380,7 @@
"Dog": "Собака",
"Done.": "Успешно.",
"Download": "Скачать",
"Download as vCard": "Скачать как vCard",
"Drank": "Выпил",
"Drove": "Водил",
"Due and upcoming tasks": "Предстоящие задачи",
@@ -638,8 +639,8 @@
"New Password": "Новый пароль",
"New to Monica?": "Новичок в Monica?",
"Next": "Следующий",
"Nickname": "Прозвище",
"nickname": "прозвище",
"Nickname": "Прозвище",
"No cities have been added yet in any contacts addresses.": "В адресах контактов еще не указаны города.",
"No contacts found.": "Контакты не найдены.",
"No countries have been added yet in any contacts addresses.": "В адресах контакта еще не добавлены страны.",
+2 -1
View File
@@ -380,6 +380,7 @@
"Dog": "Hund",
"Done.": "Gjort.",
"Download": "Ladda ner",
"Download as vCard": "Ladda ner som vCard",
"Drank": "Drack",
"Drove": "Körde",
"Due and upcoming tasks": "Förfallna och kommande uppgifter",
@@ -638,8 +639,8 @@
"New Password": "nytt lösenord",
"New to Monica?": "Ny hos Monica?",
"Next": "Nästa",
"Nickname": "Smeknamn",
"nickname": "smeknamn",
"Nickname": "Smeknamn",
"No cities have been added yet in any contacts addresses.": "Inga städer har lagts till ännu i någon kontakts adresser.",
"No contacts found.": "Inga kontakter hittades.",
"No countries have been added yet in any contacts addresses.": "Inga länder har lagts till ännu i någon kontakts adresser.",
+2 -1
View File
@@ -380,6 +380,7 @@
"Dog": "కుక్క",
"Done.": "పూర్తి.",
"Download": "డౌన్‌లోడ్ చేయండి",
"Download as vCard": "vCard వలె డౌన్‌లోడ్ చేయండి",
"Drank": "తాగింది",
"Drove": "నడిపారు",
"Due and upcoming tasks": "గడువు మరియు రాబోయే పనులు",
@@ -638,8 +639,8 @@
"New Password": "కొత్త పాస్వర్డ్",
"New to Monica?": "మోనికాకు కొత్త?",
"Next": "తరువాత",
"Nickname": "మారుపేరు",
"nickname": "మారుపేరు",
"Nickname": "మారుపేరు",
"No cities have been added yet in any contacts addresses.": "ఏ సంప్రదింపు చిరునామాలలో ఇంకా నగరాలు జోడించబడలేదు.",
"No contacts found.": "పరిచయాలు ఏవీ కనుగొనబడలేదు.",
"No countries have been added yet in any contacts addresses.": "ఏ సంప్రదింపు చిరునామాలలో ఇంకా దేశాలు జోడించబడలేదు.",
+2 -1
View File
@@ -380,6 +380,7 @@
"Dog": "Köpek",
"Done.": "Tamamlamak.",
"Download": "İndirmek",
"Download as vCard": "vCard olarak indir",
"Drank": "içti",
"Drove": "Sürdü",
"Due and upcoming tasks": "Zamanı gelen ve yaklaşan görevler",
@@ -638,8 +639,8 @@
"New Password": "Yeni Şifre",
"New to Monica?": "Monica'da yeni misiniz?",
"Next": "Sonraki",
"Nickname": "Takma ad",
"nickname": "Takma ad",
"Nickname": "Takma ad",
"No cities have been added yet in any contacts addresses.": "Henüz herhangi bir kişinin adresine şehir eklenmemiş.",
"No contacts found.": "Kişi bulunamadı.",
"No countries have been added yet in any contacts addresses.": "Henüz herhangi bir kişinin adresine ülke eklenmemiş.",
+2 -1
View File
@@ -380,6 +380,7 @@
"Dog": "کتا",
"Done.": "ہو گیا",
"Download": "ڈاؤن لوڈ کریں",
"Download as vCard": "vCard کے بطور ڈاؤن لوڈ کریں۔",
"Drank": "پیا۔",
"Drove": "چلایا",
"Due and upcoming tasks": "واجب الادا اور آنے والے کام",
@@ -638,8 +639,8 @@
"New Password": "نیا پاس ورڈ",
"New to Monica?": "مونیکا کے لیے نئے ہیں؟",
"Next": "اگلے",
"Nickname": "عرفی نام",
"nickname": "عرفی نام",
"Nickname": "عرفی نام",
"No cities have been added yet in any contacts addresses.": "کسی بھی رابطے کے پتے میں ابھی تک کوئی شہر شامل نہیں کیا گیا ہے۔",
"No contacts found.": "کوئی رابطے نہیں ملے۔",
"No countries have been added yet in any contacts addresses.": "کسی بھی رابطے کے پتے میں ابھی تک کوئی ملک شامل نہیں کیا گیا ہے۔",
+2 -1
View File
@@ -380,6 +380,7 @@
"Dog": "Chó",
"Done.": "Xong.",
"Download": "Tải xuống",
"Download as vCard": "Tải xuống dưới dạng vCard",
"Drank": "Uống",
"Drove": "Lái",
"Due and upcoming tasks": "Nhiệm vụ đến hạn và sắp tới",
@@ -638,8 +639,8 @@
"New Password": "mật khẩu mới",
"New to Monica?": "Mới đến với Monica?",
"Next": "Kế tiếp",
"Nickname": "Tên nick",
"nickname": "tên nick",
"Nickname": "Tên nick",
"No cities have been added yet in any contacts addresses.": "Chưa có thành phố nào được thêm vào bất kỳ địa chỉ liên hệ nào.",
"No contacts found.": "Không tìm thấy liên hệ nào.",
"No countries have been added yet in any contacts addresses.": "Chưa có quốc gia nào được thêm vào bất kỳ địa chỉ liên hệ nào.",
+2 -1
View File
@@ -380,6 +380,7 @@
"Dog": "狗",
"Done.": "完毕。",
"Download": "下载",
"Download as vCard": "下载为 vCard",
"Drank": "喝了",
"Drove": "开车",
"Due and upcoming tasks": "到期和即将完成的任务",
@@ -638,8 +639,8 @@
"New Password": "新密码",
"New to Monica?": "莫妮卡的新手?",
"Next": "下一个",
"Nickname": "昵称",
"nickname": "昵称",
"Nickname": "昵称",
"No cities have been added yet in any contacts addresses.": "尚未在任何联系人的地址中添加任何城市。",
"No contacts found.": "找不到联系人。",
"No countries have been added yet in any contacts addresses.": "尚未在任何联系人的地址中添加任何国家\/地区。",
+27
View File
@@ -130,6 +130,27 @@ const destroyAvatar = () => {
form.errors = error.response.data;
});
};
const download = () => {
router.post(props.data.url.download_vcard, null, {
preserveScroll: true,
onSuccess: (response) => {
const filename = response.props.jetstream.flash.filename;
if (filename !== undefined) {
const url = window.URL.createObjectURL(new Blob([response.props.jetstream.flash.data]));
const link = document.createElement('a');
link.href = url;
link.setAttribute('download', filename);
try {
document.body.appendChild(link);
link.click();
} catch (e) {
document.body.removeChild(link);
}
}
},
});
};
</script>
<template>
@@ -242,6 +263,12 @@ const destroyAvatar = () => {
{{ $t('Move contact') }}
</Link>
</li>
<!-- download as vcard -->
<li class="mb-2">
<Link @click.prevent="download()" class="cursor-pointer text-blue-500 hover:underline">
{{ $t('Download as vCard') }}
</Link>
</li>
<!-- delete contact -->
<li v-if="data.options.can_be_deleted">
<span class="cursor-pointer text-blue-500 hover:underline" @click="deletingContact = true">
+14 -10
View File
@@ -11,6 +11,7 @@ use App\Domains\Contact\ManageContact\Web\Controllers\ContactNoTemplateControlle
use App\Domains\Contact\ManageContact\Web\Controllers\ContactPageController;
use App\Domains\Contact\ManageContact\Web\Controllers\ContactSortController;
use App\Domains\Contact\ManageContact\Web\Controllers\ContactTemplateController;
use App\Domains\Contact\ManageContact\Web\Controllers\ContactVCardController;
use App\Domains\Contact\ManageContactAddresses\Web\Controllers\ContactModuleAddressController;
use App\Domains\Contact\ManageContactAddresses\Web\Controllers\ContactModuleAddressImageController;
use App\Domains\Contact\ManageContactFeed\Web\Controllers\ContactFeedController;
@@ -141,6 +142,7 @@ use App\Domains\Vault\Search\Web\Controllers\VaultSearchController;
use App\Http\Controllers\Auth\AcceptInvitationController;
use App\Http\Controllers\Auth\SocialiteCallbackController;
use App\Http\Controllers\Profile\UserTokenController;
use App\Http\Middleware\HandleInertiaRequests;
use App\Providers\RouteServiceProvider;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Redirect;
@@ -245,24 +247,26 @@ Route::middleware([
Route::middleware('can:contact-owner,vault,contact')->prefix('{contact}')->group(function () {
// general page information
Route::get('', [ContactController::class, 'show'])->name('contact.show');
Route::get('/edit', [ContactController::class, 'edit'])->name('contact.edit');
Route::get('edit', [ContactController::class, 'edit'])->name('contact.edit');
Route::post('', [ContactController::class, 'update'])->name('contact.update');
Route::delete('', [ContactController::class, 'destroy'])->name('contact.destroy');
Route::post('vcard', [ContactVCardController::class, 'download'])->name('contact.vcard.download')->withoutMiddleware([HandleInertiaRequests::class]);
// quick facts
Route::get('/quickFacts/{template}', [ContactQuickFactController::class, 'show'])->name('contact.quick_fact.show');
Route::post('/quickFacts/{template}', [ContactQuickFactController::class, 'store'])->name('contact.quick_fact.store');
Route::put('/quickFacts/toggle', [ContactQuickFactToggleController::class, 'update'])->name('contact.quick_fact.toggle');
Route::put('/quickFacts/{template}/{quickFact}', [ContactQuickFactController::class, 'update'])->name('contact.quick_fact.update');
Route::delete('/quickFacts/{template}/{quickFact}', [ContactQuickFactController::class, 'destroy'])->name('contact.quick_fact.destroy');
Route::get('quickFacts/{template}', [ContactQuickFactController::class, 'show'])->name('contact.quick_fact.show');
Route::post('quickFacts/{template}', [ContactQuickFactController::class, 'store'])->name('contact.quick_fact.store');
Route::put('quickFacts/toggle', [ContactQuickFactToggleController::class, 'update'])->name('contact.quick_fact.toggle');
Route::put('quickFacts/{template}/{quickFact}', [ContactQuickFactController::class, 'update'])->name('contact.quick_fact.update');
Route::delete('quickFacts/{template}/{quickFact}', [ContactQuickFactController::class, 'destroy'])->name('contact.quick_fact.destroy');
// toggle archive/favorite
Route::put('/toggle', [ContactArchiveController::class, 'update'])->name('contact.archive.update');
Route::put('/toggle-favorite', [ContactFavoriteController::class, 'update'])->name('contact.favorite.update');
Route::put('toggle', [ContactArchiveController::class, 'update'])->name('contact.archive.update');
Route::put('toggle-favorite', [ContactFavoriteController::class, 'update'])->name('contact.favorite.update');
// move contact to another vault
Route::get('/move', [ContactMoveController::class, 'show'])->name('contact.move.show');
Route::post('/move', [ContactMoveController::class, 'store'])->name('contact.move.store');
Route::get('move', [ContactMoveController::class, 'show'])->name('contact.move.show');
Route::post('move', [ContactMoveController::class, 'store'])->name('contact.move.store');
// template
Route::get('update-template', [ContactNoTemplateController::class, 'show'])->name('contact.blank');
@@ -88,6 +88,7 @@ class ContactShowViewHelperTest extends TestCase
'update_avatar' => env('APP_URL').'/vaults/'.$contact->vault->id.'/contacts/'.$contact->id.'/avatar',
'move_contact' => env('APP_URL').'/vaults/'.$contact->vault->id.'/contacts/'.$contact->id.'/move',
'destroy_avatar' => env('APP_URL').'/vaults/'.$contact->vault->id.'/contacts/'.$contact->id.'/avatar',
'download_vcard' => env('APP_URL').'/vaults/'.$contact->vault->id.'/contacts/'.$contact->id.'/vcard',
],
$array['url']
);