|
|
@props([
|
|
|
'periods' => ['daily', 'weekly', 'monthly'],
|
|
|
'default' => 'daily',
|
|
|
'onPeriodChange' => null
|
|
|
])
|
|
|
|
|
|
<div class="bg-white/5 backdrop-blur-2xl border border-white/10 rounded-2xl p-2 shadow-2xl"
|
|
|
style="box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.6), 0 0 0 1px rgba(255, 255, 255, 0.05), inset 0 1px 0 rgba(255, 255, 255, 0.1);"
|
|
|
x-data="timeFilter('{{ $default }}')">
|
|
|
|
|
|
<div class="flex space-x-1">
|
|
|
@foreach($periods as $period)
|
|
|
<button @click="selectPeriod('{{ $period }}')"
|
|
|
:class="selectedPeriod === '{{ $period }}' ? 'active' : ''"
|
|
|
class="time-filter-btn px-4 py-2 rounded-xl text-sm font-semibold transition-all duration-300 relative overflow-hidden group">
|
|
|
|
|
|
<!-- Active background -->
|
|
|
<div class="absolute inset-0 bg-gradient-to-r from-emerald-400/20 to-emerald-600/20 rounded-xl opacity-0 group-hover:opacity-100 transition-opacity duration-300"></div>
|
|
|
|
|
|
<!-- Content -->
|
|
|
<span class="relative z-10">{{ ucfirst($period) }}</span>
|
|
|
</button>
|
|
|
@endforeach
|
|
|
</div>
|
|
|
|
|
|
<!-- Date picker for specific date selection -->
|
|
|
<div x-show="showDatePicker"
|
|
|
x-transition:enter="transition ease-out duration-200"
|
|
|
x-transition:enter-start="opacity-0 scale-95"
|
|
|
x-transition:enter-end="opacity-100 scale-100"
|
|
|
x-transition:leave="transition ease-in duration-150"
|
|
|
x-transition:leave-start="opacity-100 scale-100"
|
|
|
x-transition:leave-end="opacity-0 scale-95"
|
|
|
class="mt-3 pt-3 border-t border-white/10">
|
|
|
|
|
|
<div class="flex items-center space-x-3">
|
|
|
<label class="text-white/80 text-sm font-medium">Date:</label>
|
|
|
<input type="date"
|
|
|
x-model="selectedDate"
|
|
|
@change="onDateChange()"
|
|
|
class="bg-white/10 border border-white/20 rounded-lg px-3 py-1 text-white text-sm focus:outline-none focus:ring-2 focus:ring-emerald-400/50 focus:border-emerald-400/50">
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
<style>
|
|
|
.time-filter-btn {
|
|
|
@apply text-white/70 hover:text-white;
|
|
|
}
|
|
|
|
|
|
.time-filter-btn.active {
|
|
|
@apply text-white bg-gradient-to-r from-emerald-400/30 to-emerald-600/30 border border-emerald-400/50;
|
|
|
box-shadow: 0 0 20px rgba(52, 211, 153, 0.3);
|
|
|
text-shadow: 0 0 10px rgba(52, 211, 153, 0.5);
|
|
|
}
|
|
|
|
|
|
.time-filter-btn:not(.active):hover {
|
|
|
@apply bg-white/10;
|
|
|
}
|
|
|
</style>
|
|
|
|
|
|
<script>
|
|
|
document.addEventListener('alpine:init', () => {
|
|
|
Alpine.data('timeFilter', (defaultPeriod) => ({
|
|
|
selectedPeriod: defaultPeriod,
|
|
|
selectedDate: new Date().toISOString().split('T')[0],
|
|
|
showDatePicker: false,
|
|
|
|
|
|
init() {
|
|
|
// Initialize with default period
|
|
|
this.onPeriodChange();
|
|
|
},
|
|
|
|
|
|
selectPeriod(period) {
|
|
|
if (this.selectedPeriod === period) return;
|
|
|
|
|
|
console.log('Time filter: selecting period', period);
|
|
|
this.selectedPeriod = period;
|
|
|
this.showDatePicker = period !== 'daily' || this.selectedDate !== new Date().toISOString().split('T')[0];
|
|
|
|
|
|
// Trigger period change
|
|
|
this.onPeriodChange();
|
|
|
|
|
|
// Add selection animation
|
|
|
this.animateSelection();
|
|
|
},
|
|
|
|
|
|
onDateChange() {
|
|
|
this.onPeriodChange();
|
|
|
},
|
|
|
|
|
|
onPeriodChange() {
|
|
|
console.log('Time filter: dispatching period change', this.selectedPeriod, this.selectedDate);
|
|
|
|
|
|
// Try to call dashboard instance directly
|
|
|
if (window.dashboardInstance && typeof window.dashboardInstance.onPeriodChange === 'function') {
|
|
|
console.log('Time filter: calling dashboard instance directly');
|
|
|
window.dashboardInstance.onPeriodChange(this.selectedPeriod, this.selectedDate);
|
|
|
} else {
|
|
|
console.log('Time filter: dashboard instance not available, using events');
|
|
|
|
|
|
|
|
|
document.dispatchEvent(new CustomEvent('period-changed', {
|
|
|
detail: {
|
|
|
period: this.selectedPeriod,
|
|
|
date: this.selectedDate
|
|
|
}
|
|
|
}));
|
|
|
}
|
|
|
},
|
|
|
|
|
|
animateSelection() {
|
|
|
|
|
|
const activeBtn = this.$el.querySelector('.time-filter-btn.active');
|
|
|
if (activeBtn) {
|
|
|
activeBtn.style.transform = 'scale(0.95)';
|
|
|
setTimeout(() => {
|
|
|
activeBtn.style.transform = 'scale(1)';
|
|
|
}, 150);
|
|
|
}
|
|
|
},
|
|
|
|
|
|
|
|
|
setPeriod(period) {
|
|
|
this.selectPeriod(period);
|
|
|
},
|
|
|
|
|
|
setDate(date) {
|
|
|
this.selectedDate = date;
|
|
|
this.onDateChange();
|
|
|
},
|
|
|
|
|
|
getCurrentSelection() {
|
|
|
return {
|
|
|
period: this.selectedPeriod,
|
|
|
date: this.selectedDate
|
|
|
};
|
|
|
}
|
|
|
}));
|
|
|
});
|
|
|
</script> |