Guest User

Untitled

a guest
Dec 19th, 2024
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.25 KB | None | 0 0
  1. ```
  2. <script setup>
  3. import { ref, computed } from "vue";
  4. import { Head, Link, useForm, usePage } from "@inertiajs/vue3";
  5. import AuthenticatedLayout from "@/Layouts/AuthenticatedLayout.vue";
  6. import CustomModal from "@/Components/CustomModal.vue";
  7. import DataTable from "datatables.net-vue3";
  8. import DataTablesCore from "datatables.net";
  9. import EditButton from "@/Components/Buttons/EditButton.vue";
  10. import Filter from "@/Icons/Filter.vue";
  11. import Filters from "./Partials/Filters.vue";
  12. import InputLabel from "@/Components/InputLabel.vue";
  13. import Password from "@/Components/Password.vue";
  14. import PasswordMeter from "vue-simple-password-meter";
  15. import PrimaryButton from "@/Components/PrimaryButton.vue";
  16. import refreshProps from "@/Util/refreshProps";
  17. import Search from "@/Components/Search.vue";
  18. import Select from "@/Components/Select.vue";
  19. import TextInput from "@/Components/TextInput.vue";
  20. import Users from "@/Icons/Users.vue";
  21. import $ from "jquery";
  22. import { DateTime } from "luxon";
  23.  
  24. const props = defineProps({
  25. roles: {
  26. type: Object,
  27. default: () => {
  28. return {};
  29. },
  30. },
  31. datatable: {
  32. type: Object,
  33. default: () => {
  34. return {};
  35. },
  36. },
  37. });
  38.  
  39. DataTable.use(DataTablesCore);
  40.  
  41. const emailEnabled = usePage().props.config.email_enabled != 0;
  42. const modalFilterOpen = ref(false);
  43. const modalOpen = ref(false);
  44. const tableData = computed(() => {
  45. return props.datatable.pagination.data;
  46. });
  47. const tableColumns = computed(() => {
  48. const columnArray = [];
  49.  
  50. //columnArray.push({ data: "id", orderable: false, name: "checkbox" });
  51. columnArray.push({ data: "name", title: "Name", type: "case-insensitive" });
  52. columnArray.push({ data: "email", title: "email", type: "case-insensitive" });
  53. columnArray.push({ data: "role_labels", title: "Role" });
  54. columnArray.push({
  55. data: "created_at",
  56. title: "Created On",
  57. className: "hidden md:table-cell",
  58. type: "custom-date",
  59. });
  60. columnArray.push({
  61. data: "updated_at",
  62. title: "Last Login",
  63. className: "hidden md:table-cell",
  64. type: "custom-date",
  65. });
  66. if (emailEnabled) {
  67. columnArray.push({
  68. data: "email_verified_at",
  69. title: "Email Verified On",
  70. defaultContent: "Email Not Verified",
  71. className: "hidden md:table-cell",
  72. type: "custom-date",
  73. });
  74. }
  75. columnArray.push({ data: "id", orderable: false, name: "edit" });
  76.  
  77. return columnArray;
  78. });
  79.  
  80. const form = useForm({
  81. id: 0,
  82. name: "",
  83. email: "",
  84. role: "",
  85. password: "",
  86. password_confirm: "",
  87. });
  88.  
  89. const openModal = function (user) {
  90. modalOpen.value = true;
  91.  
  92. form.id = user.id;
  93. form.name = user.name;
  94. form.email = user.email;
  95. form.role = user.role;
  96. };
  97.  
  98. const submit = () => {
  99. if (form.password !== undefined && form.password !== form.password_confirm) {
  100. alert("Passwords do not match");
  101.  
  102. return;
  103. }
  104.  
  105. form.put(route("users.update", form.id), refreshProps("users.index"));
  106. };
  107.  
  108. const submitDelete = () => {
  109. if (confirm("Are you sure?")) {
  110. form.delete(route("users.destroy", form.id), refreshProps("users.index"));
  111. }
  112. };
  113.  
  114. $.fn.dataTable.ext.type.order["custom-date-pre"] = function (data) {
  115. console.log("Processing data in pre:", data);
  116. const format = "d LLL yyyy";
  117. if (data !== "Not Deployed") {
  118. const date = DateTime.fromFormat(data, format);
  119.  
  120. if (!date.isValid) {
  121. console.error("Invalid date:", data);
  122. return "1991-09-01";
  123. }
  124.  
  125. return date.toISODate();
  126. }
  127.  
  128. return "1991-09-01";
  129. };
  130.  
  131. $.fn.dataTable.ext.type.order["case-insensitive-pre"] = function (data) {
  132. return data?.toString().toLowerCase() || "";
  133. };
  134. </script>
  135.  
  136. <template>
  137. <Head title="Manage Users" />
  138.  
  139. <AuthenticatedLayout>
  140. <div class="py-6">
  141. <div class="mx-auto sm:px-6">
  142. <div
  143. class="overflow-hidden rounded-lg bg-palette-5 shadow-sm dark:bg-[#141C25]"
  144. >
  145. <div class="p-6">
  146. <h1 class="float-left text-[12px] font-900 uppercase">
  147. Manage Users
  148. </h1>
  149. <Link
  150. :href="route('users.create')"
  151. class="float-right rounded-md border border-palette-2 p-[9px] text-[10px] uppercase dark:border-[#9cb1c3]"
  152. >
  153. Add User
  154. <Users class="ml-2 inline-block" />
  155. </Link>
  156.  
  157. <div class="clear-both"></div>
  158.  
  159. <div class="mb-[13px] mt-[8px] flex">
  160. <div class="grow-0">
  161. <a
  162. href="#"
  163. @click="modalFilterOpen = true"
  164. class="inline-block rounded-md border border-palette-2 p-[10px] text-[10px] font-600 uppercase dark:border-[#9cb1c3]"
  165. >
  166. <Filter class="inline-block h-[20px] w-[17px]" />
  167. Filter:
  168. </a>
  169. </div>
  170. <div class="grow pl-2">
  171. <Search baseUrl="users.index" />
  172. </div>
  173. </div>
  174.  
  175. <DataTable
  176. id="example"
  177. :options="{
  178. pageLength: 50,
  179. bPaginate: false,
  180. bLengthChange: false,
  181. bFilter: false,
  182. bInfo: false,
  183. bAutoWidth: true,
  184. deferRender: true,
  185. searching: false,
  186. bSort: false,
  187. ordering: true,
  188. order: [],
  189. typeDetect: false,
  190. }"
  191. :data="tableData"
  192. :columns="tableColumns"
  193. class="display text-[10px]"
  194. >
  195. <template #column-checkbox="props">
  196. <input
  197. :id="`user_select_${props.cellData}`"
  198. type="checkbox"
  199. class="mr-2 inline-block h-4 w-4"
  200. :value="props.cellData"
  201. />
  202. </template>
  203. <template #column-edit="props">
  204. <div class="w-4">
  205. <EditButton @click="openModal(props.rowData)" />
  206. </div>
  207. </template>
  208. </DataTable>
  209. </div>
  210. </div>
  211. </div>
  212. </div>
  213. </AuthenticatedLayout>
  214.  
  215. <CustomModal title="Edit User" v-model="modalOpen" @close="modalOpen = false">
  216. <form @submit.prevent="submit" class="w-full sm:w-[440px]">
  217. <input type="hidden" name="id" id="id" v-model="form.id" />
  218.  
  219. <div class="mt-4">
  220. <InputLabel for="name" value="Name" />
  221. <TextInput
  222. id="name"
  223. type="text"
  224. class="mt-1 block w-full"
  225. v-model="form.name"
  226. required
  227. autofocus
  228. />
  229. </div>
  230.  
  231. <div class="mt-4">
  232. <InputLabel for="email" value="Email" />
  233. <TextInput
  234. id="email"
  235. type="text"
  236. class="mt-1 block w-full"
  237. v-model="form.email"
  238. autocomplete="email"
  239. required
  240. />
  241. </div>
  242.  
  243. <div class="mt-4">
  244. <InputLabel for="role" value="Role" />
  245. <Select
  246. name="role"
  247. id="role"
  248. class="mt-1 block w-full"
  249. v-model="form.role"
  250. message="Please choose"
  251. >
  252. <option
  253. v-for="(value, name, index) in roles"
  254. :key="index"
  255. :value="value"
  256. >
  257. {{ name }}
  258. </option>
  259. </Select>
  260. </div>
  261.  
  262. <div class="mt-4">
  263. <InputLabel for="password" value="Password" />
  264. <Password
  265. id="password"
  266. type="password"
  267. class="mt-1 block w-full"
  268. v-model="form.password"
  269. placeholder="********"
  270. autocomplete="new-password"
  271. />
  272. </div>
  273.  
  274. <div class="mt-4">
  275. <InputLabel for="password_confirm" value="Confirm Password" />
  276.  
  277. <Password
  278. id="password_confirm"
  279. type="password"
  280. class="mt-1 block w-full"
  281. v-model="form.password_confirm"
  282. placeholder="********"
  283. autocomplete="new-password"
  284. />
  285.  
  286. <PasswordMeter :password="form.password" />
  287.  
  288. <span
  289. v-if="form.password"
  290. class="mt-[2px] block text-left text-[11px] font-600"
  291. >
  292. Password strength
  293. </span>
  294. </div>
  295.  
  296. <div class="mt-4 flex">
  297. <PrimaryButton
  298. class="mx-auto max-w-[293px]"
  299. :class="{ 'opacity-25': form.processing }"
  300. :disabled="form.processing"
  301. >
  302. Save User
  303. </PrimaryButton>
  304. </div>
  305. </form>
  306.  
  307. <form @submit.prevent="submitDelete" class="w-full sm:w-[440px]">
  308. <div class="mt-[16px] flex">
  309. <PrimaryButton
  310. class="mx-auto max-w-[293px]"
  311. :class="{ 'opacity-25': form.processing }"
  312. :style="{ 'background-color': '#EF3961' }"
  313. :disabled="form.processing"
  314. >
  315. Delete
  316. </PrimaryButton>
  317. </div>
  318. </form>
  319. </CustomModal>
  320.  
  321. <CustomModal v-model="modalFilterOpen" @close="modalFilterOpen = false">
  322. <Filters baseUrl="users.index" :roles="roles" />
  323. </CustomModal>
  324. </template>
  325.  
  326. <style>
  327. @import "datatables.net-dt";
  328.  
  329. div.dt-container div.dt-layout-row {
  330. margin: 0;
  331. }
  332. </style>
  333. ```
  334.  
Advertisement
Add Comment
Please, Sign In to add comment