Skip to content
This repository was archived by the owner on Jun 8, 2023. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?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 Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class ContactVCardController extends Controller
{
public function download(Request $request, int $vault_id, int $contact_id)
{
$carddata = $this->exportVCard($vault_id, $contact_id);

$contact = Contact::findOrFail($contact_id);

return response()->streamDownload(function () use ($carddata) {
echo $carddata;
}, $contact->uuid.'.vcf', [
'Content-Type' => 'text/vcard',
], 'inline');
}

/**
* Get the new exported version of the object.
*/
protected function exportVCard(int $vault_id, int $contact_id): string
{
$vcard = app(ExportVCard::class)->execute([
'account_id' => Auth::user()->account_id,
'author_id' => Auth::id(),
'vault_id' => $vault_id,
'contact_id' => $contact_id,
]);

return $vcard->serialize();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,10 @@ public static function data(Contact $contact, User $user): array
'vault' => $contact->vault_id,
'contact' => $contact->id,
]),
'download_vcard' => route('contact.vcard.download', [
'vault' => $contact->vault,
'contact' => $contact,
])
],
];
}
Expand Down
1 change: 1 addition & 0 deletions lang/en/contact.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
'contact_change_template_cta' => 'Change template',
'contact_move_contact_cta' => 'Move contact',
'contact_delete_cta' => 'Delete contact',
'contact_download_vcard' => 'Download as vCard',
'contact_archived' => 'The contact is archived',
'contact_toggle_confirm' => 'Are you sure?',
'contact_delete_confirm' => 'Are you sure? This will remove everything we know about this contact.',
Expand Down
20 changes: 20 additions & 0 deletions resources/js/Pages/Vault/Contact/Show.vue
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,20 @@ const destroyAvatar = () => {
form.errors = error.response.data;
});
};

const download = () => {
return axios.post(props.data.url.download_vcard)
.then((response) => {
const filename = response.headers['content-disposition'].split('filename=')[1];
const url = window.URL.createObjectURL(new Blob([response.data]));
const link = document.createElement('a');
link.href = url;
link.setAttribute('download', filename);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
});
};
</script>

<style lang="scss" scoped>
Expand Down Expand Up @@ -258,6 +272,12 @@ const destroyAvatar = () => {
{{ $t('contact.contact_move_contact_cta') }}
</Link>
</li>
<!-- download as vcard -->
<li class="mb-2">
<Link @click.prevent="download()" class="cursor-pointer text-blue-500 hover:underline">
{{ $t('contact.contact_download_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">
Expand Down
24 changes: 14 additions & 10 deletions routes/web.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
use App\Domains\Contact\ManageContact\Web\Controllers\ContactNoTemplateController;
use App\Domains\Contact\ManageContact\Web\Controllers\ContactPageController;
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;
Expand Down Expand Up @@ -135,6 +136,7 @@
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;
Expand Down Expand Up @@ -225,24 +227,26 @@
Route::middleware(['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');
Expand Down