Skip to content

Commit 682061c

Browse files
committed
move to composable
1 parent 2dd550e commit 682061c

File tree

2 files changed

+86
-61
lines changed

2 files changed

+86
-61
lines changed
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import {ref, inject, computed} from 'vue'
2+
import {useRoute, useRouter} from "vue-router";
3+
import axios from "axios";
4+
5+
export default function useActivityLogs() {
6+
const route = useRoute();
7+
const router = useRouter();
8+
9+
const activities = ref();
10+
const activeFilter = ref(route.query.filter || 'all');
11+
const searchTerm = ref(route.query.search || '');
12+
// Pagination
13+
const currentPage = ref(parseInt(route.query.page) || 1); // Current page
14+
const perPage = ref(15); // Items per page
15+
const total = ref(0); // Total number of items
16+
17+
// Pagination Helpers
18+
const totalPages = computed(() => Math.ceil(total.value / perPage.value));
19+
const rangeStart = computed(() => (currentPage.value - 1) * perPage.value + 1);
20+
const rangeEnd = computed(() =>
21+
Math.min(currentPage.value * perPage.value, total.value)
22+
);
23+
24+
const isLoading = ref(false)
25+
26+
const getActivityLogs = (() => {
27+
const params = {
28+
filter: activeFilter.value !== 'all' ? activeFilter.value : undefined,
29+
search: searchTerm.value || undefined,
30+
page: currentPage.value,
31+
per_page: perPage.value,
32+
};
33+
34+
axios.get(`/api/activity-logs/`, { params })
35+
.then(({data}) => {
36+
activities.value = data;
37+
total.value = data.meta.total
38+
})
39+
});
40+
41+
const changePage = (page) => {
42+
if (page >= 1 && page <= totalPages.value) {
43+
currentPage.value = page;
44+
applyFilters();
45+
}
46+
};
47+
48+
const updateFilter = (filter) => {
49+
activeFilter.value = filter;
50+
applyFilters();
51+
};
52+
53+
const applyFilters = () => {
54+
setTimeout(() => {
55+
router.push({
56+
query: {
57+
filter: activeFilter.value !== 'all' ? activeFilter.value : undefined,
58+
search: searchTerm.value || undefined,
59+
page: currentPage.value,
60+
},
61+
});
62+
}, 300)
63+
};
64+
65+
return {
66+
getActivityLogs,
67+
activities,
68+
activeFilter,
69+
isLoading,
70+
rangeStart,
71+
rangeEnd,
72+
total,
73+
currentPage,
74+
totalPages,
75+
changePage,
76+
updateFilter,
77+
searchTerm,
78+
applyFilters,
79+
}
80+
}

resources/js/views/admin/activity-log/Index.vue

Lines changed: 6 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -144,81 +144,26 @@
144144
</template>
145145

146146
<script setup>
147-
import axios from 'axios';
148-
import {ref, onMounted, watch, computed} from 'vue'
149-
import {useRoute, useRouter} from "vue-router";
147+
import {watch} from 'vue'
148+
import {useRoute} from "vue-router";
149+
import useActivityLogs from '@/composables/activityLogs.js'
150150
151-
const route = useRoute();
152-
const router = useRouter();
153-
const activities = ref();
154-
const activeFilter = ref(route.query.filter || 'all');
155-
const searchTerm = ref(route.query.search || '');
156-
157-
// Pagination
158-
const currentPage = ref(parseInt(route.query.page) || 1); // Current page
159-
const perPage = ref(15); // Items per page
160-
const total = ref(0); // Total number of items
161-
162-
// Pagination Helpers
163-
const totalPages = computed(() => Math.ceil(total.value / perPage.value));
164-
const rangeStart = computed(() => (currentPage.value - 1) * perPage.value + 1);
165-
const rangeEnd = computed(() =>
166-
Math.min(currentPage.value * perPage.value, total.value)
167-
);
168-
169-
const loadActivityLogs = (() => {
170-
const params = {
171-
filter: activeFilter.value !== 'all' ? activeFilter.value : undefined,
172-
search: searchTerm.value || undefined,
173-
page: currentPage.value,
174-
per_page: perPage.value,
175-
};
151+
const {activities, getActivityLogs, activeFilter, searchTerm, currentPage, rangeStart, rangeEnd, totalPages, total, updateFilter, applyFilters, changePage} = useActivityLogs()
176152
177-
axios.get(`/api/activity-logs/`, { params })
178-
.then(({data}) => {
179-
activities.value = data;
180-
total.value = data.meta.total
181-
})
182-
});
183-
184-
// Update query parameters and refetch data when page changes
185-
const changePage = (page) => {
186-
if (page >= 1 && page <= totalPages.value) {
187-
currentPage.value = page;
188-
applyFilters();
189-
}
190-
};
191-
192-
const updateFilter = (filter) => {
193-
activeFilter.value = filter;
194-
applyFilters();
195-
};
196-
197-
const applyFilters = () => {
198-
router.push({
199-
query: {
200-
filter: activeFilter.value !== 'all' ? activeFilter.value : undefined,
201-
search: searchTerm.value || undefined,
202-
page: currentPage.value,
203-
},
204-
});
205-
};
153+
const route = useRoute();
206154
207155
watch(
208156
() => route.query,
209157
(newQuery) => {
210158
activeFilter.value = newQuery?.filter || 'all';
211159
searchTerm.value = newQuery?.search || '';
212160
currentPage.value = parseInt(newQuery.page) || 1;
213-
loadActivityLogs(activeFilter.value)
161+
getActivityLogs()
214162
},
215163
{
216164
deep: true,
217165
immediate: true
218166
}
219167
);
220168
221-
onMounted(() => {
222-
loadActivityLogs()
223-
})
224169
</script>

0 commit comments

Comments
 (0)