في هذا المقال سوف نتعرف كيف يمكن عمل sort لكل عمود وذلك حسب الترتيب تصاعدي أو تنازلي.
للقيام بذلك سنحتاج إلى ما يلي :-
<tr> <th scope="col"> <a href="#" @click.prevent="change_sort('id')">id</a> <span>↑</span> <span>↓</span> </th> <th scope="col"> <a href="#" @click.prevent="change_sort('title')">title</a> <span>↑</span> <span>↓</span> </th> <th scope="col"> <a href="#" @click.prevent="change_sort('body')">body</a> <span>↑</span> <span>↓</span> </th> <th scope="col"> <a href="#" @click.prevent="change_sort('created_at')">created_at</a> <span>↑</span> <span>↓</span> </th> </tr>
بالتالي نحصل على هذا الشكل
نحتاج الأن لتعريف متغيرين في data وهما الترتيب الإفتراضي الذي ستكون علية البيانات
data(){ return { posts:{}, categories:{}, category_id:'', sort_field:'created_at', sort_direction:'DESC', } },
إضافة هذا المتغيرات للدالة getResults بداخل methods، بمعنى أن البيانات عندما يتم عرضها بالصفحة سيتم ترتيبها حسب حقل created_at وسيكون الترتيب بشكل DESC.
methods:{ getResults(page = 1) { axios.get('/api/posts?page=' + page + '&category_id='+this.category_id + '&sort_field='+this.sort_field + '&sort_direction='+this.sort_direction) .then(response => { this.posts = response.data; }); } }
إضافة الدالة change_sort في methods
methods:{ change_sort(field){ if(this.sort_field === field){ this.sort_direction = this.sort_direction === 'asc' ? 'desc' : 'asc'; }else { this.sort_field = field; this.sort_direction='asc'; } this.getResults(); }, getResults(page = 1) { axios.get('/api/posts?page=' + page + '&category_id='+this.category_id + '&sort_field='+this.sort_field + '&sort_direction='+this.sort_direction) .then(response => { this.posts = response.data; }); } }
توضيح
نحتاج للتعديل على الدالة index في PostController
public function index() { $sortField=\request('sort_field', 'created_at'); if(!in_array($sortField,['id','title','body','created_at'])){ $sortField = 'created_at'; } $sortDirection=\request('sort_direction', 'desc'); if(!in_array($sortDirection,['asc','desc'])){ $sortDirection = 'desc'; } $posts=Post::when(request('category_id','') !='',function ($q){ $q->where('category_id',request('category_id')); })->orderBy($sortField,$sortDirection) ->paginate(10); return PostResource::collection($posts); }
توضيح
بالتالي سوف نحصل على هذه النتيجة
من أجل تحسين تجربة المستخدم، يجب أن ان يكون arrow المفعل بلون، والأخر بلون أخر، للتوضيح أكثر، فإنه بالوضع الإفتراضي، ترتيب البيانات يكون حسب حقل created_at بشكل تنازلي ، فيجب ان يكون &arrow باللون الأسود و &darrow باللون السكني، وللقيام بذلك
نضيف coditional class يظهر حسب الحالة
<thead> <tr> <th scope="col"> <a href="#" @click.prevent="change_sort('id')">id</a> <span :class="this.sort_field === 'id' && this.sort_direction === 'asc' ? 'text-dark' : 'text-secondary'">↑</span> <span :class="this.sort_field === 'id' && this.sort_direction === 'desc' ? 'text-dark' : 'text-secondary'">↓</span> </th> <th scope="col"> <a href="#" @click.prevent="change_sort('title')">title</a> <span :class="this.sort_field === 'title' && this.sort_direction === 'asc' ? 'text-dark' : 'text-secondary'">↑</span> <span :class="this.sort_field === 'title' && this.sort_direction === 'desc' ? 'text-dark' : 'text-secondary'">↓</span> </th> <th scope="col"> <a href="#" @click.prevent="change_sort('body')">body</a> <span :class="this.sort_field === 'body' && this.sort_direction === 'asc' ? 'text-dark' : 'text-secondary'">↑</span> <span :class="this.sort_field === 'body' && this.sort_direction === 'desc' ? 'text-dark' : 'text-secondary'">↓</span> </th> <th scope="col"> <a href="#" @click.prevent="change_sort('created_at')">created_at</a> <span :class="this.sort_field === 'created_at' && this.sort_direction === 'asc' ? 'text-dark' : 'text-secondary'">↑</span> <span :class="this.sort_field === 'created_at' && this.sort_direction === 'desc' ? 'text-dark' : 'text-secondary'">↓</span> </th> </tr> </thead>
فنحصل على النتيجة التالية