Skip to content

Commit a05d187

Browse files
author
Anuj
committed
multiselect-delete-with-alpinejs feature added
1 parent 6f1afe7 commit a05d187

File tree

7 files changed

+58
-8
lines changed

7 files changed

+58
-8
lines changed

public/app.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

public/app.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

resources/js/app.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,8 @@ Alpine.store('fileViewer', {
106106
}
107107
})
108108
},
109-
109+
checkBoxesVisibility:false,
110+
filesChecked: [],
110111
foldersOpen: [],
111112
foldersInView: [],
112113
folderTops: {},
@@ -162,6 +163,23 @@ Alpine.store('fileViewer', {
162163
const container = document.getElementById('file-list-container');
163164
this.containerTop = container.getBoundingClientRect().top;
164165
container.scrollTo(0, 0);
166+
},
167+
isChecked(file) {
168+
return this.filesChecked.includes(file);
169+
},
170+
checkBoxToggle(file){
171+
if (this.isChecked(file)) {
172+
this.filesChecked = this.filesChecked.filter(f => f !== file);
173+
} else {
174+
this.filesChecked.push(file);
175+
}
176+
},
177+
showCheckBoxes(){
178+
this.checkBoxesVisibility = !this.checkBoxesVisibility;
179+
},
180+
resetChecks(){
181+
this.filesChecked = [];
182+
this.checkBoxesVisibility = false;
165183
}
166184
});
167185

resources/views/index.blade.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
this.$dispatch('file-selected', this.selectedFileIdentifier);
2626
}
2727
}"
28+
@files-deleted.window = "$store.fileViewer.resetChecks()"
2829
@scan-files.window="$store.fileViewer.initScanCheck('{{ route('blv.is-scan-required') }}', '{{ route('blv.scan-files') }}')"
2930
x-init="$nextTick(() => {
3031
$store.fileViewer.reset();

resources/views/livewire/file-list.blade.php

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,17 @@ class="dropdown w-48"
9898
</div>
9999

100100
<div class="folder-files pl-3 ml-1 border-l border-gray-200 dark:border-gray-800" x-show="$store.fileViewer.isOpen(folder)">
101-
@foreach($folder->files() as $logFile)
102-
@include('log-viewer::partials.file-list-item', ['logFile' => $logFile])
103-
@endforeach
101+
<div class="grid grid-flow-col gap-x-32" x-show="$store.fileViewer.filesChecked.length">
102+
<button x-on:click.stop="if (confirm('Are you sure you want to delete selected log files? THIS ACTION CANNOT BE UNDONE.')) { $wire.call('deleteMultipleFiles', $store.fileViewer.filesChecked) }" class="pt-4 pb-3 inline-flex" >
103+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" class="w-5" fill="currentColor"><use href="#icon-trashcan" /></svg>&nbsp;<small>Delete Selected Files</small>
104+
</button>
105+
<button class="inline-flex pt-4 pb-3" x-on:click.stop="$store.fileViewer.showCheckBoxes(), $store.fileViewer.resetChecks()">
106+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" class="w-5" fill="currentColor"><use href="#icon-cross" /></svg>
107+
</button>
108+
</div>
109+
@foreach($folder->files() as $logFile)
110+
@include('log-viewer::partials.file-list-item', ['logFile' => $logFile])
111+
@endforeach
104112
</div>
105113
</div>
106114
@endforeach

resources/views/partials/file-list-item.blade.php

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<div class="file-item-container"
1+
<div class="file-item-container flex"
22
x-bind:class="[selectedFileIdentifier && selectedFileIdentifier === '{{ $logFile->identifier }}' ? 'active' : '']"
33
wire:key="log-file-{{$logFile->identifier}}"
44
wire:click="selectFile('{{ $logFile->identifier }}')"
@@ -8,7 +8,18 @@
88
x-on:focusin.window="! $refs.panel.contains($event.target) && close()"
99
x-id="['dropdown-button']"
1010
>
11-
<div class="file-item">
11+
@can('deleteLogFile', $logFile)
12+
<div class="my-auto px-2" x-show="$store.fileViewer.checkBoxesVisibility">
13+
<input
14+
type="checkbox"
15+
x-init="$watch(`$store.fileViewer.isChecked('{{$logFile->identifier}}')`, (value) => {
16+
$el.checked = value;
17+
})"
18+
x-on:click.stop="$store.fileViewer.checkBoxToggle('{{$logFile->identifier}}')"
19+
value="{{$logFile->identifier}}" />
20+
</div>
21+
@endcan
22+
<div class="file-item grow">
1223
<p class="file-name">{{ $logFile->name }}</p>
1324
<span class="file-size">{{ $logFile->sizeFormatted() }}</span>
1425
<button type="button" class="file-dropdown-toggle"
@@ -49,6 +60,10 @@ class="dropdown w-48"
4960
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor"><use href="#icon-trashcan" /></svg>
5061
Delete
5162
</button>
63+
<button x-on:click.stop="$store.fileViewer.showCheckBoxes()">
64+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor"><use href="#icon-trashcan" /></svg>
65+
Delete Multiple
66+
</button>
5267
@endcan
5368
</div>
5469
</div>

src/Http/Livewire/FileList.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,14 @@ public function deleteFile(string $fileIdentifier)
7878
}
7979
}
8080

81+
public function deleteMultipleFiles(array $selectedFilesArray)
82+
{
83+
foreach($selectedFilesArray as $fileIdentifier){
84+
$this->deleteFile($fileIdentifier);
85+
}
86+
$this->dispatchBrowserEvent('files-deleted');
87+
}
88+
8189
public function deleteFolder(string $folderIdentifier)
8290
{
8391
$folder = LogViewer::getFolder($folderIdentifier);

0 commit comments

Comments
 (0)