diff --git a/src/components/kpiCard.vue b/src/components/kpiCard.vue index e63b0f6bd4e0df534b8787f706b1d02d38997f1b..6a036c3f38363224961959407082bb5586d4c3ca 100644 --- a/src/components/kpiCard.vue +++ b/src/components/kpiCard.vue @@ -1,5 +1,5 @@ <template> - <div class="card mx-3 my-1 bground-light"> + <div class="card mx-3 my-1 bground-light clickable" @click="detail"> <div class="card-body"> <h5 class="card-title">{{kpi.name}}</h5> <p class="card-subtitle text-blue">{{kpi.description}}</p> @@ -27,7 +27,9 @@ export default { }; }, methods: { - + detail(){ + this.$router.push({ name: "KpiManagerDetail", params: { id: this.kpi.id }}); + } }, }; </script> diff --git a/src/components/table-2.vue b/src/components/table-2.vue index 62ba655b3ee4ce1655da9a896d7e725cc69b6f7d..9bd4807087858d092e1ecb30ad8412f54fb2b3ae 100644 --- a/src/components/table-2.vue +++ b/src/components/table-2.vue @@ -43,7 +43,7 @@ </tbody> </table> <nav aria-label="Page navigation"> - <ul class="pagination justify-content-end"> + <ul class="pagination justify-content-end clickable"> <li v-if="this.page > 1" class="page-item"> <div class="page-link" @click="prevPage()">Previous</div> </li> diff --git a/src/components/table-response.vue b/src/components/table-response.vue new file mode 100644 index 0000000000000000000000000000000000000000..e0431ff6f8c6fa53dacbffd7a419f41a8f45813c --- /dev/null +++ b/src/components/table-response.vue @@ -0,0 +1,220 @@ +<template> + <div class="table-responsive"> + <table class="table table-bordered"> + <thead> + <tr> + <template v-for="c in columns" :key="c"> + <th + v-if="!c.hidden" + @click="sort(c.data)" + class="text-blue clickable" + > + {{ c.name}} + </th> + </template> + <th class="text-blue">Aksi</th> + </tr> + </thead> + <tbody> + + <tr + v-for="e in this.entries.slice( + (this.page - 1) * this.entry_per_page, + this.page * this.entry_per_page + )" + :key="e.id" + > + <template v-for="c in columns" :key="c"> + <template v-if="!c.hidden"> + <td v-if="c.clickable" @click="this.$emit('detail-entry', e[columns.Id.data])" class="clickable"> + {{ e[c.data] }} + </td> + <td v-else > + {{ e[c.data]}} + </td> + </template> + </template> + + <td style="text-align: center"> + <button @click="this.$emit('edit-entry', e[columns.Id.data])" class="btn btn-blue"> <i class="icon ion-android-create" style="font-size: 20px"></i> Edit </button> + <button @click="this.$emit('delete-entry', e[columns.Id.data])" class="btn-red"> <i class="icon ion-ios-trash-outline" style="font-size: 23px"></i> </button> + </td> + </tr> + </tbody> + </table> + <nav aria-label="Page navigation"> + <ul class="pagination justify-content-end clickable"> + <li v-if="this.page > 1" class="page-item"> + <div class="page-link" @click="prevPage()">Previous</div> + </li> + <li v-else class="page-item disabled"> + <div class="page-link">Previous</div> + </li> + <template v-for="p in this.pagination" :key="p"> + <li v-if="this.page == p" class="page-item disabled"> + <div class="page-link">{{ p }}</div> + </li> + <li v-else class="page-item"> + <div class="page-link" @click="goPage(p)">{{ p }}</div> + </li> + </template> + <li v-if="this.page < this.page_num" class="page-item"> + <div class="page-link" @click="nextPage()">Next</div> + </li> + <li v-else class="page-item disabled"> + <div class="page-link">Next</div> + </li> + </ul> + </nav> + </div> +</template> + +<script> + +import { HTTP } from '../http-common' +// import axios from 'axios'; + +export default { + name: "TableR", + props: { + //map nama kolom ke data + columns: Object, + endpoint: String, + filter: String, + filter_column: String, + default_sort: { + type: String, + default: "" + }, + edit: { + type: Boolean, + default: true + }, + delete: { + type: Boolean, + default: true + }, + key: Number, + }, + data() { + return { + pagination: [], + sorted: { + column: '', + asc: true, + }, + entries: [], + entry_per_page: 10, + page: 1, + page_num: 0, + }; + }, + mounted() { + if (this.default_sort != ""){ + this.sorted.column = this.default_sort + }else{ + this.sorted.column = this.columns.Id.data + } + if (this.endpoint != ""){ + this.getData() + } + + }, + watch: { + filter() { + this.page = 1 + this.getData() + }, + endpoint(){ + this.getData() + } + }, + methods: { + getData(){ + let sortCol = this.sorted.column + if (!this.sorted.asc){ + sortCol = `-${sortCol}` + } + HTTP.get(`${this.endpoint}?page=${this.page}&sort=${sortCol}&filter[${this.filter_column}]=${this.filter}`).then((res)=>{ + if (res.status == 200){ + // console.log(res.data) + this.entries = res.data.data.data + this.page = res.data.data.current_page + this.entry_per_page = res.data.data.per_page + this.page_num = res.data.data.last_page + this.updatePagination(); + } + }) + }, + sort(column) { + console.log("sort "+ column) + if (column === this.sorted.column) { + this.sorted.asc = !this.sorted.asc; + } else { + this.sorted.column = column; + this.sorted.asc = true + } + this.page = 1 + this.getData() + }, + nextPage() { + if (this.page < this.page_num) { + this.page += 1; + this.getData() + } + }, + prevPage() { + if (this.page > 1) { + this.page -= 1; + this.getData() + } + }, + goPage(i) { + this.page = i; + this.getData() + }, + updatePagination() { + this.pagination = []; + for (let i = this.page - 2; i <= this.page + 2; i++) { + if (i <= this.page_num && i > 0) { + this.pagination.push(i); + } + } + }, + }, +}; +</script> + +<style scoped> +li { + padding: 0; +} + +.table-bordered td, +.table-bordered th, +.table-bordered thead { + border: 1px solid #6992b4 !important; +} + +.btn-blue { + background-color: #6992b4; + color: #f1f7fc; + border-radius: 15px; + padding: 5px; + margin-right: 5px; + vertical-align:middle +} + +.btn-red { + background-color: #f4476b; + color: #f1f7fc; + border-radius: 8px; + padding-left: 5px; + padding-right: 5px; + vertical-align:middle +} + +th{ + text-align: center; +} +</style> diff --git a/src/router/index.js b/src/router/index.js index 95314beaecbf50a05d9b1960038a58cbb85c5051..c6918968b32be11e48b2566825e5311639c638f5 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -81,6 +81,11 @@ const routes = [ name: "kpiIndex", component: KpiIndex, }, + { + path: "/kpi/:id", + name: "KpiDetail", + component: KpiIndex, + }, { path: "/manager/kpi/create", name: "KpiCreate", diff --git a/src/views/KpiIndex.vue b/src/views/KpiIndex.vue index 2449e5b8a06e11180b3bfc1b7209d274ee6c608a..cfb15412989a64cb88be37dd2df4fcaa485a776e 100644 --- a/src/views/KpiIndex.vue +++ b/src/views/KpiIndex.vue @@ -10,18 +10,45 @@ v-model="filter" class="form-select" aria-label="Default select example" - @change="getKpi"> - <option value="Harian" selected>Harian</option> - <option value="Mingguan">Mingguan</option> - <option value="Bulanan">Bulanan</option> - <option value="Custom">Custom</option> + @change="changeFilter"> + <option value="daily" selected>Harian</option> + <option value="weekly">Mingguan</option> + <option value="monthly">Bulanan</option> + <option value="custom">Custom</option> </select> </div> <template v-for="kpi in kpis" :key="kpi"> <KpiCard :kpi="kpi"></KpiCard> </template> + <div v-if="this.page_num>1" class="row p-3"> + <nav aria-label="Page navigation"> + <ul class="pagination justify-content-end"> + <li v-if="this.page > 1" class="page-item"> + <div class="page-link p-2" @click="prevPage()">Previous</div> + </li> + <li v-else class="page-item disabled"> + <div class="page-link p-2">Previous</div> + </li> + <template v-for="p in this.pagination" :key="p"> + <li v-if="this.page == p" class="page-item disabled"> + <div class="page-link p-2">{{ p }}</div> + </li> + <li v-else class="page-item"> + <div class="page-link p-2" @click="goPage(p)">{{ p }}</div> + </li> + </template> + <li v-if="this.page < this.page_num" class="page-item"> + <div class="page-link p-2" @click="nextPage()">Next</div> + </li> + <li v-else class="page-item disabled"> + <div class="page-link p-2">Next</div> + </li> + </ul> + </nav> + </div> </div> </div> + </div> </template> @@ -30,6 +57,7 @@ import Header from "../components/header" import Sidebar from "../components/sidebar" import KpiCard from "../components/kpiCard" +import { HTTP } from '../http-common' export default { @@ -52,19 +80,52 @@ export default { deadline: null, deadline_time: "23:00", }, - filter:"Harian", + filter:"daily", kpis: [], - + page : 1, + page_num : 0, + entry_per_page: 10, + pagination: [], } }, methods: { getKpi(){ - this.kpis = [] - this.kpis.push(this.temp_kpi) - this.kpis.push(this.temp_kpi) - this.kpis.push(this.temp_kpi) - this.kpis.push(this.temp_kpi) + HTTP.get(`kpis/assigned?page=${this.page}&filter[period_type]=${this.filter}`).then((res)=>{ + this.kpis = res.data.data.data + this.page = res.data.data.current_page + this.entry_per_page = res.data.data.per_page + this.page_num = res.data.data.last_page + this.updatePagination(); + }) + }, + changeFilter(){ + this.page = 1 + this.getKpi() + }, + nextPage() { + if (this.page < this.page_num) { + this.page += 1; + this.getKpi() } + }, + prevPage() { + if (this.page > 1) { + this.page -= 1; + this.getKpi() + } + }, + goPage(i) { + this.page = i; + this.getKpi() + }, + updatePagination() { + this.pagination = []; + for (let i = this.page - 2; i <= this.page + 2; i++) { + if (i <= this.page_num && i > 0) { + this.pagination.push(i); + } + } + }, }, mounted(){ this.getKpi() @@ -84,5 +145,9 @@ body { background-color: #fff; } +li { + padding: 0; +} + </style> \ No newline at end of file diff --git a/src/views/ManagerKaryawanIndex.vue b/src/views/ManagerKaryawanIndex.vue index 87b4512f71a6f1510e2eeeae1627c8bf847be711..2902c65b3478b0b15cbe073f65611f84e05f6357 100644 --- a/src/views/ManagerKaryawanIndex.vue +++ b/src/views/ManagerKaryawanIndex.vue @@ -47,7 +47,7 @@ export default { columns: { Id: { name : "Id", - data : "id", + data : "slug", hidden : true, clickable : false }, diff --git a/src/views/ResponseIndex.vue b/src/views/ResponseIndex.vue index 4dfd58dded7d6c3df5a6d76f3cd6215715bd8115..83a19542bb76cb1e5a1a42badeeffbed19773f8c 100644 --- a/src/views/ResponseIndex.vue +++ b/src/views/ResponseIndex.vue @@ -90,7 +90,7 @@ </div> </div> <div class="row p-2"> - <Table2 + <TableR :endpoint="endpoint" :columns="columns" :filter="filter" @@ -99,7 +99,7 @@ :delete = "false" :default_sort = "'status'" @detail-entry="detailResponse" - ></Table2> + ></TableR> </div> </div> </div> @@ -108,7 +108,7 @@ <script> -import Table2 from "../components/table-2"; +import TableR from "../components/table-response"; import Header from "../components/header"; import Sidebar from "../components/sidebar"; import { HTTP } from "../http-common"; @@ -119,7 +119,7 @@ export default { components: { Header, Sidebar, - Table2 + TableR }, data(){ return{