Index.vue 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. <script setup>
  2. import { watch } from 'vue'
  3. import { Inertia } from '@inertiajs/inertia'
  4. import { Head } from '@inertiajs/inertia-vue3'
  5. import { pickBy } from 'lodash'
  6. import { useConfirm } from 'primevue/useconfirm'
  7. import tableHeader from './tableHeader'
  8. import { useSearchText } from '@/components/useSearchText'
  9. import DashboardLayout from '@/layouts/DashboardLayout.vue'
  10. import AppButtonLink from '@/components/AppButtonLink.vue'
  11. import AppPagination from '@/components/AppPagination.vue'
  12. const props = defineProps({
  13. users: Object,
  14. initialSearch: String,
  15. })
  16. const { search } = useSearchText(props)
  17. watch(search, () => {
  18. Inertia.get('/users', pickBy({ search: search.value }), {
  19. preserveState: true,
  20. })
  21. })
  22. const resetConfirm = useConfirm()
  23. const onResetPassword = (data) => {
  24. resetConfirm.require({
  25. message: `Yakin mereset kata sandi (${data.name}) ?`,
  26. header: 'Reset Kata Sandi',
  27. acceptLabel: 'Iya',
  28. rejectLabel: 'Tidak',
  29. accept: () => {
  30. Inertia.put(route('users.reset-password', data.id))
  31. },
  32. reject: () => {
  33. resetConfirm.close()
  34. },
  35. })
  36. }
  37. </script>
  38. <template>
  39. <Head title="Daftar User" />
  40. <DashboardLayout>
  41. <ConfirmDialog></ConfirmDialog>
  42. <DataTable
  43. responsiveLayout="scroll"
  44. columnResizeMode="expand"
  45. :value="users.data"
  46. :rowHover="true"
  47. :stripedRows="true"
  48. >
  49. <template #header>
  50. <h1>User</h1>
  51. <div class="grid">
  52. <div class="col-12 md:col-8">
  53. <div class="flex align-items-center">
  54. <InputText
  55. class="w-full md:w-27rem"
  56. placeholder="cari, contoh: tina"
  57. v-model="search"
  58. />
  59. </div>
  60. </div>
  61. <div
  62. class="col-12 md:col-4 flex flex-column md:flex-row justify-content-end"
  63. >
  64. <AppButtonLink
  65. label="Tambah User"
  66. icon="pi pi-pencil"
  67. class="p-button-outlined"
  68. :href="route('users.create')"
  69. />
  70. </div>
  71. </div>
  72. </template>
  73. <Column
  74. v-for="value in tableHeader"
  75. :field="value.field"
  76. :header="value.header"
  77. :key="value.field"
  78. />
  79. <Column>
  80. <template #body="{ data }">
  81. <AppButtonLink
  82. icon="pi pi-pencil"
  83. class="p-button-icon-only p-button-rounded p-button-text"
  84. v-tooltip.bottom="'Ubah User'"
  85. :href="route('users.edit', data.id)"
  86. />
  87. <Button
  88. v-if="data.role_id !== 1"
  89. icon="pi pi-key"
  90. class="p-button-icon-only p-button-rounded p-button-text"
  91. v-tooltip.bottom="'Reset Kata Sandi'"
  92. @click="onResetPassword(data)"
  93. />
  94. </template>
  95. </Column>
  96. </DataTable>
  97. <AppPagination :links="users.links" />
  98. </DashboardLayout>
  99. </template>