Table of Content
Template
<button class="btn btn-primary btn-sm text-white" @click="showApplication(ap.id)"><i class="bi bi-eye-fill"></i></button>Logicnya
showApplication(id) {
localStorage.setItem('applicationId', id);
this.$router.push('/applied/detail');
},Penjelasan:
this.$routeradalah objek yang disediakan oleh Vue Router untuk melakukan navigasi di dalam aplikasi VueJS.push('/applied/detail')digunakan untuk melakukan navigasi ke URL/applied/detailmenggunakan Vue Router. Ini akan mengarahkan pengguna ke halaman baru di aplikasi VueJS tersebut.
Backendnya
public function getDataFirst(Request $req){
$data = DB::table('applications')->where('id', $req->id)->first();
return response()->json($data);
}Template Detailsnya
ApplicationDetailsComponent.vue
<template>
<div class="content p-6">
<div class="intro-y flex flex-col sm:flex-row items-center mb-8">
<h2 class="text-2xl font-semibold mr-auto">Application Details</h2>
</div>
<div class="bg-white shadow-md rounded-lg p-6">
<div v-if="application" class="text-gray-800">
<h3 class="text-xl font-bold mb-2">{{ application.company }}</h3>
<div class="mb-4">
<p><strong class="font-medium">Role:</strong> {{ application.role }}</p>
<p><strong class="font-medium">Platform:</strong> {{ application.platform }}</p>
<p><strong class="font-medium">Status:</strong> {{ application.status }}</p>
<p><strong class="font-medium">Applied At:</strong> {{ moment(application.apply_at).format('DD MMMM YYYY') }}</p>
</div>
</div>
<div v-else class="text-gray-500">
<p>Loading application details...</p>
</div>
</div>
<div class="bg-white shadow-md rounded-lg p-6 mt-5">
<div class="card-header mb-4">
<h3 class="text-xl font-semibold">Description</h3>
</div>
<div v-if="application" class="text-gray-800" v-html="application.description"></div>
<div v-else class="text-gray-500">
<p>Loading description...</p>
</div>
</div>
</div>
</template>Logicnya
<script>
import axios from 'axios';
import moment from 'moment';
export default {
data() {
return {
application: null
};
},
created() {
const id = localStorage.getItem('applicationId');
if (id) {
this.fetchApplication(id);
}
},
methods: {
fetchApplication(id) {
axios.get("/api/getDataFirst",{
params: {
id: id
}
})
.then(res => {
this.application = res.data;
})
.catch(err => {
console.log("ada error nih!", err);
});
}
},
computed: {
moment() {
return moment;
}
}
}
</script>Penjelasan:
params: { id: id }berfungsi untuk menyertakan parameteridsebagai bagian dari URL request ke endpoint.
Update Logic
Hampir mirip dengan logic show data dan create. berikut codingan lengkapnya:
<template>
<div class="content">
<div class="intro-y col-span-12 lg:col-span-6 mt-1">
<div class="intro-y box">
<div class="flex flex-col sm:flex-row items-center p-3 border-b border-slate-200/60 dark:border-darkmode-400">
<h2 class="font-medium text-base mr-auto">
Update Form Lamaran
</h2>
</div>
<div id="vertical-form" class="p-5">
<div class="preview">
<form @submit.prevent="update">
<div class="">
<label for="company" class="form-label">Nama Perusahaan</label>
<input id="company" type="text" class="form-control" v-model="company">
</div>
<div class="mt-3">
<label for="role" class="form-label">Role Pekerjaan</label>
<input id="role" type="text" class="form-control" v-model="role">
</div>
<div class="mt-3">
<label for="platform" class="form-label">Platform</label>
<select class="form-control" v-model="platform">
<option value="">Pilih</option>
<option>Linkedin</option>
<option>Glints</option>
<option>Job Street</option>
<option>Karir</option>
<option>Pintarnya</option>
</select>
</div>
<div class="mt-3">
<label for="apply_at" class="form-label">Tanggal Lamaran</label>
<input id="apply_at" type="date" class="form-control" v-model="apply_at">
</div>
<div class="mt-3">
<label for="status" class="form-label">Status Lamaran</label>
<select class="form-control" v-model="status">
<option value="">Pilih</option>
<option>Send CV</option>
<option>Viewed</option>
<option>Interview HRD</option>
<option>Interview User</option>
<option>Success</option>
<option>Failed</option>
</select>
</div>
<div class="mt-3">
<label for="link" class="form-label">Link Eksternal</label>
<input id="link" type="text" class="form-control" v-model="link">
</div>
<div class="mt-3">
<label for="description" class="form-label">Deskripsi</label><br>
<textarea class="form-control" v-model="description" rows="10"></textarea>
</div>
<button type="submit" class="btn btn-warning text-white mt-3">Update</button>
</form>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import axios from 'axios';
import moment from 'moment';
import Swal from 'sweetalert2';
export default {
data() {
return {
company: '',
role: '',
platform: '',
apply_at: '',
status: '',
link: '',
description: '',
};
},
created() {
const id = localStorage.getItem('applicationId');
if (id) {
this.fetchData(id);
}
},
methods: {
fetchData(id) {
axios.get('/api/getDataFirst', {
params: {
id: id
}
})
.then(res => {
const data = res.data;
const stripHtmlTags = (html) => {
const doc = new DOMParser().parseFromString(html, 'text/html');
return doc.body.textContent || "";
};
this.company = data.company || '';
this.role = data.role || '';
this.platform = data.platform || '';
this.apply_at = moment(data.apply_at).format('YYYY-MM-DD') || '';
this.status = data.status || '';
this.link = data.link || '';
this.description = stripHtmlTags(data.description) || '';
})
.catch(error => {
console.error('Error fetching data:', error);
});
},
update() {
axios.put('/api/update', {
id: localStorage.getItem('applicationId'),
company: this.company,
role: this.role,
platform: this.platform,
apply_at: this.apply_at,
status: this.status,
link: this.link,
description: this.description
})
.then(res => {
Swal.fire({
title: "Berhasil",
icon: "success",
text: res.data.message
});
})
.catch(error => {
if (error.response && error.response.status === 422) {
let errors = error.response.data.errors;
let errorMessage = '<ul>';
Object.keys(errors).forEach(field => {
errorMessage += `<li>${errors[field][0]}</li>`;
});
errorMessage += '</ul>';
Swal.fire({
icon: 'error',
title: 'Error!',
html: errorMessage,
confirmButtonText: 'OK'
});
} else {
console.error('Ada masalah saat menyimpan data:', error);
Swal.fire({
icon: 'error',
title: 'Oops...',
text: 'Terjadi kesalahan saat menyimpan data!',
confirmButtonText: 'OK'
});
}
});
}
},
computed: {
moment() {
return moment;
}
}
};
</script>Date: 25-07-2024