Skip to content
This repository was archived by the owner on Jun 27, 2024. It is now read-only.

Commit ce4f07d

Browse files
committed
Whoops
1 parent 9b23d20 commit ce4f07d

File tree

3 files changed

+127
-22
lines changed

3 files changed

+127
-22
lines changed

app/resources/js/Pages/Users.vue

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<script setup>
22
import BreezeGuestLayout from "@/Layouts/Guest.vue";
3-
// import { Table } from "@protonemedia/inertiajs-tables-laravel-query-builder";
3+
import { Table } from "@protonemedia/inertiajs-tables-laravel-query-builder";
44
55
// use this one for development:
6-
import Table from "../../../../js/Components/Table.vue"
6+
// import Table from "../../../../js/Components/Table.vue"
77
88
defineProps(["users"])
99
</script>

js/Components/Table.vue

+92-20
Original file line numberDiff line numberDiff line change
@@ -21,24 +21,45 @@
2121
/>
2222
</slot>
2323

24-
<slot
25-
name="tableGlobalSearch"
26-
:has-global-search="queryBuilderProps.globalSearch"
27-
:label="queryBuilderProps.globalSearch ? queryBuilderProps.globalSearch.label : null"
28-
:value="queryBuilderProps.globalSearch ? queryBuilderProps.globalSearch.value : null"
29-
:on-change="changeGlobalSearchValue"
24+
<div
25+
v-if="queryBuilderProps.globalSearch || canBeReset"
26+
class="flex flex-row "
27+
:class="{
28+
'space-x-4': queryBuilderProps.globalSearch && canBeReset,
29+
'flex-grow': queryBuilderProps.globalSearch
30+
}"
3031
>
31-
<div
32-
v-if="queryBuilderProps.globalSearch"
33-
class="flex-grow"
34-
>
35-
<TableGlobalSearch
36-
:label="queryBuilderProps.globalSearch.label"
37-
:value="queryBuilderProps.globalSearch.value"
32+
<div class="flex-grow">
33+
<slot
34+
name="tableGlobalSearch"
35+
:has-global-search="queryBuilderProps.globalSearch"
36+
:label="queryBuilderProps.globalSearch ? queryBuilderProps.globalSearch.label : null"
37+
:value="queryBuilderProps.globalSearch ? queryBuilderProps.globalSearch.value : null"
3838
:on-change="changeGlobalSearchValue"
39-
/>
39+
>
40+
<TableGlobalSearch
41+
v-if="queryBuilderProps.globalSearch"
42+
:label="queryBuilderProps.globalSearch.label"
43+
:value="queryBuilderProps.globalSearch.value"
44+
:on-change="changeGlobalSearchValue"
45+
/>
46+
</slot>
4047
</div>
41-
</slot>
48+
49+
<slot
50+
name="tableReset"
51+
can-be-reset="canBeReset"
52+
:on-click="resetQuery"
53+
>
54+
<div>
55+
<TableReset
56+
v-if="canBeReset"
57+
:on-click="resetQuery"
58+
/>
59+
</div>
60+
</slot>
61+
</div>
62+
4263

4364
<slot
4465
name="tableAddSearchRow"
@@ -170,10 +191,12 @@ import TableColumns from "./TableColumns.vue";
170191
import TableFilter from "./TableFilter.vue";
171192
import TableGlobalSearch from "./TableGlobalSearch.vue";
172193
import TableSearchRows from "./TableSearchRows.vue";
194+
import TableReset from "./TableReset.vue";
173195
import TableWrapper from "./TableWrapper.vue";
174-
import { computed, ref, watch } from "vue"
196+
import { computed, nextTick, ref, watch } from "vue"
175197
import qs from "qs";
176198
import clone from "lodash-es/clone";
199+
import each from "lodash-es/each";
177200
import filter from "lodash-es/filter";
178201
import findKey from "lodash-es/findKey";
179202
import forEach from "lodash-es/forEach";
@@ -313,7 +336,6 @@ const hasData = computed(() => {
313336
314337
//
315338
316-
317339
function disableSearchInput(key) {
318340
forcedVisibleSearchInputs.value = forcedVisibleSearchInputs.value.filter((search) => search != key);
319341
@@ -324,7 +346,55 @@ function showSearchInput(key) {
324346
forcedVisibleSearchInputs.value.push(key);
325347
}
326348
327-
//
349+
const updates = ref(0)
350+
351+
const canBeReset = computed(() => {
352+
if(updates.value < 0){
353+
return false;
354+
}
355+
356+
if(forcedVisibleSearchInputs.value.length > 0){
357+
return true;
358+
}
359+
360+
const query = qs.parse(location.search.substring(1))
361+
const keys = Object.keys(query);
362+
363+
if(keys.length === 0) {
364+
return false;
365+
}
366+
367+
if(keys.length === 1 && query.remember === "forget"){
368+
return false;
369+
}
370+
if(keys.length === 1 && query.page == 1){
371+
return false;
372+
}
373+
374+
return true;
375+
});
376+
377+
function resetQuery() {
378+
forcedVisibleSearchInputs.value = [];
379+
380+
each(queryBuilderData.value.filters, (filter, key)=>{
381+
queryBuilderData.value.filters[key].value = null;
382+
})
383+
384+
each(queryBuilderData.value.searchInputs, (filter, key)=>{
385+
queryBuilderData.value.searchInputs[key].value = null;
386+
})
387+
388+
each(queryBuilderData.value.columns, (column, key) => {
389+
queryBuilderData.value.columns[key].hidden = column.can_be_hidden
390+
? !queryBuilderProps.value.defaultVisibleToggleableColumns.includes(column.key)
391+
: false;
392+
})
393+
394+
queryBuilderData.value.sort = null;
395+
queryBuilderData.value.cursor = null;
396+
queryBuilderData.value.page = 1;
397+
}
328398
329399
const debounceTimeouts = {};
330400
@@ -398,14 +468,13 @@ function getColumnsForQuery() {
398468
}).sort();
399469
400470
if (isEqual(visibleColumnKeys, queryBuilderProps.value.defaultVisibleToggleableColumns)){
401-
visibleColumnKeys = {};
471+
return {};
402472
}
403473
404474
return visibleColumnKeys;
405475
}
406476
407477
function dataForNewQueryString() {
408-
409478
const filterForQuery = getFilterForQuery()
410479
const columnsForQuery = getColumnsForQuery()
411480
@@ -489,6 +558,9 @@ function visit(url) {
489558
},
490559
onSuccess() {
491560
queryBuilderProps.value = props.inertia.page.props.queryBuilderProps[props.name] || {}
561+
queryBuilderData.value.cursor = queryBuilderProps.value.cursor
562+
queryBuilderData.value.page = queryBuilderProps.value.page
563+
updates.value++;
492564
}
493565
}
494566
);

js/Components/TableReset.vue

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<template>
2+
<button
3+
ref="button"
4+
type="button"
5+
dusk="reset-table"
6+
class="w-full bg-white border rounded-md shadow-sm px-4 py-2 inline-flex justify-center text-sm font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 border-gray-300"
7+
aria-haspopup="true"
8+
@click.prevent="onClick"
9+
>
10+
<svg
11+
xmlns="http://www.w3.org/2000/svg"
12+
class="h-5 w-5 mr-2 text-gray-400"
13+
viewBox="0 0 20 20"
14+
fill="currentColor"
15+
>
16+
<path
17+
fill-rule="evenodd"
18+
d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z"
19+
clip-rule="evenodd"
20+
/>
21+
</svg>
22+
<span>Reset</span>
23+
</button>
24+
</template>
25+
26+
<script setup>
27+
defineProps({
28+
onClick: {
29+
type: Function,
30+
required: true
31+
}
32+
})
33+
</script>

0 commit comments

Comments
 (0)