DONE: add allowance payout trace for admin, improve UI on voting side, increase pagination number

This commit is contained in:
ISMAIL MASSERAN
2026-04-28 11:44:02 +08:00
parent b08232731e
commit 76ae46f8d9
17 changed files with 913 additions and 76578 deletions
@@ -16,49 +16,73 @@
</div>
<div class="collapse navbar-collapse" id="myNavbar">
<ul class="nav navbar-nav">
<!-- {{ users }} -->
<router-link v-if="Number(data.user.role) !== 3" :to="{ name: 'Admin Home' }" tag="li"
exact><a href="#"><b>Laman
Utama</b></a></router-link>
<router-link :to="{ name: 'Kemaskini Sesi' }" v-if="data.user.role == 1" tag="li">
<a href="#"><b>Sesi</b></a>
<ul class="nav navbar-nav admin-nav-main">
<router-link v-if="adminRole !== 3" :to="{ name: 'Admin Home' }" tag="li" exact>
<a href="#"><b>Laman Utama</b></a>
</router-link>
<!-- <router-link :to="{name: 'Manage Partylist'}" v-if="data.user.role==1" tag="li">
<a href="#">Manage Partylist</a>
</router-link> -->
<li class="dropdown" v-if="adminRole === 1">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button"
aria-haspopup="true" aria-expanded="false">
<b>Pengurusan</b> <span class="caret"></span>
</a>
<ul class="dropdown-menu">
<router-link :to="{ name: 'Kemaskini Sesi' }" tag="li">
<a href="#">Sesi</a>
</router-link>
<router-link :to="{ name: 'Maklumat Calon' }" tag="li">
<a href="#">Calon</a>
</router-link>
<router-link :to="{ name: 'Manage Voter' }" tag="li" exact>
<a href="#">Anggota Koperasi</a>
</router-link>
</ul>
</li>
<router-link :to="{ name: 'Maklumat Calon' }" v-if="data.user.role == 1" tag="li">
<a href="#"><b>Calon</b></a>
</router-link>
<router-link :to="{ name: 'Manage Voter' }" v-if="data.user.role == 1" tag="li" exact>
<a href="#"><b>Anggota Koperasi</b></a>
</router-link>
<router-link :to="{ name: 'Kehadiran Calon' }"
v-if="data.user.role == 1 || Number(data.user.role) === 3" tag="li">
<a href="#"><b>Kehadiran</b></a>
</router-link>
<router-link :to="{ name: 'Pembiayaan' }" v-if="data.user.role == 1" tag="li">
<a href="#"><b>Pembiayaan Anggota</b></a>
</router-link>
<router-link :to="{ name: 'Penyata Anggota' }" v-if="data.user.role == 1" tag="li">
<a href="#"><b>Penyata Anggota</b></a>
</router-link>
<router-link :to="{ name: 'Activity Log' }" v-if="data.user.role == 1" tag="li">
<a href="#"><b>Log Aktiviti</b></a>
</router-link>
<router-link :to="{ name: 'Tetapan Portal' }" v-if="data.user.role == 1" tag="li">
<a href="#"><b>Tetapan Portal</b></a>
</router-link>
<li class="dropdown" v-if="adminRole === 1 || adminRole === 3">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button"
aria-haspopup="true" aria-expanded="false">
<b>Operasi</b> <span class="caret"></span>
</a>
<ul class="dropdown-menu">
<router-link :to="{ name: 'Kehadiran Calon' }" tag="li">
<a href="#">Kehadiran</a>
</router-link>
</ul>
</li>
<li class="dropdown" v-if="adminRole === 1">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button"
aria-haspopup="true" aria-expanded="false">
<b>Kewangan</b> <span class="caret"></span>
</a>
<ul class="dropdown-menu">
<router-link :to="{ name: 'Ringkasan Elaun' }" tag="li">
<a href="#">Ringkasan Elaun</a>
</router-link>
<router-link :to="{ name: 'Pembiayaan' }" tag="li">
<a href="#">Pembiayaan Anggota</a>
</router-link>
<router-link :to="{ name: 'Penyata Anggota' }" tag="li">
<a href="#">Penyata Anggota</a>
</router-link>
</ul>
</li>
<li class="dropdown" v-if="adminRole === 1">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button"
aria-haspopup="true" aria-expanded="false">
<b>Sistem</b> <span class="caret"></span>
</a>
<ul class="dropdown-menu">
<router-link :to="{ name: 'Activity Log' }" tag="li">
<a href="#">Log Aktiviti</a>
</router-link>
<router-link :to="{ name: 'Tetapan Portal' }" tag="li">
<a href="#">Tetapan Portal</a>
</router-link>
</ul>
</li>
</ul>
<ul class="nav navbar-right navbar-nav">
<li class="dropdown">
@@ -144,6 +168,17 @@ export default {
}
},
computed: {
adminRole: function () {
// `data` is populated asynchronously; keep this defensive.
try {
return Number(this.data && this.data.user ? this.data.user.role : null);
} catch (e) {
return NaN;
}
}
},
methods: {
isImpersonating: function () {
try {
@@ -288,7 +323,7 @@ export default {
#nav .nav>li.active>a:hover,
#nav .nav>li.active>a:focus,
#nav .navbar-brand:hover {
color: #fff;
color: #ffffff;
background: rgba(204, 0, 0, 0.833);
}
@@ -379,6 +414,23 @@ export default {
margin: 4px 10px;
}
/* Mobile submenu styling: keep dropdowns readable inside collapsed menu */
#nav .navbar-nav .open .dropdown-menu {
position: static;
float: none;
width: auto;
margin: 0 10px 10px;
padding: 6px;
border-radius: 12px;
background: rgba(255, 255, 255, 0.92);
box-shadow: 0 10px 24px rgba(35, 64, 64, 0.12);
}
#nav .navbar-nav .open .dropdown-menu>li>a {
padding: 10px 12px;
border-radius: 10px;
}
.admin-main {
padding-top: 102px;
}