// 検索コンポーネント Alpine.data('auditHistorySearch', () => ({ searchParams: { date_from: '', date_to: '', user_id: '', event_action: '', target_filter: '', search_keyword: '', session_id: '' }, validationErrors: {}, initializeComponent() { // デフォルト日付設定(過去1週間) const today = new Date(); const oneWeekAgo = new Date(today.getTime() - 7 * 24 * 60 * 60 * 1000); this.searchParams.date_to = today.toISOString().split('T')[0]; this.searchParams.date_from = oneWeekAgo.toISOString().split('T')[0]; }, validateSearchParams() { this.validationErrors = {}; if (!this.searchParams.date_from || !this.searchParams.date_to) { this.validationErrors.date_range = '検索期間は必須です。'; return false; } const dateFrom = new Date(this.searchParams.date_from); const dateTo = new Date(this.searchParams.date_to); if (dateFrom > dateTo) { this.validationErrors.date_range = '開始日は終了日より前に設定してください。'; return false; } // 1年制限チェック const diffTime = Math.abs(dateTo - dateFrom); const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); if (diffDays > 365) { this.validationErrors.date_range = '検索期間は1年以内に設定してください。'; return false; } return true; }, performSearch() { if (!this.validateSearchParams()) { return; } // 他のコンポーネントに検索実行を通知 this.$dispatch('search-executed', this.searchParams); }, resetForm() { // デフォルト値に戻す this.initializeComponent(); this.validationErrors = {}; // 検索結果もリセット this.$dispatch('search-reset'); } }));